services: contract-companion: image: ${BACKEND_IMAGE:-paperless-contract-companion-api:latest} build: context: . dockerfile: Dockerfile restart: unless-stopped environment: - PORT=8000 - LOG_LEVEL=${LOG_LEVEL:-info} - DATABASE_PATH=/app/data/contracts.db - ALERT_DAYS_BEFORE=${ALERT_DAYS_BEFORE:-45} - SCHEDULER_INTERVAL_MINUTES=${SCHEDULER_INTERVAL_MINUTES:-60} - AUTH_USERNAME=${AUTH_USERNAME:-admin} - AUTH_PASSWORD=${AUTH_PASSWORD:?Set AUTH_PASSWORD in Portainer stack environment} - AUTH_JWT_SECRET=${AUTH_JWT_SECRET:?Set AUTH_JWT_SECRET in Portainer stack environment} - AUTH_TOKEN_EXPIRES_IN_HOURS=${AUTH_TOKEN_EXPIRES_IN_HOURS:-12} - APP_LOCALE=${APP_LOCALE:-de} - PAPERLESS_BASE_URL - PAPERLESS_EXTERNAL_URL - PAPERLESS_TOKEN - APP_EXTERNAL_URL - NTFY_SERVER_URL - NTFY_TOPIC - NTFY_TOKEN - NTFY_PRIORITY - MAIL_SERVER - MAIL_PORT - MAIL_USERNAME - MAIL_PASSWORD - MAIL_USE_TLS - MAIL_FROM - MAIL_TO - ICAL_SECRET volumes: - contracts-data:/app/data ports: - "${BACKEND_PORT:-8112}:8000" labels: - "com.centurylinklabs.watchtower.enable=${WATCHTOWER_ENABLE:-false}" healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8000/healthz >/dev/null 2>&1 || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 20s networks: - contract-companion contract-companion-ui: image: ${FRONTEND_IMAGE:-paperless-contract-companion-ui:latest} build: context: . dockerfile: frontend/Dockerfile restart: unless-stopped ports: - "${FRONTEND_PORT:-8113}:80" labels: - "com.centurylinklabs.watchtower.enable=${WATCHTOWER_ENABLE:-false}" healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/ >/dev/null 2>&1 || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 20s depends_on: - contract-companion networks: - contract-companion volumes: contracts-data: networks: contract-companion: