如何將Rails項(xiàng)目部署到服務(wù)器上

登錄到服務(wù)器

ssh username@ip

更新并新建用戶(hù)

sudo apt-get update
sudo apt-get upgrade -y

adduser deploy --ingroup sudo

安裝必要的依賴(lài)包

sudo apt-get install -y vim git libmysqlclient-dev 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

安裝rbenv

git clone https://github.com/rbenv/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

source ~/.bashrc

mkdir -p "$(rbenv root)"/plugins

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

source ~/.bashrc


git clone https://github.com/andorchen/rbenv-china-mirror.git ~/.rbenv/plugins/rbenv-china-mirror # 換rbenv鏡像源,讓下載速度更快

rbenv install 2.4.6

rbenv global 2.4.6

ruby -v


由于gem源默認(rèn)是外國(guó)網(wǎng)站所以網(wǎng)速慢,換國(guó)內(nèi)源

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ 
gem install bundler
bundle config mirror.https://rubygems.org https://gems.ruby-china.com 

安裝MySQL

# 服務(wù)器上
sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
# 安裝過(guò)程中揭芍,會(huì)讓你輸入密碼滚粟。切勿忘記密碼

# 新建一個(gè)數(shù)據(jù)庫(kù)缸沃,其中deployment是你數(shù)據(jù)庫(kù)的名字着绊,可根據(jù)需求自行修改
mysql -u root -p
CREATE DATABASE deployment_production CHARACTER SET utf8mb4;

# 退出 mysql console
quit

設(shè)置SSH Key登錄

# 切回本地電腦端
cat ~/.ssh/id_rsa.pub

# 服務(wù)器端執(zhí)行,請(qǐng)確保當(dāng)前用戶(hù)為deploy
mkdir ~/.ssh

touch ~/.ssh/authorized_keys

vim ~/.ssh/authorized_keys # 把??cat ~/.ssh/id_rsa.pub的內(nèi)容復(fù)制進(jìn)來(lái)并保存

chmod 700 ~/.ssh

chmod 644 ~/.ssh/authorized_keys


禁用密碼登錄(可選,出于安全考慮建議禁用)

# 服務(wù)器上
sudo vi /etc/ssh/sshd_config

# 將`PasswordAuthentication yes` 修改成 `PasswordAuthentication no`
# :wq保存退出后

sudo service ssh restart


到此環(huán)境搭建成功


下面進(jìn)行Capistrano自動(dòng)化部署


修改項(xiàng)目中Gemfile 加入 capistrano,添加下面的gem

gem 'mysql2'

# 往下翻,找到group :development, :test do中添加下面的代碼

group :development, :test do
  gem 'capistrano-rails'
  gem 'capistrano-passenger'
  gem 'capistrano-rbenv' 
end

安裝capistrano

bundle install

新增capistrano配置檔案

cap install

編輯項(xiàng)目根目錄下的Capfile,替換成下面的內(nèi)容

# Load DSL and set up stages
require "capistrano/setup"

# Include default deployment tasks
require "capistrano/deploy"

# Load the SCM plugin appropriate to your project:
#
# require "capistrano/scm/hg"
# install_plugin Capistrano::SCM::Hg
# or
# require "capistrano/scm/svn"
# install_plugin Capistrano::SCM::Svn
# or
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git


require "capistrano/rails"

# Include default deployment tasks
require "capistrano/passenger"

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require "capistrano/rvm"
require "capistrano/rbenv"
#require 'capistrano/rails/collection'
# require "capistrano/chruby"
# require "capistrano/bundler"
# require "capistrano/rails/assets"
# require "capistrano/rails/migrations"
# require "capistrano/passenger"
set :rbenv_type, :user
set :rbenv_ruby, '2.4.6'
# 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,替換成下面的內(nèi)容,??有些配置需要根據(jù)你項(xiàng)目的實(shí)際信息更改

# config valid for current version and patch releases of Capistrano
`ssh-add`

lock "~> 3.11.0"


set :application, "myblog"
set :repo_url, "your_project_git_url" # 你項(xiàng)目的github地址袁串,這種格式 git@example.com:me/my_repo.git
set :rbenv_path, '/home/deploy/.rbenv'
# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
set :deploy_to, "/home/deploy/your_project_name" # 放在你服務(wù)器哪個(gè)目錄下

# Default value for :format is :airbrussh.
# set :format, :airbrussh

# You can configure the Airbrussh format using :format_options.
# These are the defaults.
# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto

# Default value for :pty is false
# set :pty, true

# 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 :passenger_restart_with_touch, true
# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for local_user is ENV['USER']
# set :local_user, -> { `git config user.name`.chomp }

# Default value for keep_releases is 5
set :keep_releases, 5

# Uncomment the following to require manually verifying the host key before first deploy.
# set :ssh_options, verify_host_key: :secure



修改config/deploy/production.rb

set :branch, "master"
# xxx為你的服務(wù)器ip
server "xxx.xxx.xxx.xxx", user: "deploy", roles: %w{app db web}, my_property: :my_value
# set :rbenv_ruby, "2.3.8"
set :ssh_options, {
    keys: %w(~/.ssh/id_rsa),
    forward_agent: true,
    auth_methods: %w(publickey)
}


把你服務(wù)器的ssh-public-key添加到你項(xiàng)目github的白名單中(不會(huì)的請(qǐng)百度或谷歌)


在本機(jī)的項(xiàng)目根目錄執(zhí)行下面的命令,這會(huì)自動(dòng)登入遠(yuǎn)端服務(wù)器建立一些 Capistrano 需要的架構(gòu)目錄

cap production deploy:check

你會(huì)看到一個(gè) ERROR 說(shuō)服務(wù)器上缺少一些檔案其掂,需要在遠(yuǎn)端服務(wù)器上新增下面的文件:


在服務(wù)器上新增 /home/deploy/your_project_name/shared/config/database.yml

sudo vim /home/deploy/your_project_name/shared/config/database.yml

#添加下面的內(nèi)容

production:
  adapter: mysql2
  encoding: utf8mb4
  database: your_database_name #請(qǐng)確保你的數(shù)據(jù)庫(kù)名存在
  host: localhost
  username: root
  password: your_mysql_password
  

在本機(jī)的項(xiàng)目根目錄執(zhí)行下面的命令,這會(huì)產(chǎn)生一段亂數(shù)的key,等會(huì)要用。

rake secret

在服務(wù)器上新增 /home/deploy/your_project_name/shared/config/secrets.yml 這個(gè)文件

sudo vim /home/deploy/your_project_name/shared/config/secrets.yml

#添加下面的內(nèi)容

production:
  secret_key_base: 把??剛生成的亂數(shù)key貼上來(lái)


提交代碼并推送

git add .
git commit -m 'auto deploy'
git push

開(kāi)始自動(dòng)化部署(第一次部署比較耗時(shí),請(qǐng)耐心等待)

cap production deploy

image

image

如果有錯(cuò)請(qǐng)根據(jù)錯(cuò)誤提示解決.也可以在??截圖留言


安裝 Nginx + Passenger 網(wǎng)站服務(wù)器


請(qǐng)到這里查看安裝 Nginx + Passenger 網(wǎng)站服務(wù)器


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顾患,一起剝皮案震驚了整個(gè)濱河市骂澄,隨后出現(xiàn)的幾起案子摸袁,更是在濱河造成了極大的恐慌,老刑警劉巖庇忌,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡皆疹,警方通過(guò)查閱死者的電腦和手機(jī)疏橄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)略就,“玉大人捎迫,你說(shuō)我怎么就攤上這事”砝危” “怎么了窄绒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崔兴。 經(jīng)常有香客問(wèn)我彰导,道長(zhǎng),這世上最難降的妖魔是什么敲茄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任位谋,我火速辦了婚禮,結(jié)果婚禮上折汞,老公的妹妹穿的比我還像新娘倔幼。我一直安慰自己,他們只是感情好爽待,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布损同。 她就那樣靜靜地躺著翩腐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏燃。 梳的紋絲不亂的頭發(fā)上茂卦,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音组哩,去河邊找鬼等龙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伶贰,可吹牛的內(nèi)容都是我干的蛛砰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黍衙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泥畅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起琅翻,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤位仁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后方椎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體聂抢,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年棠众,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳疏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摄欲,死狀恐怖轿亮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胸墙,我是刑警寧澤我注,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站迟隅,受9級(jí)特大地震影響但骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智袭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一奔缠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吼野,春花似錦校哎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腰奋。三九已至,卻和暖如春抱怔,著一層夾襖步出監(jiān)牢的瞬間劣坊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工屈留, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留局冰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓灌危,卻偏偏與公主長(zhǎng)得像康二,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乍狐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容