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 -dNota
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.
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:
- Instala la distribución generalista en el equipo.
- Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante
migasfree --register
.- 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».
- Prepara un entorno chroot con el Live/CD de partida.
- Instala y configura el cliente migasfree en el entorno chroot. Si es preciso registra el ordenador mediante
migasfree --register
.- Ejecuta
migasfree-tags --set
dentro del entorno.- 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.
- Instala la distribución generalista en un equipo que hará de «máster».
- Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante
migasfree --register
.- Ejecuta
migasfree-tags --set
.- Prepara el equipo para clonar y crea una imagen para su clonación.
- 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()
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.