Ce tutorial présente la marche à suivre pour déployer le CMS Plone 3 avec Buildout (Apache -> Varnish -> Zope -> Plone), le tout dans un environnement virtuel Python (VirtualEnv).

Plone est un système de gestion de contenu (CMS : Content Managment System) professionnel Open Source capable de rivaliser sans complexe avec tous les produits commerciaux du moment. Plone repose sur le serveur d’application Zope, développé avec le langage de programmation Python. Plone est sûrement la contribution la plus aboutie de la communauté Zope.

Passons aux choses sérieuses à présent ! En considérant qu’Apache est déjà installé sur le système, le déploiement permettra d’obtenir l’architecture suivante:

Convention pour les lignes de commande ou les extraits de code ("\" représentant un retour à la ligne factice nécessaire à la mise en page de cet article) :

zope@linux: cd /home/zope python virtualenv.py PROJECT 
\ --python=python2.4

Table des matières

Pré-requis systèmes

La procédure qui suit considère que vous avez déjà installé sur votre système:

  • Le serveur web Apache,
  • Un interpréteur Python 2.4 (disponible via la commande “python2.4”), ainsi que le paquet python-devel si vous installez Python depuis votre système de paquet. Taper la ligne de commande “python -V” pour connaître la version de Python installée par défaut sur votre système.
  • Les outils nécessaires à l’installation/compilation des logiciels et le traitement d’images JPG: make, gcc, libncurses5/libncurses5-dev (utile pour la compilation de Varnish), etc…, libjpeg, … (dépend de votre distribution).

La procédure considère également que vous avez créé un utilisateur “zope” qui sera responsable du lancement des services, ainsi que le groupe “zope” correspondant.

Installation du VirtualEnv

sbo@linux:  su - zope
zope@linux: export PROJECT=/home/zope/my_project
zope@linux: cd /home/zope
zope@linux: wget http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py
zope@linux: python virtualenv.py --python=python2.4 --no-site-packages my_project

Le script virtual_env.py créé $PROJECT/lib/python2.4/site-packages.

Il créé également l’exécutable python correspondant: $PROJECT/bin/python.

Il installe également Setuptools, et tout appel à $PROJECT/bin/easy_install installera les paquets dans l’environnement virtuel.

easy_install est un outil permettant d’obtenir des packages Python sur Cheese Shop
(PyPI, Python Package Index, egg repository).

zope@linux: cd $PROJECT
zope@linux: ./bin/python -V
Python 2.4.4
zope@linux: source bin/activate
(my_project)zope@linux: bin/easy_install ZopeSkel

ZopeSkel est une collection de PasteScript templates pour le développement avec Zope et Plone.

L’egg ZopeSkell est bien installé dans notre environnement (ex: $PROJECT/lib/python2.4/site-packages/ZopeSkel-2.10-py2.4.egg).

(my_project)zope@linux: bin/easy_install PasteScript

PasteScript est un outil permettant d’initialiser des applications à partir de templates prédéfinis (ex: créer un egg pour Plone 3).

L’egg PasteScript est bien installé dans notre environnement (ex: $PROJECT/lib/python2.4/site-packages/PasteScript-1.6.3-py2.4.egg)

Création de la structure du projet Plone 3

zope@linux: cd $PROJECT
zope@linux: source bin/activate
(my_project)zope@linux: bin/paster create -t plone3_buildout buildout
Enter zope2_install (Path to Zope 2 installation; leave blank to fetch one) ['']:
Enter plone_products_install (Path to directory containing Plone products; \
leave blank to fetch one) ['']:
Enter zope_user (Zope root admin user) ['admin']: admin
Enter zope_password (Zope root admin password) ['']: admin
Enter http_port (HTTP port) [8080]: 8080
Enter debug_mode (Should debug mode be "on" or "off"?) ['off']: off
Enter verbose_security (Should verbose security be "on" or "off"?) ['off']: off

Si nécessaire, modifier les droits du projet:

(my_project)zope@linux: sudo chown -R zope:zope buildout

Configurer le buildout selon ses besoins

Le fichier buildout responsable de la construction du projet se trouve dans ici : $PROJECT/buildout/buildout.cfg

Utilisez le buildout suivant, modifié pour ajouter le serveur de cache Varnish, FileSystemStorage, et quelques produits utiles (dont CacheFu pour l’amélioration de la gestion du cache Plone-Varnish) : buildout.cfg

zope@linux: cd $PROJECT
zope@linux: source bin/activate
(my_project)zope@linux:cd buildout
(my_project)zope@linux:mv buildout.cfg buildout.cfg.initial \
& wget http://www.asilax.fr/files/blog/2008/installer-plone-3-derriere-varnish-avec-buildout\
/buildout.cfg/at_download/file 
(my_project)zope@linux:mv ./file buildout.cfg

Téléchargez également le fichier de configuration Varnish (varnish.vcl) modifié spécifiquement pour une utilisation avec Zope/Plone. Le buildout se chargera de le placer où il faut ($PROJECT/buildout/parts/varnish-instance/).

(my_project)zope@linux: cd $PROJECT/buildout/
(my_project)zope@linux: wget http://www.asilax.fr/files/blog/2008/\
installer-plone-3-derriere-varnish-avec-buildout/varnish.vcl/at_download/file
(my_project)zope@linux: mv ./file varnish.vcl

Décrivons un peu les modifications apportées au buildout de base :

FileSystemStorage (fss)

[buildout]
parts =
    ...
    fss

...

[fss]
recipe = iw.recipe.fss
conf = ${instance:location}/etc/plone-filesystemstorage.conf
storages = www_monsite_com /monsite/www_monsite_com directory 

PIL (Python Imaging Library) & CacheFu

eggs =
    ...
    PILwoTk
    Products.CacheSetup==1.2

Correction des droits sur les fichiers installés (nécessaire en cas d’installation en root)

[buildout]
parts =
    ...
    chown

[chown]
# This recipe is used to set permissions -- and ownership for root mode installs
recipe = plone.recipe.command
command = chmod 600 .installed.cfg
command = chown -R ${instance:effective-user} ${buildout:directory}/parts

Configuration de l’instance Zope

[instance]
effective-user = zope
zodb-cache-size = 5000
event_log_level = ERROR
z_log_level = ERROR
debug-mode = off
verbose-security = off

Varnish

parts =
    ...
    varnish-build
    varnish-instance
    varnish-config
    ...

[varnish-instance]
recipe = plone.recipe.varnish:instance
bind = 127.0.0.1:8079
backends = 127.0.0.1:8080
cache-size = 100M

[varnish-build]
recipe = plone.recipe.varnish:build
url = http://puzzle.dl.sourceforge.net/sourceforge/varnish/varnish-1.1.2.tar.gz

[varnish-config]
# This recipe is used to replace the default varnish configuration file
recipe = plone.recipe.command
command = mv ./buildout/parts/varnish-instance/varnish.vcl \
./buildout/parts/varnish-instance/varnish.vcl.initial
command = cp ./varnish.vcl ./buildout/parts/varnish-instance/varnish.vcl

Lancer le buildout

zope@linux: cd $PROJECT
zope@linux: source bin/activate
(my_project)zope@linux: cd buildout
(my_project)zope@linux: ../bin/python bootstrap.py
(my_project)zope@linux: ../bin/python ./bin/buildout -v -c buildout.cfg > buildout.log

Pour voir ce que fait buildout, dans un autre terminal :

zope@linux: tail -f buildout.log

Lancer les services et tester son installation

Lancer Zope (port 8080) et Varnish (port 8079)

zope@linux: cd $PROJECT
zope@linux: source bin/activate
(my_project)zope@linux: cd buildout
(my_project)zope@linux: ./bin/instance start
(my_project)zope@linux: ./bin/varnish-instance

Tester la disponibilité du serveur Zope

  • En direct sur Zope pour vérifier que le serveur tourne bien (utilisez lynx si nécessaire): http://localhost:8080
  • Via Varnish (utilisez lynx si nécessaire): http://localhost:8079

Créer le site Plone

Ajouter un site plone à la racine de votre zope, en le nommant par exemple “monsite”.

Configurer Apache

Rajouter ceci dans votre le fichier de configuration d’Apache :

#
# Site http://www.monsite.fr
#

<VirtualHost www.monsite.fr:80>
  ServerName www.monsite.fr
  ServerAlias *.monsite.fr
  ServerAlias monsite.fr

  RewriteEngine on

  # On empêche le http://monsite.fr et les sous-domaines
  RewriteCond %{HTTP_HOST} ^monsite\.fr [NC]
  RewriteRule ^/(.*) http://www.monsite.fr/$1 [L,R=301]

  # www.monsite.fr -> réécriture d'URL vers le site Plone
  RewriteRule ^/(.*) http://localhost:8080/VirtualHostBase/\
http/www.monsite.fr:80/monsite/VirtualHostRoot/$1 [P,L]

  # Log
  CustomLog /var/log/apache/monsite_fr.log combined
</VirtualHost>

Liens & documentations