Rails7 のローカル環境(Docker)をSSL化する
目的
開発環境と本番環境をできるだけ近いものにしておきたい
前提条件
- 現在、RailsのWEBアプリケーションがhttp://localhost:3000で、ブラウザで表示できる状態である
- docker-compose.ymlを使用
- テスト用のオレオレ証明書を使用
ゴール
ブラウザに 独自ドメインで、http://localhost:3000と同じように、アクセスできること。
今回は、https://www.mysite.local, https://mysite.local で http://localhost:3000と 同じ表記になるように修正します。
ステージングや本番環境の設定手順に関しては、別の記事で書く予定です。
手順1: 新規プロジェクトを作成する
/etc/hosts に任意の独自ドメインを追加する。
今回は、ローカル環境とドメインの紐付けなので、実際にお名前.comやMuuMuuDomainなどで、ドメインを購入したり、DNSサーバーでのIPの登録は不要です。
# for ssl docker local
127.0.0.1 www.mysite.local
127.0.0.1 mysite.local
手順2: docker-compose.ymlを編集
https-portalサービスをdocker-compose.ymlに追加する
version: '3'
services:
db:
image: postgres:14.3
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
# - ./db/initdb.d:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
restart: always
web:
build:
context: web
dockerfile: Dockerfile
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- ./web:/app
environment:
DB_HOST: ${DB_HOST}
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
EDITOR: vim
RAILS_ENV: development
ports:
- "3000:3000"
depends_on:
- db
# docker sslのために、追加
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
links:
- web
restart: always
environment:
DOMAINS: 'www.mysite.local -> http://web:3000, mysite.local -> http://web:3000'
STAGE: 'local'
volumes:
- ./https-portal:/var/lib/https-portal
ちなみに、docker-compose.ymlは、https://zenn.dev/dragonarrow/articles/8503c36d19eb6f で書いた時の状態から追記しています。
STAGE
設定 | ドメイン取得 |
---|---|
local | 不要 |
staging | 必要 |
production | 必要 |
local,stagingでは、テスト用のオレオレ証明書が、productionではletsencryptによる正式なSSL証明書が自動で発行されます。
手順3: ビルドしてコンテナを立ち上げる
$ docker-compose build
$ docker-compose up -d
https://www.mysite.local/ にアクセスすると、To allow requests to www.mysite.local make sure it is a valid hostname (containing only numbers, letters, dashes and dots), then add the following to your environment configuration...(省略)
というエラーが出ます
これは、RailsのDNSリバインディング攻撃の保護機能で、許可するホスト以外には公開ドメインにプライベート IP アドレス範囲を使用されないようブロックするようになっています。
(デフォルトでは0.0.0.0、::、およびlocalhostからのリクエストを許可)
手順4: 開発環境の設定ファイルにて、ホストを許可
config/environments/development.rbに以下を追記する
Rails.application.configure do
...
config.hosts << "www.mysite.local"
end
追記したら、https://www.mysite.local と https://mysite.local にて、アプリケーションが表示されることを確認できる。
Discussion