food-market/docs/secrets.md
nns 72d0a71307
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
docs(s24): docs cross-check + auto-gen + onboarding + test gap-fill (8/8 ✓)
1. Docs cross-check — обновил performance-baseline.md (Sprint 18/20/23
   фиксы), secrets.md (16 новых env-vars из Sprint 20+ — Authentication
   Google/Microsoft, Monitoring, Cleanup, Hangfire:Cron, Telegram,
   Maintenance, App, Storage, PUBLIC_GA_ID/YM_ID).

2. Auto-gen api-reference — ApiReferenceDocsJob (Hangfire weekly вс
   05:30 UTC) + Python-эквивалент `/tmp/gen-api-ref.py` для commit
   actual snapshot. docs/api-reference.md = 195 endpoints, 57 controllers.

3. Coverage gap-fill — Sprint18To23FeaturesTests.cs (16 Facts):
   - bulk-update + cross-tenant isolation
   - UserPresets CRUD
   - inline-edit price PATCH
   - CSV import 2 строки транзакцией
   - OrgExport create + list isolation
   - 1C-CSV import с русскими заголовками
   - audit-log export CSV streaming + BOM check
   - MoySklad sync-status stub
   - SSO providers + 503 unconfigured + 400 unknown provider
   - bug-001 NUL byte → 400
   - bug-004 tiny price → 400
   - export CSV BOM
   Покрывает все новые контроллеры Sprint 18-23 + regression-protect
   для критичных багов.

4. Contract tests — deploy/swagger-diff.sh: pull /swagger/v1/swagger.json
   с двух URL, diff endpoints+schemas через python3. Exit 0/1/2 для
   blue-green safety gate. Multi-path auto-detect.

5. docs/error-codes.md — каталог HTTP-кодов API (200-503) + humanizeError
   pattern для фронта + retry-policy таблица.

6. docs/glossary.md — 50+ доменных терминов (Tenant/Organization/Stock/
   StockMovement/RetailSale/Counterparty/Owner/Employee/Role/Permission/
   advisory lock/Serializable/…) с ссылками на code-сущности.

7. docs/ONBOARDING.md — first 3 days для нового разработчика
   (install → запуск → структура → первый PR + FAQ).

8. README.md — обновил под текущее состояние: React 19, Sprint-history
   1-24, ссылки на ключевые docs, корректный 5-min quick start.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 02:15:56 +05:00

6.4 KiB
Raw Permalink Blame History

Секреты и переменные окружения

Все секреты задаются через deploy/.env.gitignore, не коммитится). Шаблон со всеми переменными — deploy/.env.example. docker-compose читает .env автоматически из каталога запуска (deploy/).

cp deploy/.env.example deploy/.env
$EDITOR deploy/.env          # заполнить значения
chmod 600 deploy/.env        # ограничить доступ

Перечень

Переменная Обяз. Назначение Где используется Как получить
POSTGRES_PASSWORD пароль БД food_market контейнер postgres + ConnectionStrings__Default API openssl rand -base64 24
REGISTRY реестр образов image-ссылки в compose стейдж: 127.0.0.1:5001
API_TAG / WEB_TAG / PUBLIC_TAG теги образов image-ссылки тег из CI / latest
OPENIDDICT_ISSUER (прод) публичный issuer токенов API OpenIddict__Issuer публичный URL админки, напр. https://admin.food-market.kz/
OPENIDDICT_CERT_PASSWORD пароль PFX-сертификатов API OpenIddict__CertPassword свой пароль или пусто (self-signed без пароля)
FM_BACKUP_DIR / FM_UPLOADS_DIR / FM_BACKUP_RETENTION_DAYS параметры бэкапа food-market-backup.sh дефолты совпадают с compose
Cors__AllowedOrigins__N CORS-origins API переопределяет appsettings.json
RateLimiting__* антибрутфорс лимиты API дефолты 5/мин, 20/час
MoySklad__BaseUrl база API МойСклад API дефолт боевой api.moysklad.ru
Telegram__BotToken токен Telegram-бота для alert'ов и owner-сводки OwnerDailySummaryJob, DiskMonitoringJob bot @BotFather
Telegram__BotUsername username бота (без @) для deep-link'ов в notify TelegramBindingController у бота в Telegram
Authentication__Google__ClientId / __ClientSecret OAuth Google SSO (Sprint 20 scaffold) API ExternalAuthController см. docs/sso.md
Authentication__Microsoft__ClientId / __ClientSecret OAuth Microsoft SSO (Sprint 20 scaffold) API ExternalAuthController см. docs/sso.md
Monitoring__DiskPaths CSV mount-paths для disk-monitor (default /opt,/var/lib/docker) DiskMonitoringJob (Sprint 20) список mount'ов хоста
Monitoring__DiskMinFreeBytes порог alert'a (default 1 GB) DiskMonitoringJob в байтах
Monitoring__DiskAlertCooldownHours антиспам для disk-alert (default 6h) DiskMonitoringJob в часах
Monitoring__SuperAdminTelegramChatIds CSV chat-id'ы для disk/perf alert'ов DiskMonitoringJob, nightly-perf-check.sh chat-id юзера
Cleanup__DraftDays / __OrgAuditLogDays / __RevokedRefreshTokenDays retention для cleanup-job'ов (default 30 / 90 / 7) HousekeepingJobs (Sprint 20) в днях
Hangfire__Retention__StockMovementDays / __AuditLogDays retention для prune'ов HousekeepingJobs в днях
Hangfire__Cron__* переопределение cron-расписания jobs HangfireJobsConfigurator стандартный 5-полевой cron
Maintenance__VacuumTopN сколько таблиц VACUUM ANALYZE еженедельно (default 5) DatabaseMaintenanceJobs (Sprint 20) int
App__PublicBaseUrl публичный URL админки (для email-link'ов на GDPR-export) OrgExportJob (Sprint 22) напр. https://admin.food-market.kz
Storage__Type local (default, /uploads volume) или minio StorageBootstrap строка
Storage__Minio__Endpoint / __AccessKey / __SecretKey / __Bucket конфиг MinIO/S3 если Type=minio MinioObjectStorage у провайдера S3
PUBLIC_GA_ID / PUBLIC_YM_ID Google Analytics 4 / Yandex.Metrika ID на marketing-сайте (Sprint 20) Astro BaseLayout.astro см. docs/analytics.md

__ (двойное подчёркивание) — разделитель секций конфигурации .NET (OpenIddict__IssuerOpenIddict:Issuer).

Где ещё живут секреты

  • SMTP (отправка писем)НЕ в env. Хранятся в БД (platform_settings), правятся из SuperAdmin-консоли (раздел «Платформа → SMTP»). Перечитываются на каждой отправке без рестарта (см. MailKitEmailSender).
  • Сертификаты OpenIddict — PFX в volume api-data (/app/App_Data). Генерируются self-signed при отсутствии. Можно принести свои — см. openiddict-keys.md.
  • Учётки БД/Forgejo на сервере — вне репозитория (см. приватные заметки оператора).

Ротация

Секрет Как ротировать Влияние
POSTGRES_PASSWORD ALTER USER food_market PASSWORD '…', обновить .env, docker compose up -d рестарт API
OpenIddict-сертификаты заменить/удалить PFX, рестарт API все токены инвалидируются — повторный логин
SMTP-пароль через SuperAdmin-консоль без рестарта

Гигиена

  • deploy/.env — права 600, владелец — пользователь деплоя.
  • Не логировать значения секретов. Serilog настроен без дампа окружения.
  • При утечке — ротировать затронутый секрет (таблица выше) и пересоздать токены.
  • Проверка, что секреты не утекли в git: git ls-files | grep -E '\.env$' должен быть пуст.