Переменные окружения
Полный список с рабочими локальными значениями — .env.example в корне. Здесь разбор по
группам: что обязательно, что обязательно сменить перед публикацией наружу.
Два файла, а не один
| Файл | Кто читает |
|---|---|
.env в корне | Docker Compose и все сервисы стека |
apps/backend/.env | Medusa CLI с хоста (db:migrate, medusa user) |
Значения в них должны совпадать — как минимум DATABASE_URL и MEDUSA_FF_RBAC. Расхождение
даёт падения, которые выглядят как что угодно, только не как ошибка конфигурации.
Секреты: сменить обязательно
Значения из .env.example рабочие только локально. Перед выкладкой наружу генерируйте
независимые случайные значения (openssl rand -base64 32) для каждого окружения:
JWT_SECRET, COOKIE_SECRET, AUTH_MFA_ENCRYPTION_KEY, MOYSKLAD_ENCRYPTION_KEY,
PAYMENT_PROVIDER_CONFIG_ENCRYPTION_KEY, SHIPPING_PROVIDER_CONFIG_ENCRYPTION_KEY,
POSTGRES_PASSWORD, MINIO_ROOT_PASSWORD, S3-ключи, все STRAPI_* секреты,
MEILI_MASTER_KEY, ADMIN_PASSWORD.
:::danger Ключи шифрования нельзя менять после запуска
MOYSKLAD_ENCRYPTION_KEY, PAYMENT_PROVIDER_CONFIG_ENCRYPTION_KEY и
SHIPPING_PROVIDER_CONFIG_ENCRYPTION_KEY шифруют реквизиты интеграций, уже лежащие в базе.
Смена ключа делает сохранённые реквизиты нечитаемыми — их придётся вводить заново.
:::
Адреса и CORS
MEDUSA_BACKEND_URL, STOREFRONT_URL, STOREFRONT_PUBLIC_URL, STORE_CORS, ADMIN_CORS,
AUTH_CORS.
STORE_CORS сверяет строку точно: http://localhost:8000 и http://127.0.0.1:8000 — разные
источники.
Флаги поведения
| Переменная | Смысл |
|---|---|
MEDUSA_FF_RBAC | Роли и права в админке. Должна быть true в обоих env-файлах |
SESSION_COOKIE_SECURE | false только пока перед стеком нет TLS. Появился HTTPS-прокси — ставьте true |
MEDUSA_ADMIN_ONBOARDING_TYPE | skip — не показывать мастер первого запуска |
YOOKASSA_WEBHOOK_TRUSTED_PROXY_CIDRS | CIDR прокси, которым разрешено подставлять X-Forwarded-For в вебхуках ЮKassa. Пусто, если backend смотрит наружу напрямую |
:::warning SESSION_COOKIE_SECURE=false — осознанный компромисс
Medusa форсирует Secure для сессионной cookie покупателя при NODE_ENV=production. Без TLS
браузер такую cookie не сохранит, и вход в личный кабинет молча сломается. Compose сам TLS не
терминирует, поэтому по умолчанию false. Как только появился nginx/Caddy/облачный балансировщик
с HTTPS — переключите на true.
:::
Первый администратор
ADMIN_EMAIL / ADMIN_PASSWORD — из них контейнер backend-init создаёт администратора при
первом docker compose up. Значения по умолчанию (admin@test.com / supersecret) публичны:
это дефолт из репозитория, а не пароль. Меняйте до того, как стенд станет доступен снаружи.
Почта
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROM.
Ошибки отправки логируются и глотаются: недоступный SMTP никогда не ломает сценарий, который письмо породил. Обратная сторона — молчаливое отсутствие писем выглядит как «всё хорошо».
Хранилище и поиск
S3/MinIO: S3_BUCKET, S3_FILE_URL, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY,
S3_REGION, S3_FORCE_PATH_STYLE. У Strapi отдельный бакет и отдельные ключи
(STRAPI_S3_*) с доступом только к нему — так загрузки редактора не могут задеть изображения
товаров.
Meilisearch: MEILI_MASTER_KEY, MEILISEARCH_HOST, MEILISEARCH_API_KEY.
Связь с CMS
STRAPI_INTERNAL_URL, STRAPI_READ_TOKEN, STRAPI_WEBHOOK_SECRET,
CMS_PREVIEW_INTERNAL_SECRET, CMS_PREVIEW_SIGNING_SECRET — см.
Контент из Strapi на витрину.
Чего в переменных нет
Реквизиты МойСклад, ЮKassa, ApiShip и СДЭК в .env не хранятся. Их вводят в админке, они
шифруются и лежат в базе. В окружении есть только ключи шифрования.