services:
  # Прокси-сервер приложения DFWebOS — направляет внешний трафик на наш nginx.
  app_proxy:
    environment:
      APP_HOST: bffless_nginx_1
      APP_PORT: 5537
      PROXY_AUTH_ADD: 'false'

  # Обратный прокси-сервер Nginx — обслуживает интерфейс, маршрутизирует вызовы API.
  # Использует собственное изображение зонтика со встроенным шаблоном конфигурации и страницей настройки.
  nginx:
    image: ghcr.io/bffless/ce-nginx:dfwebos@sha256:40b8f8dd37dd1483a08e687b1f0efe6061c62fcd73013fb46749c74407dbdf84
    restart: on-failure
    stop_grace_period: 30s
    environment:
      DEVICE_DOMAIN_NAME: ${DEVICE_DOMAIN_NAME:-dfwebos.local}
    volumes:
      # Конфигурация пользователя (domain.txt) — доступна для записи пользователем
      - ${APP_DATA_DIR}/data/config:/app/config:ro
      # Статические файлы внешнего интерфейса из контейнера внешнего интерфейса
      - ${APP_DATA_DIR}/data/frontend:/usr/share/nginx/html/app:ro
      # Конфигурации динамического домена, написанные серверной частью
      - ${APP_DATA_DIR}/data/nginx:/etc/nginx/sites-enabled
    depends_on:
      - backend
      - frontend

  # База данных PostgreSQL
  postgres:
    image: pgvector/pgvector:0.8.2-pg17@sha256:494dff7e67e7bc2c826b94c331364978d145ebb86fd338154138b084223b7f67
    restart: on-failure
    stop_grace_period: 30s
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: staticfilesgobrrrr
      POSTGRES_DB: assethost
    volumes:
      - ${APP_DATA_DIR}/data/postgres:/var/lib/postgresql/data
      - ${APP_DATA_DIR}/data/db/init-databases.sql:/docker-entrypoint-initdb.d/init.sql:ro
    command: >
      postgres
      -c shared_buffers=64MB
      -c effective_cache_size=128MB
      -c work_mem=4MB
      -c maintenance_work_mem=32MB
      -c max_connections=20
      -c wal_buffers=4MB
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 10s
      timeout: 5s
      retries: 5

  # Служба аутентификации SuperTokens
  supertokens:
    image: supertokens/supertokens-postgresql:9.3@sha256:39c36693b19c4e231684c9e614422c1c95751c346c6fc3ffd74980161d0b041c
    restart: on-failure
    stop_grace_period: 30s
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      # Используйте отдельные параметры вместо соединения URI (более надежно)
      POSTGRESQL_HOST: bffless_postgres_1
      POSTGRESQL_PORT: '5432'
      POSTGRESQL_USER: postgres
      POSTGRESQL_PASSWORD: staticfilesgobrrrr
      POSTGRESQL_DATABASE_NAME: supertokens
      # Увеличена память для запуска JVM на ARM64.
      JAVA_OPTS: '-Xmx192m -Xms96m -XX:+UseSerialGC -XX:MaxMetaspaceSize=64m'
      POSTGRESQL_CONNECTION_POOL_SIZE: '3'
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:3567/hello']
      interval: 15s
      timeout: 10s
      retries: 8
      start_period: 45s

  # NestJS серверная часть API
  # Использует собственное изображение зонтика со встроенной точкой входа, которая извлекает ключи из APP_SEED.
  backend:
    image: ghcr.io/bffless/ce-backend:dfwebos@sha256:7c4d4c15a186d5bb3b9e916aaadbe9602a0701db1ff2e3c47b9e7f3814967e61
    restart: on-failure
    stop_grace_period: 30s
    depends_on:
      postgres:
        condition: service_healthy
      supertokens:
        condition: service_healthy
    environment:
      NODE_OPTIONS: '--max-old-space-size=128'
      NODE_ENV: production
      PORT: '3000'
      LOG_LEVEL: 'error,warn,log'
      # DFWebOS предоставляет APP_SEED — точка входа наследует ENCRYPTION_KEY, JWT_SECRET, API_KEY_SALT
      APP_SEED: ${APP_SEED:-}
      APP_DATA_DIR: ${APP_DATA_DIR:-/data}
      # База данных
      DATABASE_URL: postgresql://postgres:staticfilesgobrrrr@bffless_postgres_1:5432/assethost
      # Хранилище — локальная файловая система (без MinIO)
      STORAGE_TYPE: local
      ENABLE_MINIO: 'false'
      # Кэш — в памяти (без Redis)
      CACHE_TYPE: memory
      ENABLE_REDIS: 'false'
      # Супертокены
      SUPERTOKENS_MODE: local
      SUPERTOKENS_CONNECTION_URI: http://bffless_supertokens_1:3567
      SUPERTOKENS_API_KEY: ''
      # По умолчанию URLs — переопределяется точкой входа, если domain.txt существует.
      PRIMARY_DOMAIN: localhost
      FRONTEND_URL: http://localhost:5537
      API_DOMAIN: http://localhost:5537
      ADMIN_DOMAIN: localhost
      # Настройки файлов cookie – переопределяются точкой входа для реальных доменов.
      COOKIE_SECURE: 'false'
      COOKIE_DOMAIN: 'dfwebos.local'
      # Конфигурация Nginx
      NGINX_SITES_PATH: /etc/nginx/sites-enabled
      NGINX_RELOAD_WAIT_MS: '3000'
      NGINX_LISTEN_PORT: '5537'
      BACKEND_HOST: backend
      # SSL обрабатывается Cloudflare Tunnel — nginx генерирует конфигурации, отличные от SSL.
      PROXY_MODE: 'cloudflare-tunnel'
      # Флаги функций (интерфейс-related)
      FEATURE_WILDCARD_SSL: 'false'
      FEATURE_WILDCARD_SSL_BANNER: 'false'
      FEATURE_DOMAIN_SSL_TOGGLE: 'false'
    volumes:
      # Пользовательские загрузки
      - ${APP_DATA_DIR}/data/uploads:/app/apps/backend/uploads
      # Конфигурация пользователя (domain.txt)
      - ${APP_DATA_DIR}/data/config:/app/config:ro
      # Динамические конфигурации nginx, написанные бэкэндом
      - ${APP_DATA_DIR}/data/nginx:/etc/nginx/sites-enabled

  # Интерфейс React (обслуживает статические файлы)
  frontend:
    image: ghcr.io/bffless/ce-frontend:dfwebos@sha256:9b02e77aec76a5abeaa45f07f64ec6add565b124bbb37a639fb4d633a774f1d9
    restart: on-failure
    stop_grace_period: 30s
    volumes:
      - ${APP_DATA_DIR}/data/frontend:/app/dist
    depends_on:
      - backend
