部署 新手记录一次自动部署过程!mina+puma+nginx

yfscret · 2019年05月08日 · 最后由 pynix 回复于 2019年05月09日 · 7027 次阅读

第一次发帖,还不太会用 Markdown😂

为什么用 mina+puma?

最开始一直是手动 ssh 到服务器进行部署,我也觉得挺好的,然后吧时间长了,就觉得好烦,然后就开始尝试自动部署。之前有跟着论坛的帖子用 Capistrano 和 Passenger 进行部署,是用sudo apt-get install nginx-extras passenger安装的 nginx,也是成功的,但是服务器加了 rtmp 服务,得用编译模式安装 nginx,然后 passenger 就不知道怎么搞到 nginx 里去了,还有一个原因是我看大家都说 mina 简单(作为新手我就需要简单的😂 ),而且我一直觉 puma 是默认自带的,肯定有自带的好处啊,为啥那么多帖子都让用 Passenger,整不明白。所以果断就换了。废话不多说,开始吧!

  • 安装 mina 和 mina-puma

    在本地rails项目Gemfile中添加
    gem 'mina'      #当前版本为1.2.3
    gem 'mina-puma', require: false
    

    然后 bundle install

  • 创建 Mina 的配置文件 cd 进入自己的本地 Rails 项目目录

mina init

会生成 deploy.rb 文件 进行配置

require 'mina/rails'
require 'mina/git'
require 'mina/puma'
require 'mina/rbenv'  # ruby版本控制用rbenv,rvm的话还要设置gemset

set :application_name, 'rails_app'    #给项目起名字,随便起
set :domain, 'username@ip'    #用户名@ip,用来ssh 登录服务器用的
set :deploy_to, '/home/ruihai/rails_app'    #服务器里想把项目部署的位置,可以没有rails_app那个文件夹,会自动创建
set :repository, 'git@xxxxxxxxt'   #项目git地址,也可以用https开头的
set :branch, 'master'     #想部署的分支

set :forward_agent, true     #使用本地的`SSH秘钥`去服务器执行`git pull`,这样`Git`上就不用设置`部署公钥`

#如果rails是5.2以上版本,就把下面的secrets.yml改成master.key
set :shared_files, fetch(:shared_files, []).push('config/database.yml', 'config/secrets.yml')

task :remote_environment do
  invoke :'rbenv:load'
end

task :setup do
  # command %{rbenv install 2.3.0 --skip-existing}
end

desc "Deploys the current version to the server."
task :deploy do
  deploy do
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'
    invoke :'bundle:install'
    invoke :'rails:db_migrate'
    invoke :'rails:assets_precompile'
    invoke :'deploy:cleanup'

    on :launch do
      in_path(fetch(:current_path)) do
        command %{mkdir -p tmp/}
        command %{touch tmp/restart.txt}
      end
    end
  end
end
  • 服务器生成 Mina 的相关目录

在本地mina setup

-----> Loading rbenv
-----> Setting up /home/ruihai/rails_app
       /home/ruihai
       总用量 24
       drwxrwxr-x  6 ruihai ruihai 4096 5月   5 18:23 .
       drwxr-xr-x 15 ruihai ruihai 4096 5月   7 13:41 ..
       lrwxrwxrwx  1 ruihai ruihai   34 5月   5 18:23 current -> /home/ruihai/rails_app/releases/3
       drwxrwxr-x  8 ruihai ruihai 4096 5月   5 18:23 releases
       drwxrwxr-x  7 ruihai ruihai 4096 5月   5 14:34 scm
       drwxrwxr-x  7 ruihai ruihai 4096 5月   5 14:37 shared
       drwxrwxr-x  2 ruihai ruihai 4096 5月   5 18:23 tmp
       # gitee.com:22 SSH-2.0-Basalt-1.2
       Connection to xxx.xxx.xxx.xxx closed.

       Elapsed time: 1.48 seconds

这里的遇到个坑,运行完这个命令终端里会提示远程服务器关闭,还是红色字体提示,我以为是报错了,其实没有报错。

然后你需要 SSH 到服务器上,在生成的项目下 /shared/config目录中,新建以下两个文件

  1. database.yml,直接把本地 database.yml 的内容拷进去
  2. secrets.yml,也是一样把本地 secrets.yml 的内容拷进去

在/shared/tmp 目录下 mkdir 新建 sockets 和 pids 两个目录(gem 'mina-puma'需要)

  • 部署

本地运行mina deploy

-----> Creating a temporary build path
-----> Loading rbenv
-----> Fetching new git commits
-----> Using git branch 'master'
       正克隆到 '.'...
       完成。
-----> Using this git commit
       rushboy (cf7907e):
       > change Grindplayer.swf location
-----> Symlinking shared paths
-----> Installing gem dependencies using Bundler
       Using rake 12.3.2
       Using concurrent-ruby 1.1.3
       Using i18n 1.2.0
       Using minitest 5.11.3
       Using thread_safe 0.3.6
       Using tzinfo 1.2.5
       Using activesupport 5.1.6.1
       Using builder 3.2.3
       Using erubi 1.7.1
       Using mini_portile2 2.3.0
       Using nokogiri 1.8.5
       Using rails-dom-testing 2.0.3
       Using crass 1.0.4
       Using loofah 2.2.3
       Using rails-html-sanitizer 1.0.4
       Using actionview 5.1.6.1
       Using rack 2.0.6
       Using rack-test 1.1.0
       Using actionpack 5.1.6.1
       Using nio4r 2.3.1
       Using websocket-extensions 0.1.3
       Using websocket-driver 0.6.5
       Using actioncable 5.1.6.1
       Using globalid 0.4.1
       Using activejob 5.1.6.1
       Using mini_mime 1.0.1
       Using mail 2.7.1
       Using actionmailer 5.1.6.1
       Using activemodel 5.1.6.1
       Using arel 8.0.0
       Using activerecord 5.1.6.1
       Using bcrypt 3.1.12
       Using bundler 2.0.1
       Using cancancan 2.3.0
       Using mime-types-data 3.2018.0812
       Using mime-types 3.2.2
       Using carrierwave 1.3.1
       Using climate_control 0.2.0
       Using terrapin 0.6.0
       Using cocaine 0.6.0
       Using orm_adapter 0.5.0
       Using ckeditor 4.2.4
       Using coffee-script-source 1.12.2
       Using execjs 2.7.0
       Using coffee-script 2.4.1
       Using method_source 0.9.2
       Using thor 0.20.3
       Using railties 5.1.6.1
       Using coffee-rails 4.2.2
       Using ffi 1.9.25
       Using multi_json 1.13.1
       Using jbuilder 2.8.0
       Using kaminari-core 1.1.1
       Using kaminari-actionview 1.1.1
       Using kaminari-activerecord 1.1.1
       Using kaminari 1.1.1
       Using mini_magick 4.9.2
       Using mysql2 0.5.2
       Using puma 3.12.0
       Using sprockets 3.7.2
       Using sprockets-rails 3.2.1
       Using rails 5.1.6.1
       Using rails-i18n 5.1.2
       Using rb-fsevent 0.10.3
       Using rb-inotify 0.9.10
       Using sass-listen 4.0.0
       Using sass 3.7.2
       Using tilt 2.0.9
       Using sass-rails 5.0.7
       Using turbolinks-source 5.2.0
       Using turbolinks 5.2.0
       Using uglifier 4.1.20
       Bundle complete! 23 Gemfile dependencies, 72 gems now installed.
       Gems in the groups development and test were not installed.
       Bundled gems are installed into `./vendor/bundle`
-----> DB migrations unchanged; skipping DB migration
-----> Precompiling asset files
yarn install v1.15.2
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 0.16s.
-----> Cleaning up old releases (keeping 5)
       /home/ruihai/rails_app/tmp/build-155731703215529
-----> Deploy finished
-----> Building
-----> Moving build to /home/ruihai/rails_app/releases/4
-----> Build finished
-----> Launching
-----> Updating the /home/ruihai/rails_app/current symlink
       /home/ruihai/rails_app/current
-----> Done. Deployed version 4
       Connection to xxx.xxx.xxx.xxx closed.

       Elapsed time: 6.94 seconds

成功后会显示 Done. Deployed version x 然后连接你远程服务器关闭。也是红色显示(- - !)。 至此,自动部署完毕。

  • Nginx 配置 在 nginx.conf 里添加
upstream rails_app {
   server unix:///home/ruihai/rails_app/shared/tmp/sockets/puma.sock;
}

server {
   listen 80;
       server_name 你的域名或者ip;
       root /home/ruihai/rails_app/current/public;

   location / {
     proxy_pass http://rails_app;
     #下面这两个是为rtmp设置的,因为rtmp在同一台机器的nginx.conf里配置,不加下面的就播放不出来,我也不知道为什么
      proxy_set_header Origin http://$Host;
      proxy_set_header Host $Host:$server_port;
   }

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

然后重启 nginx,不管你的服务器是 ubuntu 还是 centos,不管你是用 apt-get install nginx 还是 yum install nginx 或者是./configure 编译安装的 nginx,请都用这个命令/etc/nginx/sbin/nginx -s reload 重启 nginx,通用。

  • 最后浏览器打开你的域名或者 ip 就可以看到网站啦!

本人还是个新手小白,发帖是记录一下自己的部署过程,也给需要的朋友提供个参考,其实有很多不明白的地方,也可能有错误的地方,望大家批评指导

dokku(heroku) 很爽。。。

pynix 回复

不明白你的意思

yfscret 回复

paas 最小实现,

yfscret 回复

curl 安装,然后 gitpush 就行了。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号