# Copyright © 2026 Olaf Kolkman # SPDX-License-Identifier: GPL-3.0-or-later services: app: build: context: . dockerfile: Dockerfile container_name: ${APP_CONTAINER_NAME:-linklog-app} 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_DATA_ENCRYPTION_KEY: ${LINKLOG_DATA_ENCRYPTION_KEY:?Set LINKLOG_DATA_ENCRYPTION_KEY in .env} LINKLOG_PUBLIC_URL: ${LINKLOG_PUBLIC_URL:-linklog.example.com} LINKLOG_LOG_LEVEL: ${LINKLOG_LOG_LEVEL:-INFO} 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.middlewares.web-https-redirect.redirectscheme.scheme: https traefik.http.services.linklog.loadbalancer.server.port: 8000 traefik.docker.network: git_traefik traefik.http.routers.linklog.entrypoints: web traefik.http.routers.linklog.rule: Host(`${LINKLOG_PUBLIC_URL:-linklog.example.com}`) traefik.http.routers.linklog.middlewares: web-https-redirect,servicests traefik.http.routers.linklog-secure.entrypoints: websecure traefik.http.routers.linklog-secure.rule: Host(`${LINKLOG_PUBLIC_URL:-linklog.example.com}`) traefik.http.routers.linklog-secure.tls: true traefik.http.routers.linklog-secure.middlewares: servicests traefik.http.routers.linklog-secure.tls.certresolver: myresolver traefik.http.routers.linklog-secure.service: linklog networks: - linklog_traefik networks: linklog_traefik: external: true name: linklog_traefik