services: app: image: ghcr.io/relaticle/relaticle:latest restart: unless-stopped ports: - "${APP_PORT:-80}:8080" environment: APP_NAME: ${APP_NAME:-Relaticle} APP_ENV: ${APP_ENV:-production} APP_KEY: ${APP_KEY:?APP_KEY is required} APP_DEBUG: ${APP_DEBUG:-false} APP_TIMEZONE: ${APP_TIMEZONE:-UTC} APP_URL: ${APP_URL:-http://localhost} APP_PANEL_DOMAIN: ${APP_PANEL_DOMAIN:-} REQUIRE_EMAIL_VERIFICATION: ${REQUIRE_EMAIL_VERIFICATION:-true} LOG_CHANNEL: ${LOG_CHANNEL:-stderr} LOG_LEVEL: ${LOG_LEVEL:-warning} DB_CONNECTION: pgsql DB_HOST: postgres DB_PORT: 5432 DB_DATABASE: ${DB_DATABASE:-relaticle} DB_USERNAME: ${DB_USERNAME:-relaticle} DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD:-null} REDIS_PORT: 6379 CACHE_STORE: redis SESSION_DRIVER: redis QUEUE_CONNECTION: redis MAIL_MAILER: ${MAIL_MAILER:-log} MAIL_HOST: ${MAIL_HOST:-} MAIL_PORT: ${MAIL_PORT:-587} MAIL_USERNAME: ${MAIL_USERNAME:-} MAIL_PASSWORD: ${MAIL_PASSWORD:-} MAIL_ENCRYPTION: ${MAIL_ENCRYPTION:-tls} MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS:-hello@example.com} MAIL_FROM_NAME: ${MAIL_FROM_NAME:-Relaticle} # serversideup/php Laravel automations AUTORUN_ENABLED: "true" AUTORUN_LARAVEL_MIGRATION: "true" AUTORUN_LARAVEL_MIGRATION_ISOLATION: "true" volumes: - storage:/var/www/html/storage/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/up"] interval: 30s timeout: 5s retries: 3 start_period: 60s horizon: image: ghcr.io/relaticle/relaticle:latest restart: unless-stopped command: ["php", "/var/www/html/artisan", "horizon"] stop_signal: SIGTERM environment: APP_NAME: ${APP_NAME:-Relaticle} APP_ENV: ${APP_ENV:-production} APP_KEY: ${APP_KEY:?APP_KEY is required} APP_DEBUG: ${APP_DEBUG:-false} APP_URL: ${APP_URL:-http://localhost} APP_PANEL_DOMAIN: ${APP_PANEL_DOMAIN:-} REQUIRE_EMAIL_VERIFICATION: ${REQUIRE_EMAIL_VERIFICATION:-true} LOG_CHANNEL: ${LOG_CHANNEL:-stderr} DB_CONNECTION: pgsql DB_HOST: postgres DB_PORT: 5432 DB_DATABASE: ${DB_DATABASE:-relaticle} DB_USERNAME: ${DB_USERNAME:-relaticle} DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD:-null} REDIS_PORT: 6379 QUEUE_CONNECTION: redis # Disable automations for worker container AUTORUN_ENABLED: "false" volumes: - storage:/var/www/html/storage/app depends_on: app: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "healthcheck-horizon"] start_period: 10s scheduler: image: ghcr.io/relaticle/relaticle:latest restart: unless-stopped command: ["php", "/var/www/html/artisan", "schedule:work"] stop_signal: SIGTERM environment: APP_NAME: ${APP_NAME:-Relaticle} APP_ENV: ${APP_ENV:-production} APP_KEY: ${APP_KEY:?APP_KEY is required} APP_DEBUG: ${APP_DEBUG:-false} APP_URL: ${APP_URL:-http://localhost} APP_PANEL_DOMAIN: ${APP_PANEL_DOMAIN:-} REQUIRE_EMAIL_VERIFICATION: ${REQUIRE_EMAIL_VERIFICATION:-true} LOG_CHANNEL: ${LOG_CHANNEL:-stderr} DB_CONNECTION: pgsql DB_HOST: postgres DB_PORT: 5432 DB_DATABASE: ${DB_DATABASE:-relaticle} DB_USERNAME: ${DB_USERNAME:-relaticle} DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD:-null} REDIS_PORT: 6379 QUEUE_CONNECTION: redis # Disable automations for scheduler container AUTORUN_ENABLED: "false" volumes: - storage:/var/www/html/storage/app depends_on: app: condition: service_healthy healthcheck: test: ["CMD", "healthcheck-schedule"] start_period: 10s postgres: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: ${DB_DATABASE:-relaticle} POSTGRES_USER: ${DB_USERNAME:-relaticle} POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} volumes: - postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-relaticle} -d ${DB_DATABASE:-relaticle}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine restart: unless-stopped command: redis-server --appendonly yes volumes: - redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 volumes: postgres: redis: storage: