roosterwijs/docker-compose.yml
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

78 lines
2.6 KiB
YAML

# Stack voor de test-server (en later productie).
#
# Waar de gegevens staan, bepaal je in .env (scripts/install.sh vraagt ernaar):
# DATA_DB / DATA_MEDIA / DATA_STATIC
# - een naam (bv. pgdata) -> Docker beheert het volume
# - een pad (bv. ./data/postgres) -> gewone map, direct benaderbaar
# Laat je ze leeg, dan gelden de named volumes hieronder — precies zoals
# bestaande installaties nu al draaien.
#
# db - PostgreSQL
# backend - Django via gunicorn
# nginx - serveert de frontend en proxyt /api + /admin naar de backend
#
# Instellingen komen uit het .env-bestand (zie .env.example).
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ${DATA_DB:-pgdata}:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
backend:
build: ./backend
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
DJANGO_DEBUG: ${DJANGO_DEBUG:-0}
DJANGO_SECURE: ${DJANGO_SECURE:-0}
DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS}
DJANGO_CSRF_TRUSTED_ORIGINS: ${DJANGO_CSRF_TRUSTED_ORIGINS}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_HOST: db
POSTGRES_PORT: 5432
DJANGO_EMAIL_BACKEND: ${DJANGO_EMAIL_BACKEND:-django.core.mail.backends.console.EmailBackend}
EMAIL_HOST: ${EMAIL_HOST:-}
EMAIL_PORT: ${EMAIL_PORT:-587}
EMAIL_HOST_USER: ${EMAIL_HOST_USER:-}
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-}
EMAIL_USE_TLS: ${EMAIL_USE_TLS:-1}
DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL:-Roosterwijs <noreply@roosterwijs.local>}
FRONTEND_BASE_URL: ${FRONTEND_BASE_URL:-}
volumes:
# Verzamelde statics delen met nginx.
- ${DATA_STATIC:-static_volume}:/app/staticfiles
# Geüploade media (pictogrammen, logo) delen met nginx.
- ${DATA_MEDIA:-media_volume}:/app/media
nginx:
build: ./frontend
restart: unless-stopped
depends_on:
- backend
ports:
# Linkerkant is de poort op de server; pas aan indien bezet.
- "8080:80"
volumes:
# Lees de door Django verzamelde statics (alleen-lezen).
- ${DATA_STATIC:-static_volume}:/static:ro
- ${DATA_MEDIA:-media_volume}:/media:ro
volumes:
pgdata:
static_volume:
media_volume: