部署 Mina + Rails 5.2 自动化部署

canonpd · 2018年06月06日 · 最后由 Fighting_3 回复于 2018年10月12日 · 9622 次阅读

原文地址 https://itfun.tv/news/48

Mina的部署流程比Capistrano要简单容易很多,碰到的问题也少很多。我两个对比后,给你的建议是:

如果你的项目比较大,需要多台服务器,推荐Capistrano。项目比较小,那么推荐Mina

我现在开发的项目,还是一个非常小的项目。只需要一台配置很一般的服务器就足够运行了。本打算选 Mina 的,但听了管理员的建议,正式项目,还是打算用 Cap 部署了。就算为将来增加服务器考虑,Cap 是个不错的选择。

前言

这里就不重复说明,Rails建项目rbenvGitSSH秘钥NginxPassengerMySQL等相关的配置了。如果你完全是新手,可以看我上一篇 「Capistrano + Rails 5.2 自动化部署」,里面有详细的基础部署流程。这些流程在Mina部署中,几乎完全一模一样。不一样的地方,下面流程中会单独指出。

一、安装 Mina

# 本地命令行
gem install mina

二、创建 Mina 的配置文件

cd进入自己的Rails项目目录

mina init

会生成config/deploy.rb这个配置文件。要做的就是对这个文件做一些配置。具体配置如下

# 需要引入的插件
require 'mina/rails'
require 'mina/git'
require 'mina/rbenv'

set :application_name, 'itfun.tv'       # 项目名称
set :domain, '114.67.72.94'             # 服务器域名或ip 
set :deploy_to, '/home/deploy/deployment'    # 项目部署在服务器的什么地方

#Git仓库地址
set :repository, '[email protected]:aaronryuu/deployment.git'
set :branch, 'master'                   # Git的分支
set :user, 'deploy'                     # SSH连接服务器的用户名

# 使用本地的`SSH秘钥`去服务器执行`git pull`,这样`Git`上就不用设置`部署公钥`。
set :forward_agent, true                

# 一些公共的文件
# 如果你使用的Rails 5.2以下版本,将`config/master.key`,改为`config/secrets.yml`
set :shared_files, fetch(:shared_files, []).push('config/database.yml', 'config/master.key')

# 对rbenv的支持
task :remote_environment do
  invoke :'rbenv:load'
end                     

三、服务器生成 Mina 的相关目录

# 本地
mina setup

然后你需要SSH到服务器上,在~/deployment/shared/config目录中,新建以下两个文件

1. database.yml

cd ~/deployment/shared/config
vim database.yml

根据自己实际项目,填上数据库配置的相关内容。

production:
  adapter: mysql2
  pool: 25
  encoding: utf8mb4
  database: deployment_production
  host: localhost
  username: root
  password: itfun

2. master.key

vim master.key

将自己本地Rails项目config/master.key中的内容,复制进去。

Tips: 如果是Rails 5.2以下版本,这里改成 config/secrets.yml

四、正式部署

# 本地
mina deploy

成了,没有更多了~

五、Mina 对 Sidekiq 的支持

1. 先安装

# 本地
gem install mina-sidekiq
# 服务器上
sudo apt-get install redis-server

2. config/deploy.rb添加相关配置

# 引入插件
require 'mina_sidekiq/tasks'


task :setup do
  # sidekiq 存放 pid文件 和 log文件 的路径
  # 跑 mina setup 时,服务器会自动生成这些目录
  command %(mkdir -p "#{fetch(:deploy_to)}/shared/pids/")
  command %(mkdir -p "#{fetch(:deploy_to)}/shared/log/")
end

# 跑 mina deploy 时,会先停止 sidekiq 再重新启动。
task :deploy do
  deploy do
    invoke :'git:clone'

    # 停止 sidekiq
    invoke :'sidekiq:quiet'
    invoke :'deploy:link_shared_paths'
    ...

    on :launch do
      ...

      # 重启 sidekiq
      invoke :'sidekiq:restart'
    end
  end
end

3. 部署

# 本地
mina setup
mina deploy

我在部署时,出现了一个错误,提示我

bundle: command not found

查了GitHubIssues后发现是rbenv配置的问题

# 服务器上
vim ~/.bashrc
# 将文件最底部的这两行代码,挪到文件最上面,一定要在 case 语句的上面就行。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

重新部署,一切正常了。

# 本地
mina setup
mina deploy
canonpd Capistrano + Rails 5.2 自动化部署 提及了此话题。 06月06日 10:58
canonpd Capistrano + Rails 5.2 自动化部署 提及了此话题。 06月06日 11:00

可以在 config 下面建个 deploy 文件夹,做不同的配置。类似与 rails 的环境配置

两个都用过,mina 用的时间长,反而觉得 mina 问题很多,capistrano 反而很省心。

建议用 cap 不要用 mina,mina 处理方式太粗暴(合成一个脚本无法回滚),不支持多机部署,有明显缺陷。

Rei 回复

谢谢,那就 Cap 了,两个部署的流程我都已熟练了。代码还在进一步调整,升到 Rails 5.2。测试下没问题了,我就正式部署。

jonnoj 回复

为将来加机器做准备,Cap 是个明智的选择。

@Rei 请教下,还有个选择,我比较犹豫。是用 passenger 好,还是 puma 好?求推荐。项目里有大量 action cable 相关的代码,现在就是不知道该选哪个,运行的会更好一些。

开始用的 Mina,后来改用了 cap,虽然有点慢,但配置好就没出过问题。

canonpd 回复

这两个设计思维不一样,看你喜欢哪种:

passenger - 系统守护进程,背后默默搞定很多事,只要把应用路径配置好就行。
puma - 需要自己了解进程管理、信号机制等等。

我现在用的是 puma,因为是 Rails 默认。

两个我都试过,cap 更省心一些

你好,我按照你的方法尝试了一下,卡在这里了。 服务器是 centos7,用 rvm 装了 2 个 ruby 版本 2.0.0 和 2.5.1。 执行 mina deploy 的时候报错,如下:

Using git branch 'master'
       正克隆到 '.'...
       完成。
-----> Using this git commit
       zheng (1405266):
       > mina部署代码修改
-----> Symlinking shared paths
-----> Installing gem dependencies using Bundler
       Ignoring executable-hooks-1.5.0 because its extensions are not built. Try: gem pristine executable-hooks --version 1.5.0
       Ignoring gem-wrappers-1.4.0 because its extensions are not built. Try: gem pristine gem-wrappers --version 1.4.0
       Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
       installing your bundle as root will break this application for all non-root
       users on this machine.
       Your Ruby version is 2.0.0, but your Gemfile specified 2.5.1
 !     ERROR: Deploy failed.
-----> Cleaning up build
       Unlinking current
       OK
       Connection to 47.92.81.0 closed.

 !     Run Error

服务器上已经把 2.5.1 设置成默认版本了,项目里.ruby-version 文件里也是 2.5.1,花了一下午时间一直没解决这个问题。 PS:服务器上我没有新开用户,直接用 root 的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号