Dockerリバースプロキシ環境にRAINLOOPをインストール

複数のメールアカウントを一元管理できる機能性と洗練されたUIで評判のオープンソースWebメーラーRAINLOOPをDocker環境に導入します。Docker環境は前回作成したリバースプロキシのバックエンドです。今回はhttps通信をリバースプロキシする設定を追加します。内部向けのサーバなので証明書は自己証明書としています。URL全体にBASIC認証とIPアドレスによるアクセス制限をかけて不正アクセスを防ぎます。
参考にrainloopのデモ画面をリンクします。なんだか梅雨の季節にマッチしている模様です。

1.リバースプロキシ構成

RAINLOOPサービスコンテナは前回作成したDockerリバースプロキシコンテナをフロントとして「common_network」に参加しバックエンドを構成します。

【イメージ図】

【Docker-Compose構成】

rainloopディレクトリにdocker-compose.ymlで構成するコンテナを配置します。

2.Docker-Composeの構成
(1)リバースプロキシ用のYMLファイル

以下で示す設定を追加します。

NO キー 説明
1 ports 443:443 httpsを外部からコンテナに受け渡す設定。
2 volumes /etc/docker-compose.d/certs:/etc/nginx/certs:ro nginx-proxyがhttps通信定義をNginxの設定ファイルに追加する際に使用する証明書保存ディレクトリ設定。※1
3 volumes ./server.conf:/etc/nginx/conf.d/server.conf Nginxの追加設定用。

※1:ホストの「/etc/docker-compose.d/certs」に、バーチャルホスト名.crt・バーチャルホスト名.keyの命名規則でSSL証明書を配置するとnginx-proxyはコンテナ内のマウントディレクトリ「/etc/nginx/certs」を参照し自動的にSSL証明書キーとして使用します。

(2)RAINLOOPサービス用のYMLファイル

新規追加するRAINLOOP用の設定です。今回はmysqlDBを使用しないので、nginxとphp及びデータボリュームの3コンテナ構成です。複数コンテナ連携については当Blogの関連記事も参考にしてください。

Docker-Composeでnginx,php,mysqlの3コンテナを連携する

・nginxコンテナキーの説明

NO キー 説明
1 volumes ./nginx/server.conf:/etc/nginx/conf.d/server.conf 追加のNGINXサーバ用設定
2 volumes – /etc/docker-compose.d/.htpasswd:/etc/nginx/.htpasswd BASIC認証用のキーを参照する設定
3 VIRTUAL_HOST hog3.dip.jp nginx-proxyが振り分け時に使用する設定
4 networks name: common_link nginx-proxyと同じネットワークブリッジに参加
(3)フォルダ権限管理

当サイトの記事「Dockerコンテナ・ホスト間のフォルダ権限管理を改善」と同様の設定をRainLoopサービスにも適用します。具体的には、ホストでUID:1000のNginx_Dockerユーザーを作成しRainloopインストールフォルダのオーナーを当ユーザーに変更します。nginxとphp7コンテナにUID:1000のユーザ―を作成しこのユーザーでnginxとphp-fpmを起動させるようにします。上記手順はDockerファイルに記載されますが、Dockerファイルの詳細設定内容はリンク先の記事を参考にしてください。

3.SSL証明書/BASIC認証パスワードファイルの作成
(1)SSL証明書ファイル作成

Dockerホスト側で証明書を作成します。以下、nginx-proxyで指定しているフォルダを作成しそこに有効期限10年の証明書を配置します。

(2)SSL証明書ファイル名の変更

作成した証明書を確認し、命名規約に合わせてリネームします。。

(3)BASIC認証キーの作成

Dockerホスト(CentOS7.3)にhttpd-toolsをインストールします。

以下の通りYMLファイル内で指定されているマウントディレクトリにパスワードファイルを保存します。

4.Nginxサーバ設定ファイルの修正
(1)Nginx-ProxyのServer.confファイル

エラーページでnginxバージョンを出力しない設定と転送時圧縮設定を追加しています。

(2)RAINLOOPのServer.confファイル

2行目がエラーページでnginxバージョンを出力しない設定です。

6行目が「set_real_ip_from 172.16.0.0/12;」とnginx-proxyのIPアドレスを指定しています。このアドレスを除いてX-Forwarded-Forから接続元のIPをセットしてくれるようです。

7行目「real_ip_header X-Forwarded-For;」で接続元IPを設定しています。

15行目、16行目がBASIC認証用の設定。パスワードファイルはdocker-compos.ymlで定義したマウントファイル「/etc/docker-compose.d/.htpasswd」を参照します。

17行目,18行目でアクセス元IPアドレスによるアクセス許可をしています。19行目で許可されなかったIPからの接続を拒否しています。

5.RAINLOOPのインストール
(1)インストール

お待たせしました。やっとRAINLOOPをインストールします。インストールは最新ファイル一式をrainloopリポジトリよりダウンロードして配置するだけです。以下の通りとても簡単です。webルートディレクトリに移動してダウンロードします。

RAINLOOPが書き込みできるようにwebルートのオーナーをnginxとphp-fpmの実行ユーザーである「nginx_docker」に変更します。当初は、「 chmod -R 777 ../」としていましたがコンテナホスト間のフォルダ管理正式対応版であるこちらの記事をアップしましたのでそちらに合わせます。

(2)動作確認

以下のURLにアクセスします。自己証明書警告画面→次にBASIC認証画面が表示され認証完了後にログイン画面が表示されれば成功です。

https://hoge3.dip.jp/           ←各自のインストール環境で確認

インストール後のrainloop設定手順は次ページを参照してください。

6.参考にさせて頂いたサイト

PHP製WEBMAIL「rainloop」はUIがキレイさん – Qiita

Webメーラー RAINLOOPをインストール
無料webメーラーRAINLOOPを自宅サーバにインストール | 自宅サーバの整理箱

nginx リバースプロキシ時にアクセス元のIPアドレスを取得する方法

ありがとうございます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする