Aipoはスケジュール管理やチャットなど多様な機能を搭載したグループウェアで、クラウド版は月額400円/人〜ですが、オープンソース版はLinux系OSやWindowsに無料でインストールできます。

今回、社内でAipoを使いたいがコストを抑えるためにAmazon EC2上にオープンソース版をインストールして欲しいという依頼を受けたのですが、インストールスクリプトを実行するだけでPostgreSQLの設定などを自動で行ってくれるため、インストール自体は非常に簡単でした。

ただここで、社内情報を扱う以上はSSL化したいと思いました。証明書取得のためにコストをかけたくないのと、何より更新の自動化ができるので、Let’s Encryptの証明書を使いたいのですが、Aipo自体がWebサーバーとして立ち上がる(実体はtomcat)のと、ソースは極力いじりたくなかったので、以下の3通りの方針を検討しました。

  1. 一旦止めてcertbot –standoalone
  2. nginxでリバースプロキシしてcertbot –webroot(ダメだった)
  3. Apacheでリバースプロキシしてcertbot –webroot(採用)

1.の方法は最初からあまり考えていなかったのですが、certbot renew時に–pre-hookと–post-hookを設定してあげれば案外悪くないかもしれませんね。ただ、BASIC認証をつけたり

さて、2.の方法ですが、Aipo8のnginx設定 | hacknoteを参考にSSLに対応するようアレンジし設定が終わった後表示してみたところ、画像やCSSが読み込まれない状態になりました。

ソースを見ると以下のようになっていました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<base href="https://example.com:80/"></base><!-- ここがおかしい -->
...

この問題(仕様?)はAipoのコミュニティにも投稿されていました。

別サーバーのリバースプロキシでSSL処理して使用したいが・・・|無料グループウェア「アイポ」

コミュニティを見るとProxyPassにhttpではなくajpを使えば解決するみたいですが、nginxでajpを使うにはnginxのソースにモジュールを追加しコンパイルする必要があるためちょっと使いづらく、最終的にApacheを使う3.の方法に落ち着きました。

Aipo8 と Apache の連携方法 | hacknoteを参考にして、以下のように設定しました。

Amazon Linux AMI release 2016.09

Apache 2.4.23 (Amazon)

Aipo 8.1.1.0

# /usr/local/aipo/にインストール前提
DocumentRoot "/usr/local/aipo/tomcat/webapps/ROOT/"

ProxyPass /themes/ !
ProxyPass /javascript/ !
ProxyPass /images/ !
ProxyPass /.well-known/ ! # Let's Encrypt用に追加

ProxyPass /push/ ajp://localhost:8009/push/ retry=1 timeout=660000 keepalive=Off
ProxyPass / ajp://localhost:8009/ retry=1 keepalive=Off
ProxyPassReverse / ajp://localhost:8009/

ProxyPreserveHost on

<Directory "/usr/local/aipo/tomcat/webapps/ROOT">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

ここまで設定して、

certbot –webroot -w /usr/local/aipo/tomcat/webapps/ROOT/ -d example.com

で証明書を取得します。ssl.confの設定などは省略します。

Aipoのバージョンアップによって改善されるかもしれませんが、しばらくこれで様子を見てみます。