railsをdockerで立ち上げる方法はいろいろなところにあるのですが,webpackerとAction cable, Active storageを利用しているものが見当たらなかったのでまとめました.
railsの設定
Gemfile
まずデータベースとしてpostgresql,redisを利用するため,Gemfileに記載します.action cableを利用しない場合はpostgresqlのみで大丈夫です.
gem 'redis'
gem 'pg'
database.yml
次にpostgresqlの接続設定を行っていきます.
usernameやパスワードなどは後々環境変数として設定していきます.
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.force_ssl = true
puma.rb
次にpumaの設定を行っていきます.
ここではsocketでの通信を行なっていくように設定していくため,PORTの設定を削除して,一番下の2行を追加しています.
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ファイルを編集してください.
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
Ubuntu + nginx + LetsEncryptでSSL/TLSを設定する