Feature: Docker deployment RenewCMS can run in a container built from the repository. The container reuses the existing configuration contract in cmd/server/main.go (requiredEnvVars, envDefaults); no new variables are introduced. Background: Given the image is built with the default build, without the nofrontend tag And the container runs the binary directly as PID 1 under a non-root user And the environment sets DB_FILE and UPLOAD_DIR to paths on a named volume And the required variables PUBLIC_URL, JWT_SECRET, SMTP_LOGIN, SMTP_SENDER, SMTP_PASSWORD, SMTP_HOST and SMTP_PORT come from an env file at runtime Scenario: Healthy start When the container starts with every required variable set Then it logs "RenewCMS (production) listening on :8080" And GET /healthz on the published port returns 200 with the body "ok" Scenario: Frontend and API are both served When the container is running Then GET / returns 200 with the SPA index.html And GET /v1/auth/registration returns 200 with a JSON body Scenario Outline: A missing required variable stops the container When the container starts without Then the process exits with a non-zero status And the log contains "Environment variable is not set" Examples: | variable | | PUBLIC_URL | | JWT_SECRET | | SMTP_LOGIN | | SMTP_SENDER | | SMTP_PASSWORD | | SMTP_HOST | | SMTP_PORT | Scenario: Data survives container recreation Given an account was registered while the container was running When the container is removed and recreated on the same named volume Then the same account can log in Scenario: Graceful shutdown on SIGTERM When the container receives SIGTERM Then the log contains "shutting down..." And the container exits with status 0 within 10 seconds