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
112 lines
3.8 KiB
Bash
Executable file
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."
|