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
9 changes: 7 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
# Add required local environment variable names here as the backend is implemented.
# Never put real passwords or secrets in this file.
# VM defaults: copy to server/.env on the VM and replace the password placeholder.
# For a backend running locally through SSH tunnel, use 127.0.0.1:5433 instead.
# Never put real passwords or secrets in this file or commit server/.env.
DATABASE_URL=postgresql://tapfinder_app:REPLACE_WITH_PASSWORD@localhost:5432/tapfinder
PORT=4000
# Keep the API local until a reverse proxy (for example, Nginx) is configured.
HOST=127.0.0.1
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ Dette er gruppe T07 sitt repository for Prosjekt 2 i IT2810.
## Første underveisinnlevering

Den første underveisinnleveringen beskriver konseptet for Tapfinder 2.0,
planlagt brukerflyt og foreløpig teknisk retning. Det er ikke implementert
React-applikasjon, backend eller database i denne fasen.
planlagt brukerflyt og foreløpig teknisk retning. Frontend, backend og
databaseskjema er under utvikling.

[Les prosjektbeskrivelsen for Tapfinder 2.0 (PDF)](docs/Tapfinder%202.0.pdf)

Expand All @@ -15,3 +15,10 @@ React-applikasjon, backend eller database i denne fasen.
`main` er beskyttet. Endringer skal gjøres på en branch og sendes inn som en
pull request. En annen deltaker i T07 må godkjenne endringen, og alle
reviewkommentarer må være løst før merge.

## Backend og database

Backend ligger i `server/` og bruker Node.js, TypeScript, GraphQL og PostgreSQL.
Se [server/README.md](server/README.md) for npm-oppsett, VM-konfigurasjon,
lokal testing, databasebruker og migrasjoner. PostgreSQL og den planlagte
backendtjenesten kjører direkte på VM-en; Docker brukes ikke.
139 changes: 139 additions & 0 deletions server/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# Backend og database

Backenden er et TypeScript-prosjekt med Apollo Server (GraphQL) og PostgreSQL.
Målet er at både backend og PostgreSQL kjører direkte på prosjektets VM, uten
Docker. Backendoppsettet er foreløpig et skjelett med helsesjekker; Tapfinders
domene-API og tabeller kommer når gruppa har bestemt datamodellen.

## Krav og npm-oppsett

- Node.js og npm installert på utviklermaskinen og VM-en.
- PostgreSQL installert som vanlig tjeneste på VM-en.
- `server/package.json` og `server/package-lock.json` versjonskontrollert.

Etter at backendendringene med lockfila er merget, kjører hvert gruppemedlem én
gang fra repoets rot:

```powershell
npm --prefix server ci
```

Dette installerer backendpakkene lokalt fra den versjonslåste `package-lock.json`.
`node_modules/` skal ikke pushes. Når backendens avhengigheter endres, oppdateres
lockfila med `npm --prefix server install`, og `package.json` og
`package-lock.json` committes sammen. På VM-en kjøres `npm --prefix server ci`
etter at ny kode er hentet inn. Dette skjer ikke automatisk ved Git-push før
automatisk utrulling er satt opp.

## Database på VM-en

Kjør dette på VM-en der PostgreSQL er installert. Opprett applikasjonsrollen
uten å skrive passordet inn i SQL-kommandoen:

```bash
sudo -u postgres psql
```

I `psql`:

```sql
CREATE ROLE tapfinder_app LOGIN;
\password tapfinder_app
CREATE DATABASE tapfinder OWNER tapfinder_app;
\q
```

`\password` ber om passordet interaktivt. PostgreSQL bør bare lytte på
localhost på VM-en. Ikke åpne port 5432 mot internett.

## Miljøvariabler

Backend leser tilkoblingen fra `DATABASE_URL`. `.env.example` i repo-roten er en
mal uten hemmeligheter. På VM-en kopierer du den til `server/.env` og legger inn
det faktiske databasepassordet der. `server/.env` er ignorert av Git og må ikke
committes eller deles.

På VM-en, der backend og PostgreSQL kjører på samme maskin, skal adressen bruke
`localhost` og port `5432`:

```env
DATABASE_URL=postgresql://tapfinder_app:PASSORD@127.0.0.1:5432/tapfinder
PORT=4000
HOST=127.0.0.1
```

URL-kod spesialtegn i passordet; for eksempel skal `#` skrives som `%23` i
tilkoblingsadressen. Selve PostgreSQL-passordet endres ikke.

Hver utvikler har sin egen `server/.env`. Hvis du kjører backend på PC-en, peker
`localhost` på PC-en. For å teste lokalt mot VM-databasen uten å åpne port 5432,
start en SSH-tunnel fra et lokalt PowerShell-vindu:

```powershell
ssh -N -L 5433:127.0.0.1:5432 DIN_BRUKER@it2810-07.idi.ntnu.no
```

Da bruker PC-ens lokale backend port `5433` i sin `DATABASE_URL`. Dette er bare
for lokal testing. Når backend kjører på VM-en, skal den bruke port `5432`
direkte, og denne databasetunnelen trengs ikke.

## Hente og starte backend på VM-en manuelt

Inntil automatisk utrulling er konfigurert, må godkjent og merget backendkode
hentes inn på VM-en manuelt. Etter SSH-innlogging går du til repoets klonede mappe
på VM-en og kjører:

```bash
npm --prefix server ci
npm --prefix server run build
npm --prefix server run dev
```

Den siste kommandoen starter utviklingsserveren. SSH-terminalen må stå åpen mens
den kjører; avslut med `Ctrl+C`. En varig tjeneste som starter automatisk etter
omstart av VM-en, og automatisk utrulling etter merge, er ikke konfigurert ennå.

Serveren lytter som standard bare på `127.0.0.1:4000`. For å åpne GraphQL
Sandbox fra PC-en mens serveren kjører på VM-en, bruk en egen lokal tunnel i
PowerShell:

```powershell
ssh -N -L 4000:127.0.0.1:4000 DIN_BRUKER@it2810-07.idi.ntnu.no
```

La tunnelen stå åpen og åpne `http://127.0.0.1:4000/` i nettleseren. Dette er en
API-tunnel; den videresender ikke PostgreSQL-porten.

## GraphQL-kontroll

I Sandbox kan du kjøre:

```graphql
query {
health
databaseStatus
}
```

`health` svarer `ok` når API-et kjører. `databaseStatus` svarer `connected` når
backenden når PostgreSQL.

## Databaseendringer (migrasjoner)

Alle skjemaendringer skal være migrasjoner i `server/migrations/`, slik at
utviklere og VM-en får de samme endringene i samme rekkefølge. Lag en migrasjon
fra repoets rot:

```powershell
npm --prefix server run migrate:create -- add-your-change-name
```

Review migrasjonen sammen med backendendringen i pull request. Før migrasjoner
kjøres mot VM-databasen, ta backup og sørg for at riktig `DATABASE_URL` er satt
i VM-ens `server/.env`. Kjør deretter:

```bash
npm --prefix server run migrate:up
```

Ikke kjør migrasjoner mot VM-databasen før endringen er godkjent.
Loading