Capisrano部署,包含Rails新特性的适配(yarn管理assets及credentials)

应用详情


安装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.keyhttps://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端口即可

参考资料