diff --git a/backend/deploy/README.md b/backend/deploy/README.md index a50707c..7e2a43b 100644 --- a/backend/deploy/README.md +++ b/backend/deploy/README.md @@ -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 @@ -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//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//T36-Project-2/backend` | +| `__NODE_BIN__` | Full sti til Node 24, f.eks. `/home//.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) @@ -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 @@ -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: diff --git a/docs/vm-backend.md b/docs/vm-backend.md index 17483bc..f7d2f10 100644 --- a/docs/vm-backend.md +++ b/docs/vm-backend.md @@ -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). @@ -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 @@ -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 @@ -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 `` 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 @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:`). 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) @@ -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.