# ============================================================================= # docker-compose.yml for Linkdock # ============================================================================= # # Quick start: # 1. cp .env.example .env # 2. Edit .env: set DOCK_SESSION_SECRET (run: openssl rand -hex 32) # 3. docker compose up -d # 4. curl http://localhost:3000/health/live # # With Caddy reverse proxy (automatic HTTPS): # docker compose --profile with-proxy up -d # ============================================================================= services: linkdock: build: context: . dockerfile: Dockerfile image: linkdock:latest container_name: linkdock ports: - "${DOCK_PORT:-3000}:3000" environment: DOCK_LISTEN: "0.0.0.0:3000" DOCK_DATA_DIR: "/data" DOCK_SESSION_SECRET: "${DOCK_SESSION_SECRET:?Set DOCK_SESSION_SECRET in .env}" DOCK_COOKIE_SECURE: "${DOCK_COOKIE_SECURE:-true}" DOCK_SETUP_TOKEN: "${DOCK_SETUP_TOKEN:-}" DOCK_CORS_ORIGINS: "${DOCK_CORS_ORIGINS:-}" DOCK_WEBAUTHN_RP_ID: "${DOCK_WEBAUTHN_RP_ID:-localhost}" DOCK_WEBAUTHN_ORIGIN: "${DOCK_WEBAUTHN_ORIGIN:-http://localhost:3000}" DOCK_WEBAUTHN_RP_NAME: "${DOCK_WEBAUTHN_RP_NAME:-Linkdock}" DOCK_PUBLIC_URL: "${DOCK_PUBLIC_URL:-http://localhost:3000}" DOCK_LOG_FORMAT: "${DOCK_LOG_FORMAT:-json}" RUST_LOG: "${RUST_LOG:-info,linkdock=debug}" volumes: - linkdock-data:/data restart: unless-stopped healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000/health/live"] interval: 30s timeout: 5s retries: 3 start_period: 10s # Optional: Caddy reverse proxy for automatic HTTPS caddy: image: caddy:2 container_name: linkdock-caddy ports: - "80:80" - "443:443" environment: DOMAIN: "${DOCK_DOMAIN:-bookmarks.example.com}" volumes: - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config depends_on: linkdock: condition: service_healthy restart: unless-stopped profiles: ["with-proxy"] volumes: linkdock-data: caddy-data: caddy-config: