**Ceci est une ancienne révision du document !**
Guide pour déployer des images des microservices de la nouvelle intranet Pétale sur les serveurs du LIPN
DOCUMENTATION DE L'INSTALL DES MODULES D'AUTHENTIFICATION, PUBLICATIONS ET SALLES DE RÉUNION SUR LIPN-INTRANET-DEV
participants: Omar, Jaime, Jorge
date: 5-8 juin 2020
I. INSTALLATION DU MODULE D'AUTHENTIFICATION D'UTILISATEURS SUR INTRANET-DEV
1. Création d'une image docker pour le module d'AUTHENTIFICATION
1.1.1 Création du fichier dockerfile Dockerfile /server/Dockerfile
λ> docker build –pull –rm -f “server/Dockerfile” -t authentication:latest “server”
1.2 lancer l'image docker
λ> docker run –rm -it -p 3000:3000/tcp authentication:latest
2. Le serveur écoute sur localhost
3. On va rajouter pm2 pour que le serveur soit persistant
3.1 On édite les fichiers authentification/server package.json et process.json pour rajouter pm2
3.2 On va récréer et rédemmarer l'image docker
λ> docker build –pull –rm -f “server/Dockerfile” -t authentication-server:latest “server”
[PM2] Spawning PM2 daemon with pm2home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2][WARN] Applications authenticationserver not running, starting…
[PM2] App [authenticationserver] launched (1 instances)
┌───────────────────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├───────────────────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ authenticationserver │ 0 │ 0.0.0 │ fork │ 45 │ online │ 0 │ 0s │ 0% │ 28.6 MB │ root │ enabled │
└───────────────────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use pm2 show <id|name>
to get more details about an app
Done in 1.28s.
3.3 PM2 a été intégré à l'image
3.4 On a un problème parce que le containeur s'arrête…
authentication on master [!?] took 2s
λ> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
%
3.5 ON rajoute la ligne sur FROM Dockerfile
CMD [“npx”, “pm2-runtime”, “process.json”]
3.6 ON régénère l'image docker
λ> docker build –pull –rm -f “server/Dockerfile” -t authentication-server:latest “server”
3.6bis (on lance toutes ces commandes depuis authentication/server)
3.7 on relance
λ> docker run –rm -it -p 3000:3000/tcp authentication-server:latest
2020-06-05T14:19:38: PM2 log: Launching in no daemon mode
2020-06-05T14:19:38: PM2 log: [Watch] Start watching authenticationserver
2020-06-05T14:19:38: PM2 log: App [authenticationserver:0] starting in -fork mode-
2020-06-05T14:19:38: PM2 log: App [authenticationserver:0] online
2020-06-05 14:19 +00:00: GET / 200 8.003 ms - 35
3.8 ON procède à paramétrer le fichier authentification / server / config / auth.js
3.9 Pour sécuriser l'accès au ldap on va d'abord passer les identifiants ldap de michael par ligne de commande
λ> docker run –rm -it -p 3000:3000/tcp -e NODEENV=production authentication-server:latest
(c'est la variable NOD_ENV qui pemrmet de passer les identifiants)
3.10 (notamment on a balancer tous les données pour s'authentifier sur des variables d'environement)
3.11 On fait un commit (git add Dockerfile, process.json, ) et push
4. On fait lipnssh sur lipn-intranet-dev
5. on fait git pull sur le serveur
6. on créer l'image docker sur le serveur lipn-intranet-dev
root@lipn-intranet-dev:~/authentication/server# docker build -t authentication-server
7. Nous avons installée apache2 sur le serveur et ouvert (avec Xavier) un accès vers
http://lipn.univ-paris13.fr/intranet
8. On test avec curl si le serveur repond sur le port 3000
λ> curl localhost:3000
curl -d '{“username”: “pepito”, “password”: “peye”}' -H “Content-Type: application/json” 192.168.90.43:3000/login
{“error”:{“message”:“\”ldap://lipn-ldap-maitre:389\“ is an invalid LDAP url (protocol)”}}garciaflores@villetaneuse:~$ 8.1 Erreur: {“error”:{“message”:“\”ldap://lipn-ldap-maitre:389\“ is an invalid LDAP url (protocol)”}} 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'authentification dans des fichier des variables d'environnement
root@lipn-intranet-dev:~/authentication# docker-compose up
8.3 La commande CURL marche à partir de lipnssh avec les identifiants de @jaime (pas avec ceux de Jorge ni avec ceux d'Omar) 9. C'est très bien, on est authenthifié, mais on doit vérifier que le compte soit soit actif dans le LDAP 9.1 On modifie la commande LDAP sur server/config/auth.js (ligne 11) 10. On assume que le servur marche, pusisqu'il a authenthifié Jaime (mais pas )mar et Jorge: on procède donc à l'instaallation du client 11. On procède à refaire notre docker… client/Dockerfile 12. ON a créer le Dockerfile de sorte qu'on désactive nginx et on active Apache λ> docker build –pull –rm -f “client/Dockerfile” -t authentication-client:latest “client” 12.1 Nous avons un erreur d'installation de python 2 dans la ligne 4 du docker 12.2 ON n'arrive pas à construire l'image docker… on essaye sur lipn-dev 12.3 On a finalement compilé l'image client docker 13. Dans le root d'authentification on va éditer le fichier docker-compose.yml pour que le service d'authentification soit crée au même temps que le serveur. On ajoute le champs 'restart:always' afin que le service soit toujours actif 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) 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): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address l'image docker ne lis pas le champ JWT_SECRET de notre .env 15.1 ON essaye de sortir notre fichier .env de l'image docker 15.2 on galère avec les guillemets et l'image docker 15.3 dans le serveur intranet-dev ça marche 16. Il faut modifier le proxy pour que lipn.univ-paris13.fr/intranet-dev point sur localhost:8080 16.1 ON a éditer le fichier /etc/apache2/sites-enabled pour déclarer le proxy ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ 16.2 Maintenant nous avons un problème de ressources (mais la page réponde sur ) http://lipn.univ-paris13.fr/intranet-dev [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 [“npx”, “pm2-runtime”, “process.json”]
On clone https://depot.lipn.univ-paris13.fr/etamine/plugins/gateway sur la racine de lipn-intranet-dev
[depot.lipn.univ-paris13.fr] Sign in - GitLab LIPN GitLab
On va créer le fichier Dockerfile à la racine de gateway Jorge GARCIA FLORES (Fri, Jun 12, 6:56 AM)FROM node:lts-alpine Working directory WORKDIR /app Install dependencies COPY package*.json . RUN yarn install Copy files COPY . . Listening port EXPOSE 8080 Default command CMD ["npx", "pm2-runtime", "process.json"] On attire notre attention sur le fichier gateway.config.yml où son configurés les ports d'écoute de gateway
Jorge GARCIA FLORES a envoyé une image image.png Télécharger image.png (109.93 KB) Jorge GARCIA FLORES
On configure le fichier docker.compose.yml
version: '3.1'
services: gateway: containername: gateway restart: always build: . ports: - 8080:8080 environment: - AUTHENDPOINT=http://localhost:3000 - BOOKINGENDPOINT=http://localhost:3001 - PUBLICATIONENDPOINT=http://localhost:3002 Jorge GARCIA FLORES 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'authentification cd /authentification/ docker-compose up Nous avons un erreur parce qu'autant le service d'authentification que le gateway utilisent le port 8080 On configure les ports sur un ficher .env dans /gateway
GATEWAYPORT=8000 GATEWAYHOST=localhost AUTHENDPOINT=http://localhost:3000 BOOKINGENDPOINT=http://localhost:3001 PUBLICATION_ENDPOINT=http://localhost:3002
root@lipn-intranet-dev:~/gateway# docker-compose up --build
MAIS l'erreur persiste (gateway continue à écouter sur le port 8080)
On va le ressoudre de la façon suivante:
image.png Télécharger image.png (66.5 KB) 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'authentification et pour le gatweays sont lancés
et sur le navigateur depuis l'extérieur l'adresse lipn.univ-paris13.fr/intranet-dev réponds… Screenshot20200612075852.png Télécharger Screenshot20200612075852.png (283.95 KB)
On va tester juste le serveur d'authentification à travers gateway
et nous avons un erreur Bad request curl -d '{“username”: “pepito”, “password”:“peye”}' -H “Content-Type: application/json” 192.168.90.43:3000/login curl -d '{“username”: “pepito”, “password”:“peye”}' -H “Content-Type: application/json” 192.168.90.43:3000/login Empty reponse from server
On essaye de changer le port du gateway à 8081 sur docker-compose.yml
services: gateway: containername: gateway restart: always build: . ports: - 8081:8080 environment: - GATEWAYPORT=8080 - GATEWAYHOST=localhost - AUTHENDPOINT=http://localhost:3000 - BOOKINGENDPOINT=http://localhost:3001 - PUBLICATIONENDPOINT=http://localhost:3002 Jorge GARCIA FLORES
On essaye de mofidier gateway/config/gateway.config.yml pour configurer directement le port 8081
Jorge GARCIA FLORES
Notre problème est que les containeurs docker ne communique pas entre eux (gateway est isolé d'authentication)
31.1 On va créer un réseaux virtuel entre containeurs docker
root@lipn-intranet-dev:~# docker network connect mybridge authentication-api
root@lipn-intranet-dev:~# docker network connect mybridge authentication-api
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'interieur du conaieneur gateway on fait un curl vers le containeur authentication-api
curl authentication-api:3000
Jorge GARCIA FLORES
31.3 On va déclarer dans /gateway/docker-compose.yml' le réseux "backend" pour tous le microservice de Pétale (qui seront tous de conteneurs docker: un par microservice)
networks:
default:
external:
name: backend-network
et on crée le réseaux à la main
root@lipn-intranet-dev:~/gateway# docker network create -d bridge backend-network
31.3 Il faut également rajouter le réseau inter conteneur docker backend-network au docker.compose.yml du module d'authentification
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:~/authentication# docker container exec -it gateway sh nous permet de nous connecter dans gateway pour faire ping sur authentication
Jorge GARCIA FLORES
31.5.1 gateway écoute sur le port 8081
31.5.2 il définit un endpoint d'authentification dans le docker compose
AUTH_ENDPOINT=authentication-api:3000
31.5.3 dans gateway/config/gateway-config.yml on fait référence au meme endpoint
serviceEndpoints:
authService:
url: '${AUTH_ENDPOINT:-authentication-api:3000}'
si on se connecte dans le conteneur gateway et on lance directement le curl envers authentication, il marche
Omar KEBLI: on t'entends mal Omar
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'intérieur ça marche /app # curl -d '{"username": "pepito", "password":"peye"}' -H "Content-Type: application/json" localhost:8081/login Unauthorized
31.8 L'erreur était issu d'une configuration érronée dans le fichier root@lipn-intranet-dev:~/gateway/config/gateway-config.yml
sur la ligne 4 de ce fichier, dans la section "http", la valeur était "localhost". Jaime a enlevé ce champ et tout a marché...
32. (à partir de la racine du serveur)
docker-compose.yml gateway
33. ON va maintenant configurer Apache sur le serveur
root@lipn-intranet-dev:/etc/apache2/sites-available# vim 000-default.conf
34. On teste avec curl
curl -d '{"username": "pepito", "password":"peye"}' -H "Content-Ty
Unauthorizedroot
35. On teste l'authentication avec curl depuis la pasarelle lipnssh
wget -O- --post-data='{"username":"arias","password":"peyeroski"}' --header='Content-Type:application/json' 192.168.90.43/login
35.1 Il ne marche que sur le compte arias mais pas sur celle de jorge ni d'omar
35.2 l'erreur vient du LDAP... le champ accountStatus a la valeur active pour le compte de Jaime et active22 pour celui d'Omar et Jorge
36. ON procède à tester le endpoint de login
curl -d '{"username": "pepito", "password":"peye"}' -H "Content-Type: application/json" 192.168.90.43/login
et ÇA MARCHE!!!
{"user":{"dn":"uid=garciaflores,ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"garciaflores","mail":"garciaflores@lipn.univ-paris13.fr","displayName":"Jorge Garcia flores","accountStatus":"active22"},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MjQ4NDgwNX0.iWNiq8ff5AfOtFm0sPInYEuuEp4x7jRiRiIVE06EtBU"}
37: On décide de deployer deux conteneur docker par microservice: un pour le client et un pour le serveur. Il va nous falloir des stress test pour
s'assurer que cette multiplicité de conteneurs docker ne plonge pas la performance...
38: ON FAIT L'IMAGE DU CLIENT D'AUTHENTIFICATION!!!
39: On va éditer le docker-compose global à la racine de l'application
40: Pour la compilation du client (authentication_app) on va paser les variables d'environement dans le build pour qu'elles soit accessibles
au moment de la compilation des interfaces client vue en html5
41: Sur le fichier /docker-compose on a trois conteneur par le moment (section services):
authentication_app
authentication_api
gateway
42: on configure le fichier /etc/apache2/sites-enabled/000-default.conf
on configure les endpoints et les ports:
/ authentification (port 8080)
/api gateway (port 8081)
42: ÇA MARCHE DEPUIS L'EXTÉRIEUR (ON A L'ÉCRAN DE LOGIN)
43. Erreur: lorsqu'on essaye de s'authentifier, l'onglet réseaux de la console d'inspection du navigateur nous envoie vers
localhost://3000
43.1 ON va donc éditer le Dockerfile du client our déclarer les nouvelles variables d'environnement /authentification/client/Dockerfile
# 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 '{"username": "pepito", "password":"peye"}' -H "Content-Type: application/json" 192.168.90.43/login
et ÇA MARCHE!!!
{"user":{"dn":"uid=garciaflores,ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"garciaflores","mail":"garciaflores@lipn.univ-paris13.fr","displayName":"Jorge Garcia flores","accountStatus":"active22"},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MjQ4NDgwNX0.iWNiq8ff5AfOtFm0sPInYEuuEp4x7jRiRiIVE06EtBU"}
37: On décide de deployer deux conteneur docker par microservice: un pour le client et un pour le serveur. Il va nous falloir des stress test pour
s'assurer que cette multiplicité de conteneurs docker ne plonge pas la performance...
38: ON FAIT L'IMAGE DU CLIENT D'AUTHENTIFICATION!!!
39: On va éditer le docker-compose global à la racine de l'application
40: Pour la compilation du client (authentication_app) on va paser les variables d'environement dans le build pour qu'elles soit accessibles
au moment de la compilation des interfaces client vue en html5
41: Sur le fichier /docker-compose on a trois conteneur par le moment (section services):
authentication_app
authentication_api
gateway
42: on configure le fichier /etc/apache2/sites-enabled/000-default.conf
on configure les endpoints et les ports:
/ authentification (port 8080)
/api gateway (port 8081)
42: ÇA MARCHE DEPUIS L'EXTÉRIEUR (ON A L'ÉCRAN DE LOGIN)
43. Erreur: lorsqu'on essaye de s'authentifier, l'onglet réseaux de la console d'inspection du navigateur nous envoie vers
localhost://3000
43.1 ON va donc éditer le Dockerfile du client our déclarer les nouvelles variables d'environnement /authentification/client/Dockerfile
# 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 '{print $3;}')
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, axios continue de prendre localhost (on galère pour que les différentes bibliothèques du client prennent
en compte nos variables d'environnement)
44: *************ON VA INSTALLER LE MICROSERVICE DE USER MANAGEMENT*******
45: on fait gitclone à partir du git-lab
46: On va modifier les variables d'environement de la configuration de user-MANAGEMENT
47: On modifie le /docker-compose pour définir la section user-management-api
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'elle nous permet de déclarer des variables
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'environnement
x-ldap-variables: &ldap-variables
environment:
- LDAP_URL=ldap://lipn-ldap-maitre:389
- LDAP_BASE=ou=people,dc=univ-paris13,dc=fr
- LDAP_FILTER=(&(uid={{username}})(accountStatus=active*))
- LDAP_ATTRIBUTES=uid, mail, displayName, accountStatus
- LDAP_ADMIN_USER=cn=admin
- LDAP_ADMIN_PWD=rimichae
nouvelle configuration du service authentication_api<<: *ldap-variables
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:3001/user
"controls":[],"uid":"radji","cn":"RADJI WARIS","sn":"RADJI","givenName":"WARIS","mail":"wradji64@gmail.com"},{"dn":"uid=msa, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"msa","cn":"Msa Nodjimba","sn":"Msa","givenName":"Nodjimba","mail":"msa@lipn.univ-paris13.fr"},{"dn":"uid=harang, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"harang","cn":"HARANG Romain","sn":"HARANG","givenName":"Romain","mail":"harang@lipn.univ-paris13.fr"},{"dn":"uid=elhaj-lahsen, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"elhaj-lahsen","cn":"Elhaj-Lahsen Hugo","sn":"Elhaj-Lahsen","givenName":"Hugo","mail":"elhaj-lahsen@lipn.univ-paris13.fr"},{"dn":"uid=quentin.david, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"quentin.david","cn":"DAVID Quentin","sn":"DAVID","givenName":"Quentin","mail":"quentin.david@lipn.univ-paris13.fr"},{"dn":"uid=rousselin, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"rousselin","cn":"Rousselin Pierre","sn":"Rousselin","givenName":"Pierre","mail":"rousselin@math.univ-paris13.fr"},{"dn":"uid=buffiere, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"buffiere","cn":"Buffière Théophile ","sn":"Buffière","givenName":"Théophile ","mail":"buffiere@lipn.univ-paris13.fr"},{"dn":"uid=mittal, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"mittal","cn":"Mittal Aayush","sn":"Mittal","givenName":"Aayush","mail":"aayushmittalaayush@gmail.com"},{"dn":"uid=darya.pchelina, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"darya.pchelina","cn":"Pchelina Darya","sn":"Pchelina","givenName":"Darya","mail":"darya.pchelina@lipn.univ-paris13.fr"},{"dn":"uid=chinaud-chaix, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"chinaud-chaix","cn":"Chinaud-Chaix Clémence","sn":"Chinaud-Chaix","givenName":"Clémence","mail":"chinaud-chaix@lipn.univ-paris13.fr"},{"dn":"uid=gayral, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"gayral","cn":"Gayral Leo","sn":"Gayral","givenName":"Leo","mail":"gayral@lipn.univ-paris13.fr"}]root@lipn-intranet-dev:~#
52. On configure le gatewaysur /gateway/config/gateway-config.yml
53. On devait déclarer la variable JWT_SECRET dans la config d'authentication
53.Problème avec JWT-SECRET
WARNING: The KL variable is not set. Defaulting to a blank string.
ERROR: Invalid interpolation format for "environment" option in service "authentication_api": "JWT_SECRET=K4$KL)wc6%'Y$6{"
53.1 On l'a corrigé en générant une nouvelle variable JWT_SECRET dans /docker-compose
54. On a du répéter la déclaratin de variables sur le docker compose pour que ça marche
55. Lorsqu'on fait une requête curl avec le token d'authentication , on a une erreur de Bad Gateway
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'intérieur des conteneurs docker est
--mon port 3000
--le gateweay qui me me permet de communiquer avec les autres microservices
58. curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1hcmlhcywgb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiYXJpYXMiLCJtYWlsIjoiYXJpYXNAbGlwbi51bml2LXBhcmlzMTMuZnIiLCJkaXNwbGF5TmFtZSI6IkphaW1lIEFyaWFzIiwiYWNjb3VudFN0YXR1cyI6ImFjdGl2ZSIsImlhdCI6MTU5MjU3NjE4N30.0UxjmXCVfgnAZzRC8aH9j-ZtoxO7OjHuNg10wsSOnpo"
localhost:8081/user
58.1 ce curl passe le token d'authentication et renvoie une liste de tous les utilisateurs
:"Desel Jörg","sn":"Desel","givenName":"Jörg","mail":"desel@lipn.univ-paris13.fr"},{"dn":"uid=bennani, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"bennani","cn":"Bennani Mohamed Taha","sn":"Bennani","givenName":"Mohamed Taha","mail":"bennani@lipn.univ-paris13.fr"},{"dn":"uid=floquet, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"floquet","cn":"Floquet Nicolas","sn":"Floquet","givenName":"Nicolas","mail":"floquet@lipn.univ-paris13.fr"},{"dn":"uid=zammit, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"zammit","cn":"ZAMMIT Alban","sn":"ZAMMIT","givenName":"Alban","mail":"zammit@lipn.univ-paris13.fr"},{"dn":"uid=kryukov, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"kryukov","cn":"Kryukov Aleksander","sn":"Kryukov","givenName":"Aleksander","mail":"aleksander.kryukov9@etu.univ-lorraine.fr"},{"dn":"uid=arcaini, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"arcaini","cn":"Arcaini Paolo","sn":"Arcaini","givenName":"Paolo","mail":"arcaini@nii.ac.jp"},{"dn":"uid=gitlab, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"gitlab","cn":"Gitlab LIPN","sn":"Gitlab","givenName":"LIPN","mail":"gitlab@lipn.univ-paris13.fr"},{"dn":"uid=mansour, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"mansour","cn":"Mansour Yanis","sn":"Mansour","givenName":"Yanis","mail":"mansouryanis6@gmail.com"},{"dn":"uid=radji, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"radji","cn":"RADJI WARIS","sn":"RADJI","givenName":"WARIS","mail":"wradji64@gmail.com"},{"dn":"uid=msa, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"msa","cn":"Msa Nodjimba","sn":"Msa","givenName":"Nodjimba","mail":"msa@lipn.univ-paris13.fr"},{"dn":"uid=harang, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"harang","cn":"HARANG Romain","sn":"HARANG","givenName":"Romain","mail":"harang@lipn.univ-paris13.fr"},{"dn":"uid=elhaj-lahsen, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"elhaj-lahsen","cn":"Elhaj-Lahsen Hugo","sn":"Elhaj-Lahsen","givenName":"Hugo","mail":"elhaj-lahsen@lipn.univ-paris13.fr"},{"dn":"uid=quentin.david, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"quentin.david","cn":"DAVID Quentin","sn":"DAVID","givenName":"Quentin","mail":"quentin.david@lipn.univ-paris13.fr"},{"dn":"uid=rousselin, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"rousselin","cn":"Rousselin Pierre","sn":"Rousselin","givenName":"Pierre","mail":"rousselin@math.univ-paris13.fr"},{"dn":"uid=buffiere, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"buffiere","cn":"Buffière Théophile ","sn":"Buffière","givenName":"Théophile ","mail":"buffiere@lipn.univ-paris13.fr"},{"dn":"uid=mittal, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"mittal","cn":"Mittal Aayush","sn":"Mittal","givenName":"Aayush","mail":"aayushmittalaayush@gmail.com"},{"dn":"uid=darya.pchelina, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"darya.pchelina","cn":"Pchelina Darya","sn":"Pchelina","givenName":"Darya","mail":"darya.pchelina@lipn.univ-paris13.fr"},{"dn":"uid=chinaud-chaix, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"chinaud-chaix","cn":"Chinaud-Chaix Clémence","sn":"Chinaud-Chaix","givenName":"Clémence","mail":"chinaud-chaix@lipn.univ-paris13.fr"},{"dn":"uid=gayral, ou=people,dc=univ-paris13,dc=fr","controls":[],"uid":"gayral","cn":"Gayral Leo","sn":"Gayral","givenName":"Leo","mail":"gayral@lipn.univ-paris13.fr"}]root@lipn-intranet-dev:~/gateway/config#
59************ON VA CLONER PUBLICATIONS***************+
git clone https://depot.lipn.univ-paris13.fr/etamine/plugins/publications.git
60. On va faire un dockerfile pour le serveur de publications
61. On lance la commande
grep -ri "process.env" .
pour trouver toutes les variables d'environement utilisé par le microservice
variables d'environement pour publications:
- NODE_ENV
- API_PORT
- STORAGE_PATH
- DB_NAME
- DB_HOST
- DB_PORT
62. On a modifié le fichier /publications/server/bin/www
pour changer PORT par API_PORT
63. On rajoute les variables d'environement avec ses valeurs
64. On lance
$ docker-compose up publications_api
65. WARNING: Image for service publications_api was built because it did not already exist. To rebuild this image you must use
docker-comp
Creating publications-api … done
Attaching to publications-api
publications-api | 2020-06-19T15:34:22: PM2 log: Launching in no daemon mode
publications-api | 2020-06-19T15:34:23: PM2 log: [Watch] Start watching publicationsserver
publications-api | 2020-06-19T15:34:23: PM2 log: App [publicationsserver:0] starting in -fork mode-
publications-api | 2020-06-19T15:34:23: PM2 log: App [publications_server:0] online
- Normalement on peut faire Ctrl-C ici parce que nous avons le message “online”
- MAIS nous n'avons pas mongodb
- On ajoute le service databse dans docker compose
- On relance # docker-compose up publicationsapi Attaching to publications-api publications-api | 2020-06-19T15:42:44: PM2 log: Launching in no daemon mode publications-api | 2020-06-19T15:42:44: PM2 log: [Watch] Start watching publicationsserver publications-api | 2020-06-19T15:42:44: PM2 log: App [publicationsserver:0] starting in -fork mode- publications-api | 2020-06-19T15:42:44: PM2 log: App [publicationsserver:0] online publications-api | 2020-06-19 15:42 +00:00: Mongoose default connection is open to mongodb:database:27017/publications 70. on édite le fichier /docker-compose.yml pour configuer le serveur de publications pour qu'il réponde sur http://publications_api:3000 71. Quel curl faut-il qu'on consulte pour vérifier que le serveur de publications marche? 72: Depuis l'extérieur, pour tester le serveur d'authentication, on se connecte sur curl -d '{“username”: “pepito”, “password”: “peye”}' -H “Content-Type: application/json” 192.168.90.43:8081/login parce que le port 3000 est configuré sur docker-compose.yml 73: pour tester si le serveur de publications marche avec curl je fais la requête suivante: $ curl localhost:8081/publication Unauthorized 74. pour reçevoir la liste de publications je dois donner un token curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1hcmlhcywgb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiYXJpYXMiLCJtYWlsIjoiYXJpYXNAbGlwbi51bml2LXBhcmlzMTMuZnIiLCJkaXNwbGF5TmFtZSI6IkphaW1lIEFyaWFzIiwiYWNjb3VudFN0YXR1cyI6ImFjdGl2ZSIsImlhdCI6MTU5MjU3NjE4N30.0UxjmXCVfgnAZzRC8aH9j-ZtoxO7OjHuNg10wsSOnpo” localhost:8081/publication 75. Pour experimenter, on teste le navigateur sur https://lipn.univ-paris13.fr/intranet-dev/api/publicationc ou https://lipn.univ-paris13.fr/intranet-dev/api/hal ou https://lipn.univ-paris13.fr/intranet-dev/api/user et on reçoit la réponse Unauthorized sur des adresses valables 76. curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbC réponse: bad gateway 77. docker log publications_api pour voir l'erreur 78. Nous avons la même erreur sur intranet-dev… # curl localhost:8081/publication Unauthorized 79. Ali va faire un teste curl à partir d'un serveur de publications qui tourne sur sa machine $ curl -X GET http://localhost:3000/publication [{“type”:“Article”,”authors“:[{“username”:“amy”,”lastName“:“Kroker”,”firstName“:“Amy”},{“username”:“bender”,”lastName“:“Rodríguez”,”firstName“:“Bender”},{“username”:“fry”,”lastName“:“Fry”,”firstName“:“Philip”}],”id“:“5edf61754742b879860cca6d”,”custom“:{“labCategory”:“livr”,”labStatus“:“apar”,”labTime“:“ant”,”labTop“:“ving”},”key“:“a33667d13d”,”title“:“qw”,”year“:2020,”pages“:“12”,”doi“:“12”,”month“:1,”address“:“1ww”,”url“:“http://test.test”,”note“:“wef”,”abstract“:“rg”,”journal“:“qw”,”publisher“:“qw”,”volume“:“1”,”number“:“1”,”createdby“:“testuser”,”modifiedby“:“testuser”,”_v“:0}] 80. Jaime fait un test sans gateway (sur docker-compose.yml il a exposé le port 3000) 81. Il faut relancer le gateway # docker-compose down # docker-compose up -d # docker logs gateway # docker logs publications_api 82. root@lipn-intranet-dev:~# curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4” -X GET localhost:8081/publication []root@lipn-intranet-dev:~# 83. Test réussi! (il fallait faire docker-compose down et docker-compose up pour prendre en compte nos modifs) 84. On essaye de voir comment on peut réproduire ce même test avec http, que Jaime vient d'installer http PUT httpbin.org/put X-API-Token:123 name=John 85. La commande http suivante donne le même résultat que le curl http GET localhost:8081/publication 'Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4' 86. On essaye d'installer le client de publications, donc on va créer un Dockerfile sur /publications/client 87. Maintenant on va configurer /docker-compose.yml 87.1 Nous avons un doute sur la valeur de la variable d'environement APPBASEURL=/intranet-dev Faut-il mettre /intranet-dev/publications ? 88. El lancer le build avec docker-compose up -d –build publications_app $ yarn install yarn install v1.22.4 [1/4] Resolving packages… [2/4] Fetching packages… info fsevents@1.2.4: The platform “linux” is incompatible with this module. info “fsevents@1.2.4” is an optional dependency and failed compatibility check. Excluding it from installation. info fsevents@1.2.9: The platform “linux” is incompatible with this module. info “fsevents@1.2.9” is an optional dependency and failed compatibility check. Excluding it from installation. [3/4] Linking dependencies… warning ” > babel-core@7.0.0-bridge.0“ has unmet peer dependency ”@babel/core@^7.0.0-0“. warning ” > babel-jest@24.9.0“ has unmet peer dependency ”@babel/core@^7.0.0“. warning ” > eslint-plugin-vuetify@1.0.0-beta.5“ has unmet peer dependency “release-it@*”. warning “eslint-plugin-vuetify > eslint-plugin-vue@5.2.3” has incorrect peer dependency “eslint@^5.0.0”. warning “eslint-plugin-vuetify > eslint-plugin-vue > vue-eslint-parser@5.0.0” has incorrect peer dependency “eslint@^5.0.0”. warning ” > sass-loader@8.0.0“ has unmet peer dependency “webpack@^4.36.0”. [4/4] Building fresh packages… Done in 11.98s. 89. Il semblerait que yarn n'arrive pas à importer # cat Dockerfile FROM node:lts-alpine as build-stage # Install python 2 (following https://github.com/nodejs/docker-node/issues/384#issuecomment-305208112) RUN apk –no-cache add g++ gcc libgcc libstdc++ linux-headers make python #Working directory WORKDIR /app # Install dependencies COPY package*.json . COPY yarn.lock . RUN yarn add git+ssh:git@depot.lipn.univ-paris13.fr:vuetify-plugins/confirm-dialog.git
RUN yarn install
- Nous avons modifié le dockerfile Nous avons supprimé la ligne : confirm-dialog”: “https://depot.lipn.univ-paris13.fr/vuetify-plugins/confirm-dialog.git”, On test à nouveau la création du docker client L'ajout du docker client n'a pas réussi il manque la dépendance que nous avons supprimé Nous devons voir pourquoi celle-ci ne passe pas dans le dockerfile
- On continue la galère du confirm-dialog.git error Couldn't find the binary git info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command. ERROR: Service 'publications_app' failed to build: The command '/bin/sh -c yarn install' returned a non-zero code: 1
91.1 On a contourné l'erreur en modifiant /publications/client/Docker RUN apk –no-cache add g++ gcc libgcc libstdc++ linux-headers make python git
- Nous avons eu un erreur de yarn upgrade Step 14/18 : RUN yarn build —> Running in e462752a99ac yarn run v1.22.4 $ vue-cli-service build
- Building for production…
Browserslist: caniuse-lite is outdated. Please run next command yarn upgrade
Browserslist: caniuse-lite is outdated. Please run next command yarn upgrade
DONE Compiled successfully in 34331ms4:50:17 PM
File Size Gzipped
dist/js/chunk-vendors.js 5514.11 KiB 1145.99 KiB dist/js/app.js 685.07 KiB 43.75 KiB
Images and other types of assets omitted.
DONE Build complete. The dist directory is ready to be deployed. INFO Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
Done in 48.09s.
92.1 L'erreur de build a été surmonté en supprimant une ligne du Dockerfile où on effacer le fichier yarn.lock et en relançant docker-compose up -d –build publications_app
- Nous avons un erreur de port Step 18/18 : CMD [“nginx”, “-g”, “daemon off;”] —> Running in a7566f2a2763 Removing intermediate container a7566f2a2763 —> aa0edd4edcf0 Successfully built aa0edd4edcf0 Successfully tagged rootpublicationsapp:latest Creating publications-app … Creating publications-app … error
ERROR: for publications-app Cannot start service publications_app: driver failed programming external connectivity on endpoint publications-app (4b0e528e91b9b3117fad3fc83dd7917cd0df7822d317da4b32157c4b939bccb9): Bind for 0.0.0.0:8080 failed: port is already allocated
ERROR: for publicationsapp Cannot start service publicationsapp: driver failed programming external connectivity on endpoint publications-app (4b0e528e91b9b3117fad3fc83dd7917cd0df7822d317da4b32157c4b939bccb9): Bind for 0.0.0.0:8080 failed: port is already allocated ERROR: Encountered errors while bringing up the project.
- Modification de docker-compose.yml situé dans /root Il y avait un conflit sur le port 8080 Nous avons remplacé le port 8080 par 8082 au niveau de publications_app
- Modification dans /etc/apache2/sites-enabled/000-default.conf Dans la partie # publication application nous avons modifié le port 8080 en 8082
- Ajout de docker-compose dans publications Contrairement à authentication il n'y avait pas de docker-compose dans publications Nous avons donc ajouté un docker-compose dans publications
97. Publications
root@lipn-intranet-dev:~# docker-compose ps
Name Command State Ports
————————————————————————————-
authentication-api docker-entrypoint.sh npx p … Up 3000/tcp
authentication-app nginx -g daemon off; Up 0.0.0.0:8080→80/tcp
database docker-entrypoint.sh mongod Up 27017/tcp
gateway docker-entrypoint.sh npx p … Up 0.0.0.0:8081→8081/tcp
publications-api docker-entrypoint.sh npx p … Up 3000/tcp
publications-app nginx -g daemon off; Up 0.0.0.0:8082→80/tcp
user_management-api docker-entrypoint.sh npx p … Up 3000/tcp
97.1 Test d'accès sur le serveur Le serveur répond sur localhost:8081/publication et la requête GET depuis la ligne de commande avec est enregistrée sur les logs (docker logs publi) du containeur publications-api
root@lipn-intranet-dev:~# http GET localhost:8081/publication 'Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzE3ODk0N30.gj8z7skaNGF9-dWr3X90oh0xQJNDLsxykfTrW46WAB0' HTTP/1.1 200 OK access-control-allow-origin: * connection: keep-alive content-length: 2 content-type: application/json; charset=utf-8 date: Fri, 26 Jun 2020 14:26:26 GMT etag: W/“2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w” x-powered-by: Express
La requête est bien enresitrée sur les logs
root@lipn-intranet-dev:~# docker logs publications-api
2020-06-26T14:19:08: PM2 log: Launching in no daemon mode
2020-06-26T14:19:08: PM2 log: [Watch] Start watching publicationsserver
2020-06-26T14:19:08: PM2 log: App [publicationsserver:0] starting in -fork mode-
2020-06-26T14:19:08: PM2 log: App [publications_server:0] online
2020-06-26 14:19 +00:00: Mongoose default connection is open to mongodb:database:27017/publications
2020-06-26 14:26 +00:00: GET /publication 200 28.260 ms - 2
[]
97.2 Test d'accès sur le client de publication
Le conteneur client répond sur localhost:8082
et la requête GET est bien enregistrée sur le logs du conteneur publications-app
98. Authentification
98.1 Test d'accès à authentication-api depuis le serveur intranet-dev
httplocalhosthttplocalhost docker logs authentication-app
x8664; rv:77.0) Gecko/20100101 Firefox/77.0“ “200.57.193.75, 192.168.90.15”
172.19.0.1 - - [26/Jun/2020:15:11:56 +0000] “GET /favicon.ico HTTP/1.1” 200 1150 ”-“ “Mozilla/5.0 (X11; Ubuntu; Linux x8664; rv:77.0) Gecko/20100101 Firefox/77.0” “200.57.193.75, 192.168.90.15”
172.19.0.1 - - [26/Jun/2020:15:15:11 +0000] “GET / HTTP/1.1” 200 654 ”-“ “HTTPie/0.9.8” ”::1“
172.19.0.1 - - [26/Jun/2020:15:16:37 +0000] “GET / HTTP/1.1” 200 654 ”-“ “HTTPie/0.9.8” ”::1“
(sur authentication-api il n'y a rien puisque la demande n'est parvenue au serveur)
98.2 Test de login à authentication-api depuis le serveur intranet-dev
root@lipn-intranet-dev:~# http localhost:8081/login
HTTP/1.1 404 Not Found
Connection: keep-alive
Content-Length: 144
Content-Security-Policy: default-src 'none'
Content-Type: text/html; charset=utf-8
Date: Fri, 26 Jun 2020 15:43:54 GMT
X-Content-Type-Options: nosniff
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset=“utf-8”>
<title>Error</title>
</head>
<body>
<pre>Cannot GET /login</pre>
</body>
</html>
Le cannot GET est causé par une configuration dans /root/gateway/config/gateway-config.yml
98.3 tests avec curl depuis le réseau lipn
[garciaflores@merkel ~]$ curl POST 192.168.90.43
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset=“utf-8”>
<meta http-equiv=“X-UA-Compatible” content=“IE=edge”>
<meta name=“viewport” content=“width=device-width,initial-scale=1.0”>
<link rel=“icon” href=”/intranet-dev/favicon.ico“>
<title>Etamine v5</title>
<link href=”/intranet-dev/app.js“ rel=“preload” as=“script”></head>
<body>
<noscript>
<strong>We're sorry but client doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<!– built files will be auto injected –> <script type=“text/javascript” src=”/intranet-dev/app.js“></script></body> </html> [garciaflores@merkel ~]$ curl POST 192.168.90.43 99. docker-compose ps: liste les containers ainsi que leurs status