Blog #21

Capistrano and Sidekiq

# Reason

Cũng gần giống như blog trước. Mình sử dụng Sidekiq hơn 2 năm và luôn muốn tìm được cách restart Sidekiq cùng với Capistrano chỉ với 1 câu lệnh.   

Sau nhiều lần thất bại thì mình đã thật sự nản và chẳng muốn tiếp tục nữa. Mình đã tự có cách work-around nhưng mà gần đây ssh-action có vấn đề. Cụ thể là ở report của mình. Và nhiều ngày trôi qua mình vẫn chưa tìm được cách khắc phục. Đột nhiên mình muốn đi tìm căn nguyên của vấn đề.

Sau nhiều lần thất bại thì hôm nay đây mình đã tìm được cách thuần phục em nó. Vì vậy hôm nay mình sẽ hướng dẫn mọi người sử dụng Sidekiq cùng với Capistrano.

Tuy là chỉ cần thêm vài dòng lệnh nhưng mà nó tốn rất nhiều thời gian research của mình, nhiều lần thất bại và tưởng chừng không bao giờ thuần phục được. Nhưng mà vẫn như mọi lần, chỉ cần không bỏ cuộc thì đích đến ở phía trước.

Hehe các bạn không biết là mình cảm thấy vui như thế nào đâu. Cảm giác như là tìm thấy kho vàng ở trong thâm sơn cùng cốc vậy  

# Getting started

Đầu tiên là update Gemfile

Nếu bạn đang sử dụng Sidekiq version thấp hơn 6.0.6 thì upgrade lên version ≥ 6.0.6 nha mọi người. Đây là điều kiện tiên quyết khi cài đặt gem capistrano-sidekiq.

gem 'sidekiq', '~> 6.1.3'
group :development do
  gem 'capistrano-sidekiq', require: false, github: 'seuros/capistrano-sidekiq'
end

Chạy bundle:

$ bundle install

Tiếp theo update deploy.rb, chú ý:

server 'xxx.xxx.xxx', port: 22, roles: [:web, :app, :db, :worker]
set :sidekiq_service_unit_name, -> { "sidekiq_#{fetch(:application)}_#{fetch(:rails_env)}" }
set :sidekiq_systemctl_user, :system
set :service_unit_user, :system
set :sidekiq_config, 'config/sidekiq.yml'

Update Capfile:

require 'capistrano/sidekiq'
install_plugin Capistrano::Sidekiq
install_plugin Capistrano::Sidekiq::Systemd

Tiếp theo SSH lên server và sửa deploy user như sau:

deploy  ALL=(ALL:ALL) ALL # deploy là user name

SSH lên server và tạo service file (Dựa vào sidekiq_service_unit_name mà các bạn setting):

$ sudo nano /etc/systemd/system/sidekiq_AppName_staging.service

Update User (Cái này cực kì quan trọng nha nếu không có cái này thì nó sẽ lỗi và loop, mình đã tốn rất nhiều thời gian để phát hiện ra nguyên nhân)

[Unit]
Description=Sidekiq HTTP Server for api (staging)
After=network.target

[Service]
Type=simple
User=deploy # deploy là tên user ubuntu mà các bạn dùng để deploy (ssh)
WorkingDirectory=/home/deploy/project/AppName/staging/current
ExecStart=/home/deploy/.rvm/bin/rvm ruby-3.0.1 do bundle exec sidekiq -e staging -C config/sidekiq.yml
RestartSec=1
Restart=always

StandardOutput=append:/home/deploy/project/AppName/staging/shared/log/sidekiq_error.log
StandardError=append:/home/deploy/project/AppName/staging/shared/log/sidekiq_access.log

SyslogIdentifier=sidekiq

[Install]
WantedBy=multi-user.target

Sau khi lưu lại thì các bạn phải chạy lệnh này để nó lưu lại setting:

$ sudo systemctl daemon-reload

Trước khi deploy thì nhớ chạy lệnh ExecStart để tạo sidekiq PID trước nha.
Ok từ bây giờ các bạn có thể deploy chỉ với 1 câu lệnh. Good luck :D

À nhớ kill sidekiq PID cũ sau khi deploy thành công nha: