Настройки, environment и секреты
Оглавление · Далее: деплой
Откуда берутся значения
| Режим | Источник | Как получает процесс |
|---|---|---|
| Dev Next.js | Корневой .env | process.loadEnvFile в next.config |
| Dev воркер | Корневой .env | Node --env-file-if-exists |
| Локальный Docker | Корневой .env | Compose подставляет значения в environment |
| Production | /opt/gheilt/.env | Явный --env-file в release script |
| Образы релиза | releases/<sha>/release.env | Второй --env-file; хранит только image references |
Compose .env используется для интерполяции YAML. Он не попадает целиком внутрь
контейнера автоматически: туда передаются перечисленные environment-поля.
Именно поэтому имена внешних настроек Strapi отличаются от внутренних.
Не копируйте production .env на учебный компьютер. Локальные секреты генерируются
отдельно. Не вводите реальные значения в документацию или примеры запросов.
Домены и порты
| Переменная | Локально | Production |
|---|---|---|
SITE_ADDRESS | http://localhost | gheilt.mxsource.xyz |
CMS_ADDRESS | http://cms.localhost | cms.gheilt.mxsource.xyz |
HTTP_PORT | 8080 | 80 |
HTTPS_PORT | 8443 | 443 |
Адрес без http:// в production Caddyfile включает автоматическое HTTPS.
Domain/TLS не настраиваются одним VPS_HOST: шаблон production и health URL
содержат текущие домены. Для переноса на другой домен измените все связанные места.
PostgreSQL и CMS
| Внешняя переменная | Куда передаётся | Назначение |
|---|---|---|
POSTGRES_PASSWORD | PostgreSQL | Пароль пользователя gheilt |
STRAPI_DB_PASSWORD | PG init и Strapi DATABASE_PASSWORD | Пароль пользователя strapi |
STRAPI_APP_KEYS | Strapi APP_KEYS | Ключи приложения, четыре строки через запятую |
STRAPI_ADMIN_JWT_SECRET | ADMIN_JWT_SECRET | Подпись токенов администратора |
STRAPI_API_TOKEN_SALT | API_TOKEN_SALT | Salt API-токенов CMS |
STRAPI_TRANSFER_TOKEN_SALT | TRANSFER_TOKEN_SALT | Salt transfer-токенов |
STRAPI_JWT_SECRET | JWT_SECRET | JWT users-permissions |
STRAPI_ENCRYPTION_KEY | ENCRYPTION_KEY | Шифрование данных CMS |
STRAPI_WEBHOOK_SECRET | Web и настройка webhook в CMS | Bearer-секрет инвалидирования кеша |
Compose фиксирует Strapi DATABASE_CLIENT=postgres, DATABASE_HOST=postgres,
DATABASE_PORT=5432, DATABASE_NAME=strapi, DATABASE_USERNAME=strapi.
У стандартного config есть ветки SQLite/MySQL, но репозиторий не устанавливает
их драйверы как используемую конфигурацию. Переключение client без других изменений
не является готовым альтернативным режимом.
Production-доступ к панелям
| Переменная | Смысл |
|---|---|
STRAPI_ADMIN_EMAIL | Сохранённый email администратора тестовой CMS |
STRAPI_ADMIN_PASSWORD | Сохранённый пароль администратора тестовой CMS |
Вход выполняется через собственную форму приложения и его сессию. Внешний
Basic Auth отключён: он конфликтует с Bearer-заголовком запросов Strapi.
Администратора новой Strapi создайте через admin:create-user до открытия CMS
наружу. Генератор окружения его не создаёт. STRAPI_ADMIN_* в таблице — запись
выданных данных, приложение не создаёт и не меняет пользователя по этим значениям.
Данные текущей тестовой инсталляции сохранены в .local/production-access.txt.
Старые ADMIN_ACCESS_* могут оставаться в серверном .env, но больше не используются.
Ротация
Webhook-секрет
Обновите STRAPI_WEBHOOK_SECRET в environment web и Bearer-заголовке
webhook Strapi. Пересоздайте web: restart не перечитывает environment.
Пароли баз и ключи CMS
Для пароля базы нужны и ALTER ROLE, и новое значение окружения потребителя.
Редактирование .env не меняет существующую роль PG. Сохраняйте возможность отката
и не печатайте SQL с паролем в общие логи.
Ротация signing/encryption keys может инвалидировать сессии/токены или сделать
сохранённые зашифрованные данные недоступными. Она требует отдельного плана,
резервной копии и проверки, а не повторного pnpm setup.
Что нельзя коммитить и выводить
.env, production-доступы и приватный deployment key игнорируются Git.
Локальные файлы с доступами могут находиться в .local/, но наличие этого каталога
не является требованием запуска проекта. Новая рабочая копия их не содержит.
Для валидации Compose используйте config --quiet. Обычный docker compose config
и docker inspect environment могут вывести секреты. Логи webhook могут
содержать запись CMS целиком. Перед публикацией диагностических данных их нужно
очистить от секретов и персональных данных.
Где смотреть код
Локальный шаблон, setup, production setup, Compose, Strapi admin config.
Переменные Garage/S3
| Переменная | Владелец и назначение |
|---|---|
GARAGE_RPC_SECRET | Garage, 32-byte hex; генерируется setup один раз |
S3_ACCESS_KEY_ID | Garage/CMS, key ID с prefix GK |
S3_SECRET_ACCESS_KEY | Garage/CMS, secret key |
S3_ENDPOINT | Host dev 127.0.0.1:3900; внутри Docker Compose принудительно s3:3900 |
S3_REGION | garage |
S3_BUCKET | media; текущая Compose конфигурация фиксирует это имя |
S3_PUBLIC_URL | Адрес файлов для браузера: local media.localhost:8080, VPS https://media.gheilt.mxsource.xyz |
MEDIA_ADDRESS | Адрес нового virtual host Caddy |
Setup дополняет существующую .env недостающими S3-настройками и сохраняет старые
секреты. Смена HTTP_PORT требует согласовать S3_PUBLIC_URL. Автоматическое
создание key/bucket при первом старте не заменяет процедуру ротации действующих ключей.
Garage README.
Серверное чтение CMS
| Переменная | Host dev | Docker |
|---|---|---|
| STRAPI_INTERNAL_URL | http://127.0.0.1:1337 | http://strapi:1337 |
| STRAPI_READ_TOKEN | read-only Content API token | только server env |
| CMS_MEDIA_PUBLIC_URL | http://media.localhost:8080 | настроенный public origin |
| S3_WEBSITE_INTERNAL_URL | http://127.0.0.1:3902 | http://s3:3902 |
| CONTENT_READY | false до первого импорта | production gate |
Эти значения не NEXT_PUBLIC. CMS token не является admin token, webhook secret или S3 key. cms:token восстанавливает тот же encrypted token, проверяет service hash и не ротирует его при обычном deploy. После изменения server env контейнер нужно пересоздать; restart сохраняет прежнюю конфигурацию. Public media origin проверяется адаптером: неожиданный внешний hostname не разрешён даже при правильном имени файла.
Наблюдаемость
Самостоятельный стек читает /opt/gheilt/observability/.env. Генератор
scripts/deploy/setup-observability-env.py создаёт недостающие значения один раз,
сохраняет имеющиеся и выставляет mode 0600. Значения не входят в Git.
| Переменная | Назначение |
|---|---|
UMAMI_ADMIN_PASSWORD | Проверяемый пароль администратора Umami |
GLITCHTIP_ADMIN_PASSWORD | Проверяемый пароль администратора GlitchTip |
UMAMI_DB_PASSWORD | Отдельная роль PostgreSQL umami |
UMAMI_APP_SECRET | Подпись данных Umami |
UMAMI_TWO_FACTOR_KEY | Шифрование настроек двухфакторного входа Umami |
GLITCHTIP_DB_PASSWORD | Отдельная роль PostgreSQL glitchtip |
GLITCHTIP_SECRET_KEY | Подпись сессий GlitchTip |
GRAFANA_ADMIN_USER, GRAFANA_ADMIN_PASSWORD | Первоначальный администратор Grafana |
Первоначальный пароль Grafana действует при создании её базы: изменение env не является процедурой ротации уже созданного аккаунта. Базы Umami и GlitchTip не создаются повторным запуском старого PostgreSQL init script: для этого есть проверяющий конфликты provisioning.
Публичные параметры web задаются GitHub variables: NEXT_PUBLIC_UMAMI_URL,
NEXT_PUBLIC_UMAMI_WEBSITE_ID, NEXT_PUBLIC_GLITCHTIP_DSN. NEXT_PUBLIC_APP_RELEASE
workflow устанавливает из Git SHA. Они встраиваются в web-образ при сборке.
GLITCHTIP_DSN находится в /opt/gheilt/.env и передаётся серверному процессу.
Пустые параметры отключают соответствующее подключение.
Для source maps GitHub variables SENTRY_URL, SENTRY_ORG, SENTRY_PROJECT
указывают только наш приёмник; GitHub secret SENTRY_AUTH_TOKEN передаётся через
BuildKit secret. Не копируйте его в Compose environment. При отсутствии токена
загрузка maps отключена; это не считается проверенной расшифровкой стека.
Telegram не требует настроек production: он оставлен упражнением.