Skip to content
This repository has been archived by the owner on Jun 19, 2019. It is now read-only.

2.4. La façon "Docker"

Arnaud Bienvenu edited this page Aug 25, 2018 · 8 revisions

Note : cette page va progressivement être traduite en français. Si vous y changez des choses, merci de le signaler également sur la page en anglais, afin qu'un membre de la communauté puisse répercuter le changement la-bas.

Alors comme ça vous voulez utiliser Docker ?

Le but de cette page est de vous fournir un moyen clair et simple d'installer Cozy (de façon fiable et stable) sous Docker. Cependant, une connaissance superficielle de Docker est souhaitable. Pour cela, les étapes 0 à 4 de leur tutoriel est amplement suffisant.

I - Introduction à Docker (les initiés peuvent sauter cette partie)

1 - Qu'est-ce que Docker ?

De façon très basique, Docker permet de faire tourner un logiciel dans un environnement isolé, sur un hôte linux, sans en manger toutes les ressources (la Virtualisation est beaucoup plus gourmande). Pour plus d'infos c'est par là : https://www.docker.com/whatisdocker/

2 - Pourquoi Docker ?

Parceque c'est cool.

Parceque vous voulez quelque chose de léger et que vous ne voulez pas casser votre Ubuntu en bidouillant Cozy.

3 - Pourquoi pas Docker ?

C'est un peu plus compliqué qu'une simple virtualisation (ex. Virtualbox), mais plus efficace.

Si votre materiel est vraiment limité, vous préfererez probablement passer par une installation basique, ou par une image (comme pour le Raspberry Pi).

II - Allons-y ! (Installation)

Ici nous partirons du principe que vous avez déjà une distribution basée sur debian tournant sur votre système. De préférence Ubuntu 15.04 ou plus. Et que vous savez ouvrir un terminal. Sinon, vous devrez trouver un moyen d'installer docker dans votre distribution ou le faire [façon bourrin(https://docs.docker.com/installation/#installation).

sudo apt-get install docker.io

n'oubliez surtout pas ".io" à la fin. Le packet "docker" n'est pas du tout ce qu'on recherche.

Assurez-vous d'avoir la bonne version de Docker (>= 1.4) :

docker version doit donc afficher "Client version: 1.4.0" ou plus. Si ce n'est pas le cas, la commande docker exec, que nous allons beaucoup utiliser ici ne marchera pas.

III - Cozytons !

Oui, déjà.

1 - Installation

Vous pourriez utiliser une image pré-fabriquée, issue des dépôts Docker. C'est rapide, mais pas génial pour un usage personnel (notamment niveau sécurité). Nous utiliserons donc la jolie commande ici présente :

sudo docker build -t cozy/full github.com/cozy-labs/cozy-docker

Pause café n°1 : ça va prendre un bout de temps.

2 - Lancez-le ! (pas trop fort).

Quand l'installation est terminée, vous pouvez démarrer le container "moncozy" via cette commande (astuce : scriptez-la !) :

sudo docker run --restart=always -d -p 80:80 -p 443:443 --name=moncozy --volume=/home/cozy/backup:/media/backup -e DOMAIN=mon.domaine.fr -e TERM=xterm cozy/full

Oula ! Qu'est-ce que je fait ???

Alors, vous démarrez un container nommé --name=moncozy, en tant que superutilisateur (sudo) docker, qui lance run, en tant que démon (-d), l'image cozy/full que vous venez de fabriquer.

Oui mais -p, --restart=always et --volume ?

-p redirige les ports utilisés par cozy vers l'hôte. Vous pouvez indiquer d'autres ports si ceux-ci sont déjà utilisés Par exemple: -p 6500:443. --restart=always demande à docker de tenter à tout prix de redémarrer le container s'il crash ou que l'hôte redémare.

--volume monte un répertoire de l'hôte DANS le container "moncozy". Ca aide pour les sauvegardes. Les répertoires correspondants sont créés automatiquement s'ils n'existent pas.

-e permet de spécifier les environnements notamment pour le nom de domaine mon.domaine.fr qu'il faut ici remplacer par votre nom de domaine (ou "FQDN", pour le certif SSL) et pour le terminal (optionnel, mais permet par exemple d'utiliser "nano" dans le container.

/!\ Le premier démarrage peux prendre longtemps (selon votre puissance de calcul) car Cozy crée un premier certificat SSL. Allez vous faire un autre café. Vous pouvez passer à l'étape suivante quand

top

ne montre plus "openssl" dans les premières lignes. (quittez avec "q").

Est-ce que tout va bien ?

Oui si une jolie page vous accueille sur http://localhost/ (ou bien sur l'adresse de votre hôte). Mais ne cozytez pas tout de suite. Vous voulez probablement préparer la sauvegarde et les certificats auto-signés d'abord.

3 - La config.

Ici le peuple Docker voudra des Dockerfiles ou équivalent. Pour garder les choses simples et facilement configurable, nous n'en parlerons pas. Sauf si bien sûr quelqu'un veux rajouter un chapitre là-dessus.

a - [Facultatif] Mettre à jour le certificat auto-signé.

(sautez cette partie si vous avez bien utilisé -e DOMAIN=mon.domaine.fr lors du lancement)

Cette partie vous permettra d'avoir un vrai certificat auto-signé bien configuré, que vous pourrez importer sur vos appareils (ex. Android avec CAdroid) ou votre navigateur web sans message d'erreur ou risque d'attaque type "l'homme au milieu".

Il y a pour cela cinq commandes à lancer. (Astuce : scriptez-les !)

sudo docker exec moncozy openssl dhparam -out /etc/cozy/dh2048.pem -outform PEM -2 2048

sudo docker exec moncozy openssl genrsa -out /etc/cozy/server.key 2048

Attend attend, je fais qu... vous démarrez openssl dans le container "moncozy" pour faire des trucs de cryptographie.

sudo docker exec -it moncozy openssl req -new -x509 -days 3650 -key /etc/cozy/server.key -out /etc/cozy/server.crt

Euh, et -it c'est quoi ?

Ca permet de répondre à quelques questions dans le terminal. Vous pouvez laisser tout vide SAUF Common Name (e.g. server FQDN or YOUR name) []: où vous DEVEZ mettre l'adresse web de votre hôte (ex : adresse.moncozy.com). Si vous laissez cette question sans réponse, il mettre "localhost" par défaut, et donc il sera impossible d'importer votre certificat sur votre appareil. Et votre navigateur vous affichera encore plus de mise en garde.

sudo docker exec moncozy chmod 640 /etc/cozy/server.key

sudo docker exec moncozy supervisorctl restart nginx

Enfin ! Votre serveur Nginx viens de redémarrer et utilise désormais le bon certificat ! Vous pouvez le vérifier en navigant vers l'adresse de votre hôte (qui peut être https://localhost/ si vous ne travaillez sur un accès externe).

Firefox (ou autre) va alors vous montrer un message d'alerte. Cliquez "Détails techniques" pour vérifier. Le SEUL message d'erreur doit être "Le certificat n'est pas sûr car il est auto-signé." mais PAS "Ce certificat n'est valide que pour localhost". Si c'est le cas, retour à la case départ.

b - Sauvegarder et restaurer.

Une bonne façon de sauvegarder ses données est d'utiliser la fonction de réplication de la base de donnée couchdb avec une autre base de donnée couchdb puis de sauvegarder le fichier de base de donnée.

Pardon ?

*Soupir* On va lier l'endroit où sont stockées les données de Cozy (sa base de donnée) avec un autre endroit de stockage de données (une autre base de donnée) puis on va copier le fichier qu'utilise la seconde base de donnée pour le mettre où vous voulez.

Le nom de la base de donnée est "couchdb". Plus d'infos ici.

Pour parler à la base de donnée nous utiliserons la commande curl suivie de quelques instructions, ainsi que l'interface web Futon.

- Il n'écoute jamais !

Le processus démon de CouchDB tourne DANS le container "moncozy", bien au chaud. Mais il n'écoute pas ! (par défaut il n'écoute que 127.0.0.1).

Forçons-le à écouter en changeant 127.0.0.1 par 0.0.0.0 dans le fichier de conf de couchDB :

sudo docker exec moncozy sed -i "s/127.0.0.1/0.0.0.0/g" /etc/couchdb/default.ini

sudo docker exec moncozy supervisorctl restart couchdb

Ensuite, trouvons l'IP du container :

docker inspect moncozy | grep IPAddress

Et vérifions que couchDB fonctionne.

curl [ipofmoncozy]:5984

Bravo ! Il vous a répondu {"couchdb":"Welcome"... Sinon, il y a un problème.

Yay ?

Oui. Ouvrir un accès libre à couchdb en mettant 0.0.0.0 n'est pas très sécurisé, mais le container docker ne pouvant être accédé que depuis l'hôte, ça va. Il suffit juste de sécuriser l'hôte.

- L'autre CouchDB

Ici nous allons démarrer une autre CouchDB tournant sous Docker. Ici un 2e container appelé "couchdb". Dans ce wiki nous le mettrons sur le même hôte. Cependant vous voudrez mettre votre seconde base de donnée à un autre endroit afin de ne pas tout perdre si vous brûlez votre disque dur.

sudo docker run -d --volume=/home/cozy/backup:/media/backup --name=couchdb klaemo/couchdb

Cette commande télécharge, installe et lance automatiquement l'image non officielle contenant CouchDB. Ce container est bien élevé et écoute déjà l'hôte. Pas besoin de bidouiller sa config cette fois-ci (dans /etc/couchdb/default.ini).

Et on recommence à chercher l'IP : docker inspect couchdb | grep IPAddress

Sécurisez couchdb en vous connectant à http://[IP_de_couchdb]:5985/_utils/ et en configurant un utilisateur et un mot de passe.

Ensuite cliquez sur "Create Database …" et créez une base appellée "cozy". Elle servira juste après.

- Qu'ils se parlent enfin.

A l'aide de votre navigateur préféré allez sur http://[IP_de_moncozy]:5984/_utils/replicator.html

Ici vous pourrez vous connecter (en bas à droite) avec l'identifiant et le mot de passe du CouchDB de "moncozy". Vous les trouverez à l'aide de cette commande :

sudo docker exec moncozy cat /etc/cozy/couchdb.login

Une fois connecté, sélectionnez "local database" => Cozy, sur la partie gauche, et "remote database" sur la droite. Entrez : http://[nom_d'utilisateur_couchdb]:[mdp_couchdb]@[IP_de_couchdb]:5984/cozy

Astuce : rendez-ça "continuous" si vous voulez un miroir en temps réel !

Si ça marche, vous verrez quelque chose apparaitre dans "Event". Si rien ne s'affiche au bout de quelque secondes, quelque chose ne va pas. Trouvez quoi en tapant ça :

sudo docker exec moncozy tail -n 50 /var/log/couchdb/couch.log

Vous pouvez répéter cette commande de débogage pour le container couchdb si nécessaire.

- Sauvegarder et restaurer le fichier de la base de donnée.

Ici nous allons sauvegarder le fichier de la base de donnée. Nous ne travaillerons que depuis le container "couchdb".

Pourquoi ? Parcequ'il est plus facile de sauvegarder et de restaurer ce fichier quand vous contrôlez les mots de passe. En effet, chaque vous que vous re-créez le container cozy depuis 0, le nom d'utilisateur et le mot de passe changent, ce qui peux compliquer les choses quand vous restaurez le fichier cozy.couch.

Sauvegardons :

docker exec moncozy cp -a /var/lib/couchdb/cozy.couch /media/backup/cozy.couch

Donc ici nous copions, en mode archive -a le fichier cozy.couch et le mettons dans le répertoire /home/cozy/backup de l'hôte.

Quoiiiiii ? Mais ce répertoire n'apparait pas dans la ligne de commande !

En effet. Nous travaillons ici DANS le container couchdb. Or, quand nous l'avons lancé, nous lui avons demandé de monter le répertoire de l'hôte /home/cozy/backup sur le répertoire /media/backup du container couchdb.

Donc après cette commande vous trouverez le fichier de la base de donnée cozy.couch dans /home/cozy/backup. Si vous voulez le mettre dans un autre répertoire, vous devrez le prévoir au démarrage du container, ici.

Restaurons : docker exec moncozy cp -a /media/backup/cozy.couch /var/lib/couchdb/cozy.couch

Et voila ! Vous aurez peut-être besoin de ré-activer la réplication, voire de redémarrer couchdb après ça [tests plus approfondis nécessaires].

IV - Apprenez à redémarrer et à tout remettre à zéro.

1 - Redémarrer.

Hey, j'ai du redémarrer l'hôte, dois-je lancer la commande "run" à nouveau ?

NON.

Vos containers sont toujours là, et ont du redémarrer automatiquement si vous avez bien mis la fonction --restart au moment de lancer le container pour la première fois. Sinon redémarrez-les comme ça :

docker start moncozy couchdb

Et tout doit être revenu.

2 - Remise à zéro.

Hey, je veux TOUT recommencer à zéro, est-ce que je lance à nouveau la commande "run" ?

NON. Euh... oui... euh... un peu des deux ?

D'abord, purgeons les anciens containers : Listons-les :

docker ps

Si vous n'avez pas fait trop de bêtises, il ne devrait ici y avoir que "moncozy" et "couchdb" et leurs identifiants. Retirez-les AVEC leurs fichiers systèmes (avec -v), ou leur fantôme hantera votre ordinateur pour toujours. Ou presque. En fait ils prendrons surtout beaucoup de place jusqu'à ce que vous alliez fouiner dans les fichiers systèmes de Docker.

docker rm -v moncozy couchdb

3 - Restauration

Hem, je veux repartir de zéro, mais en restaurant ma vieille base de donnée, qu'est-ce que je fait ?

Vous recommencez tout à nouveau. Si vous avez fait quelques scripts la première fois, c'est rapide et facile. N'oubliez pas de restaurer le fichier de base de donnée VERS couchdb PUIS d'appliquer le processus de réplication.