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
90 changes: 63 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,52 +137,83 @@ npm run dev # start utviklingsserver på http://localhost:5173
Backend ligger i `backend/` og bruker PostgreSQL. GraphQL kommer i senere
issues; foreløpig finnes migrasjon og seed for eksempelannonsene.

### Installasjon
| Miljø | Dokumentasjon |
| ---------------- | -------------------------------------------------------------------------------------------------------- |
| **Lokal maskin** | [Lokal backend-utvikling](#lokal-backend-utvikling) (under) |
| **NTNU-VM** | [docs/vm-backend.md](docs/vm-backend.md) — delt database, SSH, **ikke** samme som lokalt oppsett |
| systemd / Apache | [backend/deploy/README.md](backend/deploy/README.md), [deploy/apache/README.md](deploy/apache/README.md) |

### Lokal backend-utvikling

Følg dette for å kjøre migrasjon og seed på **egen PC**. VM-oppsettet er
separat og beskrives ikke her.

**1. Node.js** — samme krav som frontend (se [Krav](#krav)): `nvm use` i
rotmappen (`.nvmrc` → Node 24). Sjekk med `node -v` og `npm -v`.

**2. PostgreSQL lokalt** — installer PostgreSQL slik at du kan koble til
`localhost:5432` (Homebrew, apt, Postgres.app e.l.). Start tjenesten om den
ikke kjører.

**3. Database og bruker** — opprett en database som matcher det du setter i
`.env` (eksempelnavn fra `backend/.env.example`: databasen `verktoyutlan`).
Passord settes interaktivt, ikke i shell-historikk:

```bash
psql -h localhost -U postgres -d postgres
```

```sql
CREATE USER verktoyutlan_dev WITH LOGIN;
\password verktoyutlan_dev
CREATE DATABASE verktoyutlan OWNER verktoyutlan_dev;
\q
```

Tilpass bruker- og databasenavn etter eget valg; de må samsvare med `DATABASE_URL`.

**4. Miljøfil** — fra repo-roten:

```bash
cd backend
npm ci
cp .env.example .env
```

Rediger `.env` og sett `DATABASE_URL` til PostgreSQL-instansen du bruker
(lokalt eller på gruppens VM). Valgfritt: `PUBLIC_APP_BASE` styrer bildestier
i seed (standard `/project2`).
Rediger `backend/.env` og sett for eksempel:

```env
DATABASE_URL=postgresql://verktoyutlan_dev:PASSORD@localhost:5432/verktoyutlan
```

### Migrasjon og seed
(Erstatt `PASSORD` i filen — ikke skriv det i terminalkommandoer.) Filen skal
ikke committes.

Kjør migrasjon før seed, begge fra `backend/`:
**5. Avhengigheter, migrasjon og seed:**

```bash
npm ci
npm run typecheck
npm run migrate
npm run seed
```

`npm run seed` er idempotent: eksisterende rader med samme `id` hoppes over
(`ON CONFLICT DO NOTHING`). Kjør seed på nytt uten duplikater.

Seed fyller de 10 annonsene fra `src/data/mockListings.ts` (id `listing-001` til
`listing-010`). `image_url` lagres som offentlige stier under
`/project2/assets/listings/` (filnavn som i `src/assets/listings/`), uten at
backend importerer SVG-filer.

**Bilder og deploy:** `npm run build` i frontend pakker SVG-ene inn i
JavaScript-bundelen. Den lager **ikke** løse filer på
`/project2/assets/listings/`. For at seedede URL-er skal fungere når klienten
senere leser fra databasen, må SVG-ene serveres **separat** på den stien, for
eksempel ved at Apache peker `/project2/assets/listings/` til en kopi av
`src/assets/listings/` på VM. Dette er ikke en del av Vite-bygget alene.
`npm run migrate` bruker `node-pg-migrate` og `.env`. `npm run seed` kjører
`src/scripts/seed.ts` og er idempotent (`ON CONFLICT DO NOTHING`).

### Verifisere data

Etter migrasjon og seed:
**6. Verifisering:**

```bash
psql "$DATABASE_URL" -c "SELECT id, title, daily_price FROM listings ORDER BY id;"
npm run typecheck
psql -h localhost -U verktoyutlan_dev -d verktoyutlan -W -c "SELECT COUNT(*) FROM listings;"
npm run seed # forvent 0 nye annonser andre gang
```

Forvent **10 rader**. Kjør `npm run seed` en gang til og sjekk at antall
fortsatt er 10.
Forvent **10** rader i `listings`. Seed-data tilsvarer
`src/data/mockListings.ts` (id `listing-001`–`listing-010`).

**Bilder og deploy:** Seed lagrer `image_url` under `/project2/assets/listings/`.
Det gjelder VM/Apache senere — se [deploy/apache/README.md](deploy/apache/README.md).
Lokal frontend bruker fortsatt mock og importerte SVG-er.

## Kommandoer

Expand Down Expand Up @@ -211,7 +242,10 @@ kontroller som er gjort i nettleser, står i [docs/testing.md](docs/testing.md).
## Mappestruktur

```
deploy/
apache/ Apache-vhost for /project2/ og /project2/api/ (mal)
backend/
deploy/ systemd-mal og VM-deploy (port 3001)
migrations/ Versjonerte PostgreSQL-migrasjoner
src/db/ Tilkoblingspool
src/scripts/ Seed og andre engangsskript
Expand Down Expand Up @@ -324,6 +358,8 @@ utlån, korte og lange titler, tomt tilbehør og annonser uten bilde. Se
| [docs/prosjektstandard.md](docs/prosjektstandard.md) | Branches, commit-format, pull requests og krav før merge |
| [docs/design.md](docs/design.md) | Farger, typografi, kontrast og felles komponenter |
| [docs/testing.md](docs/testing.md) | Tester, kontroller, resultater og det som gjenstår |
| [docs/vm-backend.md](docs/vm-backend.md) | PostgreSQL og backend på NTNU-VM |
| [deploy/apache/README.md](deploy/apache/README.md) | Apache-mal for /project2/ og API-proxy |
| [docs/ki-bruk.md](docs/ki-bruk.md) | Hvordan vi bruker og kontrollerer KI |

`main` er beskyttet, så alt arbeid går via pull request mot `dev`. Maler for
Expand Down
149 changes: 149 additions & 0 deletions backend/deploy/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# 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 GraphQL-server er implementert**
(se eget issue). Det finnes ingen HTTP-server i backend i dag — kun migrasjon,
seed og databasepool.

## Avhengighet (GraphQL-issue)

Før `systemctl enable --now` må repoet ha minst:

- `backend/src/server.ts` (eller tilsvarende) som **leser `HOST` og `PORT` fra
miljø** og binder til **`127.0.0.1:3001`** (verdier fra
`/etc/t36-project2/backend.env` — ikke hardkode `0.0.0.0`).
- `npm ci` kjørt i `backend/`, slik at `node_modules/tsx/dist/cli.mjs` finnes.
- Valgfritt senere: `npm run build` + `ExecStart` mot `dist/server.js` i stedet
for tsx.

`backend/package.json` har i dag **ikke** `start` — bare `migrate`, `seed` og
`typecheck`.

## Filer

| Fil | Formål |
| ------------------------------ | -------------------------------------------------------------------- |
| `t36-project2-backend.service` | systemd-enhet (`__DEPLOY_USER__`, `__BACKEND_DIR__`, `__NODE_BIN__`) |
| `backend.env.example` | Mal for `/etc/t36-project2/backend.env` |

Migrasjon/seed kan fortsatt bruke `~/T36-Project-2/backend/.env`. Tjenesten leser
**kun** `/etc/t36-project2/backend.env` (utenfor git).

## 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` |

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

Erstatt `<NTNU_BRUKERNAVN>` med faktisk bruker (samme som eier repoet).

```bash
export DEPLOY_USER="<NTNU_BRUKERNAVN>"
export BACKEND_DIR="/home/${DEPLOY_USER}/T36-Project-2/backend"

cd "${BACKEND_DIR}/.."
git pull
cd "${BACKEND_DIR}"
nvm use 24
npm ci
npm run typecheck
test -f node_modules/tsx/dist/cli.mjs
# npm run build — hvis dere bytter ExecStart til dist/server.js
```

Noter Node-sti:

```bash
export NODE_BIN="$(which node)"
echo "${NODE_BIN}"
```

## Miljøfil utenfor git

Tjenesten kjører som **`DEPLOY_USER`** ( ikke root ). Filen skal være lesbar for
prosessen, men ikke for «alle» på VM:

```bash
export DEPLOY_USER="<NTNU_BRUKERNAVN>"

sudo mkdir -p /etc/t36-project2
sudo cp "/home/${DEPLOY_USER}/T36-Project-2/backend/deploy/backend.env.example" \
/etc/t36-project2/backend.env
sudo nano /etc/t36-project2/backend.env # DATABASE_URL, HOST, PORT
sudo chmod 640 /etc/t36-project2/backend.env
sudo chown "root:${DEPLOY_USER}" /etc/t36-project2/backend.env
```

**Krav i filen:** `HOST=127.0.0.1`, `PORT=3001`. GraphQL-implementasjonen må respektere
disse.

## Installere tjenesten (manuelt, én gang)

Kjør på VM etter `nvm use 24` og `npm ci` i backend:

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

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
```

**Ikke kjør `enable` eller `start` før `src/server.ts` finnes** og du har testet:

```bash
"${NODE_BIN}" "${BACKEND_DIR}/node_modules/tsx/dist/cli.mjs" "${BACKEND_DIR}/src/server.ts"
```

Når GraphQL er klar:

```bash
sudo systemctl enable t36-project2-backend
sudo systemctl start t36-project2-backend
```

## Kontroll

```bash
sudo systemctl status t36-project2-backend
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
```

Stopp / restart:

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

Ved OS-omstart: autostart når enheten er **enabled** (`Restart=on-failure` ved krasj).

## Prosjekt 1

- Enheten heter `t36-project2-backend` og bruker port **3001** — ikke endre
prosjekt 1s tjenester eller Apache-vhosts.

## Oppdatere etter pull

```bash
export BACKEND_DIR="/home/<NTNU_BRUKERNAVN>/T36-Project-2/backend"
cd "${BACKEND_DIR}" && npm ci
sudo systemctl restart t36-project2-backend
```

Ved bytt til produksjonsbuild, oppdater `ExecStart` i
`/etc/systemd/system/t36-project2-backend.service` (f.eks. `node dist/server.js`),
deretter `daemon-reload` og `restart`.
21 changes: 21 additions & 0 deletions backend/deploy/backend.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Eksempel for systemd-tjenesten på VM.
# Kopier til /etc/t36-project2/backend.env (aldri commit med passord).
#
# sudo mkdir -p /etc/t36-project2
# sudo cp backend/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
#
# Tjenesten kjører som __DEPLOY_USER__ (ikke root). Med 640 og gruppe =
# deploy-brukeren kan prosessen lese filen; andre brukere på VM kan ikke.

DATABASE_URL=postgresql://t36_project2:PASSORD@localhost:5432/t36_project2

# Krav til kommende GraphQL-server (eget issue): les HOST og PORT, lytt kun på
# 127.0.0.1 — ikke 0.0.0.0. Apache proxyer senere mot http://127.0.0.1:3001.
HOST=127.0.0.1
PORT=3001
NODE_ENV=production

# Valgfritt: offentlig rot for seed-bilder
# PUBLIC_APP_BASE=/project2
33 changes: 33 additions & 0 deletions backend/deploy/t36-project2-backend.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Mal for gruppens Ubuntu-VM. GraphQL-serveren finnes ikke ennå — ikke enable
# tjenesten før src/server.ts (eller tilsvarende) og npm run start er på plass.
#
# Installasjon: se backend/deploy/README.md (erstatt __DEPLOY_USER__, __BACKEND_DIR__,
# __NODE_BIN__).

[Unit]
Description=T36 Project 2 backend (GraphQL, port 3001)
Documentation=file://__BACKEND_DIR__/deploy/README.md
After=network-online.target postgresql.service
Wants=network-online.target
# Prosjekt 2 egen enhet — ikke delt med prosjekt 1

[Service]
Type=simple
User=__DEPLOY_USER__
Group=__DEPLOY_USER__
WorkingDirectory=__BACKEND_DIR__

# Hemmeligheter utenfor git (DATABASE_URL, HOST, PORT, osv.)
EnvironmentFile=/etc/t36-project2/backend.env

# Node 24 (nvm) + tsx fra backend/node_modules etter «npm ci» — ikke global tsx
ExecStart=__NODE_BIN__ __BACKEND_DIR__/node_modules/tsx/dist/cli.mjs __BACKEND_DIR__/src/server.ts

Restart=on-failure
RestartSec=5
TimeoutStopSec=30

NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
Loading