Capisrano部署,包含Rails新特性的适配(yarn管理assets及credentials)
应用详情
- Centos 6.5
- Ruby 2.5.1
- Rails 5.2
- Postgresql 9.6
- Nginx 1.10.2
- Redis 3.2.12-1
- Capsitrano 3.11.0
- Sidekiq 5.2.1
- yarn 1.9.4
安装ruby环境
https://www.imshanks.com/2016/11/10/centos-install-ruby.html
中间件/数据库/相关工具安装
nginx & redis
yum install -y nginx redis
nodejs(yarn依赖4.0以上的nodejs)
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
Postgresql 9.6
yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum install -y postgresql96 postgresql96-server postgresql96-devel
vi /var/lib/pgsql/9.6/data/pg_hba.conf
local all postgres trust
创建用户设置密码
service postgresql-9.6 start
sudo -s -u postgres
psql
ALTER USER "postgres" WITH PASSWORD 'Pwd2018';
配置capsitrano
Gemfile
group :development do
gem "capistrano"
gem 'capistrano-bundler'
gem 'capistrano-rails'
gem 'capistrano3-puma'
gem 'capistrano-sidekiq'
gem 'capistrano-rbenv'
gem 'capistrano-yarn'
end
Capfile
require "capistrano/setup"
require "capistrano/deploy"
#根据实际需求取舍
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/puma'
require 'capistrano/yarn'
require 'capistrano/sidekiq'
require "whenever/capistrano"
require "capistrano/scm/git"
install_plugin Capistrano::Puma
install_plugin Capistrano::SCM::Git
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
config/deploy.rb
lock "~> 3.11.0"
set :application, "demoapp"
set :repo_url, "git@git.github.com:username/demoapp.git"
set :rbenv_ruby, "2.5.1"
set :user, "demoapp"
set :use_sudo, true
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/master.key')
config/deploy/production.rb
role :app, %w{1.1.1.1}
role :web, %w{1.1.1.1}
server '1.1.1.1', user: 'demoapp', roles: %w{web app db}
#或者配置免密登陆
set :ssh_options, {
forward_agent: false,
password: 'PASSWORD'
}
set :deploy_to, '/home/www/demoapp'
# PUMA
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock"
set :puma_default_control_app, "unix://#{shared_path}/tmp/sockets/pumactl.sock"
set :puma_conf, "#{shared_path}/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, [16, 32]
set :puma_workers, 2
set :puma_init_active_record, false
set :puma_preload_app, true
应用发布
capsitrano一键部署
cd demoapp(项目根目录)
cap production deploy
此时会创建/home/www/demoapp目录,提示需要在shared/config下准备database.yml及master.key(https://medium.com/cedarcode/rails-5-2-credentials-9b3324851336)
demoapp/shared/config/database.yml
production:
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 10 } %>
database: demoapp_production
username: postgres
#credentials.yml.enc中配置password
password: <%= Rails.application.credentials.db[:password] %>
之后在执行cap production deploy,会提示数据库未创建,进入到release下任意一个时间戳目录执行
bundle exec rake db:create
bundle exec rake db:migrate
bundle exec rake db:seed
然后重新执行部署命令cap production deploy,会提示puma启动成功
配置nginx反向代理
nginx.conf
user root;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
conf.d/demoapp.conf
upstream demoapp {
server unix:/home/www/demoapp/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /home/www/demoapp/current/public;
location / {
proxy_pass http://demoapp;
proxy_set_header Host $host:80;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1024m;
# add_header Access-Control-Allow-Origin *;
}
location ~* ^/(uploads|assets|public)/ {
expires 1y;
add_header Cache-Control public;
gzip_static on;
add_header Last-Modified "";
add_header ETag "";
break;
}
}
service nginx restart
访问80端口即可