# RecipesCam web — the whole stack. Copy this folder anywhere, then: # cp .env.example .env # docker compose up -d --build name: recipescam-web services: # Accounts + saved recipes. Never sees a photo: every pixel of the render # pipeline runs in the visitor's browser. api: build: ./backend restart: unless-stopped environment: DATA_DIR: /data # Who may moderate the contributed strip: a comma-separated email # allowlist. Empty means nobody is an admin, which is the safe default. ADMIN_EMAILS: ${ADMIN_EMAILS:-} # The relay that mails the "prove this address" link. Leave SMTP_HOST # empty and the link is written to this container's log instead — a dev # box needs no mail server, and the operator can read / copy it. SMTP_HOST: ${SMTP_HOST:-} SMTP_PORT: ${SMTP_PORT:-587} SMTP_USER: ${SMTP_USER:-} SMTP_PASS: ${SMTP_PASS:-} SMTP_FROM: ${SMTP_FROM:-} SMTP_SECURE: ${SMTP_SECURE:-} volumes: # SQLite (WAL) lives on the host so a rebuild never loses accounts. - ./data:/data # Static SPA + /api reverse proxy. "api" is the DNS name nginx.conf proxies to, # so this service name is load-bearing. frontend: build: ./frontend restart: unless-stopped depends_on: - api ports: - "${WEB_PORT:-8090}:80"