wangxinyun1995 / blogs

用issue记录我的博客
0 stars 0 forks source link

rails部署 #10

Open wangxinyun1995 opened 5 years ago

wangxinyun1995 commented 5 years ago

https://github.com/ruby-china/homeland/wiki/Ubuntu-14.04-%E4%B8%8A%E4%BD%BF%E7%94%A8-Nginx-Passenger-%E9%83%A8%E7%BD%B2-Ruby-on-Rails

wangxinyun1995 commented 5 years ago

一、新建用户

服务器系统是Ubuntu 16.04,本地系统也是Ubuntu 16.04,用ssh登录上服务器

# ip为服务器ip
ssh root@ip
# 登陆进服务器
# 服务器上
# `--ingroup sudo`是说,新建的用户直接就有执行`sudo`命令的权限。
adduser deploy --ingroup sudo
# 输入新密码。
# 问其他的Full Name之类的,你可以填写,也可以不填,直接回车。

# 切换到deploy用户
sudo su deploy

# 进入`家`目录
cd ~

二、使用秘钥登录服务器

很多云服务器,大部分默认都是使用账号密码登录的。这样做非常不安全,所以你需要改为SSH秘钥登录。如果你想改为秘钥登录,一种是直接在云主机管理界面,上传自己的秘钥。另一种通用方法,就是我下面的操作了。

# 本地,如果已经有这个了,不用执行这一步
ssh-keygen -t rsa
# 如果不需要加密,就直接全部回车。需要加密,就自己填写密码

cat ~/.ssh/id_rsa.pub
# 会出现一段文字,复制下来
# 服务器上(deploy账户)
ssh-keygen -t rsa
# 依然全部直接回车

vi /home/deploy/.ssh/authorized_keys
# 将刚才本地命令行中,复制的那一段文字,粘贴进去,然后按:wq保存离开

chmod 644 /home/deploy/.ssh/authorized_keys
sudo service ssh restart
# 现在你再用SSH连服务器,直接ssh deploy@你的ip,不再需要输入密码了。
# 可能会出现还是让你输入密码的情况,如果出现以下报错

sign_and_send_pubkey: signing failed: agent refused operation

# 解决办法
eval "$(ssh-agent -s)"
ssh-add

三、禁用密码登录(可选)

用密码登录服务器, 并不是一个安全的选择。最好方法是直接禁用密码登录,改为必须使用SSH秘钥登录。当然这一步是可选的,和我们学习Capistrano并没有什么关系。

# 服务器上(root账户)
sudo vi /etc/ssh/sshd_config

# 将`PasswordAuthentication yes` 修改成 `PasswordAuthentication no`
# :wq退出后
sudo service ssh restart

四、服务器基础准备工作

# 服务器上(deploy账户)
# 确认一下,当前用户依然是deploy。如果不是,先sudo su deploy

# 更新
sudo apt-get update
sudo apt-get upgrade -y
sudo dpkg-reconfigure tzdata
# 选择时区 Time zone=>Asia=>Shanghai

# 安装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

Ubuntu 16.04 的 apt-get install 默认只支持 Ruby 2.3。对新版本Rails 5.2来说,已经无法运行了。所以我们选择使用 rbenv 来安装 Ruby。

五、使用rvm安装Ruby

# 服务器(deploy账户)
# 更新 apt,并安装 curl:
sudo apt-get update
sudo apt-get install curl
# 然后安装 RVM:

 \curl -sSL https://get.rvm.io | bash
# RVM 安装完毕后,重新登陆 SSH,让 RVM 配置生效。然后安装 Ruby,版本可以自定义:

rvm use --install --default 2.3.1
# Ruby 安装过程会请求 apt-get update 的权限,并自动安装系统依赖。安装完毕后,确认目前的 Ruby 版本:

ruby -v
# 使用Ruby China的RubyGems(境外服务器请略过)
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
# 确保只有 gems.ruby-china.com

# 接着安装 bundler gem
gem install bundler

# 同样使用gems.ruby-china.com
bundle config mirror.https://rubygems.org https://gems.ruby-china.com

六、安装MySQL

# 服务器上(deploy账户)
sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
# 安装过程中,会让你输入密码。自己记好了哦!

# 新建一个数据库,其中deployment是你数据库的名字,可根据需求自行修改
mysql -u root -p
CREATE DATABASE deployment_production CHARACTER SET utf8mb4;
# 退出 mysql console
exit

# 也可以用navicat远程链接,方便数据查看,需要开放mysql远程链接权限

七、安装 Nginx + Passenger

# 服务器上(deploy账户)
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7

sudo apt-get install -y apt-transport-https ca-certificates

# 添加 APT 仓库地址
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

八 关联一个github项目

九 修改gemfile,安装Capistrano以及插件

到gemfile的group :development中,添加如下代码,这些都是capistrano的插件

group :development do
  # ...

  # 其中`capistrano-rails`包含了以下三个插件。
  # gem 'capistrano/bundler'
  # gem 'capistrano/rails/assets'
  # gem 'capistrano/rails/migrations'
  # 你也可以分别一个个加进去,但是何必呢?这些基本都是`rails`部署必须的。
  # 直接用`gem 'capistrano-rails'`这一个就好了。
  gem 'capistrano-rails'

  # 对`passenger`与`rvm`的支持
  gem 'capistrano-passenger'
  gem 'capistrano-rvm'
end
# 改完后,本地,命令行进入你的项目中
# app_name是你自己的项目名称
cd ~/app_name
bundle install

十 将代码推送到github远程仓库

十一 配置Capistrano

1.生成capistrano的相关配置文件。

# 本地运行
cap install

2. 编辑 Capfile(项目的根目录下)

# 加上这行
require "capistrano/rails"

# 去掉这两行前面的`#`号 
# 这儿使用的是rvm,require "capistrano/rails"这行加在require "capistrano/rvm"上一行
require "capistrano/rvm"
require "capistrano/passenger"

其他配置可保持默认。

3. 编辑 config/deploy.rb

# 最顶上加这行,注意是「`」号而不是单引号「'」
# 如果你对ssh-add有兴趣,你可以去读这一篇。https://ihower.tw/blog/archives/7837
`ssh-add`

# 项目名称
set :application, "app_name"

# git仓库地址,github仓库地址
set :repo_url, "git@git.coding.net:aaronryuu/deployment.git"

# 需要部署到服务器的位置
set :deploy_to, "/home/deploy/app_name"

# 去掉注释,并加上 "config/master.key"
append :linked_files, "config/database.yml", "config/master.key"

# 去掉注释
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'
wangxinyun1995 commented 2 years ago

域名绑定,把对应的证书上传到服务器/etc/nginx/conf.d文件夹下面 下载nigix 对应的ssl证书然后在/etc/nginx/sites-enabled新建文件,你的项目名称.conf,eg:cdcwbk_api.conf

server {
  listen 443 ssl;

  server_name 你的域名;

  root /home/deploy/cdcwbk_api/current/public;
  ssl_certificate /etc/nginx/conf.d/cdcwlv.work_bundle.crt;
  ssl_certificate_key /etc/nginx/conf.d/cdcwlv.work.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;
  passenger_enabled on;

  passenger_min_instances 1;

  location ~ ^/assets/ {
    expires 1y;
    add_header Cache-Control public;
    add_header ETag "";
    break;
   }
}
server {
  listen 80;
  server_name 你的域名;
  return 301 https://$host$request_uri;
}