Catégories
Blog

Installation de Krita sous Ubuntu (non KDE)

Une petit billet « quick and dirty » entre deux lignes de code sur la prochaine version de Glances qui s’annonce dantesque, pour installer Krita, une alternative pas si improbable à Photoshop, sur votre machine Ubuntu Gnome ou Unity.

La preuve ? L’université de Paris 8 vient juste de migrer de Photoshop vers Krita pour sa section Art et technologie de l’image

J’ai un peu galérer avant d’avoir un logiciel complètement utilisable sur une machine non nativement KDE (comme mon Ubuntu Gnome Edition). Donc voici les commandes à saisir:

sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt-get update
sudo apt-get install krita kritasketch oxygen-icon-theme
kbuildsycoca4

Et hop, le résultat est là:

krita01.psd – Krita_273

Catégories
Blog

Glances 2.2 a besoin de vous

L’activité sur ce blog étant inversement proportionnelle à mon activité sur le logiciel Glances, vous pouvez, je l’espère, comprendre le peux d’activité sur ce site. Le développement de la future version 2.2 de Glances me prends les quelques temps libres qui me reste. Je fais donc appel à vous, chers lecteurs, pour m’aider à valider et trouver les derniers bugs dans cette version en cours de développement.

Quoi de neuf ?

La version 2.2 apportera, en plus de son lots de corrections de bugs les fonctionnalités suivantes:

  • un nouveau mode nommé « browser » (option –browser) permettant de superviser un ensemble de serveurs Glances ou SNMP à partir d’un point central
  • une vu en arbre pour les processus avec l’option –tree
  • amélioration de la fonction de tracé de graphique initialisé dans la version 2.1 de Glances
  • ajout du raccourci ‘F’ et de son option –fs-free-space pour afficher l’espace libre en lieu et place de l’espace utilisé
  • ajout du raccourci ‘2’ et de son option (–disable-left-sidebar) pour cacher la sidebar gauche et donc afficher tout l’espace du bas de l’écran avec les processus
  • ajout du raccourci ‘t’ pour trier les processus en fonction du temps CPU (« CPU times »)

C’est surtout sur la fonction « browser » que j’ai besoin de vous. En effet, je l’ai testé dans un environnement limité et je suis à la recherche d’administrateur système avec un bon petit parc de machines pour effectuer une validation plus complète.

Focus sur le mode browser

Ce nouveau mode permet donc de lancer Glances en tant que « super » client qui va afficher dans une première fenêtre la liste des serveurs Glances détectés sur son réseau ou configuré dans le fichier de configuration.

Sélection_251

Le mode de détection automatique repose sur le protocole Zeroconf qui fonctionne en client/serveur multicast. Il est nécessaire que les clients et les serveurs soit dans la version 2.2 de Glances (voir la procédure d’installation dans le chapitre suivant).

Remarque sur le protocole Zeroconf: Qui dit multicast, dit une détection uniquement sur le réseau local. En clair, votre « super » client Glances ne verra que les serveurs sur le même réseau Ethernet (à moins que vos routeurs ne soient compatibles avec le routage multicast).

En plus de ce mode dynamique (qui est bien sur désactivable à la fois coté client mais aussi coté serveur), il est possible de configurer une liste de serveurs dans le fichier de configuration de Glances (voir exemple ici).

Une fois la liste des serveurs affiché, il suffit de cliquer sur la touche ‘ENTER’ pour visualiser les statistiques de la machine (en clair, lancer le client Glances classique sur le serveur sélectionné).

Ce nouveau mode, très demandé par les utilisateur est en phase de développement et est susceptible d’évoluer dans les prochaines versions. Je suis d’ailleurs à l’écoute de vos remarques sur cette fonction.

Comment tester la version 2.2 de Glances ?

Je vous propose de simplement lire le Wiki officiel (en cliquant ici) qui va vous guider pour installer cette version de développement (bêta) sur vos machines sans « casser » le Glances existant.

D’avance merci !

PS: faite tourner le billet 🙂

Catégories
Blog Open-source Systeme vitualisation

Varnish, NGinx et PHP-FPM sous Docker

Suite au précédent article d’introduction sur Docker (que je vous conseille de lire avant de dévorer cet article), je me suis penché sur le problème suivant: comment créer et maintenir une « stack web » de compétition (Varnish + Nginx + PHP-FPM) basée sur cette technologie de virtualisation par conteneurs.

Quel est l’objectif ?

Nous allons donc, dans ce billet, détailler l’installation et la mise à jour d’une infrastructure, basée sur Docker, qui pourra servir à l’hébergement d’un site personnel, d’un blog ou bien du site d’une PME:

  • la base de donnée sera portée par l’implémentation libre de MySQL, c’est à dire MariaDB (nous aborderons cette partie dans un deuxième billet)
  • pour le moteur PHP, j’utilise PHP-FPM
  • pour le serveur Web, je ne jure que par Nginx (léger, bien documenté)
  • afin pour tenir la charge (notamment si vous utilisé un moteur de blog de type WordPress, j’utilise le système de cache Varnish)LEMP (Docker)

Dans le reste de de l’article, on appellera machine hôte, la machine qui hébergera Docker (lire ce billet pour la procédure d’installation de Docker).

Cette dernière peut être un PC portable ou bien un serveur dédié. C’est un des avantages de la virtualisation par conteneurs. Une fois validé sur une machine , on est sûr que le conteneur fonctionnera de manière identique sur une autre installation de Docker. Ainsi pour la rédaction de ce billet, j’ai utiisé mon PC portable sous Ubuntu 14.04 et un (superbe) VPS mis à disposition par les amis de Web4All sous Debian 7 (merci Aurélien !).

Pour respecter la philosophie de la virtualisation par conteneur, chaque brique sera mise dans un conteneur dédié. On aura ainsi 4 conteneurs sur une machine hôte.

Chaque conteneur communiquera avec les autres selon le schéma ci-dessus.

Les données (data base DB, page statique du site et cache) seront stockées sur la machine hôte.

Création des conteneurs

Il y a deux méthodes pour choisie les images qui seront à la base de nos conteneurs.

La première, la plus noble mais la plus longue à mettre en œuvre, est d’écrire soit même les DockersFiles permettant l’installation et l’exécution des logiciels. On garde ainsi le contrôle de notre infrastructure et la possibilité de configurer finement les applications (notamment au niveau des options de compilation). Dans ce cas, et pour respecter les « best practices » de Docker, il faudra, pour chaque conteneur, repartir d’une image de base de type Debian sur laquelle on viendra installer les briques logicielles de notre LEMP.

La seconde, que j’ai choisi dans ce billet (pas parce-que je suis un gros fainéant mais par manque de temps), est de partir des images disponibles sur la registry officielle de Docker. On gagne ainsi en rapidité de mise en place.  Les composants de notre web stack étant très populaires, on trouve des images supportées et maintenues par la communauté Docker (notamment NGinx). Cependant, on constatera une trop grande diversité dans les systèmes de bases (Ubuntu, CentOS…).

Avant de commencer, nous allons créer un répertoire sur la machine hôte qui hébergera les fichiers utiles à notre infrastructure:

mkdir -p $HOME/data/webstack/conf $HOME/data/webstack/www

Le conteneur NGinx

Pierre angulaire de notre « web stack« , le serveur NGinx est très présent sur la « registry » officielle de Docker (plus de 900 images disponibles au moment de l’écriture de ce billet). J’ai choisi d’utiliser l’image officielle proposé par Docker (elle est conçue à partir de cete DockerFile).

On commence par télécharger les images NGinx officielle:

docker pull nginx

Puis on vérifie que les images sont visibles sur notre machine hôte (NGinx version 1.7.5 au moment de l’écriture de cet article):

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
nginx 1.7.5 d2d79aebd368 7 days ago 100.2 MB
nginx latest d2d79aebd368 7 days ago 100.2 MB
nginx 1 d2d79aebd368 7 days ago 100.2 MB
nginx 1.7 d2d79aebd368 7 days ago 100.2 MB

On lance le conteneur:

$ docker run --name webstack_nginx_1 -v $HOME/data/webstack/www:/usr/share/nginx/html:ro -p 8080:80 -d nginx
f7baa81cebdc8799947327e6470a74ae73fe73bb0eb644ecfb2951847c40154b

Notre conteneur a le doux nom de webstack_nginx_1, il redirige le port TCP/8080 de notre hôte vers le port TCP/80 du conteneur (port par défaut de NGinx) et il assigne, en lecture seule, le volume /usr/share/nginx/html au répertoire hôte $HOME/data/www (à adapter à votre configuration). Pour résumer, toutes les pages HTML disponible dans le répertoire /home/nicolargo/data/www, seront accessible via le port HTTP/8080 de votre machine locale.

On ajoute une page HTML statique de test et une autre pour le test PHP que l’on utilisera dans le chapitre suivant:

echo "My first page" > $HOME/data/webstack/www/index.html
echo "<?php phpinfo(); ?>" > $HOME/data/webstack/www/phpinfo.php

Puis on valide que le serveur NGinx est bien opérationnel:

$ curl http://localhost:8080
My first page

Ou directement depuis votre navigateur Web préféré:

Sélection_245L’image NGinx utilisée redirige les fichiers de log (access.log et error.log vert la sortie standard). Il est donc possible de visualiser les accès à son serveur Web en « attachant » le terminal de notre hôte à la sortie standard du conteneur:

$ docker attach --sig-proxy=false webstack_nginx_1
2014/10/08 13:47:59 [error] 9#0: *1 open() "/usr/share/nginx/html/inconnu.html" failed (2: No such file or directory), client: 172.17.0.103, server: localhost, request: "GET /inconnu.html HTTP/1.1", host: "localhost"
172.17.0.103 - - [08/Oct/2014:13:47:59 +0000] "GET /inconnu.html HTTP/1.1" 404 168 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:32.0) Gecko/20100101 Firefox/32.0" "172.17.42.1"

Note: bien penser à mettre l’option –sig-proxy=true sous peine de stopper le conteneur lors de l’appuie sur ^C. Je vous conseille  de créer un alias dans votre shell.

Le conteneur PHP-FPM

Pour le moteur PHP, il n’existe pas d’image officielle. Mon choix s’est donc porté vers l’utilisation du repository de Jprjr basée sur une installation de PHP-FPM sous ArchLinux avec pas mal d’extensions par défaut (voir la liste dans le DockerFile).

On télécharge la dernière version des images avec:

docker pull jprjr/php-fpm

On obtient bien:

$ docker images | grep jprjr
jprjr/php-fpm          latest                 d40698b35f83        6 weeks ago         347.8 MB

On lance le conteneur:

docker run --name webstack_php_01 -p 9000:9000 -d jprjr/php-fpm

Le conteneur est configuré par défaut pour écouter sur le port TCP/9000.

Très bien, on doit donc avoir le serveur NGinx et le moteur PHP-FPM qui sont lancés dans deux conteneurs différents. On va vérifier cela avec la commande:

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                           NAMES
e9dd04e7ceec        jprjr/php-fpm:latest   "php-fpm -F"           13 seconds ago      Up 12 seconds       0.0.0.0:9000->9000/tcp          webstack_php_01        
f7baa81cebdc        nginx:1                "nginx -g 'daemon of   46 minutes ago      Up 46 minutes       443/tcp, 0.0.0.0:8080->80/tcp   webstack_nginx_01

Faire communiquer les deux conteneurs (NGinx & PHP-FPM)

Tout cela est très beau mais les deux conteneurs ne se connaissent pas. Il faut, pour cela, configurer le serveur NGinx pour utiliser le moteur PHP et donc que le conteneur NGinx connaisse l’adresse IP du conteneur PHP-FPM.

Heureusement, Docker propose l’option –link permettant de répondre à ce besoin. Cette option, à utiliser au moment du lancement du conteneur, va créer dynamiquement des entrées dans le fichier host et dans des variables d’environnement du conteneur, permettant ainsi à ce dernier de connaître comment joindre ses congénères.

Par exemple:

$ docker run -it -v --link webstack_php_01:webstack_php nginx /bin/bash

root@2ce3cdb8a767:/# cat /etc/hosts | grep webstack
172.17.0.5	webstack-php

root@d9ff8a80f12a:/# env | grep WEBSTACK
WEBSTACK_PHP_PORT=tcp://172.17.0.5:9000
WEBSTACK_PHP_PORT_9000_TCP=tcp://172.17.0.5:9000
WEBSTACK_PHP_PORT_9000_TCP_ADDR=172.17.0.5
WEBSTACK_PHP_PORT_9000_TCP_PORT=9000
WEBSTACK_PHP_NAME=/webstack_nginx/webstack_php
WEBSTACK_PHP_PORT_9000_TCP_PROTO=tcp

root@2ce3cdb8a767:/# exit
exit

$ docker rm `docker ps -lq`

Maintenant que l’on sait comment faire communiquer les deux conteneurs, il suffit de configurer NGinx pour rediriger les fichier .PHP vers le moteur PHP-FPM du second conteneur.

Pour cela, plusieurs solutions sont là encore possibles. La plus simple est de surcharger la configuration NGinx par défaut(nginx.conf). Sur notre hôte, nous allons créer le fichier de configuration en question:

$ docker webstack_nginx_01/etc/nginx/nginx.conf $HOME/data/webstack/conf/nginx.conf

$ vi $HOME/data/webstack/conf/nginx.conf

daemon off;

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   /usr/share/nginx/html;
        #}

        # Pass PHP scripts to PHP-FPM
        location ~* \.php$ {
            fastcgi_index   index.php;
            fastcgi_pass    webstack_php:9000;
            #fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME    /srv/http$fastcgi_script_name;
            fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
        }    

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        location ~ /\.ht {
            deny  all;
        }
    }

}

Note:

  • « fastcgi_pass webstack_php:9000; » qui utilise donc le hostname présent dans le fichier host
  • « fastcgi_param   SCRIPT_FILENAME    /srv/http$fastcgi_script_name; » qui va permettre à PHP-FPM d’aller chercher les pages PHP dans le même volume que le serveur Nginx mais assigné au répertoire /srv/http du conteneur (c’est la configuration par défaut de notre conteneur PHP-FPM)

Revenons à notre cas. Nous souhaitons que le conteneur NGinx (nommé webstack_nginx_01) connaisse le conteneur PHP (webstack_php_01).

On commence donc par supprimer les deux conteneurs existant:

docker stop webstack_php_01 && docker rm webstack_php_01
docker stop webstack_nginx_01 && docker rm webstack_nginx_01

puis de les recréer avec l’option –link (pour le conteneur NGinx qui va initier la connexion TCP vers le moteur PHP-FPM), la nouvelle configuration de NGinx et les volumes pointant sur notre page HTML et PHP:

docker run --name webstack_php_01 -v $HOME/data/webstack/www:/srv/http:ro -p 9000:9000 -d jprjr/php-fpm
docker run --name webstack_nginx_01 -v $HOME/data/webstack/www:/usr/share/nginx/html:ro -v $HOME/data/webstack/conf/nginx.conf:/nginx.conf:ro -p 8080:80 --link webstack_php_01:webstack_php -d nginx nginx -c /nginx.conf

On teste:

$ curl http://localhost:8080/index.html
My first page

$ curl http://localhost:8080/phpinfo.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
...

Sélection_246

Bingo !

A ce stade, nous avons donc deux conteneurs communiquant entre eux pour nous offrir un serveur Web compatible avec le langage PHP.

Le conteneur Varnish en frontal

Si vous suivez ce blog, vous savez tout le bien que je pense de l’utilisation du cache Varnish pour absorber la montée en charge des sites Web (sinon, vous pouvez effectuer une session de rattrapage en lisant ces articles). Nous allons donc créer un nouveau conteneur qui exposera le port TCP/80 et qui mettra en cache les pages construites par le serveur NGinx (qui est en écoute sur le port TCP/8080 si vous avez bien suivi…).

Nous allons utiliser l’image Varnish mise à disposition et maintenue par le contributeur jacksoncage.

On commence par la récupérer:

docker pull jacksoncage/varnish

Puis on vérifie qu’elle est bien disponible sur notre hôte:

$ docker images | grep jacksoncage
jacksoncage/varnish    latest                 46f0ea7021c1        8 months ago        472.2 MB

Comme il est indiqué dans la documentation de l’image, il faut écrire le fichier de configuration par défaut de Varnish (le fichier default.vcl):

$ vi $HOME/data/webstack/conf/default.vcl

backend default {
    .host = "webstack_nginx";
    .port = "80";
}

On demande donc à Varnish d’aller directement communiquer avec le conteneur NGinx via l’adresse IP webstack-nginx (rappelez-vous que le hostname est créé dynamiquement par Docker au démarrage du conteneur avec l’option –link) et sur le port TCP 80 (attention, ce n’est pas le port TCP/8080 exposé par Docker sur notre hôte mais celui vraiment utilisé par NGinx dans le conteneur).

A noter que cette configuration est à compléter, notamment si vous voulez héberger un blog sous WordPress (des exemples de fichiers de configuration sont disponibles ici). Attentinon, ces exemples sont pour Varnish 4.0, donc à adapter si la version du conteneur jacksoncage/varnish n’est pas en ligne.

Puis lancer le conteneur avec les options suivantes:

docker run --name webstack_varnish_01 -v $HOME/data/webstack/conf/default.vcl:/etc/varnish/default.vcl:ro -p 80:80 --link webstack_nginx_01:webstack_nginx -d jacksoncage/varnish

On redirige le port 80 du conteneur vers le port 80 de votre hôte (il ne doit bien sûr pas y avoir de serveur Web déjà en écoute sur ce port) puis on fait le lien entre le conteneur Varnish et le conteneur NGinx.

On vérifie que nos trois conteneurs sont lancés:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                           NAMES
a1b853f1a38e        jacksoncage/varnish:latest   "/start"               4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp              webstack_varnish_01                                                                        
c2bd3138864a        nginx:1                      "nginx -c /nginx.con   54 minutes ago      Up 54 minutes       443/tcp, 0.0.0.0:8080->80/tcp   webstack_nginx_01,webstack_varnish_01/webstack-nginx                                          
7cc072bb0df2        jprjr/php-fpm:latest         "php-fpm -F"           54 minutes ago      Up 54 minutes       0.0.0.0:9000->9000/tcp          ...

Et on teste notre serveur de cache Varnish:

$ curl -I http://localhost/index.html

HTTP/1.1 200 OK
Server: nginx/1.7.5
Content-Type: text/html
Last-Modified: Sat, 04 Oct 2014 16:30:45 GMT
ETag: "543020b5-15"
Content-Length: 21
Accept-Ranges: bytes
Date: Sun, 05 Oct 2014 15:26:47 GMT
X-Varnish: 320901887 320901884
Age: 46
Via: 1.1 varnish
Connection: keep-aliv

Le « Via: 1.1 varnish » confirme que notre infra commence à avoir de la gueule :).

En aparté, on peut d’ailleurs juger de la puissance de Varnish en lançant un simple bench tout d’abord directement sur le serveur NGinx (donc en baille-passant Varnish):

$ ab -t 30 -c 5 http://localhost:8080/

Complete requests:      7107
Requests per second:    232.24 [#/sec] (mean)
Time per request:       21.529 [ms] (mean)
Time per request:       4.306 [ms] (mean, across all concurrent requests)

Puis en faisant le même test en passant par Varnish:

$ ab -t 30 -c 5 http://localhost/

Complete requests:      50000
Requests per second:    3694.60 [#/sec] (mean)
Time per request:       1.353 [ms] (mean)
Time per request:       0.271 [ms] (mean, across all concurrent requests)

Les chiffres parlent d’eux même…

Gestion des conteneurs

Un simple pull sur les images préalablement téléchargé s’occupera de leurs mises à jour:

docker pull nginx
docker pull jprjr/php-fpm
docker pull jacksoncage/varnish

Comme l’on reconstruit notre infrastructure à partir de ces images, il suffira ensuite d’arrêter et de relancer les conteneurs:

docker stop webstack_varnish_01 && docker rm webstack_varnish_01
docker stop webstack_nginx_01 && docker rm webstack_nginx_01
docker stop webstack_php_01 && docker rm webstack_php_01

docker run --name webstack_php_01 -v $HOME/data/webstack/www:/srv/http:ro -p 9000:9000 -d jprjr/php-fpm
docker run --name webstack_nginx_01 -v $HOME/data/webstack/www:/usr/share/nginx/html:ro -v $HOME/data/webstack/conf/nginx.conf:/nginx.conf:ro -p 8080:80 --link webstack_php_01:webstack_php -d nginx nginx -c /nginx.conf
docker run --name webstack_varnish_01 -v $HOME/data/webstack/conf/default.vcl:/etc/varnish/default.vcl:ro -p 80:80 --link webstack_nginx_01:webstack_nginx -d jacksoncage/varnish

Note: Il est également possible de créer des images maison (avec commit + tag) et de les relancer. Cette phase peut être utile dans le cadre d’un déploiement d’une infrastructure à une autre.

Orchestration de l’infrastructure

On vient de voir que le lancement d’une infrastructure basée sur Docker peut rapidement devenir compliqué. Les conteneurs doivent être lancés dans un certain ordre, avec des options spécifiques. Il est toujours possible de scripter les commandes du chapitre précédent ou plus simplement d’utiliser un outil d’orchestration.

Vagrant vous vient en tête ? Pourtant, ce n’est pas la solution que nous allons utiliser dans ce billet.

Nous allons nous tourner vers docker-compose (anciennement Fig). C’est un logiciel en ligne de commande permettant de d’écrire son infrastructure Docker à partir d’un fichier de configuration texte au format YAML.

L’installation de Fig se fait via la commande:

sudo pip install docker-compose

Note: pour d’autre méthode d’installation, consultez la documentation sur le site officiel.

Le fichier de configuration Fig correspondant à notre infrastructure est le suivant (à éditer dans le fichier $HOME/data/webstack/docker-compose.yml):

# Webstack PHP
php:
    image: jprjr/php-fpm
    volumes:
    - www:/srv/http
    ports:
    - 9000:9000
# Webstack NGINX
nginx:
    image: nginx
    links:
    - php:webstack_php
    volumes:
    - www:/usr/share/nginx/html
    - conf/nginx.conf:/nginx.conf
    ports:
    - 8080:80
    command: nginx -c /nginx.conf
# Webstack VARNISH
varnish:
    image: jacksoncage/varnish
    links:
    - nginx:webstack_nginx
    volumes:
    - conf/default.vcl:/etc/varnish/default.vcl
    ports:
    - 80:80

On lance ensuite notre infrastructure en une seule et unique commande:

$ docker-compose up -d
Creating webstack_php_1...
Creating webstack_nginx_1...
Creating webstack_varnish_1...

Tout comme avec la ligne de commande Docker, on peut voir les conteneurs en cours d’exécution:

$ docker-compose ps
       Name                Command          State           Ports         
-------------------------------------------------------------------------
webstack_php_1                              Up      9000->9000/tcp        
webstack_nginx_1     nginx -c /nginx.conf   Up      443/tcp, 8080->80/tcp 
webstack_varnish_1   /start                 Up      80->80/tcp

Les arrêter (sans les supprimer):

$ docker-compose stop
Stopping webstack_varnish_1...
Stopping webstack_nginx_1...
Stopping webstack_php_1...

Les relancer:

$ docker-compose start
Starting webstack_php_1...
Starting webstack_nginx_1...
Starting webstack_varnish_1...

Les supprimer:

docker-compose stop && docker-compose rm

Je vous laisse découvrir les autres commandes de docker-compose sur le site officiel de la documentation.

Conclusion

Nous venons de créer les bases d’une infrastructure Web performante, facilement maintenable et évolutive. Il est ainsi facile d’y ajouter d’autres services comme une base de donnée (type MariaDB), un serveur sFTP (pour la mise à jour des pages Web) ou bien encore un outil d’analyse des logs (Varnish et NGinx).

Et de votre coté, avez-vous mis en place une infrastructure Docker pour votre serveur Web ? Si oui comment ?

Partagez votre expérience avec nous !

Catégories
Blog Developpement Open-source Reseau Systeme Web

Un sacré programme pour les SophiaConf 2014

Cette année encore, la Telecom Valley nous gâte avec une série de 4 soirées de conférences accessible gratuitement sur le campus SophiaTech à Sophia-Antipolis (06).

capture_170

Lundi 30/06

Internet Of Things/ M2M / Do It Yourself 

Mardi 01/07

Big data, No SQL, BI et sécurité du cloud

Mercredi 02/07 

Web Sémantique : de la recherche à l’usage – enfin?

Jeudi 03/07

Nouvelles tendances de développement web 

Lieux Campus SophiaTech Campus SophiaTech Campus SophiaTech Campus SophiaTech
Horaires Accueil à 17h45

18h00 – 20h00

Accueil à 17h45

18h00 – 20h00

Accueil à 17h45

18h00 – 20h00

Accueil à 17h45

18h00 – 20h00

Intervenants 

Pascal BODIN
(Orange)

Alexis MOUSSINE-POUCHKINE Google
(à confirmer)

Alexandru CARACAS
(IBM Zurich)

Jean DEMARTINI
(Demtech)

Benjamin CABE
(Fondation Eclipse)

Julien HOLTZER (Pobot)

 

 

Didier GIRARD (SFEIR, Google Developer Expert)

Aurélien GOUJET (MapR)

Edmond CISSE
(Uraeus Consult)

Cyril GROSJEAN 
(Janua)

Aurélien MAZOYER
(France Labs)

Olivier TAVARD
(France Labs)

Julien MARECHAL 
(Air France)

Jérémy MEYER
(Amadeus)

 

Fabien GANDON 
(Inria)

Christophe DESCLAUX
(Reador)

Mylène LEITZELMAN
(Mnemotix)

Laurent BIHANIC
(Atos)

Guillaume VILAND

(Orange Portail)

Alexis MOUSSINE-POUCHKINE
(Google europe)

Bertrand LAPORTE
(Amadeus)

Benoît CHARBONIER
(Amadeus)

Matti SCHNEIDER

Pawel KOZLOWSKI
(Amadeus)

Infos pratiques Entrée gratuite, inscription obligatoire

Inscrivez-vous en cliquant ici.

Vous pouvez vous inscrire en ligne à partir du site officiel: http://www.telecom-valley.fr/webform/inscription-sophiaconf2014

Catégories
Blog Open-source Planet-libre Web

Installation de NGinx avec PageSpeed sous Debian

Tous ceux qui se sont intéressés à l’optimisation du référence de leur site dans la sainte base de donnée de Google le savent bien, le temps de chargement des pages est un des facteurs clé pour en établir le classement. Google ne s’en cache plus depuis longtemps et propose toute une batterie d’outil pour identifier et optimiser la vitesse d’affichage de votre site.

Nous allons dans ce billet nous intéresser à l’optimisation de la couche basse de votre site, c’est à dire sans modification du contenu des pages, en mettant en place le module PageSpeed sur le serveur Web NGinx. J’ai utilisé un serveur sous Debian mais vous pouvez appliquer ceci, moyennant quelques adaptations, sur d’autres systèmes d’exploitations.

capture_158

PageSpeed Module ? Kesako ?

Google a  regroupé sous l’acronyme PageSpeed, un ensemble d’outils pour aider les Webmasters à optimiser leurs sites. Un des ces outil est nommé PageSpeed Module. C’est un module optionnel disponible pour les serveurs Web Apache et NGinx.

Une fois installé et configuré, ce module va, de manière dynamique et transparente, effectuer un ensemble d’optimisations lors de la mise à disposition de vos pages à vos utilisateurs. Chaque optimisation est mise en place sous la forme d’un filtre qui vont par exemple changer dynamiquement le contenu HTML de vos pages, trouver des emplacements de javascripts plus rapide ou bien optimiser les images. Comme, nous le verrons plus loin, la liste des filtres est bien sûr paramétrable au niveau des fichiers de  configuration de NGinx.

La liste complète des filtres fournis en standard par Google est disponible sur cette page.

Trêve de long discours, passons maintenant à l’installation et à la configuration de PageSpeed Module avec un serveur NGinx.

Installation de NGinx + PageSpeed Module

Vous savez tout le bien que je pense du serveur Web NGinx. J’ai donc profité de ce billet pour mettre à jour mon script d’installation automatique de NGinx afin d’y intégrer le module PageSpeed. Ainsi pour les plus pressés d’entre-vous, il suffit de télécharge ce script et de le lancer à partir d’un compte administrateur pour avoir une configuration NGinx + PageSpeed.

capture_159

Pour les autres, les plus curieux, nous allons détailler l’installation dans la suite de ce paragraphe.

On commence donc par se créer un répertoire de travail:

mkdir ~/install-nginx-pagespeed
cd ~/install-nginx-pagespeed/

Puis on télécharge les deux archives nécessaires:

wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.7.30.3-beta.zip
wget https://dl.google.com/dl/page-speed/psol/1.7.30.3.tar.gz

On décompresse le tout:

unzip release-1.7.30.3-beta.zip
cd ngx_pagespeed-release-1.7.30.3-beta/
tar zxvf ../1.7.30.3.tar.gz
cd ..

A ce stade, le répertoire ngx_pagespeed-release-1.7.30.3-beta contient donc le module PageSpeed prêt à être intégré aux sources de NGinx.

On récupère donc les sources de ce dernier:

wget http://nginx.org/download/nginx-1.4.4.tar.gz

On décompresse puis on installe:

tar zxvf nginx-1.4.4.tar.gz
cd nginx-1.4.4/
./configure --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --http-log-path=/var/log/nginx/access.log --with-http_dav_module --http-client-body-temp-path=/var/lib/nginx/body --with-http_ssl_module --http-proxy-temp-path=/var/lib/nginx/proxy --with-http_stub_status_module --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --with-debug --with-http_flv_module --with-http_realip_module --with-http_mp4_module --add-module=../ngx_pagespeed-release-1.7.30.3-beta
make

Enfin on installe la nouvelle version de NGinx contenant le module PageSpeed sur son système (attention cela va écraser votre installation existante mais pas les fichiers de configurations).

sudo make install

On relance NGinx pour prendre en compte la nouvelle installation.

sudo service nginx restart

On a donc un beau NGinx avec le module PageSpeed disponible. Par défaut, ce module n’est pas activé. Il faut donc passer à l’étape suivant: la configuration du module.

Configuration du module PageSpeed pour NGinx

C’est assez simple car tout est localisé dans la section server (ou http dans la cas d’une mutualisation avec plusieurs hôtes virtuels) des fichiers de configuration de NGinx. On commence donc par identifier cette section puis d’y ajouter les lignes suivantes pour activer le module PageSpeed en mode « pass through » (ce mode permet de choisir de manière exhaustive les filtres à appliquer):

server {
        ...

	# PageSpeed
        # enable ngx_pagespeed
        pagespeed on;
        pagespeed FileCachePath /var/ngx_pagespeed_cache;
        # Ensure requests for pagespeed optimized resources go to the pagespeed handler
        # and no extraneous headers get set.
        location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
                add_header "" "";
        }
        location ~ "^/ngx_pagespeed_static/" { }
        location ~ "^/ngx_pagespeed_beacon$" { }
        location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
        location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
        location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }

       ...
}

Ces lignes permettent:

  1. d’activer pagespeed (pagespeed on)
  2. de configurer le répertoire utiliser par PageSpeed pour cacher ses informations (FileCachePath)
  3. de s’assurer que les requêtes vers PageSpeed ne sont pas perturbées (location)

Pour le cache on utilise le répertoire /var/ngx_pagespeed_cache qu’il faut créer et configurer au niveau des droits pour que NGinx puisse y accéder (dans mon cas, le processus NGinx est lancé avec l’utilisateur www-data).

sudo mkdir /var/ngx_pagespeed_cache
sudo chown www-data:www-data /var/ngx_pagespeed_cache

Ensuite à la suite des autres lignes de la section server (ou http) on active les filtres souhaités. Voici un exemple des filtres que j’utilise sur mon serveur hébergeant ce blog:

server {
        ...

        # enable collapse whitespace filter
        pagespeed EnableFilters collapse_whitespace;

        # enable JavaScript library offload
        pagespeed EnableFilters canonicalize_javascript_libraries;

        # combine multiple CSS files into one
        pagespeed EnableFilters combine_css;

        # combine multiple JavaScript files into one
        pagespeed EnableFilters combine_javascript;

        # remove tags with default attributes
        pagespeed EnableFilters elide_attributes;

        # improve resource cacheability
        pagespeed EnableFilters extend_cache;

        # flatten CSS files by replacing @import with the imported file
        pagespeed EnableFilters flatten_css_imports;
        pagespeed CssFlattenMaxBytes 5120;

        # defer the loading of images which are not visible to the client
        pagespeed EnableFilters lazyload_images;

        # enable JavaScript minification
        pagespeed EnableFilters rewrite_javascript;

        # enable image optimization
        pagespeed EnableFilters rewrite_images;

        # pre-solve DNS lookup
        pagespeed EnableFilters insert_dns_prefetch;

        # rewrite CSS to load page-rendering CSS rules first.
        pagespeed EnableFilters prioritize_critical_css;

	# make Google analytics async
	pagespeed EnableFilters make_google_analytics_async;
}

Test et validation

Il existe tout un tas d’outils pour tester la vitesse de chargement de vos pages. J’utilise personnellement GTMetrix et  PageSpeed Insights. On peut ainsi facilement quantifier le gain de l’utilisation du module PageSpeed sur son site.

Il est clair que le module PageSpeed n’aura pas le même impact sur les les sites ayant pris en compte les problématiques de SEO et d’optimisation du chargement dès leurs conceptions que sur les autres. Mais au vu du faible overhead CPU et mémoire de ce module, je vous conseille de l’intégrer de base dans vos serveurs Web.

Utilisez-vous ce module (ou son pendant pour Apache ?) pour l’hébergement de vos sites ? Quels sont les filtres que vous mettez en place ?

Sources ayant servi à la rédaction de ce billet:

Catégories
Blog Hardware

Test de la nouvelle tablette Nexus 7

La semaine dernière j’ai reçu la dernière tablette Nexus 7 de Google. C’est mon premier matériel sous Android et je vais, dans ce billet, partager mes premières impressions avec vous.

Le hardware

Apple ayant poussé le packaging de ces produits à un niveau très (trop ?) élevé, la concurrence s’est petit à petit mis au diapason et le déballage de la version 2013 de la tablette 7 pouces de Google, en réalité fabrique par Asus, est un vrai bonheur: qualité de fabrication de la boîte, la tablette occupant toute la surface à l’ouverture, le câble mini USB (un peu court) et le chargeur disposés en dessous.

capture_116Une fois dans les mains et le film protecteur retiré, la première chose qui saute aux yeux est la finesse de la Nexus 7, la découpe en biseau accentuant encore plus cette impression. Par contre son poids (290 g) n’est pas négligeable, sans toutefois sortir des normes des autres tablettes du marché. Son format (14.4 * 20 cm) est pour moi idéal car on peut la tenir verticalement dans une seule main et se servir de l’autre pour naviguer.

Seul bémol, quand on prend la tablette, les boutons d’allumage et de réglage du volume, positionnés sur le coté en haut à droite ne tombent pas sous la main et il faut souvent les regarder pour ne par augmenter le son au lieu de le baisser.

L’écran est très lumineux et toujours lisible, même si on utilise la tablette en extérieur. Il est de plus très résistant aux traces de doigt. J’ai en mon fils, le meilleur bêta testeur pour ce dernier test…

Je passe rapidement sur la qualité du capteur photo. C’est pour moi un gadget sur ce genre de format de tablette. Qui, mis à part certains touristes, utilise des tablettes 7 ou 10 pouces pour prendre des photos ? Coté vidéo, il est possible d’enregistrer des séquences en HD 720p même si là encore, la Nexus ne pourra pas remplacer une « vraie » caméra.

Le système

La Nexus 7 opus 2013 est livré avec le système Android 4.3 (alias Jelly Bean). Vu la puissance du processeur de la tablette, la navigation dans les différentes fenêtres d’Android est parfaitement fluide. J’aime beaucoup le nouveau système de switch entre utilisateurs qui permet de partager la tablette entre plusieurs personnes d’une même famille et ainsi d’avoir au choix: un environnement complètement indépendant par personne (pour les parents) ou bien des comptes limités ou l’on choisit les applications/fonctions disponibles (pour les enfants).

Mis à part cela, on retrouve un système Android classique (sans surcouche), auquel j’ai immédiatement ajouté quelques applications « système » comme le très bon SSH Server et l’indispensable MX Player qui permet de lire tous vos fichiers vidéos (ce qui n’est pas le cas de l’application fournie en standard par Google).

Habitué à IOS sur mon smartphone, j’ai été très agréablement surpris par la gestion multitache, le switch entre applications et la fermeture rapide de ces dernières (voir screenshot ci-dessous). C’est vraiment un point ou Android a gagné des points.

Google-Nexus-7-2013-multitache

Les applications

La grande majorité des jeux ne sont pas optimisées pour l’affichage sur l’écran HD de la Nexus 7 (écran full HD de 1900*1200 pixel) et sauf exceptions souvent signalées dans le store Google Play, on se retrouve avec une interpolation qui va doubler les pixels et produire donc un affichage relativement grossier. C’est par exemple le cas sur des applications aussi connues que Candy Cruch ou  Rayman Jungle Run. Pour les jeux HD, on tire alors profit de la puissance de la machine et je ne constate aucun ralentissement sur les jeux gourmands comme Asphalt 8.

Avec les applications d’informations et orientées média sociaux, on profite d’un affichage HD de toute beauté. C’est ainsi, le cas pour Facebook, Pinterest ou Appy Geek pour ne citer qu’elles.

Conclusion

Je suis satisfait de mon achat. La tablette a déjà été adopté par mes enfants et de mon coté je trouve l’expérience utilisateur très agréable. Je reparlerai prochainement de mon nouveau jouet.

Si vous voulez un test technique exhaustif, je vous conseille la lecture des reviews de PC World (en Fr) ou de Paste Mag (en En).tio

Catégories
Blog raspberry Web

Code promo pour le site Kubii.fr

Pour fêter la mise en ligne de ma nouvelle page dédiée au Raspberry, Kubii, revendeur officiel de Pi en France et sponsor du blog de Nicolargo,  nous propose un code promo de 5€ pour 100€ d’achat sur son site:

—===—

Lien vers le site: http://www.kubii.fr/

Code promo: kubireduc

Validité: Jusqu’au 30 septembre 2013

—===—

Envoy !

Catégories
Blog Developpement Open-source Planet-libre Web Webdesign

Bootstrap pas à pas

7/10/2013 Update: billet mis à jour pour la version 3.0 de Bootstrap

Avec la généralisation des technologies JS, CSS3 et HTML5, il est aujourd’hui possible de faire des sites Web qui n’ont rien à envier aux interfaces des logiciels que l’on peut trouver sur nos machines. Le revers de la médaille est une complexité croissante qui nécessite de faire appel à des professionnels . Quand vous devez faire un site personnel ou pour une association, il est difficile, à moins de s’appeler Cresus, de passer par un Web designer.

Heureusement des frameworks libres permettent avec un minimum d’investissement et de connaissances de bâtir des sites Web dans les règles de l’art. Nous allons dans ce billet parler du plus médiatique d’entre eux: Bootstrap. L’idée n’est pas de traduire la documentation officielle qui est par ailleurs très bien faite, mais de partager avec-vous mes méthodes que je suis en train d’utiliser pour développer le prochain thème du Blog de Nicolargo qui sera, vous l’avez compris largement basé sur Bootstrap.

capture_037

footprint Créer l’arborescence de son projet

Nous allons commencer par créer l’arborescence générale de notre site qui sera stocké, pour illustrer ce billet, dans le répertoire ~/projet de notre disque dur. On y télécharge&&décompresse la dernière version stable de Bootstrap.

mkdir ~/projet
cd ~/projet

wget https://github.com/twbs/bootstrap/releases/download/v3.0.0/bootstrap-3.0.0-dist.zip
unzip bootstrap-3.0.0-dist.zip
rm bootstrap-3.0.0-dist.zip
rm -rf bootstrap 
mv dist bootstrap

Note: Contrairement à la plupart des tutos que l’on peut trouver sur le net, je préfère conserver le répertoire bootstrap intact et utiliser d’autres répertoires pour stocker mes configurations spécifiques. Ainsi, la mise à jour de Bootstrap n’aura aucun impact sur mon site.

En plus de Bootstrap, j’ajoute également la dernière version du projet Font Awesome qui met à notre disposition un nombre important et varié d’icônes jusqu’à une résolution de 280 pixels.

capture_032

cd ~/projet
git clone git://github.com/FortAwesome/Font-Awesome.git

Les données spécifiques à notre site seront stockées dans l’arborescence suivante (à adapter à vos besoins)

cd ~/projet
mkdir css img js
touch index.html css/style.css

 

On peut ensuite commencer à éditer la premier page de son site en utilisant son éditeur de texte de prédilection (par exemple avec Geany):

geany index.html

Voici le template que j’utilise:

<!DOCTYPE html>
<html>
    <head>
        <title>Bootstrap arena</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <!-- Bootstrap -->
        <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
        <!-- Font-Awesome -->
        <link href="Font-Awesome/css/font-awesome.min.css" rel="stylesheet">
        <!-- My style -->
        <link href="css/style.css" rel="stylesheet" media="screen">
    </head>
    <body>
        <h1>Hello Bootstrap !</h1>
    </body>
    <footer>
        <script src="http://code.jquery.com/jquery.js"></script>
        <script src="bootstrap/js/bootstrap.min.js"></script>
    </footer>
</html>

Jusque là rien d’exceptionnel… Vous devriez voir s’afficher « Hello Bootstrap » en chargeant votre page dans un navigateur HTML. C’est à partir de maintenant que l’on va profiter de la puissance de Bootstrap !

footprint Définir vos grilles

Par défaut, Bootstrap utilise un système avec une grille de 12 colonnes (voir le site 960.gs pour une explication de cette dernière phrase). Votre fenêtre de navigateur est ainsi divisée en 12 sections de tailles équivalentes.  Vous pouvez l’adapter à votre besoin en gardant ce chiffre à l’esprit. Par exemple pour créer une page Web avec 2 colonnes, il suffit d’ajouter les lignes suivantes entre les balises <body> … </body> de votre fichier HTML.

<div class="container">
        <div class="row">
            <div class="col-md-8">Article</div>
            <div class="col-md-4">Sidebar</div> 
        </div> 
</div>

Ce qui donne une première colonne de taille 8/12 de la taille de votre fenêtre et une autre de 4/12:

capture_026

On utilise ici une disposition fluide (classe row) qui permet d’adapter dynamique la largeur de vos deux colonnes en fonctions de la taille de votre écran.

Bootstrap génère par défaut des espaces entre deux colonnes (environ 20 pixels pour une dic container). Il est  possible de générer des espaces supplémentaire avant ou entre vos colonnes en utilisant le paramètre de classe offset. Par exemple pour créer un espace de taille 1/12 d’écran entre vos deux colonnes, il suffit de modifier votre code de la manière suivante:

    <div class="container">
       <div class="row">
            <div class="col-md-8">Article</div>
            <div class="col-md-offset-1 col-md-3">Sidebar</div>
       </div>
    </div>

On obtient:

capture_027

Noter bien que la somme des col-md-8 + col-md-offset-1 + col-md-3 est toujours égale à 12. Pour être tout à fait précis, la somme doit être égale à la taille de votre grille dans lequel votre balise row est imbriquée. Comme nous l’avons vu la grille par défaut à une valeur de 12. Mais il est possible d’utiliser une autre valeur en définissant une div chapeau.  Par exemple pour définir une grille de 6 et y créer deux colonnes de 4 et de 2, on doit utiliser le code suivant:

        <div class="row">
            <div class="col-md-6"> 
                <div class="col-md-4">Article</div>
                <div class="col-md-2">Sidebar</div>
            </div>
        </div>

On obtient alors:

capture_028

footprint « Responsive design » en une ligne

Comme vous pouvez le voir il est possible d’imbriquer des grilles dans d’autres et ainsi découper facilement sa page sans se soucier des redimensionnements de fenêtres. En effet, tout le « responsive design » est géré par Bootstrap. Votre site sera donc automatiquement compatible avec les tablettes et les smartphones !

Le tableau suivant donne la liste des tags que l’on peut utiliser pour rendre son site compatible avec les différents supports:

 

capture_132

Comment lire ce tableau ? C’est relativement simple. Prenons un exemple. Nous voulons dans notre premier exemple avec deux colonnes (article et sidebar) cacher automatiquement la sidebar quand notre site est consulté depuis un smartphone. Nous allons pour cela afficher les classes .hidden-sm et .hidden-xs de la manière suivante:

    <div class="container">
        <div class="row">
            <div class="col-md-8">Article</div>
            <div class="col-md-4 hidden-sm hidden-xs">Sidebar</div>
        </div>
    </div>

Affichage sur un PC ou une tablette (ou un écran > à 767 pixels):

capture_030

Affichage sur un smartphone (ou un écran de largeur <= à 767 pixels):

capture_031

Magique non ?

footprint Passons aux contenus de vos pages

Nous avons maintenant une belle grille « responsive » qu’il va falloir remplir.

En plus des éléments de bases (texte, images, icônes, formulaire), Bootstrap propose des composants avancées (barre de navigation, menu, aperçu d’image, pagination, barre de progression) mais également un système de plugins avec des composants dynamiques en JavaScript (carrousel, popup, menu en accordéon, formulaire dynamique…). Je vous invite à consulter les liens données dans ce chapitre. Des idées pour votre prochain site viendront d’elles même.

Sources utilisées pour rédiger ce billet:

 

Catégories
Blog

Statistiques 2012 du Blog de Nicolargo

En ce début d’année, je vous souhaite chers lecteurs, une merveilleuse année 2013 à vous et à vos proches.

Comme chaque année, je profite, le temps d’un billet, d’un moment calme pour  partager avec vous le bilan de l’année 2012 de ce blog, chiffres et requêtes SQL à l’appui.

Quelques chiffres…

Au niveau général, vous avez été plus de 1.000.000 à venir sur ce site cette année, ce qui représente 1.900.000 pages vues. Au mois de décembre, la barre des 10.000 commentaires depuis la création du blog en novembre 2006 a été franchie.

Après un pic au moi d’avril, le trafic s’est relativement tassé avec notamment un baisse de visiteurs venant de gOOgle. Je peux assez facilement expliquer cette baisse par la faible fréquence de mise à jour du blog (voir plus bas) et le temps de chargement relativement long de mon thème WordPress qui commence un peu à dater.

Sur ce dernier point, un des objectif de cette prochaine année est de re-développer un nouveau thème HTML5/CSS3.

Nombre de billets publiés en 2012

SELECT COUNT(*) FROM wp_posts WHERE post_status="publish" AND post_date BETWEEN '2012-01-01' AND '2012-12-31';

Résultat: 58 billets (contre 122 en 2011 et 161 en 2010)

Comme prévu, le nombre d’articles a baissé à environ 1 par semaine. Entre mon activité professionnelle et l’investissement que j’ai mis dans le développement de Glances c’était le maximum que je pouvais faire. Je pense garder le même rythme l’année prochaine.

Nombre de commentaires postés en 2012

SELECT SUM(comment_count) FROM wp_posts WHERE post_status="publish" AND post_date BETWEEN '2011-01-01' AND '2011-12-31' GROUP BY post_status;

Résultat1197 commentaires (contre 1796 en 2011 et 1341 en 2010)

Une seule chose à dire: Merci à vous. 10.000 commentaires au total sur le blog. Une grande fierté pour moi.

Liste des 10 billets les plus commentés en 2012

SELECT post_title,comment_count FROM wp_posts WHERE post_status="publish" AND post_date BETWEEN '2011-01-01' AND '2011-12-31' ORDER BY comment_count DESC LIMIT 0,10;

Résultat:

73Cherche beta-testeurs pour Glances 1.4

63Glances 1.5 est arrivé

49Modeles de presentations HTML5 pour remplacer PowerPoint

42 – Auto-heberger son service Web de partage de fichiers

42 – Le difficile choix des outils de supervision des reseaux

41 – Partager simplement des fichiers sur le Web avec DropCenter

41 – Installation pas a pas d’un serveur de supervision Shinken

40 – Selection de logiciels libres de comptabilite personnelle

35 – Proteger son serveur en utilisant Fail2Ban

34 – Preparer l’arrivee de Precise Pangolin avec un script de postinstall

Top 10 des lecteurs ayant le plus posté de commentaires en 2012

SELECT comment_author,COUNT(comment_count) AS F01 FROM wp_comments,wp_posts WHERE comment_approved=1 AND comment_post_ID=ID AND comment_date BETWEEN '2011-01-01' AND '2011-12-31' GROUP BY comment_author ORDER BY F01 DESC LIMIT 0,10;

Résultat (moi mis à part…):

45bartounet

12 – Gabriel

11 – NourSs

11 – Ben

11 – Idleman

10 – Nono

10 – issa

9 – Romain

9 – Vincent

A très bientôt pour un nouveau « vrai » billet !

Catégories
Blog Open-source Planet-libre Web

Sauvegarde incrémentale et automatisé de votre compte Gmail

Les prophètes du Web avaient prédit la fin des mails avec l’arrivée des réseaux sociaux. Force est de constater que la messagerie électronique « classique » est toujours bien ancrée dans les moeurs.  Pour une utilisation personnelle, la messagerie GMail de Google fait office de leader sur le marché. J’ai personnellement plus de 3 Go d’archives de mail sur mon compte personnel. Bien que très stable, le service de Google n’est pas à l’abri d’une perte de vos précieux messages. Nous allons donc voir dans ce billet comment conserver une archive locale de votre compte Gmail en utilisant le logiciel libre GetMail. GetMail est distribué sous licence GPL version 2 et il est disponible dans les dépôts des principales distributions GNU/Linux.

La procédure suivante va nous permettre de faire une sauvegarde incrémentale (seul les nouveaux messages sont téléchargés) d’un compte Gmail accessible via le protocole IMAP sur une machine Debian Squeeze (mais la procédure est la même sous Ubuntu).

Installation et configuration initiale de Getmail

On commence par installer le logiciel:

sudo apt-get install getmail4

On créé ensuite les sous-répertoires suivants (à adapter à votre configuration):

  • ~/.getmail: va contenir les fichiers de configuration de Getmail (un fichier par compte)
  • ~/backup/gmail: est le répertoire de destination ou la sauvegarde va être faite

En utilisant les commandes suivantes:

mkdir ~/.getmail
mkdir ~/backup/gmail

On passe ensuite à la création du fichier de configuration (~/.getmail/getmail.gmail) pour notre compte Gmail. Ce dernier doit contenir les lignes suivantes:

[retriever]
type = SimpleIMAPSSLRetriever
server = imap.gmail.com
username = user@gmail.com
password = password
mailboxes = ("inbox",)
port = 993

[destination]
type = Mboxrd
path = ~/backup/gmail/user.mbox

[options]
received = false
delivered_to = false
read_all = false
verbose = 0

Je vous laisse modifier ce fichier avec vos propres informations.

On s’empresse de protéger ce fichier des regards extérieurs:

chmod 700 ~/.getmail/getmail.gmail

Comme vous pouvez le voir dans cette même configuration, j’ai choisi d’utiliser le format Mboxrd qui est un standard reconnu par la plupart des logiciels. Getmail doit disposer d’une archive vide avec les bons droits avant de le lancer pour la première fois. On utilise donc la commande suivante pour le satisfaire:

touch ~/backup/gmail/user.mbox

Lancement initial de Getmail

Je vous conseille de faire le premier lancement de Getmail depuis une console pour voir les éventuels messages d’erreurs.

getmail -r ~/.getmail/getmail.gmail

Il est possible, notamment si vous lancé Getmail depuis un serveur n’ayant jamais fait de connexions clientes IMAP vers GMail, que Google bloque l’accès et que Getmail retourne un message du style:

IMAP error during logout (command CLOSE illegal in state AUTH, only allowed in states SELECTED)

Pour résoudre se problème il faut se connecter sur votre compte Gmail (à partir de n’impote qu’elle machine) puis de cliquer sur le bandeau rouge en haut de l’écran:

Puis de valider votre connexions:

Vous avez alors 10 minutes pour relancer la première commande de ce paragraphe.

Si il n’y a pas d’erreur, alors le téléchargement des fichiers vers votre archive (fichier unique) devrait commencer. vous pouvez aller prendre un café, ou plusieurs, selon la taille de votre compte GMail. Je vous conseille de prévoir un espace disquelégérement supérieur à l’information donnée par Gmail en bas du WebMail (fichier archive de 4 Go pour 3 Go affiché dans Gmail). En effet, l’archivage implique l’ajout d’un « overhead » assez important.

Note: Même depuis mon serveur OVH connecté à 100 Mbps sur Internet, je ne dépasse pas les 1 Mbps lors de l’archivage, surement une limite des serveurs Google et/ou du protocole IMAP.

Automatiser la sauvegarde

« Sauvegarder, c’est bien, automatiser la sauvegarde c’est mieux. » [Nicolargo]

Une petite ligne ajoutée à votre crontab système va permettre d’automatiser la sauvegarde incrémentale de votre compte Gmail. Personnellement, je la déclenche toutes les nuits à 1h du matin.

# crontab -e

0 1 * * * getmail -r ~/.getmail/getmail.gmail

Vous voilà maintenant plus tranquille avec une archive bien à vous de vos (g)mails !