YALLA LIVE - MOBILE VOICE MVP DEPLOYMENT

1) Upload the full project and point the domain document root to /public.
2) Copy .env.example to .env and fill MySQL + APP_URL + APP_KEY.
3) Run:
   php artisan key:generate --force
   php artisan migrate --seed --force
   php artisan storage:link
4) Make storage/, bootstrap/cache/ and storage/logs writable by PHP.
5) The current voice engine is WebRTC P2P with Laravel HTTP signaling/event polling. This is intentionally compatible with shared hosting.
6) Public STUN servers are enabled by default. For difficult mobile/NAT networks, configure a TURN server:
   WEBRTC_TURN_URL=turn:your-turn-server:3478
   WEBRTC_TURN_USERNAME=...
   WEBRTC_TURN_CREDENTIAL=...
7) WebSocket is architected as an optional upgrade. Shared hosting cannot keep a persistent WebSocket daemon alive reliably. Leave WEBSOCKET_URL empty on shared hosting; the app automatically uses the realtime HTTP fallback. On a VPS, connect a WebSocket/SFU layer later without changing the room, gifts, wallet, or ad APIs.
8) The room supports three fixed ad slots: top, middle, bottom.
9) Every verified ad impression stores country, CPM, room, host, viewer snapshot, slot and revenue split. Host ad earnings are credited to earnings_balance and the earnings ledger.
10) Country CPM defaults are seeded in ad_country_rates. Admin can read/write rates through:
   GET  /admin/ad-rates
   POST /admin/ad-rates
11) Host ad analytics:
   GET /api/rooms/{room}/ad-stats
   Creator earnings:
   GET /api/earnings

IMPORTANT SHARED HOSTING LIMITATION
The application server is NOT used as an audio relay. Audio travels browser-to-browser over WebRTC. This keeps bandwidth/CPU requirements low on shared hosting. When traffic grows, move only the realtime media/signaling layer to a VPS/SFU and keep Laravel/MySQL as the business backend.
