Skip to content

Reverb WebSockets

Server-side:

Terminal window
BROADCAST_CONNECTION=reverb
REVERB_APP_ID=generated
REVERB_APP_KEY=generated
REVERB_APP_SECRET=generated
REVERB_HOST=0.0.0.0
REVERB_PORT=8080
REVERB_SCHEME=http

Client-side:

Terminal window
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="${APP_DOMAIN}"
VITE_REVERB_PORT=443
VITE_REVERB_SCHEME=https
app/Events/OrderShipped.php
class OrderShipped implements ShouldBroadcast
{
public function __construct(
public Order $order
) {}
public function broadcastOn(): array
{
return [
new PrivateChannel('orders.'.$this->order->user_id),
];
}
}
// Dispatch
event(new OrderShipped($order));
resources/js/echo.js
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
window.Pusher = Pusher;
window.Echo = new Echo({
broadcaster: 'reverb',
key: import.meta.env.VITE_REVERB_APP_KEY,
wsHost: import.meta.env.VITE_REVERB_HOST,
wsPort: import.meta.env.VITE_REVERB_PORT,
wssPort: import.meta.env.VITE_REVERB_PORT,
forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
enabledTransports: ['ws', 'wss'],
});
TypeAuthUse Case
PublicNoneGlobal notifications
PrivateUser authUser-specific updates
PresenceUser auth + metadataWho’s online, typing indicators

Coolify handles SSL termination. Reverb runs on port 8080 internally, exposed via HTTPS:

Client (wss://app.com/app/key) → Coolify Proxy → Reverb:8080

Single Reverb instance handles ~10,000 concurrent connections. For higher loads:

  • Run multiple application containers
  • Use Redis pub/sub for cross-container communication
  • Consider dedicated WebSocket servers