title: How to deploy laravel websockets on shared hosting?
body: <p>I have setup my laravel websockets on localhost it works fine on localhost but when i upload it to production server and gaves my the following error.</p>
  <pre><code>WebSocket connection to 'ws:&lt;URL&gt;/app/somekey?protocol=7&amp;client=js&amp;version=4.3.1&amp;flash=false' failed: WebSocket is closed before the connection is established.
  </code></pre>
  <p>below is my <code>config.php</code> file</p>
  <pre><code>&lt;?php
  
  use BeyondCode\LaravelWebSockets\Dashboard\Http\Middleware\Authorize;
  
  return [
  
      /*
       * Set a custom dashboard configuration
       */
      'dashboard' =&gt; [
          'port' =&gt; env('LARAVEL_WEBSOCKETS_PORT', 6001),
      ],
  
      /*
       * This package comes with multi tenancy out of the box. Here you can
       * configure the different apps that can use the webSockets server.
       *
       * Optionally you specify capacity so you can limit the maximum
       * concurrent connections for a specific app.
       *
       * Optionally you can disable client events so clients cannot send
       * messages to each other via the webSockets.
       */
      'apps' =&gt; [
          [
              'id' =&gt; env('PUSHER_APP_ID'),
              'name' =&gt; env('APP_NAME'),
              'key' =&gt; env('PUSHER_APP_KEY'),
              'secret' =&gt; env('PUSHER_APP_SECRET'),
              'path' =&gt; env('PUSHER_APP_PATH'),
              'capacity' =&gt; null,
              'enable_client_messages' =&gt; false,
              'enable_statistics' =&gt; true,
          ],
      ],
  
      /*
       * This class is responsible for finding the apps. The default provider
       * will use the apps defined in this config file.
       *
       * You can create a custom provider by implementing the
       * `AppProvider` interface.
       */
      'app_provider' =&gt; BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class,
  
      /*
       * This array contains the hosts of which you want to allow incoming requests.
       * Leave this empty if you want to accept requests from all hosts.
       */
      'allowed_origins' =&gt; [
          //
      ],
  
      /*
       * The maximum request size in kilobytes that is allowed for an incoming WebSocket request.
       */
      'max_request_size_in_kb' =&gt; 250,
  
      /*
       * This path will be used to register the necessary routes for the package.
       */
      'path' =&gt; 'laravel-websockets',
  
      /*
       * Dashboard Routes Middleware
       *
       * These middleware will be assigned to every dashboard route, giving you
       * the chance to add your own middleware to this list or change any of
       * the existing middleware. Or, you can simply stick with this list.
       */
      'middleware' =&gt; [
          'web',
          Authorize::class,
      ],
  
      'statistics' =&gt; [
          /*
           * This model will be used to store the statistics of the WebSocketsServer.
           * The only requirement is that the model should extend
           * `WebSocketsStatisticsEntry` provided by this package.
           */
          'model' =&gt; \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class,
  
          /*
           * Here you can specify the interval in seconds at which statistics should be logged.
           */
          'interval_in_seconds' =&gt; 60,
  
          /*
           * When the clean-command is executed, all recorded statistics older than
           * the number of days specified here will be deleted.
           */
          'delete_statistics_older_than_days' =&gt; 60,
  
          /*
           * Use an DNS resolver to make the requests to the statistics logger
           * default is to resolve everything to 127.0.0.1.
           */
          'perform_dns_lookup' =&gt; false,
      ],
  
      /*
       * Define the optional SSL context for your WebSocket connections.
       * You can see all available options at: http://php.net/manual/en/context.ssl.php
       */
      'ssl' =&gt; [
          /*
           * Path to local certificate file on filesystem. It must be a PEM encoded file which
           * contains your certificate and private key. It can optionally contain the
           * certificate chain of issuers. The private key also may be contained
           * in a separate file specified by local_pk.
           */
          'local_cert' =&gt; env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),
  
          /*
           * Path to local private key file on filesystem in case of separate files for
           * certificate (local_cert) and private key.
           */
          'local_pk' =&gt; env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),
  
          /*
           * Passphrase for your local_cert file.
           */
          'passphrase' =&gt; env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),
      ],
  
      /*
       * Channel Manager
       * This class handles how channel persistence is handled.
       * By default, persistence is stored in an array by the running webserver.
       * The only requirement is that the class should implement
       * `ChannelManager` interface provided by this package.
       */
      'channel_manager' =&gt; \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class,
  ];
  </code></pre>
  <p>this is my <code>broadcasting.php</code> file</p>
  <pre><code>&lt;?php
  
  return [
  
      /*
      |--------------------------------------------------------------------------
      | Default Broadcaster
      |--------------------------------------------------------------------------
      |
      | This option controls the default broadcaster that will be used by the
      | framework when an event needs to be broadcast. You may set this to
      | any of the connections defined in the &quot;connections&quot; array below.
      |
      | Supported: &quot;pusher&quot;, &quot;redis&quot;, &quot;log&quot;, &quot;null&quot;
      |
      */
  
      'default' =&gt; env('BROADCAST_DRIVER', 'null'),
  
      /*
      |--------------------------------------------------------------------------
      | Broadcast Connections
      |--------------------------------------------------------------------------
      |
      | Here you may define all of the broadcast connections that will be used
      | to broadcast events to other systems or over websockets. Samples of
      | each available type of connection are provided inside this array.
      |
      */
  
      'connections' =&gt; [
  
          'pusher' =&gt; [
              'driver' =&gt; 'pusher',
              'key' =&gt; env('PUSHER_APP_KEY'),
              'secret' =&gt; env('PUSHER_APP_SECRET'),
              'app_id' =&gt; env('PUSHER_APP_ID'),
              'options' =&gt; [
                  'cluster' =&gt; env('PUSHER_APP_CLUSTER'),
                  'useTLS' =&gt; true,
                  'host' =&gt; &quot;127.0.0.1&quot;,
                  'port' =&gt; 6001,
                  'scheme' =&gt; 'http'
              ],
          ],
  
          'redis' =&gt; [
              'driver' =&gt; 'redis',
              'connection' =&gt; 'default',
          ],
  
          'log' =&gt; [
              'driver' =&gt; 'log',
          ],
  
          'null' =&gt; [
              'driver' =&gt; 'null',
          ],
  
      ],
  
  ];
  </code></pre>
  <p>and this is <code>bootstrap.js</code> file configuration</p>
  <pre><code>import Echo from &quot;laravel-echo&quot;;
  
  window.Pusher = require(&quot;pusher-js&quot;);
  
  window.Echo = new Echo({
      broadcaster: &quot;pusher&quot;,
      key: process.env.MIX_PUSHER_APP_KEY,
      wsHost: window.location.hostname,
      wsPort: 6001,
      disableStats: false,
      forceTLS: false
  });
  </code></pre>
  <p>The code works completely fine on localhost but whenever i upload it to the shared hosting it didn't works. I am using laravel websockets for realtime notifications</p>