services: app: build: . container_name: simple-file-upload restart: unless-stopped # No `user:` here — entrypoint.sh starts as root, chowns the bind mounts # to UID 1000, then drops privileges via gosu before running node. ports: - "${APP_PORT:-3500}:3000" # Web (Upload + Admin) environment: DB_PATH: /data/db/app.db UPLOAD_ROOT: /data/uploads WEBDAV_CONFIG_DIR: /webdav-config # PUBLIC_BASE_URL can be set via the admin Einstellungen tab instead. volumes: - ./data/db:/data/db # SQLite DB liegt hier neben docker-compose.yml - ./data/uploads:/data/uploads # Kunden-Uploads - ./data/logo:/data/logo # Admin-Logo - webdav-config:/webdav-config # dynamisch generierte htpasswd + access.conf webdav: build: ./webdav container_name: simple-file-upload-webdav restart: unless-stopped ports: - "${WEBDAV_PORT:-1900}:80" # WebDAV — Login via DB-Benutzer environment: WEBDAV_CONFIG_DIR: /webdav-config volumes: - ./data/uploads:/data/uploads - webdav-config:/webdav-config volumes: webdav-config: