docker+rails+nginx+webpacker+ssl+action cable+active storage

railsをdockerで立ち上げる方法はいろいろなところにあるのですが，webpackerとAction cable, Active storageを利用しているものが見当たらなかったのでまとめました．

# railsの設定
## Gemfile
まずデータベースとしてpostgresql,redisを利用するため，Gemfileに記載します．action cableを利用しない場合はpostgresqlのみで大丈夫です．

```conf:Gemfile
gem 'redis'
gem 'pg'
```

## database.yml
次にpostgresqlの接続設定を行っていきます．
usernameやパスワードなどは後々環境変数として設定していきます．

``` conf:config/database.yml
production:
  adapter: postgresql
  encoding: unicode
  username: <%= ENV.fetch("POSTGRES_USER") %>
  password: <%= ENV.fetch("POSTGRES_PASSWORD") %>
  pool: 5
  host: db
  database: <%= ENV.fetch("DB_NAME") %>
```

## production.rb
次にproduction環境のssl設定を行います．
次の部分のコメントアウトを外します．これにより常時ssl設定になります．
静的ファイルの配信はnginxで行なっていくため静的ファイルの配信設定は行いません．

``` conf:config/environments/production.rb
  config.force_ssl = true
```

## puma.rb
次にpumaの設定を行っていきます．
ここではsocketでの通信を行なっていくように設定していくため，PORTの設定を削除して，一番下の2行を追加しています．

``` conf:config/puma.rb
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count

environment ENV.fetch("RAILS_ENV") { "development" }

pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }

plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
```

## master.key
次にmaster.keyの設定を行っていきます．
APIキーなどを暗号化して共有することができるcredentialsに付随して必要となっているものです．APIキーなどを暗号化された状態でgithubなどにあげることができます．その代わりmaster.keyを共有しないと複合することができずデプロイ時にエラーが出てしまうので設定します．

```
vim config/master.key
# ローカルのconfig/master.keyをコピーして貼り付けてください
```

## sockets
tmpの下にsocketsディレクトリが存在してない場合は作成してあげないとpumaの起動時にエラーが出る場合があるので作製します．

```
cd tmp
mkdir sockets
touch sockets/.keep
```

# Dockerの設定
docker,docker-composeに関しては各自の環境に合わせてインストールしてください．

## docker-composeファイルのダウンロード
docker-composeでRails環境を構築するのに必要なファイルを以下にまとめました．
https://github.com/arato-make/docker-rails

```
git clone https://github.com/arato-make/docker-rails.git
# Gemfileなどが存在しているディレクトリ内で行ってください
cd docker-rails
ln docker-compose.yml ../docker-compose.yml
ln .env ../.env
```

## 環境変数の設定
各自の環境に合わせて変更が必要なものは.envファイルにまとめてあるので.envファイルを編集してください．

```conf:.env
COMPOSE_PROJECT_NAME=rails
POSTGRES_USER=ユーザー名(ex: postgres)
POSTGRES_PASSWORD=パスワード（ex: password）
DB_NAME=データベース名(ex: app_production)
SERVER_NAME=サーバー名(ex: example.com)
```

## Dockerビルド， DB構築
```
docker-compose build
docker-compose run app rake db:migrate
```

## SSL設定
railsの部分は環境変数で設定しているCOMPOSE_PROJECT_NAMEに対応しています．
メールアドレス， ドメイン部分に関しては各自の環境に合わせて設定してください

```
sudo docker run --rm   -p 443:443 -p 80:80 --name letsencrypt   -v "rails_certs:/etc/letsencrypt"   -v "rails_certs-data:/var/lib/letsencrypt"   certbot/certbot certonly -n   -m "メールアドレス"   -d ドメイン  --standalone --agree-tos
```

## Dockerの立ち上げ
```
docker-compose up -d
```
これでポート・DNSの設定が完了していればアクセスできるようになっているはずです．


# 参考サイト

[Docker + Rails + Puma + Nginx（SSL） + MySQL](https://qiita.com/eighty8/items/328271ec0483a5a0c590])

[Ubuntu + nginx + LetsEncryptでSSL/TLSを設定する](https://qiita.com/akubi0w1/items/c436343f544d13e3be1d) 

[Docker + Nginx + Let's EncryptでHTTPS対応のプロキシサーバーを構築する](https://qiita.com/bremen/items/fcf8571fd2bae080b42b) 

[docker+rails+puma+nginx+postgres (Production ready)](https://gist.github.com/satendra02/1b335b06bfc5921df486f26bd98e0e89)