#!/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 ---------------------------------------------------- # Bij de 'gewone mappen'-opslagkeuze moeten die mappen bestaan; Docker zou ze # anders als root aanmaken. # shellcheck disable=SC1091 set -a; . ./.env; set +a for pad in "${DATA_DB:-}" "${DATA_MEDIA:-}" "${DATA_STATIC:-}"; do case "$pad" in ./*|/*) mkdir -p "$pad" ;; esac done 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."