Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions backend/backend-gh-runner.md
Original file line number Diff line number Diff line change
@@ -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://<github-host>/<owner>/<repo> --token <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.
139 changes: 139 additions & 0 deletions backend/backend-setup.md
Original file line number Diff line number Diff line change
@@ -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:<passord>@localhost:5432/gamesdb
PORT=3001
JWT_SECRET=<openssl rand -base64 32>
```
> [!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 `<url>/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 `<VirtualHost *:80>`-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`.
Loading