================================================================================ NOVA ZEKA — LiveKit kendi sunucunuzda (Cloud kotası / egress ücreti yok) ================================================================================ YAZILIM: LiveKit Server + Egress açık kaynak. Maliyet = VPS (CPU/RAM/disk) + trafik. 1) DNS (canlı örnek: SUNUCU_ADIMLARI.txt) - novazeka.com.tr → 77.245.158.122 (yeterli; ayrı livekit.* alt alanı şart değil) 2) Güvenlik duvarı (ör. ufw / hosting paneli) Açın: - 443/tcp (WSS için Nginx/Caddy) - 80/tcp (Let's Encrypt doğrulama) - 7881/tcp (WebRTC TCP) - 50000-60000/udp (livekit.yaml rtc port aralığı ile aynı) 3) livekit.yaml + egress.yaml - livekit.yaml → keys: kendi API key adı ve secret (openssl rand -base64 32) - egress.yaml → api_key / api_secret livekit.yaml ile BİREBİR aynı olmalı - livekit.yaml içinde redis: 127.0.0.1:6379 (docker-compose ile gelir) 4) Docker (bu klasörde) — Redis + LiveKit + Egress Önkoşul: Linux sunucu (docker compose’ta network_mode: host kullanılıyor). Üretim: .env.example → .env, EGRESS_HOST_RECORDINGS_DIR=public_html/…/livekit-selfhost/recordings (PHP LIVEKIT_RECORDINGS_HOST_PATH ile aynı mutlak yol; ayrıntı SUNUCU_ADIMLARI.txt §C). Yerel: .env yoksa ./recordings kullanılır; mkdir -p recordings && chmod 777 recordings docker compose up -d Log: docker compose logs -f egress Not: Egress oda birleşik kayıt (Room composite) için ~4 CPU / ~4 GB RAM önerilir. 5) TLS / WSS İstemci mutlaka wss:// kullanır. A) https://docs.livekit.io — Self-hosting → generate B) Nginx kök yol: nginx-livekit-novazeka-root.snippet.conf — novazeka.com.tr üzerinden /rtc ve /twirp → :7880 C) Apache prefix yol (Flutter localhost CORS için pratik): apache-livekit-novazeka-prefix.conf.example — /novazeka/livekit/rtc ve /novazeka/livekit/twirp → :7880 D) Alternatif: nginx-wss.example.conf (ayrı alt alan adı ile) Geliştirme tipi: Flutter localhost + PHP API developer.novazeka.com.tr + LiveKit wss novazeka.com.tr — normal; developer sunucudaki livekit_local.php anahtarları, canlıdaki LiveKit ile aynı olmalı. Tarayıcı wss için novazeka.com.tr’ye çapraz origin isteği atar. - Snippet’te CORS: Origin başlığı $http_origin ile yansıtılır (ayrı map dosyası şart değil). - location ^~ /rtc ve ^~ /twirp, genel "location /" veya PHP’den ÖNCE olmalı — ayrıntı: livekit-selfhost/nginx-443-include-order.example.txt - nginx -t && systemctl reload nginx 6) PHP (novazeka) — self-host + yerel kayıt - MP4 arama: PHP MAIN + DEVELOPER + EGRESS_HOST_RECORDINGS_DIR (+ isteğe bağlı /root/livekit-recordings) köklerinde aynı göreli yolu arar. 404 JSON’daki search_roots ile sunucuda: find -name 'nova_live_*.mp4' - Üç dosyada AYNI API anahtarı olmalı: livekit.yaml (keys:), egress.yaml (api_key/api_secret), config/livekit_local.php ($LIVEKIT_API_*). - config/livekit_local.php: LIVEKIT_URL = wss://... (Cloud DEĞİL; kendi WSS adresiniz) LIVEKIT_API_KEY / LIVEKIT_API_SECRET = livekit.yaml ile birebir aynı LIVEKIT_HTTP_INTERNAL = http://127.0.0.1:7880 (PHP ile LiveKit aynı sunucudaysa) LIVEKIT_EGRESS_OUTPUT_DIR = /out → Egress konteynerinin içindeki yol (compose: ./recordings → /out). MP4 dosyaları sunucuda livekit-selfhost/recordings/ altında oluşur. - S3 (LIVEKIT_EGRESS_S3_*): LiveKit Cloud veya harici depo kullanıyorsanız; yerel disk için boş bırakın. - docker compose up -d sonrası: mkdir -p recordings && chmod 777 recordings 7) Test Admin → Canlı yayın → REC ile kayıt başlat → recordings/ içinde nova_live_*.mp4 oluşmalı. 8) LiveKit Cloud’tan geçiş Cloud URL’yi self-host wss adresiyle değiştirin; egress + redis bu compose ile çalışır. Cloud’a özgü egress kotası kullanılmaz. Hata ayıklama (isteğe bağlı) - Sunucu ortamı: NOVA_LIVE_STREAM_DEBUG=1 → live_stream_token.php yanıtına _debug (url/origin) eklenir. - Flutter konsol: --dart-define=NOVAZEKA_LIVE_VERBOSE=true (release dahil ayrıntılı log) - web/run_web_dev.bat varsayılan olarak LIVE_VERBOSE açar. Sorun giderme - Localhost’ta /rtc/validate CORS veya WS “Unexpected response code: 200”: snippet’teki ^~ /rtc gerçekten eşleşiyor mu (include sırası)? curl ile doğrulayın (nginx-443-include-order.example.txt). - Apache prefix kurulumda: /novazeka/livekit/rtc/validate için doğru ProxyPass + OPTIONS CORS var mı? (apache-livekit-novazeka-prefix.conf.example) - “chrome failed to start”: docker-compose.yml içinde egress için cap_add: SYS_ADMIN tanımlı olmalı (bu repoda var). - Kayıt başlamıyor: docker compose logs egress ve livekit-server; Redis’in 127.0.0.1:6379 dinlediğini doğrulayın. - Hızlı onarım (tek komut): livekit-selfhost/fix_redis_egress_once.sh — sunucuda: bash fix_redis_egress_once.sh (Redis’i livekit-nova ağına koyar + host 127.0.0.1:6379 yayımlar; nova_livekit’i aynı ağa bağlar; Egress’i yeniden oluşturur.) - LiveKit log: "lookup livekit-redis: i/o timeout" → nova_livekit ile livekit-redis farklı Docker ağında; docker network connect livekit-nova nova_livekit && docker restart nova_livekit - Egress log: "unable to connect to redis: dial tcp 127.0.0.1:6379: connection refused": Egress ve bu repodaki redis servisi network_mode: host kullanır; Redis mutlaka HOST üzerinde 127.0.0.1:6379 dinlemelidir. Sunucuda: redis-cli -h 127.0.0.1 -p 6379 ping → PONG olmalı; değilse livekit-redis eski/köprü ağında kalmış olabilir. Çözüm: docker stop livekit-redis && docker rm -f livekit-redis (busy ise: systemctl restart docker, sonra tekrar rm), ardından livekit-selfhost dizininde docker compose up -d redis. Sonra: docker compose up -d --no-deps egress. docker inspect livekit-redis --format '{{.HostConfig.NetworkMode}}' → host görmelisiniz. - egress.yaml içindeki api_key / api_secret, livekit.yaml keys: ile birebir aynı olmalı (ör. nova_live_dev ile nova_live_g9mdyyf1jy karıştırmayın); uyuşmazsa kayıt veya sinyal hata verir. - API/Flutter’da "no response from servers" veya Egress unavailable: WebRTC için yalnızca livekit-server yeterli; MP4 kayıt için egress servisi de aynı sunucuda çalışmalı (docker compose ps’te egress Up olmalı). Eksikse: docker compose up -d egress - Bazı ağlarda TURN (coturn) gerekir — LiveKit dokümantasyonu “TURN”.