一步一步指南在数字海洋中部署Rails应用程序!

拉詹·巴特拉伊 - 9 months and 5 days ago / Oct 2019
一步一步指南在数字海洋中部署Rails应用程序!

原文发布于:2018-02-24。更新日期:2019-10-17。


当我开始在Rails上制作我的第一个Ruby应用程序时,它非常适合本地开发环境。这个想法很简单,应用程序将生成用户的CV,也让他们下载它。所以,我想,为什么不在生产服务器上部署呢?

有的地方,我们可以部署你的红宝石在铁路应用程序免费,如heroku。我将讨论我部署第一个应用程序的地方:"数字海洋"。

数字海洋

数字海洋是一个最喜欢的和廉价的地方部署你的铁路应用程序。您可以创建 VM 并完全从头开始配置,也可以专门为目标目的创建计算机。为此,我没有通过划痕过程,因为我熟悉nginx和Puma服务器的设置过程,所以我选择了"一键应用程序"。只需单击一下应用过程,即可立即进行设置。可用的应用程序是Ruby在Rails,字压,话语,phpmyAdmin等。

设置过程

1. 要配置 VM,请单击 16.04 上的 Ruby Rails。

2. 标准水滴为 1 GB。1vCPU,25GB SSD,每月5美元,适合我们的需要。

3. 您可以选择离您所在位置最近的任何数据中心。

4. 设置其他选项并设置 SSH 密钥。

5. 最后为小滴选择名称,然后单击"创建"选项。

这将最终创建 VM 并为您提供可以使用 SSH 访问的 IP 地址。

创建计算机后,我们可以使用 SSH 进行访问。

Goto 终端和类型 ssh root@IP.

这把我们带到机器,我们可以检查红宝石铁轨和其他需要的东西。

请确保可以配置和安装以下内容。

1. GIT 配置

2. SSH 配置

3. 后格瑞维配置

4. 恩金克斯

5. 系统升级

对于此实例,我将我的 SSH 密钥配置为 github。您也可以将其配置为位桶。

配置 SSH 密钥后,将应用克隆到 VM,以检查我们的设置是否正常工作。您可以通过

$ git 克隆 git@github.com:用户名/应用程序名称.git

没有必要保留这个回购,因为我们将使用capistrano进行克隆和其他目的。

我们现在真正的工作。

完成所有的东西后,它的时间设置我们的应用程序。我们将使用卡皮斯特拉诺。

将其添加到您的 宝石文件.

1
2
3
4
5
6
7
8
9
    :d下做宝石'卡皮斯特拉诺',要求:宝石'卡皮斯特拉诺-rvm',要求:宝石'卡皮斯特拉诺-铁路',要求:宝石'卡皮斯特拉诺-捆绑',要求:宝石'capistrano3-puma', 要求:

运行 $ 捆绑包安装 立即安装宝石。

这确实

1. 在项目的根路径中创建 Capfile。

2. 部署.rb 在配置目录中。

3. 在配置目录中部署文件夹。

安装宝石后,现在是时候配置卡皮斯特拉诺了。运行以下命令以配置 capistrano。

$ 上限安装

像这样替换新生成的 capfile 的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
    # Load DSL And Setup Up Stages
    Require 'Capistrano/Setup'
    Require 'Capistrano/Deploy'

    Require 'Capistrano/Rails'
    Require 'Capistrano/Bundler'
    Require 'Capistrano/Rvm'
    Require 'Capistrano/Puma'

    # Loads Custom Tasks From `Lib/Capistrano/Tasks' If You Have Any Defined.
    Dir.Glob('Lib/Capistrano/Tasks/*.Rake').Each { |R| Import R }

  

现在的主要任务是配置执行自动化部分的 deploy.rb。 更换 部署.rb 与以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Change these
server 'IP', port: 'port', roles: [:web, :app, :db], primary: true

set :repo_url,        'repo location'
set :application,     'app name'
set :user,            'user name in the VM'
set :puma_threads,    [4, 16]
set :puma_workers,    0

# Don't change these unless you know what you're doing
set :pty,             true
set :use_sudo,        false
set :stage,           :production
set :deploy_via,      :remote_cache
set :deploy_to,       "/home/#{fetch(:user)}/apps/#{fetch(:application)}"
set :puma_bind,       "unix://#{shared_path}/tmp/sockets/#{fetch(:application)}-puma.sock"
set :puma_state,      "#{shared_path}/tmp/pids/puma.state"
set :puma_pid,        "#{shared_path}/tmp/pids/puma.pid"
set :puma_access_log, "#{release_path}/log/puma.error.log"
set :puma_error_log,  "#{release_path}/log/puma.access.log"
set :ssh_options,     { forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa.pub) }
set :puma_preload_app, true
set :puma_worker_timeout, nil
set :puma_init_active_record, true  # Change to false when not using ActiveRecord

## Defaults:
# set :scm,           :git
# set :branch,        :master
# set :format,        :pretty
# set :log_level,     :debug
# set :keep_releases, 5

## Linked Files & Directories (Default None):
# set :linked_files, %w{config/database.yml}
# set :linked_dirs,  %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

namespace :puma do
  desc 'Create Directories for Puma Pids and Socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir #{shared_path}/tmp/sockets -p"
      execute "mkdir #{shared_path}/tmp/pids -p"
    end
  end

  before :start, :make_dirs
end

namespace :deploy do
  desc "Make sure local git is in sync with remote."
  task :check_revision do
    on roles(:app) do
      unless `git rev-parse HEAD` == `git rev-parse origin/master`
        puts "WARNING: HEAD is not the same as origin/master"
        puts "Run `git push` to sync changes."
        exit
      end
    end
  end

  desc 'Initial Deploy'
  task :initial do
    on roles(:app) do
      before 'deploy:restart', 'puma:start'
      invoke 'deploy'
    end
  end

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'puma:restart'
    end
  end

  before :starting,     :check_revision
  after  :finishing,    :compile_assets
  after  :finishing,    :cleanup
  after  :finishing,    :restart
end

# ps aux | grep puma    # Get puma pid
# kill -s SIGUSR2 pid   # Restart puma
# kill -s SIGTERM pid   # Stop puma

要配置或替换的主要部件是

1. 服务器 IP = 由数字海洋提供

2. 端口 = 22

3. repo_url – your github/bitbucket url{depends on what you setup earlier for SSH}

4. 应用程序 + 应用程序名称

5. VM 中的用户 + 用户名

一旦这一切完成,是时候设置我们的nginx。在配置目录中创建一个文件 nginx.conf 并添加以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream puma {
  server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock;
}

server {
  listen 80 default_server deferred;
  # server_name example.com;

  root /home/deploy/apps/appname/current/public;
  access_log /home/deploy/apps/appname/current/log/nginx.access.log;
  error_log /home/deploy/apps/appname/current/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 10M;
  keepalive_timeout 10;
}

请记住,您需要将用户名从部署到用户名和应用程序名称更改为您在 deploy.rb 中写入的任何内容。

推送 git 服务器中的所有更改,并将部署运行为

$ 上限生产部署:初始

这将需要时间取决于你的应用程序和互联网连接。该过程完成后,将 Puma Web 服务器连接到 Nginx 反向代理。

$ sudo rm /etc/nginx/网站启用/默认
$ sudo ln -nfs"/主页/部署/应用程序/应用程序/应用程序名称/当前/配置/nginx.conf" "/etc/nginx/站点启用/应用程序名称"

再次记住替换上面行中的应用程序名称和用户名。

重新启动 nginx 服务和 Boom,我们的应用程序已准备就绪。去与你的IP地址在浏览器和TADA完成!!

本教程的灵感来自于在数字海洋 VM 中使用 nginx、美洲狮 Web 服务器在铁路上部署 Ruby。




拉詹·巴特拉伊
Rajan Bhattarai
软件工程师的工作。全栈Ruby on Rails开发者。DevOps和Blockchain.Tech Blogger。查询和文章:hello@cdrrazan.com -Rb


由 Disqus供电的评论