Environment Değişkenleri
Veritabanı
| Değişken | Varsayılan | Açıklama |
|---|---|---|
POSTGRES_PASSWORD | — | PostgreSQL şifresi |
DATABASE_URL | — | postgresql+asyncpg://... |
TIMESCALE_RETENTION_DAYS | 730 | Veri saklama süresi (gün) |
TIMESCALE_COMPRESS_AFTER_DAYS | 90 | Sıkıştırma başlangıcı |
Güvenlik
| Değişken | Varsayılan | Açıklama |
|---|---|---|
SECRET_KEY | — | JWT imzalama (min 32 karakter) |
ACCESS_TOKEN_EXPIRE_MINUTES | 30 | Access token süresi |
REFRESH_TOKEN_EXPIRE_DAYS | 7 | Refresh token süresi |
MQTT
| Değişken | Varsayılan | Açıklama |
|---|---|---|
MQTT_BROKER_HOST | emqx | Broker adresi |
MQTT_BROKER_PORT | 1883 | Broker portu |
MQTT_BROKER_USERNAME | backend | Backend MQTT kullanıcısı |
MQTT_BROKER_PASSWORD | — | Backend MQTT şifresi |
MQTT_EXTERNAL_HOST | — | ESP32'ye iletilecek broker adresi |
MQTT_EXTERNAL_PORT | 8883 | ESP32 TLS portu |
MQTT_EXTERNAL_TLS | true | ESP32 TLS aktif |
MQTT_GATEWAY_USERNAME | gateway | Gateway MQTT kullanıcısı |
MQTT_GATEWAY_PASSWORD | — | Gateway MQTT şifresi |
Redis & Celery
| Değişken | Varsayılan | Açıklama |
|---|---|---|
REDIS_URL | redis://redis:6379/0 | Redis bağlantısı |
CORS_ORIGINS | — | İzin verilen origin'ler (virgülle ayrılmış) |
Firmware & OTA
| Değişken | Varsayılan | Açıklama |
|---|---|---|
FIRMWARE_STORAGE_PATH | /app/storage/firmware | Firmware dosya yolu |
FIRMWARE_SIGNING_KEY_PATH | — | ECDSA P-256 private key |
FIRMWARE_SIGNING_REQUIRED | true | İmza zorunluluğu |
Frontend
| Değişken | Varsayılan | Açıklama |
|---|---|---|
BACKEND_URL | http://backend:8000 | Docker internal URL |
NEXT_PUBLIC_WS_URL | — | WebSocket URL (build-time) |
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY | — | Google Maps API key |
Feature Flags
| Değişken | Varsayılan | Açıklama |
|---|---|---|
ENABLE_WEBSOCKET | true | WebSocket desteği |
ENABLE_LOTO | true | LOTO modülü |
ENABLE_SLD | true | SLD modülü |
ENABLE_PAYMENTS | false | Ödeme modülü |
PostgreSQL OOM Tuning (4GB Host)
Hetzner CAX serisi 4GB RAM ARM64 host'ta TimescaleDB OOM-kill'leri yaşandı. Aşağıdaki tuning ile bellek kullanımı sabit ~1.5GB aralığına çekildi.
docker-compose.yml — Postgres Servisi
postgres:
image: timescale/timescaledb:2.16.1-pg15
shm_size: 256m # parallel sort/hash join shared memory
command:
- "postgres"
- "-c"
- "max_connections=60"
- "-c"
- "work_mem=8MB"
- "-c"
- "effective_cache_size=512MB"
- "-c"
- "maintenance_work_mem=64MB"
- "-c"
- "shared_buffers=256MB"
Parametre Açıklamaları
| Parametre | Değer | Önceki | Açıklama |
|---|---|---|---|
shm_size | 256m | 64m (default) | TimescaleDB chunk işlemlerinde parallel worker shared memory ihtiyacı |
max_connections | 60 | 100 | Connection-bazlı RAM tüketimi: ~10-15MB/conn × 100 = riskli |
work_mem | 8MB | 4MB | Sort/join operasyonu başına bellek; düşük → temp file artar |
effective_cache_size | 512MB | 4GB (default) | Planner'a OS page cache tahmini; 4GB host'ta 512MB gerçekçi |
maintenance_work_mem | 64MB | 64MB | VACUUM, CREATE INDEX, ALTER TABLE için |
Connection Budget Hesabı (Worst-Case)
max_connections=60 ile worst-case kullanım:
| Servis | Conn |
|---|---|
| backend (gunicorn 2 worker × 8 pool) | 16 |
| celery-worker (8 prefork worker) | 8 |
| celery-beat (1 conn) | 1 |
| celery scheduled tasks havuzu | 7 |
| modbus-poller | 10 |
| Süper kullanıcı / migration / debug | 3 |
| Buffer (saturate önleme) | 10 |
| Toplam | 55/60 |
5 connection saf güvenlik buffer'ı olarak ayrılmıştır.
Backend Pool Recycle (Faz 3)
DATABASE_POOL_RECYCLE=3600
SQLAlchemy connection'ları 1 saat sonra otomatik kapatır ve yeniden açar. Faydaları:
- Dead connection tespiti (network NAT timeout, postgres
idle_in_transactionreset) - Postgres restart sonrası backend'in stale connection tutmasını engeller
- Long-lived process (gunicorn worker) memory bloat'ı azaltır
pool_pre_ping=True ile birlikte kullanılır; her checkout öncesi SELECT 1 ile connection canlılığı doğrulanır.