Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
equipes:devteam:petale_docker_deployment [2020/06/26 14:56] garciaflores créée |
equipes:devteam:petale_docker_deployment [2020/12/03 16:01] (Version actuelle) garciaflores ↷ Page déplacée de systeme:petale_docker_deployment à equipes:devteam:petale_docker_deployment |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====Guide pour déployer des images des microservices de la nouvelle intranet Pétale sur les serveurs du LIPN==== | ====Guide pour déployer des images des microservices de la nouvelle intranet Pétale sur les serveurs du LIPN==== | ||
+ | |||
+ | DOCUMENTATION DE L' | ||
+ | |||
+ | participants: | ||
+ | date: 5-8 juin 2020 | ||
+ | |||
+ | ===I. INSTALLATION DU MODULE D' | ||
+ | 1. Création d'une image docker pour le module d' | ||
+ | 1.1.1 Création du fichier dockerfile Dockerfile / | ||
+ | λ> docker build --pull --rm -f " | ||
+ | 1.2 lancer l' | ||
+ | λ> docker run --rm -it -p 3000: | ||
+ | |||
+ | 2. Le serveur écoute sur localhost | ||
+ | |||
+ | 3. On va rajouter pm2 pour que le serveur soit persistant\\ | ||
+ | 3.1 On édite les fichiers authentification/ | ||
+ | 3.2 On va récréer et rédemmarer | ||
+ | λ> docker build --pull --rm -f " | ||
+ | [PM2] Spawning PM2 daemon with pm2_home=/ | ||
+ | [PM2] PM2 Successfully daemonized | ||
+ | | ||
+ | [PM2] App [authentication_server] launched (1 instances) | ||
+ | |||
+ | ^ App name ^ id ^ version ^ mode ^ pid ^ status ^ restart ^ uptime ^ cpu ^ mem ^ user ^ watching ^ | ||
+ | | authentication_server | 0 | 0.0.0 | fork | 45 | online | 0 | 0s | 0% | 28.6 MB | root | enabled | ||
+ | |||
+ | Use `pm2 show < | ||
+ | Done in 1.28s. | ||
+ | 3.3 PM2 a été intégré à l' | ||
+ | 3.4 On a un problème parce que le containeur s' | ||
+ | authentication on master [!?] took 2s\\ | ||
+ | λ> docker ps -a | ||
+ | CONTAINER ID IMAGE | ||
+ | % | ||
+ | 3.5 ON rajoute la ligne sur FROM Dockerfile\\ | ||
+ | CMD [" | ||
+ | 3.6 ON régénère l' | ||
+ | λ> docker build --pull --rm -f " | ||
+ | 3.6bis (on lance toutes ces commandes depuis authentication/ | ||
+ | 3.7 on relance\\ | ||
+ | λ> docker run --rm -it -p 3000: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 3.8 ON procède à paramétrer le fichier authentification / server / config / auth.js\\ | ||
+ | 3.9 Pour sécuriser l' | ||
+ | λ> docker run --rm -it -p 3000: | ||
+ | (c'est la variable NOD_ENV qui pemrmet de passer les identifiants)\\ | ||
+ | 3.10 (notamment on a balancer tous les données pour s' | ||
+ | 3.11 On fait un commit (`git add Dockerfile`, | ||
+ | |||
+ | 4. On fait lipnssh sur lipn-intranet-dev | ||
+ | |||
+ | 5. on fait git pull sur le serveur | ||
+ | |||
+ | 6. on créer l' | ||
+ | root@lipn-intranet-dev: | ||
+ | 7. Nous avons installée apache2 sur le serveur et ouvert (avec Xavier) un accès vers http:// | ||
+ | |||
+ | 8. On test avec curl si le serveur repond sur le port 3000 | ||
+ | λ> curl localhost: | ||
+ | curl -d ' | ||
+ | {" | ||
+ | garciaflores@villetaneuse: | ||
+ | |||
+ | 8.1 Erreur: | ||
+ | {" | ||
+ | 8.2 Il faut créer un fichier docker.compose.yml dans le root du projet authentification pour contrer le problème des guillemets (docker ne les interpète pas bien)... ce problème concerne la sécurisation des clés d' | ||
+ | root@lipn-intranet-dev: | ||
+ | 8.3 La commande CURL marche à partir de lipnssh avec les identifiants de @jaime (pas avec ceux de Jorge ni avec ceux d' | ||
+ | |||
+ | 9. C'est très bien, on est authenthifié, | ||
+ | 9.1 On modifie la commande LDAP sur server/ | ||
+ | |||
+ | 10. On assume que le servur marche, pusisqu' | ||
+ | |||
+ | 11. On procède à refaire notre docker... | ||
+ | ==client/ | ||
+ | 12. ON a créer le Dockerfile de sorte qu'on désactive nginx et on active Apache | ||
+ | λ> docker build --pull --rm -f " | ||
+ | 12.1 Nous avons un erreur d' | ||
+ | 12.2 ON n' | ||
+ | 12.3 On a finalement compilé l' | ||
+ | |||
+ | 13. Dans le root d' | ||
+ | |||
+ | 14. La commande docker-compose up crée les deux services qu'on vient de définir sur docker-compose.yml | ||
+ | λ> docker-compose up | ||
+ | (Jaime nous explique que la commande docker-compose équivaut à des commandes succéssives du build, mais paramétrées avec un fichier .yml) | ||
+ | |||
+ | 15. Nous avons une erreur sur le docker-compose | ||
+ | ERROR: for authentication-client Cannot start service client: driver failed programming external connectivity on endpoint authentication-client (be8d6229453f396bb2dc7b3bfd150b6f56c58c50218f1db81c6b560a856719c6): | ||
+ | l' | ||
+ | 15.1 ON essaye de sortir notre fichier .env de l' | ||
+ | 15.2 on galère avec les guillemets et l' | ||
+ | 15.3 dans le serveur intranet-dev ça marche | ||
+ | |||
+ | 16. Il faut modifier le proxy pour que lipn.univ-paris13.fr/ | ||
+ | 16.1 ON a éditer le fichier / | ||
+ | ProxyPass / http:// | ||
+ | ProxyPassReverse / http:// | ||
+ | 16.2 Maintenant nous avons un problème de ressources (mais la page réponde sur ) | ||
+ | http:// | ||
+ | [lipn.univ-paris13.fr] | ||
+ | Apache2 Debian Default Page: It works | ||
+ | Apache2 Debian Default Page It works! This is the default welcome page used to test the correct operation of the Apache2 server after installation on Debian systems. If you can read this page, it means that the Apache HTTP server installed at this site is working properly. You should | ||
+ | CMD [" | ||
+ | |||
+ | On clone https:// | ||
+ | |||
+ | [depot.lipn.univ-paris13.fr] | ||
+ | Sign in | ||
+ | - GitLab | ||
+ | LIPN GitLab | ||
+ | |||
+ | On va créer le fichier Dockerfile à la racine de gateway | ||
+ | |||
+ | FROM node: | ||
+ | Working directory | ||
+ | WORKDIR /app | ||
+ | Install dependencies | ||
+ | COPY package*.json . | ||
+ | RUN yarn install | ||
+ | Copy files | ||
+ | COPY . . | ||
+ | Listening port | ||
+ | EXPOSE 8080 | ||
+ | Default command | ||
+ | CMD [" | ||
+ | |||
+ | On attire notre attention sur le fichier gateway.config.yml où son configurés les ports d' | ||
+ | On configure le fichier docker.compose.yml | ||
+ | |||
+ | version: ' | ||
+ | services: | ||
+ | gateway: | ||
+ | container_name: | ||
+ | restart: always | ||
+ | build: . | ||
+ | ports: | ||
+ | - 8080:8080 | ||
+ | environment: | ||
+ | - AUTH_ENDPOINT=http:// | ||
+ | - BOOKING_ENDPOINT=http:// | ||
+ | - PUBLICATION_ENDPOINT=http:// | ||
+ | |||
+ | depuis /gateway on fait docker-compose up\\ | ||
+ | cette commande a créer les images et il a lancer les conteneurs docker\\ | ||
+ | on lance le service d' | ||
+ | cd / | ||
+ | docker-compose up | ||
+ | Nous avons un erreur parce qu' | ||
+ | On configure les ports sur un ficher .env dans /gateway | ||
+ | |||
+ | GATEWAY_PORT=8000 | ||
+ | GATEWAY_HOST=localhost | ||
+ | AUTH_ENDPOINT=http:// | ||
+ | BOOKING_ENDPOINT=http:// | ||
+ | PUBLICATION_ENDPOINT=http:// | ||
+ | |||
+ | root@lipn-intranet-dev: | ||
+ | |||
+ | MAIS l' | ||
+ | On va le ressoudre de la façon suivante: | ||
+ | |||
+ | 25.1 sur le docker.compose on déclare ports: 8000:8080 | ||
+ | c'est à dire, le port extérieur 8000 est redirigé vers le port 8080 du conteneur docker | ||
+ | 25.2 et sur le Docker file on expose 8080\\ | ||
+ | image.png\\ | ||
+ | Télécharger image.png (51.57 KB)\\ | ||
+ | |||
+ | 26 on supprime le fichier .env qu'on avait fait sur /gateway | ||
+ | |||
+ | 27 on démarre le serveur sur intranet-dev avec docker-compose up -d pour lui dire que c'est un daemon\\ | ||
+ | image.png\\ | ||
+ | Télécharger image.png (167.97 KB)\\ | ||
+ | |||
+ | maintenant les conteneurs docker pour l' | ||
+ | Screenshot_20200612_075852.png\\ | ||
+ | Télécharger Screenshot_20200612_075852.png (283.95 KB)\\ | ||
+ | |||
+ | On va tester juste le serveur d' | ||
+ | |||
+ | et nous avons un erreur Bad request | ||
+ | curl -d ' | ||
+ | curl -d ' | ||
+ | Empty reponse from server | ||
+ | |||
+ | On essaye de changer le port du gateway à 8081 sur docker-compose.yml | ||
+ | |||
+ | services: | ||
+ | gateway: | ||
+ | container_name: | ||
+ | restart: always | ||
+ | build: . | ||
+ | ports: | ||
+ | - 8081:8080 | ||
+ | environment: | ||
+ | - GATEWAY_PORT=8080 | ||
+ | - GATEWAY_HOST=localhost | ||
+ | - AUTH_ENDPOINT=http:// | ||
+ | - BOOKING_ENDPOINT=http:// | ||
+ | - PUBLICATION_ENDPOINT=http:// | ||
+ | |||
+ | On essaye de mofidier gateway/ | ||
+ | Notre problème est que les containeurs docker ne communique pas entre eux (gateway est isolé d' | ||
+ | |||
+ | 31.1 On va créer un réseaux virtuel entre containeurs docker | ||
+ | root@lipn-intranet-dev: | ||
+ | root@lipn-intranet-dev: | ||
+ | Jaime ARIAS | ||
+ | docker container exec -it gateway sh | ||
+ | Jorge GARCIA FLORES a envoyé une image | ||
+ | image.png | ||
+ | Télécharger image.png (159.54 KB) | ||
+ | 31.2 Jaime ARIAS vient de se connecter au containeur gateway et de faire un ping vers le containeur authentication-api | ||
+ | Jaime ARIAS a envoyé une image | ||
+ | image.png | ||
+ | Télécharger image.png (38.08 KB) | ||
+ | Jorge GARCIA FLORES | ||
+ | 31.2 Depuis l' | ||
+ | curl authentication-api: | ||
+ | Jorge GARCIA FLORES | ||
+ | 31.3 On va déclarer dans `/ | ||
+ | networks: | ||
+ | default: | ||
+ | external: | ||
+ | name: backend-network | ||
+ | et on crée le réseaux à la main | ||
+ | root@lipn-intranet-dev: | ||
+ | 31.3 Il faut également rajouter le réseau inter conteneur docker backend-network au docker.compose.yml du module d' | ||
+ | networks: | ||
+ | default: | ||
+ | external: | ||
+ | name: backend-network | ||
+ | image.png | ||
+ | Télécharger image.png (79.77 KB) | ||
+ | 31.4 La commande docker network ls nous permet de voir les réseaux actifs | ||
+ | image.png | ||
+ | Télécharger image.png (151.96 KB) | ||
+ | root@lipn-intranet-dev: | ||
+ | Jorge GARCIA FLORES | ||
+ | 31.5.1 gateway écoute sur le port 8081 | ||
+ | 31.5.2 il définit un endpoint d' | ||
+ | AUTH_ENDPOINT=authentication-api: | ||
+ | 31.5.3 dans gateway/ | ||
+ | serviceEndpoints: | ||
+ | authService: | ||
+ | url: ' | ||
+ | si on se connecte dans le conteneur gateway et on lance directement le curl envers authentication, | ||
+ | Omar KEBLI: on t' | ||
+ | image.png | ||
+ | Télécharger image.png (166.05 KB) | ||
+ | si on met les adresses ip harcodés dans gateway-config.yml apparemment ça marche | ||
+ | Jorge GARCIA FLORES | ||
+ | 31.6 Ça ne marche pas... on essaye de fusioner les deux composants dans un seul conteneur docker | ||
+ | Jorge GARCIA FLORES | ||
+ | 31.7 Dès ll' | ||
+ | 31.8 L' | ||
+ | sur la ligne 4 de ce fichier, dans la section " | ||
+ | 32. (à partir de la racine du serveur) | ||
+ | docker-compose.yml gateway | ||
+ | 33. ON va maintenant configurer Apache sur le serveur | ||
+ | root@lipn-intranet-dev:/ | ||
+ | 34. On teste avec curl | ||
+ | curl -d ' | ||
+ | Unauthorizedroot | ||
+ | 35. On teste l' | ||
+ | wget -O- --post-data=' | ||
+ | 35.1 Il ne marche que sur le compte arias mais pas sur celle de jorge ni d'omar | ||
+ | 35.2 l' | ||
+ | 36. ON procède à tester le endpoint de login | ||
+ | curl -d ' | ||
+ | et ÇA MARCHE!!! | ||
+ | {" | ||
+ | 37: On décide de deployer deux conteneur docker par microservice: | ||
+ | s' | ||
+ | 38: ON FAIT L' | ||
+ | 39: On va éditer le docker-compose global à la racine de l' | ||
+ | 40: Pour la compilation du client (authentication_app) on va paser les variables d' | ||
+ | au moment de la compilation des interfaces client vue en html5 | ||
+ | 41: Sur le fichier / | ||
+ | authentication_app | ||
+ | authentication_api | ||
+ | gateway | ||
+ | 42: on configure le fichier / | ||
+ | on configure les endpoints et les ports: | ||
+ | / authentification (port 8080) | ||
+ | /api gateway (port 8081) | ||
+ | 42: ÇA MARCHE DEPUIS L' | ||
+ | 43. Erreur: lorsqu' | ||
+ | localhost:// | ||
+ | 43.1 ON va donc éditer le Dockerfile du client our déclarer les nouvelles variables d' | ||
+ | # Add | ||
+ | ARG NODE_ENV | ||
+ | ENV NODE_ENV $NODE_ENV | ||
+ | |||
+ | ARG API_URL | ||
+ | ARG APP_BASE_URL | ||
+ | 43.2 docker-compose -up | ||
+ | 36. ON procède à tester le endpoint de login | ||
+ | curl -d ' | ||
+ | et ÇA MARCHE!!! | ||
+ | {" | ||
+ | 37: On décide de deployer deux conteneur docker par microservice: | ||
+ | s' | ||
+ | 38: ON FAIT L' | ||
+ | 39: On va éditer le docker-compose global à la racine de l' | ||
+ | 40: Pour la compilation du client (authentication_app) on va paser les variables d' | ||
+ | au moment de la compilation des interfaces client vue en html5 | ||
+ | 41: Sur le fichier / | ||
+ | authentication_app | ||
+ | authentication_api | ||
+ | gateway | ||
+ | 42: on configure le fichier / | ||
+ | on configure les endpoints et les ports: | ||
+ | / authentification (port 8080) | ||
+ | /api gateway (port 8081) | ||
+ | 42: ÇA MARCHE DEPUIS L' | ||
+ | 43. Erreur: lorsqu' | ||
+ | localhost:// | ||
+ | 43.1 ON va donc éditer le Dockerfile du client our déclarer les nouvelles variables d' | ||
+ | # Add | ||
+ | ARG NODE_ENV | ||
+ | ENV NODE_ENV $NODE_ENV | ||
+ | |||
+ | ARG API_URL | ||
+ | ARG APP_BASE_URL | ||
+ | 43.2 docker-compose -up | ||
+ | |||
+ | 43.4 on fait le ménage sur les conteneurs docker actifs (docker rmi suprime des images dans le filesystem) | ||
+ | |||
+ | docker rmi $(docker images | grep none | awk ' | ||
+ | |||
+ | 43.4 Jaime a effacé les images intermediaires en disque (le docker compose est plus rapide maintenant) | ||
+ | |||
+ | |||
+ | 43.5: on édite le package.json du client pour enlever les fichers qui ne sont pas nécessaries en production | ||
+ | 43.6 dans package.json, | ||
+ | en compte nos variables d' | ||
+ | 44: *************ON VA INSTALLER LE MICROSERVICE DE USER MANAGEMENT******* | ||
+ | 45: on fait gitclone à partir du git-lab | ||
+ | |||
+ | 46: On va modifier les variables d' | ||
+ | 47: On modifie le / | ||
+ | 48: docker-compose up --build user-management_api | ||
+ | 48.1: syntax error (ligne 50) | ||
+ | 48.2 On utilise la version 3.4 de docker-compose parce qu' | ||
+ | 49. On a corrigé la déclaration des variables pour les adapter à la dernière versin de docker-compose | ||
+ | 49.1 On a une erreur en essayant de déclarer les variables d' | ||
+ | |||
+ | x-ldap-variables: | ||
+ | environment: | ||
+ | - LDAP_URL=ldap:// | ||
+ | - LDAP_BASE=ou=people, | ||
+ | - LDAP_FILTER=(& | ||
+ | - LDAP_ATTRIBUTES=uid, | ||
+ | - LDAP_ADMIN_USER=cn=admin | ||
+ | - LDAP_ADMIN_PWD=rimichae | ||
+ | |||
+ | nouvelle configuration du service authentication_api<<: | ||
+ | environment: | ||
+ | - NODE_ENV=production | ||
+ | - API_PORT=3000 | ||
+ | 50. On remarque que tous les microservices doivent etre configurés sur le ficher de configuration gatwey-config.yml | ||
+ | 51 maintenant user-management marche! | ||
+ | curl localhost: | ||
+ | " | ||
+ | 52. On configure le gatewaysur / | ||
+ | 53. On devait déclarer la variable JWT_SECRET dans la config d' | ||
+ | 53.Problème avec JWT-SECRET | ||
+ | WARNING: The KL variable is not set. Defaulting to a blank string. | ||
+ | ERROR: Invalid interpolation format for " | ||
+ | 53.1 On l'a corrigé en générant une nouvelle variable JWT_SECRET dans / | ||
+ | 54. On a du répéter la déclaratin de variables sur le docker compose pour que ça marche | ||
+ | 55. Lorsqu' | ||
+ | 56. On peut pas se connecter au port 3001 sur gateway | ||
+ | 57. Le problème est de perspective... chaque containeur doit communiquer sur son port 3000 et tous les contaneurs doivent communiquer | ||
+ | seulement avec le gateway | ||
+ | 57.1 La seule perspective qu'on a à partir de l' | ||
+ | --mon port 3000 | ||
+ | --le gateweay qui me me permet de communiquer avec les autres microservices | ||
+ | 58. curl -H " | ||
+ | localhost: | ||
+ | 58.1 ce curl passe le token d' | ||
+ | :" |