Instalar Odoo en Ubuntu 16.04

Toda empresa necesita apoyarse en herramientas que den cobertura a sus necesidades de negocio. Existen en el mercado multitud de sistemas de información que cubren esta necesidad. Los llamados ERP ayudan a la gestión de las actividades de ventas, entregas, pagos, producción, administración de inventarios, contabilidad, recursos humanos , etc.

En nuestro caso, necesitábamos una herramienta para gestionar ventas, selección, contabilidad y facturación. Entre las muchas opciones existentes, nos decantamos por Odoo (aquí su página oficial), que es quizá el software para negocios más instalado en el mundo, con más de 2 millones de usuarios. Nació en el 2004 como Tiny ERP, posteriormente OpenERP y desde 2013 se presenta con su actual nombre.

Odoo tiene tres versiones distintas: Enterprise, Online SaaS y Community version. Esta última es la que nos resulta especialmente interesante, se trata de una aplicación plenamente OpenSource. Es una suite que consta de 34 aplicaciones principales creadas por Odoo, pero que además tiene más de 5,500 aplicaciones desarrolladas por su muy activa comunidad y que dan cobertura a la mayor parte de las necesidades de cualquier negocio. Y con la ventaja de que, al ser modular, puedes instalarte sólo aquello que necesites.

A continuación detallo los pasos que seguimos para su instalación en un servidor con Ubuntu 16.04.

Prerrequisitos

Antes de instalar Odoo realizamos los siguientes pasos:

  1. Actualizar el sistema
    sudo apt update && sudo apt upgrade
  2. Si no tenemos instalado ninguno, instalaremos un servidor web. En nuestro caso, Apache:
    sudo apt-get install apache2
  3. Hay que configurar el firewall para dejar abierto, tanto para acceso ssh como tcp, el puerto utilizado por defecto por Odoo (8069). Este puerto puede personalizarse (aunque no es recomendable configurarlo en el puerto 80, el utilizado por Apache), pero en nuestro caso será el que utilicemos. Lo habilitamos en UFW:
    sudo ufw allow ssh
    sudo ufw allow 8069/tcp
    sudo ufw enable
  4. Odoo está desarrollado en Python. Instalamos sus dependencias:
    sudo apt-get install python-dateutil python-docutils python-feedparser python-jinja2 python-ldap python-libxslt1 python-lxml python-mako python-mock python-openid python-psycopg2 python-psutil python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-unittest2 python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi poppler-utils python-pip python-pypdf python-passlib python-decorator gcc python-dev mc bzr python-setuptools python-markupsafe python-reportlab-accel python-zsi python-yaml python-argparse python-openssl python-egenix-mxdatetime python-usb python-serial lptools make python-pydot python-psutil python-paramiko poppler-utils python-pdftools antiword python-requests python-xlsxwriter python-suds python-psycogreen python-ofxparse python-gevent
  5. La base de datos que utiliza Odoo es PostgreSql. La instalamos y creamos un usuario (en nuestro ejemplo, ‘odoo’):
    sudo apt-get install postgresql
    su -- postgres
    createuser odoo
  6. Ahora creamos el directorio donde vamos a instalar Odoo (en nuestro caso, /opt/odoo):
    sudo mkdir /opt/odoo
  7. Creamos el usuario y grupo ‘odoo’ en nuestro sistema:
    sudo adduser --system --home=/opt/odoo --group odoo

Instalación de Odoo

  1. Clonamos los ficheros de Odoo en la ubicación elegida (en nuestro caso, /opt/odoo/):
    sudo git clone https://www.github.com/odoo/odoo --depth 1 --branch 10.0 --single-branch /opt/odoo
  2. Instalamos las dependencias necesarias para las App de Odoo. Wkhtmltopdf, necesario para la generación de informes en PDF, así como NPM y su paquete less:
    wget http://download.gna.org/wkhtmltopdf/0.12/0.12.1/wkhtmltox-0.12.1_linux-trusty-amd64.deb
    sudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb
    sudo cp /usr/local/bin/wkhtmltopdf /usr/bin
    sudo cp /usr/local/bin/wkhtmltoimage /usr/bin
    sudo apt-get -yq install npm
    sudo ln -s /usr/bin/nodejs /usr/bin/node
    sudo npm install -g less less-plugin-clean-css
  3. Instalar las dependencias de Python (si la ruta donde instalaste Odoo es diferente, tienes que cambiar /opt/odoo/odoo-10.0 por tu ruta personalizada):
    sudo pip install -r /opt/odoo/odoo-10.0/doc/requirements.txt
    sudo pip install -r /opt/odoo/odoo-10.0/requirements.txt

Configuración

  1. Copiar el fichero de configuración que viene de ejemplo a una ubicación más conveniente. Si utilizaste una ruta personalizada, tienes que sustituir ‘/opt/odoo/odoo-10.0’ por la tuya propia:
    sudo cp /opt/odoo/odoo-10.0/debian/odoo.conf /etc/odoo.conf
  2. Modificar el fichero de configuración con tus propios datos:
    [options]
    admin_passwd = tupasswordpersonalizadoyfuerte
    db_host = False
    db_port = False
    db_user = odoo
    db_password = False
    addons_path = /opt/odoo/odoo-10.0/addons (modificar si instalaste en otra ruta)
    xmlrpc_port = 8069
    logfile = /var/log/odoo/odoo.log
    log_level = error
    SECURITY_EMAIL_SENDER = ‘tu@mail.com’

Configurar Odoo como servicio

  1. Creamos un fichero llamado odoo.service en /etc/systemd/system, con un contenido como este (de nuevo, si utilizaste rutas diferentes en la instalación, tendrás que personalizarlas aquí):
    [Unit]
    Description=Odoo
    Documentation=http://www.odoo.com/
    [Service]
    # Ubuntu/Debian convention:
    Type=simple
    User=odoo
    ExecStart=/opt/odoo/odoo-10.0/odoo-bin -c /etc/odoo.conf[Install]
    WantedBy=default.target
  2. Cambia propietario y permisos del fichero de configuración para que lo lance el usuario que hemos creado (‘odoo’) :
    sudo chown odoo: /etc/odoo.conf
    sudo chmod 640 /etc/odoo.conf
  3. Arrancamos el servicio:
    sudo systemctl start odoo.service
  4. Comprobamos que funciona:
    sudo systemctl status odoo.service
  5. Si todo está bien, habilitamos el servicio, con lo que se iniciará cada vez que arranque el sistema:
    sudo systemctl enable odoo.service

Configuración de Apache

  1. Para poder acceder a Odoo desde tu propio dominio y sin necesidad de añadir el puerto 8069 en la URL, configuramos un Proxy Reverso en Apache. Primero, habilitamos los siguientes módulos:
    sudo a2enmod proxy
    sudo a2enmod proxy_http
  2. Creamos un archivo de configuración para tu dominio:
    sudo gedit /etc/apache2/sites-available/tu-dominio.com.conf
  3. Añadimos el siguiente contenido:
    <VirtualHost *:80>
    ServerName tu-dominio.com
    ServerAlias www.tu-dominio.com
    ProxyRequests Off
    <Proxy *>
    Order deny,allow
    Allow from all
    </Proxy>
    ProxyPass / http://tu-dominio.com:8069/
    ProxyPassReverse / http://tu-dominio.com:8069/
    <Location />
    Order allow,deny
    Allow from all
    </Location>
    </VirtualHost>
  4. Una vez guardado el contenido del fichero de configuración, lo habilitamos:
    sudo a2ensite tu-dominio.com.conf
  5. Reiniciamos Apache:
    sudo service apache2 restart

Iniciando Odoo

  1. Si todo ha ido bien hasta ahora, ya podemos acceder a Odoo simplemente introduciendo en un navegador la direccón de nuestro dominio:
    http://tu-dominio.com
  2. Debe aparecer una pantalla como la siguiente:
  3. Sólo debemos proporcionar el nombre de la base de datos que creamos en un paso anterior, nuestro e-mail y el password. Con esto ya está Odoo completamente instalado y funcional… ahora sólo queda (pero eso ya no es objeto de este post) instalar los módulos deseados, así como configurar e implementar los procesos de nuestra empresa.

Cambiando la ubicación de los contenidos multimedia en Plex

Paso a paso para no perder la indexación de los contenidos multimedia

Migrar contenido multimedia en Plex
Cuando migré MartinServer a un Hp Proliant G8 mantuve temporalmente todos mis contenidos multimedia en las dos NAS  Western Digital de de 3 TB y  de 6 TB que venía utilizando hasta entonces. Pero las bibliotecas de Plex (películas, series, fotos y música) habían crecido exponencialmente desde la primera instalación del Servidor Plex, y por tanto había llegado la hora de migrarlos a los dos discos de 6TB que había añadido al servidor HP Proliant G8.

La forma fácil

El procedimiento viene bien explicado en las páginas de soporte de Plex. Si lo que necesitas es solamente cambiar el contenido a un nuevo disco, la forma más sencilla es ponerle exactamente el mismo nombre al nuevo disco, y conservar la misma ruta de acceso para todos los contenidos. El procedimiento en Ubuntu sería algo así:

  1. Tienes que detener el servidor Plex. Abre una terminal y teclea:
    sudo service plexmediaserver stop
  2. Cambiamos el nombre del disco actual. Por ejemplo, si se llama “Plex”, lo renombramos a “PlexAntiguo”. En el terminal:
    sudo mv /media/Plex /media/PlexAntiguo

    Suponiendo que la partición del disco sea /dev/sdb1, tecleamos:
    sudo mount /dev/sdb1 /media/PlexAntiguo
  3. Ahora montamos el nuevo disco y le ponemos el mismo nombre que al original (en este caso, “Plex”):
    sudo mkdir /media/Plex

    Suponiendo que la partición del nuevo disco sea /dev/sdb2 (esto lo comprobamos con el comando “fdisk -l”), tecleamos:
    sudo mount /dev/sdb2 /media/Plex

    Añadimos el nuevo disco a fstab para que se monte al inicio:
    sudo nano fstab

    Añadimos la siguiente línea a fstab:
    /dev/sdb2 /media/Plex ext4 defaults 0 2

    Si hay una entrada para el disco antiguo en fstab, la eliminamos. Guardamos fstab y actualizamos:
    sudo mount -a
  4. Ya estamos en condiciones de mover todo el contenido del viejo al nuevo disco:
    mv  -v /media/PlexAntiguo/* /media/Plex/

    Si son Terabytes de contenido… paciencia.
  5. Una vez que acabe de moverse todo el contenido, desmontamos el disco antiguo:
    sudo umount /media/PlexAntiguo

    Ya podemos desconectar el disco antiguo. Sólo queda iniciar el servidor Plex:
    sudo service plexmediaserver start

    Y eso sería todo. Debería funcionar con normalidad.

La vía del penitente

Pero en ocasiones esta forma simple no nos sirve. Por ejemplo en mi caso, yo había creado mis bibliotecas de Plex en el NAS de 3TB, y cuando se llenó añadí otro NAS de 6TB. Esto supuso duplicar la estructura de carpetas, solución que no me gustaba nada. Aprovechando el cambio a los dos nuevos discos de 6TB, quería aprovechar para dejar una estructura limpia, algo así:

/Plex/
    /Peliculas/
        /NombredePelicula (año)/
            NombredePelicula (año).ext
            SubtitulodePelicula (año).spa.srt
    /Series/
        /NombreSerie/
            /Temporada 01/
                NombreSerie - s01e01.ext
                SubtituloSerie - s01e01.spa.srt

En este caso, el procedimiento se complica un poco:

  1. Deshabilitar la opción “Vaciar la papelera automáticamente después de cada escaneado”. En la interfaz web de Plex hay que ir a “Ajustes/Biblioteca/” y desmarcar la opción que se reproduce en la imagen:
    deshabilitar-vaciar-papelera
  2. Detener el servidor Plex. Abre una terminal y teclea:
    sudo service plexmediaserver stop
  3. Copiar (no mover) el contenido del viejo al nuevo disco:
    cp -R /media/PlexAntiguo/ /media/PlexNuevo/

    Aquí no tenemos que conservar la misma estructura. Es el paso que podemos aprovechar para reestructurar nuestras bibliotecas.
  4. De nuevo en la interfaz web de Plex, nos vamos a “Librerías/Añadir Biblioteca”. Aquí vamos añadiendo las diferentes bibliotecas de películas, series, música o fotos con la ubicación del disco nuevo:
    añadir-a-la-biblioteca
  5. Una vez que se han añadido todas las nuevas bibliotecas, iniciamos Plex Media Server:
    sudo service plexmediaserver start
  6. Actualiza las bibliotecas desde la interfaz web. Si tienes mucho contenido multimedia, tardará bastante. Cuando termine el proceso, verás que todo el contenido aparece duplicado.
  7. Desde la interfaz web, buscamos las bibliotecas correspondientes al disco antiguo. Seleccionamos “editar” y borramos las carpetas correspondientes al disco antiguo una a una.
    borrar-biblioteca
  8. Volvemos a actualizar las bibliotecas. Ya sólo debe aparecer el contenido del nuevo disco. Para comprobar que no hay errores, utilizamos el filtro de contenidos “buscar duplicados”. Si hay algún duplicado, seguramente se debe a un error de indexación. Editamos manualmente los contenidos mal indexados.
  9. Finalmente, vaciamos la papelera de las bibliotecas.
  10. Y con esto ya está: migrado el contenido de Plex Media Server a un disco nuevo y con una estructura distinta.

Nunca olvides el factor humano

Cómo aprendí de primera mano que no siempre la solución a los problemas de un sistema está en los logs

Limpiando la computadora
Cuando hice la migración de MartinServer ya era consciente de que no había sido todo lo “limpia” que hubiera sido de desear, y me esperaba algunos problemas.
Efectivamente, en los días siguientes vi cómo se producían desconexiones intermitentes. Creí haberlo solucionado, primero, con un script para actualizar FreeDNS, y más tarde, ya de forma más definitiva, solucionando un problema con la interfaz de red.

Problemas menores

En verdad el sistema quedó mucho más estable, ya apenas se producían caídas. Pero persistían algunos problemillas que me traían de cabeza, y me puse a estudiar como loco los logs del sistema para ver de qué coño se trataba. En primer lugar, cada vez que reiniciaba el sistema, se demoraba una eternidad. No era normal. Yo estoy acostumbrado a trabajar con Ubuntu desde hace años y nunca me había pasado nada igual. Por mucho que un servidor HP ProLiant Gen8 sea diferente, no se justificaba.
El otro problema, poco importante pero desconcertante, es que todos los días se desconectaba unos minutos a las 7:00 AM. Yo monitorizo algunos de los sitios web que alojo en MartinServer con una funcionalidad del plugin JetPack para WordPress. Este plugin te avisa si se ha producido una caída en el servicio y durante bastantes días, como digo, puntualmente me llegaba un mensaje a las 7:00 AM. Sólo duraba unos minutos, pero jodía.

Swap

En cuanto al primer problema, lo que me llamó la atención fue este error:

The disk drive for /dev/mapper/ubuntu--vg-swap_1 is not ready yet or not present.

Esto quería decir que el espacio de intercambio o “swap” no era reconocido en el arranque. Con casi toda seguridad era esto lo que estaba enlenteciendo el arranque.
Me llamó la atención la ruta “/dev/mapper/”, es la que se suele utilizar para las particiones encriptadas. Y yo no recordaba haber encriptado mi partición swap. Así que, tecleando blkid en una terminal, comprobé la UUID de la partición swap, y efectivamente no era la que daba el error. Edité fstab:
sudo nano /etc/fstab

Cambié la ruta de la partición swap por la UUID que me había proporcionado el comando blkid. Guardé y reinicié. Problema resuelto, el arranque ya era normal. Y además (y esto ya no sé explicarme por qué), el segundo problema, el de las desconexiones todos los días a las 7:00AM, también desapareció.

Factor humano

Aún quedaba otro problema más pequeño aún, pero me obsesioné con resolverlo. Todos los miércoles por la mañana, el equipo se apagaba. No era una desconexión de red, sino apagado. Mis sitios webs, el accesso SSH y todos los servicios en general eran inaccesibles, pero sí podía acceder a través del interfaz HP iLO, donde veía que el equipo estaba apagado.

Tampoco podía deberse a un corte de electricidad, porque el equipo se reiniciaría solo. No. La única alternativa que me quedaba era, como digo, volver a encender el equipo a través del interfaz HP iLO. Y después todo volvía a funcionar con normalidad, hasta el siguiente miércoles, cuando volvía a pasar lo mismo.

Me quemé las cejas revisando los logs del servidor, para no encontrar finalmente nada. Estas misteriosas caídas del servidor hubieran quedado para siempre sin resolver si no hubiera recordado que lo único que diferencia los miércoles al resto de los días de la semana es que… ¡una chica viene a limpiar la casa por las mañanas!

La llamé. Le pregunté si había tocado el equipo, y me dijo que sí, que por supuesto, que había visto que yo me lo había dejado encendido y que ella lo apagaba. “Por favor, no lo vuelvas a apagar nunca más -le rogué-“. Misterio resuelto. Maldito factor humano 🙂 .

 

 

Problemas con la interfaz de red

Configurar la interfaz de red para que la reconozca como “em1”

Eth0Cada dos o tres días al principio, cada pocas horas al final, MartinServer estuvo sufriendo una serie de caídas que me impedían acceder al servidor. No tenia acceso a mis páginas web, pero es que tampoco podía acceder remotamente a una terminal vía SSH. El servidor estaba muerto  (o, más exactamente, desconectado). Para salir del paso, apagaba y volvía a encender el equipo, bien directamente o en remoto a través del HP iLO. Pero aquí había un problema que solucionar 🙂 .

Revisando el log del sistema en /var/log/syslog, me encontré con que el error era el siguiente:

Error getting hardware address for “eth0”: No such device

“Eth0” es el nombre que habitualmente se le da en los sistemas Linux a la tarjeta de red, es decir, al adaptador donde se conecta el cable ethernet que nos permite conectarnos a nuestra red LAN y a internet. Lo que estaba pasando, sencillamente, es que mi servidor no encontraba este adaptador de red.
Para averiguar qué estaba pasando, abro el terminal y tecleo:
ifconfig -a

Y me devuelve algo así:
em1       Link encap:Ethernet  direcciónHW b3:5f:dc:87:da:c0
Direc. inet:192.168.1.100  Difus.:191.161.1.255  Másc:255.255.255.0
Dirección inet6: fd80::b25c:dbcc:fd87:dac0/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
Paquetes RX:14145493 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:17842179 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:6871585837 (6.8 GB)  TX bytes:17386533946 (17.3 GB)
Interrupción:16
em2       Link encap:Ethernet  direcciónHW b3:5f:dc:87:da:c1
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:17

No me extraña que mi servidor no encontrase el adaptador de red. En mi equipo (es algo que pasó tras la actualización a Ubuntu Server 16.04) se está nombrando el adaptador de red como “em1” en vez de como “eth0”. Busqué la posible razón, y por lo visto es para conseguir mayor consistencia en la nomenclatura de las tarjetas de red. No profundicé mucho en la razón, simplemente procedí a solucionar el problema 🙂 .
La mayor parte de los afectados lo que hicieron fue forzar, modificando el Grub, que la tarjeta de red volviese a llamarse “eth0”. En mi caso fui más cómodo (espero que no me dé más problemas en adelante), y lo único que hice fue renombrar el interfaz de red:
sudo nano /etc/network/interfaces

Y aquí dejé el fichero de configuración de red tal que así:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto em1
iface em1 inet dhcp

Listo. A partir de ahora, mi sistema “sabe” que la interfaz del red se llama “em1”. No he vuelto a tener esos problemas de conexión.

Problemas con la actualización de FreeDNS

Y de cómo le hallé solución

FreeDNSComo ya conté aquí hace algún tiempo, tanto mis páginas webs como la de algunos amigos las alojo en un servidor casero, al que llamo MartinServer :-). Realmente, para el tráfico que tienen está bastante bien. Cuento con 200Mb simétricos, tanto de subida como de bajada, y he podido comprobar tanto desde aquí en México como desde España que su rendimiento es bastante razonable.

El único problema es el de los DNS. Yo no he contratado una IP estática con mi proveedor, luego la IP de MartinServer cambia cada cierto tiempo. Por tanto, no me queda más remedio que contratar o utilizar algún servicio gratuito que se encargue de renovar los DNS  de mis páginas webs cada vez que a mi proveedor le dé por cambiar la IP de mi servidor.

Para el dominio martinalia.com contraté DynDNS. Es un servicio de pago, pero supercómodo. Tan sólo tengo que configurar los parámetros de mi cuenta en mi router (un Linksys WRT1900 AC), y ya está. Puedo estar seguro de que cada vez que cambie la IP de MartinServer, el propio router lo comunicará a DynDNS y de ahí se propagará, garantizando que martinalia.com siempre esté online.

Para el resto de los websites, en cambio, opté por un servicio gratuito: FreeDns. En mi router no se puede configurar (al menos no de forma sencilla) este servicio, por lo que tuve que recurrir a instalar en el servidor un servicio que se encargase de esta tarea.

ddclient

De entre todos los disponibles, me decanté por ddclient. Se instala así:

sudo apt-get install ddclient

Una vez instalado, hay que editar la configuración, de la siguiente manera:
sudo nano /etc/ddclient/ddclient.conf

Y dejamos la configuración con algo como esto:
# /etc/ddclient/ddclient.conf
#
daemon=3600 # Aquí le decimos la frecuencia con que se actualizará. En el ejemplo, cada 3600 segundos
protocol=freedns
use=if, if=eth0
ssl=yes # Aquí le indicamos si se utilizará o no SSL
use=web, web=http://ip.dnsexit.com/ # Aquí podemos poner cualquier servicio que nos devuelva la IP que estamos utilizando
server=freedns.afraid.org
login=nombre_de_usuario
password=’contraseña’
midominio.ejemplo.com #Aquí listamos nuestro dominio o dominios a actualizar

Y ya está. Con esto debería funcionar, y de hecho me funcionó en el momento en el que lo instalé. Sin embargo, hace unos días mi proveedor cambió la IP con la que MartinServer sale a internet. Mi web martinalia.com seguía funcionando, porque está configurada con DynDNS en el router, pero el resto de las webs dejaron de funcionar.

Le di un vistazo al log del sistema en /var/log/syslog y lo que me indicaba es que la conexión de ddclient con el servicio de FreeDNS no se podría realizar. Estuve un buen rato trasteando con la configuración para ver si lo solucionaba, pero como todo intento fue infructuoso, corté por lo sano. Me monté yo mismo una tarea programada (cron) para actualizar el servicio.

La solución

La idea me la dio No soy vago, soy eficiente. Creé un archivo llamado “freeDNS.sh”, le di permiso de ejecución. Lo edité y quedó tal que así:

#! /bin/bash
DOMINIO=”midominio.ejemplo.com”
UPDATE_URL=”http://freedns.afraid.org/dynamic/update.php?xxxxxxxxxxxx” #donde pone xxxxxxxxxxxx va la cadena que te genera para tu dominio FreeDNS
UPDATE_COMMAND=”/usr/bin/curl -s $UPDATE_URL”
logger “Actualizando FreeDNS”
CURRENTIP=`curl -s ip.dnsexit.com | sed ‘s/[^0-9.]//g’`
echo “IP actual: ${CURRENTIP}”
CURRENTIPDOMINIO=`dig -x -add +short $DOMINIO`
echo “IP de $DOMINIO: ${CURRENTIPDOMINIO}”
if [ “${CURRENTIP}” != “${CURRENTIPDOMINIO}” ] ; then
echo “Encontrada diferencia, actualizando”
logger “Actualizando a ${CURRENTIP}”
if ${UPDATE_COMMAND}; then
echo “IP actualizada”
else
echo “Error actualizando FreeDNS”
fi
else
echo “No hay cambios, no se hace nada”
fi

Una vez listo, hacemos un “crontab -e”, y añadimos la línea:
*/5 * * * * /home/ruta_a/freeDNS.sh

Con esto le decimos que actualice la información sobre nuestra IP en FreeDNS cada 5 minutos. Y listo. Funcionando.

Arqueología web

Breve historia de cómo rescaté los contenidos de mis blogs antiguos que creía perdidos para siempre

Cuando hace unos días tuve que recuperar el blog de Gustavo Montes, repasándolo para verificar que no se había perdido nada, me encontré con muchísimas referencias antiguas a mis propios blogs. Sobre todo a m4rt1n.com, un blog que mantuve desde 2006 hasta 2008. Hacía muchos años que yo había retirado el contenido de este blog de internet, pero, lo que es peor, hace un tiempo ya que perdí incluso la titularidad del dominio. Estaba perdido para siempre.

Pero también me entró nostalgia de martinalia.com, un dominio que sigue siendo de mi titularidad pero que, desde 2004, había pasado por varias fases. Desde 2004 hasta 2006 era un blog más o menos personal con bastante enfoque en el ámbito de la Gestión de Contenidos. Era un blog muy peculiar, que utilizaba un CMS francés que me encantaba, SPIP. Anteriormente a esta fase, desde 2001, había publicado varios contenidos, pero estos se perdieron para siempre.
martinalia.com antiguo

En 2006 adquirí m4rt1n.com, el dominio que antes comenté que ya he perdido (se me pasó la fecha de renovación en Godaddy…). Estuvo funcionando como mi blog personal durante tres años, y tenía este aspecto (la imagen es de muy mala calidad, pero es lo único que conservo):

com

Años después, en 2009, actualicé el blog martinalia.com a SPIP 2.0, una versión muy mejorada, utilicé una plantilla minimalista y me centré en la Gestión de Contenidos. Todos los artículos anteriores quedaron arrinconados en una escueta sección llamada “antiguos”:

martinalia.com

Posteriormente también abandoné este blog, hasta que en 2011 le di un cambio absoluto y construí uno nuevo (con el lema “Objetivo Brasil”) que era todo un ejercicio de “personal branding”. Por motivos personales tenia la necesidad de moverme hacia Brasil, y el blog fue una pieza más en ese esfuerzo (que finalmente conseguí al cabo de unos meses).

objetivo brasil

Lo cierto es que esto también dejó de tener sentido una vez alcanzado el objetivo, y finalmente lo abandoné también No fue hasta el año pasado que martinalia.com volvió a funcionar, esta vez un WordPress en el que voy subiendo críticas de películas que me interesan sin ningún orden cronológico ni de ningún otro tipo. Tan solo lo que se me antoja. También ofrezco “extras” bien interesantes para los usuarios registrados.

En cualquier caso, haciendo memoria me entró bastante nostalgia y decidí que todos esos contenidos desaparecidos merecían ser rescatados, que al fin y al cabo formaban parte de mi historia personal. Pero -y era un gran problema- tan sólo conservaba copia de seguridad del último, todos los anteriores habían desaparecido para siempre.

Archive.org al rescate

Sin copia de seguridad, la única alternativa que me quedaba era recurrir al servicio WayBack Machine que ofrece gratuitamente Internet Archive, una entidad sin ánimo de lucro que conserva en sus archivos millones de sitios webs, películas, libros, etc. En WayBack Machine quedaba constancia de todas estas antiguas versiones de mis blogs… el problema era, claro, cómo extraer esa información y poder migrarla a martin.ekiry.com.

La solución me vino con Wayback Machine Downloader, una herramienta sencilla y potente que me permitió hacer justo lo que necesitaba. Para utilizarla debes tener instalado previamente Ruby. Para instalar Wayback Machine Downloader sólo hay que teclear lo siguiente en una terminal:

gem install wayback_machine_downloader

Una vez instalado, su uso es de lo más sencillo. Con los siguientes comandos en el terminal descargué todos mis blogs “perdidos”:
wayback_machine_downloader http://www.m4rt1n.com --timestamp 20090425231334
wayback_machine_downloader http://www.martinalia.com --timestamp 20090625231334
wayback_machine_downloader http://www.martinalia.com --timestamp 20060325231334

Listo. Ya tenía todo el contenido guardado en mi disco duro. Ahora lo que tenía que hacer es pasar todos los artículos, que había guardado en formato HTML, a la base de datos de martin.ekiry.com. Para ello utilicé el plugin HTML Import2. Misión cumplida.

Eso sí, algunos (pocos) artículos se perdieron para siempre, porque Internet Archive no los había almacenado. Casi todas las imágenes se habían perdido también, con lo cual me tocó una tediosa tarea manual de búsqueda y reposición de imágenes (algunas de las originales se perdieron para siempre).

Pero básicamente está todo recuperado, disponible ahora aquí en martin.ekiry.com casi toda mis publicaciones en internet (salvo las anteriores a 2004, que esas también se perdieron para siempre).

Resucitando el blog de Gustavo Montes

gustavo.ekiry.com antiguo

Ayer dejó de funcionar el blog de Gustavo Montes, que tengo alojado en MartinServer. Me daba un error de conexión a la base de datos, pero aparentemente el servicio MySql estaba funcionando correctamente y todos los demás websites alojados en MartinServer funcionaban con normalidad. Mirando con un poco más de atención, descubrí el motivo: Ubuntu 16.04, versión a la que acababa de migrar mi servidor, viene con PHP7, y en PHP7 la extensión mysql se ha declarado obsoleta, teniendo que optar en su lugar por mysqli.
O sea, que en vez de gestionar la conexión a la base de datos así:

connect = mysql_connect(‘server’,’username’,”);
mysql_select_db(‘dbname’);

tendría que hacerlo más o menos así:
connection = mysqli_connect(‘server’, ‘username’, ‘password’, ‘database’);

No parece un gran cambio, pero realmente me hubiera supuesto reescribir gran parte del código (todos los selects y queries) de una instalación de Dotclear muy antigua (la 1.2.1, de 2006). No tenía mucho sentido, realmente merecía la pena actualizar el blog a un CMS más moderno.

Otra opción hubiera sido volver a la versión antigua de PHP, PHP 5.6, o hacer convivir ambas versiones en la misma máquina. Se puede seguir para esto el procedimiento detallado aquí. Pero, nuevamente, considero que es mejor actualizar de una vez el software de base del blog en vez de ir haciendo remiendos.

Dotclear

Mi primera intención fue migrar el blog a una versión moderna del mismo CMS, Dotclear. La versión instalada, como ya he dicho, tenía más de 10 años de antigüedad, era la 1.2.1. La actual versión de Dotclear es la 2.9.1, y realmente en todos estos años ha evolucionado tanto que es otro CMS totalmente distinto. No hay una forma fácil de hacer la migración entre ambas versiones, es casi tan difícil como migrar a otro CMS diferente.

La única solución era hacer una migración manual, así que opté por cambiar de CMS. Al igual que otros blogs de MartinServer, decidí migrar a la última versión de WordPress. Exporté la base de datos a XML, realicé una instalación limpia de WordPress en el servidor y, con la ayuda del plugin WP All Import, importé todos los artículos y comentarios.

Paso seguido, subí todas las imágenes del blog a la carpeta /wp-content/uploads y, finalmente, cambié dentro de la base de datos la ruta relativa hacia las imágenes con una sentencia SQL:

UPDATE <tabla> SET <post_content> = REPLACE ( <columna>, ‘<url antigua>’, ‘<url nueva>’ )

Y eso fue todo. Ya volvía a funcionar el blog de Gustavo Montes. Obviamente, la plantilla o template que utilizaba (Promenade para Dotclear) no servía, lo adapté para la plantilla Writr para WordPress y ahora el blog luce tal que así:

blog de Gustavo Montes

Migrando MartinServer a un HP ProLiant MicroServer Gen8

Venturas y desventuras del cambio de servidor

hp proliant

Hewlett Packard Enterprise ProLiant MicroServer Gen8 E3-1220v2 4GB-U B120i LFF 2x1TB Server/S-Buy – Servidor

Hace menos de un año que puse mi propio servidor, MartinServer, en marcha. Desde entonces alojo todas mis páginas webs en casa, sin recurrir a ningún proveedor de hosting. El PC que utilizaba como servidor era bastante mediocre, un HP dc7800p Convertible Minitower, pero la verdad es que para lo que me costó ha venido funcionando bastante bien.

Pero el uso verdaderamente intensivo de MartinServer ha venido de parte del Servidor Plex que instalé. Actualmente alojo unas 1.500 películas y unas cincuenta series, que no sólo disfruto yo, sino que comparto con 15 amigos en 3 países diferentes.

Obviamente, con este escenario el rendimiento ya se resiente, y cuando tres o más usuarios están transcodificando vídeo simultáneamente, el servidor se desestabiliza peligrosamente. Ya se ha caído en alguna ocasión.

Llevo bastante tiempo pensando en cambiar el equipo, de forma que obtenga un rendimiento razonable. La mayor parte de los usuarios de Plex utilizan un NAS como servidor. Yo de hecho tengo dos Western Digital, uno de 3 TB y otro de 6 TB, donde almaceno mi contenido multimedia, aunque Plex está instado en el HP dc7800p.

Pero no es una solución que me convenza: MartinServer no sólo lo utilizo como servidor de Plex, es además mi servidor web, mi servidor FTP, mi almacenamiento en la nube particular… lo que necesito es un pequeño servidor doméstico.

ProLiant

La verdad es que no entiendo nada de hardware, por lo que me he tomado mucho tiempo pensando las opciones. Tras mucho comparar, fijé mi atención en el  HP ProLiant MicroServer Gen8, un servidor de diseño compacto y elegante que, además, tenía buenas referencias entre usuarios de Plex. Sólo advertían de la poca potencia del procesador, que no permitía demasiadas transcodificaciones simultáneas. En cualquier caso, el modelo que se me había antojado venía con un procesador Intel Xeon E3-1220L, que debería ser más que suficiente para soportar la carga de MartinServer.

Así que finalmente me decidí, y hace apenas unos días llegó a mi casa. Ahora quedaba el reto de migrar el servidor de equipo sin romper nada por el camino 🙂 .

Preparativos

La mayor parte de los propietarios de un  HP ProLiant MicroServer Gen8, por lo que vi, instalan el sistema operativo en un SDD (unidad de estado sólido) que obviamente se compra por separado y se conecta a través de la bahía para la unidad de disco óptico que viene dentro del equipo (hay que desmontarlo para su instalación). La ventaja de esta opción es mantener separado el sistema operativo de las unidades de almacenamiento (el HP Proliant viene con cuatro bahías para discos duros).

Yo ignoré esta opción. Mi equipo venía con dos discos duros de 1 TB, y yo le añadí otros dos discos duros de 6 TB cada uno. 14 TB en total. Decidí usar el primero de los discos de 1 TB para el sistema operativo y para la carpeta /home, el segundo para copias de seguridad y los dos discos de 6 TB para almacenar contenidos multimedia.

Otra opción que ignoré fue la de configurar los discos duros en RAID (Redundant Array of Independent Disks, es decir, “conjunto redundante de discos independientes”). Se suele utilizar para montar un espejo entre discos duros y, de esta forma, replicar la información en dos discos duros idénticos. Yo, imprudentemente, he ignorado esta posibilidad, he priorizado la capacidad total de almacenamiento sobre la seguridad.

Ubuntu Server

Así que pude proceder a instalar Ubuntu sin mayor demora. Lo único a tener en cuenta antes de instalar este sistema operativo es modificar la opción “Smart Array B120i RAID controller enabled” que viene por defecto en la BIOS (y que no está soportada por Ubuntu) por la opción “SATA AHCI Support”. Es fácil de hacer: Presionamos la tecla F9 y nos vamos a “System Options -> SATA Controller Options -> Embedded SATA Configuration”. Ahí seleccionamos “Enable SATA AHCI Support”. Presionamos la tecla ESC hasta que aparezca la opción para guardar, y listo.

Hecho esto, introducimos un USB de arranque con Ubuntu Server. Antes de instalar, abrimos Gparted y formateamos y montamos los discos duros. Reiniciamos, arrancamos nuevamente desde el USB, seguimos los pasos para la instalación y nada más. Ya está el HP Proliant funcionando con Ubuntu Server.

Clonando el servidor

Conecto el HP Proliant a mi red doméstica. Para clonar MartinServer utilizo el comando dd, que es una herramienta simple y muy potente. Con este comando puedo clonar todo el disco físico incluyendo el MBR (arranque de sistema), todas las particiones, UUIDs (la identificación única de cada partición) y los datos.
En el terminal escribí el siguiente comando para copiar el MBR:

su -c ‘dd if=/dev/sda of=/ruta/al/respaldo/sdabk.mbr count=1 bs=512’

Donde “/ruta/al/respaldo/” es donde guardé la copia de seguridad, un disco externo accesible tanto por el servidor viejo como por el nuevo.

Para realizar la copia de seguridad del sistema en sí, tecleé lo siguiente:

su -c ‘tar -cvpzf /ruta/al/respaldo/linuxbackup.tgz --exclude=/ruta/al/respaldo/ --exclude=/lost+found --exclude=/dev --exclude=/proc --exclude=/sys /’

Donde “/ruta/al/respaldo/”, nuevamente, es la ruta de acceso al disco duro externo. Con esto creé el archivo “linuxbackup.tgz” en el disco duro externo, que es una copia de seguridad completa del sistema. Es muy importante la opción “–exclude”, con ella le decimos qué debe quedar fuera de la copia de seguridad, como los discos duros externos o los directorios que están dinámicamente llenos por el sistema durante el arranque.

Migración

Ahora en el nuevo servidor, en el HP Proliant, escribí el siguiente comando para restaurar el MBR:

dd if=/ruta/al/respaldo/sdabk.mbr of=/dev/sda

Y para restaurar el sistema:
su -c ‘tar -xvpzf /ruta/al/respaldo/linuxbackup.tgz -C /’

Finalmente:
su -c ‘mkdir /proc && mkdir /lost+found && mkdir /dev && mkdir /sys && init 6’

Con esto se vuelven a crear los directorios excluidos y se reinicia el sistema. Teóricamente, el nuevo servidor debería ser idéntico al original.

Problemas

Pero algo debí hacer mal, porque el nuevo servidor no arrancaba. Me daba el error:

error: no such device: …
press any key to continue …

Seguramente no respaldé o restauré correctamente el MBR, con lo que la UUIDs de las particiones no coincidían. Es decir, en el archivo /etc/fstab del nuevo servidor se estaba apuntando a particiones que no existían. En el Grub seguramente habría la misma incongruencia.
Para solucionar esto, reinicié de nuevo el equipo con el USB de instalación. Desde una terminal tecleé:
blkid

Este comando me listó las UUIDs correctas del nuevo servidor. Con esta información siempre a la vista, abro otra ventana del terminal y tecleo:
gksudo gedit /boot/grub/grub.cfg

Me abre el fichero de configuración del Grub, el gestor de arranque. Cambio las antiguas UUIDs por las nuevas.
A continuación, lo mismo para fstab:
gksudo gedit /etc/fstab

Nuevamente cambio las antiguas UUIDs por las nuevas. Guardo y reinicio el sistema. Y… voilà! MartinServer ya está funcionando en el flamante HP Proliant Server.
El único detalle final es desconectar el servidor antiguo de la red y configurar en el router, para el nuevo servidor, la misma IP que utilizaba el servidor antiguo. Con esto, listo y funcionando.

Mi nuevo servidor Plex

Sacando partido a MartinServer con un gestor de contenidos multimedia

plex
Para quien no lo conozca, Plex es un gestor de contenidos multimedia cliente-servidor. Instalándolo en nuestro propio equipo (un pc normal y corriente, un servidor, un NAS o incluso una Raspberry-Pi), podemos organizar y visualizar en una interfaz muy amigable nuestras películas, series, fotos, canciones y cualquier otro tipo de archivos multimedia. Añade, además, todo tipo de información (carátulas, director, actores, sinopsis,  trailers, etc) sobre cada película o serie de forma automática.

Consta, como hemos dicho, de una parte servidor y una parte cliente:

Plex Media Server

El servidor, el Plex Media Server, lo podemos instalar en Windows, Mac OS, Linux, FreeBSD o en un NAS. Es el que se encarga de gestionar los archivos multimedia, organizándolos en librerías (“música”, “películas”, “series”, etc) y se encarga de enviar los contenidos hacia los dispositivos reproductores (clientes). Una de las características más interesantes es la “transcodificación”, que, explicándolo pronto  y mal, significa que Plex analiza dónde quieres reproducir tu contenido y si, por ejemplo en un teléfono móvil, tiene restricciones de bitrate o no puede interpretar algún códec específico, Plex transforma (transcodifica) ese contenido de manera que pueda ser visualizado en tu reproductor, no importa las limitaciones que tenga. Otra función interesante es que tu servidor es accesible desde cualquier lugar a través de internet, por lo que te llevas tus películas y series contigo allá a donde vayas. Y, además, te permite compartir tu contenido con los amigos que quieras, se encuentren en la parte de mundo que se encuentren.

Reproductores

Hay reproductores disponibles para las principales plataformas: teléfonos móviles (android e iPhone), smart TVs, PlayStation, Roku, etc, así como una interfaz web llamada Plex Web App.

Plex no es software libre, a pesar de estar basada en Kodi (la antigua XBMC). Sin embargo, se puede utilizar gratuitamente, aunque hay una versión de pago (PlexPass) que ofrece funcionalidades avanzadas, y algunos clientes (el de iPhone, que yo sepa) son de pago también. En cualquier caso, tanto la funcionalidad como la usabilidad de Plex lo hacen, desde mi punto de vista, la mejor opción.

Instalación

En primer lugar, creamos una cuenta de usuario de Plex en https://www.plex.tv/sign-up/. Seguidamente, descargamos en nuestro equipo el fichero de instalación (MartinServer usa Ubuntu Server, por lo que me descargué el instalador para Linux) :

wget https://downloads.plex.tv/plex-media-server/xxxxxxx/plexmediaserver_xxxxxxx_amd64.deb   (substituir xxxxxxx por la última versión de Plex)

A continuación instalamos el paquete:
sudo dpkg -i plexmediaserver_xxxxxxx_amd64.deb   (substituir xxxxxxx por la última versión de Plex)

A partir de ese momento, seguimos las instrucciones de instalación. Borramos el fichero de instalación.
rm plexmediaserver_xxxxxxx_amd64.deb   (substituir xxxxxxx por la última versión de Plex)

Y ya está listo para utilizar.

Configuración

Para configurar Plex Media Server, si estamos en la misma máquina en la que lo hemos instalado, entramos en cualquier navegador a la URL http://127.0.0.1:32400/web. Si es desde otro equipo, obviamente tendremos que substituir la IP. Aquí tenemos que introducir nuestro nombre de usuario y contraseña de Plex.

Ahora ya lo único que tenemos que hacer es crear nuestras propias bibliotecas de contenido (películas, series, musica, etc), decirle a Plex en qué ubicación están almacenadas… y nada más. Ya podemos disfrutar de nuestro propio servidor de contenidos multimedia. Eso sí, es muy recomendable, para que Plex reconozca adecuadamente los contenidos y pueda bajar el contenido adicional (carátulas, autores, actores, trailers, sinopsis, etc) seguir las recomendaciones de nomenclatura de Plex.

 

MartinServer

De cómo el enojo con mi proveedor de hosting me llevó a montar mi propio servidor doméstico: MartinServer

HP-Compaq-dc7800p

HP dc7800p Convertible Minitower

Desde que tengo actividad en internet he pasado por varios proveedores de hosting: al principio, en 1996, contraté con arrakis, la empresa sevillana que finalmente fue absorbida por BT; posteriormente pasé por EspaHost, Nominalia y no sé si alguna más, hasta que finalmente, en diciembre de 2005, contraté el servicio de una empresa californiana, DreamHost.

La oferta era realmente buena, me ofrecían un hosting linux con almacenamiento ilimitado (bueno, esto no era del todo cierto, había que leerse la letra pequeña) por 120 dólares al año. Esto me permitió alojar decenas de webs.

En la fase de desarrollo, yo montaba las webs en una instalación local de LAMP que posteriormente subía al servidor de Dreamhost por FTP, y así quedaban finalmente publicadas. Era un sistema que funcionaba bien, no me daba problemas y tenía un precio relativamente económico, 10 dólares mensuales.

Como ven, he sido un cliente fiel. Diez años he permanecido con ellos. Pero nada es perfecto, y hace unos meses comenzaron las desavenencias. Quiero aclarar que el culpable soy yo, por no leerme la letra pequeña de los contratos. Dicho esto, resumo lo que pasó: aprovechando que según mi contrato tenía “almacenamiento ilimitado” en Dreamhost, decidí crearme mi propia nube privada.

Letra pequeña

Instalé una instancia de Owncloud, que es una magnífica alternativa Open Source a servicios como Dropbox o Google Drive, y sincronicé todos mis equipos con el servidor. Era maravilloso. Ya no tenía que preocuparme de la pérdida, robo o malfuncionamiento de mis laptops. Podía tener sincronizado todo mis documentos entre los distintos equipos (personal, de trabajo…).

Sólo había una pequeña pega: en la letra pequeña del contrato de Dreamhost excluía explícitamente el uso del servidor como almacenamiento en la nube. Maldición. Yo me enteré porque deshabilitaron la instancia de Owncloud. Mala suerte, pero ya me buscaría una alternativa.

Lo peor, y lo que me enojó, es que comenzaron a llegarme requerimientos de pago por uso del servicio de almacenamiento. No, Dreamhost, no. Tendrás toda la razón legal que quieras, pero a un cliente con diez año de fidelidad no se le hace eso: está bien que cortes un servicio que dices no estar permitido, pero no intentes abultar la factura con esto. Ya me llamaste la atención. Déjalo estar…

Reclamé la factura, pataleé, pero fue para nada. Lo cierto es que contractualmente tenían razón, pero como cliente me sentí maltratado y los mandé a la chingada. Aprovechando que acababa de contratar un servicio de internet en casa que me ofrecía 200MB simétricos (tanto de subida como de bajada), decidí experimentar por primera vez con mi propio servidor doméstico.

Plaza de la Tecnología

 

Plaza de la Tecnologia

Plaza de la Tecnología

Como no tenía ninguna computadora que pudiera ejercer de servidor (utilizar laptops para ese fin es una mala idea), me dirigí a la Plaza de la Tecnología, muy cerquita del centro histórico de la Ciudad de México.
La Plaza de la Tecnología no es una plaza. Bueno, aquí en México se le llama “Plaza” a un centro comercial, pero es que ni siquiera eso. Es más bien un zoco desperdigado a lo largo de cuatro cuadras, lleno de puestos y tenderetes en el interior de vetustos edificios. Marea la sobreabundancia de oferta de cualquier producto tecnológico que puedas soñar. Lo que no encuentras en ningún otro lado, aquí está.
Yo tenía muy claro que lo que buscaba era un PC de escritorio de lo más barato. Así lo dije, y lo más barato que encontré fue un HP dc7800p Convertible Minitower, junto con un monitor y teclado, por el que me cobraron $2,000 pesos. Unos 100 euros. La verdad que el equipo, para 2015, ya era una porquería: un Intel Core 2 Duo, con 2.83GHz y 2GB de RAM. De disco duro, 250GB.

Ubuntu Server

Pero para mi propósito estaba bien. Le quité el Windows XP en chino con el que venía y le instalé la versión 12.04.5 LTS de Ubuntu Server. Esta distribución linux ya viene con casi todo lo necesario para mis necesidades. En concreto, el servidor Apache, PHP y MySql. Con esto podía poner en marcha, desde mi propia casa, todas mis webs. Bueno, todas todas no. Avisé a varios amigos a los que les alojaba las webs para que migrasen a otros servidores. No quería hacerme responsable del posible malfuncionamiento, eso lo dejaba exclusivamente para mis webs.

Algunos migraron, a otros pareció no importarles y se quedaron alojados en MartinServer. Así que configuré los VirtualHost para cada uno de los websites, los habilité en Apache. Finalmente, al no tener contratada IP estática con mi proveedor de internet, configuré los dominios en FreeDNS para gestionar la resolución de nombres de dominio. O sea, para que mis webs fueran localizables en internet con independencia de los cambios de IP que se pudieran producir en mi Servidor.

Y listo. Ahora, por primera vez en mi vida, tengo mi propio servidor en casa. A partir de ahora, a aprovechar todas las ventajas que esto ofrece. Y no sólo como servidor de páginas web: como media center, servidor de FTP, archivos en la nube doméstica, etc.