Ayant eu la chance d'avoir un collègue très au point sur les technologies de containerisation, j'ai decidé, il y a quelques temps maintenant, de sauter le pas pour l'hébergement de ce site et des autres services dont j'ai besoin au quotidien.
Historiquement, j'avais un NUC Intel doté d'un Celeron et de 8Go de RAM, sur lequel j'avais installé ProxMox et une VM sur laquelle j'avais installé Yunohost.
Ca fonctionnait pas mal, voire même très bien, mais à l'époque, je rencontrais des soucis lorsque je voulais ajouter des services sur la machine.
J'ai donc créé une VM Debian de base, ai installé le moteur Docker, et ai suivi la doc de mon collègue pour installer un reverse proxy Nginx, le companion qui permet de gérer automatiquement les certificats Let's Encrypt, et un serveur Grav, que vous êtes en train de consulter.
Tout d'abord, on créé un dossier data à la racine de la machine Debian, dans lequel on créé quelques sous-dossiers :
J'ai commencé par installer le reverse proxy. Pas de fichier docker-compose.yml mais un fichier sh permettant la création à la volée :
#!/bin/bash
docker run --restart=always --name reverseproxy -d -p 80:80 -p 443:443 -v /data/setup/certs/:/etc/nginx/certs:ro -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /data/containers/reverseproxy/conf/proxywide.conf:/etc/nginx/conf.d/proxywide.conf:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Lorsque ce script est lancé, il démarre un container nginx-proxy récupéré chez jwilder, mappe les ports 80 et 443 de la VM sur les mêmes ports du container, et mappe certains dossiers (notamment le dossier contenant les certificats) et un fichier de config proxywide.conf présent dans /data/containers/reverseproxy/conf/.
Contenu du fichier proxywide.conf :
client_max_body_size 12000m;
Ensuite, nouveau dossier pour le companion.
Et nouveau fichier de déploiement de container...
#!/bin/bash
docker run --restart=always -d -v /data/setup/certs:/etc/nginx/certs:rw --volumes-from reverseproxy --name letsencrypt -v /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion
On mappe le dossier de certificats de nginx vers notre dossier /data/setup/certs et c'est tout...... En lançant l'exécutable, la création du container est lancée.
Ensuite, on va créer un dossier pour chaque nouveau service et y inclure un fichier docker-compose.yml.
Pour Grav, par exemple :
grav:
image: vincowl/grav-php-nginx
container_name: cont_grav
restart: always
ports:
- "8097:80"
volumes:
- /data/containers/grav/ssh:/root/.ssh/
- /data/containers/grav/html:/usr/share/nginx/html/
environment:
- VIRTUAL_HOST=www.monsite.com
- ALLOW_OVERRIDE=true
- LETSENCRYPT_HOST=www.monsite.com
- LETSENCRYPT_EMAIL=monsite@monsite.com
On mappe le port 8097 de la VM sur le port 80 du container. On mappe 2 dossiers (voir doc), et on renseigne ensuite les paramètres qui vont permettre au companion de faire les demandes de certificats et de les installer automatiquement.
Le lancement du container se fera ensuite en tapant la commande docker-compose up -d dans chaque dossier de service.
Et on suivra le même mode opératoire pour les autres services.
Shaarli par exemple :
shaarli:
image: shaarli/shaarli
container_name: shaarli
restart: always
ports:
- 8094:80
volumes:
- /data/containers/bookmarks/data:/var/www/shaarli/data
environment:
- VIRTUAL_HOST=shaarli.monsite.com
- LETSENCRYPT_HOST=shaarli.monsite.com
- LETSENCRYPT_EMAIL=monsite@monsite.com
Cela démarrera automatiquement un container shaarli et récupèrera le certificat Let's encrypt pour https://shaarli.monsite.com
En rêgle générale, les docs de déploiement des containers présents sur github sont très simples à suivre.