food-market/docs/secrets.md
nns 45326281f9 docs(deploy): .env.example + secrets.md, проброс OpenIddict env в compose (P0-8)
deploy/.env.example — все required/опц. переменные (POSTGRES_PASSWORD, REGISTRY,
*_TAG, OPENIDDICT_ISSUER/CERT_PASSWORD, FM_* бэкапа, Cors/RateLimiting/MoySklad).
docs/secrets.md — таблица переменных, где живут секреты (SMTP в БД, сертификаты в
volume), ротация, гигиена. compose: api получает OpenIddict__Issuer (за прокси
обязателен) и OpenIddict__CertPassword из .env. compose config валиден.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 02:51:13 +05:00

53 lines
3.9 KiB
Markdown
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.

# Секреты и переменные окружения
Все секреты задаются через `deploy/.env``.gitignore`, **не коммитится**).
Шаблон со всеми переменными — `deploy/.env.example`. docker-compose читает `.env`
автоматически из каталога запуска (`deploy/`).
```bash
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` |
> `__` (двойное подчёркивание) — разделитель секций конфигурации .NET
> (`OpenIddict__Issuer` ≡ `OpenIddict:Issuer`).
## Где ещё живут секреты
- **SMTP (отправка писем)** — НЕ в env. Хранятся в БД (`platform_settings`),
правятся из SuperAdmin-консоли (раздел «Платформа → SMTP»). Перечитываются на
каждой отправке без рестарта (см. `MailKitEmailSender`).
- **Сертификаты OpenIddict** — PFX в volume `api-data` (`/app/App_Data`). Генерируются
self-signed при отсутствии. Можно принести свои — см. [openiddict-keys.md](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$'` должен быть пуст.