Confluence という、 Atlassian の製品があります。要は Wiki のお化けみたいなドキュメント共有 Web アプリケーションで、過去に仕事で使った際にすごくよかったので、プライベートでも使っています。
今回はそれを導入するまでのお話しです。
例によって、対象読者は環境を再構築せざるを得なくなった将来の自分です。感謝しろよ、未来のじぶん。
自宅のサーバで動かすには Download Confluence Server から必要なファイルを取ってきて、デプロイします。
Linux 64 Bit を選択すると、インストーラが Tomcat のインストールから Confluence 用のユーザとグループの作成まで全部やってくれるのですが、Linux ディストリビューションが用意した環境から独立したアプリケーションとなるので、ちょっと気持ちが悪いです。
そこで、 TAR.GZ Archive を選択し、自分で用意した Tomcat で動かします。
必要な作業はだいたいこんな感じです。
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 に展開するのは、なんとなくです。ディレクトリ構成から、ここが良さそうな気がしました。というか、実は Linux で Tomcat を動かすのは初めてだったりします。以前の職場で 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 "%r" %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 はできあがり。なんか、すっごい長いな。
まだまだ続くよ!