Instalar y configurar repositorios espejos de PyPI

Este manual intenta ayudar a como implementar un servidor espejo (mirror) de paquetes Egg Python del servidor central PyPI localmente en su organización.

Repositorios de software

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.

Repositorio de PyPI

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:

¿Qué es z3c.pypimirror?

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:

  • Si esta trabajando con el framework de django, entonces puedes filtrar que namespaces de paquetes “django-*”, “Django-*”, etc; va a sincronizar localmente.
  • Si esta trabajando con el framework zope, entonces puedes filtrar que namespaces de paquetes “zope.*”, “z3c.*”, “zope*”, etc; va a sincronizar localmente.

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.

Requerimientos

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:

  • El interprete Python 2.4, 2.5, 2.6, 2.7 o superior.
  • Opcionalmente la herramienta virtualenv, si requiere hacer la instalación en un entorno virtual Python.
  • Los paquetes distribute / setuptools.
  • Disponer al menos 13 GB de espacio libre para los paquetes Egg.
  • Disponer de un servidor Web como Apache2 o Nginx para hacer publico su repositorio.
  • Habilidad de ejecutar un script vía tarea de crontab en el servidor.

Dependencias

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

Instalación

Existen dos formas tradicionales de instalar el paquete:

Asistida

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:

  • Instalar el paquete z3c.pypimirror dentro de un virtualenv.
  • Crear la estructura de directorio que contenga los paquetes a sincronizar.
  • Definir las configuraciones del paquete por defecto.
  • Genera un script para iniciar la sincronización de repositorio.
  • Establecer una tarea programada que actualice el repositorio.

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:

buildout.cfg
Archivo de configuración buildout con todas las tareas de construcción del repositorio espejo.
pypimirror.cfg
Archivo de configuraciones del paquete z3c.pypimirror.
bin/activate
Script de activación de la herramienta virtualenv.
bin/buildout
Script buildout.
bin/pypimirror
Script de sincronización del paquete z3c.pypimirror.
packages
El directorio que contendrá los paquetes Egg que sincronice en su repositorio espejo.

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:

pypimirror.log
Archivo log del paquete z3c.pypimirror.
packages/index.html
El índice de paquetes sincronizado generado dentro del directorio packages que a su ves contendrá todos los paquetes sincronizados en su repositorio espejo.

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

Manual

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

Publicar repositorio

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.

Nginx Web Server

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

Apache Web Server

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

Usando repositorio

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:

Usando pip

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

Usando easy_install

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

Usando buildout

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 ;-)

Descargar código

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

Reconocimientos

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

los comentarios son proporcionados por Disqus

Editar este documento

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.

  1. Vaya hacia el articulo Instalar y configurar repositorios espejos de PyPI en GitHub.
  2. Presione el botón Fork. Este creara su propia copia personal de la documentación.
  3. Edite los archivos usando el editor de texto de GitHub desde su navegador Web
  4. Rellene en la caja de texto Commit message al final de la pagina indicando por que usted realizo estos cambios. Presione el botón Propose file change próximo a ese cuando haya finalizado.
  5. Luego diríjase a la página Send a pull request (no será necesario rellenar ningún texto adicional). Sólo tiene que pulsar el botón Send pull request.
  6. Sus cambios serán consultados por un revisor dentro de la pestaña Pull requests del proyecto en Github.

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.