dana-medical-site/docker-compose.prod.yml

103 lines
3.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: dana
POSTGRES_USER: dana
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dana -d dana"]
interval: 5s
timeout: 3s
retries: 20
api:
build:
context: .
restart: unless-stopped
env_file:
- .env
environment:
DATABASE_URL: postgres://dana:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@db:5432/dana?sslmode=disable
APP_ADDR: ":8080"
MEDIA_DIR: /data/media
WEB_DIR: /app/web/dist
SSR_RENDERER: /app/web/scripts/render-page.mjs
NODE_BINARY: node
SITE_URL: ${SITE_URL:?SITE_URL is required}
DEBUG: "false"
# Caddy уже работает в контейнере Ability Center. Публикуем DANA только
# на docker0 хоста: из интернета порт недоступен, Caddy обращается к нему
# как к 172.17.0.1:8082.
ports:
- "172.17.0.1:${DANA_PORT:-8082}:8080"
volumes:
- media:/data/media
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8080/api/v1/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
interval: 10s
timeout: 5s
retries: 12
start_period: 20s
security_opt:
- no-new-privileges:true
# Мост к 1C MCP. Единственный контейнер, которому разрешён egress на
# 10.240.70.70:6003 (правило DOCKER-USER, см. deploy/firewall-1c-egress.sh).
# IP закреплён: правило фаервола привязано к адресу, а не к имени.
bridge:
build:
context: ./bridge
image: dana-1c-bridge:latest
container_name: dana-1c-bridge
restart: unless-stopped
env_file:
- .env
environment:
ONEC_MCP_URL: ${ONEC_MCP_URL:-http://10.240.70.70:6003/api/execute_code}
ONEC_MCP_TOKEN: ${ONEC_MCP_TOKEN:?ONEC_MCP_TOKEN is required}
# Go-бэкенд авторизуется перед мостом тем же ключом, что шлёт в ONEC_API_URL.
BRIDGE_API_KEY: ${ONEC_API_KEY:?ONEC_API_KEY is required}
PG_HOST: db
PG_PORT: "5432"
PG_USER: dana
PG_DB: dana
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
depends_on:
db:
condition: service_healthy
networks:
default:
ipv4_address: 172.20.0.50
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8088/healthz', timeout=3)"]
interval: 30s
timeout: 5s
retries: 5
start_period: 10s
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp:size=16m
volumes:
db-data:
media:
# Существующая сеть уже проверена: 172.20.0.0/16. external запрещает Compose
# пересоздавать её при добавлении моста и затрагивать работающие api/db.
# При развёртывании на новом хосте сначала создайте эту сеть с нужной подсетью.
networks:
default:
external: true
name: dana-medical_default