diff --git a/backend/backend-gh-runner.md b/backend/backend-gh-runner.md new file mode 100644 index 0000000..17d0e15 --- /dev/null +++ b/backend/backend-gh-runner.md @@ -0,0 +1,73 @@ +# gh-runner-oppsett +## 1. Bruker og mappe +```bash +sudo useradd -r -m -d /var/lib/gh-runner -s /bin/bash gh-runner +sudo mkdir -p /opt/actions-runner +sudo chown gh-runner: /opt/actions-runner +``` + +Runneren skal ligge i /opt og ikke i en $HOME. +Dette er nødvendig så den starter etter omstart uten at noen er logget inn. + +## 2. Download + +1. Gå til repoet på GitHub: `Settings -> Actions -> Runners` +2. Trykk på New self-hosted runner +3. Velg Linux x64. + +Før nedlastingen bytt til `gh-runner` brukeren og gå inn i mappen vi opprettet: +```bash +sudo -u gh-runner bash +cd /opt/actions-runner +``` + +Følg stegene som står på GitHub for å laste ned runner og pakke ut. + +## 3. Configure + +Fortsatt som gh-runner, se linje som står under `Configure`: +```bash +./config.sh --url https://// --token --name it2810-02 +``` +Trykk enter for standard-valgene. + +## 4. Installer som tjeneste +Vi ønsker å kjøre GitHub runner-en som en systemd-service, dette kan gjøres med +et script som følger med runner-installasjonen. + +Bytt til en bruker i `sudoers` filen, og gjør følgende: +```bash +cd /opt/actions-runner +sudo ./svc.sh install gh-runner +sudo ./svc.sh start +sudo ./svc.sh status +``` + +## 5. Workflow avhengigheter +Workflow filen vår bruker rsync og curl. + +Dette bør være lastet ned, men dobbeltsjekk: +```bash +which rsync curl || sudo apt install -y rsync curl +``` + +> [!NOTE] +>Node og pnpm installeres av workflowen selv. + +## 6. Verifiser +Sjekk at `runner` kan sees i GitHub: +[Repo] -> Settings -> Actions -> Runners + +Her skal it2810-02 vises som Idle. + +Forsøk å restarte vm og sjekk at service starter opp: +```bash +sudo reboot +systemctl status 'actions.runner.*' +``` + +Den skal være active (running), startet ved oppstart. + +> [!NOTE] +>Tilgangen runneren trenger for deploy, altså eierskap til +>/var/www/project2 og sudoers-regelen for å restarte backend, står i backend-gjennomgangen. \ No newline at end of file diff --git a/backend/backend-setup.md b/backend/backend-setup.md new file mode 100644 index 0000000..23e0fe9 --- /dev/null +++ b/backend/backend-setup.md @@ -0,0 +1,139 @@ +# Backend-oppsett +## 1. Node installasjon +Sjekk om node er installert og at det er versjon 24.x eller nyere: +```bash +/usr/bin/node --version +``` + +Mangler den, eller er versjonen under 24: +```bash +sudo apt update +curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh +sudo -E bash nodesource_setup.sh +sudo apt install -y nodejs +``` + +## 2. Opprett mapper og bruker +Vi opprettet en egen bruker for å kjøre backend prosessen. +Brukeren har minimale rettigheter og kun tillatelse til å +lese .env, men ikke redigere kode. + +Opprett bruker og sett rettigheter: +```bash +sudo useradd -r -s /usr/sbin/nologin project2 +sudo mkdir -p /var/www/project2/backend +sudo chown -R gh-runner:www-data /var/www/project2 +sudo chmod 755 /var/www/project2 +``` + +## 3. Environment vars + +Opprett fil og rediger (kan også opprette fil først): +```bash +sudo [nvim/vim/nano] /var/www/project2/backend.env +``` + +Legg inn følgende `.env` variabler: +``` +DATABASE_URL=postgresql://webapp:@localhost:5432/gamesdb +PORT=3001 +JWT_SECRET= +``` +> [!NOTE] +> Brukeren som postgres bruker for å logge inn her må være opprettet på +> databasen. Passordet som brukes for å opprette skal fylles inn. +> +> JWT_SECRET trengs for å autentisere brukere mot backend + +Sett rettighetene på filen: +```bash +sudo chown root:project2 /var/www/project2/backend.env +sudo chmod 640 /var/www/project2/backend.env +``` + +## 4. systemd-service +Vi legger `systemd`-servicen direkte i `/etc/systemd/system/`. +Dette directory er beskyttet og krever `sudo`-rettigheter for +å redigere. + +Opprett og rediger fil: +```bash +sudo [nvim/vim/nano] /etc/systemd/system/project2-backend.service +``` + +Legg inn følgende i `.service`-filen: + +``` +[Unit] +Description=Project 2 GraphQL backend +After=network.target postgresql.service +Wants=postgresql.service + +[Service] +Type=simple +User=project2 +Group=project2 +WorkingDirectory=/var/www/project2/backend +EnvironmentFile=/var/www/project2/backend.env +ExecStart=/usr/bin/node dist/index.js +Restart=on-failure +RestartSec=5 +NoNewPrivileges=true +Environment=NODE_ENV=production + +[Install] +WantedBy=multi-user.target +``` + +Restart `daemon` og enable `systemd`-service: +```bash +sudo systemctl daemon-reload +sudo systemctl enable project2-backend.service +``` + +## 5. Runner permissions +Vi bruker en lokalt hostet github runner for å kjøre lint- og format-checks, og for å deploye +prosjektet til vm-en. + +Vi setter derfor tillatelser på `gh-runner` slik at denne har tillatelse til å restarte +servicen vi opprettet: +```bash +echo 'gh-runner ALL=(root) NOPASSWD: /usr/bin/systemctl restart project2-backend.service' | sudo tee /etc/sudoers.d/project2-deploy +sudo chmod 440 /etc/sudoers.d/project2-deploy +sudo visudo -cf /etc/sudoers.d/project2-deploy +``` + +## 6. Apache-proxy +Vi bruker en proxy for å redirecte trafikk for `/graphql` mot backend tjenesten lokalt +på vm. + +Opprett proxy, og rediger `.conf` filen: +```bash +sudo a2enmod proxy proxy_http +sudo [nvim/vim/nano] /etc/apache2/sites-available/000-default.conf +``` + +Legg til følgende inne i ``-blokken i filen: +```apache +ProxyPass /project2/graphql http://127.0.0.1:3001 +ProxyPassReverse /project2/graphql http://127.0.0.1:3001 +``` + +Sjekk config for feil og reload apache-tjenesten: +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` +## 7. Verifiser + +Etter første deploy (eller kjør workflowen manuelt på main): + +```bash +systemctl status project2-backend.service +curl -s -X POST -H 'Content-Type: application/json' \ + -d '{"query":"{ genres { name } }"}' http://localhost:3001/ +curl -s -X POST -H 'Content-Type: application/json' \ + -d '{"query":"{ genres { name } }"}' http://localhost/project2/graphql +``` + +Begge curl-kallene skal gi sjangrene. +Hvis noen av de feiler, se loggen med `journalctl -u project2-backend -n 50`. \ No newline at end of file