Atlassian の Confluence を自宅のサーバで動かすまで その 1

Confluence という、 Atlassian の製品があります。要は Wiki のお化けみたいなドキュメント共有 Web アプリケーションで、過去に仕事で使った際にすごくよかったので、プライベートでも使っています。
今回はそれを導入するまでのお話しです。

例によって、対象読者は環境を再構築せざるを得なくなった将来の自分です。感謝しろよ、未来のじぶん。

自宅のサーバで動かすには Download Confluence Server から必要なファイルを取ってきて、デプロイします。
Linux 64 Bit を選択すると、インストーラTomcat のインストールから Confluence 用のユーザとグループの作成まで全部やってくれるのですが、Linux ディストリビューションが用意した環境から独立したアプリケーションとなるので、ちょっと気持ちが悪いです。
そこで、 TAR.GZ Archive を選択し、自分で用意した Tomcat で動かします。
必要な作業はだいたいこんな感じです。

  1. Tomcat のインストールと設定
  2. MySQL のインストールと設定
  3. Apache のインストールと設定

1. のインストールについては Apache Tomcat を見ておけばだいたい大丈夫です。あ、ディストリビューションGentoo Linux ね。
インストールが終わったら、こんな感じで 2 つインスタンスを作ります。

# /usr/share/tomcat-8/gentoo/tomcat-instance-manager.bash --create --suffix foo
# /usr/share/tomcat-8/gentoo/tomcat-instance-manager.bash --create --suffix bar

インスタンスを 2 つ作る理由は、 1 つの Tomcat に複数の Atlassian のアプリケーションをデプロイするのはサポートされていないためです。Deploying Multiple Atlassian Applications in a Single Tomcat Container にいろいろ書かれています。
ここまでできたら、先ほどダウンロードした tar.gz ファイルを展開します。

# cd /usr/share/tomcat-8/webapps
# tar xvzf atlassian-confluence-6.3.1.tar.gz
# cp -r atlassian-confluence-6.3.1 foo
# mv atlassian-confluence-6.3.1 bar

/usr/share/tomcat-8/webapps に展開するのは、なんとなくです。ディレクトリ構成から、ここが良さそうな気がしました。というか、実は LinuxTomcat を動かすのは初めてだったりします。以前の職場で Tomcat を使った開発業務をやっていたこともあるんだけど、環境構築部隊が別に居たのと、サーバが Windows Server だったので興味もなく、そもそも Java の生態系にも興味がなく、ほら、 Java ってさ、クラス名とソースファイル名が合わないとコンパイルできないけど、なんかださくない?、そもそもなんで Java なの?、なんかプロセスの起動にめっさ時間かかるし、すっごいメモリ喰うし、 Java を選ぶ理由って、人を集めやすいってのと後方互換性を頑張ってるところ?、 Write once, run anywhere とかいってたけどさ、 FreeBSD 使ってた頃は Linux エミュレーションで動かしてたし、そろそろ(略)。

展開したら、少しだけファイルを修正します。このファイルでは、 Confluence の設定ファイル群を保存するパスを設定するらしいです。

# cd /usr/share/tomcat-8/webapps
# echo 'confluence.home=/var/atlassian/application-data/foo' >> foo/confluence/WEB-INF/classes/confluence-init.properties
# echo 'confluence.home=/var/atlassian/application-data/bar' >> bar/confluence/WEB-INF/classes/confluence-init.properties

で、そのディレクトリも作っておく、と。

# mkdir -p /var/atlassian/application-data/foo
# chown tomcat:tomcat /var/atlassian/application-data/foo
# chmod 755 /var/atlassian/application-data/foo
# mkdir /var/atlassian/application-data/bar
# chown tomcat:tomcat /var/atlassian/application-data/bar
# chmod 755 /var/atlassian/application-data/bar

ここまでできたら、 /usr/share/tomcat-8/webapps/foo/conf/server.xml を元に、こうしてこうして /etc/tomcat-8-foo/server.xml をこうじゃ!。

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="kUn9w4mWiPp4t7E">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
      type="org.apache.catalina.UserDatabase"
      description="User database that can be updated and saved"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
      pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" connectionTimeout="20000" redirectPort="8443"
      maxThreads="48" minSpareThreads="10"
      enableLookups="false" acceptCount="10" debug="0" URIEncoding="UTF-8"
      protocol="org.apache.coyote.http11.Http11NioProtocol"
      proxyName="www.example.com" proxyPort="443" scheme="https" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
          resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
        <Context path="/foo" docBase="/usr/share/tomcat-8/webapps/foo/confluence" debug="0" reloadable="false" useHttpOnly="true">
          <Manager pathname="" />
          <Valve className="org.apache.catalina.valves.StuckThreadDetectionValve" threshold="60" />
        </Context>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/tomcat-8-foo"
          prefix="localhost_access_log" suffix=".txt"
          pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

この設定では、 https://www.example.com/foo で Confluence を動かすことを考慮しています。
https://www.example.com/bar 用には上記の設定を以下のように修正して、/etc/tomcat-8-bar/server.xml に設定します。

- Server 要素の port 属性の値に + 1
- Connector 要素の redirectPort 属性の値に + 1
- protocol 属性が AJP/1.3 の Connector 要素で、 port 属性の値に + 10、 redirectPort 属性の値に + 1
- Context 要素の path 属性の値を /bar、 docBase 属性の foo を bar へ
- Valve 要素の directory 属性の foo を bar へ

要は、Tomcat プロセスが使うポートとパスを独立させます。

最後に起動用のスクリプトである /etc/init.d/tomcat-8-foo を修正します。 start-stop-daemon へのオプションをこんな感じにします。

        start-stop-daemon  --start \
                --quiet --background \
                --chdir "${CATALINA_TMPDIR}" \
                --user ${CATALINA_USER}:${CATALINA_GROUP} \
                --make-pidfile --pidfile ${PIDFILE} \
                --exec ${JAVA_HOME}/bin/${cmd} \
                -- \
                        ${JAVA_OPTS} \
                        ${args} \
                        -Dcatalina.base="${CATALINA_BASE}" \
                        -Dcatalina.home="${CATALINA_HOME}" \
                        -Dsynchrony.context.path=/foo/synchrony \
                        -Dsynchrony.port=8081 \
                        -Djava.io.tmpdir="${CATALINA_TMPDIR}" \
                        -Dgentoo.classpath="${GCLASSPATH//:/,}" \
                        -classpath "${CLASSPATH}" \
                        org.apache.catalina.startup.Bootstrap \
                        ${CATALINA_OPTS} \
                        ${TOMCAT_START}

        eend $?

/etc/init.d/tomcat-8-bar には、-Dsynchrony.context.path=/bar/synchrony、-Dsynchrony.port=8091 みたいな感じになるかと。
これは、 WebSocket で使う URL の定義と Tomcat プロセスが WebSocket 用のポートを foo と bar で分けるための措置です。この辺のオプションについては、Recognized System Properties > synchrony.context.path にいろいろ書いてあります。

あとは、それぞれ Tomcat を起動して、

# /etc/init.d/tomcat-8-foo start
# /etc/init.d/tomcat-8-bar start

http://servername:8080/foo, http://servername:8090/bar で、 Confluence の設定画面が表示されれば、 Tomcat はできあがり。なんか、すっごい長いな。

まだまだ続くよ!