Production

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.

Rubrik


The computer you have access to is publicly reachable over the Internet. You are only allowed to use this machine for the purposes described in this course. You are not allowed to use the machine for private projects.

Rubrik


The SSH-key you have received should be considered a secret, and it is important that you do not send it to a third party or show the key in any online streams.

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

- Nginx – Installation

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

- Lets Encrypt

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.

Välkommen till CoursePress

en utav Linnéuniversitets lärplattformar. Som inloggad student kan du kommunicera, hålla koll på dina kurser och mycket mer. Du som är gäst kan nå de flesta kurser och dess innehåll utan att logga in.

Läs mer lärplattformar vid Linnéuniversitetet

Studentkonto

För att logga in behöver du ett studentkonto vid Linnéuniversitet.

Läs mer om att hämta ut studentkonto

Inloggning LNU