Description
In this course, you need a place to deploy the applications you create. To do that, each student gets a virtual Linux machine in our cloud solution, “CSCloud.”
This exercise will make you hit the ground running when you want to deploy your examination assignments. The recommendation is to follow along in this exercise before you start working on the examination assignments.
## What to do
This is a brief list of things that this exercise will process. You can, if you like, try to do it by yourself by reading the documentation, or by following along in the recordings.
1. Connect to your cloud server
- Download the SSH-key
- Connect to the server using SSH
2. Update the server and install:
- npm and node
3. Configure NGINX to serve as a proxy for your applications
4. Add HTTPS support using Lets Encrypt
5. Enable HTTP2 (optional)
6. Run our applications in production
Step 1 – Connect to your server
First of all, you need to download the SSH-key from Gitlab. You find the file in a project called “Secrets” in your course.
Useful commands
- $ `ssh ubuntu@{IPNUMBER}`
Step 2 – Update, Upgrade and install Node and NPM
Useful commands
- $ `sudo apt-get update`
- $ `sudo apt-get dist-upgrade`
Useful links
- Node.js
Step 3 – Configure NGINX
Useful commands
- $ `sudo apt-get install nginx`
- $ `sudo systemctl status nginx`
- $ `sudo systemctl reload nginx` (service is being used in the recording but systemctl is newer and should be used.)
- /etc/nginx/nginx.conf – Location of global config file
- /etc/nginx/sites-enabled/default – Location of default server block config file.
Useful links
Step 4 – Add TLS (https)
Since Lets Encrypt has a rate limit of 50 certificates per week and domain (lnu.se) we might reach the limits from time to time. I that happens please notify @leitet in Slack. The only thing to do then is to wait for the limit to be reset.
Useful links
Step 5 – Enable HTTP v2 (optional)
This is an optional step. We will probably get around just fine using good old http 1.1.
Step 6 – Process Manager, PM2
In this step we will make sure our applications keeps on running on our server using a process manager.
Useful commands
- $ `sudo npm i pm2 -g`
- $ `PORT=5001 pm2 start npm –name hello-world:5001 — start` // Run “npm start” with port set to 5001
- $ `pm2 logs`
- $ `pm2 monit`
Step 7 – Getting the code to the server
Now, how do we get the code to the production server? There are several ways:
…using secure copy, FileZilla or VSCode
Useful links
- SCP man
- FileZilla
- VSCode – Remote SSH
Step 8 – Running a node.js/docker application
Step 8.1 – Docker
Ni behöver docker för att köra mongodb (om ni inte kör den via en molntjänst.)
8.1.1
Det är bara till att följa denna guide för att installera senaste versionen: https://docs.docker.com/engine/install/ubuntu/
Välj: “Install using repository” för processor “x86_64 / amd64″
När det är gjort behöver ni se till att docker körs som ubuntu-användaren och inte root:
8.1.2
$ `sudo usermod -aG docker ubuntu`
$ `sudo systemctl restart docker`
8.1.3
Logga in och ut igen för att se till att rättigheterna slår igenom.
8.1.4
Nu kan ni köra dockerkommandon direkt på er ubuntumaskin:
$ `docker run -d -p 27017:27017 –name mongodb mongo:4.4.3`
…eller via ssh från er egen maskin genom att använda flaggan -H. Exempelvis:
$ `docker -H ssh://ubuntu@194.47.177.216 run -d -p 27017:27017 –name mongodb mongo:4.4.3`
_Där ni givetvis behöver byta ut IP-numret mot det på er maskin._
8.2 – Getting the files to the server
Detta har vi ju en inspelning på men i den fick jag inte rätt på att flytta över alla filer från katalogen jag stod i. Detta är dock enkelt genom att använda *. Exempelvis:
$ `scp -r * ubuntu@194.47.177.216:/var/www/snippet-app/`
_Obs! se till att ni inte kopierar in node_modules!_
8.3 – Configuring NGINX
Även detta finns det en film på men det behövs läggas till några direktiv för att få säkra kakor att fungera. Så här ser min konfiguration ut:
location /snippets-app/ {
proxy_pass http://localhost:5003/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Nytillagda
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
_Observera hur jag har använt / på rad 1 och 2!_
8.3.1 Starta om NGINX!
8.4 – Start the application
Sista steget är att starta applikationen genom att använda PM2 och skicka med rätt miljövariabler. Observera att det går att lägga in en konfigurationsfil för PM2 om ni vill förenkla lite. Mer information om detta här: https://pm2.io/docs/runtime/best-practices/environment-variables/
$ `PORT=5003 DB_CONNECTION_STRING=mongodb://localhost:27017/snippets BASE_URL=/snippets-app/ NODE_ENV=production pm2 start npm –name snippetapp:5004 — start`
❗️ Om ni kopierar in nya filer till servern behöver ni starta om PM2!
❗️ Om du använder fler miljövariabler (exempelvis för Session Secret) så behöver de läggas till ovan.
❗️ Felmeddelanden gällande att sessionen bör sparas i en Memorystore kan ignoreras i vårt fall.
8.5 Felsökning
* Kontrollera att porten satt i NGINX-configen överensstämmer med miljövariabeln PORT
* Har du startat om nginx efter en konfigurationsändring?
* Vilka felmeddelanden ger node? pm2 logs –lines 100
* Är docker containern igång? docker ps
* Har du startat om pm2 efter det att du kopierat in uppdaterad kod? pm2 restart {ID}
För att underlätta felsökning på servern kan du också byta från NODE_ENV=production till NODE_ENV=development. Då får du ut felmeddelanden i klartext på klienten istället för bara en 500-sida. Glöm inte att byta tillbaka när du fått allt att fungera.