From 233a43dd68c315aea0be85e889216ae6ad96d63b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Sat, 29 Dec 2012 14:03:08 +0100 Subject: [PATCH] status board --- content/images/status_board.png | Bin 0 -> 31205 bytes content/python/status.rst | 123 ++++++++++++++++++++++++++++++++ theme/static/css/main.css | 4 +- 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 content/images/status_board.png create mode 100644 content/python/status.rst diff --git a/content/images/status_board.png b/content/images/status_board.png new file mode 100644 index 0000000000000000000000000000000000000000..f092225b831dda1c6e4783d6531aea66bafc8c6c GIT binary patch literal 31205 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 Y=7>T!$?q!G-@7L%DkoATr2pxE0lv6NCjbBd literal 0 HcmV?d00001 diff --git a/content/python/status.rst b/content/python/status.rst new file mode 100644 index 0000000..1ad0876 --- /dev/null +++ b/content/python/status.rst @@ -0,0 +1,123 @@ +Status board +############ + +:date: 29-12-2012 +:lang: fr + +À force de démarrer des services web pour un oui et pour un non, de proposer +à des copains d'héberger leurs sites, de faire pareil pour quelques assos etc, +je me suis retrouvé avec, comme dirait l'autre, *une bonne platrée* de sites et +de services à gérer sur `lolnet.org`, mon serveur. + +Jusqu'à très récemment, rien de tout ça n'était sauvegardé, et non plus monitoré. +Après quelques recherches, je suis tombé sur `stashboard +`_, un "status board" qu'il est bien fait. Le seul +problème, c'est écrit pour se lancer sur GAE, *Google App Engine*. +Heureusement, c'est open-source, et ça a été forké pour donner naissance +à `whiskerboard `_ (la planche +moustachue, pour les non anglophones). + +.. image:: |filename|/images/status_board.png + +Vérifier le statut des services +=============================== + +Donc, c'est chouette, c'est facile à installer, tout ça, mais… mais ça ne fait +en fait pas ce que je veux: ça ne fait que m'afficher le statut des services, +mais ça ne vérifie pas que tout est bien "up". + +Bon, un peu embêtant pour moi, parce que c'est vraiment ça que je voulais. Pas +grave, je sais un peu coder, autant que ça serve. J'ai ajouté quelques +fonctionnalités au soft, qui sont disponibles sur mon fork, sur +github:: https://github.com/ametaireau/whiskerboard . + +Entres autres, il est désormais possible de lancer `celery +`_ en tache de fond et de vérifier périodiquement +que les services sont toujours bien vivants, en utilisant une tache spécifique. + +C'était un bonheur de développer ça (on a fait ça à deux, avec guillaume, avec +un mumble + tmux en pair prog, en une petite soirée, ça dépote). + +Les modifications sont assez simples, vous pouvez aller jeter un œil aux +changements ici: +https://github.com/ametaireau/whiskerboard/compare/b539337416...master + +En gros: + +- ajout d'une `connection_string` aux services (de la forme + protocol://host:port) +- ajout d'une commande `check_status` qui s'occupe d'itérer sur les services et + de lancer des taches celery qui vont bien, en fonction du protocole +- ajout des taches en question + +Déploiement +=========== + +Le plus long a été de le déployer en fin de compte, parce que je ne voulais pas +déployer mon service de supervision sur mon serveur, forcément. + +Après un essai (plutôt rapide en fait) sur `heroku `_, je me +suis rendu compte qu'il me fallait payer pas loin de 35$ par mois pour avoir un +process `celeryd` qui tourne, donc j'ai un peu cherché ailleurs, pour +finalement déployer la chose chez `alwaysdata `_ + +Après quelques péripéties, j'ai réussi à faire tourner le tout, ça à été un peu +la bataille au départ pour installer virtualenv (j'ai du faire des changements +dans mon `PATH` pour que ça puisse marcher), voici mon `.bash_profile`:: + + export PYTHONPATH=~/modules/ + export PATH=$HOME/modules/bin:$HOME/modules/:$PATH + +Et après y'a plus qu'à installer avec `easy_install`:: + + easy_install --install-dir ~/modules -U pip + easy_install --install-dir ~/modules -U virtualenv + +Et à créer le virtualenv:: + + virtualenv venv + venv/bin/pip install -r requirements.txt + +Dernière étape, la création d'un fichier `application.wsgi` qui s'occupe de +rendre l'application disponible, avec le bon venv: + +.. code-block :: python + + import os + import sys + + activate_this = '/home/lolnet/venv/bin/activate_this. + execfile(activate_this, dict(__file__=activate_this)) + + paths = ['/home/lolnet/public',] + + for path in paths: + if path not in sys.path: + sys.path.append(path) + + import django.core.handlers.wsgi + os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' + application = django.core.handlers.wsgi.WSGIHandler() + +SSL et Requests +=============== + +Quelques tours de manivelle plus loin, j'ai un celeryd qui tourne et qui +consomme les taches qui lui sont envoyées (pour des questions de simplicité, +j'ai utilisé le backend `django` de celery, donc pas besoin d'AMQP, par +exemple). + +Problème, les ressources que je vérifie en SSL (HTTPS) me jettent. Je sais pas +exactement pourquoi à l'heure qu'il est, mais il semble que lorsque je fais une +requête avec `Requests `_ je me +récupère des *Connection Refused*. Peut être une sombre histoire de proxy ? En +attendant, les appels avec `CURL` fonctionnent, donc j'ai fait `un fallback +vers CURL lorsque les autres méthodes échouent +`_. +Pas super propre, mais ça fonctionne. + +Et voilà +======== + +Finalement, j'ai mon joli status-board qui tourne à merveille sur +http://status.lolnet.org :-) diff --git a/theme/static/css/main.css b/theme/static/css/main.css index bb7f4e8..07f48d9 100644 --- a/theme/static/css/main.css +++ b/theme/static/css/main.css @@ -51,7 +51,7 @@ hr { border: 2px solid #EEEEEE; } /* Anchors */ a {outline: 0;} a img {border: 0px; text-decoration: none;} -.body a:link, .body a:visited { +article a:link, article a:visited { border-radius: 5px 5px 5px 5px; padding: 0px 5px; background-color: rgb(234, 234, 234); @@ -59,7 +59,7 @@ a img {border: 0px; text-decoration: none;} text-decoration: none; } -.body a:hover, .body a:active { +article a:hover, article a:active { color: #fff; background-color: #000; }