services: app: build: context: . dockerfile: Dockerfile container_name: ${APP_CONTAINER_NAME:-linklog-app} ports: - "${APP_PORT:-8000}:8000" volumes: - linklog_data:/app/backend/data environment: APP_ENV: ${APP_ENV:-production} LINKLOG_APP_NAME: ${LINKLOG_APP_NAME:-LinkLog} LINKLOG_DATABASE_PATH: ${LINKLOG_DATABASE_PATH:-/app/backend/data/linklog.db} LINKLOG_SECRET_KEY: ${LINKLOG_SECRET_KEY:?Set LINKLOG_SECRET_KEY in .env} LINKLOG_TOKEN_EXPIRY_DAYS: ${LINKLOG_TOKEN_EXPIRY_DAYS:-30} LINKLOG_TRACKING_PARAMS: ${LINKLOG_TRACKING_PARAMS:-} restart: ${APP_RESTART_POLICY:-unless-stopped} healthcheck: test: ["CMD", "python", "-c", "from urllib.request import urlopen; urlopen('http://127.0.0.1:8000/health', timeout=3)"] interval: ${APP_HEALTHCHECK_INTERVAL:-30s} timeout: ${APP_HEALTHCHECK_TIMEOUT:-5s} start_period: ${APP_HEALTHCHECK_START_PERIOD:-10s} retries: ${APP_HEALTHCHECK_RETRIES:-3} labels: - "traefik.enable=true" - "traefik.http.routers.linklog.rule=Host(`${TRAEFIK_HOST:-localhost}`)" - "traefik.http.routers.linklog.entrypoints=web" - "traefik.http.services.linklog.loadbalancer.server.port=8000" traefik: image: ${TRAEFIK_IMAGE:-traefik:v3.1} container_name: ${TRAEFIK_CONTAINER_NAME:-linklog-traefik} command: - --providers.docker=true - --entrypoints.web.address=:${TRAEFIK_HTTP_INTERNAL_PORT:-80} - --api.insecure=${TRAEFIK_API_INSECURE:-true} ports: - "${TRAEFIK_HTTP_PORT:-80}:${TRAEFIK_HTTP_INTERNAL_PORT:-80}" - "${TRAEFIK_DASHBOARD_BIND_ADDRESS:-127.0.0.1}:${TRAEFIK_DASHBOARD_PORT:-8080}:8080" restart: ${TRAEFIK_RESTART_POLICY:-unless-stopped} depends_on: app: condition: service_healthy volumes: - "${DOCKER_SOCKET_PATH:-/var/run/docker.sock}:/var/run/docker.sock:ro" volumes: linklog_data: