Skip to content

Окружения

Руководство по настройке и управлению различными окружениями для Integ API.

Runtime Environment Injection

Integ API использует runtime injection переменных окружения через Doppler. Это означает:

  • Переменные читаются из process.env при запуске приложения
  • Один Docker образ для всех окружений
  • Переключение окружения через DOPPLER_CONFIG

Обзор окружений

ОкружениеDOPPLER_CONFIGMODEНазначение
LocallocallocalЛокальная разработка
DevelopmentdevdevDev сервер
ProductionprodprodProduction сервер

Структура environment.ts

Файл src/environments/environment.ts читает переменные из process.env в runtime:

typescript
export const environment = {
	port: getEnvNumber("PORT", 3000),
	mode: getEnv("MODE", "local") as "local" | "dev" | "prod",
	database: {
		host: getEnv("POSTGRES_HOST"),
		port: getEnvNumber("POSTGRES_PORT", 5432),
		username: getEnv("POSTGRES_USERNAME"),
		password: getEnv("POSTGRES_PASSWORD"),
		name: getEnv("POSTGRES_NAME"),
		ssl: Boolean(process.env.POSTGRES_CERTIFICATE) || Boolean(process.env.POSTGRES_CERTIFICATE_BASE64)
	},
	jwt: {
		secret: getEnv("JWT_SECRET")
	},
	crypto: {
		masterKey: getEnv("CRYPTO_KEY"),
		salt: getEnv("CRYPTO_SALT")
	}
	// ... остальные поля
};

Local Environment

Запуск с дефолтами

Для быстрого старта можно запустить без Doppler — используются дефолтные значения:

bash
# Запуск PostgreSQL
npm run docker:up

# Запуск приложения (дефолтные значения)
npm start

Запуск с Doppler

bash
# Установка Doppler config
doppler setup --config local

# Запуск с injection
doppler run --config local -- npm start

Переменные для local

ПеременнаяЗначениеОписание
MODElocalРежим окружения
PORT3005Порт сервера
POSTGRES_HOSTlocalhostХост БД (Docker)
POSTGRES_PORT5435Порт БД
POSTGRES_USERNAME-Пользователь
POSTGRES_PASSWORD-Пароль
POSTGRES_NAME-Имя БД
POSTGRES_CERTIFICATEfalseSSL отключен
INTEG_CORE_URLhttp://localhost:3010URL integ-core
INNGEST_URLhttp://localhost:8288URL Inngest

Особенности local

  • ✅ Hot reload включен
  • ✅ PostgreSQL в Docker
  • ✅ LocalSqlite для эмуляции D1/KV
  • ✅ Дефолтные значения для быстрого старта
  • ❌ Cloudflare API не используется

Development Environment

Запуск

bash
# С Doppler
doppler run --config dev -- npm run start:prod

# Или в Docker
docker run -e DOPPLER_TOKEN=xxx -e DOPPLER_CONFIG=dev ghcr.io/happ-ai/integ-api:dev

Переменные для dev

ПеременнаяОписание
MODEdev
POSTGRES_HOSTManaged DB host
POSTGRES_CERTIFICATEtrue (SSL обязателен)
POSTGRES_CERTIFICATE_BASE64CA сертификат в base64
CLOUDFLARE_ACCOUNT_IDAccount ID
CLOUDFLARE_WORKERS_API_TOKENAPI Token
CLOUDFLARE_INTEG_DB_IDDev D1 ID
CLOUDFLARE_INTEG_KV_IDDev KV ID

Особенности dev

  • ✅ SSL для БД
  • ✅ Cloudflare D1/KV в dev режиме
  • ✅ Отдельные ресурсы от production
  • ⚠️ Тестовые данные

Production Environment

Запуск

bash
# В Docker на сервере
docker run -e DOPPLER_TOKEN=xxx -e DOPPLER_CONFIG=prod ghcr.io/happ-ai/integ-api:latest

Переменные для prod

ПеременнаяОписание
MODEprod
POSTGRES_HOSTProduction DB host
POSTGRES_CERTIFICATEtrue
POSTGRES_CERTIFICATE_BASE64Production CA сертификат
JWT_SECRETСильный секрет (64+ символов)
CRYPTO_KEYСильный ключ (64+ символов)
CLOUDFLARE_INTEG_DB_IDProduction D1 ID
CLOUDFLARE_INTEG_KV_IDProduction KV ID

Особенности prod

  • ✅ SSL обязателен
  • ✅ Сильные секреты
  • ✅ Managed database с backups
  • ✅ Production Cloudflare ресурсы
  • ❌ Debug режимы отключены

Полный список переменных

Приложение

ПеременнаяТипDefaultОписание
PORTnumber3000Порт сервера
MODEstringlocalРежим (local/dev/prod)

База данных

ПеременнаяТипDefaultОписание
POSTGRES_HOSTstring-Хост
POSTGRES_PORTnumber5432Порт
POSTGRES_USERNAMEstring-Пользователь
POSTGRES_PASSWORDstring-Пароль
POSTGRES_NAMEstring-Имя БД
POSTGRES_CERTIFICATEstring-Использовать SSL
POSTGRES_CERTIFICATE_BASE64string-CA сертификат base64

Безопасность

ПеременнаяТипDefaultОписание
JWT_SECRETstring-Секрет JWT
CRYPTO_KEYstring-Ключ шифрования
CRYPTO_SALTstring-Соль шифрования

Администратор

ПеременнаяТипDefaultОписание
ADMIN_EMAILstring-Email админа
ADMIN_PASSWORDstring-Пароль админа

Scalar (API Docs)

ПеременнаяТипDefaultОписание
SWAGGER_INTERNAL_USERNAMEstringadminЛогин для внутренней доки
SWAGGER_INTERNAL_PASSWORDstringadminПароль для внутренней доки

Cloudflare

ПеременнаяТипDefaultОписание
CLOUDFLARE_ACCOUNT_IDstring-Account ID
CLOUDFLARE_WORKERS_API_TOKENstring-API Token
CLOUDFLARE_INTEG_DB_IDstring-D1 Database ID
CLOUDFLARE_INTEG_KV_IDstring-KV Namespace ID
CLOUDFLARE_LOCAL_DATA_PATHstring../integ-core/data/miniflareПуть к miniflare

Сервисы

ПеременнаяТипDefaultОписание
INTEG_CORE_URLstringhttp://localhost:3010URL integ-core
INNGEST_URLstringhttp://localhost:8288URL Inngest
INNGEST_SIGNING_KEYstring-Ключ Inngest

AI/Testing

ПеременнаяТипDefaultОписание
CLAUDE_API_KEYstring-Claude API ключ
ELEVENLABS_API_KEYstring-ElevenLabs ключ
ELEVENLABS_API_URLstringhttps://api.elevenlabs.io/v1ElevenLabs URL

SSL сертификат для БД

Для dev/prod с managed database нужен CA сертификат:

Конвертация в base64

bash
# Закодировать сертификат
cat ca-certificate.crt | base64 -w 0 > cert-base64.txt

# Добавить в Doppler
doppler secrets set POSTGRES_CERTIFICATE_BASE64 "$(cat cert-base64.txt)" --config dev

Как это работает

typescript
// data-source.ts
function getCertificate(): string | undefined {
	const base64Cert = process.env.POSTGRES_CERTIFICATE_BASE64;
	if (!base64Cert) return undefined;
	return Buffer.from(base64Cert, "base64").toString("utf-8");
}

Переключение окружений

Локально

bash
# Local (с дефолтами)
npm start

# Local (с Doppler)
doppler run --config local -- npm start

# Dev
doppler run --config dev -- npm start

# Prod
doppler run --config prod -- npm start

В Docker

bash
# Local
docker run -e DOPPLER_TOKEN=xxx -e DOPPLER_CONFIG=local image

# Dev
docker run -e DOPPLER_TOKEN=xxx -e DOPPLER_CONFIG=dev image

# Prod
docker run -e DOPPLER_TOKEN=xxx -e DOPPLER_CONFIG=prod image

Безопасность

Генерация секретов

bash
# Для dev (32 символа)
openssl rand -hex 32

# Для prod (64 символа)
openssl rand -hex 64

Проверка что секреты разные

bash
doppler secrets get JWT_SECRET --config local --plain
doppler secrets get JWT_SECRET --config dev --plain
doppler secrets get JWT_SECRET --config prod --plain
# Они должны быть РАЗНЫМИ!

Best Practices

DO:

  • Используйте разные секреты для каждого окружения
  • Используйте разные D1/KV для dev и prod
  • Генерируйте сильные пароли (32+ символов)
  • Включите SSL в dev и prod
  • Храните сертификаты в base64

DON'T:

  • Не используйте одинаковые секреты
  • Не отключайте SSL в prod
  • Не используйте production ресурсы для dev
  • Не коммитьте секреты в git

Следующие шаги