【Docker】https-portalで地味にはまるところ|Laravelのassetの話もあるよ
ためになりそうな人
https-portalがうまく使えない
Laravel使っててassetの挙動がおかしい
はじめに
ローカル開発してる時は必須ではないけど本番運用する時に絶対に必須になってくるのがhttps化になります
Let's Encryptの証明書の発行とかnginxのリバースプロキシとか...
これら一から用意するのはちょい面倒みたいな部分をよしなにやってくれる便利なDockerイメージがあるんですね
それがhttp-portalです
https://github.com/SteveLTN/https-portal
今回はhttps-portalを使い方とはまったところについて書いていきます
ちなみに、簡単な例をgithubにあげてますのでよかったら参考にしてみてください
https://github.com/kosh-jp/docker/tree/master/laravel_nginx_mariadb
使い方
docker-compose.ymlに下記を追加する。以上!!
version: "3" services: nginx: image: nginx # ports: # - 8080:80 https-portal: image: steveltn/https-portal ports: - 80:80 - 443:443 restart: always environment: DOMAINS: "your.domain -> http://nginx" STAGE: "production" # FORCE_RENEW: 'true' # DOMAINS: "localhost -> http://nginx" # STAGE: "local" volumes: - ./docker/https-portal:/var/lib/https-portal
はまったところ
そもそも起動しない
DOMAINSの設定
local開発時の設定
アセットがhttpになる(Laravel限定)
そもそも起動しない
https-portalコンテナの立ち上げに時間がかかっているかも
docker-composeのログを確認してみてください
↓のようなコメントが出ていたら少し待ってみましょう
This is going to take a long time
手癖でupのときにオプション-dを指定していると気付きづらいです
DOMAINSの設定
docker-composeのサービス名で設定してください
上の例だとnginxに流してほしいので「http://nginx」ですね!
nginxの方はdockerのネットワーク外にportを解放する必要がないので忘れずにコメントアウトしましょう
本番環境でも8080ポートでアクセスできてしまいます(笑)
local開発時の設定
STAGE: “local”を設定してあげましょう
Exampleだと記載がないのですが、Documentの少し下の方に記載があります
https://github.com/SteveLTN/https-portal#features
最初ステージを指定せずに起動しようとしてたところ
localhostじゃなくてちゃんとしたドメイン名じゃないとだめだよ!
って感じのエラーが出てました注意してください
アセットがhttpになる(Laravel限定)
nginxの設定かと思ったらLaravel側の設定です
トラフィックがロードバランサにより80番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。
/app/Http/Middleware/TrustProxies.php
protected $proxies = '*';
https://readouble.com/laravel/6.x/ja/requests.html#configuring-trusted-proxies
一応dockerネットワーク内のIPを固定化して「*」使わないって手もあります。
ですが、dockerネットワーク内での通信なのでやりませんでした。
さいごに
はまったところは全部書いたはず!
参考になれば幸いです