logo-upload: media-rechten zelfherstellend via gosu-entrypoint + module hernoemd naar 'Logo'
This commit is contained in:
parent
7a5d3b75eb
commit
d8c4523dc0
5 changed files with 27 additions and 15 deletions
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -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 "$@"
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
),
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ const PAGES = {
|
|||
"/vak-wizard": VakWizardPage,
|
||||
"/personen-wizard": PersonenWizardPage,
|
||||
"/auto-rooster": AutoRoosterPage,
|
||||
"/huisstijl": HuisstijlPage,
|
||||
"/logo": HuisstijlPage,
|
||||
};
|
||||
|
||||
const RESET_PARAMS = (() => {
|
||||
|
|
|
|||
|
|
@ -2830,7 +2830,7 @@ export function RoosterScherm({ mode }) {
|
|||
<div className="inst-body"><p className="muted small">Vrije locatie-aanduidingen (bv. gymzaal, zwembad).</p><LocatiesPage /></div>
|
||||
</details>
|
||||
<details className="inst-sectie">
|
||||
<summary><span className="ico">🖼️</span> Huisstijl / logo</summary>
|
||||
<summary><span className="ico">🖼️</span> Logo</summary>
|
||||
<div className="inst-body"><HuisstijlPage /></div>
|
||||
</details>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in a new issue