Téléchargement de l'image Docker

Si vous avez un processeur en x86_64 :

docker pull fantomfp/poezio-omemo:0.13.1-17.fr.x64

Il y a une image disponible pour toutes les architectures, soit 3 images au total. Je fournis également les logs de construction de chacune des 3 images. Elles ont une taille réduite à 100Mio, et donc sont très légères. Enfin, les sources pour mes images sont accessibles en ligne dans un dépôt Git. Qualité garantie.

Les architectures disponibles sont :

  • x86_64, amd64 (tagué x64)
  • arm32v7, armv7hl, armhfp
  • arm64v8, aarch64

Si vous avez un processeur en arm32v7 :

docker pull fantomfp/poezio-omemo:0.13.1-17.fr.armhfp

Si vous avez un processeur en arm64v8 :

docker pull fantomfp/poezio-omemo:0.13.1-17.fr.aarch64

Vous aviez peut-être testé l'ancienne image docker (avec le tag 0.13.1-9.fr) construite il y a quelques mois. Aujourd'hui, je vous propose d'essayer la nouvelle génération d'images Docker qui contient de nouvelles fonctionnalités avancées.

Références :

Personnaliser son setup

La première étape pour l'exécution saine de containers, est la mise en place d'une arborescence de répertoires, à disposition des volumes exposés par les containers. La cohérence de cette arborescence est importante car elle gère les données persistantes des containers. Cette logique dans l'arborescence permet de retrouver facilement ses données.

L'arboresence de répertoires permet aussi de monter une partition ou un LV, lorqu'il y a de gros volumes de données à gérer.

Voici le petit arbre pour une instance de Poezio :

/contener/poezio-prod
├── config
│   └── poezio.cfg
├── data
│   ├── logs
│   ├── omemo
│   ├── plugins
│   └── themes
└── proxychains
    ├── ssh-nse.conf
    └── template.conf

Nul-besoin de créer tous les sous-répertoires, ils seront créés automatiquement plus tard.

# mkdir -p /contener/poezio-prod
# chmod 700 /contener/poezio-prod
# chown 1000:1000 /contener/poezio-prod

Passons en revue les arguments de la commande pour lancer le container. Vous avez peut-être un serveur DNS personnel, ou bien vous préférez utiliser tel ou tel résolveur DNS. Cette option est facultative :

--dns 192.168.0.1

Le service Docker récupère automatiquement les logs des containers. Or, Poezio est un client en ncurses, donc on peut désactiver cette fonction :

--log-driver none

Voici la commande finale :

$ sudo docker run -ti -e TERM --dns 192.168.0.1 --log-driver none \
-v /contener/poezio-prod/config:/home/poezio-user/.config/poezio:Z \
-v /contener/poezio-prod/data:/home/poezio-user/.local/share/poezio:Z \
-v /contener/poezio-prod/proxychains:/home/poezio-user/proxychains:Z \
fantomfp/poezio-omemo:0.13.1-17.fr.x64 /usr/bin/poezio

Il est possible de passer n'importe quelle option à Poezio, par exemple :

/usr/bin/poezio -c

Comment récupérer le debug.log

Si besoin, on peut générer un fichier debug.log, pour rapporter un bug par exemple. Pour lancer Poezio en mode debug, il faut remplacer :

/usr/bin/poezio

Par :

/usr/bin/poezio --debug .local/share/poezio/debug.log

Pour récupérer le fichier généré, il faut aller le chercher dans l'arborescence créée précédemment. On peut le lire avec son utilisateur normal, pas besoin de passer root.

/contener/poezio-prod/data/debug.log

Ce fichier contient des données qu'il faut anonymiser avant de l'uploader où que ce soit. Personnellement, je passe par un compte bidon (jid), pour reproduire le bug en 2 minutes et générer le fichier.

Tmux

C'est un multiplexeur de terminal. Il permet de lancer une commande dans un terminal sous Gnome, puis de fermer la fenêtre sans que le processus soit stoppé. Il permet aussi de lancer une commande qui s'exécute longtemps à travers une session SSH, puis de fermer la connexion sans stopper la commande. Plus besoin d'avoir une connexion stable pour garder sa session SSH.

Il permet aussi d'avoir plusieurs terminaux dans un seul terminal, sous Gnome ou par SSH, ou bien dans un TTY. Plus besoin d'ouvrir 3 ou 4 connexions SSH, tout transite par une seule connexion. Et il est même possible d'afficher les terminaux virtuels côte-à-côte.

Un multiplexeur de terminal est un outil indispensable lorsqu'on travaille la plupart du temps en console. Vous connaissez et utilisez peut-être déjà un multiplexeur de terminal nommé "screen". Et bien Tmux est exactement pareil.

Les avantages de Tmux sont divers et variés, mais je vous propose maintenant de le coupler avec un container de Poezio. Il est courant de lancer son client IRC ou XMPP sur un serveur dédié. En passant par Tmux, on peut détacher le client et fermer la connexion au dédié, puis réattacher le client à une nouvelle connexion, plus tard.

Tmux introduit le concept de commande qui s'exécute en arrière-plan et que l'on peut récupérer plus tard.

Pour lancer le container dans Tmux :

$ tmux -2 new-session -s poezio -n jabber 'sudo docker run...'

(Oui, la commande est très longue...)

Pour détacher Poezio du terminal, taper :

Ctrl-b puis d

Pour récupérer Poezio dans un terminal :

$ tmux attach -t poezio

Il est possible de faire un million de choses avec Tmux, mais ça sort du cadre de cet article. On ne peut pas maitriser Tmux en 10 minutes. N'hésitez pas à l'appréhender petit-à-petit, c'est un outil remarquable qui est là pour faciliter la vie...

Choisir sa timezone

Poezio utilise la timezone du système pour se mettre à l'heure et afficher des heures cohérentes dans les fenêtres de conversation. Elle est aussi utilisée pour l'écriture des fichiers de log des salons, et aussi pour le debug.log.

Docker utilise la timezone UTC (Heure Universelle, Temps Universel, GMT) dans ses containers. Et Poezio, n'a pas accès à la timezone du système de l'utilisateur, car il est cloisonné dans son container. Face à ce problème, il fallait trouver un moyen de donner la bonne timezone à Poezio.

Dans son image Docker, Poezio utilise la timezone de Paris par défaut. Si vous êtes sur la même timezone, alors il n'y a rien à faire. C'est indiqué dans le tag de l'image :

0.13.1-17.fr.x64  <=== Timezone fr

Si vous n'êtes pas sur la même timezone que Paris, il est possible d'indiquer sa timezone au moment du démarrage du container, en ajoutant une option à la ligne de commande. Par exemple, si je me situe en Angleterre :

$ timedatectl list-timezones | grep Europe
...
Europe/London

Ensuite, on peut lancer le container avec l'option :

-e TZ="Europe/London"

Si l'on souhaite forcer l'utilisation de l'heure UTC :

-e TZ="Etc/UTC"

Tor

Avant de lancer le container, il convient de reconfigurer le routeur Tor de la machine hôte. Le service Tor écoute uniquement sur l'interface localhost, mais cette interface est inaccessible depuis le container Docker.

En effectuant mes recherches, je me suis aperçu que Tor écoutait uniquement sur l'interface localhost en ipv4 (adresse 127.0.0.1). J'avais donc manuellement reconfiguré mon routeur Tor pour écouter sur l'interface, à la fois en ipv4 et en ipv6 (adresse ::1).

Pour configurer le port d'écoute, il faut s'appuyer sur le paramètre "SocksPort" dans le fichier torrc. On peut indiquer ce paramètre plusieurs fois, et le service Tor va les additionner. Sa syntaxe est facile :

SocksPort [::1]:9050 PreferIPv6
SocksPort 127.0.0.1:9050 PreferIPv6
SocksPort 172.17.0.1:9050 PreferIPv6

L'adresse de l'interface docker0 est "172.17.0.1", et le service Tor va ouvrir dessus le port 9050. Comme sur l'interface localhost de la machine hôte. Tous les containers Docker auront accès à Tor.

L'effet de bord lorsqu'on indique une interface virtuelle (docker0 ou autre), est que si l'interface n'existe pas, alors le service Tor ne pourra pas démarrer. Cette situation se produit au démarrage de la machine : Si le service Docker n'est pas lancé avant le service Tor, alors le démarrage du service Tor va échouer.

Pour résoudre le problème, systemd permet de customiser un service et d'indiquer son lancement après un autre service.

# mkdir /etc/systemd/system/tor.service.d/
# vim /etc/systemd/system/tor.service.d/custom.conf

Ajouter dans ce fichier :

[Unit]
After=syslog.target network.target nss-lookup.target docker.service

Puis reload de systemd :

# systemctl daemon-reload

Puis redémarrage de Tor, pour ouvrir le port.

L'image Docker est faite pour utiliser proxychains-ng avec Poezio. Et proxychains est configuré par défaut pour utiliser Tor. Il n'y a rien à faire, tout est prêt.

Il n'y a pas d'argument en plus à ajouter à la ligne de commande :

$ sudo docker run -ti -e TERM --log-driver none \
-v /contener/poezio-prod/config:/home/poezio-user/.config/poezio:Z \
-v /contener/poezio-prod/data:/home/poezio-user/.local/share/poezio:Z \
-v /contener/poezio-prod/proxychains:/home/poezio-user/proxychains:Z \
fantomfp/poezio-omemo:0.13.1-17.fr.x64

Proxy SOCKSv5 par SSH

La configuration de proxychains par défaut est pour le routeur Tor, mais il est possible d'utiliser un autre fichier de config pour utiliser n'importe quel autre serveur proxy. Il faut commencer par récupérer un fichier qui va servir de template.

Dans le cas présent, on se base sur le fichier de config par défaut, pour passer par un proxy SOCKS via SSH. Il y a 2 méthodes pour le récupérer : soit avec la commande directe, soit en passant par un shell intéractif :

$ sudo docker run -ti -e TERM --log-driver none \
-v /contener/poezio-prod/config:/home/poezio-user/.config/poezio:Z \
-v /contener/poezio-prod/data:/home/poezio-user/.local/share/poezio:Z \
-v /contener/poezio-prod/proxychains:/home/poezio-user/proxychains:Z \
fantomfp/poezio-omemo:0.13.1-17.fr.x64 /bin/cp /etc/proxychains.conf \
proxychains/template.conf

Ou bien :

$ sudo docker run -ti -e TERM --log-driver none \
-v /contener/poezio-prod/config:/home/poezio-user/.config/poezio:Z \
-v /contener/poezio-prod/data:/home/poezio-user/.local/share/poezio:Z \
-v /contener/poezio-prod/proxychains:/home/poezio-user/proxychains:Z \
fantomfp/poezio-omemo:0.13.1-17.fr.x64 /bin/bash
[poezio-user@1e68dfed5ab0 ~]$ cp /etc/proxychains.conf proxychains/template.conf

Ici, on peut exécuter manuellement n'importe quelle commande dans le container.

Après avoir copié le fichier, il faut le modifier. Il est accessible à l'extérieur du container, dans un répertoire de l'arborescence qui a été faite précédemment :

$ cd /contener/poezio-prod/proxychains/
$ cp template.conf ssh.conf
$ vim ssh.conf

Tout en bas du fichier, dans la rubrique "ProxyList", il faut remplacer la ligne "socks5" par une nouvelle ligne :

[ProxyList]
socks5 172.17.0.1 8061

Ici 8061 est le port d'écoute du proxy SOCKSv5 sur la machine locale.

Pour démarrer le proxy SOCKS, il faut établir la connexion SSH avec la machine distante. La commande SSH à lancer est simple. L'option -D indique l'ouverture d'un port SOCKSv5, "172.17.0.1" est l'adresse de l'interface docker0, et "8061" est le port d'écoute :

$ ssh -D 172.17.0.1:8061 user@machine

Puis, lancer le container de Poezio :

$ sudo docker run -ti -e TERM --log-driver none \
-v /contener/poezio-prod/config:/home/poezio-user/.config/poezio:Z \
-v /contener/poezio-prod/data:/home/poezio-user/.local/share/poezio:Z \
-v /contener/poezio-prod/proxychains:/home/poezio-user/proxychains:Z \
fantomfp/poezio-omemo:0.13.1-17.fr.x64 /usr/bin/proxychains -f proxychains/ssh.conf \
/usr/bin/poezio

Ne pas hésiter à rafraichir l'affichage du terminal avec Ctrl-l deux fois.

Plus besoin de lancer Poezio sur un serveur dédié pour utiliser une adresse IP en datacenter. Il suffit juste d'avoir un accès SSH sur celui-ci.