ひさふぃの日記

DjangoとPythonとLaravelが好き。大阪でフリーランスエンジニアやってます。

【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ネットワーク内での通信なのでやりませんでした。

さいごに

はまったところは全部書いたはず!
参考になれば幸いです