# Имена контейнеров не задаём явно — docker генерит их с префиксом # COMPOSE_PROJECT_NAME (см. .env). Это позволяет параллельный запуск нескольких # инстансов mono-ai-N. Внутри сети контейнеры стучатся друг к другу по service name. services: node: image: dicoop/blockchain:latest ports: - "${NODE_HTTP_PORT:-8888}:8888" - "${NODE_P2P_PORT:-9876}:9876" - "${NODE_HISTORY_PORT:-8070}:8070" volumes: - ./components/boot/blockchain-data:/mnt/dev/data - ./components/boot/wallet-data:/root/eosio-wallet - ./components/contracts/build/contracts:/contracts - ./components/boot/src/configs:/mnt/dev/config command: > /bin/bash -c "/usr/local/bin/nodeos -d /mnt/dev/data --config-dir /mnt/dev/config --genesis-json /mnt/dev/config/genesis.json" restart: unless-stopped mongo: image: mongo:latest restart: always volumes: - mongo_data:/data/db ports: - "127.0.0.1:${MONGO_HOST_PORT:-27017}:27017" # Локально гоняем mongo как standalone. Раньше был --replSet rs0 + rs.initiate # в entrypoint, но проект не использует transactions / change streams / # readConcern:'majority' — replica-set не нужен. Бонус: rs.initiate race # на arm64 (sleep 5 не успевал, см. инцидент 2026-05-23) уходит. command: ["mongod", "--bind_ip_all"] monoredis: image: redis:latest restart: always ports: - "127.0.0.1:${REDIS_HOST_PORT:-6379}:6379" postgres: image: postgres:18 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres!23!23 POSTGRES_DB: voskhod volumes: - postgres_data:/var/lib/postgresql ports: - "127.0.0.1:${PG_HOST_PORT:-5532}:5432" coopback: build: context: ./ dockerfile: components/controller/Dockerfile image: coopback env_file: - ./components/controller/.env restart: unless-stopped # Пишем bind-mount ./:/app от хостового ant (uid 1000), иначе codegen # (generate-client/schema, логи) кладёт root-owned файлы и ломает git checkout. # HOME=/tmp — чтобы pnpm/кэш не сорили в репозиторий. user: "1000:1000" environment: HOME: /tmp volumes: - ./:/app ports: - "0.0.0.0:${COOPBACK_HOST_PORT:-2998}:2998" working_dir: /app command: pnpm --filter @coopenomics/controller run dev cooparser: build: context: ./ dockerfile: components/parser/Dockerfile image: cooparser env_file: - ./components/parser/.env restart: unless-stopped # См. coopback: пишем от хостового ant (uid 1000), HOME=/tmp. user: "1000:1000" environment: HOME: /tmp volumes: - ./:/app working_dir: /app command: pnpm --filter @coopenomics/parser run dev desktop: build: context: ./ dockerfile: components/desktop/Dockerfile image: desktop env_file: - ./components/desktop/.env restart: unless-stopped # См. coopback: пишем от хостового ant (uid 1000), HOME=/tmp. user: "1000:1000" environment: HOME: /tmp ports: - "127.0.0.1:${DESKTOP_HOST_PORT:-2999}:2999" volumes: - ./:/app working_dir: /app command: pnpm --filter @coopenomics/desktop run dev minio: image: minio/minio:RELEASE.2025-09-07T16-13-09Z restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - minio_data:/data ports: - "127.0.0.1:${MINIO_HOST_PORT:-9000}:9000" - "127.0.0.1:${MINIO_CONSOLE_HOST_PORT:-9001}:9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 5s timeout: 3s retries: 10 volumes: mongo_data: postgres_data: minio_data: