WebSocket architecture (ActionCable)

ActionCable is served in-process by Puma (behind kamal-proxy and Cloudflare in
production) — there is no separate nginx/Passenger stack to tune. WebSocket
upgrades pass straight through kamal-proxy to Puma in both development and
production.