name: ${COMPOSE_PROJECT_NAME:-nyone-service} x-app-environment: &app-environment APP_NAME: ${APP_NAME:-Nyone} APP_ENV: ${APP_ENV:-production} APP_DEBUG: ${APP_DEBUG:-false} APP_KEY: ${APP_KEY:-} APP_PREVIOUS_KEYS: ${APP_PREVIOUS_KEYS:-} APP_URL: ${PUBLIC_SCHEME:-https}://${APP_DOMAIN:-nyone.example.com} APP_LOCALE: ${APP_LOCALE:-en} APP_FALLBACK_LOCALE: ${APP_FALLBACK_LOCALE:-en} APP_FAKER_LOCALE: ${APP_FAKER_LOCALE:-en_US} APP_MAINTENANCE_DRIVER: file BCRYPT_ROUNDS: 12 LOG_CHANNEL: stack LOG_STACK: stderr LOG_DEPRECATIONS_CHANNEL: "null" LOG_LEVEL: ${LOG_LEVEL:-info} DB_CONNECTION: pgsql DB_HOST: db DB_PORT: 5432 DB_DATABASE: ${POSTGRES_DB:-nyone} DB_USERNAME: ${POSTGRES_USER:-nyone} DB_PASSWORD: ${POSTGRES_PASSWORD:-} SESSION_DRIVER: database SESSION_LIFETIME: 120 SESSION_ENCRYPT: "false" SESSION_PATH: / SESSION_DOMAIN: ${SESSION_DOMAIN:-} SESSION_SECURE_COOKIE: ${SESSION_SECURE_COOKIE:-true} BROADCAST_CONNECTION: log FILESYSTEM_DISK: local QUEUE_CONNECTION: database CACHE_STORE: redis REDIS_CLIENT: phpredis REDIS_HOST: redis REDIS_PORT: 6379 MAIL_MAILER: ${MAIL_MAILER:-log} MAIL_SCHEME: ${MAIL_SCHEME:-} MAIL_HOST: ${MAIL_HOST:-127.0.0.1} MAIL_PORT: ${MAIL_PORT:-2525} MAIL_USERNAME: ${MAIL_USERNAME:-} MAIL_PASSWORD: ${MAIL_PASSWORD:-} MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS:-hello@example.com} MAIL_FROM_NAME: ${MAIL_FROM_NAME:-Nyone} VITE_APP_NAME: ${APP_NAME:-Nyone} STREAMING_RTMP_INGEST_URL: rtmp://${APP_DOMAIN:-nyone.example.com}:${RTMP_PUBLIC_PORT:-19935} STREAMING_HLS_PUBLIC_URL: ${PUBLIC_SCHEME:-https}://${HLS_DOMAIN:-nyone-hls.example.com} STREAMING_MEDIAMTX_API_URL: http://mediamtx:9997 STREAMING_VIEWER_COUNT_CACHE_STORE: redis STREAMING_VIEWER_COUNT_TTL: ${STREAMING_VIEWER_COUNT_TTL:-10} STREAMING_VIEWER_SYNC_INTERVAL: ${STREAMING_VIEWER_SYNC_INTERVAL:-2} STREAMING_VIEWER_IDENTITY_COOKIE: ${STREAMING_VIEWER_IDENTITY_COOKIE:-nyone_visitor_id} STREAMING_VIEWER_IDENTITY_COOKIE_LIFETIME_DAYS: ${STREAMING_VIEWER_IDENTITY_COOKIE_LIFETIME_DAYS:-365} STREAMING_VIEWER_IDENTITY_TTL: ${STREAMING_VIEWER_IDENTITY_TTL:-86400} STREAMING_VIEWER_STATS_POLL_INTERVAL: ${STREAMING_VIEWER_STATS_POLL_INTERVAL:-30000} STREAMING_VOD_RETENTION_DAYS: ${STREAMING_VOD_RETENTION_DAYS:-30} STREAMING_RECORDINGS_PATH: /var/www/html/storage/app/private/recordings MEDIAMTX_SHARED_SECRET: ${MEDIAMTX_SHARED_SECRET:-} APP_DOMAIN: ${APP_DOMAIN:-nyone.example.com} HLS_DOMAIN: ${HLS_DOMAIN:-nyone-hls.example.com} HLS_INTERNAL_PORT: 19988 APP_OPTIMIZE_ON_BOOT: ${APP_OPTIMIZE_ON_BOOT:-true} SEED_DATABASE: ${SEED_DATABASE:-false} x-app-service: &app-service image: ${APP_IMAGE:-nyone-app:latest} build: context: . dockerfile: docker/app/Dockerfile restart: unless-stopped environment: <<: *app-environment volumes: - app-storage:/var/www/html/storage depends_on: db: condition: service_healthy redis: condition: service_healthy services: app: <<: *app-service environment: <<: *app-environment CONTAINER_ROLE: app ports: - "${APP_HTTP_PORT:-8080}:80" healthcheck: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1/up >/dev/null || exit 1"] interval: 30s timeout: 5s retries: 5 start_period: 30s migrate: <<: *app-service restart: "no" environment: <<: *app-environment CONTAINER_ROLE: migrate profiles: - tools queue: <<: *app-service environment: <<: *app-environment CONTAINER_ROLE: queue QUEUE_NAMES: ${QUEUE_NAMES:-default} QUEUE_SLEEP: ${QUEUE_SLEEP:-3} QUEUE_TRIES: ${QUEUE_TRIES:-3} QUEUE_MAX_TIME: ${QUEUE_MAX_TIME:-3600} QUEUE_TIMEOUT: ${QUEUE_TIMEOUT:-90} scheduler: <<: *app-service environment: <<: *app-environment CONTAINER_ROLE: scheduler viewer-sync: <<: *app-service environment: <<: *app-environment CONTAINER_ROLE: viewer-sync MEDIAMTX_HOST: mediamtx MEDIAMTX_API_PORT: 9997 depends_on: db: condition: service_healthy redis: condition: service_healthy mediamtx: condition: service_started mediamtx: image: ${MEDIAMTX_IMAGE:-nyone-mediamtx:latest} build: context: . dockerfile: docker/mediamtx/Dockerfile restart: unless-stopped environment: APP_URL: ${PUBLIC_SCHEME:-https}://${APP_DOMAIN:-nyone.example.com} HLS_PUBLIC_URL: ${PUBLIC_SCHEME:-https}://${HLS_DOMAIN:-nyone-hls.example.com} MEDIAMTX_SHARED_SECRET: ${MEDIAMTX_SHARED_SECRET:-} RTMP_INTERNAL_PORT: 19935 HLS_INTERNAL_PORT: 19988 ports: - "${RTMP_PUBLIC_PORT:-19935}:19935" volumes: - app-storage:/var/www/html/storage depends_on: app: condition: service_started db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-nyone} POSTGRES_USER: ${POSTGRES_USER:-nyone} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\""] interval: 10s timeout: 5s retries: 10 redis: image: redis:7-alpine restart: unless-stopped command: ["redis-server", "--appendonly", "yes"] volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 10 volumes: app-storage: postgres-data: redis-data: