使用capistrano部署Rails(nginx+passenger)到Vultr ubuntu
- vultr ubuntu 16.06
- ruby 2.5
- rails 5.1.7
- mysql 8
- capistrano 3.11.0
Sample project using this steps to depoy to vultr ubuntu: https://github.com/caiwenhn2008/myapp/
新增 deploy 用户
adduser --disabled-password deploy
su deploy
SSH 免密登入设置
#本机
cd ~
ssh-keygen -t rsa
接着复制本机的 ~/.ssh/id_rsa.pub的内容到 服务器的/home/deploy/.ssh/authorized_keys
这样本机就可以直接 ssh deploy@<主机IP位置>,登入无须密码
#远程服务器赋予ssh key权限
#ubuntu
chmod 644 /home/deploy/.ssh/authorized_keys
chown deploy:deploy /home/deploy/.ssh/authorized_keys
#centos
chmod 700 /home/deploy/.ssh
更新和安装ubuntu系统
apt-get update
apt-get upgrade -y
#set system timezone
dpkg-reconfigure tzdata
#setup lib requred by rails
sudo apt-get install -y build-essential git-core bison openssl libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 autoconf libc6-dev libpcre3-dev curl libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev
安装 Ruby
apt-get install software-properties-common
apt-add-repository ppa:brightbox/ruby-ng
apt-get update
apt-get install ruby2.5 ruby2.5-dev
gem install bundler
安装MySQL数据库
apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
#接着我们进入 mysql console 建立新的数据库:
mysql -u root -p
CREATE DATABASE myapp_production CHARACTER SET utf8mb4;
安装 Nginx + Passenger 快方法:用套件安装
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
apt-get install -y apt-transport-https ca-certificates
# Add our APT repository
sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
apt-get update
# Install Passenger + Nginx
apt-get install -y nginx-extras passenger
Nginx启动和重开用法
service nginx start
service nginx stop
service nginx restart
capistrano配置
我们在本地端‘Gemfile’中加上:
gem 'capistrano-rails', :group => :development
gem 'capistrano-passenger', :group => :development
数据库用 MySQL 的话,记得再加上 gem “mysql2”
接着输入bundle install
在capfile中加入Capistrano plugin
在你的Rails专案目录下执行:cap install
Enhance Capistrano with awesome collaboration and automation features? 请输入 no 这样就会产生几个文件,编辑Capfile在中段加入
require 'capistrano/rails'
require 'capistrano/passenger'
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
编辑config/deploy.rb
请替换以下的application名称、git repo网址和deploy_to路径:
`ssh-add` # 注意这是键盘左上角的「 `」不是单引号「 '」
set :application, "myapp"
set :repo_url, "git@github.com:caiwenhn2008/myapp.git"
set :deploy_to, "/home/deploy/myapp"
# Default value for :linked_files is []
append :linked_files, 'config/database.yml', 'config/secrets.yml'
# Default value for linked_dirs is []
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
set :keep_releases, 5
set :passenger_restart_with_touch, true
# ....
设置服务器的IP
其中的ssh-add可以参考SSH agent forwarding 的应用的说明。 编辑config/deploy/production.rb将example.com换成服务器的IP或网域,例如:
server '45.32.59.122', user: 'deploy', roles: %w{app db web}, my_property: :my_value
服务器上新建database.yml和secrets.yml
因为有了shared目录之后,我们还需要把配置放上去,请编辑:
- (远端) 新建 shared/config/database.yml
- (远端) 新建 shared/config/secrets.yml
database.yml和secrets.yml档案预先放在服务器的shared/config目录下,自动布署时会复盖过去。
执行rake secret产生的 key 放到远端服务器的shared/config/secrets.yml,范例如下(小心YAML格式的缩排规则,用两个空格):
production:
secret_key_base: xxxxxxx........
远端服务器设定好shared/config/database.yml,范例如下: production: adapter: mysql2 encoding: utf8mb4 database: your_database_name host: localhost username: root password: your_database_password
capistrano 部署
本机执行cap production deploy:check,就会自动登入远端的服务器,在登入的帐号下新建releases和shared这两个目录,releases是每次布署的目录,shared目录则是不同布署目录之间会共享的。
到此终于可以部署了,执行cap production deploy就可以了。这会建立current这个目录用symbolic link指向releases目录下最新的版本。
Nginx 配置
enable passenger
编辑 /etc/nginx/nginx.conf,打开以下一行:
include /etc/nginx/passenger.conf;
在 /etc/nginx/nginx.conf最上方新增一行:
env PATH;
add rails project configuration
新增 /etc/nginx/sites-enabled/myapp.conf
server {
listen 80;
server_name 45.32.59.122; # 还没 domain 的话,先填 IP 位置
root /home/deploy/myapp/current/public;
# 如果是自动化部署,位置在 root /home/deploy/your_project_name/current/public;
passenger_enabled on;
# passenger min process number
passenger_min_instances 5;
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
restart nginx:
service nginx restart
Passenger 监控指令
passenger-status
passenger-memory-stats