# Setup Node.js, Nginx, SSL to server

URL: https://mepritam.dev/references/setup-node-nginx-ssl/

setup a server with Node.js server and install Nginx with SSL certificates

---

# Node.js Deployment

> Steps to deploy a Node.js app to DigitalOcean using PM2, NGINX as a reverse proxy and an SSL from LetsEncrypt

## 1. Spin up a server

you can use any hosting provider you wish, or you can also use a local Linux server, Ubuntu based server is preferred.

## 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

```bash
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 onto the server, I would suggest using Git

```bash
git clone yourproject.git
```

### 5. Install dependencies and test the app

```bash
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

```bash
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 the 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 set up 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

```bash
sudo ufw enable
sudo ufw status
sudo ufw allow ssh (Port 22)
sudo ufw allow http (Port 80)
sudo ufw allow https (Port 443)
```

## 8. Install NGINX and configure

```bash
sudo apt install nginx

sudo nano /etc/nginx/sites-available/default
```

Add the following to the location part of the server block

```bash
    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;
    }
```

```bash
# Check NGINX config
sudo nginx -t

# Restart NGINX
sudo service nginx restart
```

### 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 set up domain from the 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 propagate

10. Add SSL with Lets Encrypt

```bash
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python3-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
