Creare un mirror di Pypi
Propositi
Lo scopo della ricetta è la creazione di un repository costantemente aggiornato che sia speculare a pypi.python.org
Come procedere
Per creare un mirror di pypi il primo passo da effettuare è l'installazione del prodotto z3c.pypimirror. Per far ciò, su una console digitate:
$ sudo easy_install-2.4 z3c.pypimirror
Se vi trovate su una macchina Ubuntu Linux la egg verrà installata in /usr/lib/python2.4/site-packages/z3c.pypimirror-1.0.15.1-py2.4.egg/z3c/pypimirror/ dove è presente il file pypimirror.cfg.sample. Ora vi consiglio di copiare il file nella directory /etc e di rinominarlo come segue:
$ sudo cp /usr/lib/python2.4/site-packages/z3c.pypimirror-1.0.15.1-py2.4.egg/z3c/pypimirror/pypimirror.cfg.sample /etc/pypimirror.cfg
Ora dovreste creare una directory per il repository con un comando simile al seguente:
$ sudo mkdir /home/pypimirror $ sudo chown -R www-data:www-data /home/pypimirror $ sudo touch /var/log/pypimirror.log $ sudo chown www-data:www-data /var/log/pypimirror.log
Le modifiche del proprietario dei file sono dovute al fatto che lo script di aggiornamento verrà avviato dall'utente www-data che gestisce anche l'esposizione della directory sul web.
Successivamente si deve modificare il file /etc/pypimirror.cfg così:
[DEFAULT]
mirror_file_path = /home/pypimirror
base_url = http://pypi.redomino.com/
lock_file_name = /home/pypimirror/pypi-poll-access.lock
filename_matches =
*.zip
*.tgz
*.egg
*.tar.gz
*.tar.bz2
package_matches =
*
cleanup = True
create_indexes = True
verbose = True
external_links = False
follow_external_index_pages = False
log_filename = /var/log/pypimirror.log
Analizziamo le varie righe: la prima sta ad indicare dove verrano posti i file del mirror, base_url indica l'indirizzo a cui risponderà il vostro server. La dichiarazione fondamentale è quella riguardante package_matches, che accetta le wildcard come zope.* plone.* per fare il mirror solo dei pacchetti Plone e Zope. Nel nostro caso invece vogliamo effettuare un mirror di tutto pypi e quindi indicheremo solo *. In questo caso è importantissimo che external_links e follow_external_index_pages siano impostate a False, altrimenti andrete a scaricare tutti i pacchetti di pypi in locale occupando diverse decine di GB di dati. Copiando i dati con la configurazione appena vista si andranno ad occupare circa 13GB.
Per esporre la directory sul web qui di seguito è riportato un file di esempio di apache:
<VirtualHost *> ServerAdmin webmaster@localhost ServerName pypi.redomino.com DocumentRoot /home/pypimirror/ <Directory /> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/pypi-error.log LogLevel warn CustomLog /var/log/apache2/pypi-access.log combined ServerSignature On </VirtualHost>
Ora non resta che avviare lo script per inizializzare il mirror.
$ sudo su -l www-data -c '/usr/bin/pypimirror -v --initial-fetch /etc/pypimirror.cfg'
Controllate sul file di log se non sono presenti errori, ad esempio digitando:
$ tail /var/log/pypimirror.log 2010-06-17 03:54:51,813 DEBUG Processing package cache_ensembl 2010-06-17 03:54:52,002 DEBUG Found: cache_ensembl-1.0.tar.gz 2010-06-17 03:55:14,151 DEBUG Statistics 2010-06-17 03:55:14,152 DEBUG ---------- 2010-06-17 03:55:14,152 DEBUG Found (cached): 4002 2010-06-17 03:55:14,152 DEBUG Stored (downloaded): 64 2010-06-17 03:55:14,152 DEBUG Not found (404): 0 2010-06-17 03:55:14,152 DEBUG Invalid packages: 0 2010-06-17 03:55:14,152 DEBUG Invalid URLs: 0 2010-06-17 03:55:14,152 DEBUG Runtime: 2m10s
Ed infine impostare uno script in cron che automatizzi le operazioni. Quindi create e modificate il file /etc/cron.d/pypimirror con il contenuto:
53 3 * * * www-data /usr/bin/pypimirror --update-fetch /etc/pypimirror.cfg
Che ogni mattina alle 3:53 aggiornerà il vostro mirror.
Utilizzare il mirror per i buildout
Nel vostro buildout.cfg dovrete inserire:
[buildout]
find-links =
http://dist.plone.org/release/3.3.5
http://dist.plone.org/thirdparty
http://pypi.redomino.com
Utilizzando così il vostro nuovo mirror di pypi.
È tutto!