デプロイのテスト - 不定期刊 Rails App を作る(4)

RailsApp Rails 2018年 11月 8日

後でデプロイは自動化するが,ひとまず正しく動くことを手動で確認する

git の登録

  1. すでに Rails により .gitignore が設定されている.macOS, Vim, Rails の .gitignore を追加しておく.被るものがあるが気にしないことにする.ちなみに,gibo は homebrew でインストールできる.
  2. gibo update; gibo dump macOS Vim Rails >> .gitignore
  3. 現在のファイルを全てコミット・プッシュしておく.慣れないうちは SourceTree などの GUI アプリを使うとよい

デプロイサーバでの Rails 設定

デプロイサーバではすでに nginx がインストールされており,他の Rails アプリはリバースプロキシとして利用している. 今回は,Rails 側の production 設定を行なった後に,リバースプロキシの設定を追加する.

  1. リポジトリを pull し,bundle install, yarn, webpack などの設定は開発環境と同様に設定しておく.
  2. config/database.yml の production の設定を行う.production については,デフォルトでパスワードの設定があるが,ホスト名とポート番号を追加しておく.パスワードは環境変数 ATTENDANCE_DATABASE_PASSWORD で設定するようになっている.
  3. production:
      <<: *default
      database: attendance_production
      username: attendance
      password: <%= ENV['ATTENDANCE_DATABASE_PASSWORD'] %>
      host: localhost
      port: 5432
  4. PostgreSQL には attendance というユーザが必要となる.postgres ユーザとなり,ユーザ作成およびユーザの設定を行う.
  5. # postgres ユーザになる
    sudo su postgres
    # attendance ユーザを PostgreSQL に作成
    createuser attendance
    # psql で attendance ユーザの設定を追加 (2行目以降は psql でのコマンド)
    psql template1
    template1=# alter user attendance createdb;
    template1=# alter user attendance encrypted password '設定したいパスワード';
  6. /etc/postgresql/9.5/main/postgresql.conf にて listen_addresses を localhost にしておく(デフォルトだから書かなくていいのかもしれないが).
  7. listen_addresses = 'localhost'
  8. /etc/postgresql/9.5/main/pg_hba.conf にて attendance_production の設定を追加しておく
  9. local attendance_production attendance md5
  10. postgresql サービスを再起動する
  11. sudo service postgresql restart
  12. 今回のサーバはサーバ直下ではなく,サブディレクトリで運用する.このため,production 環境のみ prefix を追加するように設定する.このため,config.ru に以下の設定を追加する.この結果,環境変数 RAILS_RELATIVE_URL_ROOT が設定されている時のみ,map を追加することになる.
  13. if ENV['RAILS_RELATIVE_URL_ROOT']
      map ENV['RAILS_RELATIVE_URL_ROOT'] do
        run Rails.application
      end
    else
      run Rails.application
    end
  14. puma は sock 経由でリバースプロキシにデータを転送する.このため,config/puma.rb に以下の設定を追加する
  15. _proj_path = "#{File.expand_path('../..', __FILE__)}"
    _proj_name = File.basename(_proj_path)
    _home = ENV.fetch('HOME') { '/home/hkob' }
    
    pidfile "#{_home}/run/#{_proj_name}.pid"
    bind "unix://#{_home}/run/#{_proj_name}.sock"
    directory _proj_path
  16. この設定では $HOME/run の下に pid ファイルと sock ファイルを作成するため,事前にディレクトリを作成しておく
  17. mkdir ~/run
  18. サーバを起動する前に production のデータベースを作成しておく
  19. env ATTENDANCE_DATABASE_PASSWORD='設定したデータベースパスワード' RAILS_ENV=production bin/rails db:create
  20. サーバを起動する.このためには,RAILS_MASTER_KEY が必要となる.Rails new した時に,config/master.key が作成されているので,その内容をメモしておく.
  21. とりあえずテストでサーバが起動することを確認する
  22. env RAILS_MASTER_KEY='config/master.key の内容' RAILS_RELATIVE_URL_ROOT=/attendance ATTENDANCE_DATABASE_PASSWORD='設定したデースベースパスワード' RAILS_ENV=production bin/rails s
  23. とりあえずテスト用の reboot スクリプトも作っておく.パスワードなども書かれているので,リポジトリ外に設置しておくこと.
  24. #!/bin/sh
    kill -KILL `cat ~/run/attendance.pid`
    cd /home/hkob/attendance
    bin/webpack
    RAILS_RELATIVE_URL_ROOT=/attendance ATTENDANCE_DATABASE_PASSWORD='設定したデータベースのパスワード' RAILS_MASTER_KEY='config/master.key の内容' RAILS_SERVE_STATIC_FILES=true RAILS_ENV=production bundle exec puma -w 2 -d
  25. このスクリプトを実行すると既存の puma プロセスを止め,新しいサーバを起動する
  26. ../reboot.sh

nginx の設定

  1. nginx はリバースプロキシとして設定する.ここでは今回の設定部分のみを記載する./etc/nginx/sites-available/default の関係部分を示す./attendance は upstream で sock を参照するように設定しているだけである.
  2. server {
            listen 443 ssl;
            (中略)
            location /attendance {
                    proxy_pass http://attendance;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    proxy_redirect off;
                    root /var/www/html/attendance/public;
            }
            (中略)
    }
    upstream attendance {
            server unix:/home/hkob/run/attendance.sock fail_timeout=0;
    }
  3. 設定が終わったら nginx を restart する
  4. sudo service nginx restart
  5. 該当サーバの /attendance をブラウザでアクセスし,クライアントと同じ表示がでればデプロイ完了である.
  6. test画面

長くなったので今日はここまで