自己实践:两台 ubuntu 系统间的部署 ,从上到下,一步一步去实现
第一步: 安装网站服务器 ( ubuntu 16.04 )
第二步:安装 ruby、rails 环境
$ sudo apt update
$ sudo apt upgrade -y
$ sudo dpkg-reconfigure tzdata
进入选单选你的 Time zone=>Asia=>chongqing | shanghai
接着我们安装新的套件们,这些是 Ruby on Rails 所需要的东西。请输入以下一行指令:
$ sudo apt 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 慢放法:自行编译原始码
$ wget http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz
$ tar xvfz ruby-2.4.0.tar.gz
$ cd ruby-2.4.0
$ ./configure
$ make
$ sudo make install
请把 2.4.0 换成你项目使用的 ruby 版本号
$ ruby -v
$ gem install bundler
$ bundler -v
安装 postgresql 数据库
$ sudo apt install postgresql libpq-dev postgresql-contrib
修改帐号 postgres 的密码
切换到 postgres 用户
$ sudo su - postgres
使用 psql 命令登录 postgresql 控制台
$ psql
使用 \password 命令,为 postgres 用户设置一个密码
> \password your_password
创建数据库
> CREATE DATABASE your_app_database_name OWNER postgrs;
退出
\q
第三步:安装 Nginx + Passenger 快方法:用套件安装
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
$ sudo apt install -y apt-transport-https ca-certificates
# Add our 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 update
# Install Passenger + Nginx
$ sudo apt install -y nginx-extras passenger
打开你的浏览器,输入 服务器 IP 地址,应该就可以看到默认的 Nginx 网页了:Welcome to nginx on Ubuntu!
Nginx启动和重开用法:
$ sudo service nginx start
$ sudo service nginx stop
$ sudo service nginx restart
第四步:新增 deploy 用户
$ sudo adduser --disabled-password deploy
$ sudo su deploy
$ cd ~
$ ssh-keygen -t rsa
接着复制开发机器的 ~/.ssh/id_rsa.pub 到 服务器的 /home/deploy/.ssh/authorized_keys
在本机电脑 Terminal 输入 cat ~/.ssh/id_rsa.pub,会出现一串文字,复制下来
在 服务器 Terminal 上输入 vi /home/deploy/.ssh/authorized_keys,进入vi去编辑该档,把上一个步骤的视窗内的文字copy贴上到vi内,然后 :wq 离开
$ chmod 644 /home/deploy/.ssh/authorized_keys
$ chown deploy:deploy /home/deploy/.ssh/authorized_keys
这样开发机器就可以直接 ssh deploy@<服务器IP地址>,登入无须密码
备注:还需将服务器的 /home/deploy/.ssh/id_rsa.pub 复制到代码远程仓库 ssh_keys
第五步:设定 Nginx
输入 exit 回到 root 帐号
编辑 /etc/nginx/nginx.conf,去掉注释打开以下一行:
include /etc/nginx/passenger.conf;
在 /etc/nginx/nginx.conf最上方新增一行:
env PATH;
少这一行的话,等会 Rails 会找不到 nodejs 的路径,在 nginx error log 中会有 Message from application: There was an error while trying to load the gem ‘uglifier’. Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. 的错误。
新增 /etc/nginx/sites-enabled/your_project_name.conf
server {
listen 80;
server_name your_domain.com; # 还没 domain 的话,先填 服务器 IP 地址
root /home/deploy/your_app_name/public;
# 如果是自动化部署,位置在 root /home/deploy/apps/your_app_name/current/public;
passenger_enabled on;
passenger_min_instances 1;
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
以上设定包括设定Assets静态档案成为永不过期(Rails的Assets Pipeline会加上版本号,所以不需要担心)、设定Passenger至少开一个Process。其中server_name your_domain.com请会换成你的domain。如果Domain name还没注册好,可以先用服务器IP地址。但是如果你的服务器上有多个Rails专案或网站,就必须用不同domain来区分。
如果有多个domain连到同一个服务器,可以用空白区隔,例如:
server_name dureading.calvinchu.cc dureading.com www.dureading.com;
这样三个 domain 都会连到同一个 Rails 了。
最后执行sudo service nginx restart便会启用Nginx设定。如果之后你的Rails有任何修改要重新加载,但是并不想把Nginx整个重开,请在你的Rails应用程式目录下执行touch tmp/restart.txt即可,这样Passenger就会知道要重新加载Rails,而不需要重开Nginx。
第六步:使用 capistrano 设定自动化布署脚本
在Gemfile中添加Capistrano和其它用到的插件
group :development do
gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano-bundler'
gem 'capistrano-passenger'
end
在项目中初始化 Capistrano
$ cap install
会生成如下目录文件,Capfile 用来配置 Capistrano,deploy.rb 是一些共用 task 的定义,而 production.rb / staging.rb 用来定义具体的 stage 的 tasks。
├── Capfile
├── config
│ ├── deploy
│ │ ├── production.rb
│ │ └── staging.rb
│ └── deploy.rb
└── lib
└── capistrano
└── tasks
配置 Capistrano
在 Capfile 文件中开启要用到的一些插件
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/passenger'
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
在 config/deploy.rb 文件中配置共用变量
lock "3.7.2"
set :application, 'your_app_name'
set :deploy_user, 'deploy'
set :repo_url, 'git@bitbucket.org:your_user_id/your_app_name.git' # 项目代码远程仓库地址 github,bitbucket 或者其它代码管理仓库
# how many old releases do we want to keep, not much
set :keep_releases, 5
# files we want symlinking to specific entries in shared
set :linked_files, %w{config/database.yml config/secrets.yml}
# dirs we want symlinking to shared
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
namespace :deploy do
after :finishing, 'deploy:cleanup'
end
`ssh-add` # 注意这是键盘左上角的「 `」不是单引号「 '」
set :passenger_restart_with_touch, true
在 config/deploy/production.rb 中配置具体的 stage 的 tasks
set :stage, :production # 部署的环境
set :branch, 'master' # 部署的代码分支
set :rails_env, :production
server 'xxx.xxx.xxx.xxx', user: "#{fetch(:deploy_user)}", roles: %w{app db web} # server 填域名或者服务器的 IP 地址
set :deploy_to, "/home/#{fetch(:deploy_user)}/apps/#{fetch(:application)}" # 部署到服务器的位置
set :enable_ssl, false
开始部署
在开发机器终端运行
$ cap production deploy --dry-run 或者 $ cap production deploy:check
使用 ssh deploy@your_server_ip 登入服务器,在deploy/home/apps/your_app_name/shared/config目录下新建 database.yml 和 secrets.yml
在服务器终端运行
$ touch ~/apps/your_app_name/shared/config/database.yml
$ touch ~/apps/your_app_name/shared/config/secrets.yml
在开发机器项目目录下执行 rake secret 产生的 key 放到服务器的~/apps/your_app_name/shared/config/secrets.yml,范例如下:
production:
secret_key_base: xxxxxxx........
用 vim 编辑服务器文件 ~/apps/your_app_name/shared/config/database.yml,范例如下:
production:
adapter: postgresql
encoding: unicode
database: your_app_database_name
host: localhost
pool: 25
username: postgres
password: your_password
在开发机器终端执行部署命令
$ cap production deploy
在服务器重启 nginx
$ sudo service nginx restart
第七步:访问页面
在浏览器访问服务器的IP地址 或者 你的域名,没有意外的话就可以看到你项目的主页面了。
恭喜你!
参考网址:
https://ihower.tw/rails/deployment-cn.html
https://ruby-china.org/topics/18616
http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html
说明:本文仅用于学习,多处文本复制于参考文献,若涉及原作者版权,通知到本人将立即删除本文。