Гудбай Pusher, привет Laravel Websockets
Так получилось, что при создании очередного проекта для своих клиентов возникла необходимость реализовать уведомления пользователей о событиях да еще ко всему прочему запилить корпоративный чат.
Проект делается на 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-приложение и с какими проблемами столкнулся, я расскажу в следующей статье.
Спасибо за внимание!