From 4de51361a372c97e198ec2b119987893f41e3127 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 3 Oct 2026 18:29:57 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20docker-compose=20=D0=B8=D0=BD=D1=84=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20(dev/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PostgreSQL 16, NATS 2.10 без JetStream, MinIO и minio-init с бакетом arm-ka; имя проекта arm-ka, порты и учётные данные из .env, версии образов зафиксированы. Co-Authored-By: Claude Fable 5.1 --- dev/.env.example | 39 ++++++++++++++++++++ dev/docker-compose.yml | 83 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 dev/.env.example create mode 100644 dev/docker-compose.yml diff --git a/dev/.env.example b/dev/.env.example new file mode 100644 index 0000000..2c347e6 --- /dev/null +++ b/dev/.env.example @@ -0,0 +1,39 @@ +# Локальное окружение разработки. Скопируйте в .env: cp .env.example .env (.env в git не попадает) +# Файл читают docker compose (из этого каталога) и, блоком ниже, сервисы при запуске из venv. + +# --- Переменные docker-compose: учётные данные, порты хоста, бакет --- +# PostgreSQL 16 (схема dkb создаётся миграциями arm-core, не compose) +POSTGRES_DB=armka +POSTGRES_USER=armka +POSTGRES_PASSWORD=armka +POSTGRES_PORT=5432 + +# NATS 2.10 без JetStream: клиентский порт и порт мониторинга (/varz, /healthz) +NATS_PORT=4222 +NATS_MONITOR_PORT=8222 + +# MinIO: учётная запись администратора, порты API и консоли, единственный бакет +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadmin +MINIO_API_PORT=9000 +MINIO_CONSOLE_PORT=9001 +MINIO_BUCKET=arm-ka + +# --- Настройки сервисов при запуске из venv против compose по localhost (формат шаблона команды) --- +# Значения согласованы с блоком выше: при смене порта/пароля/бакета меняйте обе части. +# Если порт хоста изменён, поправьте и порты ниже. +DEBUG=true + +# PostgreSQL (драйвер asyncpg) +OPENBAO__DATABASE__DATABASE_URL=postgresql+asyncpg://armka:armka@localhost:5432/armka + +# MinIO: адрес без схемы (host:port) — так ждёт miniopy-async +OPENBAO__MINIO__MINIO_URL=localhost:9000 +OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin +OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin +OPENBAO__MINIO__MINIO_BUCKET=arm-ka + +# NATS без JetStream; пустые NATS_SEED/NATS_JWT — подключение без nkeys +OPENBAO__NATS__NATS_URL=nats://localhost:4222 +OPENBAO__NATS__NATS_SEED= +OPENBAO__NATS__NATS_JWT= diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml new file mode 100644 index 0000000..82b9c7a --- /dev/null +++ b/dev/docker-compose.yml @@ -0,0 +1,83 @@ +# Инфраструктура разработки АРМ КА: PostgreSQL 16, NATS 2.10 (без JetStream, как на платформе), MinIO + бакет. +# Запуск: cp .env.example .env && docker compose up -d (из этого каталога) +# Ожидание готовности: docker compose up -d --wait postgres nats minio. Голый `up -d --wait` возвращает код 1, потому что +# одноразовый minio-init завершается (хотя и с кодом 0) — для скриптов указывайте сервисы явно. +# Все учётные данные, порты хоста и имя бакета берутся из .env (значения по умолчанию — dev). +# Профиль `services` (arm-core, tabular-parser, scan-gateway, scan-emulator) добавляется в фазе 2. + +# Фиксированное имя проекта: одинаковые тома и сети из любого worktree (.wt/<срез>/docs/dev). +name: arm-ka + +services: + postgres: + image: postgres:16.10-alpine + environment: + POSTGRES_DB: ${POSTGRES_DB:-armka} + POSTGRES_USER: ${POSTGRES_USER:-armka} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-armka} + ports: + - "${POSTGRES_PORT:-5432}:5432" + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 3s + timeout: 3s + retries: 20 + start_period: 5s + + # Core NATS без JetStream: флаг --jetstream не передаётся. Мониторинг — порт 8222 (/varz, /healthz). + nats: + image: nats:2.10.29-alpine + command: ["-m", "8222"] + ports: + - "${NATS_PORT:-4222}:4222" + - "${NATS_MONITOR_PORT:-8222}:8222" + healthcheck: + test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:8222/healthz || exit 1"] + interval: 3s + timeout: 3s + retries: 20 + start_period: 2s + + # Образы minio/minio и minio/mc сняты с Docker Hub и quay.io; используется сборка alpine/minio с RELEASE-тегом. + minio: + image: alpine/minio:RELEASE.2025-10-15T17-29-55Z + # Образ по умолчанию работает от пользователя minio и не может писать в свежий именованный том — в dev запускаем от root. + user: "0:0" + command: ["server", "/data", "--console-address", ":9001"] + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} + ports: + - "${MINIO_API_PORT:-9000}:9000" + - "${MINIO_CONSOLE_PORT:-9001}:9001" + volumes: + - minio-data:/data + healthcheck: + test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:9000/minio/health/live || exit 1"] + interval: 3s + timeout: 3s + retries: 20 + start_period: 3s + + # Одноразовое создание бакета; идемпотентно (--ignore-existing), при повторном up снова завершается с кодом 0. + minio-init: + image: bitnamilegacy/minio-client:2025.7.21 + depends_on: + minio: + condition: service_healthy + restart: "no" + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} + MINIO_BUCKET: ${MINIO_BUCKET:-arm-ka} + entrypoint: ["/bin/sh", "-c"] + command: + - >- + mc alias set local http://minio:9000 "$$MINIO_ROOT_USER" "$$MINIO_ROOT_PASSWORD" && + mc mb --ignore-existing "local/$$MINIO_BUCKET" + +volumes: + postgres-data: + minio-data: