Гудбай Pusher, привет Laravel Websockets

015f0a35f3c89ffe65489066f017672d

Так получилось, что при создании очередного проекта для своих клиентов возникла необходимость реализовать уведомления пользователей о событиях да еще ко всему прочему запилить корпоративный чат.

Проект делается на Laravel 10 на стартере Breeze Inertia + Vue.js.

Историю как я придумывал саму логику уведомлений я оставлю как-нибудь на потом, а вот о том как я распрощался с Pusher я расскажу сейчас. Вообще Pusher, конечно, сервис хороший, но если брать бесплатные лимиты, то там всё достаточно грустно, поэтому я решил использовать что-то другое в качестве альтернативы. Выбор пал на Laravel Websockets.

Для справки, Laravel Websockets — это такая надстройка над Laravel, которая на бэке использует Ratchet, но никаких особых настроек делать не нужно, всё работает практически «из коробки». Правда есть несколько подводных камней, о которых я тоже расскажу.

Начнем, пожалуй! И терпения нам всем.

Для начала ищем сам пакет Laravel Websockets и находим официальную документацию вот тут. Там, в целом всё просто, но, как оказалось пакет не очень-то совместим с Laravel 10. Поэтому вместо того, чтобы устанавливать как написано мы добавляем еще -w:

composer require beyondcode/laravel-websockets -w

Таким образом, он устанавливается без проблем не смотря на некоторые не смертельные конфликты с зависимостями.

Далее прописываем необходимые миграции и конфиги:

php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
php artisan migrate
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"

Собственно, всё. Можно настраивать.

Как известно, Laravel Websockets работает как полная замена Pusher. В настройках Laravel не нужно «химичить», достаточно прописать другой IP сервера и порт, через который будет всё работать. Порт по умолчанию используется 6001. У меня на Debian установлен UFW, собственно, разрешить 6001 порт можно простой командой:

ufw enable 6001

Теперь наш Websockets-сервер готов к использованию. Запустить его можно командой:

php artisan websockets:serve

Тут у меня возникла проблема и стали вылезать ошибки, погуглив я нашел выход из положения и обновил react/promise:

composer require react/promise:^2.3

Все ошибки сразу ушли, сервер ловит подключения, отключения, события. Если нам надо, чтобы сервер работал постоянно, даже когда мы не в консоли, для этого можно использовать пакет Supervisor. Установить его можно вот так:

# Для Debian / Ubuntu
apt install supervisor

# Для Red Hat / CentOS
yum install supervisor
systemctl enable supervisord

После чего делаем следующее:

cd /etc/supervisor/conf.d
touch websockets.conf

Содержание файла websockets.conf достаточно банальное, поменяйте пути и имя пользователя на те, которые используете:

[program:websockets]
command=/usr/bin/php /home/path-to-laravel-echo-install/artisan websockets:serve
numprocs=1
autostart=true
autorestart=true
user=username

Далее сохраняем файл, и вводим две команды:

supervisorctl update
supervisorctl start websockets

Если всё будет нормально, сервер запустится и вы сможете к нему подключаться.

Вот примерно так я установил Laravel Websockets. Как я подключал Vue-приложение и с какими проблемами столкнулся, я расскажу в следующей статье.

Спасибо за внимание!

© Habrahabr.ru