Files
chatballs/env.example
T
Andrey c9ac556ae4 📝 docs(cutover): add C04–C07 production cutover runbook and config
RUNBOOK-CUSTOCRM-0002 covers the in-place cutover of the existing Edevs
production DB onto C04–C07: RLS runtime roles, S3 tenant storage, PlanVersion
publication, STARTUP subscription and domain cutover. Owner decisions recorded
2026-07-16 (VK Cloud S3, smtp.mail.ru, web/TURN IPs, turn.custocrm.ru realm).

- INVENTORY-0009: mark storage cycle and membership-count debt resolved
- env.example: document C04 RLS roles and S3 storage backend
- .gitignore: ignore instance/ and *.cutover-draft (production secrets)
2026-07-16 18:49:56 +03:00

116 lines
4.6 KiB
Plaintext

# Instance configuration CustoCRM (ADR-HUB-0028 / SPEC-HUB-0019 §7.2).
# Поставляется в release bundle. Копируется в instance/.env и редактируется
# под конкретный экземпляр. Image references НЕ здесь — они в release.env (CI).
# Здесь нет initial OWNER password и нет demo-флага (см. SPEC §7.2 запреты).
COMPOSE_PROJECT_NAME=custocrm
# --- Instance identity / gateway ---
CUSTOCRM_APP_DOMAIN=app.example.com
CUSTOCRM_PLATFORM_DOMAIN=platform.example.com
CUSTOCRM_ACME_EMAIL=admin@example.com
CUSTOCRM_ADMIN_PORT=18001
# IP web-gateway. Оставьте 0.0.0.0 без profile calls. Для calls укажите
# отдельный публичный IP, отличный от HUB_TURN_LISTENING_IP.
CUSTOCRM_WEB_LISTENING_IP=0.0.0.0
# Опциональные profiles: calls (coturn), и в будущем voice.
# COMPOSE_PROFILES=calls
# --- Django core ---
HUB_ENV=production
HUB_DEBUG=false
HUB_SECRET_KEY=change-me-long-random-secret
# Шифрование секретов в БД (Fernet-ключ): Fernet.generate_key().
HUB_FIELD_ENCRYPTION_KEY=
CUSTOCRM_APP_ALLOWED_HOSTS=app.example.com
CUSTOCRM_APP_CSRF_TRUSTED_ORIGINS=https://app.example.com
CUSTOCRM_PLATFORM_ALLOWED_HOSTS=platform.example.com
CUSTOCRM_PLATFORM_CSRF_TRUSTED_ORIGINS=https://platform.example.com
HUB_CORS_ALLOWED_ORIGINS=https://app.example.com
INTERNAL_UI_BASE_URL=https://app.example.com
# Host headers для Docker healthchecks должны входить в surface ALLOWED_HOSTS.
CUSTOCRM_APP_HEALTHCHECK_HOST=app.example.com
CUSTOCRM_PLATFORM_HEALTHCHECK_HOST=platform.example.com
# Транспортная безопасность (вне HUB_DEBUG включается автоматически).
HUB_COOKIE_SECURE=true
HUB_SSL_REDIRECT=true
HUB_HSTS_SECONDS=31536000
HUB_COOKIE_SAMESITE=Lax
# --- PostgreSQL / Redis ---
# C04 RLS: три раздельные DB-roles (app/platform/migration). Runtime-роли app и
# platform — NOBYPASSRLS, не владельцы tenant-tables; миграции выполняются под
# migration-role (через HUB_DB_ROLE=migration в compose). Пароли СГЕНЕРИРОВАТЬ,
# не использовать значения по умолчанию. См. deploy/postgres/init-runtime-roles.sh.
POSTGRES_DB=custocrm
POSTGRES_USER=custocrm
POSTGRES_PASSWORD=change-me-db-password
POSTGRES_APP_USER=custocrm_app
POSTGRES_APP_PASSWORD=change-me-app-db-password
POSTGRES_PLATFORM_USER=custocrm_platform
POSTGRES_PLATFORM_PASSWORD=change-me-platform-db-password
POSTGRES_MIGRATION_USER=custocrm_migration
POSTGRES_MIGRATION_PASSWORD=change-me-migration-db-password
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
REDIS_URL=redis://redis:6379/0
# --- Tenant-owned object storage (C04) ---
# Production ТРЕБУЕТ S3-compatible backend (settings hard-fails без него вне
# debug/testing). Ключи хранятся как organizations/{organization_public_id}/...
# HUB_S3_BUCKET обязателен; endpoint/region/credentials — для провайдера
# (Yandex Object Storage, MinIO, AWS S3 и т.п.).
HUB_STORAGE_BACKEND=s3
HUB_S3_BUCKET=
HUB_S3_ENDPOINT_URL=
HUB_S3_REGION=
HUB_S3_ACCESS_KEY=
HUB_S3_SECRET_KEY=
HUB_S3_ADDRESSING_STYLE=path
HUB_S3_URL_EXPIRY_SECONDS=900
# --- P2P calls (profile calls) ---
# Включается только при COMPOSE_PROFILES=calls. Параметры coturn обязательны,
# если profile активен.
HUB_CALL_INVITE_TTL_SECONDS=300
HUB_CALL_ACCESS_TTL_SECONDS=3600
HUB_CALL_CONNECT_GRACE_SECONDS=120
HUB_CALL_RECONNECT_GRACE_SECONDS=60
HUB_CALL_STUN_URLS=
# Публичные TURN endpoints (через запятую). Пусто -> только STUN/direct.
HUB_CALL_TURN_URLS=
# Общий static-auth-secret между backend и coturn.
HUB_CALL_TURN_SECRET=
HUB_CALL_TURN_TTL_SECONDS=3600
HUB_CALL_TURN_REALM=app.example.com
# Публичный IP coturn listener/relay. ОТДЕЛЬНЫЙ от web IP, чтобы TURN занял 443.
HUB_TURN_EXTERNAL_IP=
HUB_TURN_LISTENING_IP=
HUB_TURN_LISTENING_PORT=3478
HUB_TURN_TLS_PORT=443
HUB_TURN_MIN_PORT=49160
HUB_TURN_MAX_PORT=49200
# --- AI provider ---
HUB_AI_PROVIDER=openrouter
HUB_OPENROUTER_API_KEY=
HUB_OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
HUB_AI_REQUEST_TIMEOUT=30
HUB_AI_MAX_RETRIES=2
HUB_AI_GLOBAL_DAILY_COST_LIMIT_MICROS=0
# --- Email ---
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=
EMAIL_PORT=587
EMAIL_HOST_USER=
EMAIL_HOST_PASSWORD=
EMAIL_USE_TLS=true
DEFAULT_FROM_EMAIL=CustoCRM <no-reply@example.com>
# --- Gunicorn ---
HUB_GUNICORN_WORKERS=3
HUB_GUNICORN_TIMEOUT=60