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


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

railsの設定

Gemfile

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

Gemfile
gem 'redis'
gem 'pg'

database.yml

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

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で行なっていくため静的ファイルの配信設定は行いません.

config/environments/production.rb
  config.force_ssl = true

puma.rb

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

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ファイルを編集してください.

.env
COMPOSE_PROJECT_NAME=rails
POSTGRES_USER=ユーザー名(ex: postgres)
POSTGRES_PASSWORD=パスワード(ex: passwordDB_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

Ubuntu + nginx + LetsEncryptでSSL/TLSを設定する

Docker + Nginx + Let's EncryptでHTTPS対応のプロキシサーバーを構築する

docker+rails+puma+nginx+postgres (Production ready)