在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
安装环境依赖
- rvm
- ruby
- bundler gem
- git
- yarn
- 较新版本的node
安装nginx
sudo apt update
sudo apt install nginx
安装mysql
如果你使用其它数据库,请安装你自己的
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
请求所有东西(bundler
,rails/assets
和rails/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
如果一切成功,访问你的服务器地址或者域名,应该能看到你的页面。