Учебное руководство
Главы руководства
На этой странице

Настройки, environment и секреты

Оглавление · Далее: деплой

Откуда берутся значения

РежимИсточникКак получает процесс
Dev Next.jsКорневой .envprocess.loadEnvFile в next.config
Dev воркерКорневой .envNode --env-file-if-exists
Локальный DockerКорневой .envCompose подставляет значения в 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_ADDRESShttp://localhostgheilt.mxsource.xyz
CMS_ADDRESShttp://cms.localhostcms.gheilt.mxsource.xyz
HATCHET_ADDRESSНе нужна базовому Composehatchet.gheilt.mxsource.xyz
HTTP_PORT808080
HTTPS_PORT8443443

Адрес без http:// в production Caddyfile включает автоматическое HTTPS. Domain/TLS не настраиваются одним VPS_HOST: шаблон production и health URL содержат текущие домены. Для переноса на другой домен измените все связанные места.

PostgreSQL и CMS

Внешняя переменнаяКуда передаётсяНазначение
POSTGRES_PASSWORDPostgreSQLПароль пользователя gheilt
STRAPI_DB_PASSWORDPG init и Strapi DATABASE_PASSWORDПароль пользователя strapi
HATCHET_DB_PASSWORDPG init и Hatchet DATABASE_URLПароль пользователя hatchet
STRAPI_APP_KEYSStrapi APP_KEYSКлючи приложения, четыре строки через запятую
STRAPI_ADMIN_JWT_SECRETADMIN_JWT_SECRETПодпись токенов администратора
STRAPI_API_TOKEN_SALTAPI_TOKEN_SALTSalt API-токенов CMS
STRAPI_TRANSFER_TOKEN_SALTTRANSFER_TOKEN_SALTSalt transfer-токенов
STRAPI_JWT_SECRETJWT_SECRETJWT users-permissions
STRAPI_ENCRYPTION_KEYENCRYPTION_KEYШифрование данных CMS
STRAPI_WEBHOOK_SECRETWeb и настройка webhook в CMSBearer-секрет инвалидирования кеша

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_PORT127.0.0.1:7070hatchet:7070
HATCHET_CLIENT_API_URLhttp://127.0.0.1:8888http://hatchet:8888
HATCHET_CLIENT_TLS_STRATEGYnonenone

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_EMAILEmail администратора 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_SECRETGarage, 32-byte hex; генерируется setup один раз
S3_ACCESS_KEY_IDGarage/CMS, key ID с prefix GK
S3_SECRET_ACCESS_KEYGarage/CMS, secret key
S3_ENDPOINTHost dev 127.0.0.1:3900; внутри Docker Compose принудительно s3:3900
S3_REGIONgarage
S3_BUCKETmedia; текущая 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 devDocker
STRAPI_INTERNAL_URLhttp://127.0.0.1:1337http://strapi:1337
STRAPI_READ_TOKENread-only Content API tokenтолько server env
CMS_MEDIA_PUBLIC_URLhttp://media.localhost:8080настроенный public origin
S3_WEBSITE_INTERNAL_URLhttp://127.0.0.1:3902http://s3:3902
CONTENT_READYfalse до первого импорта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 не разрешён даже при правильном имени файла.