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