x-backend-image: &backend-image image: ghcr.io/phinaldoo/omlorix-backend:${OMLORIX_VERSION:?OMLORIX_VERSION is required} x-omlorix-labels: &omlorix-labels com.omlorix.installation.id: ${OMLORIX_INSTALLATION_ID:-unmanaged} x-backend-env: &backend-env env_file: - .env environment: MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} BACKUP_LOCAL_DIR: /app/backups BACKUP_WRITE_FREEZE_MAX_SECONDS: ${BACKUP_WRITE_FREEZE_MAX_SECONDS:-300} FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles x-backend-volumes: &backend-volumes volumes: - app_logs:/app/app/logs - app_data:/app/app/data - backups_data:/app/backups x-backend-depends: &backend-depends depends_on: migrate: condition: service_completed_successfully x-durable-worker-environment: &durable-worker-environment MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} PYTHONPATH: /app BACKUP_LOCAL_DIR: /app/backups FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles DB_MIGRATIONS_MODE: off OPERATIONS_WORKER_MODE: external OPERATIONS_IMPORT_MAX_BYTES: ${OPERATIONS_IMPORT_MAX_BYTES:-536870912} OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_BYTES: ${OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_BYTES:-8589934592} OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_BYTES: ${OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_BYTES:-1073741824} OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_SLOTS: ${OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_SLOTS:-1000} OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_SLOTS: ${OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_SLOTS:-10} GENERATION_WORKER_MODE: external MEMORY_WORKER_MODE: external RESEARCH_WORKER_MODE: external FILE_PROCESSING_WORKER_MODE: external ACCOUNT_LIFECYCLE_WORKER_MODE: external MAINTENANCE_WORKER_MODE: external RENDERING_WORKER_MODE: external MEDIA_WORKER_MODE: external CONNECTOR_WORKER_MODE: external AUDIT_EVENT_WORKER_MODE: external services: migrate: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes] environment: MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} BACKUP_LOCAL_DIR: /app/backups FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles DB_MIGRATIONS_MODE: run DB_MIGRATIONS_LOCK_TIMEOUT_SECONDS: ${DB_MIGRATIONS_LOCK_TIMEOUT_SECONDS:-120} restart: "no" command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser ./migrate.sh" networks: - omlorix-network fastapi: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} AUTOMATION_SCHEDULER_ENABLED: "false" BACKUP_LOCAL_DIR: /app/backups BACKUP_SCHEDULER_ENABLED: "false" BACKUP_SCHEDULER_INTERVAL_SECONDS: ${BACKUP_SCHEDULER_INTERVAL_SECONDS:-60} BACKUP_WRITE_FREEZE_MAX_SECONDS: ${BACKUP_WRITE_FREEZE_MAX_SECONDS:-300} FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles OPERATIONS_WORKER_MODE: external OPERATIONS_IMPORT_MAX_BYTES: ${OPERATIONS_IMPORT_MAX_BYTES:-536870912} OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_BYTES: ${OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_BYTES:-8589934592} OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_BYTES: ${OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_BYTES:-1073741824} OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_SLOTS: ${OPERATIONS_IMPORT_STAGING_GLOBAL_MAX_SLOTS:-1000} OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_SLOTS: ${OPERATIONS_IMPORT_STAGING_PRINCIPAL_MAX_SLOTS:-10} GENERATION_WORKER_MODE: external MEMORY_WORKER_MODE: external RESEARCH_WORKER_MODE: external FILE_PROCESSING_WORKER_MODE: external ACCOUNT_LIFECYCLE_WORKER_MODE: external MAINTENANCE_WORKER_MODE: external RENDERING_WORKER_MODE: external MEDIA_WORKER_MODE: external CONNECTOR_WORKER_MODE: external AUDIT_EVENT_WORKER_MODE: external REALTIME_GATEWAY_MODE: external DB_MIGRATIONS_MODE: off TRUSTED_PROXIES: ${TRUSTED_PROXIES:-} restart: unless-stopped command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips \"$${UVICORN_FORWARDED_ALLOW_IPS:-127.0.0.1,::1}\"" healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000/ready', timeout=3).read()\""] interval: 10s timeout: 5s retries: 12 start_period: 20s networks: - omlorix-network automation_scheduler: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] profiles: ["redis-enabled"] environment: MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} AUTOMATION_SCHEDULER_ENABLED: "true" AUDIT_EVENT_WORKER_MODE: external BACKUP_LOCAL_DIR: /app/backups FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles DB_MIGRATIONS_MODE: off restart: unless-stopped command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.automations.scheduler" networks: - omlorix-network automation_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] profiles: ["redis-enabled"] environment: MODE: production DATABASE_URL: ${DATABASE_URL} REDIS_ENABLED: ${REDIS_ENABLED:-true} REDIS_URL: ${REDIS_URL} PYTHONPATH: /app BACKUP_LOCAL_DIR: /app/backups FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles DB_MIGRATIONS_MODE: off RESEARCH_WORKER_MODE: external FILE_PROCESSING_WORKER_MODE: external RENDERING_WORKER_MODE: external MEDIA_WORKER_MODE: external CONNECTOR_WORKER_MODE: external AUDIT_EVENT_WORKER_MODE: external restart: unless-stopped command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser rq worker --worker-class app.automations.rq_worker.TelemetryWorker --url \"$${REDIS_URL}\" \"$${AUTOMATION_QUEUE_NAME:-omlorix-automations}\"" networks: - omlorix-network email_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: MODE: production DATABASE_URL: ${DATABASE_URL} PYTHONPATH: /app OTEL_SERVICE_NAME: ${EMAIL_WORKER_OTEL_SERVICE_NAME:-omlorix-email-worker} BACKUP_LOCAL_DIR: /app/backups FILE_STORAGE_LOCAL_BASE_PATH: /app/app/data/userFiles DB_MIGRATIONS_MODE: off AUDIT_EVENT_WORKER_MODE: external restart: unless-stopped stop_grace_period: 30s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.email.worker run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "email", "email", "90"] interval: 31s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network operations_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${OPERATIONS_WORKER_OTEL_SERVICE_NAME:-omlorix-operations-worker} BACKUP_SCHEDULER_ENABLED: "true" BACKUP_SCHEDULER_INTERVAL_SECONDS: ${BACKUP_SCHEDULER_INTERVAL_SECONDS:-60} BACKUP_WRITE_FREEZE_MAX_SECONDS: ${BACKUP_WRITE_FREEZE_MAX_SECONDS:-300} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.operations run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "operations", "operations"] interval: 33s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network generation_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${GENERATION_WORKER_OTEL_SERVICE_NAME:-omlorix-generation-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.generation run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "generation", "generation"] interval: 35s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network memory_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${MEMORY_WORKER_OTEL_SERVICE_NAME:-omlorix-memory-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.memory run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "memory", "memory"] interval: 36s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network research_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${RESEARCH_WORKER_OTEL_SERVICE_NAME:-omlorix-research-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.research run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "research", "research"] interval: 37s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network file_processing_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${FILE_PROCESSING_WORKER_OTEL_SERVICE_NAME:-omlorix-file-processing-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.files run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "files", "files"] interval: 39s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network account_lifecycle_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${ACCOUNT_LIFECYCLE_WORKER_OTEL_SERVICE_NAME:-omlorix-account-lifecycle-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.lifecycle run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "lifecycle", "lifecycle"] interval: 41s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network maintenance_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${MAINTENANCE_WORKER_OTEL_SERVICE_NAME:-omlorix-maintenance-worker} MAINTENANCE_WORKER_MODE: external restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.maintenance run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "maintenance", "maintenance"] interval: 43s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network rendering_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${RENDERING_WORKER_OTEL_SERVICE_NAME:-omlorix-rendering-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.rendering run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "rendering", "rendering"] interval: 47s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network media_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${MEDIA_WORKER_OTEL_SERVICE_NAME:-omlorix-media-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.media run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "media", "media"] interval: 51s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network connector_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${CONNECTOR_WORKER_OTEL_SERVICE_NAME:-omlorix-connector-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.ingestion run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "connector", "ingestion"] interval: 53s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network audit_event_worker: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment OTEL_SERVICE_NAME: ${AUDIT_EVENT_WORKER_OTEL_SERVICE_NAME:-omlorix-audit-event-worker} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser python -m app.workers.events run" healthcheck: test: ["CMD", "python", "-m", "app.worker_heartbeat", "audit_event", "events"] interval: 59s timeout: 3s retries: 6 start_period: 20s networks: - omlorix-network realtime_gateway: labels: *omlorix-labels <<: [*backend-image, *backend-env, *backend-volumes, *backend-depends] environment: <<: *durable-worker-environment AUTOMATION_SCHEDULER_ENABLED: "false" BACKUP_SCHEDULER_ENABLED: "false" OPERATIONS_WORKER_MODE: external GENERATION_WORKER_MODE: external MEMORY_WORKER_MODE: external RESEARCH_WORKER_MODE: external FILE_PROCESSING_WORKER_MODE: external ACCOUNT_LIFECYCLE_WORKER_MODE: external MAINTENANCE_WORKER_MODE: external REALTIME_GATEWAY_MODE: gateway OTEL_SERVICE_NAME: ${REALTIME_GATEWAY_OTEL_SERVICE_NAME:-omlorix-realtime-gateway} TRUSTED_PROXIES: ${TRUSTED_PROXIES:-} restart: unless-stopped stop_grace_period: 60s command: > sh -c "mkdir -p /app/app/logs /app/app/data /app/backups && chown appuser:appuser /app/app/logs /app/app/data /app/backups && exec gosu appuser uvicorn app.realtime.gateway:app --host 0.0.0.0 --port 8001 --proxy-headers --forwarded-allow-ips \"$${UVICORN_FORWARDED_ALLOW_IPS:-127.0.0.1,::1}\"" healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8001/ready', timeout=3).read()\""] interval: 10s timeout: 5s retries: 12 start_period: 20s networks: - omlorix-network frontend: labels: *omlorix-labels image: ghcr.io/phinaldoo/omlorix-frontend:${OMLORIX_VERSION:?OMLORIX_VERSION is required} environment: FRONTEND_TRUST_PROXY_HEADERS: ${FRONTEND_TRUST_PROXY_HEADERS:-false} FRONTEND_TRUSTED_UPSTREAMS: ${FRONTEND_TRUSTED_UPSTREAMS:-} OMLORIX_LAUNCHER_PROXY_SECRET: ${OMLORIX_LAUNCHER_PROXY_SECRET:-} depends_on: fastapi: condition: service_healthy realtime_gateway: condition: service_healthy ports: - "${FRONTEND_HTTP_HOST_BIND:-127.0.0.1}:${FRONTEND_HTTP_HOST_PORT:-8080}:8080" restart: unless-stopped healthcheck: test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1:8080/"] interval: 10s timeout: 5s retries: 12 start_period: 10s networks: - omlorix-network networks: omlorix-network: driver: bridge labels: *omlorix-labels volumes: app_logs: app_data: backups_data: