services: postgres: image: ${POSTGRES_IMAGE_TAG:-postgres:18-alpine} container_name: mmapp-postgres restart: unless-stopped shm_size: "256mb" environment: POSTGRES_USER: mmapp POSTGRES_DB: mmapp POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C.UTF-8 --data-checksums" TZ: UTC PGTZ: UTC command: - postgres - -c - timezone=UTC - -c - listen_addresses=* - -c - max_connections=100 - -c - shared_buffers=256MB - -c - work_mem=16MB - -c - maintenance_work_mem=128MB - -c - wal_compression=on volumes: - mmapp-pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U mmapp -d mmapp"] interval: 5s timeout: 5s retries: 10 backend: image: git.shx.one/denozord/mikrotikmanager-backend:latest container_name: mmapp-backend restart: unless-stopped depends_on: postgres: condition: service_healthy ports: - "8000:8000" # IPFIX: только на WG-адресе хоста после `wg-quick up wg-flow`, не 0.0.0.0 # - "10.255.254.1:4739:4739/udp" environment: CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:3000} DATABASE_URL: postgres://mmapp:${POSTGRES_PASSWORD}@postgres:5432/mmapp DATABASE_PATH: /app/data/mikrotik.db # IPFIX: внутри контейнера слушаем все интерфейсы; на хосте UDP 4739 публикуется только на WG-IP FLOW_LISTEN_HOST: "0.0.0.0" volumes: - /opt/mmapp/data:/app/data healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:8000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", ] interval: 30s timeout: 5s retries: 3 start_period: 300s labels: mmapp.updater.managed: "true" mmapp.updater.target: backend mmapp.updater.image: git.shx.one/denozord/mikrotikmanager-backend:latest frontend: image: git.shx.one/denozord/mikrotikmanager-frontend:latest container_name: mmapp-frontend restart: unless-stopped depends_on: - backend ports: - "3000:3000" environment: BACKEND_INTERNAL_URL: http://backend:8000 labels: mmapp.updater.managed: "true" mmapp.updater.target: frontend mmapp.updater.image: git.shx.one/denozord/mikrotikmanager-frontend:latest updater: image: git.shx.one/denozord/mikrotikmanager-updater:latest container_name: mmapp-updater restart: unless-stopped environment: REGISTRY: git.shx.one REGISTRY_USERNAME: ${REGISTRY_USERNAME:-} REGISTRY_PASSWORD: ${REGISTRY_PASSWORD:-} POLL_INTERVAL_SECONDS: ${POLL_INTERVAL_SECONDS:-300} HEALTH_TIMEOUT_SECONDS: ${HEALTH_TIMEOUT_SECONDS:-600} STOP_TIMEOUT_SECONDS: ${STOP_TIMEOUT_SECONDS:-30} volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/mmapp/state:/state - /opt/mmapp/updater/targets.json:/etc/updater/targets.json:ro volumes: mmapp-pgdata: