Skip to content

# 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: `bash 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