Proxyを作ろうnginxRaspberryPiDockerletsencryptはじめに最近スマートホームにハマってます。家電とかを外から操作できて便利ですよね。remoを操作しています。Piにおいてみることにしました。Encryptも導入してみることにします。証明書も自動更新するようにして、管理も楽にする方向でやっていきます。今回はこんな構成で話を進めていきます。Composeを使いながらセットアップしていきます。当然のことながらRaspbianのセットアップは済ませておいてください。ここでは記事の範囲を超えるので詳しい説明は省きます。Composeのインストールまず下記コマンドを実行してRaspbianにDockerをインストールします。Composeもインストールしてしまいましょう。リポジトリから入るバージョンは少し古いのですが、実用上特に問題になることはないはずです。向けにビルドされたDockerコンテナを動かすことはできません。そもそものこと、いつも使っているnginxイメージですら動かないわけです。Pi用にビルドされたイメージを使います。nginx-proxyの代わりにrpi-docker-nginx-proxyを、docker-letsencrypt-nginx-proxy-companionの代わりにrpi-docker-letsencrypt-nginx-proxy-companionをそれぞれ利用します。docker-compose.ymlひとまずdocker-compose.yml全体をお見せして、細かいところを解説していきます。いうことでご覧ください。Proxy部分を説明していきます。特徴的なところだけかいつまんでいきましょう。HTTP/HTTPS通信を外から受けるため、ここだけ80番と443番のポートを外側にバインドしておきます。証明書などの各種ファイルを読み書きするため、3つほどボリュームをマウントしておきます。証明書が入っているcertsボリュームは、こちら側のコンテナからは安全のため読み込み専用にしておきます。docker.sockはproxy対象のコンテナが建ったときに勝手に設定を追加してもらうために読み込み専用でマウントしておきましょう。ここで利用するボリュームはvolumesセクションに定義しておくことを忘れないでください。最後にlabelsを設定します。Encryptを自動取得するコンテナ側からこのコンテナを識別するために使います。記法が見慣れない感じなのですが、キーにラベル名を、値に空文字列を設定することで有効化されます。Encrypt側のコンテナもかいつまんで説明していきましょう。こちらも同じようなボリュームをマウントしていますが、certsだけは書き込む必要があるのでrwを指定しています。ここだけ注意してください。/var/run/docker.sock:/var/run/docker.sock:roプロキシされるコンテナプロキシされるWebサービスはあくまでサンプルなのでここは各自の環境に置き換えてほしいのですが、ざっくりと解説していきます。ポイントとなるのは5つの環境変数です。Encrypt用の環境変数です。VIRTUAL_HOSTにはこのコンテナに割り当てたいドメインを指定します。事前にお使いのドメインに対してサブドメインを生やしておいて、DNSを設定しておいてください。VIRTUAL_PORTにはポートフォワーディング先のポート番号を記入します。ここでは仮に80としましたが、例えば5000番ポートで動いているアプリがある場合はそのように変更することを忘れないでください。LETSENCRYPT_HOSTにはTLS証明書を発行する対象となるドメインを指定します。通常はVIRTUAL_HOSTと同じで良いでしょう。LETSENCRYPT_EMAILに各種確認メールを送信する先のメールアドレスを指定するのも忘れないでください。SSL_POLICYにはどのようなTLSプリセットを用いるかを指定できます。デフォルトはMozilla-Intermediateに設定されていますが、今回はMozilla-Modernに設定することでTLSv1.2の利用を強制し、よりセキュアにしています。古い環境からは接続できなくなりますので注意してください。"Mozilla-Modern"起動あとはコンテナ群を起動すれば自動的に証明書を取得して繋がるように設定してくれます。Encryptを使ったプロキシの設定ができてしまいました。x86_64環境と全く同じとまではいきませんが、それなりに簡単に構築できたかと思います。自動的に証明書の更新もかけてくれるのでコンテナが起動してさえいれば更新忘れなどもありません。upLoginユーザーは見つかりませんでした。