返回首页 - Notes - 2016

部署 Rails(使用 Ubuntu、NGINX、Puma、Mina)


配置操作系统

拿到一台崭新的 Ubuntu 服务器,使用 root 用户登录进去,依次执行下面的指令

  1. locale-gen --lang zh_CN.UTF-8 && dpkg-reconfigure tzdata:设置编码和时区
  2. apt-get update && apt-get upgrade:更新全部已安装的软件包
  3. adduser ruchee:添加日常使用的帐号
  4. usermod -G sudo ruchee:将该用户添加到 sudo 权限组

完成上述操作就可以退出 root 用户的登录了,后续操作都将通过 ruchee 这个用户来完成


用户配置

  1. ssh ruchee@sites.ruchee.com:使用帐号 ruchee 登录服务器,需要输密码
  2. 将本地电脑的公钥增加到 /home/ruchee/.ssh/authorized_keys 文件(该文件如果不存在则自己手动创建),以后登录服务器就不需要再输密码了
  3. ssh-keygen -t rsa -C "my@ruchee.com":生成服务器上的 ssh 秘钥,然后将对应的公钥添加到 Coding 后台,自动部署拉取私有库时需要用到
  4. mkdir ~/Ruchee && cd ~/Ruchee:将自己常用的配置资源拉取保存,并设置好各个软链接
  5. sudo apt-get install nginx mysql-server mysql-client libmysqlclient-dev nodejs:安装 Rails 程序运行所需的支撑软件

Rails环境配置

  1. command curl -sSL https://rvm.io/mpapis.asc | gpg --import -
  2. \curl -sSL https://get.rvm.io | bash -s stable:前两步是安装 RVM
  3. source ~/.bashrc:使 RVM 配置生效
  4. rvm install 2.3.1:安装最新的 Ruby
  5. rvm use 2.3.1 --default:设置为默认使用的 Ruby 版本
  6. gem sources -r https://rubygems.org/ && gem sources -a https://gems.ruby-china.org/:修改默认的 Gem
  7. gem install rails puma --no-ri --no-rdoc:安装必要的 Gem

准备配置文件

项目 Gemfile 里面添加 pumamina 两个 Gem 是毋庸置疑的,此处不详述

Mina 的配置文件:config/deploy.rb

require 'mina/rails'
require 'mina/git'
require 'mina/rvm'


set :domain, 'ruchee@sites.ruchee.com'
set :deploy_to, '/home/ruchee/www/rails_demo'
set :repository, 'git@git.coding.net:ruchee/rails_demo.git'
set :branch, 'master'

set :shared_dirs, fetch(:shared_dirs, []).push('log', 'tmp/cache', 'tmp/pids', 'tmp/sockets')
set :shared_files, fetch(:shared_files, []).push('config/database.yml', 'config/secrets.yml')


task :environment do
  invoke :'rvm:use', 'default'
end

task :setup do
end

task :deploy do
  deploy do
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'
    invoke :'bundle:install'
    invoke :'rails:db_migrate'
    invoke :'rails:assets_precompile'
    invoke :'deploy:cleanup'

    on :launch do
      in_path(fetch(:current_path)) do
        command %{mkdir -p tmp/}
        command %{touch tmp/restart.txt}
        invoke :'puma_restart'
      end
    end
  end
end

task puma_restart: :environment do
  puma_pid = "#{fetch(:current_path)}/tmp/pids/puma.pid"
  command %[
    if [ -e '#{puma_pid}' ]; then
      pumactl -F config/puma_production.rb stop
      pumactl -F config/puma_production.rb start
    else
      pumactl -F config/puma_production.rb start
    fi
  ]
end

Puma 的配置文件:config/puma_production.rb

environment 'production'
threads 2, 64
workers 4

application_path = File.expand_path('..', __dir__)
directory application_path

pidfile "#{application_path}/tmp/pids/puma.pid"
state_path "#{application_path}/tmp/sockets/puma.state"
stdout_redirect "#{application_path}/log/puma.stdout.log", "#{application_path}/log/puma.stderr.log"
bind "unix://#{application_path}/tmp/sockets/puma.sock"
activate_control_app "unix://#{application_path}/tmp/sockets/pumactl.sock"

daemonize true
preload_app!

NGINX 的配置文件(放在服务器上):/etc/nginx/sites-enabled/rails_demo

upstream rails_demo {
    server unix:///home/ruchee/www/rails_demo/current/tmp/sockets/puma.sock;
}

server {
    listen 80;
    server_name demo.sites.ruchee.com;
    root /home/ruchee/www/rails_demo/current/public;

    index index.html;
    try_files $uri @rails_demo;

    location ~ \.(js|css|jpg|jpeg|png|gif|ico)$ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    location ~ ^/assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    location @rails_demo {
        proxy_pass http://rails_demo;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

执行部署

配置文件到位以后,开始第一次的部署工作

  1. bundle exec mina setup:首先到本地项目根目录执行 Mina 的初始化指令,它将自动登录服务器创建一系列文件夹
  2. 确保最新的代码,尤其是 Puma 的配置有 Push 到远程代码仓库
  3. ssh ruchee@sites.ruchee.com
  4. mkdir ~/www/rails_demo/shared/config
  5. cd ~/www/rails_demo/shared/config
  6. 将本地项目的 database.ymlsecrets.yml 两文件,对应地在服务器项目的 shared/config 目录下手动创建,并按服务器配置修改好
  7. 在服务器上登录 MySQL 命令行,并手动创建项目所需的生产模式数据库
  8. sudo nginx -s reload:在服务器上重启 NGINX

回到本地代码目录,执行 bundle exec mina deploy 正式开始部署

如果域名有正确解析,用浏览器访问 demo.sites.ruchee.com 应该就可以看到网站首页了


自动部署

后续代码有更新,只需先 Push 到远程代码仓库,然后在本地执行 bundle exec mina deploy 命令即可


date:2016-09-30