AWSへデプロイしてみよう（〜仮想サーバへデプロイ その４）

## 13.EC2でのデータベースの設定
まずは PostgreSQL をインストールします。

```
$ sudo su -
$ yum -y install postgresql94 postgresql94-server postgresql94-devel postgresql94-contrib postgresql94-docs
$ /etc/init.d/postgresql94 initdb
[起動]
$ /etc/init.d/postgresql94 start
```

設定ファイルを編集します。

```
$ vi /var/lib/pgsql94/data/postgresql.conf
```

三番目のトピックにある、listen_addressesのコメントを解除（先頭の#を削除）して、設定を'localhost'から'*'に編集してください。

```

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
```

認証設定の編集

```
$ vi /var/lib/pgsql94/data/pg_hba.conf
```

このファイルの最下部に、以下を追記します。

```
local   all     all     trust
host    all     all     0.0.0.0/0       md5
```
また、同ファイルの下の部分を以下のようにコメント化します

```
# "local" is for Unix domain socket connections only
# local   all             all                                     peer  ←コメント化する
# IPv4 local connections:
# host    all             all             127.0.0.1/32            ident　←コメント化する
# IPv6 local connections:
# host    all             all             ::1/128                 ident　　←コメント化する
```
編集が終了したら再起動させます。
$ /etc/init.d/postgresql94 restart

次に、postgresというユーザー名で、PostgreSQLへ接続します。

```
$ psql -U postgres
```

次に、アプリのconfig/database.ymlに書いてあるproduction設定のusername、database名を使ってロールとデータベースを登録します。

![スクリーンショット 2019-10-30 18.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455406/b470fba8-d8af-c1b7-fc19-bfe1f966ccb4.png)

```
postgres=# CREATE ROLE "ロール名" WITH SUPERUSER LOGIN;
postgres=# CREATE DATABASE "データベース名";

作業が終了したら、PostgreSQLとの接続を解除

postgres=# \q
```

最後にPostgreSQLを再起動してOK。

## 14.Nginx（エンジンエックス）Webサーバ、Unicorn（ユニコーン）アプリケーションサーバの環境整備
### Nginxのインストール

EC2からrootユーザーに入って、Nginxをインストール

```
$ sudo su -
$ yum -y install nginx
$ chkconfig nginx on
```

以下のコマンドでNginxが起動

```
$ /etc/init.d/nginx start
```

これでEC２のIPアドレスをブラウザのアドレスに記述すれば、Nginxのページが表示されます。

## 15.デプロイツール（Capistrano）を使ってデプロイ
###  公開鍵を作成してGithubに設置する

```
$ sudo su app # app userに切り替わっていない場合のみ実行
$ cd # ホームディレクトリにいない場合のみ実行
$ ssh-keygen -t rsa # 公開鍵秘密鍵のペアを作成

入力画面が出てきたら全てエンターでOK。

$ cat ~/.ssh/id_rsa.pub
```

コピーした公開鍵を、Githubのsettingにて設置すれば、EC2とGithub間でSSH接続ができるようになります。

### アプリ公開用ディレクトリを作成
EC2上に、アプリ公開用のディレクトリを新規作成します。
今回はwwwを公開用ディレクトリの名前として作成。

```
$ sudo mkdir wwwを管理者権限で実行しwwwフォルダを作り、
$ sudo chown -R app:app wwwでapp userに権限を与え、
$ cd /var/wwwでディレクトリに移動するながれになります

$ cd /var
$ sudo mkdir www
$ sudo chown -R app:app www
$ cd /var/www
```

### Gemfile編集

```
gem 'dotenv-rails' # 開発環境で環境変数を操作するのに必要
  gem 'unicorn' # アプリケーションサーバのunicorn
  gem 'mini_racer', platforms: :ruby # デプロイ時に必要

  group :development, :test do
    gem 'capistrano', '3.6.0' # capistranoのツール一式
    gem 'capistrano-bundler'
    gem 'capistrano-rails'
    gem 'capistrano-rbenv'
    gem 'capistrano3-unicorn'
    # 以下省略
  end
  # 以下省略
```

### Capfileの作成、編集

```
$ bundle exec cap install でファイル作成
```

Capfileに以下の内容を追記

```
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'
```

### デプロイ先のサーバ情報、アクセスキー情報を設定

/config/deploy/production.rb

```
server 'EC2のIPアドレス', user: 'app', roles: %w{app db web}
set :ssh_options, keys: 'ローカルの秘密鍵へのpath'
```

config/deploy.rbを開き、すべて以下に上書き

```
# config valid only for current version of Capistrano
lock '3.6.0'

# デプロイするアプリケーション名
set :application, 'achieve'

# cloneするgitのレポジトリ
# （xxxxxxxx：ユーザ名、yyyyyyyy：アプリケーション名）
set :repo_url, 'https://github.com/xxxxxxxxx/yyyyyyyyy'

# deployするブランチ。デフォルトはmasterなのでなくても可。
set :branch, ENV['BRANCH'] || 'master'

# deploy先のディレクトリ。
set :deploy_to, '/var/www/achieve'

# シンボリックリンクをはるフォルダ・ファイル
set :linked_files, %w{.env config/secrets.yml}
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets public/uploads}

# 保持するバージョンの個数(※後述)
set :keep_releases, 5

# Rubyのバージョン
set :rbenv_ruby, '2.5.1'
set :rbenv_type, :system

# 出力するログのレベル。エラーログを詳細に見たい場合は :debug に設定する。
# 本番環境用のものであれば、 :info程度が普通。
# ただし挙動をしっかり確認したいのであれば :debug に設定する。
set :log_level, :info

namespace :deploy do
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
  end

  desc 'Create database'
  task :db_create do
    on roles(:db) do |host|
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:create'
        end
      end
    end
  end

  desc 'Run seed'
  task :seed do
    on roles(:app) do
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:seed'
        end
      end
    end
  end

  after :publishing, :restart

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
    end
  end
end
```

。。つづく