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
39 changes: 27 additions & 12 deletions backend/deploy/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# Deploy: systemd og port 3001 (prosjekt 2)

Mal for å kjøre GraphQL-backenden som egen systemd-tjeneste på
`it2810-36.idi.ntnu.no`. **Ikke aktiver på VM** før migrasjon, seed og lokal
test av GraphQL er OK.
`it2810-36.idi.ntnu.no`. Steg-for-steg på VM: [docs/vm-backend.md §7](../../docs/vm-backend.md#7-graphql-med-systemd-port-3001).

**Verifisert på VM (oktober 2026):** tjenesten kjører som `User=birkjr`,
`Group=eall_s`, med Node
`/home/birkjr/.nvm/versions/node/v24.21.0/bin/node`,
`WorkingDirectory=/home/birkjr/T36-Project-2/backend`, miljø fra
`/etc/t36-project2/backend.env`. GraphQL svarer på `127.0.0.1:3001/graphql`
(`health`, `listings`, `createListing`); `systemctl restart` og `enabled` er
testet. VM-reboot er ikke testet.

## Avhengighet før enable

Expand All @@ -28,11 +35,15 @@ Migrasjon/seed kan fortsatt bruke `~/T36-Project-2/backend/.env`. Tjenesten lese

## Plassholdere

| Plassholder | Betydning |
| ----------------- | ---------------------------------------------------------------------- |
| `__DEPLOY_USER__` | NTNU-bruker på VM (ikke root) |
| `__BACKEND_DIR__` | Absolutt sti, f.eks. `/home/<NTNU_BRUKERNAVN>/T36-Project-2/backend` |
| `__NODE_BIN__` | Full sti til Node 24, f.eks. output av `which node` etter `nvm use 24` |
| Plassholder | Betydning |
| ----------------- | ---------------------------------------------------------------------------------- |
| `__DEPLOY_USER__` | NTNU-bruker på VM (ikke root) |
| `__BACKEND_DIR__` | Absolutt sti, f.eks. `/home/<NTNU_BRUKERNAVN>/T36-Project-2/backend` |
| `__NODE_BIN__` | Full sti til Node 24, f.eks. `/home/<bruker>/.nvm/versions/node/v24.21.0/bin/node` |

Etter `sed` fra malen: på IT2810-VM kan **`Group=`** settes til primærgruppen
(f.eks. `eall_s`) i stedet for brukernavn, hvis `systemd` krever det. Rediger
`/etc/systemd/system/t36-project2-backend.service` og kjør `daemon-reload`.

## Forberedelse på VM (etter GraphQL er merget)

Expand Down Expand Up @@ -96,13 +107,14 @@ sed -e "s|__DEPLOY_USER__|${DEPLOY_USER}|g" \
sudo systemctl daemon-reload
```

**Ikke kjør `enable` eller `start` før `src/server.ts` finnes** og du har testet:
Test manuelt før `enable` (miljø fra `/etc/t36-project2/backend.env`):

```bash
set -a && source /etc/t36-project2/backend.env && set +a
"${NODE_BIN}" "${BACKEND_DIR}/node_modules/tsx/dist/cli.mjs" "${BACKEND_DIR}/src/server.ts"
```

Når GraphQL er klar:
Deretter:

```bash
sudo systemctl enable t36-project2-backend
Expand All @@ -112,11 +124,14 @@ sudo systemctl start t36-project2-backend
## Kontroll

```bash
sudo systemctl status t36-project2-backend
sudo systemctl status t36-project2-backend --no-pager
sudo systemctl is-enabled t36-project2-backend
journalctl -u t36-project2-backend -n 50 --no-pager
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3001/
sudo ss -tlnp | grep 3001
ss -tlnp | grep 3001 || true

curl -sS -X POST http://127.0.0.1:3001/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ health listings { id } }"}'
```

Stopp / restart:
Expand Down
230 changes: 202 additions & 28 deletions docs/vm-backend.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# VM: PostgreSQL og backend (prosjekt 2)

Kort beskrivelse av databaselaget på gruppens NTNU-VM. **GraphQL, Apache og
backend-server på port 3001 er ikke satt opp ennå** — det kommer i senere issues.
Kort beskrivelse av databaselaget og GraphQL-backenden på gruppens NTNU-VM.
**Apache-proxy og frontend mot API** er fortsatt ikke aktivert — GraphQL kjører
kun på **`127.0.0.1:3001`** inne på VM (systemd).

**Lokal utvikling på egen maskin** (egen PostgreSQL, egen `.env`) står i
README under [Lokal backend-utvikling](../README.md#lokal-backend-utvikling).
Expand All @@ -11,17 +12,39 @@ Dette dokumentet gjelder **kun** den delte VM-en.

## Status på VM (verifisert)

Følgende er **allerede på plass** og testet:
Følgende er **på plass** og testet:

| Komponent | Detalj |
| -------------- | ------------------------------------------------------ |
| PostgreSQL | 18.6, cluster `18/main`, port 5432, autostart |
| Database | `t36_project2` |
| Databasebruker | `t36_project2` |
| Node.js | 24.21.0 via nvm (npm 11.x) |
| Schema/data | `npm run migrate` og seed med 10 annonser i `listings` |
| Komponent | Detalj |
| -------------- | -------------------------------------------------------- |
| PostgreSQL | 18.6, cluster `18/main`, port 5432, autostart |
| Database | `t36_project2` |
| Databasebruker | `t36_project2` |
| Node.js | 24.21.0 via nvm (npm 11.x) |
| Schema/data | `npm run migrate` og seed med 10 annonser i `listings` |
| GraphQL | systemd `t36-project2-backend`, `127.0.0.1:3001/graphql` |

Repo for prosjekt 2 ligger typisk i `~/T36-Project-2` på VM.
Repo for prosjekt 2 ligger i `~/T36-Project-2` på VM.

### GraphQL/systemd (verifisert oktober 2026)

Deploy er kjørt og kontrollert på `it2810-36.idi.ntnu.no`:

| Punkt | Verdi |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| Tjeneste | `t36-project2-backend` — `active`, `enabled` |
| Endepunkt | `http://127.0.0.1:3001/graphql` (kun på VM / via SSH) |
| `WorkingDirectory` | `/home/birkjr/T36-Project-2/backend` |
| `ExecStart` (Node) | `/home/birkjr/.nvm/versions/node/v24.21.0/bin/node` + lokal `tsx` |
| `User` / `Group` | `birkjr` / `eall_s` (på VM; mal i repo bruker `Group=__DEPLOY_USER__` — sett `Group` til primærgruppen din om den avviker) |
| Miljøfil | `/etc/t36-project2/backend.env` (`DATABASE_URL`, `HOST=127.0.0.1`, `PORT=3001`) |
| Data | `listings` returnerer 10 seed-annonser via GraphQL |
| Mutasjon | `createListing` testet; testannonse slettet i PostgreSQL |
| Drift | `systemctl restart t36-project2-backend` verifisert |
| Gjenstår | Full **VM-reboot** for å bekrefte autostart etter boot (ikke kjørt ennå) |

Andre gruppemedlemmer med SSH til samme VM trenger ikke ny systemd-installasjon
med mindre enheten endres; de kan bruke GraphQL med `curl` mot `127.0.0.1:3001`
inne på VM.

**Andre gruppemedlemmer** trenger normalt bare NTNU VPN, SSH-tilgang til VM-en og
`DATABASE_URL` (databasepassord) etter avtale med gruppen. De skal **ikke** kjøre
Expand Down Expand Up @@ -134,9 +157,11 @@ node -v
som prosjekt 1 bruker uten å sjekke med gruppen.
- Prosjekt 2 bruker egen database (`t36_project2`) — ikke del eller overskriv
prosjekt 1s data.
- Apache `/project2` og port **3001** er **ikke** konfigurert for prosjekt 2 ennå.
- Apache `/project2` og proxy mot port **3001** er **ikke** aktivert for prosjekt 2
ennå. GraphQL er bare nåbar **på VM-en** via `127.0.0.1:3001/graphql` (SSH /
tunnel), ikke fra internett uten videre oppsett.

Etter fremtidige endringer: verifiser at prosjekt 1 fortsatt fungerer.
Etter endringer: verifiser at prosjekt 1 fortsatt fungerer.

## 6. Backup

Expand Down Expand Up @@ -203,20 +228,170 @@ nvm use 24
node -v
```

## 7. systemd og port 3001 (forberedt i repo)
## 7. GraphQL med systemd (port 3001)

Detaljer og feilsøking: [backend/deploy/README.md](../backend/deploy/README.md).

| Fil | Formål |
| --------------------------------------------- | ----------------------------------------------------------------- |
| `backend/deploy/t36-project2-backend.service` | systemd-mal (plassholdere erstattes på VM) |
| `/etc/t36-project2/backend.env` | Hemmeligheter for **tjenesten** (utenfor git) |
| `~/T36-Project-2/backend/.env` | Valgfritt for **migrate/seed** (endres ikke av systemd-oppsettet) |

Tjenesten **`t36-project2-backend`** kjører som din NTNU-bruker, lytter på
`127.0.0.1:3001`, GraphQL på **`/graphql`**. `ExecStart` bruker absolutt sti til
Node 24 (nvm) og `node_modules/tsx` etter `npm ci`.

### 7.1 Første gangs aktivering på VM

Erstatt `<NTNU_BRUKERNAVN>` med ditt brukernavn. Kjør steg for steg; ikke lim
databasepassord inn i terminalen.

**1. Hent kode (grenen `dev` skal inneholde GraphQL etter merge #35/#36):**

```bash
ssh <NTNU_BRUKERNAVN>@it2810-36.idi.ntnu.no
cd ~/T36-Project-2
git fetch origin
git checkout dev
git pull origin dev
```

**2. Backend-avhengigheter:**

```bash
cd ~/T36-Project-2/backend
source ~/.nvm/nvm.sh
nvm use 24
node -v
npm ci
npm run typecheck
test -f node_modules/tsx/dist/cli.mjs
```

**3. Noter absolutt Node-sti (systemd laster ikke nvm-shell):**

```bash
export DEPLOY_USER="$(whoami)"
export NODE_BIN="$(which node)"
export BACKEND_DIR="/home/${DEPLOY_USER}/T36-Project-2/backend"
echo "DEPLOY_USER=${DEPLOY_USER}"
echo "NODE_BIN=${NODE_BIN}"
echo "BACKEND_DIR=${BACKEND_DIR}"
```

**4. Miljøfil for tjenesten** (overskriver **ikke** `backend/.env`):

```bash
sudo mkdir -p /etc/t36-project2
sudo cp "${BACKEND_DIR}/deploy/backend.env.example" /etc/t36-project2/backend.env
sudo chmod 640 /etc/t36-project2/backend.env
sudo chown "root:${DEPLOY_USER}" /etc/t36-project2/backend.env
sudo nano /etc/t36-project2/backend.env
```

I editoren: sett `DATABASE_URL=postgresql://t36_project2:…@localhost:5432/t36_project2`
(samme passord som gruppen bruker i `backend/.env`), `HOST=127.0.0.1`, `PORT=3001`.
Lagre og lukk.

**5. Manuell røyktest** (Ctrl+C for å stoppe):

```bash
set -a && source /etc/t36-project2/backend.env && set +a
"${NODE_BIN}" "${BACKEND_DIR}/node_modules/tsx/dist/cli.mjs" "${BACKEND_DIR}/src/server.ts"
```

I annen SSH-sesjon (eller etter Ctrl+C og systemd):

```bash
curl -sS -X POST http://127.0.0.1:3001/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ health }"}'
```

**6. Installer og start systemd** (kun prosjekt 2, port 3001):

```bash
sed -e "s|__DEPLOY_USER__|${DEPLOY_USER}|g" \
-e "s|__BACKEND_DIR__|${BACKEND_DIR}|g" \
-e "s|__NODE_BIN__|${NODE_BIN}|g" \
"${BACKEND_DIR}/deploy/t36-project2-backend.service" \
| sudo tee /etc/systemd/system/t36-project2-backend.service > /dev/null

sudo systemctl daemon-reload
sudo systemctl enable t36-project2-backend
sudo systemctl start t36-project2-backend
```

**7. Status og logger:**

```bash
sudo systemctl status t36-project2-backend --no-pager
sudo systemctl is-enabled t36-project2-backend
journalctl -u t36-project2-backend -n 50 --no-pager
ss -tlnp | grep 3001 || true
```

### 7.2 Verifisering av GraphQL

```bash
curl -sS -X POST http://127.0.0.1:3001/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ health }"}'

curl -sS -X POST http://127.0.0.1:3001/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ listings { id title dailyPrice } }"}'
```

Test `createListing` og rydd opp (ingen delete-mutation — slett i SQL):

```bash
curl -sS -X POST http://127.0.0.1:3001/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"mutation { createListing(input: { title: \"VM systemd test\", category: handTools, description: \"Kort test\", area: \"Gløshaugen\", dailyPrice: 1 }) { id title } }"}'
```

Noter `id` fra svaret, deretter (passord med `-W`):

```bash
psql -h localhost -U t36_project2 -d t36_project2 -W \
-c "DELETE FROM listings WHERE id = 'listing-…';"
```

Autostart: `sudo systemctl is-enabled t36-project2-backend` skal vise `enabled`.
Full VM-reboot for å bekrefte autostart etter boot er **ikke** kjørt ennå (planlegg
i avtalt vindu).

### 7.3 Drift: start, stopp, restart, oppdatering

```bash
sudo systemctl stop t36-project2-backend
sudo systemctl start t36-project2-backend
sudo systemctl restart t36-project2-backend
```

Etter `git pull` i backend:

```bash
cd ~/T36-Project-2/backend && source ~/.nvm/nvm.sh && nvm use 24 && npm ci
sudo systemctl restart t36-project2-backend
```

Mal for egen systemd-tjeneste ligger i
[backend/deploy/README.md](../backend/deploy/README.md):
### 7.4 Feilsøking

- `backend/deploy/t36-project2-backend.service` — egen enhet for prosjekt 2
- `backend/deploy/backend.env.example` — miljøvariabler under
`/etc/t36-project2/backend.env` (utenfor git)
| Symptom | Sjekk |
| --------------------------- | ------------------------------------------------------------------- |
| `failed` / exit code | `journalctl -u t36-project2-backend -n 100 --no-pager` |
| `DATABASE_URL` / tilkobling | Innhold i `/etc/t36-project2/backend.env`, `psql` med samme URL |
| `tsx` mangler | `npm ci` i `backend/`, `test -f node_modules/tsx/dist/cli.mjs` |
| Node ikke funnet | `NODE_BIN` i unit-filen må være **absolutt** sti etter `nvm use 24` |
| Port opptatt | `ss -tlnp \| grep 3001` — skal ikke kollidere med prosjekt 1 |
| Endret Node-versjon | Oppdater `ExecStart`/`NODE_BIN`, `daemon-reload`, `restart` |

Tjenesten kjører som **ikke-privilegert** NTNU-bruker, leser
`/etc/t36-project2/backend.env` (`chmod 640`, eier `root:<bruker>`). GraphQL må
**binde til `HOST=127.0.0.1` og `PORT=3001`** fra den filen. **Ikke `enable`/`start`
på VM ennå** — `src/server.ts` mangler; `ExecStart` bruker Node + lokal
`node_modules/tsx` etter `npm ci`.
`src/server.ts` laster også `backend/.env` via dotenv hvis filen finnes; variabler
fra systemd (`EnvironmentFile`) overskrives ikke. Migrate/seed bruker fortsatt
`backend/.env` som før.

## 8. Apache `/project2/` (forberedt i repo)

Expand All @@ -233,9 +408,8 @@ og GraphQL.

## Gjenstår (ikke implementert)

- GraphQL-server som faktisk kan startes av systemd
- Aktivering av `t36-project2-backend` på VM
- Aktivering av Apache-site `t36-project2.conf`
- Frontend koblet til API
- Aktivering av Apache-site `t36-project2.conf` og offentlig `/project2/api/`
- Frontend koblet til GraphQL
- Evt. full VM-reboot-test av systemd autostart (anbefales i avtalt vindu)

Se [README](../README.md) for planlagt videre arbeid.