浩文 联系 关于本站 登录 注册
  • 关注新浪微博:
  • 关注微信公众号:

在ubuntu 18.04 LTS server上使用capistrano来自动化部署nginx + mysql + puma + rails 6

在ubuntu 18.04 LTS server上使用capistrano来自动化部署nginx + mysql + puma + rails 6

在ubuntu 18.04 LTS server上使用capistrano来自动化部署nginx + mysql + puma + rails 6

安装环境依赖

安装nginx

sudo apt update
sudo apt install nginx

参考digitalocean上的博客

安装mysql

如果你使用其它数据库,请安装你自己的

参考digitalocean上的博客

sudo apt update
sudo apt install mysql-server

添加capistrano gem

注意: 在开始接下来的步骤前,要确保你的ubuntu 用户运行sudo 命令不需要再次输入密码(即Passwordless sudo用户),不然的话执行cap命令时会出错。

group :development do
  gem "capistrano", "~> 3.14", require: false
end

运行bundler

bundle install

使用生成器

bundle exec cap install

这将创建所有必须的配置文件和结构

├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks

添加capistrano-rails gem

group :development do
  gem "capistrano", "~> 3.10", require: false
  gem "capistrano-rails", "~> 1.6", require: false
end

运行bundler

bundle install

请求所有东西(bundlerrails/assetsrails/migrations):

# Capfile
require 'capistrano/rails'

或者手动请求你需要的组件

# Capfile
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

所有的依赖都应该放在Capfile,而不是在config/deploy.rb

config/deploy.rb中设置项目名和项目git

set :application, "<app_name>"
set :repo_url, "<git地址>"

在config/deploy/production.rb中设置git branch(如果你的branch是master可以省略该步骤)
ruby
set :branch, 'main'

在config/deploy/production.rb中设置server配置

server '<server_id_address>', user: "<user>", roles: %w{app db web}

在config/deploy/production.rb中设置项目部署目录:

# Deploy to the user's home directory
set :deploy_to, "/home/<user>/#{fetch :application}"

在config/deploy.rb中设置软连接像是log,tmp,public/uploads这些文件和文件夹:

# deploy.rb
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads'
append :linked_files, 'config/database.yml', 'config/master.key'

在config/deploy.rb中添加检测代码,检测是否存在master.key和database.yml文件,如果不存在,上传它们

# deploy.rb
# copy file if not exist
namespace :deploy do
  namespace :check do
    before :linked_files, :copy_linked_files_if_needed do
      on roles(:app), in: :sequence, wait: 10 do
        %w{master.key database.yml}.each do |config_filename|
          unless test("[ -f #{shared_path}/config/#{config_filename} ]")
            upload! "config/#{config_filename}", "#{shared_path}/config/#{config_filename}"
          end
        end
      end
    end
  end

end

添加capistrano-rvm gem

group :development do
  gem "capistrano", "~> 3.10", require: false
  gem "capistrano-rails", "~> 1.6", require: false
  gem 'capistrano-rvm'
end

运行bundler

bundle install

添加依赖

# Capfile
require 'capistrano/rvm'

配置rvm(我是用ubuntu-rvm包方式安装的rvm,所以需要该配置)

查找rvm的位置

which rvm

查看命令的输出,我的是

/usr/share/rvm/bin/rvm

配置rvm的位置(因为capistrano-rvm会添加bin/rvm地址,所以只需像下面这样配置)

# deploy.rb 或者 stage 文件 (staging.rb, production.rb 或者 其它的)
set :rvm_custom_path, '/usr/share/rvm'  #只在不能找到rvm时才需要该配置

添加capistrano-puma gem

group :development do
  gem "capistrano", "~> 3.10", require: false
  gem "capistrano-rails", "~> 1.6", require: false
  gem 'capistrano-rvm'
  gem 'capistrano3-puma'
end

运行bunlder

bundle install

添加依赖(这里使用nginx,并且使用capistrano-puma提供的nginx配置文件)

# Capfile
require 'capistrano/puma'
install_plugin Capistrano::Puma
install_plugin Capistrano::Puma::Nginx  # 如果你需要上传nginx站点模板文件

执行:

 cap production deploy

以上命令可能会启动puma,如果启动了,你要找到它的pid

ps -aux | grep puma

并把它杀死

sudo kill <pid>

上传puma配置文件

cap production puma:config

上传nginx配置文件

cap production puma:nginx_config

删除/etc/nginx/sites-enabled目录下的其它配置文件

然后在服务器里重启nginx

sudo service nginx restart

使用systemd启动puma

# Capfile
require 'capistrano/puma'
install_plugin Capistrano::Puma
install_plugin Capistrano::Puma::Nginx  # 如果你需要上传nginx站点模板文件
install_plugin Capistrano::Puma::Systemd

上传和开启puma service

cap production puma:systemd:config puma:systemd:enable

然后用命令sudo systemd start <service_name>开启它

接着再次执行

cap production deploy

如果一切成功,访问你的服务器地址或者域名,应该能看到你的页面。