部署--云服务器 (附加credentical的使用)

更新:2020-5-6在阿里云上部署圣湾网站。

 

附加https://ruby-china.org/topics/36899

 

Capistrano + Rails5.2不熟

  • 使用rbenv 安装Ruby
  • 用Mysql
  • 安装Nginx + Passenger

 

(摘录文章)

什么是云服务器:

通过网络,租用别人的计算机服务器和软件资源。

 

可分3种类型的服务:

  • Infrastructure as a Service: 阿里云,腾讯云等
  • Platform-as-a-Service: 如Heroku,提供固定的程序执行环境,支持特点的编程语言和框架,只需上传程序到平台就可以执行了。
  • Software-as-a-Service: 如Github,金数据,某个特点的软件服务。月租|年租

 

 

用做披萨来比喻:

假设你是餐饮从业者,想要做披萨生意。有三个方案:

  1. 向他人租用一个厨房,自己做披萨卖
  2. 除了租厨房,还购买了对方的原材料披萨饼皮,自己加工一下就行了
  3. 他人做好的披萨,你直接买过来,顶多加上自己的包装,然后卖出去。

对应的软件开发:

 


 

已经购买:

 

 

 

ssh root@47.92.104.38连接上服务器。

 

设置个人账号:

adduser xxx

然后设置密码,其他内容可以略过。一直回车。

输入 exit 离开服务器,重新用个人账号 SSH 登入:

ssh xxx@47.92.136.237

 

如果要进入/root文件夹,需要使用超级用户权限:

su - root

输入root密码,切换到root。- 的意思是可以把xxx的环境变量带过去

 

sudo权限

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

临时提升权限。

  1. su - root 进入管理员模式,
  2. whereis /etc/sudoers查找文件
  3. 打开/etc/sudoers文件:  $vi /etc/sudoers
  4. 插入一行username ALL=(ALL:ALL) ALL, 强制保存:wq!
  5. 退出管理员模式  $exit
  6. 在用户模式下,使用、$sudo command  获得临时权限。

 

如何变更档案权限?

chown 指令可以变更档案拥有者和群组,例如 chown chen:chen abc.txt 可以将档案 abc.txt 的拥有者设定为 chen,群组设定为 chen。如果要修改整个目录包含以下档案,则可以用 chown -R

chmod 指令可以变更档案的权限,例如 chmod 644 abc.txt 就会设定成 rw-r--r--。这需要了解一下什么是 Octal Permissions 表示方式:

  • r 是 4
  • w 是 2
  • x 是 1

你要的权限就是把数字加起来,例如 rw- 就是 4+2 是 6。r-- 就是 4。于是 rw-r--r-- 就是 644 了。

一般chmod 755 filename

 

 

免密码登入

远端登入除了输入密码之外,SSH 还可以用非对称加密(Public Key Encryption)的方式来做登入。

在非对称加密算法中,会有两把钥匙(key),一把叫做公钥(public key)、一把叫做密钥(private key)。

  • 透过公钥加密的密文,只有密钥能够解开
  • 透过密钥加密的密文,只有公钥能够解开

 

原理:

首先我们把自己的公钥先放在服务器上,

那么之后登入时,服务器会送一个乱数字符串给用户, 用户可以用秘🔑解开。然后用户用密钥加密的密文返回服务器,如果服务器可以用公钥解回来,就表示认证成功。

 

步骤:

把自己的公🔑放到了服务器上:⚠️:此时进入的是你的个人账号,如果进入root操作,就是root免密!

  1. mkdir ~/.ssh
  2. touch ~/.ssh/authorized_keys
  3. 回到本机电脑把公钥印出来,执行 cat ~/.ssh/id_rsa.pub 就会印在画面上。
  4. 回到远端服务器继续:
  5. vi ~/.ssh/authorized_keys 把公钥贴上去。

然后修改文件夹和文件的权限:

  1. chmod 700 ~/.ssh
  2. chmod 644 ~/.ssh/authorized_keys

 

本机没有 id_rsa.pub

因为 Github 也是用一样的认证机制,所以之前操作 git 时你应该已经产生过这个 SSH key,并且在 Github 后台贴上你自己的公钥,所以在 git push 时不需要打密码。

如果本机真的没有 ~/.ssh/id_rsa.pub 公钥的话,需要先产生你自己的公钥私钥,

请执行 ssh-keygen -t rsa 

就会产生公钥 ~/.ssh/id_rsa.pub 以及密钥 ~/.ssh/id_rsa 这两个档案。请一直按 Enter,不需要设定 passphrse 密码(不然你每次用key都要输入一次密码很麻烦)。

公钥可以公开给别人没关系,密钥就千万要保管好喔。


 

更新和安装 Linux 套件

apt-get是 Ubuntu 内建的套件管理工具,类似于 Mac 上的 homebrew。拿到一台服务器,首先就是先更新系统套件的清单,然后进行升级。

apt-get is the command-line tool for handling packages, and may be considered the
user's "back-end" to other tools using the APT library.

Several "front-end" interfaces exist, such as aptitude(8), synaptic(8) and wajig(1).

update
update is used to resynchronize the package index files from their sources.
The indexes of available packages are fetched from the location(s) specified
in /etc/apt/sources.list.  

An update should always be performed before an upgrade or dist-upgrade.  

 

upgrade
upgrade is used to install the newest versions of all packages currently
installed on the system from the sources enumerated in /etc/apt/sources.list.
Packages currently installed with new versions available are retrieved and
upgraded; under no circumstances are currently installed packages removed, or
packages not already installed retrieved and installed.  

执行 sudo apt-get update

执行 sudo apt-get upgrade -f

看到 Do you want to continue? [Y/n] 继续按 Enter 即可

然后设定系统时区:

执行 sudo dpkg-reconfigure tzdata

进入选单选窗口: Asia 然后选 Shanghai 就是中国时区 (UTF+8)

 

安装新的套件:这些是 Ruby on 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 libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev yarn

(教程没有安装yarn需要加上, 因为gem 'webpacker'需要安装yarn。)

不能直接安装yarn,需要添加源。参考:https://blog.csdn.net/nuoyanli/article/details/101367082官网

 

 software-properties-common会在安装Ruby(教程)时安装。

 


Gorails安装方法:(ubuntu/16.04)(点击看视频和文档)

 

curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
# ⚠️git:选择稳定的版本,改setup_11.x, terminal上会提示下面的2行代码。 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 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 software-properties-common libffi-dev nodejs yarn
(红字的是教程没有的程序。)

 注意⚠️libcurl4-openssl-dev和libcurl4-nss-de冲突,只安装一个即可。

 

教程和GoRails的总结安装法:✅

前三行代码是为安装yarn做准备

curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt-get update
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 libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev yarn

 


 

 

GoRAils,安装Ruby有多个途径:

1.rbenv(作者推荐)GoRails的安装出❌,改用ruby-china的方法和镜像)仍然是一样的错误❌

2.rvm ( 安装成功 

 

3. Brighbox❌(已经不再被维护)

4. 从官网

详细的解释见博客:https://www.cnblogs.com/chentianwei/articles/9837540.htcd

wget http://ftp.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
                        #wget是非交互式网络下载器,可以下载整个网站。
tar -xzvf ruby-2.5.3.tar.gz #下载的是tar.gz格式需要解包,使用tar命令完成。 cd ruby-2.5.3/ ./configure                     make                     sudo make install ruby -v

最后一步是安装Bunlder:  执行 sudo gem install bundler --no-ri --no-rdoc

后续操作见https://gorails.com/deploy/ubuntu/16.04


Using rvm ✅

 

sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm install 2.5.1
rvm use 2.5.1 --default
ruby -v

sudo gem install bundler --no-ri --no-rdoc

⚠️--no-ri --no-rdoc 参数的意思是不需要安装文档,可以节省安装时间

如果服务器在中国境内的话,可以改用 sudo gem install bundler --no-ri --no-rdoc --source https://gems.ruby-china.com 会比较快。

 


 

安装数据库服务器

以下提供 MySQL 和 PostgreSQL 的安装方式,请择一安装即可:

 

MySQL✅

MySQL 是一个非常受欢迎的关联式数据库,可以说是大多数网络公司的首选。以下是安装MySQL的指令,过程中会提示你设定数据库的root密码(请记下来,等会设定 Rails 会用到)。

执行 sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server

过程中请配置一个数据库的 root 密码 (请记下来,等会设定 rails 的 database.yml 会用到)

 

接着我们进入 mysql console 建立新的数据库:

执行 mysql -u root -p 进入 mysql console 后,输入:

CREATE DATABASE 数据库的名字 CHARACTER SET utf8mb4;

这会建立一个叫做 rails_recipes 的数据库(注意,数据库名称不要包括横线-),等会你的Rails就用这个数据库。执行完,输入 exit 离开 mysql console。

rails_recipes 是自定义的项目名称

 

PostgreSQL

MySQL 是网络公司的最爱,分布式扩充和商业支持的生态系非常丰富。PostgreSQL 则是对进阶的 SQL 语法支援比较多,以及支援更多的储存格式,例如 PostGIS

你也可以选择安装PostgreSQL

执行 sudo apt-get install postgresql libpq-dev postgresql-contrib

修改帐号 postgres 的密码

执行 sudo -u postgres psql, (⚠️这里使用psql进入数据库控制台)

参考:
sudo -i -u postgres  //切换到数据库的超级管理员
psql                 //进入数据库控制台

然后打 \password 后,就可以设置数据库的密码(请记下来,等会设定 rails 的 database.yml 会用到)。

然后打 \quit,退出控制台。

 

执行 sudo -u postgres createdb xxx 建立一个叫做 xxx 的数据

 

解决perl: warning: Setting locale failed. perl: warning: Please check that your locale settings:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = "zh_CN:zh",
    LC_ALL = (unset),
    LANG = "zh_CN.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
 

解决这个   在~/.bashrc中添加一句话

export LC_ALL=C

wei@iZ8vb1 :~$  echo "export LC_ALL=C">>~/.bashrc
wei@iZ8vb1 :~$ source ~/.bashrc

 


 

装 Nginx + Passenger 网站服务器

 

在本机开发的时候,我们使用 puma 这一套由 Ruby 写的网站服务器,无论是静态档案(图片/CSS/JS)或是会进到 Rails 处理的动态网页,一律都是由 puma 来处理。

在正式 production 环境中,我们会用更高效能的网站服务器来处理,

其中 Nginx 是目前最流行的网站服务器(用C语言开发的),可以非常高效能地提供静态档案,效能是纯 Ruby 网站服务器的数十倍以上。因此像图档/CSS/JS等等静态资源,都会由 Nginx 处理。 

至于 Rails 动态网页的部分,我们会安装 Passenger 这个 Nginx 的扩充模组来执行 Ruby 程序:Nginx 会把非静态档案的 HTTP Request 转交给 Passenger 来处理。

 

Passenger简介:https://www.phusionpassenger.com/docs/tutorials/what_is_passenger/

博客(Passenger简介):https://www.cnblogs.com/chentianwei/p/9886020.html

 

官方版本:

Installing Passenger + Nginx (点击进入安装说明页)

⚠️:点击链接,使用最新的文档。👇的文档操作步骤失效。

首先:

 然后,安装说明,一共4步骤:

1.install Passenger packages

这是官网步骤:多了一行(黄色背景的代码)配置Ubuntu18.04版需要。
# 安装PGP key and 增加HTTPS support for APT
sudo apt-get install -y dirmngr gnupg
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt-get install -y apt-transport-https ca-certificates

#增加我们的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

#安装Passenger + Nginx
sudo apt-get install -y nginx-extras passenger

 

2: enable the Passenger Nginx module and restart Nginx

把# include /etc/nginx/passenger.conf; 的注释去掉,然后保存,需要root权限:

sudo vi /etc/nginx//nginx.conf

#然后重启Nginx

sudo service nginx restart 

 

3.Step 3: check installation

sudo /usr/bin/passenger-config validate-install
 * Checking whether this Phusion Passenger install is in PATH... ✓
 * Checking whether there are no other Phusion Passenger installations... ✓
sudo /usr/sbin/passenger-memory-stats
Version: 5.0.8
Date   : 2015-05-28 08:46:20 +0200
...

---------- Nginx processes ----------
PID    PPID   VMSize   Private  Name
-------------------------------------
12443  4814   60.8 MB  0.2 MB   nginx: master process /usr/sbin/nginx
12538  12443  64.9 MB  5.0 MB   nginx: worker process
### Processes: 3
### Total private dirty RSS: 5.56 MB

----- Passenger processes ------
PID    VMSize    Private   Name
--------------------------------
12517  83.2 MB   0.6 MB    PassengerAgent watchdog
12520  266.0 MB  3.4 MB    PassengerAgent server
12531  149.5 MB  1.4 MB    PassengerAgent logger

  

4.Step 4: update regularly

sudo apt-get update
sudo apt-get upgrade

 

现在就可以使用service command:

sudo service nginx start    #在浏览器输入ip,看是否开启nginx

#Usage: nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
#sudo service nginx stop    #用于关闭这个web server

 

在浏览器输入ip地址,浏览器显示welcome表示成功:

 

 

 


 

 

新增 deploy 用户(可以使用admin,避免麻烦)

因为 root 和 chenwei 帐号权限很大,习惯上我们会在服务器上另开一个专门的帐号来放Rails代码。这里我们另开一个 deploy 帐号来使用:

在远端执行 sudo adduser --disabled-password deploy 新增帐号

--disabled-password deploy 参数会让deploy无法用密码登入,因为打算改用 SSH Key 来登入更安全。

 

设定用 SSH Key 登入 deploy 帐号

在远端执行 sudo su deploy 切换到 deploy 身份:

执行 mkdir ~/.ssh

执行 touch ~/.ssh/authorized_keys

回到本机电脑把公钥印出来,执行 cat ~/.ssh/id_rsa.pub 就会印在画面上。

回到远端服务器继续:

vi ~/.ssh/authorized_keys 把公钥贴上去

 

然后修改权限:

chmod 700 ~/.ssh文件夹只能被用户自身rwx.  因为只有文件夹能够被执行x, 才能对内部文件进行修改。

chmod 644 ~/.ssh/authorized_keys, 文件可以被自身rw,被group,others读

这样本机可以直接 ssh deploy@<主机IP位置> 连接了。

注意⚠️

在chenxxx账号下,输入sudo su deploy, 然后输入chenxxx的密码切换到deploy账号。
在deploy账号下,输入su --login chenxxx, 然后输入chenxxx的密码切换到chenxxx账号。
如果是从deploy账号切换到chenxxx账号下的,输入exit,就切换回到deploy账号了。

 

安装 Capistrano

Capistrano 是 Rails 社区中最常使用的布署工具。用于自动化处理新版本释放时的actions.

(不同的语言有不同的release tools, 如Python用Fabric管理relaease.)

⚠️:功能很多,可以自定义设置。具体需要详细看文档。

 

Capistrano 目录结构解说

  • releases   (各个版本)
  • current  (一个ln -s 符号链接,指向最新的releases/xxx目录)
  • shared
    • bundle        (安装Ruby的套件)
    • config         
    • log
    • public/system   (上传档案的位置)
    • public/assets    (静态档案编译后存放的位置)
    • tmp

每次执行 cap production deploy 时,capistrano 都会在 releases 都会建一个新的目录,
然后从 git repo 把最新的代码抓下来,执行 bundle 安装套件、跑数据库 migration、编译 assets 编译等等步骤,
都完成之后,会更新 current 目录(这是一个 ln -s 的捷径)指向最新的 releases/xxxx 目录,
最后 touch tmp/restart.txt 告诉 Passenger 重启 Rails。

(config/deploy.rb中进行设置:set :passenger_restart_with_touch, true )

在 config/deploy.rb 的设定中,linked_files 和 linked_dirs 就是在配置部署过程中,
需要将这些 shared 下的档案和目录,(符号链接)连结到新的 releases 目录里面去。

 

修改 Gemfile 加入 capistrano

首先在本机的 Rails 项目修改 Gemfile

Gemfile
+  gem 'mysql2'  # mysql2 和 pg 择一安装即可
+  gem 'pg'

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

#这是GoRails上的安装说明:
#gem 'capistrano'   #多了一行。
#gem 'capistrano-rails' 
#gem 'capistrano-passenger' 

# Add this if you're using rbenv
# gem 'capistrano-rbenv', '~> 2.1'

# Add this if you're using rvm
# gem 'capistrano-rvm'
     gem 'rspec-rails'
     gem 'byebug', platform: :mri
   end

执行 bundle 安装

 

本机设定 capistrano

执行 cap install,这会新增一些配置档案。

编辑 Capfile

Capfile
   require "capistrano/scm/git"
   install_plugin Capistrano::SCM::Git

+  require 'capistrano/rails'
+  require 'capistrano/passenger'

 GoRails的安装说明:(一样,指出用rbenv或rvm的设置)

require 'capistrano/rails'
require 'capistrano/passenger'

# If you are using rbenv add these lines:
# require 'capistrano/rbenv'
# set :rbenv_type, :user
# set :rbenv_ruby, '2.5.3'

# If you are using rvm add these lines:
# require 'capistrano/rvm'
# set :rvm_type, :user
# set :rvm_ruby_version, '2.5.1'

  

修改 config/deploy.rb 

config/deploy.rb
+  sh "ssh-add"

   # config valid only for current version of Capistrano
   lock "3.8.1"

-  set :application, "my_app_name"
+  set :application, "rails_recipes"   # 请用你自己的项目名称

-  set :repo_url, "git@example.com:me/my_repo.git"
+  set :repo_url, "git@github.com:growthschool/rails-recipes.git"    
# 请用你自己项目的git位置,在git上点击clone,然后复制SSH # 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, "/var/www/my_app_name" + set :deploy_to, "/home/deploy/rails-recipes" # 这样服务器上代码的目录位置,放在 deploy 帐号下。请用你自己的项目名称。 # 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" + append :linked_files, "config/database.yml", "config/secrets.yml"
# 设置shared文件夹中的文件,需要符号链接到release目录中的各个版本目录。 # secrets.yml Rails最新版已经弃用,看一下。
# Default value
for linked_dirs is [] - # append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system" + append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system" # 设置shared目录中的子目录,在部署时,符号链接到release目录。
+ set :passenger_restart_with_touch, true # Default value for default_env is {} # set :default_env, { path: "/opt/ruby/bin:$PATH" } # Default value for keep_releases is 5 - # set :keep_releases, 5 + set :keep_releases, 5 #release目录中的版本,设置保留最近的n个版本,其他的会被清除。

 Gorails的区别,增加了2个文件的附加::

"vendor/bundle" 和 "public/uploads"

append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", "public/system", "public/uploads"

  

修改 config/deploy/production.rb,设定要用哪一个 branch 放在服务器上,以及服务器的 IP 位置:

+   set :branch, "master"
-   # server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value
+     server "47.92.82.116", user: "deploy", roles: %w{app db web}, my_property: :my_value
 
Configure your server addresses in the generated files:
在这个文件中配置staging environment。
Capistrano把传统的工作用角色的概念进行区别:
1.web:  Nginx/Apache,  puma/unicorn
2.app:    Passenger
3.db

Server可以用2种方式定义, 暗示地使用简单的role syntax和明确地使用额外的server syntax.
 
⚠️主要配置都是在config/deploy.rb中,stage specific配置放在config/deploy/<stage_name>.rb
⚠️不要把secrets放到版本控制repository内,具体可见(Gorails)。
 
 
在本机执行 cap production deploy:check这会自动登入远端服务器建立一些 Capistrano 需要的架构目录
 
你会看到一个 ERROR 说服务器上缺少一些档案如config/database.yml,让我们进远端服务器上新增这些档案:
 

远端设定 database.yml 和 secrets.yml

请用 deploy 身份登入 ssh deploy@47.x.x.xx,或是切换到 deploy 身份 sudo su deploy

在远端新增 /home/deploy/设定的程序名字/shared/config/database.yml 这个档案(deploy是用户名),内容是:

如果是 MySQL 数据库:✅

 production:
  adapter: mysql2
  pool: 25
  encoding: utf8mb4
  database: shengwanauto
  host: localhost
  username: root
  password: ""   #这个是数据库mysql的用户root的密码。

 

因为部署遇到❌:ERROR 1698 (28000): Access denied for user 'root'@'localhost'

解决问题的方法:(点击🔗见详细介绍)

$ sudo mysql -u root 

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> set password for 'root'@'localhost' = password('YOUR_ROOT_PASSWORD_HERE');
mysql> FLUSH PRIVILEGES;  

 

如果是 PG 数据库:

production:
  adapter: postgresql
  pool: 25
  database: 改成自己创建的数据库!!
  host: localhost
  username: postgres
  password: 输入密码

⚠️密码!

在本机执行 rails secret,这会产生一段乱数的key,等会要用。

 

在远端新增 /home/deploy/rails-reipes/shared/config/secrets.yml 这个档案,内容是:

production:
  secret_key_base: 把刚刚的乱数key贴上来

  

⚠️Rails 5.2使用credentials。所以在/shared/config/目录中:(可以不用)

vim master.key

然后把本地的config/master.key中的代码粘贴过去。.

 

本机再次执行 cap production deploy:check

不会再有ERROR



 

附加:Rails5.2已经改用Credentials.

英文:

https://medium.com/cedarcode/rails-5-2-credentials-9b3324851336

Ruby-china上:

https://ruby-china.org/topics/36081   ( Rails 5.2 中的 Credentia

我的博客总结:

https://www.cnblogs.com/chentianwei/p/9167489.html

GoRails的博客总结:

https://www.cnblogs.com/chentianwei/p/9392693.html



 

执行部署

本机执行部署 cap production deploy,这个指令会登入远端服务器,把 Github 上的代码抓下来,然后自动执行 bundle 安装套件、跑数据库 migration 和编译 assets 编译等等步骤:

第一次会比较久,需耗时数十分钟,取决于网络环境与 CPU 速度:

如果您用国内的服务器,跑 01 bundle install --path /home/deploy/rails-recipes/shared/bundle这一步可能因为网络问题而失败。建议你可以修改 Gemfile 第一行,改成 source 'https://gems.ruby-china.com' 使用国内的 rubygems.com镜像服务器,因为服务器本身是没有FQ的。改完请执行 bundle,然后 git commit 和 git push 上去。然后再重新执行 cap production deploy

如果服务器 CPU 等级比较差,跑 01 bundle exec rake assets:precompile 这一步会比较久,如果出现 Errno::ECONNRESET: Connection reset by peer - recvfrom(2) 请重试几次 cap production deploy

完成后,capistrano 的设定就告一个段落了,可以 commit 了。

之后有修改代码:

1 git push 到 Github 上,

2然后再次执行 cap production deploy

这样服务器上就会拉下最新的代码。


 

terminal输入:

ssh root@xx.xx.xx.xx进入root目录

root@iZ8vb9z1vsb31g6zoqqt0bZ:~# pwd
/root

但这“/”才是真正的根目录。 

/var/log/nginx/error.log这是告诉我var目录是在“/”目录下的.


 

最后一步(教程文章摘录)

完成 Nginx设定:✅

在远端用 root 权限编辑 /etc/nginx/nginx.conf 这个档案:(选择性添加)

  # 让 Nginx 可以读到环境变量 PATH,Rails 需要这一行才能调用到 nodejs 来编译静态档案
+ env PATH;

    user www-data;           #
    worker_processes auto;
    pid /run/nginx.pid;        # pid:是process id,如80152

    events {
      worker_connections 768;
      # multi_accept on;
    }

  http {

    # 关闭 Passenger 和 Nginx 在 HTTP Response Header 的版本资讯,减少资讯洩漏
+   passenger_show_version_in_header off;
+   server_tokens       off;

    # 设定档案上传可以到100mb,默认只有1Mb超小气的,上传一张图片就爆了
+   client_max_body_size 100m;

    gzip on;
    gzip_disable "msie6";

       # 最佳化 gzip 压缩
+   gzip_comp_level    5;
+   gzip_min_length    256;
+   gzip_proxied       any;
+   gzip_vary          on;
+   gzip_types application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/xml text/plain text/javascript text/x-component;

    # 打开 passenger 模组
-   # include /etc/nginx/passenger.conf;
+   include /etc/nginx/passenger.conf;

    # 下略

在远端用 root 权限新增 /etc/nginx/sites-enabled/rails-xxx.conf 这个档案(档名可以自订无所谓)

server {
  listen 80;
  server_name 47.92.82.116;   # 用你自己的服务器 IP 位置

  root /home/deploy/rails-recipes/current/public;  # 替换用户名和项目名称 ,圣湾网站使用admin/shengwanauto

  passenger_enabled on;

  passenger_min_instances 1;

  location ~ ^/assets/ {
    expires 1y;
    add_header Cache-Control public;
    add_header ETag "";
    break;
   }
}

最后执行 sudo service nginx restart 才会套用新的 Nginx 设定。

 

 

 Gorails的文章摘录:

Adding The Nginx Host

为了让Nginx响应Rails app, 我们需要修改它的sites-enabled文件夹。

Open up /etc/nginx/sites-enabled/default 

Gorails:

server {
        listen 80;
        listen [::]:80 ipv6only=on;

        server_name 域名或者ip地址;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/我的app的名字/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;
        }
}

 

Connecting The Database

remove your config/database.yml and config/secrets.yml git and only store example copies in your git repo.  

只让production secrets和passwords存在production server上面 。

echo "config/database.yml\nconfig/secrets.yml" >> .gitignore
git add .gitignore
git mv config/secrets.yml config/secrets.yml.example
git mv config/database.yml config/database.yml.example
git commit -m "Only store example secrets and database configs"
cp config/secrets.yml.example config/secrets.yml
cp config/database.yml.example config/database.yml

run cap production deploy 

但是会失败,因为没有在服务器创建这些文件。

错误提示

linked file /home/deploy/build.gorails.com/shared/config/database.yml does not exist on IP_ADDRESS

 

进入deploy用户,创建2个文件,database.yml和secrets.yml。

# /home/deploy/my_app_name/shared/config/database.yml
production:
  adapter: postgresql
  host: 127.0.0.1
  database: 之前创建的数据库的名字
  username: deploy
  password: 密码
  encoding: unicode
  pool: 5

在本地运行: rails secret得到密码,粘贴:

# /home/deploy/my_app_name/shared/config/secrets.yml
production:
  secret_key_base: YOUR_SECRET_KEY

 

run cap production deploy

run touch my_app_name/current/tmp/restart.txt

或者最后执行 sudo service nginx restart

 

posted @ 2018-10-23 15:28  Mr-chen  阅读(921)  评论(0编辑  收藏  举报