roosterwijs/scripts/deploy.sh
Ramon 500cf6c558
Some checks are pending
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
Herstel installatie-instructies en hard deploy-script (v0.2.03 beta)
De installatiestappen in de README waren niet uitvoerbaar en het
deploy-script kon stilzwijgend werk vernietigen.

README:
- `python manage.py migrate` liep vast op `RuntimeError: DJANGO_SECRET_KEY
  ontbreekt`. DEBUG staat standaard uit en dan is die sleutel verplicht;
  de instructies noemden `DJANGO_DEBUG` nergens. Nu toegevoegd, met uitleg.
- `createsuperuser` stond als "optioneel, voor /admin/". Dat klopt niet: de
  hele API staat op `IsAuthenticated`, dus zonder account kom je de app
  helemaal niet in. Nu gemarkeerd als verplichte stap.
- Stap voor een virtual environment toegevoegd (pip installeerde anders in
  de systeem-Python, wat op recente distributies afketst op PEP 668).
- Node-eis vermeld: Vite 8 vereist 20.19+ of 22.12+.
- Verouderde beschrijvingen bijgewerkt: de tabs van het roosterscherm
  (Week/Genereren/Instellingen in plaats van Weekrooster/Conflicten/
  Schooljaar/Instellingen), Groepsindeling is een eigen scherm en geen tab,
  en er zijn twaalf modules in plaats van "twee voorbeeldmodules".

DEPLOY.md:
- `git clone .../Roostersoftware.git` + `cd Roostersoftware` gebruikte de
  verkeerde repo-naam; dat is `roosterwijs`.
- CSRF-origin en FRONTEND_BASE_URL stonden als http-voorbeeld; achter TLS
  moet dat https zijn.
- Rechtgezet: `DJANGO_CSRF_TRUSTED_ORIGINS` blokkeert het inloggen in de app
  niet (DRF-views zijn `csrf_exempt`), maar wel de Django-admin.
- Vermeld dat er nergens automatisch een account wordt aangemaakt.

scripts/deploy.sh:
- Stopt nu als `.env` ontbreekt; anders start de stack met lege variabelen
  en faalt de backend met een onduidelijke fout.
- Stopt bij lokale wijzigingen in plaats van ze met `git reset --hard`
  weg te gooien; bewust overschrijven kan met `--force`.
- Controleert vooraf of Docker en de compose-plugin er zijn.
- Toont welke commits erbij komen (oud -> nieuw) in plaats van alleen de
  nieuwe HEAD.
- Controleert na afloop of de backend antwoordt en of er een actief account
  bestaat, met het createsuperuser-commando als dat er niet is.

frontend/Dockerfile:
- Bouwt op node:22-alpine in plaats van node:20-alpine, gelijk aan de CI en
  ruim binnen de Node-eis van Vite 8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FAQ4Np13v8fwbTtKHKnwDz
2026-08-19 14:57:49 +02:00

102 lines
3.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# Op de test-server: haal de laatste code op en herbouw de containers.
#
# Gebruik: ./scripts/deploy.sh [--force]
# --force ook doorgaan als er lokale wijzigingen zijn
# (let op: die worden dan overschreven)
set -euo pipefail
cd "$(dirname "$0")/.."
force=0
for arg in "${@:-}"; do
case "$arg" in
"") ;;
--force) force=1 ;;
*) echo "Onbekende optie: $arg" >&2; exit 2 ;;
esac
done
# --- Vooraf controleren ---------------------------------------------------
if ! command -v docker >/dev/null 2>&1; then
echo "FOUT: docker is niet geïnstalleerd op deze server." >&2
exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
echo "FOUT: 'docker compose' werkt niet (compose-plugin ontbreekt)." >&2
exit 1
fi
# Zonder .env start de stack met lege variabelen: compose vult dan overal
# lege strings in, de backend ziet geen POSTGRES_DB (valt terug op SQlite in
# de container) en weigert te starten omdat DJANGO_SECRET_KEY ontbreekt.
if [ ! -f .env ]; then
echo "FOUT: .env ontbreekt in $(pwd)." >&2
echo " Maak hem aan met: cp .env.example .env && nano .env" >&2
exit 1
fi
# 'git reset --hard' hieronder gooit lokale aanpassingen weg — bijvoorbeeld een
# met de hand aangepaste nginx.conf. Daarom eerst waarschuwen.
if [ -n "$(git status --porcelain)" ]; then
echo "LET OP: er staan lokale wijzigingen in deze map:"
git --no-pager status --short | sed 's/^/ /'
if [ "$force" -ne 1 ]; then
echo
echo "Die gaan verloren bij het bijwerken. Zet ze eerst veilig, of draai:" >&2
echo " ./scripts/deploy.sh --force" >&2
exit 1
fi
echo "--force opgegeven: deze wijzigingen worden overschreven."
fi
# --- Code bijwerken -------------------------------------------------------
branch="$(git rev-parse --abbrev-ref HEAD)"
oud="$(git rev-parse --short HEAD)"
echo "Branch: $branch (nu op $oud)"
git fetch origin
git reset --hard "origin/$branch"
nieuw="$(git rev-parse --short HEAD)"
if [ "$oud" = "$nieuw" ]; then
echo "Geen nieuwe commits; containers worden wel opnieuw gebouwd."
else
echo "Bijgewerkt: $oud -> $nieuw"
git --no-pager log --oneline "$oud..$nieuw" | sed 's/^/ /'
fi
# --- Bouwen en starten ----------------------------------------------------
docker compose up -d --build
# --- Controleren ----------------------------------------------------------
echo
echo "Controle: frontend-bundel aanwezig?"
if docker compose exec -T nginx sh -c 'ls /usr/share/nginx/html/assets/*.js >/dev/null 2>&1'; then
echo " frontend OK"
else
echo " GEEN frontend-bundel gevonden"
fi
echo "Controle: reageert de backend?"
docker compose exec -T backend python -c "
import urllib.request, urllib.error
try:
r = urllib.request.urlopen('http://127.0.0.1:8000/api/info/', timeout=5)
print(' backend OK (HTTP', r.status, ')')
except urllib.error.HTTPError as e:
print(' backend OK (HTTP', e.code, '- reageert)')
except Exception as e:
print(' GEEN antwoord van de backend:', e)
" || echo " Kon de backend niet bereiken — zie 'docker compose logs backend'."
echo "Controle: is er een gebruiker om mee in te loggen?"
docker compose exec -T backend python manage.py shell -c "
from django.contrib.auth import get_user_model
n = get_user_model().objects.filter(is_active=True).count()
print(' actieve gebruikers:', n)
if n == 0:
print(' LET OP: geen actief account. Maak er een met:')
print(' docker compose exec backend python manage.py createsuperuser')
" || echo " Kon de gebruikers niet tellen — zie 'docker compose logs backend'."
echo "Klaar."