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>
53 lines
3.9 KiB
Markdown
53 lines
3.9 KiB
Markdown
# Секреты и переменные окружения
|
||
|
||
Все секреты задаются через `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$'` должен быть пуст.
|