From 89d0a59390f746149a735a0ff3e63e306736a40d Mon Sep 17 00:00:00 2001 From: Sebastian Ingebrigtsen Date: Tue, 20 Oct 2026 11:33:35 +0200 Subject: [PATCH] docs(deploy): server frontenden fra /var/www/project2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apache ga 403 Forbidden fordi www-data ikke fikk gå gjennom hjemmemappen som Alias pekte på. Bygget kopieres nå til /var/www/project2, og dokumentasjonen beskriver hvordan frontenden oppdateres. Co-Authored-By: Claude Opus 5.5 --- deploy/apache/README.md | 95 +++++++++++++++++++-------------- deploy/apache/t36-project2.conf | 9 ++-- docs/vm-backend.md | 24 ++++----- 3 files changed, 69 insertions(+), 59 deletions(-) diff --git a/deploy/apache/README.md b/deploy/apache/README.md index 1951a68..a55a8c4 100644 --- a/deploy/apache/README.md +++ b/deploy/apache/README.md @@ -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 @@ -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: @@ -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//T36-Project-2` | -| `__DIST_DIR__` | `/home//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 @@ -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="" -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. @@ -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 }"}' ``` @@ -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` | diff --git a/deploy/apache/t36-project2.conf b/deploy/apache/t36-project2.conf index e5153bd..9693155 100644 --- a/deploy/apache/t36-project2.conf +++ b/deploy/apache/t36-project2.conf @@ -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//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. - Alias /project2 __DIST_DIR__ + Alias /project2 /var/www/project2 - + Require all granted Options -Indexes +FollowSymLinks AllowOverride None diff --git a/docs/vm-backend.md b/docs/vm-backend.md index 059c859..505378f 100644 --- a/docs/vm-backend.md +++ b/docs/vm-backend.md @@ -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). @@ -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. @@ -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.