Variables d'Environnement Complètes
Référence exhaustive de toutes les variables .env.
Comment générer des secrets
bash
# 16 chars hex
openssl rand -hex 16
# 32 chars hex
openssl rand -hex 32
# 64 chars hex
openssl rand -hex 64PostgreSQL (rgz-db)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| POSTGRES_USER | rgz_admin | ✅ | Utilisateur administrateur DB | rgz_admin |
| POSTGRES_PASSWORD | - | ✅ | Mot de passe admin (32 chars) | 7f9e8d2c1a4b5c6d7e8f9a0b1c2d3e4f |
| POSTGRES_DB | rgz_noc | ✅ | Nom base de données | rgz_noc |
| POSTGRES_INITDB_ARGS | - | ⭕ | Arguments psql au démarrage | -c max_connections=200 |
Redis (rgz-redis)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| REDIS_PASSWORD | - | ✅ | Mot de passe Redis (32 chars) | a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 |
FreeRADIUS (rgz-radius)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| RADIUS_SECRET | - | ✅ | Secret partagé NAS (32 chars) | b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6 |
| RADIUS_IP | 127.0.0.1 | ⭕ | IP bind (ne pas changer) | 0.0.0.0 |
| RADIUS_PORT_AUTH | 1812 | ⭕ | Port authentification | 1812 |
| RADIUS_PORT_ACCT | 1813 | ⭕ | Port accounting | 1813 |
| RADIUS_PORT_COA | 3799 | ⭕ | Port Change-of-Authorization | 3799 |
Elasticsearch & Kibana (ELK Stack)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| ELASTIC_PASSWORD | - | ✅ | Mot de passe elasticsearch (32 chars) | c1d2e3f4g5h6i7j8k9l0m1n2o3p4q5r6 |
| ELASTIC_VERSION | 8.14.0 | ⭕ | Version Elasticsearch | 8.14.0 |
| KIBANA_PASSWORD | - | ✅ | Mot de passe Kibana (même que ELASTIC) | c1d2e3f4g5h6i7j8k9l0m1n2o3p4q5r6 |
| KIBANA_URL | http://rgz-kibana:5601 | ⭕ | URL Kibana interne | http://rgz-kibana:5601 |
| ES_JAVA_OPTS | -Xms2g -Xmx2g | ⭕ | Options JVM ES (min=max) | -Xms2g -Xmx2g |
| LOGSTASH_PIPELINE_WORKERS | 4 | ⭕ | Threads Logstash | 4 |
Grafana (rgz-grafana)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| GRAFANA_ADMIN_USER | admin | ⭕ | User admin Grafana | admin |
| GRAFANA_ADMIN_PASSWORD | - | ✅ | Mot de passe admin (16+ chars) | MySecurePass1234 |
| GRAFANA_SECRET_KEY | - | ✅ | Clé secrète (32 chars) | d1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6 |
| GRAFANA_URL | https://grafana-rgz.duckdns.org | ⭕ | URL publique Grafana | https://grafana-rgz.duckdns.org |
| GRAFANA_DEFAULT_THEME | dark | ⭕ | Thème par défaut | dark |
JWT Authentication (rgz-api)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| JWT_SECRET_KEY | - | ✅ | Clé secrète JWT (64 chars) | e1f2g3h4i5j6k7l8m9n0o1p2q3r4s5t6u7v8w9x0y1z2a3b4c5d6e7f8g9h0i1j2k3l4 |
| JWT_ALGORITHM | RS256 | ⭕ | Algorithme JWT | RS256 |
| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | 15 | ⭕ | Expiration token accès | 15 |
| JWT_REFRESH_TOKEN_EXPIRE_DAYS | 7 | ⭕ | Expiration token refresh | 7 |
KKiaPay (Paiements mobiles)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| KKIAPAY_PUBLIC_KEY | - | ✅ | Clé publique KKiaPay | pk_live_xxxxxxxxxxxx |
| KKIAPAY_SECRET | - | ✅ | Clé secrète KKiaPay | sk_live_xxxxxxxxxxxx |
| KKIAPAY_SANDBOX | false | ⭕ | Utiliser environment sandbox | false (true en dev) |
| KKIAPAY_WEBHOOK_URL | https://api-rgz.duckdns.org/webhooks/kkiapay | ⭕ | URL webhook callback | https://api-rgz.duckdns.org/webhooks/kkiapay |
Letexto (SMS)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| LETEXTO_API_KEY | - | ✅ | Clé API Letexto | abc123def456ghi789 |
| LETEXTO_BASE_URL | https://api.letexto.com | ⭕ | URL API Letexto | https://api.letexto.com |
| LETEXTO_SENDER_ID | RGZ | ⭕ | Émetteur SMS (max 11 chars) | RGZ |
SMTP (Email)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| SMTP_HOST | smtp.gmail.com | ✅ | Serveur SMTP | smtp.gmail.com |
| SMTP_PORT | 587 | ✅ | Port SMTP (TLS) | 587 |
| SMTP_USER | - | ✅ | Email utilisateur | noc@rgz.bj |
| SMTP_PASSWORD | - | ✅ | Mot de passe SMTP ou App Password | xxxxxxxxxxxxxxxx |
| SMTP_FROM | noc@rgz.bj | ✅ | Adresse expéditeur | noc@rgz.bj |
| SMTP_TLS | true | ⭕ | Utiliser STARTTLS | true |
DuckDNS & Traefik
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| DUCKDNS_TOKEN | - | ✅ | Token DuckDNS | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
| DUCKDNS_DOMAINS | api-rgz,admin-rgz,access-rgz,grafana-rgz,registre-rgz,docs-rgz | ⭕ | Domaines séparés virgule | api-rgz,admin-rgz,access-rgz |
| TRAEFIK_DASHBOARD_USER | admin | ⭕ | User dashboard Traefik | admin |
| TRAEFIK_DASHBOARD_PASSWORD | - | ✅ | Mot de passe Traefik (16+ chars) | TraefikPass123 |
| LETSENCRYPT_EMAIL | admin@rgz.bj | ✅ | Email Let's Encrypt | admin@rgz.bj |
API (rgz-api)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| API_HOST | 0.0.0.0 | ⭕ | IP bind API | 0.0.0.0 |
| API_PORT | 8000 | ⭕ | Port API FastAPI | 8000 |
| API_WORKERS | 4 | ⭕ | Nombre workers Gunicorn | 4 |
| API_TIMEOUT | 120 | ⭕ | Timeout requête (secondes) | 120 |
| DEBUG | false | ⭕ | Mode debug (jamais true en prod) | false |
| ENVIRONMENT | production | ✅ | Environnement | production |
| LOG_LEVEL | info | ⭕ | Niveau logs | info |
| CORS_ORIGINS | https://admin-rgz.duckdns.org | ⭕ | Origines CORS (virgule séparées) | https://admin-rgz.duckdns.org |
Celery (Scheduler & Tasks)
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| CELERY_BROKER_URL | redis://:password@rgz-redis:6379/0 | ✅ | URL broker Redis | redis://:mypassword@rgz-redis:6379/0 |
| CELERY_RESULT_BACKEND | redis://:password@rgz-redis:6379/1 | ✅ | URL result backend Redis | redis://:mypassword@rgz-redis:6379/1 |
| CELERY_WORKERS | 4 | ⭕ | Nombre workers Celery | 4 |
| CELERY_LOGLEVEL | info | ⭕ | Niveau logs Celery | info |
WhatsApp Business API
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| WHATSAPP_API_TOKEN | - | ⭕ | Token API WhatsApp Business | EAAxxxxxxxxxxxxxxxxxxxxxx |
| WHATSAPP_PHONE_NUMBER_ID | - | ⭕ | ID numéro téléphone WhatsApp | 1234567890123 |
| WHATSAPP_API_VERSION | v19.0 | ⭕ | Version API Meta | v19.0 |
Services de monitoring
| Variable | Défaut | Obligatoire | Description | Exemple |
|---|---|---|---|---|
| PROMETHEUS_SCRAPE_INTERVAL | 15s | ⭕ | Intervalle scrape Prometheus | 15s |
| PROMETHEUS_EVALUATION_INTERVAL | 15s | ⭕ | Intervalle évaluation alertes | 15s |
| SNMP_COMMUNITY | public | ⭕ | Community SNMP (v2c) | public |
| SNMP_PORT | 161 | ⭕ | Port SNMP | 161 |
| NETFLOW_PORT | 2055 | ⭕ | Port NetFlow v5 | 2055 |
Configuration avancée
Pooling connexions DB
bash
SQLALCHEMY_POOL_SIZE=20
SQLALCHEMY_POOL_RECYCLE=3600
SQLALCHEMY_POOL_PRE_PING=trueRate limiting
bash
RATE_LIMIT_ENABLED=true
RATE_LIMIT_REQUESTS_PER_MINUTE=100
RATE_LIMIT_AUTH_REQUESTS_PER_MINUTE=5Logging & observabilité
bash
SENTRY_DSN=
OTEL_ENABLED=false
OTEL_EXPORTER_OTLP_ENDPOINT=Fichier .env minimal (validé)
bash
# PostgreSQL
POSTGRES_USER=rgz_admin
POSTGRES_PASSWORD=$(openssl rand -hex 32)
POSTGRES_DB=rgz_noc
# Redis
REDIS_PASSWORD=$(openssl rand -hex 32)
# FreeRADIUS
RADIUS_SECRET=$(openssl rand -hex 32)
# ELK
ELASTIC_PASSWORD=$(openssl rand -hex 32)
KIBANA_PASSWORD=$ELASTIC_PASSWORD
# Grafana
GRAFANA_ADMIN_PASSWORD=$(openssl rand -hex 16)
GRAFANA_SECRET_KEY=$(openssl rand -hex 32)
# JWT
JWT_SECRET_KEY=$(openssl rand -hex 64)
# KKiaPay
KKIAPAY_PUBLIC_KEY=<copier depuis dashboard>
KKIAPAY_SECRET=<copier depuis dashboard>
# Letexto
LETEXTO_API_KEY=<copier depuis dashboard>
# SMTP
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=<votre email>
SMTP_PASSWORD=<App Password>
# DuckDNS + Traefik
DUCKDNS_TOKEN=<token>
TRAEFIK_DASHBOARD_PASSWORD=$(openssl rand -hex 16)
# API
API_WORKERS=4
DEBUG=false
ENVIRONMENT=productionVérification .env
bash
# Vérifier syntaxe
bash -n <(cat .env)
# Vérifier variables obligatoires
for var in POSTGRES_PASSWORD REDIS_PASSWORD RADIUS_SECRET ELASTIC_PASSWORD GRAFANA_ADMIN_PASSWORD JWT_SECRET_KEY KKIAPAY_PUBLIC_KEY KKIAPAY_SECRET LETEXTO_API_KEY SMTP_USER SMTP_PASSWORD DUCKDNS_TOKEN TRAEFIK_DASHBOARD_PASSWORD; do
if ! grep -q "^$var=" .env; then
echo "❌ Missing: $var"
else
echo "✅ $var found"
fi
doneMigration depuis ancien .env
bash
# Ajouter nouvelles variables
cat .env.example >> .env
# Supprimer doublons
sort -u .env > .env.tmp && mv .env.tmp .env
# Valider
./scripts/ops/init.sh --validate-envSécurité
⚠️ JAMAIS:
- Committer
.enven git - Partager
.enven chat/email - Utiliser secrets par défaut en production
- Mettre secrets en comments
✅ TOUJOURS:
- Générer secrets avec
openssl rand -hex - Utiliser
.envlocal +.env.examplesans secrets - Changer secrets tous les 90 jours
- Utiliser HashiCorp Vault ou AWS Secrets Manager
Support
bash
# Tester variable
echo $POSTGRES_PASSWORD
# Vérifier variable chargée dans container
docker exec rgz-api env | grep POSTGRES_PASSWORD
# Debug connexion
docker exec rgz-api python -c "
import os
from sqlalchemy import create_engine
engine = create_engine(f\"postgresql://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@rgz-db:5432/{os.getenv('POSTGRES_DB')}\")
print('✅ DB Connection OK')
"