Инициализировать репозиторий «Дейл»

Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
This commit is contained in:
Rustam Khalimov
2026-09-11 02:50:17 +03:00
commit 9e07568ddd
1402 changed files with 177470 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
# deploy/.env.prod.example — шаблон production-окружения «Дейла» (compose.prod.yml, Ruling 9; Task 14).
#
# Использование:
# cp deploy/.env.prod.example deploy/.env.prod
# # заполнить ВСЕ секреты (пустое значение = config упадёт с подсказкой — fail-fast, Ruling 9)
# docker compose --env-file deploy/.env.prod -f deploy/compose.prod.yml config # проверка
# docker compose --env-file deploy/.env.prod -f deploy/compose.prod.yml up -d --build
# # + наблюдаемость (профиль): ... up -d --build --profile observability
#
# Пароли/токены/ключи НЕ имеют значений-дефолтов (генерация: openssl rand -base64 32 и т.п.).
# DEAL_OPERATOR_* можно оставить пустыми: оператор тогда НЕ создаётся при старте (Ruling 1) —
# заведёте позже env + рестартом core.
# ── Обязательные секреты (пусто → docker compose config: ошибка с именем переменной) ──
# Пароль Postgres (пользователь/БД фиксированы: deal/deal).
DEAL_PG_PASSWORD=
# Ключ AES-256-GCM шифрования секретов настроек core (32 байта, base64): openssl rand -base64 32.
# Альтернатива — файл data/encryption.key на volume deal_api_data (см. техдок §13.4a).
DEAL_ENCRYPTION_KEY=
# Общий service-token процессов (gRPC-metadata; один на весь стек).
DEAL_SERVICE_TOKEN=
# Ключ AES-256-GCM файлов сессий telegram-service (32 байта, base64): openssl rand -base64 32.
DEAL_TELEGRAM_SESSION_KEY=
# Креды MinIO (root; S3 API и консоль). Бакет deal-files создаётся лениво (Ruling 4).
MINIO_ROOT_USER=
MINIO_ROOT_PASSWORD=
# Origin фронта для CORS/Origin-проверки core (Ruling 9/10). При статике за caddy тот же домен:
DEAL_ALLOWED_ORIGINS=https://deal.example
# ── Оператор (Ruling 1): пусто = bootstrap пропущен (стартовый warning), заводится позже env+рестарт ──
DEAL_OPERATOR_LOGIN=
DEAL_OPERATOR_PASSWORD=
# ── mTLS внутреннего gRPC (Ruling 6; Task 13/14) ──
# 0/пусто — plaintext + service-token внутри изолированной сети; 1 — TLS + клиентский сертификат.
# Сертификаты: запустите scripts/mtls-certs.sh (deploy/certs/*) и задайте пароль PFX:
DEAL_MTLS_ENABLED=0
DEAL_MTLS_CERT_PASSWORD=
# При DEAL_MTLS_ENABLED=1 схемы внутренних endpoint'ов обязаны стать https:// (иначе рукопожатие
# падает — код схему сам не переключает, см. task-13-report). Порт/имя менять не нужно:
DEAL_ML_ENDPOINT=http://ml-service:5103
DEAL_AI_ENDPOINT=http://ai-service:5102
DEAL_TELEGRAM_ENDPOINT=http://telegram-service:5101
DEAL_CORE_INGRESS=http://core:5082
# ── Необязательные (дефолты в compose.prod.yml) ──
# Каталог сертификатов mTLS на хосте (монтируется в /etc/deal/certs контейнеров):
# DEAL_CERTS_DIR=./certs
# Дефолт-бюджет ИИ нового тенанта (токенов/месяц; константа кода — 10 000 000):
# DEAL_DEFAULT_AI_BUDGET=
# ── Observability-профиль (только при --profile observability; см. compose.prod.yml) ──
# Пароль admin'а Grafana. Задать ПЕРЕД подъёмом профиля (пусто — grafana не получит пароль):
DEAL_GRAFANA_ADMIN_PASSWORD=
# DEAL_GRAFANA_ADMIN_USER=admin