Blog #21
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
Đầ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ú ý:
worker
sidekiq_service_unit_name
đặt như vậy (default là sidekiq). Ví dụ khi env = staging thì service file là sidekiq_AppName_staging.service
service_unit_user
cái này cũng cực kì quan trọng, mình đã tốn rất nhiều thời gian để tìm ra được setting này. Nếu không thì mình vẫn chưa viết được cái blog này đâu :>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):
sidekiq
=> tạo file /etc/systemd/system/sidekiq.service
“sidekiq_#{fetch(:application)}_#{fetch(:rails_env)}”
=> tạo file theo env => sidekiq_AppName_staging.service
$ 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: