Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Well done!
You have completed Rails 8 Course - Beginner to Intermediate!
Preview
Video Player
00:00
00:00
00:00
- 2x 2x
- 1.75x 1.75x
- 1.5x 1.5x
- 1.25x 1.25x
- 1.1x 1.1x
- 1x 1x
- 0.75x 0.75x
- 0.5x 0.5x
This video demonstrates how to deploy a Rails 8 application using Kamal, Docker, DigitalOcean, and Namecheap, covering the entire setup process, troubleshooting common errors, and successfully launching the app on a live domain.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
[MUSIC]
0:00
Foreign guys, so we've come to
the end of developing our application,
0:04
and now it is actually time to deploy it.
0:07
As you can see on the screen right now,
I'm on a domain name which is online,
0:09
it won't be by the time you're watching
this video, but I have successfully
0:12
deployed the application and
I'm gonna show you how to do this.
0:15
We're gonna do this using a new
Rails 8 tool called Kamal,
0:18
Kamal makes it easy to
deploy web apps anywhere.
0:21
We're gonna be using this in conjunction
with Docker, and also with Namecheap, and
0:23
also with DigitalOcean.
0:27
So these are the four different tools that
we're gonna be using to actually get our
0:29
app online and running.
0:33
I'm going to use a domain name which I've
already used, but you're not going to
0:34
have to buy one because we'll just be able
to enter in the IP address of the app.
0:38
Docker is free, Kamala is free however, on
Digital Ocean, we're using a droplet, and
0:41
you can get a small droplet for
as little as $6 a month.
0:46
So without further ado, let's get
started and deploy our app online so
0:49
everybody can see it.
0:52
Okay, guys, so I'm in our application,
0:53
and the first thing that we're going
to do is search up, Deploy, YAML.
0:54
This is a file that is going to be used by
Kamal, and this file we have to edit quite
0:58
a lot, please note that deploying
your application is, in my opinion,
1:01
the most complicated part
of the development process.
1:05
It's more complicated than
actually developing the app, and
1:08
I have spent at least five hours
today just working out all the kinks,
1:11
solving at least 15 different errors.
1:14
There is just an awful amount that can go
wrong, mainly because no app is the same.
1:16
So even though this tutorial is
the best that I can produce and
1:20
I've got all the steps laid down, the even
with all that it's programming, and you
1:23
might still have some difficulty, although
I will do my best to make sure you don't.
1:26
Okay, so at the top here, our name
of our application use the uniquely
1:30
configured containers
service Twitter Clone.
1:33
So I'm just gonna call this
instead of Twitter Clone,
1:35
I'm gonna call it something different and
I'm going to call it Treehouse App, and
1:37
then I'm going to go and enter the same
thing after this one, Treehouse App.
1:41
This first bit here is
the Docker Hub username, so
1:45
this is what we talked about earlier.
1:47
You're gonna have to go onto Docker Hub,
so Docker Hub, and
1:49
you're going to have to
create an account here.
1:52
If you're not familiar with Docker,
it's a platform that's extremely popular,
1:54
it essentially makes it so that an
application on macOS that was developed on
1:57
macOS can be easily ported to Windows or
Linux, and that's what it does.
2:01
Now on here you're gonna have
to create an account and
2:04
then the username of your account,
in my case, the username is Maliki Rails.
2:06
That's going to be your first part here,
so if we go here,
2:10
I'm gonna enter in Maliki Rails.
2:12
So again, your username of your Docker Hub
account is gonna be the first part
2:14
here in Image.
2:17
Then the name of the app that
you want is gonna be after that,
2:18
the servers we want to deploy to.
2:21
Here's the IP address
of the actual server,
2:23
this is quite important that
you don't leak to anyone.
2:25
We're gonna have to change this, so we're
gonna have to go into DigitalOcean and
2:27
create a new droplet, and then that way
we'll get the IP address of the droplet
2:30
and then deploy to that droplet.
2:33
So we're gonna have to go
into DigitalOcean now, and
2:35
create a new droplet, so go into Brave or
go into your browser and
2:37
then we're going to go into DigitalOcean.
2:39
If you have not got a DigitalOcean
account, go to digitalocean.com or
2:41
whatever and then go there and
make an account.
2:45
So just click sign up, it's fairly simple,
just email, password, maybe a name.
2:48
I already have my account, and
2:51
so the first thing that we're going
to do is hit Create and then Droplet.
2:53
I am creating the droplet in
my first project project.
2:56
You might have to create a project
before you can create a droplet, so
2:59
just hit Create Project.
3:02
Okay, so here on this Create Droplet page
it says that Droplets are virtual machines
3:03
that anyone can set up in seconds you
can use Droplets either standalone or
3:07
as part of a larger cloud
based infrastructure.
3:10
And so then it says choose Region,
now it's very simple.
3:12
You, you want to choose the region
that is closest to where you are or
3:15
to where your users are.
3:18
In my case, my app is not for
any other people, it's just for
3:19
me because I want to demonstrate
how to deploy with Kamal.
3:22
So I'm going to choose London, as that
is the closest one to me now that I have
3:25
selected London because
it's the closest one to me.
3:28
So it'll be the fastest to load,
we're gonna scroll down and
3:30
then we're gonna scroll down all
the way to choose an image, and
3:33
we can choose the OS, and we're going to
choose Ubuntu, because that's the one
3:36
we're running in development, so it's
gonna be stable and the same, consistent.
3:40
And we're going to choose version 2022.04,
the reason that I'm choosing that version
3:44
is because that's the same one
that I have in development.
3:49
If the one you have in
development is a different one,
3:52
then I would personally choose the same
one that you're using in development to
3:54
keep things consistent across the board.
3:58
Then we're gonna scroll down and
we're gonna select the basic plan,
4:00
as that's all I need for
this demonstration,
4:03
we're gonna click regular and then we're
gonna go to this $6 per month package.
4:05
It gives you one CPU, 25 gigabytes of SSD
storage and 1,000 gigabytes of transfer,
4:09
that's gonna be more than enough for
this demonstration.
4:14
However, one useful feature of Digital
Ocean is that you can easily just ramp up
4:17
how much resources you need to use,
and it actually shows you how
4:21
much is using per hour,
which is about $0.01 per hour right now.
4:25
It's not gonna charge you the $6 upfront,
it literally bills per hour.
4:29
So that's really useful because I've
created hundreds of droplets in the past
4:33
few hours, and if they charge $6 upfront
each time, I would lose some money.
4:37
But they charge per hour, so it's better,
next we're gonna scroll down and
4:40
here we see the option to add volume.
4:44
We don't need to do that, but if you
needed more volume, as in more disk space,
4:45
then you could easily do that, and
it says no manual setup here, but
4:49
there is actually a little
bit of setup in VS code.
4:53
But yeah, you can easily add more
disc storage if you need it, and
4:56
you might need that if your
application becomes extra large, and
4:59
it would be cheaper than buying
a higher tier of droplet over here.
5:02
Now, here it says choose authentication
method, which is quite important,
5:06
we're going to be using SSH key and
we're going to create a new SSH key.
5:10
This is Twitter Clone Copy is
one that I created previously.
5:14
So we're gonna click on new SSH key and
then inside of here we're gonna have to
5:16
generate an SSH key, so
we're gonna go and follow the steps here.
5:21
So SSH keys create a new
key pair if needed, so
5:24
we're gonna have to create a new key pair,
so do SSH keygen inside your terminal,
5:27
ideally in the place your app is.
5:31
So hit SSH keygen,
enter a file in which to save the key,
5:33
you can just hit enter and then it
says already exists, so that's fine,
5:36
we're gonna,
we're not going to overwrite it.
5:40
But for you, it won't say or
exist, so that's okay.
5:42
It says you will be asked to create and
confirm a passphrase for the key so
5:45
that you could just enter no passphrase,
you can just leave it empty to enter and
5:49
then hit enter again, and then after
that we're just going to do cat.
5:53
Cat if I show you, so cat and
then tilde, slash, dot, SSH id.
5:57
What this does is just copy the contents
of this into the terminal, so
6:04
if I hit enter, it shows the contents of
that file, and then what we need to do is
6:08
actually copy this, copy the contents,
and then copy all of the contents, and
6:13
then put it in here, and then the name,
we can just call it Treehouse SSH.
6:18
So now that I've copied all of
the contents, and put it in there,
6:23
we're gonna add SSH, and that is done now
for me, because I use the same SSH, it's
6:26
not gonna show up, but for you it's gonna
be a new SSH, so that should be done now.
6:30
So that should be everything that we need
in here, I'm just gonna click tick on this
6:34
one because it says AD Improved
metrics monitoring and alerting free.
6:38
May as well don't see why not, and we
could add a worry free managed database,
6:41
but we don't need to do that right now.
6:45
We would do that if we wanted
a more scalable application,
6:46
but for
this demonstration it's not necessary.
6:49
So hit Create Droplet, now we're just
going to wait for it to be created,
6:51
it should take about two minutes.
6:54
Once it is created, we're gonna copy
the IP address and paste it into VS code.
6:56
Okay, so now that our droplet is active
,and it says droplet has been created,
7:00
we are going to copy the IP address,
which is the one up here,
7:04
IPv4, we're gonna copy that and then we're
going to go into VS code, into the app and
7:07
we're gonna paste it in servers web.
7:12
So there we have that, so that's our
DigitalOcean Droplet IP address okay,
7:14
next part is proxy, and this is
the domain name that we want to use.
7:18
So in my case, I'm going to
use an actual domain name, and
7:22
the domain name that I'm going to
use is called app dot cleansyn.com.
7:26
Now, if you don't have your own domain
name, you can either purchase one or
7:31
you can just not use a domain name.
7:35
If you're not going to use a domain name,
7:37
you're gonna have to enter your IP address
in the browser, which is okay, and
7:39
for that you're just gonna
have to get rid of the host.
7:42
So if you're not using a domain name,
get rid of the host, and
7:45
you don't need to enter that value, but
if you are using a domain name, you should
7:48
have app.your domain name.com or
whatever the end of your domain name is.
7:52
Now, it's up to you if you want to say
app.clip sync.com or just clip sync.com,
7:56
in fact, I will change mine to just
Clip sync.com as that's better.
8:01
Next up is Registry and it says username
your user, and so inside of here,
8:05
it's exactly the same as up here,
the username of your Docker Hub account.
8:09
So we're just going to enter Malachi
Rails, because that is the username of my
8:14
Docker Hub account,
if I just go and double check that.
8:18
If I go and double check on here, if I go
click this, it says Maliki Rails there, so
8:21
we know that my username is Maliki Rails.
8:25
The next part, it says password,
Kamal registry password now,
8:28
this part is quite special because
this is just a variable and
8:31
you set this variable somewhere else,
it's the same as Rails master key.
8:34
So if we go to Kamal Secrets,
we're supposed to set this Kamal registry
8:38
password and
Rails master key inside of here.
8:43
In fact, we have to set it inside of here,
we don't have any other choice.
8:45
So to get this Kamal registry password,
8:49
what that actually means is how we're
going to access our Docker Hub account.
8:51
So what we're gonna have to do is create
a personal access token to our Docker Hub
8:55
account and
enter as the Kamal registry password.
8:59
So let's go ahead and do that, so I'm
going to go into my Docker Hub account and
9:02
then I'm gonna click on account settings.
9:05
Okay, so now that I'm in
the account settings of my account,
9:07
we're gonna scroll down to the bottom and
it says personal access tokens.
9:09
We're gonna click on that link and
then inside of here we're gonna create
9:13
a new token, so do generate new token and
I'm gonna call it Treehouse Token.
9:17
Now extremely important that you say read,
write and
9:22
delete for these access permissions.
9:26
I ran into an error where I was just
keeping as public read only and I was,
9:28
I kept getting an error saying you don't
have the permissions unauthorized, and so
9:32
we need to make sure that it's at least
read, and write and I'm gonna put read,
9:36
write delete just to be safe.
9:40
I'm gonna call it Treehouse Token just to
describe it it's not actually important we
9:41
don't need the description but I'm
gonna call it Treehouse Token anyway so
9:46
hit generate on that key and then now it
says use this token as a password when you
9:50
sign in from this Docker CLL client.
9:54
Now for now I'm going to copy this
token and I'm going to VS code and.
9:56
I'm gonna paste it in here.
10:00
Now this is something that
is highly frowned upon.
10:01
Pasting your password in here is terrible.
10:04
As you can see right here it says
do not enter raw credentials here.
10:07
And this is because this file
actually should be safe.
10:11
And if you push this file to say,
somewhere like GitHub,
10:14
then someone will have access
to all your secrets and
10:16
then they'll be able to get into your
application and then potentially harm it.
10:19
If you want to know how to hide your
secret stuff, then you can go into
10:22
the Kamal website and this is the page
we'll link it in the description, and
10:26
inside of here it says exactly
how to use it one password and
10:30
different password managers.
10:33
And this is how you can hide those
details and not permit them to GitHub
10:35
doing gitignore won't actually work for
this because it's in the secrets, but
10:39
I'm gonna do a terrible thing and
leave it as it is.
10:43
And that's because I don't need to secure
my details because I'm going to delete
10:46
this app and delete these credentials
soon after making this video.
10:50
Now for the Rails master key,
we're also gonna have to get that.
10:53
So go and find your master key, and that
should just be in config-master key, so
10:56
we're gonna go to config@master.key,
copy and paste this and go into secrets,
10:59
and then we're gonna copy and
paste it in here.
11:03
Again I just want to state one more
time this is really bad practice, but
11:06
I digress.
11:09
As long as no one else can see these
credentials, as in, you don't post it on
11:09
GitHub or you make your GitHub repository
private, I believe it to be okay.
11:13
Okay, so now that we've done all that,
11:16
we have set the Commodore industry
password, we've set the Rails master key,
11:18
both in secrets, everything is done
in this file and it's going well.
11:21
So now that everything
is done in this file,
11:25
we're going to have to
actually install Docker.
11:26
Installing Docker can be a difficult
process, so I'm going to leave the links
11:28
to the Docker website in the description
and it has the documentation on how
11:32
to install it on every single different
operating system you can possibly have.
11:35
I'm going to show you how
to do it on Ubuntu though.
11:38
So it says uninstall old versions,
before you can install Docker engine,
11:40
you need to uninstall any
conflicting packages.
11:43
And that's because our Linux distribution
may provide unofficial Docker packages,
11:46
which may conflict with the official
packages provided by Docker.
11:49
So we have to uninstall these
before officially installing or
11:51
installing the official Docker engine.
11:54
So run this command here, so
11:55
run the following command to
uninstall all conflicting packages.
11:57
I'm gonna hit Enter on that command,
then enter my password,
12:00
then I'm gonna go down to installation
methods and just follow them.
12:02
So it says you can install
it in different ways, and
12:05
I'm gonna install it
using the APT repository.
12:08
So I'm simply just gonna copy and paste
this whole thing, and we're gonna copy and
12:10
paste it in there, and
that should install Docker.
12:13
Now I'm gonna actually install Docker
using this command, so it's sudo apt,
12:16
get install Docker and
some other packages.
12:20
So hit Enter on that command and as you
can see, it's done, and then we're going
12:22
to verify the installation was
successful by running this command.
12:26
And there it says,
12:28
this message shows that your installation
appears to be working correctly.
12:29
So, so far in the video,
we've successfully installed Docker and we
12:32
successfully generated our personal access
token as well as the Digitalocean droplet.
12:35
We've also changed our Deploy YAML file
and we've also changed our secrets file.
12:39
So we're nearly done, the next thing that
we have to do is, is go to Namecheap and
12:44
point our domain name
to this actual thing.
12:49
So we're gonna go to Namecheap.
12:51
So I'm gonna go to Namecheap and
I'm already here.
12:53
And then I'm gonna go to clipsync.com,
which is the domain that I'm using.
12:55
I'm gonna go to Advanced DNS and
then in Advanced DNS,
12:58
we're gonna create a new record.
13:01
So I'm gonna delete the current record and
we're gonna create a new one.
13:03
So click on Add new record, then it's
gonna be an A record the host is just
13:06
gonna be at, and then the IP address
is gonna be from Digitalocean,
13:10
the droplet IP address, IPv4 copy,
paste that in there and then hit tick.
13:13
Okay, now that that is done in Namecheap,
we're gonna go back to VS code and
13:17
just make sure that everything
is working and ready to deploy.
13:21
So I'm gonna go over this
Deploy YAML again Treehouse app.
13:24
Yeah, that looks good.
13:27
This one and this one have to be the same,
that's the IP address, SSL is true.
13:28
Okay, and the app is looking pretty
good and I think it is ready to deploy.
13:33
We have Docker installed,
we've got the Deploy YAML finished,
13:37
we've got the secrets done, we've got
the Namecheap ready and looking for
13:40
this server to be active.
13:44
And so I think we're ready,
so we're gonna go ahead and
13:46
we're gonna run the command
called Kamal Setup.
13:48
So let's go ahead and run this command and
let's see if it works.
13:50
So I'm just on the Kamal website and
13:55
it gives you an overview of
all of the commands in Kamal.
13:57
And for Kamal Setup, it says that this
command sets up all the accessories,
13:59
pushes the env file, and
deploys the app to server.
14:03
Okay, so I just got an error and
14:06
it says failed to validate
clone Git exit status 32768.
14:08
Now, I'm not sure why we get this error,
but I do know how to solve it.
14:12
So we're gonna go ahead and
run gitadd.gitcommit-m initial commit,
14:15
and then what we actually have to
do is deploy our project to GitHub.
14:20
So I'm gonna go to GitHub.com and then
I'm gonna go and create a new repository,
14:25
then inside of here,
I'm just gonna say Treehouse app and
14:30
I'm gonna make it private to make sure
that nobody can see all my secret stuff.
14:33
And we're gonna hit Create repository and
then we're just gonna copy and
14:37
paste these two commands at the bottom.
14:41
So those two and
then we're gonna actually push.
14:43
And now if we run Kamal Setup again,
we should not get all these errors or
14:46
that one error, the git error.
14:51
And it looks to be working now.
14:53
Now, I understand that Docker
can be hard to work with,
14:55
Kamal can be hard to work with, and
that took me about six hours today,
14:58
just working all of this out by myself.
15:01
And so I have a file,
a notion file, where I encountered,
15:03
I documented all the errors that
I ran into and how I solved them.
15:07
So I'm gonna leave this in the description
and hopefully it will help you.
15:11
And I'm also gonna leave in the
description a another file called pushing
15:14
to Digitalocean with Kamal and Docker
notes, I'm yet to write this out, so
15:17
I'm gonna do that after this video.
15:21
But yeah, hopefully this really helps you.
15:23
But hopefully this helps you when
deploying with Kamal to Digitalocean.
15:25
So if we go back to our Terminal,
as you can see, it is deploying.
15:28
Still deploying,
it looks like it's working,
15:32
all this red is actually a good thing,
even though it's red.
15:34
And as you can see, it says cached and
15:36
that's because I've run
this command before.
15:38
The first time you run it, it's gonna
take a lot longer than the second time,
15:40
because the second time you will
have cached a lot of the items, and
15:43
so it won't take as long because it
doesn't have to upload as much stuff.
15:46
Okay, and so I got an error, and it,
15:49
Exception while executing Docker Exit
Status 1, Docker SCD out, nothing written.
15:51
So when it says nothing written, that
means we had trouble connecting to Docker.
15:56
So what I'm gonna do is check my Deploy
YAML file, and now I'm not 100% sure,
16:00
but I believe that we're gonna change
the service name to Twitter Clone, and
16:04
then that should actually change it and
make it work.
16:08
I believe that actually has to
be the name of your application,
16:11
not something you can set on your own.
16:14
So because it says Twitter Clone up here,
it has to say Twitter Clone there,
16:16
because that's the name of
our actual application.
16:19
Now that I've done that, I'm gonna go to
the terminal and I'm gonna hit clear.
16:21
Then I'm gonna run gitadd.gitcommit-M and
16:24
I'm gonna say change deploy.YAML
to Twitter Clone, and
16:28
then we're gonna say end quote,
hit push then.
16:33
Now, if we run Kamal setup again,
hopefully it's gonna work.
16:37
I got the same error again.
16:41
Now I got this error, Docker STD out,
nothing written again.
16:42
So I'm gonna try to log in, so
I'm gonna say Docker login.
16:45
It says login succeeded, and I believe the
issue was that the Treehouse token was not
16:49
actually created yet, I was still on
the page where I was gonna create it,
16:53
I pressed create, but then I didn't
say Back personal access tokens.
16:56
So you have to say back to, and
then it actually says create.
16:59
So let's see if that works.
17:02
Now we're gonna try Kamal setup,
hopefully it works now.
17:03
As I said, there's just a million things
that can go wrong with developing,
17:06
and that's why they actually made Kamal,
to make it easier, and
17:09
I do believe that they have achieved that,
but it is still a hassle.
17:12
Okay, guys, so I've actually got notes on
this error, and it says that to fix it I
17:15
have to change from PostgreSQL to SQLite,
so let's go ahead and do that.
17:19
So to do that,
we're gonna go to the terminal and
17:22
we're gonna do rails DB system:change.
17:25
And then we're gonna say 2 and
then we're gonna say SQLite 3.
17:28
Now if we enter in that command,
that's gonna say conflict,
17:32
conflict.database.YAML, we're
gonna say yes.
17:36
And then we're also going to bundle
install to install the new SQLite.
17:39
And then now that we've done that,
we're going to actually run git,
17:44
add.git commit-m change
to SQLite 3 git push.
17:51
And now we're gonna push and
then let's run Kamal setup again and
17:55
give it another go.
17:59
Fingers crossed,
this is the time that it actually works.
18:00
It should be if my notes
are anything to go by.
18:02
And this time it actually worked,
it says finished all in 34 seconds.
18:05
So changing from PostgreSQL
to SQLite actually worked.
18:08
And I believe that's because in order
to have PostgreSQL actually work,
18:11
you need to create a managed
database with PostgreSQL.
18:15
Now, normally I'd be against
using SQLite 3 in production, but
18:17
I think in this scenario it's perfectly
fine because I'm not gonna have that
18:20
many users on my app, am I?
18:24
And even if I did, I could bump up my
droplet to give it more resources.
18:25
So now with everything done, our app being
uploaded, everything should be working,
18:28
and if we go to ClipSync.com,
if we give it a few minutes,
18:32
it should load with the new website.
18:35
Okay guys, it's like four minutes later
and I'm able to view the website on mobile
18:37
and it works perfectly, but I can't
view it on my browser and my PC yet.
18:41
So we're gonna go to CMD and
18:44
we're actually gonna clear
the DNS cache of the computer.
18:46
So to do that we're gonna run
ipconfig/flushdns and hopefully that
18:49
works, and as you can see, it says
successfully flush the DNA resolver cache.
18:54
Hopefully that does something.
18:59
Just to try and speed up the process
because it's worked for me before.
19:00
I'm going to go ahead and
19:03
add ns1.Digitalocean.com as one of
the name servers for my Namecheap.
19:04
So I'm gonna go to Namecheap and
then go to the domain and
19:08
inside of here I'm gonna select custom
DNS and then we're gonna go ahead and
19:11
copy these into custom DNS and hopefully
that makes it actually load faster.
19:15
Add name server,
then I'm gonna go ahead and press tick.
19:19
It says DNS server update may take
up to 48 hours to take effect.
19:22
So this really is kind of a waiting game.
19:25
This is the one thing I
don't like about domains.
19:27
I'm not 100% sure if it's working, but
I'm sure I've done everything right, so
19:29
hopefully it does work.
19:33
Okay guys, I'm gonna go ahead and
restart my computer and see if that helps.
19:34
All right guys, so it's about 10 minutes
later and I've just restarted my PC and
19:38
now the website is actually finally loaded
and it looks like we've successfully
19:41
uploaded our project to clipsync.com or
the domain that we've been to.
19:44
So I'm gonna go ahead and sign up and
see if everything is working.
19:47
So I'll just sign up with a new email,
123-456-12-3456 sign up, and
19:50
as you can see it says welcome,
you've signed up successfully.
19:54
Then I'll create a new post and see what
happens, so I'm gonna create a new post
19:57
first post on the website and then we're
gonna put that in bold and italics and
20:01
then connect an image and
then we'll say TT.
20:05
And then if we do create post, as you can
see it says the post was successfully
20:08
created and we can like the post and
we can unlike it and
20:13
then we can also add a real time comments.
20:16
So hello, and then if I open my other
browser, so I'll just do another browser,
20:19
put that over there,
put this one over here.
20:23
If I hit create comment it
should appear on the right and
20:25
as you can see it does in real time,
so that's perfect,
20:28
that means our action cable is,
is working and that is great.
20:30
So the website seems to be working and
that means that we have successfully
20:33
deployed with Kamal to Digitalocean and
that is really awesome.
20:36
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up