Playing with Duplicity backup and restore tool and Amazon S3

Duplicity is a python command line tool for encrypted bandwidth-efficient backup.

In their creator words: “Duplicity  incrementally  backs  up  files  and directory by encrypting tar-format volumes with GnuPG and uploading them to a remote (or local) file server.  Currently local, ftp, sftp/scp, rsync, WebDAV, WebDAVs, Google Docs, HSi and Amazon S3 backends  are  available.   Because  duplicity  uses librsync,  the  incremental  archives  are  space  efficient  and only record the parts of files that have changed since the last backup.  Currently duplicity supports deleted files, full Unix permissions, directories, symbolic links, fifos, etc., but not hard links.

My brief description: a free and open source tool for doing full and incremental backup and restore from linux to local or almost any remote target, compressed and encrypted. A charm for any sys admin.

In order to explain how Duplicity works for backup and restore. I’m going to show how to do a backup of a folder called “sample_data” to an Amazon S3 bucket called “alfresco-backup” and a folder called “test” inside my bucket (use your own bucket name) the bucket and folder has been created by me before running any command but could be created by duplicity first time we run the command. If you want to let Duplicity create your own Amazon S3 bucket and you are located in Europe, please read the Duplicity man page.

Note: please not get confused with my bucket name “alfresco-backup”, use your own bucket name. I will use this bucket name also in future articles 😉

How to install Duplicity in Ubuntu:

# sudo apt-get install duplicity

Create a gpg key and remember the passphrase because will be required by Duplicity, defaults values works good. Your backup will be encrypted with the passphrase, all files created by command below will be on your Linux home/.gnupg but you won’t need that at all:

# gpg –gen-key

Create required system variables (you can also use them with an script):

# export PASSPHRASE=yoursupersecretpassphrase


To perform a backup with the Duplicity command (the easy and simple command):

# duplicity sample-data/ s3+http://alfresco-backup/test

If you get errors, some dependencies for Python and S3 support are required, try installing librsync1 and next python libraries python-gobject-2, boto and dbus.

The command output should be something like this:

Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
No signatures found, switching to full backup.
————–[ Backup Statistics ]————–
StartTime 1368207483.83 (Fri May 10 19:38:03 2013)
EndTime 1368207483.86 (Fri May 10 19:38:03 2013)
ElapsedTime 0.02 (0.02 seconds)
SourceFiles 5
SourceFileSize 1915485 (1.83 MB)
NewFiles 5
NewFileSize 1915485 (1.83 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 5
RawDeltaSize 1907293 (1.82 MB)
TotalDestinationSizeChange 5543 (5.41 KB)
Errors 0

This will create 3 files in your S3 bucket:

  • duplicity-full-signatures.20130510T160711Z.sigtar.gpg
  • duplicity-full.20130510T160711Z.manifest.gpg
  • duplicity-full.20130510T160711Z.vol1.difftar.gpg

All files are stored with the GNU tar format and encrypted, “duplicity-full” means that was first backup, in next backups you will see “duplicity-inc” in different volumes.

  • sigtar.gpg file contains files signatures then Duplicity will know what file has changed and do the incremental backup
  • manifest.gpg contains all files backed up and a SHA1 hash of each one
  • volume files (vol1 to volN depending of your backup size) will contains data files, a volume file use to be up to 25MB each one, this is for improve performance doing backup and restoration.

For more information about file format look at here:

# duplicity –full-if-older-than 30D sample-data s3+http://alfresco-backup/test

Verify if there are changes between last backup and your local files:

# duplicity verify s3+http://alfresco-backup/test sample-data
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri May 10 19:38:03 2013
Difference found: File . has mtime Fri May 10 19:39:05 2013, expected Fri May 10 19:34:53 2013
Difference found: File file1.txt has mtime Fri May 10 19:39:05 2013, expected Fri May 10 18:25:36 2013
Verify complete: 5 files compared, 2 differences found.

In last example we can see that a fine called file1.txt has changed and also the root directory “.” date,

List files backed up in S3:

# duplicity list-current-files s3+http://alfresco-backup/test
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri May 10 18:32:59 2013
Fri May 10 19:34:53 2013 .
Fri May 10 18:25:36 2013 file1.txt
Fri May 10 18:54:31 2013 file2.txt
Fri May 10 19:35:03 2013 mydir
Fri May 10 19:35:03 2013 mydir/file3.txt

You can see 3 files and 2 directories, in the statistics report duplicity counts any directory as file.


Duplicity can also manage the restore process but it will never override any existing file, the you can restore to a different location or remove your corrupted or old data if you want to restore in the original place. If duplicity successfully completes the restore it is not going to show any output.

How to restore last full backup:

# duplicity s3+http://alfresco-backup/test restore-dir/

How to restore a single file:

# duplicity –file-to-restore mydir/file3.txt s3+http://alfresco-backup/test restore-dir/file3.txt

How to restore entire backup in a given date:

# duplicity -t 2D s3+http://alfresco-backup/test restore-dir/

this will restore full backup of  2 days ago (see -t options, seconds, minutes, hours, months, etc may be used)

How to restore a single file in a given date:

If you are looking for a file with a content but you don’t know what version of the file you have to recover, you can try restoring different file versions in the backup:

# duplicity -t 2D –file-to-restore file1.txt s3+http://alfresco-backup/test file1.txt.2D
# duplicity -t 30D –file-to-restore file1.txt s3+http://alfresco-backup/test file1.txt.30D

Note, you have to specify a different file name for local restoration, remember that duplicity never overrides existing content.

Delete older backups:

# duplicity remove-older-than 1Y s3+http://alfresco-backup/test –force

also you can use for example 6M (six months), 30D (30 days) or 60m (60 minutes).

To see more information when you are running a duplicity command can use the vervosity flag -v [1-9] but also can see all logs here /root/.cache/duplicity/[directory with unique ID]/duplicity-full.YYYMMDDT182930Z.manifest.part

When you are finished playing with Duplicity and Amazon S3 remember to clean your passphrase and Amazon keys from the variables:


In next posts I will show  how to use Duplicity to have a perfect backup and restore policy of Alfresco.

OpenDJ (LDAP Server) and how to configure with Alfresco for your best demos

OpenDJ is a fork of the former Sun OpenDS. Is a free and Open Source LDAPv3 server. It is not under our Alfresco Supported Platforms umbrella but it works fine for demo porpuses and is very easy to install, configure and maintain. Since OpenDJ is a Java application you can run it in Linux, Mac or “even” Windows 😉

Lets see how how to start with OpenDJ from scratch.

  • Installation and configuration of OpenDJ:

Download the application downloader and launcher here: (you may also download the entire package from here  but I think with QuickSetup is the easier way)

Download this initial LDIF file with demo users and groups for the first population of our new brand LDAP server.

You must have installed Java in your system in order to execute file QuickSetup.jnlp. Then double click to open it. And follow as in the video:

Now lets configure our Alfresco Server (I did all this steps with Alfresco Enterprise 4.1.3 but should be valid for any 4.X version).

  •  Alfresco configuration:

# vi tomcat/shared/classes/

Add next line with our new authentication system before the default chain.


Create the needed directory for our new settings:

# mkdir -p tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1

Create your own config file, set as your needs:

vi tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1/


ldap.authentication.defaultAdministratorUserNames=\=Directory Manager

To have a full control about what is happening during the LDAP authentication add next lines to your custome log configuration file like next one. If you don’t have a custom log file already you can create it:

cp tomcat/webapps/alfresco/WEB-INF/classes/ tomcat/shared/classes/alfresco/extension/

Add next options to the file:

vi tomcat/shared/classes/alfresco/extension/



Now reboot and try. Also you can do that easily and without reboot using JMX with console

Remember to keep watching your logs:

tail -f tomcat/logs/catalina.out

When Alfresco is starting after our changes, you must see something like this:

2013-03-07 09:46:26,175  INFO  [management.subsystems.ChildApplicationContextFactory] [main] Starting ‘Authentication’ subsystem, ID: [Authentication, managed, ldap1]
2013-03-07 09:46:26,212  WARN  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server supports anonymous bind ldap://localhost:1389
2013-03-07 09:46:26,234  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not support simple string user ids and invalid credentials at ldap://localhost:1389
2013-03-07 09:46:26,235  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not fall back to anonymous bind for a simple dn and password at ldap://localhost:1389
2013-03-07 09:46:26,237  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not fall back to anonymous bind for known principal and invalid credentials at ldap://localhost:1389
2013-03-07 09:46:26,247  INFO  [management.subsystems.ChildApplicationContextFactory] [main] Startup of ‘Authentication’ subsystem, ID: [Authentication, managed, ldap1] complete

And after your first login:

2013-03-07 09:47:34,404  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] Authenticating user "toni"
2013-03-07 09:47:34,421  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] Setting the current user to "toni"
2013-03-07 09:47:34,422  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] User "toni" authenticated successfully

Remember to change your LDAP log debug level before going live, something like INFO could be enough.

Instalación de Alfresco con MySQL en Linux desde la linea de comandos

En este artículo os voy a mostrar el procedimiento para instalar Alfresco Enterprise 4.1.1 o Community en un servidor Linux 64bits usando el instalador (bundle) desde la linea de comandos (si no tenemos interfaz gráfica instalada en nuestro servidor), y como hacerlo con MySQL 5.1 en lugar de Postgresql (que viene por defecto en el instalador). Usaré Alfresco Enterprise 4.1.1 pero todos los comandos son igualmente válidos para Community;

Descargar el instalador de Alfresco (Enterprise o Community):

Enterprise de este enlace:

Community de este otro: alfresco-community-4.2.b-installer-linux-x64.bin

También descargamos el driver de conexión JDBC con MySQL de este enlace:

Creamos un usuario con el que correrá el servidor de aplicaciones (Tomcat), por ejemplo, un usuario llamado “alfresco”:

# useradd alfresco

Asignamos una contraseña al usuario alfresco:

# passwd alfresco
Changing password for user alfresco.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

Antes de seguir, comprueba que tienes correctamente configurado el fichero de hosts del servidor (/etc/hosts), algo así:

[bash]   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 servidor

Creamos el directorio donde vas a instalar Alfresco y damos permisos al usuario que acabamos de crear (ponle el nombre y versión si quieres), por ejemplo yo usaré:

# mkdir /opt/alfresco-enterprise-4.1.1
# chown alfresco.alfresco /opt/alfresco-enterprise-4.1.1

Accedemos con ese usuario o vamos desde root:

# su – alfresco

Tras tener el paquete y el conector con mysql descargados, vamos a empezar la instalación:

Si el paquete no estuviese ejecutable puedes hacerlo con el siguiente comando:

$ chmod +x alfresco-*-installer-linux-x64.bin

Ejecutamos el instalador y seguimos los pasos como se indica a continuación, fíjate bien en las opciones que elijo, cambia el nombre de base de datos, usuario y contraseña en tu caso, también ojo a los cambios al usar MySQL:

$ ./alfresco-enterprise-4.1.1-installer-linux-x64.bin
Language Selection

Please select the installation language
[1] English – English
[2] French – Français
[3] Spanish – Español
[4] Italian – Italiano
[5] German – Deutsch
[6] Japanese – 日本語
[7] Dutch – Nederlands
[8] Russian – Русский
[9] Simplified Chinese – 简体中文
Please choose an option [1] : 3
Bienvenido a la instalación de Alfresco Enterprise.

Tipo de instalación

[1] Fácil: instala los servidores con la configuración por defecto
[2] Avanzada: Configura las propiedades de servicio y los puertos de servidor.: También puede elegir componentes opcionales para instalar.
Por favor seleccione una opción [1] : 2

Seleccione los componentes que desea instalar; desmarque aquellos que no desea.

Java [Y/n] :Y

PostgreSQL [Y/n] :n

Alfresco : Y (Cannot be edited)

SharePoint [Y/n] :Y

Web Quick Start [y/N] : N

OpenOffice [Y/n] :Y

¿Es correcta la selección que se muestra aqui arriba? [Y/n]: Y

Carpeta de instalación

Por favor, elija una carpeta para instalar Alfresco Enterprise

Seleccionar una carpeta [/home/alfresco/alfresco-4.1.1]: /opt/alfresco-enterprise-4.1.1

Configuración de la base de datos

URL de JDBC: [jdbc:postgresql://localhost/alfresco]: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8

Controlador JDBC: [org.postgresql.Driver]:

Nombre de la base de datos: [alfresco]: alfresco

Nombre de usuario: []: alfresco

Contraseña: :
Verificar: :
Configuración de puerto Tomcat

Por favor, introduzca los parámetros de configuración de Tomcat que desea

Dominio de Servidor Web: []:

Puerto del servidor Tomcat: [8080]:

Puerto de cierre de Tomcat: [8005]:

Puerto SSL de Tomcat [8443]:

Puerto AJP de Tomcat: [8009]:

Puerto FTP de Alfresco

Por favor, elija un número de puerto para usar para el servidor FTP integrado de

Puerto: [2121]:

Puerto RMI de Alfresco

Por favor, elija un número de puerto que utilizará Alfresco para ejecutar
comandos remotos.

Puerto: [50500]:

Contraseña de admin

Por favor, especifique una contraseña a utilizar para la cuenta de administrador
de Alfresco.

Contraseña de admin: :
Repita la contraseña: :
Puerto de SharePoint en Alfresco

Por favor, elija un número de puerto para el protocolo SharePoint.

Puerto: [7070]:

Puerto de servidor OpenOffice

Por favor, introduzca el puerto en el que el Servidor de OpenOffice va a
escuchar por defecto.

Puerto de servidor OpenOffice [8100]:

El programa está listo para iniciar la instalación de Alfresco Enterprise en su

¿Desea continuar? [Y/n]: Y

Por favor espere mientras se instala Alfresco Enterprise en su ordenador.

0% ______________ 50% ______________ 100%

El programa terminó la instalación de Alfresco Enterprise en su ordenador.

Ver el archivo Léeme [Y/n]: n

Lanzar Alfresco Enterprise Share [Y/n]: n

Como ves en el asistente, no arrancamos ya que nos quedan algunas tareas por acometer todavía.

Fijate sobre todo en las líneas:
PostgreSQL [Y/n] :n
URL de JDBC: [jdbc:postgresql://localhost/alfresco]: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8
Controlador JDBC: [org.postgresql.Driver]:
Nombre de la base de datos: [alfresco]: alfresco
Nombre de usuario: []: alfresco

Cambia mysql://localhost/alfresco por la IP o nombre del servidor MySQL y alfresco por el nombre de la base de datos.

Copia el jar con el conector JDBC de MySQL al siguiente directorio:

$ cp mysql-connector-java-5.1.18-bin.jar /opt/alfresco-enterprise-4.1.1/tomcat/lib/

Antes de arrancar el servidor de aplicaciones, en el servidor MySQL, que ya debería estar instalado y levantado, ya sea en local o en un servidor separado hay que crear la base de datos y dar los permisos:

# mysql -u root -p
Enter password:

mysql> create database alfresco;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on alfresco.* to alfresco@localhost identified by ‘alfresco’;
Query OK, 0 rows affected (0.00 sec)

Hecho lo anterior podrías proceder a hacer algunos cambios en la configuración, pero también puedes hacerlo una vez levantado el servidor (e ir reiniciando con cada cambio si usas Community o sin necesidad de reiniciar si usas Enterprise y la consola de administración).

Arrancamos el servidor:

$ cd /opt/alfresco-enterprise-4.1.1/
$ ./ start
Using CATALINA_BASE: /opt/alfresco-enterprise-4.1.1/tomcat
Using CATALINA_HOME: /opt/alfresco-enterprise-4.1.1/tomcat
Using CATALINA_TMPDIR: /opt/alfresco-enterprise-4.1.1/tomcat/temp
Using JRE_HOME: /opt/alfresco-enterprise-4.1.1/java
Using CLASSPATH: /opt/alfresco-enterprise-4.1.1/tomcat/bin/bootstrap.jar
Using CATALINA_PID: /opt/alfresco-enterprise-4.1.1/tomcat/temp/
/opt/alfresco-enterprise-4.1.1/tomcat/scripts/ : tomcat started

Podemos ver los logs con el siguiente comando:

$ tail -f tomcat/logs/catalina.out

Deberíamos ver lineas que nos indican que se va poblando la base de datos, también que se crean los índices de SORL.
Recuerda que verás el siguiente error en el log:

ERROR [org.alfresco.fileserver] [CIFS Server] [SMB] Server error

Al iniciar con un usuario no root, Alfresco no puede levantar el subsistema CIFS ya que no puede usar un puerto por debajo del 1024. Para resolverlo (aunque deberás redireccionar los puertos puedes cambiar la configuración de los puertos de CIFS añadiendo los siguientes parámetros en en el fichero de configuración: tomcat/shared/classes/


Cuando en el log veas la línea:

INFO: Server startup in 104835 ms

Significa que está arrancado y ya puedes acceder a Alfresco Share mediante http://localhost:8080/share o el nombre de servidor que tengas y a Alfresco Explorer con http://localhost:8080/alfresco. Por FTP, recuerda que se usa el puerto 2121 por defecto (si no haces redirección con IPTables). Por Webdav sería con la URL: http://localhost:8080/alfresco/webdav.

Interactúa con Alfresco desde la línea de comandos (con curl)

Si eres de los que te sientes más cómodo usando una shell de Linux o Unix que el ratón, creo que este artículo te va a gustar.

Algunas veces necesitamos chequear algún dato concreto o realizar alguna tarea específica en Alfresco. La posibilidad de interactuar con Alfresco desde la línea de comandos (desde una shell) nos permite automatizar algunas tareas mediante scripts o sacarle mucho más partido a la aplicación para hacer diferentes tipos de tareas.

Vamos a ver qué podemos hacer con el comando “curl”. Recuerda que en los siguientes ejemplos donde aparece “localhost” deberás poner la IP o nombre del servidor así como usuario y contraseña, algunos comandos solo funcionan si el usuario tiene permisos de administrador en el repositorio:

Extraer el identificador del repositorio, muy útil para desarrollos o configurar la replicación:

curl -u usuario:contraseña "http://localhost:8080/alfresco/s/cmis" | grep repositoryId|perl -pi -e "s/.*>(.*)<.*/\1/"

Subir ficheros usando diferentes protocolos, en estos ejemplos el fichero.doc está en el mismo directorio local desde donde lanzamos el comando:

FTP a un sitio concreto (versión 4.0 que no hay que indicar sites en la URL ya que mapea directamente a sites cualquier acceso FTP):

curl -u usuario:contraseña -T fichero.doc "ftp://localhost/Alfresco/nombre-corto-del-sitio/documentLibrary/"

Webdav (HTTP) a un sitio concreto (versión 4.0 que no hay que indicar sites en la URL ya que mapea directamente a sites cualquier acceso webdav):

curl -u usuario:contraseña -T fichero.doc "http://localhost:8080/alfresco/webdav/nombre-corto-del-sitio/documentLibrary/"

Subir un fichero atacando a la API (HTTP):

curl -v -X POST -F [email protected] -F siteid=nombre-corto-del-sitio -F containerid=documentLibrary -F uploaddirectory=/directorio-dentro-del-sitio http://usuario:contraseña@localhost:8080/alfresco/service/api/upload

Por ejemplo, si queremos crear (subir) unos cuantos contenidos podríamos usar este pequeño script lanzado desde la shell de linux directamente:

for i in `seq 1 300`
> do
> echo "uploading file $i"
> touch file$i.txt
> curl -u usuario:contraseña -T file$i.txt "http://localhost:8080/alfresco/webdav/ficheros-personales/documentLibrary/"> done

El script/comando anterior creará en local 300 ficheros txt vacíos con el nombre file1.txt hasta file300.txt y los irá subiendo a Alfresco mediante webdav. También podemos hacerlo mediante la API, por FTP, etc.

En el blog de Cesar Capillas podemos ver otros scripts invocando estos comandos para hacer subidas.

Otra forma de hacer llamadas a Alfresco es mediante los webscripts, incluyendo los webscripts CMIS, podemos ver un listado de todos los disponibles por grupos aquí http://localhost:8080/alfresco/service/index o incluso un listado completo aquí http://localhost:8080/alfresco/service/index/uri/

Para obtener un ticket de sesión podríamos usar el siguiente comando:

curl "http://localhost:8080/alfresco/service/api/login?u=usuario&pw=contraseña"|grep ticket|perl -pi -e "s/.*>(.*)<.*/\1/"

Ver el estado de las auditorías (activadas o desactivadas):

curl -X GET "http://usuario:contraseña@localhost:8080/alfresco/service/api/audit/control"

Ver (si están activadas las auditorías) los logins fallidos:

curl -u usuario:contraseña "http://localhost:8080/alfresco/service/api/audit/query/AuditExampleLogin1/auditexamplelogin1/login/error/user?verbose=true"

Ver algunos datos concretos del repositorio:

curl -X POST "http://usuario:contraseña@localhost:8080/alfresco/service/api/admin/usage"
"lastUpdate" : 1342542164417,
"users" : 6,
"documents" : 545,
"licenseMode" : "ENTERPRISE",
"readOnly" : false,
"updated" : true,
"licenseValidUntil" : null,
"level" : 0,
"warnings": [],
"errors": []

Sacar un listado de los sites:

curl -X GET "http://usuario:contraseña@localhost:8080/alfresco/service/api/sites"

Consultar la versión de Alfresco:

curl -X GET "http://usuario:contraseña@localhost:8080/alfresco/service/api/server"

Exportar un sitio con info de miembros, grupos y contenidos (fichero ZIP con varios ACP en su interior):

curl -X GET "http://usuario:contraseña@localhost:8080/alfresco/service/api/sites/nombre-corto-del-sitio/export" >

Ver todos los tipos mime y transformaciones soportadas por Alfresco:

curl -X GET "http://usuario:contraseña@localhost:8080/alfresco/service/mimetypes?mimetype={mimetype?}"

Crear un sitio:

curl -u usuario:contraseña -H ‘Content-Type: application/json’ -d "{‘title’:’site$i’,’visibility’:’PUBLIC’,’description’:”,’sitePreset’:’site-dashboard’,’shortName’:’site$i’}" "http://localhost:8080/alfresco/s/api/sites"

Si conoces otros usos útiles con curl no dudes en ponerlos en los comentarios.

Monitorización de Alfresco con New Relic

New Relic es un sistema de monitorización en la nube, pero no es el típico servicio de monitorización remota de puertos o disponibilidad de aplicaciones, New Relic puede ser complementario a estos sistemas ya que monitoriza los recursos del servidor o servidores de turno de forma automática, sin casi ninguna configuración (sólo la instalación del agente) y permite controlar aplicaciones web de todo tipo (Java, PHP, Ruby, .Net, Python, etc.), carga de páginas, respuesta de la web, operaciones de la JVM, de SOLR, etc. A nivel de servidor podemos monitorizar los procesos, red, discos, etc. Además de fijar umbrales para el envío de alertas. La lista completa de características están aquí, no te las pierdas. Recuerda que ya hablé por aquí de cómo monitorizar otros aspectos de Alfresco con Nagios/Icinga y generar gráficas.

Antes de seguir estos pasos puedes registrarte en la web de New Relic, tienen diferentes tipos de cuentas en función de los servicios que queramos, hay una gratuita que es la que he usado para probar mi monitorización del servidor Alfresco que tengo para pruebas.

Por lo tanto, a continuación os voy a contar como instalar el agente para monitorizar un servidor, en mi caso en un servidor Linux (Redhat/Centos) instalando el agente mediante RPM y también como monitorizar Alfresco instalando el agente java en la aplicación. Si quieres saber como instalarlo en otros sistemas operativos o aplicaciones tienes muy buena información paso a paso aquí:

Descargamos e instalamos la información del repo rpm de New Relic que nos permitirá instalar posteriormente el rpm del paquete para monitorizar el servidor:

rpm -Uvh

Ahora instalamos el paquete de monitorización:

yum install newrelic-sysmond

Añadimos a la configuración la llave de la licencia:

nrsysmond-config –set license_key=que está en tu perfil de la web de New Relic

Arrancamos el servicio:

/etc/init.d/newrelic-sysmond start

Podemos ver el log aquí:

tail -f /var/log/newrelic/nrsysmond.log

La configuración se encuentra en /etc/newrelic/nrsysmond.cfg

Con el siguiente comando activamos el servicio en el arranque del servidor (para RedHat/Centos/Fedora):

chkconfig newrelic-sysmond on

Hecho esto puedes ir a tu Dashboard en la web de New Relic ( y en la pestaña “Servers” ver el servidor que empieza a dibujar gráficas como las siguientes:

Pincha en la imagen para verla a tamaño completo

Recuerda que para que esto ocurra, el servidor debe tener acceso a internet para poder enviar los datos a los servidores de New Relic.

Ahora vamos a monitorizar la aplicación Alfresco. Desde la web de ayuda de New Relic se puede descargar el agente para cada lenguaje de programación, una vez descargado sube el fichero al servidor, vamos a ver como instalarlo para Tomcat (del bundle que viene en el paquete de Alfresco por ejemplo):

Descomprimimos el agente Java:

unzip /root/

Nos vamos al directorio donde se encuentra el servidor de aplicaciones, en mi caso de Alfresco Enterprise pero es igual de válido para Community:

cd /opt/alfresco-enterprise-4.0.0/tomcat/

Instalamos el agente java en Alfresco, recuerda ejecutar este comando desde dentro del directorio de Tomcat, para otros servidores mira la ayuda:

# /opt/alfresco-enterprise-4.0.0/java/bin/java -jar /root/newrelic/newrelic.jar install

may 18, 2012 12:50:24 PM NewRelic INFO: Agent is using Log4j

***** ( ( o)) New Relic Java Agent Installer

***** Installing version 2.5.0 …

Backed up start script to /opt/alfresco-enterprise-4.0.0/tomcat/bin/

Added agent switch to start script /opt/alfresco-enterprise-4.0.0/tomcat/bin/

No need to create New Relic configuration file because:

.:. A config file already exists: /opt/alfresco-enterprise-4.0.0/tomcat/newrelic/newrelic.yml

***** Install successful

***** Next steps:

You’re almost done! To see performance data for your app:

.:. Restart your app server

.:. Exercise your app

.:. Log into

Within two minutes, your app should show up, ready to monitor and troubleshoot.

If app data doesn’t appear, check newrelic/logs/newrelic_agent.log for errors.

Lee bien lo que te muestra la salida del comando de instalación, debes reiniciar el servidor de aplicaciones, luego vamos a y en unos minutos empezaremos a ver información muy útil sobre Alfresco en la pestaña “Applications” como se ve a continuación:

Pincha en la imagen para verla a tamaño completo

Si quieres ir un poco más allá con la monitorización de Alfresco, concretamente de Share puedes ver este interesantísimo artículo de Jan Pfitzner.

Indexación múltiple y unificada con Constellio (y conexión con Alfresco por CMIS)

De entre los muchos sistemas de indexación que existen para las empresas está Constellio, un producto realizado por la gente de Doculibre y basado en Apache Solr. Constellio es Open Source y se puede contratar soporte con el fabricante dependiendo de las necesidades del cliente. Es una herramienta multiplataforma, instalación bastante sencilla con un asistente (java -jar constellio_install_1.3.jar).

Lo que me ha gustado de Constellio, y por eso he decidido contarlo en este post, es lo sencillo que resulta unificar/federar las búsquedas corporativas en un solo sistema, en una sola web.
  • Por ejemplo, imagina que tenemos uno o varios servidores Alfresco, un portal corporativo, un servidor de ficheros en Windows, un LDAP corporativo y una BBDD de clientes, todos esos sistemas tienen información que deben tener acceso rápido y sencillo los usuarios de nuestra organización (como si buscaran en Google). Con este producto podemos tenerlo todo unificado en un solo formulario de búsqueda, ahora bien, debe acceder a todos esos recursos y poder indexarlos en sus propios índices (recuerda que al fin y al cabo es un Solr), tiene una interfaz web de administrador bastante sencilla y auto-explicativa.
  • A cada uno de los contenedores de datos que queremos indexar (Alfresco u otros ECM, BBDD, LDAP, Servidor de Ficheros, etc.) Constellio los llama colecciones y podemos añadir tantos como necesitemos, viendo en el resultado de la búsqueda los resultados de todas las colecciones y pudiendo identificar visualmente de qué colección es cada resultado.
  • Configurar Constellio es muy fácil y en esta web tienes vídeos de como hacer casi cualquier cosa, en 10 minutos está configurado.
  • Os voy a explicar como crear una colección que indexe el contenido de Alfresco de forma externa en Constellio (recuerda que también se sigue indexando en Alfresco).
  • Una vez instalado Constellio, vamos al panel de administración accediendo como usuario administrador (tras hacer login como usuario admin) en la URL por defecto: http://localhost:8080/constellio
  • Ahora vamos a la pestaña “Collections management” -> “Add collection” -> ponemos un nombre por ejemplo “Alfresco Intranet” y el título que queramos. -> “Save”.
  • Pinchamos en la nueva colección llamada “Alfresco Intranet” y vamos a la sección “Connectors” -> “Add”.
  • Aquí os pongo una captura de como se configura Constellio para que indexe un repositorio Alfresco (o varios Alfrescos también se podrían configurar), como veis se hace mediante CMIS por lo que nos aporta mayor interoperabilidad con Alfresco o con cualquier otro repositorio CMIS ready.

    Configuración Constellio - Alfresco
    Pincha para ver la imagen completa
  • Tras guardar la configuración podemos ir a la sección “Indexing” del menú de la colección y veremos en tiempo real el estado de la reindexación de la nueva conexión que hemos creado.
  • Es tan fácil que casi no hay que explicar nada, sólo decir que el valor del parámetro “REPOSITORY” es el identificador único del repositorio CMIS y que podréis ver en vuestro servidor en la siguiente URL http://localhost:8080/alfresco/service/cmis/index.html -> “CMIS Repository Information” -> “Repository Id”.
  • La interfaz de usuario sería algo como esto:

    resultado de búsqueda
    Pincha para ver la imagen completa
  • En la captura anterior se ve el resultado de una búsqueda realizada sobre dos colecciones una es este blog y otra es un servidor Alfresco.
Esto es sólo un pequeño resumen de como conectarlo con Alfresco pero verás que tiene conectores muy útiles (HTTP, CMIS, BBDD, Servidor de Ficheros, LDAP, IMAP, POP, SOLR, XML y otros conectores específicos como Google Search Appliance u otros ECM propietarios). También se puede configurar a nivel de seguridad para filtrar resultados de búsquedas, integrar con sistemas de SSO externos, estadísticas, sinónimos, búsqueda avanzada, themes, facetas y otras muchas funcionalidades más.
  • Conclusión: si no unificas tus búsquedas es porque no quieres 😉

Video y presentación del webinar “Consejos de Seguridad con Alfresco”

Cuanta más información almacenamos en Alfresco, más necesidad de protegerla tenemos y también más necesidad de disponer de la misma. Por eso pienso que este webinar puede ser muy interesante para cualquiera que debe mantener un entorno con Alfresco independientemente de la criticidad del mismo.

En este webinar de unos 50 minutos de duración vamos a ver qué aspectos relacionados con la seguridad debemos tener en cuenta en los diferentes procesos del ciclo de un proyecto con Alfresco como durante la planificación, instalación, configuración y fortificación así como en el mantenimiento, monitorización y auditoría.

Básicamente, este webinar es una colección de consejos y trucos que nos ayudan a fortificar y controlar nuestro entorno ECM.

Aquí está la presentación utilizada para poder descargarla desde la web de Slideshare:

Seguridad en las comunicaciones de Alfresco

En este artículo quiero hablar sobre las comunicaciones en Alfresco. Como buenos administradores debemos saber qué puertos utiliza la aplicación de entrada (tráfico inbound: servicios que publica Alfresco) y de salida (tráfico outbound: servicios externos a los que accede Alfresco). De esa forma podemos configurar apropiadamente el firewall local del servidor y también el firewall perimetral de la organización. Otro aspecto a tener en cuenta es la seguridad de los servicios que publicamos, las comunicaciones tipo cliente-servidor y entre capas de una instalación, es decir, la posibilidad de cifrar el tráfico de los servicios que publicamos y de los servicios que se usan entre las capas o entre nodos en caso de cluster.

Listado de puertos, servicios y origen/destino del tráfico

  • En el listado siguiente podemos ver puertos de servicio que se usan o se pueden usar en Alfresco. Posiblemente veréis alguno más de los que pensábais, cuento con que tenemos Alfresco Repository (alfresco.war) y Alfresco Share (share.war) desplegado en el mismo servidor de aplicaciones y la base de datos, LDAP y almacenamiento en servidores remotos, aunque como sabéis, estos servidores también podrían estar en local en caso de desarrollo o pruebas. Todos estos puertos son los que se establecen por defecto, y como veremos, algunos no están activados por defecto:
Protocolo Puerto TCP/UDP IN/OUT Activo Comentarios
HTTP 8080 TCP IN Si Incluye WebDav
FTP 21 TCP IN Si Modo pasivo
CIFS 137,138 UDP IN Si
CIFS 139,445 TCP IN Si
Share Point  Protocol 7070 TCP IN Si
Tomcat Admin 8005 TCP IN Si
Tomcat AJP 8009 TCP IN Si
SOLR admin 8443 TCP IN Si Hay que instalar cert en navegador
NFS 111,2049 TCP/UDP IN No
Lotus Quickr 6060 TCP IN No
RMI 50500-50507 TCP IN Si Usado por EHCache entre nodos de cluster y para gestión JMX
JGroups 7800 TCP IN No Cluster discovery entre nodos
JGroups 7801-7802 TCP IN No Comunicación Ehcache RMI entre nodos de cluster
OpenOffice 8100 TCP IN Si Sólo en localhost, no hay que abrirlo
  • Como hemos visto, los puertos indicados anteriormente son todos los que podría utilizar Alfresco en una instalación con todas las funcionalidades activadas y en cluster, en una instalación para producción deberemos arrancar el servidor de aplicaciones con un usuario no privilegiado (en caso de Linux), por lo tanto no podremos levantar los puertos por debajo del 1024, deberemos cambiarlos en la configuración para que sean por encima del puerto 1024 y posteriormente hacer una redirección con el firewall local. Aquí podéis ver un ejemplo.
  • Para controlar el tráfico de salida, es decir, la actividad que genera o sistemas a los que se conecta nuestro servidor, deberíamos crear reglas para controlar el tráfico. En muchos casos no sería necesario limitar la información de salida, pero si quieres realmente controlar todo lo que sale del sistema y tus requisitos de seguridad son elevados, controlar el tráfico de salida es vital:
Protocolo Puerto TCP/UDP IN/OUT Activo Comentarios
SMTP 25 TCP OUT No Configurado hacia tu MTA. Usado para enviar notificaciones.
DB – PostgreSQL 5432 TCP OUT Si* Depende de la BBDD usada
DB – MySQL 3306 TCP OUT Si* Depende de la BBDD usada
DB – MS SQL Server 1433 TCP OUT Si* Depende de la BBDD usada
DB – Oracle 1521 TCP OUT Si* Depende de la BBDD usada
DB – DB2 50000 TCP OUT Si* Depende de la BBDD usada
LDAP 396 TCP OUT No Hay que activar autenticación/sincronización
LDAPS 636 TCP OUT No Hay que activar autenticación/sincronización 443 TCP OUT No
OpenOffice 8100 TCP OUT No Sólo si se usa OpenOffice externo
JGroups 7800-7802 TCP OUT No Entre nodos del cluster
NFS 111,2049 TCP/UDP OUT No Sólo si se usa un almacenamiento NFS remoto para contentstore
Kerberos 88 TCP/UDP OUT No Sólo si tenemos SSO con Kerberos
DNS 53 UDP OUT Si Si queremos que el servidor resuelva nombre
  • Seguro que hay otros puertos de salida a tener en cuenta, he destacado los necesarios para que funcione el servidor. Por ejemplo, habría que permitir el tráfico a servicios remotos de Facebook, Twitter, LinkedIn, Slideshare, Youtube, Flickr o Blogs, en caso de usar el Publishing Framework. En este caso, y dado que los puertos de salida comentados en el listado anterior pueden variar, lo más rápido sería abrir hacia internet todo el tráfico del servidor, capturar el tráfico y analizarlo. Hecho eso podremos abrir realmente el tráfico saliente que necesitamos. Claro, todo ese control de tráfico de salida habría que hacerlo si estás muy obsesionado con la seguridad, ahí tienes ideas.
  • Si usas autenticación externa, contra un LDAP, procura usar la conexión segura LDAPS (puerto 636 TCP).
  • Otro aspecto a tener en cuenta son las personalizaciones que utilizan o consumen información de otros servidores remotos, como es lógico, no está contemplado en el listado anterior.
  • Tampoco está contemplado en las tablas de arriba otros puertos y tráfico saliente con destino a servidores remotos en caso de usar Transfer/Replication Services de Alfresco, FSR (Alfresco File System Receiver), Liferay, Drupal, etc. En el caso del Replication Service es muy recomendable usar HTTPS y no realizar las transferencias con el usuario admin.
  • Recuerda: tener un firewall (o cuatro firewalls) bien configurado no es sinónimo de seguridad, es sólo un proceso continuo más que debemos llevar a cabo para controlar lo que ocurre en nuestras redes y en nuestros servidores.

Cifrado de la información:

Si no usamos cifrado en las comunicaciones, las contraseñas y los contenidos viajan en sin cifrar, por lo que esa información podría ser interceptada y usada sin nuestro consentimiento, con el grave perjuicio que eso conlleva.

Y de los servicios que publica Alfresco ¿cuales puedo hacer seguros? Vamos a ver los más importantes de cara al usuario y dónde consultar para aprender a configurarlos apropiadamente:

  • HTTP -> HTTPS:

De esta forma cifraríamos la comunicación (http y webdav) entre el navegador del usuario hasta Alfresco o hasta el frontal web que proteja al servidor de aplicaciones.

Para hacer seguro el acceso web a Alfresco Share, Explorer y webdav, podríamos hacerlo de tres formas:

  1. Usando un balanceador que soporte SSL offloading, en cuyo caso no se necesita configurar nada en el servidor web o servidor de aplicaciones.
  2. Activando HTTPS en el frontal web (Apache) y conectando a Alfresco por AJP (mod_proxy_ajp) o mod_Jk, en este caso deberíamos desactivar el acceso al puerto 8080 de Alfresco para evitar accesos no cifrados y obligar a los usuarios de la red local que accedan por el frontal web. Más información sobre los conectores aquí y como activar SSL en Apache aquí aunque hay miles de recurso en Internet disponibles para configuralo.
  3. Activando HTTPS en Tomcat o en el servidor de aplicaciones que tengas, para Tomcat también hay muchos recursos disponibles, por ejemplo aquí, y en este blog (sección CONFIGURING SSL FOR ALFRESCO TOMCAT). Si Alfresco Share está en una capa por delante de Alfresco habría que hacer la tarea en el frontal de Share y opcionalmente en el repositorio y cambiar la configuración de Share para el acceso a los puertos SSL del repositorio. Este artículo te ayudará a entender como separar en capas y su configuración.

Otra recomendación interesante en este punto puede ser el uso en el frontal web del módulo de Apache mod_security, que es un Web Application Firewall que permite filtrar y eliminar cierto tráfico malicioso hacia nuestro servidor como tráfico SQL injection o XSS e infinidad de otros ataques. Aquí un buen recursos para aprender a implementarlo:

  • FTP -> FTPS:

Permitiremos a los usuarios conectar mediante FTP cifrando la autenticación y la transferencia de contenidos. Es importante que el cliente FTP soporte FTPS, algo que la gran mayoría de clientes lo tienen superado. Es muy sencilla su configuración está bien explicada en la documentación oficial.

  • SharePoint -> SharePoint SSL:

Como comenté en el correspondiente webinar, la implementación Share Point de Alfresco se hace mediante un servidor de aplicaciones embebido en Alfresco llamado Jetty, que escucha por el puerto 7070 TCP. La configuración por defecto no está cifrada, de hecho, eso hace que tengamos que “parchear” el registro de Windows de los clientes para que funcione MS Office correctamente, como vimos en el webinar, o lidiar con la solicitud de contraseña varias veces. Si activamos SSL no es necesario modificar el registro en los clientes. Además, recuerda que se usará SSL en el mismo puerto (7070 TCP) y no estará disponible la comunicación no cifrada.

Aquí se pueden ver los pasos a para su activación:


Correo saliente (notificaciones):

En este caso si hablamos de la conexión con el MTA de la organización para que Alfresco envíe notificaciones, no hay problema, podemos configurar Alfresco para que se conecte al servidor de correo remoto mediante SMTPS con autenticación y mediante TLS para cifrado. En el blog hablé de esto, puedes ver un ejemplo aquí, aunque en la versión 3.4 y superior es más sencillo, abajo vemos un ejemplo de parámetros para usado con GMail:

### Outbound mail SMTP ###
[email protected]
[email protected]

Correo entrante:

Del correo entrante también hablé aquí. Hasta la versión 4.0 no está soportado SMTP TLS en Alfresco, como puedes ver en este bug reportado en Jira. En la wiki está bien explicado como configurarlo y en también hay información útil.

  • JGroups -> JGroups SSL:

Aunque si usamos interfaces dedicadas para el tráfico entre nodos no sería necesario, JGroups soporta encriptación en el tráfico entre nodos del cluster, aunque en Alfresco no está contemplada esta opción, se podía hacer:

  • IMAP -> IMAPS:

IMAPS (993 TCP) no está soportado por Alfresco, pero se puede poner una capa por delante a modo de proxy e implementarlo. Existen varias soluciones genéricas como stunnel y algunas específicas como PerditionNginx. En este enlace se puede ver más información:

  • SOLR:

En la versión 4.0, que incorpora SOLR, la comunicación entre repositorio y motor de indexación está cifrada y la autenticación también, además es mutua. Todo ese tráfico es HTTPS. Para otro artículo dejo el uso de los keystores por defecto usados para la protección de la comunicación y acceso a SOLR, que este caso usa claves RSA y certificados x.509. Así como para el cifrado de metadatos con la nueva característica de la versión 4.0, el nuevo tipo “d:encrypted” que permite indicar que una propiedad de un nodo se puede cifrar. De cualquier forma podéis encontrar más info aquí.

Persistencia en las credenciales JMX de Alfresco

Aunque esta es una funcionalidad activada y útil sobre todo para Alfresco Enterprise, creo que es una recomendación de seguridad necesaria y a tener muy en cuenta para entornos en producción. Sobre todo si no filtras los puertos con un firewall. Además así evitarás que alguien modifique la configuración de Alfresco.
Vamos a ver cómo cambiar usuarios y contraseñas de acceso JMX por defecto que vienen en Alfresco y que no se sobreescriban cuando actualizamos la versión y siempre tengamos protegido de forma segura el acceso a la consola de configuración y monitorización de Alfresco.
La receta es muy sencilla:
  • Para ello debemos copiar los ficheros alfresco-jmxrmi.access y alfresco-jmxrmi.password que podemos encontrar por defecto en el directorio tomcat/webapps/alfresco/WEB-INF/classes/alfresco/ y los copiamos por ejemplo en tomcat/shared/classes/.
  • Una vez copiados, podemos editarlos y modificarlos a nuestro gusto, los ficheros están muy bien comentados y no dan lugar a dudas.
  • En el fichero alfresco-jmxrmi.access encontramos los nombres de usuario disponibles y el rol asignado:

monitorRole   readonly
controlRole   readwrite

  • En el fichero alfresco-jmxrmi.password podemos cambiar la contraseña de cada uno de los usuarios disponibles:

monitorRole  mi-nuevo-password1
controlRole  mi-nuevo-password2

  • Por último deberemos añadir la siguiente linea en y reiniciar el servidor de aplicaciones:


Por lo tanto, usaríamos el usuario monitorRole para monitorización (aplicaciones externas como Hyperic o Nagios) y el usuario controlRole para acceder mediante jconsole y configurar Alfresco. De eso ya hablé aquí.