www.suinot.org

Dans le doute, reboot. Si ça rate, reformate ! [ devise Windows ]

Accueil > Linux > Spip dans un container Docker [mise à jour]

Spip dans un container Docker [mise à jour]

vendredi 5 juillet 2019, par Rémi

[ Mise à jour : 18/08/2019]
J’ai mis maria en version 10,4 et version buster (à la place de stretch)
Modifié Docker.php
Modifié docker-compose.yml

Docker.maria
Docker.php
docker-compose.yml

Fichiers à jour bien sur.


Je me suis aussi aperçu que mon site ne pouvait pas envoyer de mail. C’est bien cela évite le spam, mais ce n’est pas très logique quand même. J’ai donc cherché pourquoi, d’abord, et tenté de trouver une solution.

LA solution simple et légère, a été d’utiliser Nullmailer.
Dans le container php, j’installe nullmailer, et je partage les fichier de configurations. Ceux ci sont au nombre de 3 (dont un de vide) :

  1. /etc/nullmailer/adminaddr => vide
  2. /etc/nullmailer/defaultdomain => le nom de domaine que vous voulez dans votre mail
  3. /etc/nullmailer/remotes => l’adresse de votre smtp

chez moi, je mets comme nom de defaultdomain spip.[mon nom de domain] et j’ai configurer postfix pour me considérer ça comme un alias. Idem pour d’autre containers :)

Ensuite, le docker-compose.yml contient les hostnames et domainname qui vont bien sinon, votre containers aura toujours au moins le hostname de type numérique (j’ai mis du temps à trouver, alors cherchez pas !)

[ Date de première publication : 18/03/2018]
Comment mettre Spip dans un container Docker ?

  • Vous voulez essayez ?
  • Vous ne savez pas si cela fonctionne ?

Et bien ne reculant devant aucun sacrifice, je l’ai fait !
Et c’est même la dessus que cela tourne en ce moment.

[ Je pars du principe que vous connaissez un minimum de configuration/utilisation sur la technologie Docker. Si ce n’est pas le cas, je vous propose de lire la doc officielle
Je m’y suis confronté un certain nombre de fois, mais il y a des ressources en français sur le Net aussi, si besoin.]

Vous avez la base de donnée dans un espace le serveur dans un autre et php dans un troisième. Le tout derrière un proxy .
Je ne dis pas que cela a été facile à faire. Il y a eu beaucoup de sang versé, quelques larmes, un peu de bière et quelques litres d’apéro, mais je suis content de moi.

Voila mon histoire ...

Jour Zéro
- Vient la réflexion : qui dit nouveau serveur, dit nouvelle installation. Soyons fou, essayons de nouvelle technologie logiciel, et testons les containers docker. En isolation, peut être y gagnerais-je (un peu) de la sécurité. Et c’est partie pour quelques semaine de lecture sur le net, avec les tests en regard sur mon portable.

Jour 10
- Comment faire du container : pour spip,il faut une base sql (maria-db par exemple), un serveur web (je vais partir sur nginx), de quoi faire du php, et donc php-fpm.
Ceci étant posé, en container, je ne vais pas mettre tout dans le même container, mais dans trois containers, qui communiquerons ensemble, c’est fait pour cela. Voila la liste des images que j’ai utilisée :

  • maria-db : debian:stable
  • nginx : debian:stable
  • php : osminogin/php-fpm (là, je ne me suis pas fatigué, j’ai pris l’existant)
    Mais, mis à part osminogin/php-fpm, qui fait tout presque tout seul, le reste doit être configuré :
    → mettre à jour ;
    → installer les paquets nécessaires et les locales si besoin ;
    → supprimer ce qui n’est pas utile.

Jour 20
- Après quelques jours de tests divers et variés, j’ai fini par faire 3 fichiers dédiés à chaque containers : Docker.maria - Docker.web - Docker.php , respectivement pour la base de données, nginx et php-fpm. Pour orchestrer tout ça, il y a un fichier docker-compose.yml. Et comme je suis un flaimard de première, j’ai un script qui me recompile tout (cela m’évite surtout de réécrire les commandes à chaque fois).
Je place les fichiers en download pour la postérité (jusqu’à la fin des temps ?)

Jour 40
- Tout est bien beau, mais cela n’est pas optimal. Je suis donc reparti de zéro. Il manque la configuration de nginx, de maria, quelques petits détail part(ci part-là. Donc, on reprend :

  • création d’un répertoire particulier pour le container
  • dedans, création d’un répertoire nginx-spip3
  • dedans, création de etc/nginx et etc/maria avec les fichiers de configurations nécessaires bien sûr.
  • dans nginx-spip3, je place aussi mes fichiers Docker.* et docker-compose.yml plus mon script maison.

Jour 50
- J’ai accès à mon site, mais toujours pas à Spip. (et nous sommes à 50 jours du début !). Réflexion/Action/Corrections/Finalisation ! Une semaine après j’ai un beau login de Spip qui s’affiche !!! Pour cela, il aura fallut réaliser un script pour installer Spip3 au moment de la création des containers : web-entrypoint.sh .

Jour ... inconnu ... je commence à perdre la tête
- Un docker c’est bien, un docker qui démarrer tout seul à chaque reboot c’est mieux. Alors la, ce n’est pas bien compliqué. Il faut quelques principe de départ et ça roule®

  • avoir Systemd : parce que je vous donne la marche à suivre pour Systemd
  • dans le fichier du service, ne pas se tromper dans le chemin de votre docker-compose.

Voila par exemple le mien :

[Unit]
Description=docker Nginx.Spip3
Requires=docker.service
After=docker.target network.target

[Service]
User=remi
Restart=always
RestartSec=3

ExecStartPre=/usr/local/bin/docker-compose -f /home/remi/Tmp/nginx-spip3/docker-compose.yml rm

# Compose up
ExecStart=/usr/local/bin/docker-compose -p /home/remi/Tmp/nginx-spip3/ -f /home/remi/Tmp/nginx-spip3/docker-compose.yml up

# Compose down, remove containers and volumes
ExecStop=/usr/local/bin/docker-compose -f /home/remi/Tmp/nginx-spip3/docker-compose.yml down

[Install]
WantedBy=multi-user.target

Là ça commence à prendre le bon chemin.

Je vous passe tous les tests que j’ai pus faire. La configuration qu’il y a dans les fichiers ici est celle avec laquelle tourne le serveur. Ni plus ni moins, à par les mots de passe, bien sur. Entre le site et vous, il y a un proxy https/2 . Que je n’ai pas expliqué ici, car il n’est pas dans cette partie.
Vous avez, dans chaque Docker.* une référence à 01proxy et detect_proxy.sh . Ceci provient de la configuration du proxy apt L’avantage : j’ai un proxy pour tout le monde, et je gagne en bande passante, ùalgré tous, si vous n’avez pas de proxy apt, ça fonctionne quand même !

docker.web
composition pour le container du serveur nginx
redockerise.sh
re - création des containers (script bash perso pas de controle ni quoi que ce soit d’autre)
maria-entrypoint.sh
script d’installation pour la base de donnée.
web-entrypoint.sh
Le dernier script avant la fin de l’Univers

05/07/2019 :
Mes containers fonctionnent à merveille ! même la mise à jours de SPIP n’a pas besoin de redémarrage de ces dernier.
Sauf, que je me suis aperçu que lorsque je voulais changer ou retrouver un mot de passe, ben je n’avais pas de mail !!!! (boulette de paramétrage ? spoiler : oui)
Réflexion/Observation/Action => je paramètre php.ini (mon php est passé à php7.3) mais ça ne fonctionne pas.... J’ai donc installé dma, un MTA super léger (144 ko installé), qui n’est pas en daemon, donc pas de ressource untilisée inutilement. Et la configuration est légère.

Nouveau Docker.php

J’ai utilisé supervisord pour démarrer les deamons, mais en fait, ce n’est pas vraiment utile (cela a été un bon exercice par contre).
A présent, mon docker-compose.yaml est nikel.
Ma base, en plus, sert à d’autre applications (nextcloud entre autre)

A suivre.