Files
microdao-daarion/docs/DEPLOY_ENV_CONFIG.md
2026-02-16 02:53:53 -08:00

8.9 KiB
Raw Blame History

Environment Configuration для DAARION Production

Важливо: Ніколи не комітити реальні секрети в Git!


📂 Структура ENV файлів

/opt/daarion/
├── .env                    # Головний файл (використовується docker-compose)
├── env/
│   ├── app.env            # Загальні змінні застосунку
│   ├── db.env             # PostgreSQL
│   ├── redis.env          # Redis
│   ├── nats.env           # NATS
│   ├── agents.env         # Agents Service
│   ├── city.env           # City Service
│   ├── secondme.env       # Second Me Service
│   └── monitoring.env     # Prometheus/Grafana
└── .env.example           # Шаблон (в Git)

🔑 Генерація секретів

# JWT Secret (64 символи)
openssl rand -hex 32

# Encryption Key (32 символи)
openssl rand -hex 16

# Database Password
openssl rand -base64 32 | tr -d "=+/" | cut -c1-25

# Registration Secret (для Matrix, Phase 4+)
openssl rand -base64 32

📝 .env (Головний файл)

# =============================================================================
# DAARION Production Environment
# =============================================================================

# Environment
APP_ENV=production
NODE_ENV=production

# Domain
APP_BASE_URL=https://app.daarion.space
APP_DOMAIN=daarion.space

# Database (PostgreSQL)
DATABASE_URL=postgresql://daarion_user:CHANGE_ME_DB_PASSWORD@postgres:5432/daarion
POSTGRES_USER=daarion_user
POSTGRES_PASSWORD=CHANGE_ME_DB_PASSWORD
POSTGRES_DB=daarion

# Redis
REDIS_URL=redis://redis:6379/0
REDIS_PASSWORD=CHANGE_ME_REDIS_PASSWORD

# NATS
NATS_URL=nats://nats:4222
NATS_CLUSTER_ID=daarion-cluster

# Security
JWT_SECRET=CHANGE_ME_JWT_SECRET_64_CHARS
JWT_EXPIRY=7d
ENCRYPTION_KEY=CHANGE_ME_ENCRYPTION_KEY_32_CHARS

# Services URLs (internal)
AUTH_SERVICE_URL=http://auth-service:7000
AGENTS_SERVICE_URL=http://agents-service:7002
CITY_SERVICE_URL=http://city-service:7001
SECONDME_SERVICE_URL=http://secondme-service:7003
MICRODAO_SERVICE_URL=http://microdao-service:7004

# City Config
CITY_DEFAULT_ROOMS=general,welcome,builders
SECONDME_AGENT_ID=ag_secondme_global

# Monitoring
PROMETHEUS_RETENTION=15d
GRAFANA_ADMIN_PASSWORD=CHANGE_ME_GRAFANA_PASSWORD

# Logging
LOG_LEVEL=info
LOG_FORMAT=json

# =============================================================================
# Advanced (Optional)
# =============================================================================

# Rate Limiting
RATE_LIMIT_ENABLED=true
RATE_LIMIT_MAX_REQUESTS=100
RATE_LIMIT_WINDOW_MS=60000

# CORS
CORS_ORIGINS=https://app.daarion.space,https://daarion.space
CORS_CREDENTIALS=true

# File Upload
MAX_FILE_SIZE=10MB
UPLOAD_DIR=/data/uploads

# Telemetry (Optional)
TELEMETRY_ENABLED=false
SENTRY_DSN=

# Feature Flags (MVP)
FEATURE_CITY_ROOMS=true
FEATURE_SECOND_ME=true
FEATURE_AGENTS=true
FEATURE_MICRODAO=true
FEATURE_MATRIX=false

🔐 env/app.env

# Application Configuration
APP_NAME=DAARION
APP_VERSION=1.0.0
APP_ENV=production
APP_DEBUG=false

APP_BASE_URL=https://app.daarion.space
APP_DOMAIN=daarion.space

# Security
JWT_SECRET=${JWT_SECRET}
ENCRYPTION_KEY=${ENCRYPTION_KEY}

# Session
SESSION_LIFETIME=604800
SESSION_SECURE=true
SESSION_SAME_SITE=strict

🗄️ env/db.env

# PostgreSQL Configuration
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_USER=daarion_user
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
POSTGRES_DB=daarion

# Connection Pool
POSTGRES_POOL_MIN=2
POSTGRES_POOL_MAX=10

# Timeouts
POSTGRES_CONNECT_TIMEOUT=10
POSTGRES_STATEMENT_TIMEOUT=30000

# SSL (Production)
POSTGRES_SSL_MODE=prefer

📦 env/redis.env

# Redis Configuration
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=${REDIS_PASSWORD}
REDIS_DB=0

# Connection
REDIS_MAX_RETRIES=3
REDIS_RETRY_DELAY=1000

# Presence System
PRESENCE_TTL=40
PRESENCE_HEARTBEAT_INTERVAL=20

📡 env/nats.env

# NATS Configuration
NATS_URL=nats://nats:4222
NATS_CLUSTER_ID=daarion-cluster

# JetStream
NATS_JETSTREAM_ENABLED=true
NATS_JETSTREAM_DOMAIN=daarion

# Connection
NATS_MAX_RECONNECTS=10
NATS_RECONNECT_WAIT=2s

🤖 env/agents.env

# Agents Service Configuration
AGENTS_SERVICE_PORT=7002

# Database
DATABASE_URL=${DATABASE_URL}

# NATS
NATS_URL=${NATS_URL}

# LLM Proxy (якщо є)
LLM_PROXY_URL=http://llm-proxy:8000

# Quotas
AGENT_TOKENS_PER_MINUTE=10000
AGENT_RUNS_PER_DAY=100
AGENT_CONCURRENT_RUNS=5

# Execution
AGENT_TIMEOUT_SECONDS=30
AGENT_MAX_TOKENS=2000

🏙️ env/city.env

# City Service Configuration
CITY_SERVICE_PORT=7001

# Database
DATABASE_URL=${DATABASE_URL}

# Redis (Presence)
REDIS_URL=${REDIS_URL}

# Default Rooms
CITY_DEFAULT_ROOMS=general,welcome,builders,science,energy

# Presence
PRESENCE_TTL=40
PRESENCE_CLEANUP_INTERVAL=60

🧬 env/secondme.env

# Second Me Service Configuration
SECONDME_SERVICE_PORT=7003

# Database
DATABASE_URL=${DATABASE_URL}

# Agents Core Integration
AGENTS_SERVICE_URL=${AGENTS_SERVICE_URL}
SECONDME_AGENT_ID=ag_secondme_global

# Context
SECONDME_CONTEXT_MESSAGES=10
SECONDME_MAX_PROMPT_LENGTH=5000

📊 env/monitoring.env

# Prometheus
PROMETHEUS_PORT=9090
PROMETHEUS_RETENTION=15d
PROMETHEUS_SCRAPE_INTERVAL=15s

# Grafana
GF_SERVER_ROOT_URL=https://app.daarion.space/grafana/
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
GF_AUTH_ANONYMOUS_ENABLED=false
GF_USERS_ALLOW_SIGN_UP=false

# Alerting (Optional)
GF_SMTP_ENABLED=false

🔒 Security Best Practices

1. Permissions

# Встановити правильні permissions
chmod 600 /opt/daarion/.env
chmod 600 /opt/daarion/env/*.env
chown root:docker /opt/daarion/.env

2. Git Ignore

# В .gitignore додати:
.env
env/*.env
!env/*.env.example

3. Backup Secrets

# Зберегти секрети в безпечному місці
# Наприклад, в 1Password, Vault, або encrypted file

# Backup command:
tar -czf daarion-secrets-$(date +%Y%m%d).tar.gz env/ .env
gpg --symmetric --cipher-algo AES256 daarion-secrets-*.tar.gz
rm daarion-secrets-*.tar.gz
# Зберегти .gpg файл у безпечному місці

🔄 Rotation Policy

Регулярно змінювати

  • JWT_SECRET: кожні 90 днів
  • Database passwords: кожні 90 днів
  • Redis password: кожні 90 днів
  • Grafana admin password: кожні 30 днів

Процедура rotation

  1. Згенерувати новий секрет
  2. Оновити .env файл
  3. Перезапустити affected services:
    docker compose -f docker-compose.all.yml restart auth-service
    
  4. Перевірити що все працює
  5. Видалити старий секрет з backup

📋 Deployment Checklist

  • Всі CHANGE_ME_* замінені на реальні секрети
  • Секрети згенеровані через openssl rand
  • .env файл має permissions 600
  • .env додано в .gitignore
  • Backup секретів створено та збережено в безпечному місці
  • APP_BASE_URL вказує на правильний домен
  • Database credentials унікальні та сильні
  • JWT_SECRET має мінімум 64 символи
  • Grafana admin password змінений з дефолтного

🧪 Testing ENV Config

# Перевірка що всі змінні завантажуються
docker compose -f docker-compose.all.yml config

# Перевірка конкретного сервісу
docker compose -f docker-compose.all.yml run --rm auth-service env | grep JWT

# Debug mode (тільки на dev!)
docker compose -f docker-compose.all.yml up auth-service
# Шукати в логах завантаження ENV

🚨 Troubleshooting

Проблема: Service не бачить ENV змінні

Рішення:

# В docker-compose.all.yml додати:
services:
  auth-service:
    env_file:
      - .env
      - env/app.env
    environment:
      - APP_ENV=${APP_ENV}

Проблема: Секрет не працює

Діагностика:

# Перевірити що немає зайвих пробілів
cat .env | grep JWT_SECRET | od -c

# Перевірити що файл має Unix line endings
file .env

📚 Наступні кроки

  1. ➡️ Database Migrations (docs/DEPLOY_MIGRATIONS.md)
  2. ➡️ Services Startup (docs/DEPLOY_SERVICES.md)
  3. ➡️ Smoke Tests (docs/DEPLOY_SMOKETEST_CHECKLIST.md)

Статус: ENV Configuration Guide Complete
Версія: 1.0.0
Дата: 24 листопада 2025