|
|
@@ -0,0 +1,120 @@ |
|
|
# Node.js Deployment |
|
|
|
|
|
> Steps to deploy a Node.js app to Digital Ocean using PM2, NGINX as a reverse proxy and an SSL from LetsEncrypt |
|
|
|
|
|
## 1. Sign up for Digital Ocean |
|
|
If you use the referal link below, you get $10 free (1 or 2 months) |
|
|
https://m.do.co/c/5424d440c63a |
|
|
|
|
|
## 2. Create a droplet and log in via ssh |
|
|
I will be using the root user, but would suggest creating a new user |
|
|
|
|
|
## 3. Install Node/NPM |
|
|
``` |
|
|
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - |
|
|
|
|
|
sudo apt install nodejs |
|
|
|
|
|
node --version |
|
|
``` |
|
|
|
|
|
## 4. Clone your project from Github |
|
|
There are a few ways to get your files on to the server, I would suggest using Git |
|
|
``` |
|
|
git clone yourproject.git |
|
|
``` |
|
|
|
|
|
### 5. Install dependencies and test app |
|
|
``` |
|
|
cd yourproject |
|
|
npm install |
|
|
npm start (or whatever your start command) |
|
|
# stop app |
|
|
ctrl+C |
|
|
``` |
|
|
## 6. Setup PM2 process manager to keep your app running |
|
|
``` |
|
|
sudo npm i pm2 -g |
|
|
pm2 start app (or whatever your file name) |
|
|
|
|
|
# Other pm2 commands |
|
|
pm2 show app |
|
|
pm2 status |
|
|
pm2 restart app |
|
|
pm2 stop app |
|
|
pm2 logs (Show log stream) |
|
|
pm2 flush (Clear logs) |
|
|
|
|
|
# To make sure app starts when reboot |
|
|
pm2 startup ubuntu |
|
|
``` |
|
|
### You should now be able to access your app using your IP and port. Now we want to setup a firewall blocking that port and setup NGINX as a reverse proxy so we can access it directly using port 80 (http) |
|
|
|
|
|
## 7. Setup ufw firewall |
|
|
``` |
|
|
sudo ufw enable |
|
|
sudo ufw status |
|
|
sudo ufw enable ssh (Port 22) |
|
|
sudo ufw enable http (Port 80) |
|
|
sudo ufw enable https (Port 443) |
|
|
``` |
|
|
|
|
|
## 8. Install NGINX and configure |
|
|
``` |
|
|
sudo apt install nginx |
|
|
|
|
|
sudo nano /etc/nginx/sites-available/default |
|
|
``` |
|
|
Add the following to the location part of the server block |
|
|
``` |
|
|
server_name yourdomain.com www.yourdomain.com; |
|
|
|
|
|
location / { |
|
|
proxy_pass http://localhost:5000; #whatever port your app runs on |
|
|
proxy_http_version 1.1; |
|
|
proxy_set_header Upgrade $http_upgrade; |
|
|
proxy_set_header Connection 'upgrade'; |
|
|
proxy_set_header Host $host; |
|
|
proxy_cache_bypass $http_upgrade; |
|
|
} |
|
|
``` |
|
|
``` |
|
|
# Check NGINX config |
|
|
sudo nginx -t |
|
|
|
|
|
# Restart NGINX |
|
|
sudo service restart nginx |
|
|
``` |
|
|
|
|
|
### You should now be able to visit your IP with no port (port 80) and see your app. Now let's add a domain |
|
|
|
|
|
## 9. Add domain in Digital Ocean |
|
|
In Digital Ocean, go to networking and add a domain |
|
|
|
|
|
Add an A record for @ and for www to your droplet |
|
|
|
|
|
|
|
|
## Register and/or setup domain from registrar |
|
|
I prefer Namecheap for domains. Please use this affiliate link if you are going to use them |
|
|
https://namecheap.pxf.io/c/1299552/386170/5618 |
|
|
|
|
|
Choose "Custom nameservers" and add these 3 |
|
|
|
|
|
* ns1.digitalocean.com |
|
|
* ns2.digitalocean.com |
|
|
* ns3.digitalocean.com |
|
|
|
|
|
It may take a bit to propogate |
|
|
|
|
|
10. Add SSL with LetsEncrypt |
|
|
``` |
|
|
sudo add-apt-repository ppa:certbot/certbot |
|
|
sudo apt-get update |
|
|
sudo apt-get install python-certbot-nginx |
|
|
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com |
|
|
|
|
|
# Only valid for 90 days, test the renewal process with |
|
|
certbot renew --dry-run |
|
|
``` |
|
|
|
|
|
Now visit https://yourdomain.com and you should see your Node app |