services: linkemby: image: ${GHCR_PROXY:-ghcr.io}/linkemby/linkemby:${LINKEMBY_VERSION:-v0.1.10} container_name: linkemby restart: unless-stopped environment: TZ: ${TZ:-Asia/Shanghai} DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} NEXTAUTH_URL: ${NEXTAUTH_URL} NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} ENCRYPTION_KEY: ${ENCRYPTION_KEY} ENCRYPTION_IV: ${ENCRYPTION_IV} CRON_SECRET: ${CRON_SECRET} NODE_ENV: ${NODE_ENV} NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED} LOG_LEVEL: ${LOG_LEVEL} LOG_TO_FILE: ${LOG_TO_FILE} LOG_FILE_PATH: ${LOG_FILE_PATH} ORDER_TIMEOUT_MINUTES: ${ORDER_TIMEOUT_MINUTES} EMAIL_TEMPLATES_PATH: ${EMAIL_TEMPLATES_PATH} UPLOAD_PATH: ${UPLOAD_PATH} HOSTNAME: 0.0.0.0 ports: - "${LINKEMBY_PORT:-3000}:3000" volumes: - ./data/linkemby:/app/data depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - linkemby healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"] interval: 30s timeout: 10s start_period: 60s retries: 3 postgres: image: ${DOCKER_PROXY:-docker.io}/pgvector/pgvector:pg17 container_name: linkemby-postgres restart: unless-stopped environment: TZ: ${TZ:-Asia/Shanghai} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "PGPASSWORD=${POSTGRES_PASSWORD} pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5 networks: - linkemby redis: image: ${DOCKER_PROXY:-docker.io}/redis:7-alpine container_name: linkemby-redis restart: unless-stopped environment: TZ: ${TZ:-Asia/Shanghai} command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} ports: - "${REDIS_PORT:-6379}:6379" volumes: - ./data/redis:/data healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 10s timeout: 5s retries: 5 networks: - linkemby cron: image: ${GHCR_PROXY:-ghcr.io}/monlor/docker-cron:main container_name: linkemby-cron restart: unless-stopped environment: TZ: ${TZ:-Asia/Shanghai} STARTUP_CONDITION: 'curl -sSf http://linkemby:3000/api/health &> /dev/null' CRON_JOB_EXPIRY_REMINDER: '0 9 * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/expiry-reminder' CRON_JOB_SUBSCRIPTION_SYNC: '30 0 * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/subscription-sync' CRON_JOB_CANCEL_UNPAID: '* * * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/cancel-unpaid-orders' CRON_JOB_CACHE_CLEANUP: '0 2 * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/cache-cleanup' # CRON_JOB_USER_STATUS: '0 3 * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/user-status-check' CRON_JOB_EMBY_HEALTH: '*/5 * * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/emby-health-check' CRON_JOB_ANOMALY_DETECTION: '*/10 * * * * curl -H "Authorization: Bearer ${CRON_SECRET}" -sSf http://linkemby:3000/api/cron/anomaly-detection' depends_on: linkemby: condition: service_healthy networks: - linkemby networks: linkemby: driver: bridge