2010-07-12 4 views
7

J'ai lu this question et je pense que c'est un bon début, mais je cherche plus de perspicacité.Comment distribuer Python/Django App via RPM

J'ai écrit une application en utilisant Python 2.6 et Django 1.2.1. Je voudrais déployer cette application sur un système sur lequel Python 2.6 ou Django n'est pas installé. Le système lui-même n'a pas beaucoup de choses installées - sqlite3, pysqlite2, gcc, etc. Cependant, le système a Python 2.4.3. Quelle serait la manière la plus saine de créer des RPM de Python 2.6, Django et mon application (une application Django standard) afin que chacun puisse être installé séparément pour permettre des mises à niveau de différents composants? Je ne sais pas grand-chose sur la création de RPM source, mais je soupçonne qu'il s'agit d'informations facilement disponibles. S'il y a des ressources particulièrement bonnes pour créer des RPM source, je les apprécierais aussi.

Le système est ESX 4 Update 1, si cela est important.

Merci!

MISE À JOUR: Il me aussi n'a jamais eu que la distribution des oeufs Python ou même en utilisant setup.py est une solution viable pour la distribution de contenu. Je serais intéressé à entendre parler de ça aussi.

Répondre

3

Les paquets Python sont normalement distribués avec setuptools/distribute. Généralement, vous pouvez installer chaque paquet python (et ses dépendances) avec easy_install <package_name> (éventuellement avec un numéro de version spécifique). Je vous recommande d'utiliser setuptools comme notre méthode de distribution primaire, parce que:

  • cela fonctionne sur toutes les plateformes
  • est le meilleur moyen pour les paquets Python en général
  • .rpm ou .deb scripts d'installation peuvent réutiliser parties de trop
  • vous pouvez installer ces paquets à l'intérieur d'un virtualenv sans avoir besoin des privilèges root, sans conflit du reste des applications Web installées sur le serveur

Une bonne ressource pour vous de lire est Deploying with Distribute. Il se concentre sur Flask (un autre framework web), mais le simple remplacement de "Flask" par "Django" fera l'affaire :)

Un autre outil Python idéal pour distribuer et déployer des choses est fabric, que vous pouvez utiliser en plus distribuer (ou sans, comme vous voulez). Avec le fabric vous pouvez par exemple, bootstrap et installer votre application (dépendances inclusives) sur N serveurs à la fois, gérer plusieurs serveurs de développement, de test et de production et les mettre à jour simultanément avec une seule commande.

Cet article pourrait vous aider à démarrer avec du tissu: Deploying with Fabric

Et en plus, je voudrais aussi vous recommander de publier votre dépôt (ou en miroir un existant) sur github ou bitbucket pour les personnes qui veulent obtenir la dernière sources manuellement et installez votre application avec python setup.py install ensuite. Le script d'installation setup.py fait partie de distribution que j'ai déjà mentionné.

+0

Comment exécuter mon serveur manage.py? Où devrais-je le spécifier? –

2

Il existe déjà des RPM de python 2.6 et de django - donc ceux-ci sont (relativement) faciles à saisir et à installer via RPM. Pour créer un RPM pour votre projet, écrivez quelques détails en utilisant Distutils, qui va dans les détails de ce dont vous avez besoin dans un fichier spec et ce que vous invoquez pour que cela se produise.

Il ya aussi une note sur la création de RPM à partir de python sur StackOverflow au Creating Python RPM qui a aussi une touche de détail. Par expérience, emballer python lui-même comme un RPM est le plus compliqué des bestioles, alors tirer parti de ce qui existe déjà est quelque chose que je recommande vivement. Pour quelques programmes où j'ai vu cela fait, nous avons un Makefile (ouais, old school) exécutez la commande setup.py bdist_rpm sur un serveur d'intégration continue, rendant le RPM disponible à la suite de cette compilation et immédiatement disponible sur le Serveur CI.

+0

La question consiste à créer un régime d'une application django vous vous développer non pas sur la création d'un régime de django –

4

En plus de tous les normales problèmes rencontrés lors de l'emballage du code Python, les projets Django ont quelques autres questions qui doivent être traitées:

  • Jouer agréable avec des pistes système
  • Jouer belle avec des installations du système
  • traductions de manutention
  • randomiser la clé secrète

j'ai dû résoudre ces problèmes d'emballage Transifex, et je vous recommande de enquêtez les différents bits qui ont mis en place afin de le faire fonctionner:

  • Installation sous /usr/share/<projectname>
  • Utilisez execfile() pour charger paramètres de /etc/<projectname>
  • l'énorme runaround manutention traduction
  • remplacement de la clé secrète dans le script de post-installation
  • Tous les autres changements sanglants et fudges qui ont été nécessaires
+0

Je ne voudrais pas installer une application web sous un chemin système, car vous pourriez avoir des problèmes avec des versions différentes en cours d'exécution ou des dépendances conflictuelles. De plus, la randomisation de la clé secrète doit être faite pendant la configuration et non lors de l'installation (création de plusieurs serveurs fonctionnant dans un cluster ...). – tux21b

+0

Si vous avez un cluster, alors vous allez utiliser un outil tel que marionnette pour le déployer de toute façon, donc ils finiront avec la même clé. Et être sous un chemin système est bien, car vous devez faire beaucoup d'efforts pour obtenir plus d'une version d'un paquet installé en premier lieu. –

3

Voir chapter 5 of the Python documentation. Il montrera comment faire face à l'utilitaire Python bdist. Avec lui, vous serez en mesure de générer des paquets (ou, comme il est dit, "construit la distribution") de plusieurs types, y compris RPM.

2

I've written up a blog post on how to use setuptools and it's bdist_rpm commande pour créer le RPM pour vous. Donc en effet, utilisez setuptools, mais en effet, distribuez votre application en tant que rpm. Il y a quelques captures et bizarre sous des choses documentées dans setuptools que vous pouvez utiliser pour finir dans un bon workflow.

La clé est que vous avez besoin d'un post script d'installation qui exécute vos migrations et recueille vos fichiers statiques, qui est lu après le régime est installé

export DJANGO_SETTINGS_MODULE=accountpage.settings 
mkdir -p /var/www/django/static && chown apache:apache /var/www/django/static 
runuser -m apache -c 'echo "yes" | django-admin collectstatic' 
django-admin migrate 
service httpd restart 

et vous pouvez dire setuptools d'ajouter ceci au fichier spec avant qu'il ne crée le régime en donnant cette option dans l'appel d'installation:

options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}},

Voir le lien ci-dessus pour un script setup.py travail complet, après l'installation de crochet, et un testsuite qui fonctionne avec python setup.py test qui va installer toutes vos dépendances localement, et lancer les tests django.

Pour avoir le régime aussi installer automatiquement est dépendances, créez un fichier setup.cfg qui indique bdist_rpm à ce sujet est dépendances

[bdist_rpm] 
requires = python >= 2.7 
      django >= 1.8 
      httpd 
      Django-Select2 >= 4.3.1 
      django-easy-select2 
      django-model-utils 
      pytz 
      django-oauth-toolkit 
+0

Le lien vers le blog est mort. – kkurian