Рубрики
Uncategorized

Развертывание Anycable с Capistrano и SystemD

Управляйте AnyCable и любым другим процессом Ruby с SystemD и Capistrano. Помечено Systemd, DevOps, Rails, Capistrano.

Прежде всего, если вы все еще не знаете, что такое Anycable чем, вероятно, вы никогда не пробовали WebSockets в Rails. «WTF ??? «Вы, вероятно, скажете, и вы правы. Да, у нас есть DiageCable, поскольку Rails 5.x, но вы действительно верите, что Ruby подходит для веб-сайтов в реальном времени? У меня плохие новости для вас.

AnyCable приносит производительность, стабильность и масштабируемость в WebSockets в Rubby/Rails. По какой-то причине ему не хватает только одно — документация развертывания.

Мы первичным использованием AWS как инфраструктурное решение и довольны этим. CAPISTRANO дает нам электроинструмент для запуска сценариев развертывания, пока AWS позволяет быстро масштабировать и легко (да, нам не нужно Docker:)). Каждый день мы управляем Unicorn, Puma, Sidekiq с пользовательскими рецептами CAPistrano и не иметь проблем с этим. Все работает гладко и кажется правильным. С помощью Anycable вы не можете использовать Capistrano так просто, потому что Anycable не может быть представлен из коробки. Я бегу вперед и говорю, что это была отправная точка для твердого, единого раствора развертывания.

Anycable встречается с системой

После некоторых соображений я понял, что единорог или Sidekiq или PUMA являются только теми же системными процессами, что и Nginx или PG, и их следует контролировать системой. Вы должны встретиться со мной сейчас:) Что используется в современном Linux Distries для управления услугами? Конечно, это Systemd Отказ Так почему бы не использовать его, чтобы управлять Anycable?

Прежде всего, давайте создадим новый сервис для Anycable Отказ

# /etc/systemd/system/your-project-anycable.service

[Unit]
Description=anycable for your-project
After=syslog.target network.target

[Service]
Type=simple
Environment=RAILS_ENV=staging
WorkingDirectory=/path-to-your-project/current/
ExecStart=/bin/bash -lc 'bundle exec anycable' #additional arguments can be added here
ExecStop=/bin/kill -TERM $MAINPID
User=www
Group=www
UMask=0002
MemoryHigh=2G
MemoryMax=3G
MemoryAccounting=true
RestartSec=1
Restart=on-failure

[Install]
WantedBy=multi-user.target

Я почти уверен, что 3 гигабайта будет достаточно для процесса Ruby:) После добавления новой службы не забудьте перезагрузить Systemd Отказ

systemctl daemon-reload

Теперь вы можете управлять своим экземпляром Anycable:

sudo systemctl stop|start|restart your-project-anycable

И не забудьте включить AnyCable при загрузке:

systemctl enable your-project-anycable

Тот же подход должен быть применен к Anycable-Go. Добавить новый сервис, перезагрузить Systemd Включите его на загрузке.

# /etc/systemd/system/your-anycable-go.service

[Unit]
Description=anycable-go for your-project
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/srv/www/go
ExecStart=/srv/www/go/bin/anycable-go -port 3334 --ssl_cert=/path/to/your/certificate.pem --ssl_key=/path/to/your/privkey.pem 
ExecStop=/bin/kill -TERM $MAINPID
UMask=0002
RestartSec=1
Restart=on-failure

[Install]
WantedBy=multi-user.target

Последний является Capistrano, давайте создадим новый рецепт и добавьте его в развертывание сценария.

# config/deploy/recipes/anycable.rb

# frozen_string_literal: true

namespace :anycable do
  task :stop do
    on roles(:sidekiq) do
      execute :sudo, :systemctl, :stop, fetch(:anycable_systemctl_service_name)
    end
  end

  task :start do
    on roles(:sidekiq) do
      execute :sudo, :systemctl, :start, fetch(:anycable_systemctl_service_name)
    end
  end

  task :restart do
    on roles(:sidekiq) do
      execute :sudo, :systemctl, :restart, fetch(:anycable_systemctl_service_name)
    end
  end
end
# config/deploy/production.rb
...
set :anycable_systemctl_service_name, 'your-project-anycable'

after 'deploy:publishing', 'anycable:restart'
...

Почему Вы следует использовать Systemd Чтобы управлять службой Ruby и какие услуги можно управлять?

Как я уже сказал, что Anycable вот просто пример, и мы уже мигрировали единорог и Sidekiq в Systemd. слишком. С Systemd Ваше заявление получает:

  • Унифицированный способ начать, остановить, перезапустить каждую его часть
  • Все необходимые компоненты будут загружены на загрузку
  • Вы можете быстро получить статус ваших процессов
  • Интеграция с различными службами мониторинга (например, Nagios), потому что у них уже есть Systemd Интеграция.

Оригинал: «https://dev.to/jetrockets/deploy-anycable-with-capistrano-and-systemd-49j0»