jueves, 17 de septiembre de 2009

Migrando Alfresco 2.9 a 3.2

Bueno este es el primero de una serie de artículos que publicaré por si a alguien se encuentra en la misma situación en un momento dado, vale destacar que los procedimientos aquí mostrados son basados en mi experiencia personal y en muchos casos dependerá de que funcionen o no en aspectos como diseños, software utilizado, etc.

En este pequeño artículo voy a redactar lo que fue mi procedimiento para actualizar un servidor Alfresco (http://www.alfresco.com) version 2.9 instalado en un servidor foo a un servidor bar con la última versión estable hasta la fecha (3.2). Ambas versiones de alfresco son las versiones gratuitas (Community Edition).

Adicionalmente, para los interesados, describiré como configurar Alfresco para que autentique contra un directorio LDAP (OpenLDAP).

Empezemos...

Lo primero, describir la situación inicial: Como ya comenté se tiene un servidor "A" bajo Debian Lenny (stable) con Alfresco 2.9 usando como base de datos a MySQL y realizando la autenticación propia que viene de forma predeterminada.

A partir de Alfresco 3.2 se han hecho una serie de cambios en el diseño del sistema, se han incorporados subsistemas para darle mayor modularidad al mismo (Ej: subsistemas de autenticación, etc) por lo que hacer un backup del Alfresco 2.9 y luego intentar restaurarlo en un 3.2 "limpio" asi sin más, no es posible.

¿Cómo hacemos?

Necesitaremos un alfresco 3 Labs para utilizarlo como intermediario. En mi caso, busqué el archivo alfresco-labs-tomcat-3c.tar.gz (es el bundle) y lo descargue (preferiblemente puedes hacer esto en una máquina bien sea física o virtual diferente a donde tienes el sistema en producción para evitar cualquier "Oops" y termines dañando todo).

Bien, estando en esa máquina y ya descargado el archivo, procedemos a descomprimirlo/desempaquetarlo

Nota: Lo siguiente es realizado como root.

bar:/# mkdir /opt/alfresco3
bar:/# tar -xzvf alfresco-labs-tomcat-3c.tar.gz
-C /opt/alfresco3


Deben asegurarnos que tengamos el paquete de Java instalado en el servidor nuevo:

bar:/# dpkg -l | grep sun-java6-jre

ii sun-java6-jre 6-12-1 Sun Java(TM) Runtime Environment (JRE) 6 (ar


En caso de que no, debemos instalarlo: aptitude install sun-java6-jre

Ahora debemos editar el archivo /opt/alfresco3/alfresco.sh para agregar la línea:

export JAVA_HOME="/usr/lib/jvm/java-6-sun-1.6.0.12"


Una vez editado el alfresco.sh debemos editar el archivo /opt/alfresco3/extras/databases/mysql/db_setup.sql de la siguiente manera:

El archivo original es este:

create database alfresco;
grant all on alfresco.* to 'alfresco'@'localhost' identified by 'alfresco' with grant option;
grant all on alfresco.* to 'alfresco'@'localhost.localdomain' identified by 'alfresco' with grant option;


Y debemos cambiarle el nombre de la base de datos que viene por defecto en vez de alfresco a alfresco3 (Esto es, para que después cuando instalemos el 3.2 este se quede con la config predeterminada). Quedaría así:

create database alfresco3;
grant all on alfresco3.* to 'alfresco'@'localhost' identified by 'alfresco' with grant option;
grant all on alfresco3.* to 'alfresco'@'localhost.localdomain' identified by 'alfresco' with grant option;


Nota: Por seguridad este password debería ser cambiado.

Luego, ejecutamos el script de la siguiente manera:

bar:/opt/alfresco3# mysql -u root -p < ./extras/databases/mysql/db_setup.sql

Ahora, a editar el archivo custom-repository.properties ubicado en /opt/alfresco3/tomcat/shared/classes/alfresco/extension

Allí deberemos cambiar:

  • La primera linea que hace referencia al parámetro dir.root para colocarle una ruta completa, quedaría: /opt/alfresco3/alf_data.
  • Comentar las lineas: db.driver=org.apache.derby.jdbc.EmbeddedDriver
    y db.url=jdbc:derby:alf_data/derby_data/alfresco;create=true
  • Descomentar las líneas: db.driver=org.gjt.mm.mysql.Driver y db.url=jdbc:mysql://localhost/alfresco
Por último, en el mismo directorio del archivo anterior, vamos a editar el archivo custom-hibernate-dialect.properties y de igual manera vamos a comentar la línea que hace referencia a Derby y a descomentar la que nombra a MySQL:
  • Linea a comentar: hibernate.dialect=org.hibernate.dialect.DerbyDialect
  • Linea a descomentar: hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
Finalmente ya el alfresco está listo para iniciarse, podemos verificar que todo está bien al ejecutar el script: cd /opt/alfresco3; ./alfresco.sh start y podemos monitorear como se levanta haciendo tail -f /opt/alfresco3/tomcat/logs/catalina.out y ver si explota algún error por allí. Si al final vemos algo como: INFO: Server startup in 63618 ms sin ningún error, Enhorabuena.


Si todo sale bien, pues ahora tendremos que migrar del 2.9 al 3.

Ahora entonces debemos respaldar desde el servidor en producción (foo) el directorio alf_data (o su equivalente en caso de que lo hayan cambiado) y la base de datos.

Desde foo, vamos a respaldar bajo el directorio /opt/alfresco/alf_data los directorios:

  • audit.contentstore
  • contentstore
  • contentstore.deleted
  • lucene-indexes

Fijense que en ningún momento se respalda el directorio backup-lucene-indexes.

Para respaldar la base de datos, recomiendo (al menos basándome en mi experiencia personal) no usar mysqlhotcopy sino mysqldump.

Ej: mysqldump --opt -u root -p alfresco > backup_alfresco.sql

Hecho esto, nos llevamos todo esto al otro servidor.

En el otro servidor, primero nos aseguramos que el alfresco esté apagado, sino hacemos: cd /opt/alfresco3; ./alfresco.sh stop (Después de esto, asegurense que el alfresco este realmente apagado).

Ahora, deberemos borrar todos los directorios que están debajo de /opt/alfresco3/alf_data. Posteriormente colocaremos allí lo que estaba en el /opt/alfresco en el otro servidor (foo).

Nos queda copiar la base de datos, para evitar problemas, en lo personal prefiero borrar la base de datos que creamos al principio (alfresco3) y volverla a crear limpia y cargarle posteriormente las tablas que nos hemos traido del servidor en producción. El procedimiento es:

bar:/# mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 311
Server version: 5.0.51a-24+lenny2 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> drop database alfresco3;
[...]
mysql> exit


Volvemos a ejecutar el script db_setup.sql para que cree de nuevo la base de datos y el usuario 'alfresco' en la db.

bar:/# mysql -u root -p < /opt/alfresco3/extras/databases/mysql/db_setup.sql
bar:/# mysql alfresco3 <>
Ya tenemos la base de datos cargada, por lo que tenemos que hacer es prender de nuevo el alfresco, y si vamos siguiendo el archivo de log catalina.out veremos que el sistema empieza a ejectar una serie de parches a la base de datos para adaptarla a la de la versión 3. De nuevo, si vemos que al final todo va bien y no nos lanza ningún error ya tenemos el alfresco migrado a la versión 3, falta ahora hacer un proceso similar para llevar de alfresco 3 al 3.2. Podemos de una vez, crear un respaldo de la base de datos de alfresco3 (que es la misma que nos trajimos del otro servidor con algunos parches aplicados) usando el mismo procedimiento anterior, por supuesto, cambiandole el nombre al archivo resultante, puede ser algo así como backup_alfresco_ready_to_use_in_32.sql o whatever you want! :-)

Para ello, nos descargamos la versión del 3.2 (en mi caso, uso el bundle): alfresco-community-tomcat-3.2.tar.gz

Nos vamos hasta /opt y creamos el directorio /opt/alfresco desempaquetamos/descomprimimos el archivo, y modificamos el archivo /opt/alfresco/alfresco.sh de la misma manera que lo hicimos al comienzo (agregando la linea de export JAVA_HOME...)

Editamos el archivo /opt/alfresco/tomcat/shared/classes/alfresco-global.properties y cambiamos la ruta relativa de ./alf_data a /opt/alfresco/alf_data

Copiamos ahora el contenido del alf_data del alfresco3 al nuevo:

cp -aRpx /opt/alfresco3/alf_data /opt/alfresco

Luego, ejecutamos el script db_setup.sql para crear la base de datos, y despues de eso importamos las tablas de la base de datos que creamos antes en el archivo (backup_alfresco_ready_to_use_in_32.sql).

Iniciamos alfresco y voila! ya tenemos Alfresco 3.2 funcionando y migrado.

Autenticando contra LDAP

Como hice mención al principio del artículo, uno de los importantes cambios a partir de la versión 3.2 de Alfresco es la inclusión de algunos subsistemas entre ellos el de autenticación (+info), y deberemos hacer uso de él para configurar la autenticación contra el servidor LDAP.

Tal y como mencionan en este blog por alguna razón si hacemos la modificación en el archivo de configuración del subsistema de autenticación directamente Alfresco no lo toma, entonces lo que tendremos que hacer sería copiar el contenido del archivo al final del archivo /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

bar:/opt/alfresco# cat ./tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/ldap/ldap-authentication.properties >> /opt/alfresco/tomcat/shared/classes/alfresco-global.properties

Hecho esto, abrimos el alfresco-global.properties para editar las opciones relativas a LDAP, los parámetros relevantes los resalto en color azul.



authentication.chain=myldap:ldap

ldap.authentication.active=true

ldap.authentication.userNameFormat=uid\=%s,ou\=People,dc\=miempresa,dc\=org

ldap.authentication.java.naming.provider.url=ldap://ldap.miempresa.org:389

ldap.authentication.java.naming.security.authentication=simple

ldap.authentication.defaultAdministratorUserNames=admin

ldap.synchronization.active=true

ldap.synchronization.java.naming.security.principal=cn\=admin,dc\=miempresa,dc\=org

ldap.synchronization.java.naming.security.credentials=secretldap

ldap.synchronization.groupSearchBase=ou\=Groups,dc\=miempresa,dc\=org

ldap.synchronization.userSearchBase=ou\=People,dc\=miempresa,dc\=org


Esto es todo, espero le sirva a alguien :-)

1 comentario:

  1. Yo tengo que realizar esto actualmente, pero yo tengo un servidor alfresco 2.2 con oracle y he de migrar a otro alfresco 3.4 con mysql.

    A la hora de actualizar a la 3.0 da errores de update de los scripts, y no acaba de funcionar, no sé si te encontraste con esto.

    ResponderEliminar