Настройки, 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 |
HATCHET_ADDRESS | Не нужна базовому Compose | hatchet.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 |
HATCHET_DB_PASSWORD | PG init и Hatchet DATABASE_URL | Пароль пользователя hatchet |
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 без других изменений
не является готовым альтернативным режимом.
Hatchet client
| Переменная | Dev на компьютере | Контейнер |
|---|---|---|
HATCHET_CLIENT_TOKEN | Из .env | Из общего .env через Compose |
HATCHET_CLIENT_HOST_PORT | 127.0.0.1:7070 | hatchet:7070 |
HATCHET_CLIENT_API_URL | http://127.0.0.1:8888 | http://hatchet:8888 |
HATCHET_CLIENT_TLS_STRATEGY | none | none |
gRPC внутри сети работает без TLS. Внешние HTTP-панели production защищены TLS Caddy. Это разные соединения. Не публикуйте gRPC в интернет без отдельного проектирования аутентификации и TLS.
Hatchet server получает SERVER_MSGQUEUE_KIND=postgres, адреса gRPC bind/broadcast
и DATABASE_URL. Production дополнительно задаёт внешний URL, cookie domain,
secure-cookie режим и запрещает signup. Node-клиенты продолжают обращаться к
внутренним адресам Docker.
Production-доступ к панелям
| Переменная | Смысл |
|---|---|
HATCHET_ADMIN_EMAIL | Email администратора Hatchet |
HATCHET_ADMIN_PASSWORD | Его начальный пароль, с требованиями сложности |
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, но больше не используются.
Python setup пишет production-значения в одинарных кавычках для буквального
чтения Compose. Существующие секреты .env сохраняются.
Смена значения HATCHET_ADMIN_PASSWORD после создания пользователя не является
штатной сменой пароля учётной записи: seed использует уже существующего пользователя.
Меняйте пароль средствами самого приложения.
Ротация
Локальный токен
pnpm infra:token --rotate
После этого перезапустите dev-процессы или пересоздайте Docker web/functions.
docker compose restart не перечитает новые environment-значения; используйте up:
docker compose --profile app up -d --no-build web functions
Стандартный срок токена CLI — 90 дней. Production helper проверяет tenant токена,
но не проверяет срок exp: истёкший токен нужного tenant сам по себе не обновится.
Создайте новый через панель/API Hatchet, безопасно обновите production .env
и повторите деплой. Проверка срока и автоматическая ротация — будущая доработка.
Webhook-секрет
Обновите его согласованно в web environment и настройке Strapi webhook. Пока одна сторона использует старое значение, запросы будут получать 401. Ротация этого секрета не меняет токен Hatchet.
Пароли баз и ключи 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 не разрешён даже при правильном имени файла.