{"id":"c1143","filename":"c1143_kanal_p3_websocket_realtime.dok.json","weise3_id":"","tip":"implementacija","naziv":"Genesis Kanal P3 — WebSocket real-time sloj","kreator":"CC","datum":"2026-05-24","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"Genesis Kanal P3 — WebSocket real-time sloj","sto_treba":"Implementirati WebSocket real-time sloj za GenesisKanal s Redis pub/sub brokerom","faze":{"P1":"DONE — novi fajl api/kanal_ws.py (Redis pub/sub, auth, presence, filtering)","P2":"DONE — kanal.py poruka_posalji poziva objavi_poruku nakon commit-a","P3":"DONE — main.py registrira kanal_ws_router (import + include_router)","P4":"DONE — kanal.py status endpoint azuriran (P3: DONE)","P5":"DONE — nginx /ws/ location dodan s WebSocket upgrade headerima","P6":"DONE — test potvrden: dobrodosao + pong rade uzivo"},"arhitektura":{"redis_kanal":"genesis:kanal:ws:{soba_id}","redis_online":"genesis:kanal:online:{soba_id}","redis_db":4,"multi_server":"EU/NEW/DE transparentno — svi cvorovi subscribiraju isti Redis kanal","omotnica_filter":"svaki klijent prima SAMO svoju omotnicu (privatnost E2E)","keepalive":"30s timeout -> automatski ping server-side","presence":"clan_online broadcast pri spajanju i odspajanju","typing":"tipka event bez broadcast sebi","receipts":"procitano event s poruka_id"},"testovi":{"dobrodosao":"PASS — primljeno naziv_sobe + online_clanovi lista","ping_pong":"PASS — server vraca pong na ping","auth_los_token":"PASS — FastAPI vraca 404/close(4001) na los token","nginx_ws_proxy":"PASS — /ws/ proxiran na 8010 s Upgrade headerima"},"fajlovi":["/var/www/genesis/api/kanal_ws.py","/var/www/genesis/api/kanal.py","/var/www/genesis/main.py","/etc/nginx/sites-enabled/genesis-web"],"zakon":"c1139","datum":"2026-05-24","autor":"CC"}}