Creando su propio repositorio de Pypi

Republicado de www.coactivate.org

 

Creando su propio repositorio de Pypi

Este manual intenta ayudar a como implementar un espejo (mirror) de Pypi para local en tu organización.

Instalando z3c.pypimirror

Para esto, se utiliza el paquete z3c.pypimirror, que es un módulo para la construcción de un espejo PyPI, su instalación es muy simple, por eso estoy partiendo del principio de que tenemos instalado en el sistema una versión de Python 2.4 o superior + setuptools, también debemos disponer al menos 15GB de espacio libre para los paquetes, a continuación se muestra como puede instalar el paquete, con el siguiente ­comando: 


­

# easy_install-2.4 z3c.pypimirror

Opcionalmente con la herramienta pip, con el siguiente ­comando:

# pip install z3c.pypimirror

Después de ejecutar el 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

Configurando z3c.pypimirror

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 en $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, así 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.*
   *.*

Ahora que tenemos nuestro repositorio Pypi debidamente configurado, para iniciar la replicacón del repositorio de PYP, ejecute el siguiente comando:

$ /usr/bin/pypimirror --initial-fetch --follow-external-links --follow-external-index-pages /home/pypimirror/pypimirror.cfg

Puedes supervisar los avances analiazndo 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).

Configurando z3c.pypimirror y 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

Configurando z3c.pypimirror y 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 comand:

# /etc/init.d/nginx reload
 

Programar actualizaciones de z3c.pypimirror y crontab

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


Usando z3c.pypimirror y buidlout

Después de que todo este hecho, usted solo necesita decir en su archivo de configuración buildout (buildout.cfg) cual es la dirección HTTP del repositorio (que estamos configurando) de donde debería buscar y descargase los paquetes:

[buildout]
index =  http://pypi.sudominio.com
...

Guarde los cambios y ahora de esta forma cada ves que se ejecuta buildout busca inicialente este repositiorio ;)

Usando z3c.pypimirror y easy_install

Si usted necesita usar 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://pypi.sudominio.com mipaquete

­

Usando z3c.pypimirror y pip

Opcionalmente con 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://pypi.sudominio.com mipaquete

Reconocimientos

Agradecimientos Cleber J Santos de la empresa Simples Consultoria por escribir inicialmente este tutorial en Portugues, 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


Ver tambien


    Referencias

    Comentários