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

  1. 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 [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 <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 authentication_server
   2020-06-05T14:19:38: PM2 log: App [authentication_server:0] starting in -fork mode-
   2020-06-05T14:19:38: PM2 log: App [authentication_server: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 NODE_ENV=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

  1. On fait lipnssh sur lipn-intranet-dev
  2. on fait git pull sur le serveur
  3. on créer l'image docker sur le serveur lipn-intranet-dev root@lipn-intranet-dev:~/authentication/server# docker build -t authentication-server
  4. Nous avons installée apache2 sur le serveur et ouvert (avec Xavier) un accès vers http://lipn.univ-paris13.fr/intranet
  5. 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)

  1. 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)
  2. On assume que le servur marche, pusisqu'il a authenthifié Jaime (mais pas )mar et Jorge: on procède donc à l'instaallation du client
  3. On procède à refaire notre docker…
    client/Dockerfile
  4. 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
  5. 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
  6. 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)
  7. 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
  8. 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

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 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 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: 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 On essaye de mofidier gateway/config/gateway.config.yml pour configurer directement le port 8081 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 66. Normalement on peut faire Ctrl-C ici parce que nous avons le message “online” 67. MAIS nous n'avons pas mongodb 68. On ajoute le service databse dans docker compose 69. 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

  1. pour reçevoir la liste de publications je dois donner un token

curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1hcmlhcywgb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiYXJpYXMiLCJtYWlsIjoiYXJpYXNAbGlwbi51bml2LXBhcmlzMTMuZnIiLCJkaXNwbGF5TmFtZSI6IkphaW1lIEFyaWFzIiwiYWNjb3VudFN0YXR1cyI6ImFjdGl2ZSIsImlhdCI6MTU5MjU3NjE4N30.0UxjmXCVfgnAZzRC8aH9j-ZtoxO7OjHuNg10wsSOnpo” localhost:8081/publication

  1. 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
  2. curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbC

réponse: bad gateway

  1. docker log publications_api pour voir l'erreur
  2. Nous avons la même erreur sur intranet-dev… # curl localhost:8081/publication Unauthorized
  3. 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}]

  1. Jaime fait un test sans gateway (sur docker-compose.yml il a exposé le port 3000)
  2. Il faut relancer le gateway # docker-compose down # docker-compose up -d # docker logs gateway # docker logs publications_api
  3. root@lipn-intranet-dev:~# curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4” -X GET localhost:8081/publication []root@lipn-intranet-dev:~#
  4. Test réussi! (il fallait faire docker-compose down et docker-compose up pour prendre en compte nos modifs)
  5. 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

  1. La commande http suivante donne le même résultat que le curl

http GET localhost:8081/publication 'Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4'

  1. On essaye d'installer le client de publications, donc on va créer un Dockerfile sur /publications/client
  2. 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 ?
  3. 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".

w

arning “

> babel-jest@24.9.0" has unmet peer dependency "@babel/core@^7.0.0".

w

arning ”

> eslint-plugin-vuetify@1.0.0-beta.5" has unmet peer dependency "release-it@*".

w

arning “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.

  1. 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 90. 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 91. 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 92. 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 93. 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. 94. 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 95. Modification dans /etc/apache2/sites-enabled/000-default.conf Dans la partie # publication application nous avons modifié le port 8080 en 8082 96. 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 vers 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

root@lipn-intranet-dev:~# http localhost:8082 HTTP/1.1 200 OK Accept-Ranges: bytes Connection: keep-alive Content-Length: 966 Content-Type: text/html Date: Fri, 26 Jun 2020 16:38:38 GMT ETag: “5ef5f834-3c6” Last-Modified: Fri, 26 Jun 2020 13:29:24 GMT Server: nginx/1.18.0

<!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="/favicon.ico">
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
<title>Etamine v5</title>

<link href=“/js/app.js” rel=“preload” as=“script”

><link href="/js/chunk-vendors.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>
<div id="app"></div>
<!-- built files will be auto injected -->

<script type=“text/javascript” src=“/js/chunk-vendors.js”

></script><script type="text/javascript" src="/js/app.js"></script></body>