現在、Docker上でRailsでAPIを作っています。
既に本番環境で動かしているWebアプリ(API)をHTTPS化する作業を行った際のメモ。
主にこちらのQiitaの記事を参考にしました。
https://qiita.com/c18t/items/c693d5bcda2e9b82e39bqiita.com
https-portalというDockerコンテナを導入するだけで簡単にHTTPS化できるらしい・・・!?
github.com
使ってみた結果、docker-composeファイルに設定を少し加えるだけでできました。
https-portalとは?
簡単にいうと、サイトのHTTPS化を自動でやってくれるコンテナみたいです。
無料でSSLサーバー証明書を発行し、更に自動で証明書の更新などをしてくれるLet's Encrypt・nginx・dockerを搭載しているHTTPSサーバーだそうです。すごい。
今回の環境
docker-composeファイル
このファイルの細かい設定については省きますが、全体のdocker-composeファイルはこんな感じです。
ちなみに私はdocker-compose.development.ymlとdocker-compose.production.ymlで設定ファイルを分けています。
# docker-comose.production.yml version: '3' services: # 今回追加したhttps-portalコンテナ https-portal: image: steveltn/https-portal:1 ports: - '80:80' - '443:443' environment: DOMAINS: 'mydomain.app -> http://dockerhost:8000/' STAGE: 'production' depends_on: - nginx # Rails用コンテナ web: build: . ports: - "3000:3000" depends_on: - db volumes: - .:/app-name - public-data:/app-name/public - tmp-data:/app-name/tmp environment: RAILS_ENV: 'production' RACK_ENV: 'production' LENBO-API_DATABASE_PASSWORD: 'password' command: bundle exec unicorn -p 3000 -c /app-name/config/unicorn.rb -E production # db用コンテナ db: image: mysql:5.7 volumes: - ./db/data:/var/lib/mysql/ - ./db/conf:/etc/mysql/conf.d environment: MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" # nginx用コンテナ nginx: build: containers/nginx ports: - 8000:8000 volumes: - public-data:/app-name/public - tmp-data:/app-name/tmp depends_on: - web volumes: public-data: tmp-data:
https-portal: image: steveltn/https-portal:1 ports: - '80:80' - '443:443' environment: DOMAINS: 'mydomain.app -> http://dockerhost:8000/' STAGE: 'production' depends_on: - nginx
DOMAINSの所で、ここで既に作ってあったnginxコンテナとhttps-portalコンテナを結びつけてる。
リポジトリのこの辺りをみると良さそう。
https://github.com/SteveLTN/https-portal#hybrid-setup-with-non-dockerized-apps
nginxコンテナの設定で、portsの所を8000:8000(ホスト:コンテナ)で指定している。
そのため、http://dockerhost:8000でnginxのコンテナにアクセスできる。(https-portalはhttp://dockerhostでホストマシンにアクセス可)
まとめ
https-portalコンテナを入れただけですぐHTTPS化できた。
でも、とりあえず軽く読んで動かしてみただけなので深く理解できてない…。今後も使うことがありそうなのでもう少しちゃんと読みたいなー。
Dockerとかサーバー周りの知識とか全然ないので誰かアドバイスとか間違いの指摘とかあると思うので教えてください!
追記
このままコンテナを更新すると,毎回証明書を取得してしまうため、Let's Encryptの制限回数にひっかかってしまいます。
一回達すると一週間ぐらい発行できなくなり、泣きます…(´;ω;`)
その場合はdocker-compose.ymlのenvironmentに
FORCE_RENEW: 'false'
を追加することで、起動するたびに証明書の取得はしなくなります。