Puesta en producción

La sublimación de los bárbaros.

Migasfree en producción

El valor del producto se halla en la producción.

—Albert Einstein

Deberás disponer de una máquina con un S.O. linux de 64 bits sobre la que vas a instalar docker y poder ejecutar los 2 contenedores necesarios, uno es para la BD y el otro para la aplicación.

Nota

Desde la versión 4.14 del servidor migasfree sólo proveemos contenedores docker para ejecutarlo. Esto nos ha liberado de la tediosa tarea de tener que construir los paquetes necesarios para su ejecución, a la vez que nos aprovechamos de las beneficios de usar contenedores.

Nota

Importante: Asegúrate de cambiar las contraseñas a los usuarios que vienen por defecto.

Instalación

Sigue los pasos indicados en migasfree-docker

Mantenimiento de contenedores

Si nunca has usado docker te describo las instrucciones más básicas para que puedas empezar a manejarte con docker.

  • docker images # muestra las imágenes.
  • docker ps -a # muestra los contenedores.
  • docker rmi -f <imagen> # borra una imagen.
  • docker rm -f <contenedor> # borra un contenedor.
  • docker restart <contenedor> # reinicia un contenedor.
  • docker exec -ti <contenedor> bash # ejecuta un bash interactivo dentro de un contenedor.

Actualización del servidor migasfree

Puedes actualizar el servidor modificando la variable MIGASFREE_VERSION del fichero variables y ejecutando de nuevo:

# . variables
# docker-compose up -d

Nota

Puedes ver las distintas versiones disponibles en el repositorio de docker

Configuración del servidor

Una vez en funcionamiento el servidor puedes configurar el servidor mediante el fichero /var/lib/migasfree/FQDN/conf/settings.py

Hay diversas variables que se pueden configurar aquí para modificar el comportamiento de migasfree. Para una personalización más avanzada, mira los Ajustes del servidor migasfree.

No olvides reiniciar el contenedor si modificas alguno de estos ajustes.

Cambiando las contraseñas

  • Accede a Configuracion-Usuarios y verás los perfiles de usuarios.
  • Edita el usuario admin. Cámbiale la contraseña y guárdalo.
  • Edíta el resto de perfiles de usuario y deshabilítalos o cámbiales la contraseña.

La explicación de los usuarios y sus grupos lo has visto ya en La configuración del sistema migasfree

Servicio de caché de paquetes

Montar un caché de paquetes para disminuir el tráfico de Internet es habitual. Su funcionamiento es muy sencillo. Cuando un equipo necesita descargar un paquete de Internet, lo solicita al caché. Si el servicio de caché no lo tiene ya almacenado, lo descargará de Internet, lo almacenará y se lo ofrecerá al equipo. Si otro equipo necesita ese mismo paquete, como ya está en la caché ya no se producirá tráfico Internet, sino que el servicio de caché lo ofrecerá directamente al equipo.

Servicio de caché de paquetes.

Puedes instalar el servicio de caché de paquetes en el equipo donde has instalado el servidor migasfree, o en otro servidor.

Por ejemplo puedes instalar apt-cacher-ng.

# apt-get install apt-cacher-ng

Configura el usuario para la administración del servicio.

# nano /etc/apt-cacher-ng/security.conf

Descomenta la línea que empieza por AdminAuth y modifica el usuario y la contraseña:

AdminAuth: <usuario>:<contraseña>

Reinicia el servicio.

#service apt-cacher-ng restart

Por defecto el puerto del servicio apt-cacher-ng es el 3142. Accede a la página http:<miservidor>:3142 para la administración del servicio de caché.

Hasta aquí hemos instalado y configurado el caché en el servidor.

Para la configuración de los clientes, debes crear el fichero /etc/apt/apt.conf.d/02proxy con el siguiente contenido:

Acquire::http { Proxy "http://<miservidor>:3142"; };

Para hacerlo correctamente, modifica el paquete acme-migasfree-client añadiéndo este fichero al paquete.

Otra manera de configurar los clientes es haciendo uso del ajuste Package_Proxy_Cache de los Ajustes del cliente migasfree. La diferencia entre éste método y el anterior es que el primero hará uso del servicio del caché de paquetes tanto cuando ejecutes el comando migasfree en los clientes, como cuando ejecutes el gestor de paquetes (apt-get). En cambio, en el segundo método sólo usará el servicio de caché al ejecutar el comando migasfree.

Puede consultar el manual de apt-cacher-ng para una configuración más avanzada del servicio de caché.

Etiquetando los clientes

Para facilitar la atención a los usuarios cuando tengan un problema, es conveniente imprimir y pegar físicamente la etiqueta que identifica inequívocamente a cada equipo, ejecutando desde el cliente el comando:

migasfree-label

Consulta el ajuste MIGASFREE_HELP_DESK de los Ajustes del servidor migasfree

Nota

También puedes imprimir la Etiqueta desplegando el menú del ordenador en el servidor.

Creando tu propia Distro

No tratéis de guiar al que pretende elegir por sí su propio camino.

—William Shakespeare

Una Distro no es más que un conjunto de software seleccionado y preparado para instalarse fácilmente.

Existen herramientas que te permiten personalizar una distribución Linux fácilmente sin grandes complicaciones, y también puedes crear tu Linux desde cero, eso sí, armándote de paciencia.

Pero como te decía, para crear tu Distribución personalizada debes:

  • Seleccionar el software que incluirás en ella.
  • Preparar un sistema sencillo para instalar todo ese software.

En este capítulo te describo diferentes opciones que he utilizado para realizar estas dos tareas.

La selección de paquetes

La idea principal al trabajar con migasfree es que todo debe ser empaquetado, incluida la personalización del software. Así que debes elegir qué software incluirá tu distribución y crear los paquetes que la personalicen.

El método que te expongo a continuación es muy versátil, y es el de utilizar migasfree para especificar esta selección de paquetes.

Se trata de usar los campos del Despliegue:

  • Paquetes pre-incluidos por defecto. Lista de paquetes que configuran repositorios externos.
  • Paquetes incluidos por defecto: Lista de paquetes a instalar.
  • Paquetes excluidos por defecto: Lista de paquetes a desinstalar.

y asignar al Despliegue el Atributo incluido SET-ALL SYSTEMS

No tienes por qué indicar todos los paquetes. Como vamos a partir de una distribución generalista como Debian, Ubuntu, RedHat, etc. indicamos sólo los paquetes que queremos añadir o eliminar a la Distro.

También puedes hacer una selección de los paquetes que compondrían unos «sabores», y en vez de usar el Atributo SET-ALL SYSTEMS, crear una Etiqueta por sabor y asignarla en diferentes Despliegues.

La creación de etiquetas la viste en La configuración del sistema migasfree.

La instalación de tu Distribución

Ahora que has elegido y creado uno o varios Despliegues en migasfree con los paquetes que debe llevar tu distribución, es el momento de ver varios métodos para instalar tu distribución personalizada y controlada desde un servidor migasfree.

El método de «andar por casa»

Recomendado si no quieres complicarte la vida y tienes pocos equipos en los que instalar tu Distro:

  1. Instala la distribución generalista en el equipo.
  2. Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set.

Generando un Live/CD

Es el método recomendado si la instalación la puede realizar cualquier persona. Se trata de hacer básicamente lo mismo que en el método anterior pero sustituyendo el primer paso por el empleo de un Live/CD en un entorno «chroot».

  1. Prepara un entorno chroot con el Live/CD de partida.
  2. Instala y configura el cliente migasfree en el entorno chroot. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set dentro del entorno.
  4. Finalmente genera una imagen ISO del entorno.

Puedes ver un ejemplo de cómo se hace en vitalinux con vx-create-iso.

Clonación de imagen

Es el método que usamos en AZLinux y está recomendado si tienes muchos equipos y eres tú quien hace las instalaciones.

  1. Instala la distribución generalista en un equipo que hará de «máster».
  2. Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set.
  4. Prepara el equipo para clonar y crea una imagen para su clonación.
  5. Clona la imagen en los equipos.

Reinstalando la selección de paquetes

Una vez instalada tu Distro, en cualquier momento podrás cambiar de sabor ejecutando otra vez migasfree-tags --set. Observa que has podido decidir cambiar la selección de paquetes en migasfree entre tanto, esto te permite ir probando tu Distro fácilmente mientras aún la estás definiendo.

FAQ

Uno reconoce a las personas inteligentes por sus respuestas. A los sabios se los reconoce por sus preguntas.

—Naguib Mahfuz

Sobre el servidor migasfree

Cuando accedo al servidor web me aparece: Server error (500)

Causa

Este error puede estar motivado por múltiples causas. La más probable es que la contraseña del usuario migasfree en Postgresql no sea la misma que la que está configurada en el servidor.

Solución

Comprueba la contraseña que tienes en /var/lib/migasfree/FQDN/conf/settings.py es la misma que la del usuario migasfree en Postgresql. Si no existe este fichero, la contraseña por defecto es migasfree.

Si necesitas cambiarla, haz esto:

# su postgres
# psql
# ALTER USER migasfree WITH PASSWORD 'mipassword';

¿Cómo migro el servidor a una versión >= 4.14 con docker?

En primer lugar sigue los pasos indicados en Migasfree en producción.

Observa ahora que en el fichero docker-compose.yml se establecen para el servidor los volumes siguientes:

volumes:
  - "/var/lib/migasfree/${FQDN}/conf:/etc/migasfree-server"
  - "/var/lib/migasfree/${FQDN}/public:/var/migasfree/repo"
  - "/var/lib/migasfree/${FQDN}/keys:/usr/share/migasfree-server"

Por tanto, deberás mover o copiar los ficheros de la versión antigua a /var/lib/migasfree/${FQDN}/ además de cambiar a estos ficheros el propietario (el servidor >=4.14 utiliza un usuario con uid y gid 890).

# cp /etc/migasfree-server/* /var/lib/migasfree/${FQDN}/conf
# cp /var/migasfree/repo/* /var/lib/migasfree/${FQDN}/public
# cp /usr/share/migasfree-server/* /var/lib/migasfree/${FQDN}/keys
# chown -R 890:890 /var/lib/migasfree/${FQDN}/public
# chown -R 890:890 /var/lib/migasfree/${FQDN}/keys

Por último, es muy recomendable que regeneres los metadatos de los despliegues. Esto evitará que se produzcan errores en el cliente de firmas GPG inválidas, al no estar firmado el fichero InRelease en los proyectos con sistema de paquetería apt, al haberse generado los metadatos de los repositorios con versiones antiguas del servidor:

Get:1 http://migasfree/repo/Ubuntu-18.04/REPOSITORIES test InRelease [4213 B]
Err:1 http://migasfree/repo/Ubuntu-18.04/REPOSITORIES test InRelease
  The following signatures were invalid: 37CDCDA342A718EADA493BC5827CFFCB9A18B812
Hit:2 http://es.archive.ubuntu.com/ubuntu bionic InRelease
Hit:3 http://es.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:4 http://es.archive.ubuntu.com/ubuntu bionic-backports InRelease
Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease
Reading package lists... Done
W: GPG error: http://migasfree/repo/Ubuntu-18.04/REPOSITORIES test InRelease: The following signatures were invalid: 37CDCDA342A718EADA493BC5827CFFCB9A18B812
E: The repository 'http://migasfree/repo/Ubuntu-18.04/REPOSITORIES test InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

Para ello accede a Liberación - Despliegues, selecciona los despliegues que necesitas regenerar, en el desplegable acción elige regenerar metadatos y pulsa finalmente sobre el botón ir.

¿Cómo hago una fórmula para obtener el contexto LDAP de un usuario?

Necesitas que los clientes tengan instalado el paquete python-ldap. En el servidor tendrás que crear una nueva fórmula:

Prefijo: CTX

Nombre: CONTEXTO LDAP

Lenguaje: python

Clase: Añadir por la derecha

Código:

import sys
import ldap
import migasfree_client.utils

LDAP_SERVER = 'ldap.miservidor.es'
LDAP_BASE = ''
LDAP_SCOPE = ldap.SCOPE_SUBTREE

def get_ldap_property(filter_str, property_str, base = LDAP_BASE, scope = LDAP_SCOPE):
    global global_ldap_object

    try:
        _result = global_ldap_object.search_s(base, scope, filter_str, [property_str])
    except ldap.LDAPError, e:
        print e
        sys.exit(errno.ENOMSG) # no result

    if _result == None or not _result:
        print 'No result in LDAP search'
        sys.exit(errno.ENOMSG) # no result

    if property_str == 'dn': # special case: dn is getted in other field
        return _result[0][0]

    try:
        _ret = _result[0][1][property_str]
        if len(_ret) == 1: # only one result?
            return _ret[0]
    except KeyError:
        return '' # empty value

    return _ret

def get_dn(user):
    # cn=oXXXXx,ou=XXXX,o=XXXXXX
    return get_ldap_property('(cn=%s)' % user, 'dn')

def get_context(user):
    result = get_dn(user).split(',')

    ret = ''
    for item in result[:]:
        tmp = item.split('=')
        if tmp[0] == 'ou' or tmp[0] == 'o':
            ret = '%s%s.' % (ret, tmp[1])

    return ret[:-1] # remove trailing '.'

def run():
    global global_ldap_object
    global_ldap_object = ldap.initialize('ldap://%s:389' % LDAP_SERVER)

    user=migasfree_client.utils.get_current_user().split("~")[0]
    print get_context(user)

if __name__ == '__main__':
    run()

¿Cómo hago una fórmula para obtener los grupos LDAP de un usuario?

Necesitas que los clientes tengan instalado el paquete python-ldap. En el servidor tendrás que crear una nueva fórmula:

Prefijo: GRP

Nombre: GRUPOS LDAP

Lenguaje: python

Clase: Lista

Código:

import sys
import ldap
import migasfree_client.utils
LDAP_SERVER = 'ldap.miservidor.es'
LDAP_BASE = ''
LDAP_SCOPE = ldap.SCOPE_SUBTREE

def get_ldap_property(filter_str, property_str, base = LDAP_BASE, scope = LDAP_SCOPE):
    global global_ldap_object

    try:
        _result = global_ldap_object.search_s(base, scope, filter_str, [property_str])
    except ldap.LDAPError, e:
        print e
        sys.exit(errno.ENOMSG) # no result

    if _result == None or not _result:
        print 'No result in LDAP search'
        sys.exit(errno.ENOMSG) # no result

    if property_str == 'dn': # special case: dn is getted in other field
        return _result[0][0]

    try:
        _ret = _result[0][1][property_str]
        if len(_ret) == 1: # only one result?
            return _ret[0]
    except KeyError:
        return '' # empty value

    return _ret

def get_groups(user):
    # TODO only groups of organization or all of them?
    _result = get_ldap_property('(cn=%s)' % user, 'groupMembership')
    if not _result:
        return '' # no groups found

    # only one result?
    if type(_result) is str:
        _result = [_result]

    _ret = ''
    for _item in _result:
        _t = _item.split(',')
        if '=' in _t[0]:
            _ret = '%s%s, ' % (_ret, _t[0].split('=')[1])

    return _ret[:-2] # remove trailing ',

def run():
    global global_ldap_object
    global_ldap_object = ldap.initialize('ldap://%s:389' % LDAP_SERVER)

    user=migasfree_client.utils.get_current_user().split("~")[0]
    print get_groups(user),

if __name__ == '__main__':
    run()

Estoy en México y las horas son incorrectas.

Causa

Configuración incorrecta.

Solución

Modifica la variable TZ del fichero variable del proyecto migasfree-docker:

export TZ=America/Mexico_City

Modifica también la variable TIME_ZONE en el fichero settings.py:

TIME_ZONE = 'America/Mexico_City'

Sobre el cliente migasfree

El cliente migasfree devuelve el mensaje: «firma no válida»

Causa

Las claves almacenadas en el cliente no coinciden con el proyecto indicado en /etc/migasfree.conf.

Solución

Borra las claves del equipo cliente.

Para la versión de migasfree-client 4.6 ó inferior usa:

# rm /root/.migasfree-keys/*

Para la versión de migasfree-client 4.7 ó superior usa:

# rm -rf /var/migasfree-client/keys/[server]/*

Nota

Si es necesario, vuelve a registrar el cliente ejecutando: migasfree --register.

El cliente migasfree devuelve el mensaje: «Autoregistrando ordenador… Error: Error genérico»

Causa

Este error suele estar relacionado con el propietario de la carpeta keys del servidor.

Solución

Si has migrado el servidor desde una versión inferior a la 4.14, asigna al directorio keys y su contenido al propietario 890.

# chown -R 890:890 /var/lib/migasfree/${FQDN}/keys

Imposible obtener /PKGS/binary-amd64/Packages 404 Not Found

Causa

Por defecto los repositorios físicos en el servidor se generan para la arquitectura i386.

Solución

Accede a Configuracion - Sistemas de gestión de paquetes - apt-get y modifica el campo crear repositorio de esta manera:

cd %PATH%
mkdir -p %REPONAME%/PKGS/binary-i386/
mkdir -p %REPONAME%/PKGS/binary-amd64/
mkdir -p %REPONAME%/PKGS/sources/
cd ..
dpkg-scanpackages -m dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/binary-i386/Packages.gz
dpkg-scanpackages -m dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/binary-amd64/Packages.gz
dpkg-scansources dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/sources/Sources.gz

No se consige ejecutar el cliente de migasfree en un cron.

Causa

Las variables de entorno no están disponibles.

Solución

En vez de programar el cron así:

00 07 * * * root /usr/bin/migasfree --update

debemos forzar el entorno de usuario de esta forma:

00 07 * * * root su -c 'migasfree --update' --login

Resolución de problemas

Un problema deja de serlo si no tiene solución.

—Eduardo Mendoza

A menudo, puede ocurrir que migasfree no esté funcionando como se espera. Para obtener más información y averiguar qué te puede estar ocurriendo, puedes poner tanto al cliente como al servidor en modo DEBUG.

Cliente en modo DEBUG

Simplemente debes poner el ajuste Debug a True en los Ajustes del cliente migasfree.

Cuando ejecutes migasfree --update en este modo desde una consola, verás en la salida estándar más información de la habitual.

También puede serte útil consultar la información que se va generando en /var/tmp/migasfree.log.

Servidor en modo DEBUG

Al estar el servidor realizado con Django, puedes usar el ajuste DEBUG a True. Este ajuste del servidor debes ponerlo en el fichero /var/lib/migasfree/FQDN/conf/settings.py y después reiniciar el servidor web.

Al hacer esto, la página del servidor migasfree que te está fallando te mostrará, en vez de una página de error escueta, otra página de error con información muy extensa y que te permitirá ver qué está ocurriendo.

Nota

Nunca dejes el modo DEBUG en un entorno de producción por motivos de seguridad.

Activar el sistema de logging en el servidor

El servidor utiliza el módulo de logging de Python.

Para activar el sistema de logging en el servidor de migasfree añade el ajuste LOGGING en /var/lib/migasfree/FQDN/conf/settings.py:

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d
%(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/migasfree.log',
            'formatter': 'verbose',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'migasfree': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
        }
    }
}

Esto hará que en el fichero indicado (/tmp/migasfree.log) se almacenen los logs.