Docker
Run the Rezepte image with Docker Compose or plain docker run
The image is published at ghcr.io/s-frei/rezepte for linux/amd64 and linux/arm64. It listens on port 8060 and stores everything — the SQLite database and uploaded photos — under /data, owned by UID 65532 (the distroless nonroot user the container runs as).
This is docker-compose.yaml from the repository, rendered from that file itself, so it cannot drift from what Rezepte is actually run with. Download it instead of copying if you prefer — it carries a few extra comments meant for people working on Rezepte, and nothing else.
services:
rezepte:
image: ghcr.io/s-frei/rezepte:latest
restart: unless-stopped
volumes:
- rezepte-data:/data
environment:
# Read on the first start, to create the instance owner, and after that
# only by --reset-superadmin-password.
REZEPTE_ADMIN_PASSWORD: change-me-now
ports:
- "8060:8060"
volumes:
rezepte-data:docker compose up -dImage tags
latest is the newest stable release. Every version is listed on the GitHub releases page, and every image tag on the package page; use one in place of latest to run that version.
Bind mounts
The container runs as the nonroot user (UID 65532), so a bind-mounted ./data directory must be writable by that UID before the first start:
mkdir -p data
chown 65532:65532 dataA named volume (as in the compose file above) does not need this — Docker creates it already owned by the container's user.
Updating
docker compose pull
docker compose up -dMigrations run automatically the next time the container starts, and curl -s http://localhost:8060/healthz reports the version now running; see Updates.
Demo mode
Start the image with sample data instead of mounting real data:
docker run --rm -p 8060:8060 ghcr.io/s-frei/rezepte:latest --demoOpen http://localhost:8060 and log in as demo / demo1234. Without a volume nothing persists — the sample recipes and photos disappear when the container stops.