Server Up beheerde de Docker-daemon als root zonder enige vorm van authenticatie: elke /api/*-route was gelijk aan root-toegang op de host. - Authenticatie toegevoegd (core/auth.py): lokale accounts met scrypt-hash, sessiecookie (HttpOnly, SameSite=Strict) en optionele trusted-proxy-header SSO die alleen vanaf geconfigureerde proxy-IP's wordt vertrouwd. - before_request-guard schermt alle API-routes af; loginscherm en eerste-account-setup in de UI. - CSRF-token verplicht op elke mutatie; GET-varianten van state-wijzigende routes verwijderd (o.a. /api/docker/restart was via <img> te triggeren). - Path traversal in /api/store/install gedicht; gedeelde safe_name()-validatie voor stack-, instantie- en repo-namen. - Git-tokens worden niet meer teruggegeven via /api/repos en /api/settings (has_token-vlag); settings-PUT wist een bestaand token niet meer en kan AUTH niet overschrijven. - Git-URL's beperkt tot http(s)/ssh/scp-syntax; ext::-transport (voert een shell-commando uit) en file:// worden geweigerd. - Boilerplate-templates renderen in een SandboxedEnvironment (SSTI). - Automatisch syncen van repo's bij boot standaard uit (AUTO_SYNC_ON_BOOT), optionele commit-pinning per repo. - Waitress in plaats van de Flask-ontwikkelserver, MAX_CONTENT_LENGTH, ProxyFix, en CSP/X-Frame-Options/nosniff/Referrer-Policy headers. - Front-end libraries (Tailwind, Alpine, htmx) lokaal meegeleverd i.p.v. CDN; Google Fonts verwijderd. Werkt nu ook offline. - SSH host-key-verificatie aan (accept-new + /data/known_hosts). - Lichte /healthz voor de healthcheck i.p.v. `docker info`. - config.json en secret.key met 0600-rechten. - Poort standaard op 127.0.0.1 gebonden. - Audit-log gebruikt één gedeelde SQLite-verbinding (fd-lek per job verholpen); joblogs afgekapt op 2000 regels. - VERSION-bestand is de enige bron voor het versienummer. - pytest-suite toegevoegd (74 tests) en als stap in beide deploy-workflows. - fix-config.sh verwijderd (hardgecodeerd intern IP, overschreef config). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
42 lines
1.6 KiB
YAML
42 lines
1.6 KiB
YAML
services:
|
|
server-up:
|
|
build:
|
|
context: .
|
|
args:
|
|
# Bakt de versie in het image. De deploy-workflow zet SU_VERSION
|
|
# (git-tag of main-<sha>); zonder waarde valt het terug op 'dev'.
|
|
SU_VERSION: ${SU_VERSION:-dev}
|
|
image: server-up:latest
|
|
container_name: server-up
|
|
hostname: server-up
|
|
user: "0:0"
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
- su-data:/data
|
|
# Same-path mount: pad binnen container = pad op host
|
|
# Wijzig BASE_DIR in .env om alle paden te verplaatsen
|
|
- ${BASE_DIR:-/opt/serverup}:${BASE_DIR:-/opt/serverup}
|
|
ports:
|
|
# Standaard alleen bereikbaar vanaf de host zelf. Server Up beheert de
|
|
# Docker-daemon, dus zet dit pas open als er een reverse proxy met TLS
|
|
# voor staat: BIND=0.0.0.0 in .env (en stel in de UI de trusted proxy in).
|
|
- "${BIND:-127.0.0.1}:${PORT:-5000}:5000"
|
|
environment:
|
|
- PORT=5000
|
|
- HOME=/root
|
|
- SU_CONFIG=/data/config.json
|
|
- SU_AUDIT=/data/audit.db
|
|
- SU_GIT_CACHE=/data/git
|
|
- SU_CONTAINER=server-up
|
|
# Versie die de UI toont (overschrijft de ingebakken default).
|
|
- SU_VERSION=${SU_VERSION:-dev}
|
|
# Voeg eigen app-repos toe zonder wizard. Eenmalig opgeslagen in config.json.
|
|
# Format: JSON-array van repo-objecten. Velden: id, url, branch, subdir, name, token (optioneel).
|
|
# Voorbeeld:
|
|
# - SU_BOOT_REPOS=[{"id":"mijn-apps","name":"Mijn Apps","url":"https://github.com/gebruiker/mijn-apps.git","branch":"main","subdir":"apps"}]
|
|
# Debug-endpoints inschakelen (api/debug/*):
|
|
# - SU_DEBUG=1
|
|
restart: unless-stopped
|
|
|
|
volumes:
|
|
su-data:
|