Rails 5 自动化部署
这篇文章主要记录我参考这篇文章来部署我项目(使用Capistrano
自动部署)的过程,下面是我开发环境和生产环境介绍:
- 开发环境
macOS 10.13
+rbenv(ruby 2.4.2)
+sqlite
- 生产环境
Ubuntu 16.04
+rbenv(ruby 2.4.2)
+mysql
项目托管在
GitHub
上
通过 ssh-key
无密码登录服务器
在本地运行以下命令创建 `ssh-key`:
cd
# 把 YOUR_EMAIL 换成你的 email
ssh-keygen -t rsa -b 4096 -C "YOUR_EMAIL"
在服务器上,创建一个名为 `deploy` 的用户来部署项目,运行命令:
sudo adduser deploy
sudo adduser deploy sudo
su deploy
注:
sudo adduser deploy
:创建一个名为deploy
的用户sudo adduser deploy sudo
:把deploy
这个用户添加到sudo
用户组su deploy
:切换到deploy
用户
在本地运行以下命令把 ssh-key
拷贝到服务器上:
# 把 SERVER_IP 换成你的服务器 IP
ssh-copy-id deploy@SERVER_IP
以后登录服务器只需运行 ssh deploy@SERVER_IP
不需要密码就可以z自动登录到服务器
安装 Ruby
在服务器上,运行以下命令安装部署需要的软件和库
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev nodejs
安装 rbenv
来管理 ruby
版本(关于 rbenv
,参考 这儿 )
cd
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
rbenv install 2.4.2
rbenv global 2.4.2
ruby -v
安装 Bundler
gem install bundler
安装 Nginx
以下配置、命令都需要用
sudo
权限来执行
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt-get install -y apt-transport-https ca-certificates
# Add Passenger APT repository
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update
# Install Passenger & Nginx
sudo apt-get install -y nginx-extras passenger
打开 /etc/nginx/nginx.conf
找到 # include /etc/nginx/passenger.conf
这一行去掉前面的注释:
##
# Phusion Passenger
##
# Uncomment it if you installed ruby-passenger or ruby-passenger-enterprise
##
include /etc/nginx/passenger.conf;
打开 /etc/nginx/passenger.conf
,添加配置:
passenger_ruby /home/deploy/.rbenv/shims/ruby;
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
执行 sudo service nginx restart
重启 Nginx
安装 MySQL
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
你可以创建新账号用于这次部署,关于
MySQL
创建新用户,参考这儿。然后创建一个database
,数据库名字根据你项目里的database.yml
来配置,比如:
create database `my_app_production`
Capistrano 安装配置
配置
Capistrano
确保你本地环境而不是服务器上
把以下 gems
添加到你项目的 Gemfile
里,然后 bundle
安装
gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano-rbenv'
运行下面命令生产 Capistrano
配置文件
cap install STAGES=production
通过上面的命令,产生了一些文件,打开在项目主目录下的 Capfile
文件,添加配置:
require 'capistrano/rails'
require 'capistrano/rbenv'
set :rbenv_type, :user
set :rbenv_ruby, '2.4.2'
打开 config/deploy.rb
添加以下配置:
set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_repo.git"
set :deploy_to, "/home/deploy/my_app_name"
append :linked_files, "config/database.yml", "config/secrets.yml"
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
打开 config/deploy/production.rb
添加以下配置:
# 把 127.0.0.1 换成你服务器的 IP!
server '127.0.0.1', user: 'deploy', roles: %w{app db web}
更多关于
Capistrano
,参考这儿
添加 Nginx Host
打开 /etc/nginx/sites-enabled/default
,添加:
server {
listen 80;
listen [::]:80 ipv6only=on;
# 把 mydomain.com 改成你的域名
server_name mydomain.com;
passenger_enabled on;
rails_env production;
# 把 my_app_name 改成你之前配置的
root /home/deploy/my_app_name/current/public;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
连上数据库
建议把像 database.yml
和 secrets.yml
这里配置文件不要加入 git
,创建两个*.yml.example
echo "config/database.yml\nconfig/secrets.yml" >> .gitignore
git add -A
git mv config/secrets.yml config/secrets.yml.example
git mv config/database.yml config/database.yml.example
git commit -m "Capistrano configs"
cp config/secrets.yml.example config/secrets.yml
cp config/database.yml.example config/database.yml
执行 cap production deploy
第一次自动化部署,可以看到报错信息(因为没有配置 database.yml
、secrets.yml
文件)
linked file /home/deploy/build.gorails.com/shared/config/database.yml does not exist on IP_ADDRESS
在服务器上创建 database.yml
文件,配置:
# /home/deploy/my_app_name/shared/config/database.yml
production:
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <%= ENV['BLOG_DATABASE_PASSWORD'] %>
host: localhost
database: blog_production
在服务器上创建 secrets.yml
文件,在项目主目录执行 rails secret
生成 secret_key
填到 YOUR_SECRET_KEY
位置
# /home/deploy/my_app_name/shared/config/secrets.yml
production:
secret_key_base: YOUR_SECRET_KEY
在本地运行 cap production deploy
部署。完成后,在服务器上运行 touch my_app_name/current/tmp/restart.tx
重启网站。
完。