世界上最伟大的投资就是投资自己的教育

首页服务器部署
随风 · 凡人

部署之使用 mina 来部署 Ruby on Rails 应用之进阶 (八)

随风发布于1451 次阅读

1. 编写 Mina tasks

Mina是一个强大的部署工具,mina setupmina deploy只是 mina 工具中的两个 tasks。Mina还提供了各种 tasks。用mina tasks可以列出所有的 task。我们也可以编写我们自己的 task。

例如查看生产环境的日志。

desc "Shows logs."
task :logs do
  queue %[cd #{deploy_to!}/current && tail -f log/production.log]
end

desc "Display the unicorn logs."
task :unicorn_logs do
  queue 'echo "Contents of the unicorn log file are as follows:"'
  queue "tail -f #{deploy_to}/current/log/unicorn.log"
end

如果你的命令要加 sudo 的话,那可以这样写。

desc "Display the cron log"
task :cron_log do
  queue "sudo tail -f /var/log/syslog | grep CRON"
end

其他例子

desc "Display the redis memory information"
task :redis_memory do
  queue 'redis-cli info memory'
end

desc "Display the redis statues information"
task :redis_stats do
  queue 'redis-cli info stats'
end

desc "Using request-log-analyzer display production log"
task :request_log_analyzer do
  invoke :'rbenv:load'
  queue! "cd #{deploy_to}/#{current_path} && BUNDLE_GEMFILE=#{bundle_gemfile} #{bundle_prefix} request-log-analyzer #{deploy_to}/current/log/production.log"
end

2. 编写 Mina puma 服务

使用actioncable时,需要开启 websocket 的服务器,这个 gem 是用bundle exec puma -p 28080 cable/config.ru来部署的,但我们需要结合Mina来自动部署。

其实是有mina-puma这个 gem 的,只是不能直接拿来用,这个 gem 的源码很简单,我仿照它的源码写了个部署脚本。

set :puma_cmd, -> { "#{bundle_prefix} puma" }
set :puma_pid, -> { "#{deploy_to}/#{shared_path}/pids/puma.pid" }
set :puma_state, -> { "#{deploy_to}/#{shared_path}/pids/puma.state" }
set :pumactl_cmd, -> { "#{bundle_prefix} pumactl" }
set :puma_env, -> { fetch(:rails_env, 'production') }
set :pumactl_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/pumactl.sock" }
set :puma_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/puma.sock" }

desc 'Start puma'
task :puma_start => :environment do
  queue! %[
    if [ -e '#{pumactl_socket}' ]; then
      echo 'Puma is already running!';
    else
      cd #{deploy_to}/#{current_path} && #{puma_cmd} -q -d -e #{puma_env} -b 'unix://#{puma_socket}' -S #{puma_state} --pidfile #{puma_pid} --control 'unix://#{pumactl_socket}' #{deploy_to}/#{current_path}/cable/config.ru
    fi
  ]
end

desc 'Stop puma'
task :puma_stop => :environment do
  queue! %[
    if [ -e '#{pumactl_socket}' ]; then
      echo 'Puma is stopping!'
      cd #{deploy_to}/#{current_path} && #{pumactl_cmd} -S #{puma_state} stop
      rm -f '#{pumactl_socket}'
    else
      echo 'Puma is not running!';
    fi
  ]
end

desc 'Restart puma'
task puma_restart: :environment do
  invoke :'puma_stop'
  invoke :'puma_start'
end

代码很容易看懂,原理也简单,都是利用命令。

3. 其他各种插件

Mina的官方 github 的 readme 页面有列出了各种第三方插件。这些插件源码都很简单,使用起来也方便,都是几条命令就可以搞定的。

只是有个地方要注意的是,在添加 gem 到 Gemfile 文件的时候,是要这样添加的gem 'mina-xxx', require: false

值得一提的是这个插件mina-multistage,它能让你部署多个线上应用环境。例如你可以用 test.aa.com 作为线上的测试环境,www.aa.com 才是真实生产环境。这个 gem 能处理好这件事。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
我的微信官网服务号精品文章订阅号微信视频号
程序员随风
统计信息
    学员: 21804
    视频数量: 1428
    文章数量: 457

© 汕尾市求知科技有限公司 | 专业版网站 | 关于我们 | 在线学员:1145

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top