Пошаговое руководство по развертыванию приложения Rails в DigitalOcean!

По адресу Раджан Бхаттарай - 9 months and 5 days ago / Oct 2019
Пошаговое руководство по развертыванию приложения Rails в DigitalOcean!

Первоначально размещено на: 2018-02-24. Обновлено по: 2019-10-17.


Когда я начал делать свое первое приложение "Рубин на рельсах", оно отлично работало в локальной среде разработки. Идея была достаточно простой, приложение генерировало CV для пользователя, а также позволяло загружать его. Так что я подумал, почему бы не развернуть его на производственном сервере?

Есть места, где мы можем разместить ваше приложение рубин на рельсах бесплатно, например, heroku. Я буду обсуждать место, где я установил свое первое приложение: "DigitalOcean".

DigitalOcean

DigitalOcean является одним из любимых и дешевых мест для развертывания вашего приложения рельсы. Вы можете либо создать ВМ и либо полностью настроить с нуля или вы можете создать машину специально для целевой цели. Для этой цели я не проходил через процесс с нуля, потому что я знаком с процессом установки для nginx и Puma сервера, так что я выбрал "Одним щелчком мыши-приложения". Процесс установки приложений одним щелчком мыши позволяет мгновенно выполнить настройку. Доступны следующие приложения: Ruby on Rails, Wordpress, Discourse, phpmyAdmin и др.

Процесс установки

1. Чтобы настроить вашу ВМ, нажмите на Ruby on Rails на 16.04.

2. Стандартная капелька, будет 1 ГБ. 1vCPU, 25GB SSD, которые стоят 5$ в месяц, что соответствует нашей потребности.

3. Вы можете выбрать любой ближайший дата-центр.

4. Настройте дополнительные опции и настройте SSH-ключи.

5. Наконец, выберите имя для вашей капли и нажмите на кнопку Создать.

Это, наконец, создаст ВМ и предоставит вам IP-адрес, с которого можно получить доступ с помощью SSH.

После того, как машина создана, мы можем получить доступ с помощью SSH.

Фототерминал и тип ssh root@IP.

Это приведет нас прямо к машине, и мы сможем проверить рубин, рельсы и другие необходимые вещи.

Пожалуйста, убедитесь, что вы можете настроить и установить следующее.

1. GIT-конфигурация

2. SSH Конфигурация

3. Postgresql Конфигурация

4. Nginx

5. Обновление системы

В данном случае я настроил SSH-ключи на github. Вы также можете настроить его на bitbucket.

После настройки SSH-ключей клонируйте ваше приложение на ВМ, чтобы проверить, работает ли наша настройка. Вы можете сделать это с помощью

$ git-клон git@github.com:username/name-of-the-app.git

Нет необходимости держать это репо, так как мы будем использовать capistrano для клонирования и других целей.

Теперь наша настоящая работа.

После того, как мы закончили, пришло время настроить наше приложение. Мы будем использовать Капистрано...

Добавьте это к вашему Геммфайл.

1
2
3
4
5
6
7
8
9
    группа развитие делать

    гемма "капистрано,         требует: поддельный
    гемма "capistrano-rvm,     требует: поддельный
    гемма "капистрано-рельсы,   требует: поддельный
    гемма "капистрано-разбойник, требует: поддельный
    гемма "capistrano3-puma,   требует: поддельный

    конец

Запустить $ установка пакета установить драгоценные камни сейчас.

Это так

1. Создает Capfile в корневом пути проекта.

2. развёртывание. в каталоге конфигурации.

3. папка установки в каталоге конфигурации.

После установки драгоценного камня пришло время настроить capistrano. Для настройки capistrano выполните следующую команду.

установка крышки

Замените содержимое вновь созданного cap-файла следующим образом.

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, выполняющего часть автоматизации. Заменить развёртывание. со следующим.

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-адрес сервера - Предоставляется DigitalOcean

2. Порт - 22

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

4. название приложения

5. пользователь - имя пользователя в ВМ

Как только все это закончится, пришло время настроить наш 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;
}

Помните, что вам нужно изменить имя пользователя с deployment на ваше имя пользователя и имя приложения на то, что вы написали в deployment.rb.

Введите все изменения на git-сервере и запустите установку в качестве

$ капитальное производство развёртывание:inital

Это займет время в зависимости от вашего приложения и подключения к Интернету. Как только процесс завершится, подключите ваш Puma веб-сервер к обратному прокси Nginx.

$ sudo rm /etc/nginx/sites-enabled/default
$ sudo ln -нфс "/home/deploy/apps/appname/current/config/nginx.conf" "/etc/nginx/sites-enabled/appname" "/etc/nginx/sites-enabled/appname".

Снова не забудьте заменить имя приложения и имя пользователя в строках выше.

Перезапустите сервис nginx и Бум, наше приложение готово. Вставьте свой IP-адрес в браузер и TADA готово!!!

Вдохновением к этому учебнику послужило развертывание вашего приложения "рубин на рельсах" с помощью nginx, веб-сервера puma в DigitalOcean VM.




Раджан Бхаттарай
Раджан Бхаттарай
Инженер-программист по работе. Разработчик Full Stack Ruby on Rails. DevOps и Blockchain.Tech Blogger. Запросы и статьи: hello@cdrrazan.com -Rb.


комментарии на основе Disqus