Este manual intenta ayudar a como implementar un servidor espejo (mirror) de paquetes Egg Python del servidor central PyPI localmente en su organización.
Una de las características principales que ha popularizado a los sistemas operativos Linux, son los diversos esquemas de distribución de software implementados en la Web para compartir y distribuir software, todo esto gracias a la libertad 2 del software libre.
En la actualidad existen varios tipos de paquetes de software para Linux de los cuales dos son los principales formatos de paquetes los .rpm de Redhat Linux y los archivos .deb de Debian GNU/Linux, con estos formatos se pueden descargar, instalar, configurar y dejar listo un paquete de software para que usted solo lo ejecute y lo utilice.
Una parte importante que va de la mano del sistema de paquetes, es el repositorio de software y es, en pocas palabras, un sitio (lugares / servidores) en Internet donde se almacenan un espejo (lo mismo) que contiene el repositorio original del proveedor de software, el cual dicho espejo puede ayudar a que las personas que estén mas cerca (geográficamente hablando) del servidor espejo, para que al momento de descargar el software se más rápidamente.
Los repositorios de software de Linux se almacenan literalmente en cientos de servidores espejos “mirrors” distribuidos en muchos países, por ejemplo:
La lista de mirrors de Debian GNU/Linux incluye cientos de servidores unos alojados por empresas, otros por universidades, gobiernos, etc.
En el caso de Ubuntu Linux la lista también es larga y abarca países de la letra “A” a la letra “Z”.
Para gestionar los paquetes Deb es necesario usar las herramientas dpkg, apt / aptitude las cuales usan estos repositorio para descargar dichos paquetes.
La lista pública de mirrors de Fedora Linux también es larga y abarca países.
Para gestionar los paquetes rpm es necesario usar la herramienta yum la cual usan estos repositorio para descargar dichos paquetes.
En el caso de Python existe el sistema de paquetes Egg y estos se disponen para ser distribuidos como aplicaciones y librerías Python en un repositorio principal dispuesto por la fundación Python en la siguiente dirección:
Para gestionar los paquetes Egg es necesario instalar las herramientas easy_install / pip las cuales usan este repositorio para descargar los paquetes Egg.
Este repositorio principal posee sus mirror o espejos como se listan a continuación:
Truco
Para mas información sobre nuevo repositorios consulte la siguiente dirección http://pypi.python.org/mirrors
Si desea saber el estatus actual de sincronización de los repositorios oficiales puede consultar la siguiente dirección:
z3c.pypimirror, es un modulo para construir un mirror parcial o completo de PyPI.
Esto le permite establecer el criterio de que paquete debe sincronizara en su repositorio espejo, esto es muy útil, cuando requiere hacer, trabajar solo con ciertos paquetes, por ejemplo:
Por defecto, la configuración que genera sincroniza todos los paquetes del repositorio.
Existen varios repositorios públicos generados con el paquete z3c.pypimirror disponibles a continuación:
Ahora si usted desea tener su propio servidor espejo del servidor PyPI por un tema de mayor eficiencia en los recursos de ancho de banda local de su organización, pues bien requiere tener servidor espejo de sus paquetes privados, entonces necesita instalar el paquete z3c.pypimirror.
Para instalar el paquete z3c.pypimirror, su instalación es muy simple, por eso estoy partiendo del principio de que tenemos instalado en el sistema los siguientes requerimientos:
Para los diversos casos de instalación es recomendable que instale ciertas dependencias en su sistema operativo como las que se muestran a continuación:
# aptitude install build-essential python-dev python-setuptools python-pip mercurial
Existen dos formas tradicionales de instalar el paquete:
La instalación asistida, utiliza configuraciones buildout, para ayudarle en la instalación, la configuración de tu propio repositorio PyPI de forma mas fácil y asistida debido a que automatiza las siguientes tareas por usted:
Para lograr esta instalación se debe ejecutar con los siguientes comando:
$ git clone https://github.com/macagua/macagua.buildout.pypimirror.git
$ virtualenv .
$ source ./bin/activate
$ python bootstrap.py
$ ./bin/buildout -vvvN
$ deactivate
Al finalizar estos comando debería tener los siguientes archivos:
Iniciar sincronización
Lo primero que de hacer es iniciar la sincronización de su repositorio espejo, ejecutando el siguiente comando:
$ ./bin/pypimirror --initial-fetch --follow-external-links --follow-external-index-pages --log-console ./pypimirror.cfg
Al finalizar estos comando debería tener los siguientes archivos:
Luego de terminar la sincronización del repositorio, genera en el directorio packages un archivo index.html como índice del repositorio de software, puede consultarlo localmente en su navegador web de preferencia.
$ firefox ./packages/index.html &
Sincronizar repositorio
Posteriormente una tarea programada con el programa crontab realizara la sincronización del repositorio para mantener actualizado el repositorio con los nuevos paquetes disponibles, usted puede verificar la tarea definida, con el siguiente comando:
$ crontab -l
Con la instalación manual del paquete Egg, usted requiere hacer manualmente las tareas descritas con la configuración buildout. A continuación se muestra dos formas como puede instalar el paquete:
Instalan con pip
Puede instalar el paquetes Egg de z3c.pypimirror con la herramienta pip, con el siguiente comando:
# pip install z3c.pypimirror
Instalando con easy_install
Puede instalar el paquetes Egg de z3c.pypimirror con la herramienta easy_install, con el siguiente comando:
# easy_install-2.4 z3c.pypimirror
Configuración
Después de ejecutar la instalación comando anterior, tenemos que configurar nuestro repositorio PyPI, para eso hay crear un usuario en el sistema llamado pypimirror es un criterio, en el directorio home de usuario pypimirror, es en donde pretendo centralizar los paquetes, archivos de registros (.log) y entre otros... entonces cree una carpeta el nombre de paquetes con el siguiente comando:
# mkdir -p /home/pypimirror/paquetes
Este será el directorio en donde iremos a mantener nuestros paquetes procedentes de PyPI, los archivos de registros (*.log) y temporales podemos mantenerlos en el directorio /home/pypimirror, ahora tenemos que crear el fichero de configuración, lo llamé pypimirror.cfg, tendrá la siguiente configuración:
[DEFAULT]
# the root folder of all mirrored packages.
# if necessary it will be created for you
mirror_file_path = /home/pypimirror/paquetes
# where's your mirror on the net?
base_url = http://pypi.sudominio.com
# lock file to avoid duplicate runs of the mirror script
lock_file_name = /home/pypimirror/pypi-poll-access.lock
# Pattern for package files, only those matching will be mirrored
filename_matches =
*.zip
*.tgz
*.egg
*.tar.gz
*.tar.bz2
# Pattern for package names; only packages having matching names will
# be mirrored
package_matches =
# zope.*
# plone.*
# Products.*
# collective.*
*.*
# remove packages not on pypi (or externals) anymore
cleanup = True
# create index.html files
create_indexes = True
# be more verbose
verbose = True
# resolve download_url links on pypi which point to files and download
# the files from there (if they match filename_matches).
# The filename and filesize (from the download header) are used
# to find out if the file is already on the mirror. Not all servers
# support the content-length header, so be prepared to download
# a lot of data on each mirror update.
# This is highly experimental and shouldn't be used right now.
#
# NOTE: This option should only be set to True if package_matches is not
# set to '*' - otherwise you will mirror a huge amount of data. BE CAREFUL
# using this option!!!
external_links = False
# similar to 'external_links' but also follows an index page if no
# download links are available on the referenced download_url page
# of a given package.
#
# NOTE: This option should only be set to True if package_matches is not
# set to '*' - otherwise you will mirror a huge amount of data. BE CAREFUL
# using this option!!!
follow_external_index_pages = False
# logfile
log_filename = /home/pypimirror/pypimirror.log
Esta configuración, es una copia del archivo pypimirror.cfg.sample localizado por ejemplo en la ruta $PYTHON/site-packages/z3c.pypimirror-1.0.14-py2.4.egg/z3c/pypimirror, un detalle importante durante la configuración es que en la variable package_matches, se indique para descargar los espacios de nombre de paquetes zope, plone, Products y collective, de siendo así mismo el propio paquete z3c.pypimirror lo cual de esta forma estaría siendo descartado, a sí que para conseguir cualquier paquete desde PyPI, usted puede comentar las lineas y decir como se muestra a continuación:
package_matches =
# zope.*
# plone.*
# Products.*
# collective.*
*.*
Iniciar sincronización
Ahora que tenemos nuestro repositorio PyPI debidamente configurado, para iniciar la replicación del repositorio de PyPI, ejecute el siguiente comando:
$ /usr/bin/pypimirror --initial-fetch --follow-external-links --follow-external-index-pages /home/pypimirror/pypimirror.cfg
Puedes supervisar los avances analizando el logfile de z3c.pypimirror:
$ tail -f /home/pypimirror/pypimirror.log
Cabe resaltar que NO es necesario preocuparse en crear la página índice como el archivo index.html, para el servidor Web, porque en el archivo de configuración anterior, le estamos indicado que este será creado automáticamente (create_indexes = True).
Sincronizar repositorio
Usted automatizar la sincronización de los paquetes adicionando una tarea en el crontab del sistema con la siguiente linea:
$ crontab -e
y entonces agregue la siguiente linea:
*/6 * * * * pypimirror /usr/bin/pypimirror --update-fetch --follow-external-links --follow-external-index-pages /home/pypimirror/pypimirror.cfg
Luego de haber replicado localmente su repositorio PyPI en su servidor, usted debe configurar un virtual host en un servidor Web para publicar su repositorio previamente replicado.
Opcionalmente si usted utiliza un Nginx Web Server debe crear un sitio disponible, con el siguiente comando:
# vim /etc/nginx/sites-available/pypimirror
y entonces agrega la siguiente configuración:
server {
listen IP-ADDRESS;
server_name MIDOMINIO.TLD/pypi;
location /pypi {
root /home/pypimirror/paquetes;
}
}
Realice un enlace simbólico desde el directorio de Nginx sites-available/ al directorio sites-enabled/, para que su configuración previa este disponible:
# ln -s /etc/nginx/sites-available/pypimirror /etc/nginx/sites-enabled/pypimirror
Para finalizar debe carga de la nueva configuración, con el siguiente comando:
# /etc/init.d/nginx reload
Mientras se sincroniza el repositorio, usted puede configurar su servidor Web, por ejemplo, Apache Web Server debe crear un sitio disponible con el siguiente comando:
# vim /etc/apache2/sites-available/pypimirror
Debe indicarle en su directiva DocumentRoot, que apunte hacia el directorio directorio, y entonces agrega la siguiente configuración:
<VirtualHost IP-ADDRESS:80>
ServerName MIDOMINIO.TLD
CustomLog /home/pypimirror/pypimirror.log combined
DocumentRoot /home/pypimirror/paquetes
</VirtualHost>
Realice un enlace simbólico desde el directorio de Apache2 sites-available/ al directorio sites-enabled/, para que su configuración previa este disponible:
# ln -s /etc/apache2/sites-available/pypimirror /etc/apache2/sites-enabled/pypimirror
Luego debe habilitar esta configuración del sitio llamado pypimirror, con el siguiente comando:
# a2ensite pypimirror
Y por ultimo recargamos la configuración en el servicio de apache2, con el siguiente comando:
# /etc/init.d/apache2 reload
Posterior a su instalación / configuración ya puede usar el repositorio previamente instalado, para esto existen varias formas de utilizarlo según sea su caso como se describen a continuación:
Si usted necesita usar la herramienta pip es posible especificar el servidor de donde usted desea bajar el paquete, con lo muestra el siguiente comando:
pip install -i http://sudominio.com/pypi Sphinx
Opcionalmente con la herramienta easy_install del SetupTools usted puede especificar el servidor de donde usted desea bajar el paquete, con lo muestra el siguiente comando:
easy_install -i http://sudominio.com/pypi Sphinx
Después de que todo este hecho, usted solo necesita decir en su archivo de configuraciones locales buildout ~/.buildout/default.cfg (si no esta creado créalo o edite un archivo) cual es la dirección HTTP del repositorio por defecto (el que previamente configuro) de donde debería buscar y descargase los paquetes y coloque lo siguiente:
[buildout]
index = http://sudominio.com/pypi
Guarde los cambios y ahora de esta forma cada ves que se ejecuta buildout busca inicialmente este repositorio ;-)
Puede descargar el código fuente este ejemplo de configuración, ejecute el siguiente comando:
$ git clone https://github.com/macagua/macagua.buildout.pypimirror.git
Agradecimientos Cleber J Santos de la empresa Simples Consultoria por escribir inicialmente este tutorial en Portugués, y a los compañeros Dhionel Diaz y Leonardo J. Caballero G. de la fundación CENDITEL, por traducir al Español y poner en practica z3c.pypimirror con el cual crearon esta completa receta :D
El código fuente de este archivo esta hospedado en GitHub. Todos pueden actualizar y corregir errores en este documento con unos clic - sin necesidad de descargar.
Para mas información básica acerca de como actualizar este manual y referencia a sintaxis Sphinx, por favor consulte la guía Escribiendo y actualizando el manual.