Funn fra sikkerhetsgjennomgang: - HØY: post_id ble ikke validert, så en gjest kunne nå andres innlegg via gjest/../../posts/<slug> (lese utkast, laste opp/slette bilder, publisere eierens utkast). Slug og gjestenavn valideres nå mot samme alfabet de lages med, og stien sjekkes etter oppslag. - Bilder: pikselantall sjekkes før dekoding (maks 40 MP), og DecompressionBombError håndteres. - Innlogging: CSRF-token kreves også på login (login-CSRF), og innloggingsbrems etter 5 feil per brukernavn. - Passordbytte ugyldiggjør alle andre sesjoner (stempel i cookien). - Content-Security-Policy og X-Frame-Options på alle sider; admin har ingen inline script lenger (admin.js). - Gjestenavn og eier-slugs kan ikke lenger kollidere på /navn/. - Healthcheck respekterer SOAPBOX_BASE_PATH; login-redirect beholder base path; run.sh dropper capabilities og setter minnegrense; uv pinnet til 0.11. Rettet også en reell feil: existing_slugs() listet feil katalog (Path / er identitet), så slug-unikhet virket ikke. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
37 lines
1.4 KiB
Docker
37 lines
1.4 KiB
Docker
# Soapbox – lettest mulig image: python:alpine + git + appen.
|
||
# Bygg (fra repo-rot):
|
||
# BUILDAH_FORMAT=docker podman build \
|
||
# --build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||
# --build-arg GIT_REVISION="$(git describe --always --dirty)" \
|
||
# -t soapbox .
|
||
FROM python:3.13-alpine AS build
|
||
COPY --from=ghcr.io/astral-sh/uv:0.11 /uv /bin/uv
|
||
WORKDIR /app
|
||
ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never
|
||
COPY pyproject.toml uv.lock README.md ./
|
||
RUN uv sync --frozen --no-dev --no-install-project
|
||
COPY soapbox ./soapbox
|
||
RUN uv sync --frozen --no-dev
|
||
|
||
FROM python:3.13-alpine
|
||
ARG BUILD_DATE
|
||
ARG GIT_REVISION
|
||
LABEL org.opencontainers.image.title="soapbox" \
|
||
org.opencontainers.image.created="${BUILD_DATE}" \
|
||
org.opencontainers.image.revision="${GIT_REVISION}"
|
||
RUN apk add --no-cache git curl \
|
||
&& printf 'build_date=%s\ngit_revision=%s\n' "${BUILD_DATE}" "${GIT_REVISION}" > /etc/build-info \
|
||
&& adduser -D -u 1000 soapbox \
|
||
&& mkdir -p /data && chown soapbox:soapbox /data
|
||
WORKDIR /app
|
||
COPY --from=build --chown=soapbox:soapbox /app /app
|
||
USER soapbox
|
||
ENV PATH="/app/.venv/bin:$PATH" \
|
||
SOAPBOX_DATA_DIR=/data \
|
||
PYTHONUNBUFFERED=1
|
||
VOLUME /data
|
||
EXPOSE 8080
|
||
# waitress avslutter rent på SIGINT; SIGTERM ignoreres når den kjører som PID 1.
|
||
STOPSIGNAL SIGINT
|
||
HEALTHCHECK --interval=30s --timeout=3s CMD curl -fsS "http://localhost:8080${SOAPBOX_BASE_PATH}/" >/dev/null || exit 1
|
||
CMD ["soapbox", "serve"]
|