From 86e3058c270f350259c3b8bf4163a0cdc527a9d3 Mon Sep 17 00:00:00 2001 From: albdert Date: Fri, 2 Oct 2026 11:04:05 +0200 Subject: [PATCH 1/6] feature: db scripts, apollo install --- backend/package.json | 5 +++-- db/.env.example | 4 ++++ db/database-connect.md | 23 +++++++++++++++++++++++ package.json | 3 ++- scripts/db-tunnel.sh | 15 +++++++++++++++ scripts/test-select.sh | 2 ++ 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 db/.env.example create mode 100644 db/database-connect.md create mode 100755 scripts/db-tunnel.sh create mode 100755 scripts/test-select.sh diff --git a/backend/package.json b/backend/package.json index c5121671..e70e316a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -3,16 +3,17 @@ "version": "1.0.0", "description": "", "main": "index.js", + "type": "module", "scripts": { "dev": "tsx watch src/index.ts", + "compile": "tsc", "build": "tsc", - "start": "node dist/index.js", + "start": "pnpm run build && node dist/index.js", "lint": "eslint ." }, "keywords": [], "author": "", "license": "ISC", - "type": "module", "dependencies": { "@apollo/server": "^5.5.1", "dotenv": "^18.0.5", diff --git a/db/.env.example b/db/.env.example new file mode 100644 index 00000000..2f4cadc4 --- /dev/null +++ b/db/.env.example @@ -0,0 +1,4 @@ +VM_USER=brukernavn +VM_HOST=it2810-02.idi.ntnu.no +TUNNEL_PORT=5433 +DATABASE_URL=postgresql://gameapp:PASSORD@localhost:5433/gamesdb diff --git a/db/database-connect.md b/db/database-connect.md new file mode 100644 index 00000000..c701b6c4 --- /dev/null +++ b/db/database-connect.md @@ -0,0 +1,23 @@ + +#### Database-connect + +Scripts for å koble seg til database ligger i `/scripts`. + +###### db-tunnel.sh + +Spesifikt inneholder denne `db-tunnel.sh` som oppretter en ssh tunnel til vm over porten `5432`. Dette gjør at all trafikk som normalt går til `localhost:5432` rutes til postgres på serveren, slik at vi slipper å laste ned hele databasen på hver av pc-ene våre. + +`db-tunnel.sh` scriptet er lagt inn som et script i `/package.json`, og kan kjøres med `pnpm db:tunnel`. + +###### test-select.sh + +Det andre scriptet er `test-select.sh`, dette er et enkelt script som kjører en spørring mot en database på `localhost:5432`. Hvis tunnellen fungerer skal dette returnere dette: + +``` + count +-------- + 120067 +(1 row) +``` + +For å kunne kjøre dette scriptet trenger man postgres-client. Dette kan lastes ned med `sudo apt update && sudo apt install postgresql-client` på debian/ubuntu, og med `brew install libpq` på mac. diff --git a/package.json b/package.json index 9f8245b3..0853878c 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "lint": "pnpm -r lint", "test": "pnpm -r test", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "db:tunnel": "./scripts/db-tunnel.sh" }, "devDependencies": { "prettier": "^3.9.9" diff --git a/scripts/db-tunnel.sh b/scripts/db-tunnel.sh new file mode 100755 index 00000000..908c0089 --- /dev/null +++ b/scripts/db-tunnel.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." +set -a +source db/.env +set +a + +if lsof -i ":$TUNNEL_PORT" >/dev/null 2>&1; then + echo "Port $TUNNEL_PORT er i bruk, tunnelen kjører antakelig fra før..." + exit 0 +fi + +echo "Tunnel: localhost:$TUNNEL_PORT -> $VM_HOST:5432 (Ctrl+C for å stoppe)" +ssh -N -L "$TUNNEL_PORT:localhost:5432" "$VM_USER@$VM_HOST" diff --git a/scripts/test-select.sh b/scripts/test-select.sh new file mode 100755 index 00000000..c3226c45 --- /dev/null +++ b/scripts/test-select.sh @@ -0,0 +1,2 @@ +#!/bin/bash +psql -h localhost -p 5433 -U gameapp -d gamesdb -c "SELECT count(*) FROM games;" From 4c60d7f043bf936d0a657d9bcfee1b0cd6e207a3 Mon Sep 17 00:00:00 2001 From: albdert Date: Fri, 2 Oct 2026 12:00:57 +0200 Subject: [PATCH 2/6] la til enkelt eksempel med apollo --- backend/src/index.ts | 49 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 5a97d4ff..d9926ee3 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,2 +1,47 @@ -// placeholder, erstattes av apollo server senere -console.log('backend'); +import { ApolloServer } from "@apollo/server"; +import { startStandaloneServer } from "@apollo/server/standalone"; +import { Query } from "pg"; +import { start } from "repl"; + +const typeDefs = `#graphql + # comment + type Book { + title: String + author: String + } + + type Query { + books: [Book] + } +`; + +const books = [ + { + title: 'The awakening', + author: 'Kate Chopin', + }, + { + title: 'City of glass', + author: 'Paul Auster', + }, +]; + +const resolvers = { + Query: { + books: () => books, + }, +}; + + +// apollo server instance +const server = new ApolloServer({ + typeDefs, + resolvers, +}); + +// pass apolloserver to standaloneserver +const { url } = await startStandaloneServer(server, { + listen: { port: 4000 }, +}); + +console.log(`Server ready at: ${url}`); \ No newline at end of file From 4bd45443de8866de6aea03826e49e2916b827db7 Mon Sep 17 00:00:00 2001 From: Albert Paulsen Lindberg Date: Thu, 8 Oct 2026 11:32:47 +0200 Subject: [PATCH 3/6] Create ssh-tunnel.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit liten dokumentasjon på bruk av tunnel-scriptet mot databasen på vm --- db/ssh-tunnel.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 db/ssh-tunnel.md diff --git a/db/ssh-tunnel.md b/db/ssh-tunnel.md new file mode 100644 index 00000000..c0f0de44 --- /dev/null +++ b/db/ssh-tunnel.md @@ -0,0 +1,53 @@ +## Felles +#### Konfigurere `.env` +1. Koble til NTNU VPN hvis du er utenfor campus. +2. Kopier `backend/.env.example` til `backend/.env` +3. Fyll inn verdien til `VM_USER`, og `PASSORD` i `DATABASE_URL`. + +`backend/.env` skal da se ut slik: +``` +VM_USER= +VM_HOST=it2810-02.idi.ntnu.no +DATABASE_URL=postgresql://webapp:@localhost:5433/gamesdb +PORT=3001 +TUNNEL_PORT=5433 +``` + +#### Start tunnelen +Gå til rot i repo (dvs. `T02-Project-2` mappen) og kjør kommandoen: +```bash +pnpm db:tunnel +``` + +La terminalen stå åpen, og start backend i en annen terminal med `pnpm --filter backend dev`. + +## Windows + +OpenSSH følger med Windows 10 og 11. Bash-scriptet fungerer ikke via pnpm db:tunnel, fordi pnpm kjører scripts gjennom cmd. + +#### Start tunnelen i PowerShell: +```powershell +ssh -N -L 5433:localhost:5432 brukernavn@it2810-02.idi.ntnu.no +``` +Alternativt kan scriptet kjøres direkte i Git Bash eller WSL med ./scripts/db-tunnel.sh. Portsjekken i scriptet bruker lsof, som ikke finnes i Git Bash, men den hoppes da bare over. + +## Verifiser + +Med tunnelen åpen, fra rot i repoet: + +```bash +pnpm --filter backend exec tsx --env-file=.env -e " +import pg from 'pg'; +const c = new pg.Client(process.env.DATABASE_URL); +await c.connect(); +console.log((await c.query('SELECT count(*Kopier backend/.env.example til backend/.env og fyll inn VM_USER, VM_HOST, TUNNEL_PORT og DATABASE_URL (med webapp-rollen og port 5433).) FROM games')).rows); +await c.end(); +" +``` + +Skal skrive ut `[ { count: '120067' } ]`. + +#### Mulige feil +1. Connection refused på 5433 betyr at tunnelen ikke kjører. +2. Connection timed out mot VM-en betyr som regel at VPN mangler. +3. Password authentication failed betyr feil passord eller rolle i DATABASE_URL. From d532d445b24fa77715701833a2cd8e8f79bae72d Mon Sep 17 00:00:00 2001 From: Albert Paulsen Lindberg Date: Thu, 8 Oct 2026 12:00:55 +0200 Subject: [PATCH 4/6] Update database-usage.md oppdaterte med oversikt over roller, tilkobling, og litt om re-import av databasen --- db/database-usage.md | 53 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/db/database-usage.md b/db/database-usage.md index b9c6a64e..142ddfa9 100644 --- a/db/database-usage.md +++ b/db/database-usage.md @@ -1,5 +1,32 @@ +## Roller for databasen i postgres -#### Database-usage +|Rolle|Bruk|Rettigheter| +|-|-|-| +|postgres|Administrasjon|Superuser| +|gameapp|Import og schemaendringer|Eier av gamesdb| +|webapp|Backend|SELECT på alt, INSERT på reviews| + +## Koble til postgres +#### Fra vm-en: +```bash +psql -h localhost -U webapp -d gamesdb +psql -h localhost -U gameapp -d gamesdb +sudo -u postgres psql -d gamesdb +``` + +#### Fra egen maskin (`pnpm db:tunnel`): +```bash +psql -h localhost -p 5433 -U webapp -d gamesdb +``` + +#### Backend bruker `DATABASE_URL` i `backend/.env`: +``` +postgresql://webapp:PASSORD@localhost:5433/gamesdb +``` + +Port `5433` lokalt via tunnel, `5432` på VM-en. + +## Bruk av database Under er noen generelle kommandoer som kan brukes i postgres for navigere databasen: @@ -27,3 +54,27 @@ SELECT * FROM games LIMIT 5; SELECT metacritic FROM games WHERE id = 4291; ``` + +## Import og rettigheter + +Filer i `backend/db/`: `schema.sql`, `indexes.sql`, `grants.sql`, `load.py`, `requirements.txt`. + +_Full reimport på VM-en (sletter også reviews)_: +``` +cd backend/db && source .venv/bin/activate +export DATABASE_URL='postgresql://gameapp:PASSORD@localhost:5432/gamesdb' +python load.py --force +psql "$DATABASE_URL" -f grants.sql +``` + +>[!NOTE] +>`grants.sql` må kjøres etter hver reimport, siden tabellene gjenopprettes og mister rettighetene. + +_Sjekk status på tjenesten_: +```bash +sudo systemctl status postgresql +sudo systemctl restart postgresql +sudo ss -tlnp | grep 5432 +``` + +Siste skal kun vise `127.0.0.1:5432` og `[::1]:5432`. From 40b14e4ee33d6375a76bac7d6c847368cbd20cf8 Mon Sep 17 00:00:00 2001 From: Albert Paulsen Lindberg Date: Thu, 8 Oct 2026 12:07:19 +0200 Subject: [PATCH 5/6] Create grants.sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit grants for databasen, gir webapp tilgang til å lese til alle tabeller og kun skrive til reviews --- db/grants.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 db/grants.sql diff --git a/db/grants.sql b/db/grants.sql new file mode 100644 index 00000000..3d3f5532 --- /dev/null +++ b/db/grants.sql @@ -0,0 +1,6 @@ +GRANT CONNECT ON DATABASE gamesdb TO webapp; +GRANT USAGE ON SCHEMA public TO webapp; + +GRANT SELECT ON ALL TABLES IN SCHEMA public TO webapp; +GRANT INSERT ON reviews TO webapp; +GRANT USAGE ON SEQUENCE reviews_id_seq TO webapp; From a72e0897bdc98248fae86bf4a583cdd20c6f82ef Mon Sep 17 00:00:00 2001 From: Albert Paulsen Lindberg Date: Fri, 9 Oct 2026 11:45:17 +0200 Subject: [PATCH 6/6] Update database-setup.md --- db/database-setup.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/db/database-setup.md b/db/database-setup.md index 614dbe08..b786ff44 100644 --- a/db/database-setup.md +++ b/db/database-setup.md @@ -19,7 +19,9 @@ sudo -u postgres psql ```sql CREATE USER gameapp WITH PASSWORD ''; +CREATE ROLE webapp WITH LOGIN PASSWORD ''; CREATE DATABASE gamesdb OWNER gameapp; + \c gamesdb CREATE EXTENSION IF NOT EXISTS pg_trgm; \q @@ -52,7 +54,8 @@ cd backend/db python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt export DATABASE_URL='postgresql://gameapp:@localhost:5432/gamesdb' -python load.py +python load.py --force +psql "$DATABASE_URL" -f grants.sql ``` `load.py` leser Parquet-filen med DuckDB, deler opp flerverdi-felter til oppslags- og koblingstabeller, laster alt med `COPY`, oppretter indekser etter lasting og kjører `ANALYZE`. Filstien kan overstyres med `PARQUET_PATH`. Finnes tabellene allerede, avbryter scriptet. `python load.py --force` sletter og laster alt på nytt, inkludert reviews.