複数のメールアカウントを一元管理できる機能性と洗練されたUIで評判のオープンソースWebメーラーRAINLOOPをDocker環境に導入します。Docker環境は前回作成したリバースプロキシのバックエンドです。今回はhttps通信をリバースプロキシする設定を追加します。内部向けのサーバなので証明書は自己証明書としています。URL全体にBASIC認証とIPアドレスによるアクセス制限をかけて不正アクセスを防ぎます。
参考にrainloopのデモ画面をリンクします。なんだか梅雨の季節にマッチしている模様です。
目次
1.リバースプロキシ構成
RAINLOOPサービスコンテナは前回作成したDockerリバースプロキシコンテナをフロントとして「common_network」に参加しバックエンドを構成します。
【イメージ図】
【Docker-Compose構成】
rainloopディレクトリにdocker-compose.ymlで構成するコンテナを配置します。
1 2 3 4 5 6 |
├─rvproxy ←リバースプロキシ用 │ docker-compose.yml ←httpsの設定を追加 省略 │ └─rainloop ←RAINLOOPサービス用 docker-compose.yml ←新規追加 |
2.Docker-Composeの構成
(1)リバースプロキシ用のYMLファイル
以下←で示す設定を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
version: '2' services: proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" - "443:443" ←追加 volumes: - /etc/docker-compose.d/certs:/etc/nginx/certs:ro ←追加 - ./server.conf:/etc/nginx/conf.d/server.conf ←追加 - /var/run/docker.sock:/tmp/docker.sock:ro logging: driver: syslog restart: always networks: default: external: name: common_link |
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コンテナを連携する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
version: '2' services: wwwdata: image: busybox volumes: - ./data/www:/var/www/html nginx: build: ./nginx links: - php7 volumes: - ./nginx/server.conf:/etc/nginx/conf.d/server.conf ←追加設定 - /etc/docker-compose.d/.htpasswd:/etc/nginx/.htpasswd ←BASIC認証用 - /etc/localtime:/etc/localtime:ro volumes_from: - wwwdata environment: VIRTUAL_HOST: hog3.dip.jp ←nginx-proxy用の設定 restart: always logging: driver: syslog php7: build: ./php7 container_name: rain_php7 ←コンテナ名を固定 volumes: - ./php7/php.ini:/usr/local/etc/php/php.ini - ./php7/www.conf:/usr/local/etc/php-fpm.d/zzz-www.conf ←フォルダ権限管理用の設定 - /etc/localtime:/etc/localtime:ro volumes_from: - wwwdata logging: driver: syslog networks: default: external: name: common_link ←ネットワークブリッジに参加 |
・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年の証明書を配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# mkdir /etc/docker-compose.d # mkdir /etc/docker-compose.d/certs # cd /etc/docker-compose.d/certs # openssl req -new -x509 -days 3650 -nodes -out rainlp.crt -keyout rainlp.key yout rainlp.key Generating a 2048 bit RSA private key writing new private key to 'rainlp.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP ← JPと入力 State or Province Name (full name) []: ← ブランク入力 Locality Name (eg, city) [Default City]: ← ブランク入力 Organization Name (eg, company) [Default Company Ltd]: ← ブランク入力 Organizational Unit Name (eg, section) []: ← ブランク入力 Common Name (eg, your name or your server's hostname) []:XXX ← hoge3.dip.jpを入力 Email Address []: ← ブランク入力 |
(2)SSL証明書ファイル名の変更
作成した証明書を確認し、命名規約に合わせてリネームします。。
1 2 3 4 5 6 7 |
# ls -la 合計 8 drwxr-xr-x. 2 root root 42 6月 4 11:05 . drwxr-xr-x. 3 root root 19 6月 4 10:40 .. -rw-r--r--. 1 root root 1704 6月 4 11:05 rainlp.key ←秘密キー -rw-r--r--. 1 root root 1302 6月 4 11:05 rainlp.crt ←中間証明書 # mv rainlp.* hoge3.dip.jp.* ←命名規約に変更 |
(3)BASIC認証キーの作成
Dockerホスト(CentOS7.3)にhttpd-toolsをインストールします。
1 |
# yum install httpd-tools |
以下の通りYMLファイル内で指定されているマウントディレクトリにパスワードファイルを保存します。
1 2 3 |
# cd /etc/docker-compose.d/ # htpasswd -c .htpasswd XXXXXXXX ←ユーザー名 ZZZZXXXXYYY ←パスワード |
4.Nginxサーバ設定ファイルの修正
(1)Nginx-ProxyのServer.confファイル
エラーページでnginxバージョンを出力しない設定と転送時圧縮設定を追加しています。
1 2 3 |
# vi rvproxy/server.conf gzip on; server_tokens off; |
(2)RAINLOOPのServer.confファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# vi rainlp/nginx/server.conf server_tokens off; server { listen 80 default; server_name hoge3.dip.jp; set_real_ip_from 172.16.0.0/12; ←接続元IP取得設定(リバースプロキシのIPを指定) real_ip_header X-Forwarded-For; ←接続元IP取得設定 root /var/www/html; index index.php index.html index.htm; charset utf-8; client_max_body_size 100m; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { auth_basic "Restricted"; ←BASIC認証 auth_basic_user_file /etc/nginx/.htpasswd; ←パスワードファイルパス allow 127.0.0.1; ←IPアクセス許可 allow 192.168.1.0/24; ←IPアクセス許可 deny all; ←IPアクセス制限 try_files $uri $uri/ /index.php$is_args$args; } location ~* \.(gif|jpg|png|ico|css|js)${ access_log off; } location ~ \.php$ { fastcgi_pass rain_php7:9000; ←container_nameで指定したコンテナ名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
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ルートディレクトリに移動してダウンロードします。
1 2 3 4 |
# cd rainlp/data/www # wget http://www.rainloop.net/repository/webmail/rainloop-community-latest.zip # unzip rainloop-community-latest.zip # chown -R nginx_docker:nginx_docker ../ ←ディレクトリオーナーを共通ユーザ―に変更 |
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アドレスを取得する方法
ありがとうございます。