部署--云服务器(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账号(腾讯云)
设置公匙。
添加项目,复制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.yml
,config/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 中的一切—— 一切应用,一切组件—— 一切都被构建为一个软件包,并安装在您的操作系统中(由安装器安装,或由您自己安装)。