diff --git a/backend/Dockerfile b/backend/Dockerfile index 1d67c46..75da0b7 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -8,8 +8,9 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ WORKDIR /app # Systeempakketten die psycopg/gunicorn soms nodig hebben. +# gosu = privileges veilig droppen in de entrypoint (zie entrypoint.sh). RUN apt-get update \ - && apt-get install -y --no-install-recommends libpq5 \ + && apt-get install -y --no-install-recommends libpq5 gosu \ && rm -rf /var/lib/apt/lists/* # Eerst requirements (betere build-cache), dan de rest. @@ -21,12 +22,12 @@ COPY . . # entrypoint wacht op de database, migreert en verzamelt statics. RUN chmod +x /app/entrypoint.sh -# Draai niet als root: een eventueel lek in de app geeft dan geen -# root-rechten in de container. +# Maak een niet-root gebruiker aan. De entrypoint start als root (om de +# rechten op de gedeelde volumes te kunnen zetten) en zakt daarna met gosu +# terug naar appuser, zodat gunicorn zelf NIET als root draait. RUN useradd --create-home --shell /usr/sbin/nologin appuser \ - && mkdir -p /app/staticfiles /app/media \ + && mkdir -p /app/staticfiles /app/media/pictogrammen /app/media/huisstijl \ && chown -R appuser:appuser /app -USER appuser EXPOSE 8000 ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index a5d474e..f3b65ff 100644 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -2,6 +2,17 @@ # Wordt bij elke containerstart uitgevoerd, vóór gunicorn. set -e +# De container start als root, zodat we de rechten op de gedeelde volumes +# (static + media) goed kunnen zetten — ook als die ooit als root zijn +# aangemaakt (anders: 'Permission denied' bij het uploaden van bv. een logo). +# Daarna draaien migraties, collectstatic én gunicorn als 'appuser'. +RUN_AS="" +if [ "$(id -u)" = "0" ]; then + mkdir -p /app/media/pictogrammen /app/media/huisstijl /app/staticfiles + chown -R appuser:appuser /app/media /app/staticfiles || true + RUN_AS="gosu appuser" +fi + # Wacht tot PostgreSQL bereikbaar is (alleen als we Postgres gebruiken). if [ -n "$POSTGRES_DB" ]; then echo "Wachten op PostgreSQL op ${POSTGRES_HOST:-db}:${POSTGRES_PORT:-5432}..." @@ -21,12 +32,12 @@ else: PY fi -# Migraties uitvoeren en statische bestanden verzamelen. +# Migraties uitvoeren en statische bestanden verzamelen (als appuser). echo "Migraties uitvoeren..." -python manage.py migrate --noinput +$RUN_AS python manage.py migrate --noinput echo "Statische bestanden verzamelen..." -python manage.py collectstatic --noinput +$RUN_AS python manage.py collectstatic --noinput -# Geef door aan het CMD (gunicorn). -exec "$@" +# Geef door aan het CMD (gunicorn), als appuser. +exec $RUN_AS "$@" diff --git a/backend/modules/huisstijl/apps.py b/backend/modules/huisstijl/apps.py index 1b11941..7336134 100644 --- a/backend/modules/huisstijl/apps.py +++ b/backend/modules/huisstijl/apps.py @@ -5,7 +5,7 @@ class HuisstijlConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "modules.huisstijl" label = "module_huisstijl" - verbose_name = "Module: Huisstijl (logo)" + verbose_name = "Module: Logo" def ready(self): from plugins.registry import MenuItem, ModuleSpec, registry @@ -13,7 +13,7 @@ class HuisstijlConfig(AppConfig): registry.register( ModuleSpec( key="huisstijl", - name="Huisstijl", + name="Logo", description=( "Toont het schoollogo in elke roosterweergave en op afdrukken. " "Logo te uploaden via Instellingen, met een kwaliteitscheck " @@ -24,7 +24,7 @@ class HuisstijlConfig(AppConfig): core=False, default_enabled=True, menu_items=( - MenuItem("Huisstijl", "/huisstijl", icon="badge", order=74, group="Instellingen"), + MenuItem("Logo", "/logo", icon="badge", order=74, group="Instellingen"), ), ) ) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 0f1e3b6..f750a24 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -47,7 +47,7 @@ const PAGES = { "/vak-wizard": VakWizardPage, "/personen-wizard": PersonenWizardPage, "/auto-rooster": AutoRoosterPage, - "/huisstijl": HuisstijlPage, + "/logo": HuisstijlPage, }; const RESET_PARAMS = (() => { diff --git a/frontend/src/pages.jsx b/frontend/src/pages.jsx index 391c70d..4a0e309 100644 --- a/frontend/src/pages.jsx +++ b/frontend/src/pages.jsx @@ -2830,7 +2830,7 @@ export function RoosterScherm({ mode }) {

Vrije locatie-aanduidingen (bv. gymzaal, zwembad).

- 🖼️ Huisstijl / logo + 🖼️ Logo