🦔

Rails7 のローカル環境(Docker)をSSL化する

2022/08/24に公開

目的

開発環境と本番環境をできるだけ近いものにしておきたい

前提条件

  • 現在、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の登録は不要です。

/etc/hosts
# 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に追加する
https://github.com/SteveLTN/https-portal#quick-start

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に以下を追記する

development.rb
Rails.application.configure do
    ...
    config.hosts << "www.mysite.local"
end

追記したら、https://www.mysite.localhttps://mysite.local にて、アプリケーションが表示されることを確認できる。

Discussion