roosterwijs/scripts/deploy.sh
Ramon f795e85333
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
Installatiescript met opslagkeuze, standaard /srv/server-up (v0.2.04 beta)
Nieuw: scripts/install.sh — installeert de stack in zeven zichtbare stappen
met drie vragen, standaard in /srv/server-up (aan te passen met
ROOSTERWIJS_DIR). Het script:
- controleert git, docker, de compose-plugin en of de daemon bereikbaar is;
- maakt de doelmap aan, of legt uit welk commando daarvoor nodig is als de
  rechten ontbreken (roept zelf geen sudo aan);
- kloont of werkt de checkout bij;
- laat kiezen waar de gegevens komen (zie hieronder);
- genereert .env met een willekeurige DJANGO_SECRET_KEY en een sterk
  databasewachtwoord, en zet hostnaam, CSRF-origin en DJANGO_SECURE op basis
  van twee vragen; een bestaande .env wordt nooit zomaar overschreven;
- bouwt en start de containers;
- meldt of er een account is en biedt aan er een aan te maken.

Opslagkeuze bij de installatie:
- docker-compose.yml gebruikt nu ${DATA_DB}, ${DATA_MEDIA} en ${DATA_STATIC}.
  Een naam = Docker-volume, een pad = gewone map naast de code.
- De standaardwaarden zijn de bestaande named volumes, dus installaties die
  al draaien veranderen niet en er gaan geen gegevens verloren.
- Kies je voor mappen, dan komt alles onder /srv/server-up/data/.

Verder:
- .gitignore: /data/ uitgesloten. Zonder dat zou de gegevensmap als lokale
  wijziging gelden en zou deploy.sh weigeren te draaien.
- deploy.sh maakt de gegevensmappen aan als de opslagkeuze paden gebruikt,
  zodat Docker ze niet als root aanmaakt.
- DEPLOY.md en README: installatie via het script, de opslagkeuze in een
  tabel, en de dump/restore-stappen die nodig zijn bij het omzetten van
  volumes naar mappen.

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

112 lines
3.8 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 ----------------------------------------------------
# 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."