Instalando Confluence en Ubuntu 12.04 LTS

En esta entrada se instalará la herramienta colaborativa Confluence (la versión actual es la 4.2.6) de Atlassian.

La idea es acabar con un servidor a través del cual podamos acceder a Confluence a través de la URL http://nuestro-servidor/wiki/. Para ello haremos uso de Apache como servidor Web, Tomcat como servidor de aplicaciones (que viene empotrado en el paquete standalone de Confluence) y de MySQL como gestor de bases de datos para mantener la información de la Wiki.

Toda la información aquí expuesta es un resumen adaptado a las necesidades que nos hemos encontrado para instalar nuestro Confluence. En la documentación oficial de Confluence de Atlassian (por supuesto servida desde un Confluence :D) está todo explicado estupendamente en caso de que lo aquí expuesto no sea exactamente el entorno que tengáis pensado montar.

Java

Porque sin Java no hacemos nada, instalaremos la JDK con un apt-get instalaremos la JDK. En este caso es opcional, y es posible sólo con la JRE. Sin embargo, como en nuestro caso instalaremos también un servidor de integración continua, aprovecharemos e instalaremos la JDK:

sudo apt-get install openjdk-6-jdk

Si no está instalado, es un buen momento para hacerse un café porque tardará un rato dependiendo de la conexión.

Instalar MySQL

Esto la verdad es que tiene poco misterio. Se instalará a golpe de apt-get de la siguiente manera:

sudo apt-get install mysql-server

En algún momento pedirá la contraseña para el usuario root del gestor. Viene bien sabérsela, pero para Confluence crearemos un usuario propio. De esta forma no usamos a root para todo y tenemos más controlado el acceso al gestor de bases de datos en caso de que no sea la única aplicación que haga uso de éste. Para ello accederemos a la consola de MySQL de la siguiente manera:

mysql -u root -p

Una vez introducido, nos solicitará la contraseña de root. Esperemos que esta sea la última vez que la usamos (por lo menos para esto :D). Una vez dentro, crearemos la base de datos para confluence y el usuario que accederá a ésta de la siguiente manera:

CREATE DATABASE confluence CHARACTER SET UTF8;
GRANT ALL on confluence.* TO 'confluence'@'localhost' IDENTIFIED BY 'cfpass';
FLUSH PRIVILEGES;
EXIT

Y hasta aquí la instalación de MySQL.

Creación de usuario para confluence

Al igual que en en el gestor de bases de datos queremos tener parcelados a los usuarios para que accedan a sus respectivas bases de datos, en el sistema también viene bien que sea así. Por tanto crearemos un usuario para Confluence en el sistema. Para ello:

sudo useradd -s /sbin/nologin confluence

Instalación de Confluence

En nuestro caso para instalar Confluence haremos uso de la versión standalone. Para ello nos la descargaremos en el servidor con wget, lo descomprimiremos y lo pondremos en el «directorio de instalación» (en nuestro caso /usr/local/confluence):

wget http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-4.2.6.tar.gz
tar -zxvf atlassian-confluence-4.2.6.tar.gz
sudo mv atlassian-confluence-4.2.6 /usr/local/confluence
sudo chown -R confluence /usr/local/confluence/
sudo chgrp -R confluence /usr/local/confluence/

Ahora habrá que configurar el «directorio de trabajo» donde Confluence ficheros de configuración, locks y temporales (entre otros artefactos). Esto se en el fichero confluence-init.properties que en el caso del ejemplo se encuentra en la ruta /usr/local/confluence/confluence/WEB-INF/classes/confluence-init.properties. Nosotros estableceremos la ruta /var/confluence como directorio de trabajo y por tanto añadiremos la siguiente línea al fichero de configuración:

confluence.home=/var/confluence

Y crearemos el directorio al que hacemos referencia:

sudo mkdir /var/confluence
sudo chown -R confluence /var/confluence
sudo chgrp -R confluence /var/confluence

Por último cambiaremos tanto el contexto en el que se despliega la aplicación como el puerto en el que escucha (nos vendrá bien para más adelante). Para ello habrá que modificar el fichero /usr/local/confluence/conf/server.xml y modificar las líneas pertinentes. En nuestro caso desplegaremos la aplicación en el contexto /confluence escuchando por el puerto 9090. Para ello habrá que modificar el atributo port del elemento Server (para que no entre en conflicto con otros posibles servidores que tengamos en el servidor), el elemento port del elemento Connector y el atributo path del elemento Context. Pongo un fragmento del código (desde el comienzo del fichero hasta la modificación del contexto, que es la última) para que se vea cómo ha quedado después de la modificación:

<server port="9000" shutdown="SHUTDOWN" debug="0">
  <service name="Tomcat-Standalone">
      <connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="9090" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="20000" useURIValidationHack="false" URIEncoding="UTF-8"/>
      <engine name="Standalone" defaultHost="localhost" debug="0">
        <host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="false">
          <context path="/confluence" docBase="../confluence" debug="0" reloadable="false" useHttpOnly="true">
      ...

Y hasta aquí la configuración de Confluence propiamente dicha. Sin embargo, como queremos que Confluence se arranque cada vez que se arranca la máquina, añadiremos el script de arranque /etc/init.d/confluence con el siguiente contenido:

#!/bin/sh -e
# Confluence startup script

APP=confluence
USER=confluence
CATALINA_HOME=/usr/local/confluence
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64

case "$1" in
  start)
    echo "Starting $APP"
    sudo /bin/su -m $USER -c "$CATALINA_HOME/bin/startup.sh &amp;> /dev/null"
    ;;
  stop)
    echo "Stopping $APP"
    sudo /bin/su -m $USER -c "$CATALINA_HOME/bin/shutdown.sh &amp;> /dev/null"
    echo "$APP stopped successfully"
    ;;
  restart)
    $0 stop
    sleep 5
    $0 start
    ;;
  *)
    echo "Usage: sudo service $APP {start|restart|stop}"
    exit 1
    ;;
esac

exit 0

Para arrancarlo basta con hacerlo ejecutable y lanzar el script de arranque como cualquier otro script.

sudo chmod u+x /etc/init.d/confluence
sudo service confluence start

Para instalarlo en el arrranque, con el siguiente comando se instala en todos los runlevels:

sudo update-rc.d confluence defaults

Si todo ha ido bien, en http://localhost:9090/confluence deberá aparecer la siguiente pantalla que indica que Confluence está arrancado y necesita la activación para continuar.

Nosotros le introduciremos nuestra clave y seleccionaremos la opción «Product installation». La siguiente pantalla (no la pongo) da a elegir entre base de datos empotrada o base de datos externa. Nosotros que molamos más que los Peta Zetas vamos a usar una base de datos externa de MySQL seleccionando dicha opción en el desplegable. Una vez hecho esto llegaremos a la siguiente pantalla donde elegiremos conectarnos vía JDBC. Una vez hecho esto nos aparecerá la pantalla de configuración

Configuración de la base de datos

Ojo con la cadena de conexión porque si usamos MySQL y queremos usar «non-latin characters» hay que añadir sí o sí el trozo useUnicode=true&characterEncoding=utf8. También en la cadena de conexión se encuentra el nombre de la base de datos, así que si la hemos llamado de otra forma distinta a confluence habrá que modificar la cadena con el nuevo nombre. Una vez le demos a continuar se crearán todas las tablas (tardará un rato) y nos dará a elegir distintas opciones que no merece la pena contar aquí. A partir de este punto tenemos nuestro Confluence instalado y funcionando. Ahora sólo nos queda configurar Apache para servir confluence a través del contexto /confluence.

Configuración de Apache

Configuraremos apache a través del módulo mod_proxy. Para ello instalaremos el módulo con apt-get.

sudo apt-get install libapache2-mod-proxy-html
sudo a2enmod proxy_html
sudo a2enmod proxy_http

Una vez instalado, crearemos un nuevo fichero para el sitio de confluence en los sitios de apache (en nuestro caso se encuentra en /etc/apache2/sites-available) con el siguiente contenido:


  Order deny,allow
  Allow from all

 
ProxyRequests       Off
ProxyPreserveHost On
ProxyPass           /confluence       http://localhost:9090/confluence
ProxyPassReverse    /confluence       http://localhost:9090/confluence

Por último habrá que activar el sitio para que apache lo reconozca y reiniciar apache. Para ello, un par de comandos:

sudo a2ensite confluence
sudo service apache2 restart

Ya debería estar instalado y funcionando en http://localhost/confluence.

Sin embargo, por lo menos en mi caso y seguramente a todo el que use la versión de 64 bits de Ubuntu Server, puede que nos dé un error de librerías. Esto es debido a que en la versión de 64 bits la librería libxml2.so.2 no está en /usr/lib sino que (después de un rato buscándola) resulta que está en /usr/lib/x86_64-linux-gnu/ (vaya por dios :D). Así que la solución en este caso es editar el fichero /etc/apache2/mods-available/proxy_html.load y cambiar la línea donde se hace referencia a la librería por la nueva, es decir, de:

LoadFile /usr/lib/libxml2.so.2
LoadModule proxy_html_module /usr/lib/apache2/modules/mod_proxy_html.so

a:

LoadFile /usr/lib/x86_64-linux-gnu/libxml2.so.2
LoadModule proxy_html_module /usr/lib/apache2/modules/mod_proxy_html.so

Para concluir

Como bonus track de todo esto está el hecho de que otras aplicaciones como Jira o Bamboo siguen el mismo patrón de instalación, y por tanto pueden instalarse con la misma guía casi cambiando únicamente el nombre. Bueno, es cierto que también habría que cambiar puertos y contextos, pero la caso es que es fácilmente reproducible.

Cualquier mejora a este proceso es bienvenida :D. Que paséis un feliz fin de semana!.