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
- 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
- On fait lipnssh sur lipn-intranet-dev
- on fait git pull sur le serveur
- on créer l'image docker sur le serveur lipn-intranet-dev root@lipn-intranet-dev:~/authentication/server# docker build -t authentication-server
- Nous avons installée apache2 sur le serveur et ouvert (avec Xavier) un accès vers http://lipn.univ-paris13.fr/intranet
- 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)
- 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) - On assume que le servur marche, pusisqu'il a authenthifié Jaime (mais pas )mar et Jorge: on procède donc à l'instaallation du client
- On procède à refaire notre docker…
client/Dockerfile
- 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 - 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
- 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)
- 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 - 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
- pour reçevoir la liste de publications je dois donner un token
curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1hcmlhcywgb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiYXJpYXMiLCJtYWlsIjoiYXJpYXNAbGlwbi51bml2LXBhcmlzMTMuZnIiLCJkaXNwbGF5TmFtZSI6IkphaW1lIEFyaWFzIiwiYWNjb3VudFN0YXR1cyI6ImFjdGl2ZSIsImlhdCI6MTU5MjU3NjE4N30.0UxjmXCVfgnAZzRC8aH9j-ZtoxO7OjHuNg10wsSOnpo” localhost:8081/publication
- 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
- curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbC
réponse: bad gateway
- docker log publications_api pour voir l'erreur
- Nous avons la même erreur sur intranet-dev… # curl localhost:8081/publication Unauthorized
- 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}]
- Jaime fait un test sans gateway (sur docker-compose.yml il a exposé le port 3000)
- Il faut relancer le gateway # docker-compose down # docker-compose up -d # docker logs gateway # docker logs publications_api
- root@lipn-intranet-dev:~# curl -H “Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4” -X GET localhost:8081/publication []root@lipn-intranet-dev:~#
- Test réussi! (il fallait faire docker-compose down et docker-compose up pour prendre en compte nos modifs)
- 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
- La commande http suivante donne le même résultat que le curl
http GET localhost:8081/publication 'Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkbiI6InVpZD1nYXJjaWFmbG9yZXMsb3U9cGVvcGxlLGRjPXVuaXYtcGFyaXMxMyxkYz1mciIsImNvbnRyb2xzIjpbXSwidWlkIjoiZ2FyY2lhZmxvcmVzIiwibWFpbCI6ImdhcmNpYWZsb3Jlc0BsaXBuLnVuaXYtcGFyaXMxMy5mciIsImRpc3BsYXlOYW1lIjoiSm9yZ2UgR2FyY2lhIGZsb3JlcyIsImFjY291bnRTdGF0dXMiOiJhY3RpdmUyMiIsImlhdCI6MTU5MzA4NzczOH0.HNP1FRsf7ujiy2IAyWXoOKwAJris8qzqxdmObCTfEx4'
- On essaye d'installer le client de publications, donc on va créer un Dockerfile sur /publications/client
- 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 ?
- 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.
- Il semblerait que yarn n'arrive pas à importer