Skip to content
Open
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
95 changes: 54 additions & 41 deletions deploy/apache/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Apache: frontend `/project2/` og API-proxy

Mal for å serve prosjekt 2 på gruppens VM **uten** å endre prosjekt 1s
Apache-oppsett. **Ikke aktiver på VM ennå** — krever bygget frontend med riktig
`base`, og GraphQL på port 3001.
Apache-oppsett. Siten er aktivert på VM-en. Frontenden serveres fra
`/var/www/project2`, og `/project2/api/` går til GraphQL på port 3001.

## Vite: base path og statiske filer

Expand All @@ -13,15 +13,7 @@ Apache-oppsett. **Ikke aktiver på VM ennå** — krever bygget frontend med rik
| JS/CSS fra build | Hashede filer under `dist/assets/` | URL-er blir `/project2/assets/…` når `base` er satt |
| Annonsebilder | `public/assets/listings/*.svg` | Blir med i bygget under `/project2/assets/listings/`, samme sti som `image_url` i databasen |

Bygg (etter `base` er satt):

```bash
cd __REPO_ROOT__
nvm use 24
npm ci
npm run build
# deploy __DIST_DIR__ (typisk __REPO_ROOT__/dist)
```
Bygg og publiser, se [Oppdatere frontenden](#oppdatere-frontenden).

Test lokalt med base uten Apache:

Expand Down Expand Up @@ -51,12 +43,14 @@ Valgfritt senere: `headers` for cache på statiske filer.
| ------------------- | --------------------------------------- |
| `t36-project2.conf` | Egen site: statisk SPA og reverse proxy |

Plassholdere:
## Hvorfor `/var/www/project2`

| Plassholder | Eksempel |
| --------------- | -------------------------------------------- |
| `__REPO_ROOT__` | `/home/<NTNU_BRUKERNAVN>/T36-Project-2` |
| `__DIST_DIR__` | `/home/<NTNU_BRUKERNAVN>/T36-Project-2/dist` |
Apache kjører som `www-data` og må kunne gå gjennom hver mappe i stien til
filene. Pekte `Alias` rett på `dist/` i en hjemmemappe, ga Apache 403 Forbidden
(`AH00035: search permissions are missing`) så snart noen strammet inn
rettighetene på hjemmemappen. Bygget kopieres derfor til `/var/www/project2`,
som ikke avhenger av noen enkeltpersons hjemmemappe. Dit kopieres bare de
ferdigbygde, offentlige filene, ikke kildekode eller `.env`.

## Reverse proxy og GraphQL

Expand Down Expand Up @@ -85,32 +79,50 @@ gi 404 fra Apache. `RewriteRule` i `t36-project2.conf` sender ukjente stier til

Seed lagrer `image_url` som `/project2/assets/listings/drill.svg` osv. Filene
ligger i `public/assets/listings/`, så Vite kopierer dem til
`dist/assets/listings/`, og de serveres av samme `Alias /project2` som resten
av appen. Det trengs ingen egen `Alias` for bildene.
`dist/assets/listings/`. Derfra blir de med til `/var/www/project2/assets/listings/`
og serveres av samme `Alias /project2` som resten av appen. Det trengs ingen
egen `Alias` for bildene.

## Oppdatere frontenden

Kjøres på VM-en hver gang frontenden skal oppdateres. `REPO_ROOT` er repoet til
den som deployer.

```bash
export REPO_ROOT="$HOME/T36-Project-2"

cd "$REPO_ROOT"
git pull
source ~/.nvm/nvm.sh && nvm use 24
npm ci
npm run build

sudo rsync -a --delete "$REPO_ROOT/dist/" /var/www/project2/
sudo chown -R root:root /var/www/project2
```

Apache trenger ikke restart, siden filene leses ved hver forespørsel.
`--delete` fjerner gamle hashede filer fra forrige bygg.

## Installasjon på VM (når klart — ikke kjør enable før dere er klare)
## Installasjon på VM

Forutsetter: prosjekt 1 fungerer; dere har testet `npm run build` med
`base: '/project2/'`; GraphQL kjører på 3001 (senere).
Forutsetter: prosjekt 1 fungerer, og GraphQL kjører på 3001.

```bash
export DEPLOY_USER="<NTNU_BRUKERNAVN>"
export REPO_ROOT="/home/${DEPLOY_USER}/T36-Project-2"
export DIST_DIR="${REPO_ROOT}/dist"
export REPO_ROOT="$HOME/T36-Project-2"

sudo a2enmod alias rewrite proxy proxy_http
sudo mkdir -p /var/www/project2
# Bygg og kopier til /var/www/project2, se «Oppdatere frontenden»

sed -e "s|__REPO_ROOT__|${REPO_ROOT}|g" \
-e "s|__DIST_DIR__|${DIST_DIR}|g" \
"${REPO_ROOT}/deploy/apache/t36-project2.conf" \
| sudo tee /etc/apache2/sites-available/t36-project2.conf > /dev/null
sudo cp "${REPO_ROOT}/deploy/apache/t36-project2.conf" \
/etc/apache2/sites-available/t36-project2.conf

# Valider FØR reload — skal vise «Syntax OK»
sudo apache2ctl configtest

# Først når configtest er OK og dere har avtalt med gruppen:
# sudo a2ensite t36-project2.conf
# sudo systemctl reload apache2
sudo a2ensite t36-project2.conf
sudo systemctl reload apache2
```

**Ikke** `a2dissite` på prosjekt 1 eller rediger deres vhost-filer.
Expand All @@ -119,10 +131,10 @@ sudo apache2ctl configtest

```bash
sudo apache2ctl -S
curl -I "https://it2810-36.idi.ntnu.no/project2/"
curl -I "https://it2810-36.idi.ntnu.no/project2/assets/listings/drill.svg"
curl -I "http://it2810-36.idi.ntnu.no/project2/"
curl -I "http://it2810-36.idi.ntnu.no/project2/assets/listings/drill.svg"
curl -sS -o /dev/null -w "%{http_code}\n" -X POST \
"https://it2810-36.idi.ntnu.no/project2/api/graphql" \
"http://it2810-36.idi.ntnu.no/project2/api/graphql" \
-H "Content-Type: application/json" -d '{"query":"{ __typename }"}'
```

Expand All @@ -137,10 +149,11 @@ ikke gi Apache 404.

## Feilsøking

| Symptom | Mulig årsak |
| ---------------------------------- | ------------------------------------------------- |
| `configtest` feiler på `ProxyPass` | `proxy` / `proxy_http` ikke enabled |
| SPA 404 ved refresh | `rewrite` ikke enabled, eller feil `RewriteBase` |
| SVG 404 | Frontend er bygget uten `public/assets/listings` |
| API 502/503 | Backend ikke startet på 3001 |
| `/project2` ødelegger P1 | Feil site aktivert — bruk kun `t36-project2.conf` |
| Symptom | Mulig årsak |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| 403 Forbidden på `/project2/` | `www-data` får ikke lese mappen `Alias` peker på. Sjekk `sudo tail /var/log/apache2/error.log` og `namei -l /var/www/project2/index.html` |
| `configtest` feiler på `ProxyPass` | `proxy` / `proxy_http` ikke enabled |
| SPA 404 ved refresh | `rewrite` ikke enabled, eller feil `RewriteBase` |
| SVG 404 | Frontend er bygget uten `public/assets/listings` |
| API 502/503 | Backend ikke startet på 3001 |
| `/project2` ødelegger P1 | Feil site aktivert — bruk kun `t36-project2.conf` |
9 changes: 4 additions & 5 deletions deploy/apache/t36-project2.conf
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
# Prosjekt 2 (T36) — egen Apache-site. Publiseres som
# /etc/apache2/sites-available/t36-project2.conf
#
# Erstatt plassholdere ved installasjon (se deploy/apache/README.md):
# __REPO_ROOT__ — f.eks. /home/<NTNU_BRUKERNAVN>/T36-Project-2
# __DIST_DIR__ — f.eks. __REPO_ROOT__/dist (etter npm run build med base /project2/)
# Frontenden serveres fra /var/www/project2, ikke fra dist/ i noens
# hjemmemappe. Kopier bygget dit etter npm run build (se deploy/apache/README.md).
#
# Ikke rediger prosjekt 1s vhost. Aktiver med a2ensite t36-project2.conf.

# Frontend (Vite build med base: '/project2/'). Annonsebildene ligger i
# public/assets/listings og blir med i bygget under /project2/assets/listings.
<IfModule mod_alias.c>
Alias /project2 __DIST_DIR__
Alias /project2 /var/www/project2
</IfModule>

<Directory "__DIST_DIR__">
<Directory "/var/www/project2">
Require all granted
Options -Indexes +FollowSymLinks
AllowOverride None
Expand Down
24 changes: 11 additions & 13 deletions docs/vm-backend.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# VM: PostgreSQL og backend (prosjekt 2)

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).
GraphQL kjører på **`127.0.0.1:3001`** inne på VM-en (systemd). Apache serverer
frontenden på `/project2/` og sender `/project2/api/` videre til backenden, se
[deploy/apache/README.md](../deploy/apache/README.md).

**Lokal utvikling på egen maskin** (egen PostgreSQL, egen `.env`) står i
README under [Lokal backend-utvikling](../README.md#lokal-backend-utvikling).
Expand Down Expand Up @@ -249,9 +250,9 @@ 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 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.
- Apache-siten `t36-project2.conf` gjelder bare `/project2/` og
`/project2/api/`. Backenden lytter fortsatt bare på `127.0.0.1:3001` og nås
utenfra kun gjennom Apache-proxyen.

Etter endringer: verifiser at prosjekt 1 fortsatt fungerer.

Expand Down Expand Up @@ -485,22 +486,19 @@ sudo systemctl restart t36-project2-backend
fra systemd (`EnvironmentFile`) overskrives ikke. Migrate/seed bruker fortsatt
`backend/.env` som før.

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

Egen site-mal (prosjekt 2 only) ligger i
Egen site (bare prosjekt 2) er aktivert. Malen og fremgangsmåten ligger i
[deploy/apache/README.md](../deploy/apache/README.md):

- Statisk frontend fra `dist/` med SPA-fallback
- Statisk frontend fra `/var/www/project2` med SPA-fallback. Bygget kopieres dit
fra `dist/`, se «Oppdatere frontenden» i README-en.
- Reverse proxy `/project2/api/` → `http://127.0.0.1:3001/`

Krever `a2enmod alias rewrite proxy proxy_http` og **`apache2ctl configtest`**
før `reload`. **Ikke `a2ensite` på VM ennå** — krever Vite `base: '/project2/'`
og GraphQL.
Kjør alltid **`apache2ctl configtest`** før `reload`.

## Gjenstår (ikke implementert)

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