# Déployer un service Dès lors que la chaîne d'intégration a construit une image Docker, il est possible de tester et de déployer le service concerné. ## Test du service Avant de mettre un service en production, il faut vérifier que le service se lance bien comme prévu. Pour ce faire, on se rend sur une machine virtuelle de test (exemple : `pica01-test.picasoft.net`) et on se rend dans `/DATA/docker/dockerfiles`. Il faut être connecté au registre de test pour la suite : on s'assure de bien avoir exécuté la commande `docker login registry.test.picasoft.net`. Les identifiants sont sur le [pass](https://gitlab.utc.fr/picasoft/interne/pass). Pour que le service réponde à nos critères, il faut s'assurer qu'il démarre **indépendamment** de ce qui existe sur la machine. Le script [`docker_test.sh`](./docker_test.sh) s'occupe de tout cela pour vous, tout en s'assurant que les URL soient adaptés à la machine de test, par exemple. Il suffit de lancer la commande `$ ./docker_test.sh <nom du dossier, e.g. pica-mattermost>`. Vérifiez que les logs ne produisent aucune erreur et que le service fonctionne bien sur l'infrastructure de test. En cas d'erreur, vous pouvez lancer des commandes manuellement, relancer le service, changer les fichiers de configurations, etc, pour diagnostiquer. Lorsque le test a fonctionné, on se rend sur la page [Pipelines](https://gitlab.utc.fr/picasoft/projets/dockerfiles/pipelines) on choisit la pipeline correspondant au commit de modification que l'on a testé, et on lance le push de l'image sur le registre de production (`push-prod`). ## Déploiement en production On se rend sur la machine de production, dans le dossier `/DATA/docker/dockerfiles`. Si on déploie un service pour la première fois, il faudra copier les fichiers `*.secrets.example` en `*.secrets`, et remplacer les valeurs d'example par des valeurs **secrètes**. Il faut être connecté au registre de production pour la suite : on s'assure de bien avoir exécuté la commande `docker login registry.picasoft.net`. Les identifiants sont sur le [pass](https://gitlab.utc.fr/picasoft/interne/pass). Si des volumes sont déclarés `external` (ce que nous ne [recommendons pas](./guide_bonnes_pratiques.md)), il faut les créer manuellement au prélable. **Certains services présentes des cas particuliers : regardez bien leur README avant de lancer les commandes qui suivent.** On peut ensuite se rendre dans le dossier et lancer, en général : ```bash # Tirer la nouvelle version des images docker-compose pull # (Re)création des volumes, des réseaux, des conteneurs docker-compose up -d # Lecture des logs docker-compose logs -f ``` Attention : un conteneur noté `Unhealthy` à cause d'un mauvais `HEALTHCHECK` sera **exclu** de Traefik, même s'il fonctionne bien! ## Exemple de test et de déploiement complet Je me rends sur `pica01-test` et je teste la nouvelle version de l'image : ```bash $ ssh qduchemi@pica01-test.picasoft.net qduchemi@pica01-test:~$ cd /DATA/docker/dockerfiles qduchemi@pica01-test:/DATA/docker/dockerfiles$ ./docker_test.sh pica-mattermost Starting procedure for pica-mattermost/... ==== Create dumb secret files ==== File pica-mattermost//secrets/mattermost-db.secrets created ==== Stop and remove existing containers ==== Network docker_default is external, skipping ==== RESET HARD and pull Dockerfiles repository ==== Using branch master, is this correct ? [y/N] y HEAD is now at 472e0d7 [Mattermost] Bump to version 5.19.0 Username for 'https://gitlab.utc.fr': qduchemi Password for 'https://qduchemi@gitlab.utc.fr': Already up-to-date. ==== Replace production URL with testing URL in all files ==== Found in ./entrypoint.sh Found in ./docker-compose.yml ==== Remove and re-create named external volumes ==== mattermost-config mattermost-config mattermost-data mattermost-data mattermost-plugins mattermost-plugins mattermost-db mattermost-db ==== Remove old images ==== Error: No such image: registry.test.picasoft.net/pica-mattermost:5.19.0 Error: No such image: postgres:9.4-alpine ==== Pull new versions of images ==== Pulling mattermost-db ... done Pulling mattermost ... done ==== Lauch pica-mattermost ==== Creating mattermost-db ... done Creating mattermost-app ... done ==== Print logs (use Ctrl+C to stop) ==== Attaching to mattermost-app, mattermost-db [...] ``` Je vérifie que les logs sont ok, je se rend sur [team.test.picasoft.net](https://team.test.picasoft.net) et je constate que tout fonctionne. Je me rends de nouveau sur le [pipeline](https://gitlab.utc.fr/picasoft/projets/dockerfiles/pipelines/54707) et je lance manuellement l'étape `push-prod` pour pousser l'image sur le registre de production. Je me rends ensuite sur la machine de production (`pica02` à ce jour) et je lance la nouvelle version du service : ```bash $ ssh qduchemi@pica02.picasoft.net qduchemi@pica02:~$ cd /DATA/docker/dockerfiles/pica-etherpad qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose pull Pulling mattermost-db ... done Pulling mattermost ... done qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose up -d Recreating mattermost-db ... done Recreating mattermost-app ... done qduchemi@pica02:/DATA/docker/dockerfiles$ docker-compose logs -f Attaching to mattermost-app, mattermost-db [...] ``` J'attends que l'application ait démarré, je vérifie que tout est ok sur [team.picasoft.net](https://team.picasoft.net). La mise à jour est terminée ! :) ## Troubleshooting Cette section répertorie les problèmes anecdotiques indépendants des modifications des fichiers. ### Erreurs de connexion à la base de données Si le conteneur `*-app` n'arrive pas à se connecter à la BDD du conteneur `*-db`, il est possible que `*-db` soit en train de tourner avec des anciens identifiants. Pour corriger ce problème **sur la VM de test**, il faudra: * effacer les conteneurs `*-app` et `*-db` * effacer leurs volumes * créer à nouveau leurs volumes * relancer le script `./docker_test.sh`. **Note:** Le script s'occupe déjà d'effacer et créer à nouveau les volumes, mais ça ne fonctionne pas dans le cas de `pica-etherpad`, probablement dû à un bug de `docker-compose config --volumes` qui retourne `etherpad-db-volume` et non `etherpad-db`.