Перейти к основному содержимому

Переменные окружения

Полный список с рабочими локальными значениями — .env.example в корне. Здесь разбор по группам: что обязательно, что обязательно сменить перед публикацией наружу.

Два файла, а не один

ФайлКто читает
.env в корнеDocker Compose и все сервисы стека
apps/backend/.envMedusa 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_SECUREfalse только пока перед стеком нет TLS. Появился HTTPS-прокси — ставьте true
MEDUSA_ADMIN_ONBOARDING_TYPEskip — не показывать мастер первого запуска
YOOKASSA_WEBHOOK_TRUSTED_PROXY_CIDRSCIDR прокси, которым разрешено подставлять 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 не хранятся. Их вводят в админке, они шифруются и лежат в базе. В окружении есть только ключи шифрования.