部署--云服务器(RubyChina上的转帖); 附加用cap部署sidekiq

 

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

 

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

Capistrano + Rails5.2部署

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

 

服务器系统: Ubuntu Server 16.04

一、新建用户

# 服务器上
# `--ingroup sudo`是说,新建的用户直接就有执行`sudo`命令的权限。
adduser deploy --ingroup sudo
# 输入新密码。

sudo su deploy
cd ~

 

 

二、使用秘钥登录服务器

 

# Mac 本地
ssh-keygen -t rsa
# 如果不需要加密,就直接全部回车。需要加密,就自己填写密码。 
cat
~/.ssh/id_rsa.pub

 

解释:

ssh-keygen:

生成ssh,管理和验证ssh key的命令。

生成key的类型由-t 选项设置。如果没有参数,则默认生成an RSA key ,并用 SSH  protocol 2 connections.

# 服务器上
ssh-keygen -t rsa
# 依然全部直接回车

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

chmod 644 /home/deploy/.ssh/authorized_keys
sudo service ssh restart #不需要吧???

 

⚠️感觉有误,服务器上没必要再生成一对🔑了,我还是使用以前留存的秘🔑。

 

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

# 服务器上
sudo vi /etc/ssh/sshd_config

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

 禁止使用root登陆:(密码,密🔑都不能直接登陆了) 

PermitRootLogin no

 

 

四、服务器基础准备工作

# 服务器上,当前用户依然是deploy。 

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

 

安装各种依赖:

见:https://www.cnblogs.com/chentianwei/p/9836894.html

 

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

 

五、使用rbenv安装Ruby(改用编译好的ruby下载。)

# 服务器上
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

 

rbenv需要ruby-build,才能安装ruby。所以现在来安装它

mkdir -p "$(rbenv root)"/plugins
# rbenv root的路径是家目录加上.rbenv: /home/deploy/.rbenv git clone https:
//github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc

⚠️source命令:读取并执行来自name的命令。比如:👆,更改了配置脚本文件。让配置生效,就使用source. 

 

仍然安装不上,一直卡住不动。不知道是否是网速的原因。

改用编译好的ruby版本安装。很快捷。   ( Brighbox )

别忘了安装:bundler:  gem install bundler 

然后改下载地址:

bundle config mirror.https://rubygems.org https://gems.ruby-china.com

 

六、安装MySQL

# 服务器上
sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
# 安装过程中,输入密码!

# 进入console, -u选项是输入user, -p选项是密码。输入密码后进入控制台。
mysql -u root -p


# 新建一个数据库, xxxxx是数据库的名字
CREATE DATABASE xxxxxx CHARACTER SET utf8mb4;

相关命令:
显示所有的数据库:show database; 注意必须加上分号;

 

七、安装 Nginx + Passenger

# 服务器上
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

还有相关配置,见官方文档或者之前的部署文章。https://www.cnblogs.com/chentianwei/p/9836894.html 

 

 

附加:

什么是APT? Debian? apt-get? 见文章最后。

 

八、注册Coding账号(腾讯云)

注册地址https://coding.net

设置公匙。

添加项目,复制ssh.

 

9、修改gemfile,安装Capistrano以及插件

选择:

新建rails项目:

# 新建一个Rails项目,默认使用MySQL数据库
rails new deployment -d mysql

 

或者使用现有项目:

在rails app的gemfile中添加 capistrano的插件。

group :development do
  gem 'mysql2'

  # 其中`capistrano-rails`包含了以下三个插件。
  # gem 'capistrano/bundler'
  # gem 'capistrano/rails/assets'
  # gem 'capistrano/rails/migrations'
  # 直接用`gem 'capistrano-rails'`这一个就好了。
  gem 'capistrano-rails'

  # 对`passenger`与`rbenv`的支持
  gem 'capistrano-passenger'
  #gem 'capistrano-rbenv'
end

 

然后bundle install

 

10 将代码推送到Git远程仓库

git add .
git commit -m "xxx"

git remote add origin 自己复制的ssh项目git
git push -u origin master 
# 不知道为什么会出现问题:见⬇️:

 

To git.dev.tencent.com:chentw/test_transaction.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@git.dev.tencent.com:chentw/test_transaction.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

 

我新建的repository 就强制push了,用-f选项。

所以使用git push -f origin master

 

11.配置Capistrano

本地:cap install

然后编辑Capfile文件。

require "capistrano/rails"
require "capistrano/passenger"

编辑 config/deploy.rb

这里我使用的是教程的配置: sh "ssh-add"

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

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

# git仓库地址
set :repo_url, "git@git.coding.net:xxxx/xxxxx.git"

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

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

# 去掉注释
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'

 编辑config/deploy/production.rb

 这里沿用教程的配置,只有第一行

server "ip/或网址", user: "deploy", roles: %w{app db web}, my_property: :my_value

set :ssh_options, {
  keys: %w(~/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey)
}

 

 

尝试报错

本地执行cap production deploy:check

出现❌:根据提示知道database.yml不存在,需要 创建它。

config/database.ymlconfig/secrets.yml这两个文件,并做好配置。

# 服务器上
cd ~/我的app名字/shared/config
vim database.yml

 

然后填写和教程一样。

production:
  adapter: mysql2
  pool: 25
  encoding: utf8mb4
  database: 数据库名字  #使用show databases; 命令来查看所有的数据库
  host: localhost
  username: root
  password: 密码

新建master.key文件

这里也很教程有区别:

vim master.key
然后将自己本地项目config/master.key中的内容,复制进去。

 

再尝试一次cap production deploy:check,👌!

 

正式部署

最后Mac 本地运行:cap production deploy

出现不少❌,一一解决:

#本级没安装mysql,报错!
#所以:brew install mysql, 然后加上gem 'mysql2', 再bundle install
#最后git push --set-upstream origin master

 

# passenger,没runing。
# 使用官网的程序,走了一遍。ok了!

 

 

12、配置nginx

网上的是最简单的必要配置:

1. 配置nginx支持passenger

# 服务器上
sudo vim /etc/nginx/nginx.conf
# 在此文件最顶部加上
env PATH;

# ...

# 去掉这一行的注释, 使用Passenger官网的安装步骤,则这步已经做了
include /etc/nginx/passenger.conf;

 

2. 新增一个项目配置

sudo vim /etc/nginx/sites-enabled/xxxx.conf

 

server {
  listen 80;

  # 如果你有域名,并做好了域名解析,直接填域名。
  server_name 114.67.72.94; 

  root /home/deploy/xxx/current/public;

  passenger_enabled on;

  passenger_min_instances 1;

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

 

# 重启nginx
sudo service nginx restart

 

遇到❌

Job for nginx.service failed because the control process exited with error code. 
See "systemctl status nginx.service" and "journalctl -xe" for details.

 

原因是

# 服务器上
sudo vim /etc/nginx/nginx.conf

#env PATH;  代码后面忘记加分号;了。

 

 

最后、尝试访问项目

这是其实是有由两个原因造成的。 第一、因为我们项目,目前还连首页都没有。 第二、Passanger需要指定使用的Ruby路径。查资料了解到,如果是apt-get安装的Ruby则没有这个问题。如果和我一样,用rbenv安装的,则需要手动指定Ruby路径。

Tips: 如果部署中,你还碰到了其他问题。你可以看一下Nginx 错误日志中,是否有相关提示。路径在/var/log/nginx/error.log

 

 

具体见https://ruby-china.org/topics/36899

 

第一个原因:最后别忘了git push后,要cap production deploy

 

成功:


 

附加1、Capistrano对Sidekiq的支持

https://github.com/seuros/capistrano-sidekiq

 

Sidekiq需要Redis,所以先去服务器上安装好。

# 服务器上
sudo apt-get install redis-server
# Mac本地
group :development do # ... gem 'capistrano-sidekiq' end

 

然后bundle install

capfile中添加  require 'capistrano/sidekiq'

最后重写部署cap production deploy

使用ps ax | grep 'sidekiq'查看是否有sidekiq进程 

 

 

 

注意这里没有安装

gem 'sidekiq'

 需要先安装好sidekiq,否则部署时报错❌:

00:14 sidekiq:start
      01 bundle exec sidekiq --index 0 --pidfile /home/deploy/transaction/shared/tmp/pids/s…
      01 bundler: command not found: sidekiq
      01 Install missing gem executables with `bundle install`
#<Thread:0x00007f7feaab3198@/Users/chentianwei/.rvm/gems/ruby-2.5.1/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:10 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
    1: from /Users/chentianwei/.rvm/gems/ruby-2.5.1/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:11:in `block (2 levels) in execute'
/Users/chentianwei/.rvm/gems/ruby-2.5.1/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:15:in `rescue in block (2 levels) in execute': Exception while executing as deploy@47.92.244.154: sidekiq exit status: 127 (SSHKit::Runner::ExecuteError)
sidekiq stdout: bundler: command not found: sidekiq
Install missing gem executables with `bundle install`
sidekiq stderr: Nothing written
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@47.92.244.154: sidekiq exit status: 127
sidekiq stdout: bundler: command not found: sidekiq
Install missing gem executables with `bundle install`
sidekiq stderr: Nothing written


Caused by:
SSHKit::Command::Failed: sidekiq exit status: 127
sidekiq stdout: bundler: command not found: sidekiq
Install missing gem executables with `bundle install`
sidekiq stderr: Nothing written

Tasks: TOP => sidekiq:start
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as deploy@47.92.244.154: sidekiq exit status: 127
sidekiq stdout: bundler: command not found: sidekiq
Install missing gem executables with `bundle install`
sidekiq stderr: Nothing written

 

本地:添加gem

gem 'sidekiq'
gem 'redis'

 

 

 



 

 

附加:

什么是APT?

https://wiki.debian.org/Apt

Advanced Package Tool 高级打包工具

是一系列的工具用于管理Debian包, 因此这些程序要安装在你的Debian系统上。

它可以:

  • 安装app, 移除app
  • 更新app, 等等

Apt,可以基本解决依赖问题并检索需要的 软件包,Apt 强大,主要在命令行(控制台/terminal)下使用。

 

什么是apt-get?

APT package handling utility - command-line interface。

它是一个工具,自动更新你的Debian机器,同时get和install debin包/程序。

这个工具是 DebianPackageManagement system的一部分

 

什么是Debian?

Debian 可能是最优秀的 Linux 发行版本之一,,大部分原因应归功于其软件包管理方式。Debian 中的一切—— 一切应用,一切组件—— 一切都被构建为一个软件包,并安装在您的操作系统中(由安装器安装,或由您自己安装)。

 


 

posted @ 2018-11-05 20:23  Mr-chen  阅读(968)  评论(0编辑  收藏  举报