# Docker pour Opentalent Le projet **docker** offre un environnement de développement complet. ## Installer et configurer une instance Docker ### Installer docker #### Installation pour Linux Installer Docker Engine : Et Docker Compose : Faire : docker ps > Si Docker ne marche pas sans "sudo" appliquer : > https://techoverflow.net/2017/03/01/solving-docker-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket/ > `sudo usermod -aG docker $USER` ### Première mise en place du projet #### Cloner le projet docker git clone git@gitlab.2iopenservice.com:vincent/docker.git #### Cloner les sous-repos Les repositories suivants doivent être clônés dans les sous-répertoires suivants: | Folder | Repo | SSH | --- | --- | --- | | apps/opentalent | [Voir le repository](https://gitlab.2iopenservice.com/developper/opentalent) | | | apps/opentalent-admin-2.0 | [Voir le repository](https://gitlab.2iopenservice.com/vincent/opentalent-admin-2.0) | | | apps/opentalent-config | [Voir le repository](https://gitlab.2iopenservice.com/developper/opentalent-config) | | | apps/opentalent-platform | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/opentalent-platform) | | | apps/ot_typo3 | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/ot_typo3) | | | apps/portail | - | - | | apps/metabase | [Voir le repository](https://gitlab.2iopenservice.com/vincent/metabase) | | | apps/python-scripts/clonedb | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/clonedb) | | | apps/frames | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/frames) | | | apps/ap2i | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/api) | | | apps/ap2i-doc | [Voir le repository](https://gitlab.2iopenservice.com/vincent/api-doc) | | | apps/app | [Voir le repository](https://gitlab.2iopenservice.com/opentalent/admin) | | | apps/app-doc | [Voir le repository](https://gitlab.2iopenservice.com/vincent/admin-doc) | | ### Configurer le projet #### Le fichier `.env` Copier le fichier `.env.skeleton` en `.env` (attention à ne pas supprimer le fichier `.env.skeleton`!) Mettre à jour le contenu de `.env` selon votre config: * `OS`: `LINUX` ou `MAC` selon votre système d'exploitation * EMAIL Les autres variables peuvent être laissées telles quelles. > Nb: le hash de contrôle `COMPOSER_HASH` change à chaque nouvelle version de composer. Si la version de composer > installée sur les containers change, cette variable doit être mise à jour avec la clé indiquée ici: https://getcomposer.org/download/ #### Le fichier `/etc/hosts` Les domaines locaux doivent être enregistrés sur la machine hôte (=votre machine). Pour cela, ajouter les lignes suivantes à votre fichier `/etc/hosts`: 127.0.0.1 local.api.opentalent.fr # Docker 'php70' 127.0.0.1 local.mailcatcher.opentalent.fr # Docker 'mailcatcher' 127.0.0.1 local.v59.opentalent.fr # Docker 'adminassos' 127.0.0.1 local.phpmyadmin.opentalent.fr # Docker 'phpmyadmin' 127.0.0.1 local.elasticsearch.opentalent.fr # Docker 'es' 127.0.0.1 local.admin.opentalent.fr # Docker 'adminLegacy' 127.0.0.1 local.thumbor.opentalent.fr # Docker 'thumbor' 127.0.0.1 local.opentalent.fr # Docker 'portail' 127.0.0.1 local.sub.opentalent.fr # Docker 'typo3' 127.0.0.1 local.frames.opentalent.fr # Docker 'frames' 127.0.0.1 local.blackfire.opentalent.fr # Docker 'blackfire' 127.0.0.1 local.metabase.opentalent.fr # Docker 'metabase' 127.0.0.1 local.ap2i.opentalent.fr # Docker 'ap2i-doc' 127.0.0.1 local.ap2i-doc.opentalent.fr # Docker 'ap2i-doc' 127.0.0.1 local.app.opentalent.fr # Docker 'app' 127.0.0.1 local.app-doc.opentalent.fr # Docker 'app-doc' > Attention: les domaines indiqués ici doivent correspondre aux domaines définis dans le fichier `.env` #### Les certificats SSL Pour permettre l'usage de l'HTTPS, il faut générer des certificats pour les domaines locaux. Lancer les commandes suivantes : chmod +x docker/nginx-proxy/certs/ssl_keys.sh sh docker/nginx-proxy/certs/ssl_keys.sh Vérifier ensuite la prise en compte des certificats: docker-compose build docker-compose up > Si `docker up` bloque à cause du port 80 : vérifier qu'aucun programme sur votre machine n'écoute le port 80 (Apache est souvent coupable...): Faire ensuite un `docker stop $(docker ps -a -q)` ### Synchroniser les données en local #### Bases de données Pour synchroniser les DB, on utilise [clonedb](https://gitlab.2iopenservice.com/opentalent/clonedb). Cet utilitaire est préinstallé sur le container `python39` Pour l'exécuter: docker exec -it python39 bash cd clonedb Puis, pour synchroniser toutes les bases (recommandé si c'est la première synchronisation) : python3 clonedb.py Ou, pour synchroniser seulement une ou plusieurs bases : python3 clonedb.py [operation] L'opération est le nom défini à la section 'operations' du fichier /env/clonedb/settings.yml Pour plus d'infos: https://gitlab.2iopenservice.com/opentalent/clonedb/blob/master/readme.md #### Elasticsearch ##### Avec elasticdump Pour clôner l'index elasticsearch, plusieurs options. Se connecter au docker php70: docker exec -it php70 bash Puis lancer: npm install elasticdump@3.3.7 -g elasticdump --input http://elasticsearch.2iopenservice.com:9200//search --output http://es:9200/search_bkp --type=analyzer elasticdump --input http://elasticsearch.2iopenservice.com:9200//search --output http://es:9200/search_bkp --type=mapping Pour synchroniser les données complètes (nécessite un bon débit descendant et de l'espace disque disponible pour 50 à 100 Go): elasticdump --input http://elasticsearch.2iopenservice.com:9200// --input-index=search --output http://es:9200/ --output-index=search_dump --type=data Pour synchroniser les données d'un type spécifique: elasticdump --input http://elasticsearch.2iopenservice.com:9200// --input-index=search//course --output http://es:9200/ --output-index=search_dump//course --type=data ##### Avec fos:elastica Regénérer un index complet. Nécessite de l'espace disque disponible pour 50 à 100 Go, peut nécessiter plusieurs jours de traitement. Se connecter au docker php70: docker exec -it php70 bash Puis lancer: app/console fos:elastica:populate --process-isolation --no-debug Poue ne générer que certains types, lancer: php app/console fos:elastica:populate --index search --process-isolation --no-debug --no-reset --type organization php app/console fos:elastica:populate --index search --process-isolation --no-debug --no-reset --type access ### Finaliser et exécuter #### Docker php70 Se connecter a php70 docker exec -it php70 bash Installer les vendor: php composer.phar install A la première exécution, composer va demander certains paramètres. Vous pouvez tout laisser par défaut, sauf: database_host: db database_port: 3306 database_password: mysql660 database_host_cms: db database_port_cms: 3306 database_password_cms: mysql660 locale: fr elastic_search_host: es thumbor_url: 'http://thumbor' typo3_base_url: 'http://typo3/' Si le fichier app/config/parameters.yaml vient d'être créé, il est possible que la commande suivante doive t'être exécutée: chown 1000:1000 /var/www/html/app/config/parameters.yml Puis mettre à jour le schéma de la DB: app/console d:s:u --force Enfin, afin de prévenir des erreurs de permission: chmod -R 777 /var/www/html/app/cache/ À ce niveau, la page de documentation d'API Platform devrait être accessible à l'adresse #### Docker admin Se connecter au docker: docker exec -it admin bash Lancer npm install npm install Lancer Bower install bower install Lancer le serveur front: gulp serve #### Docker typo3 Se déplacer dans le sous-répertoire ot_typo3/docker: cd apps/ot_typo3/docker Puis exécuter: sh clone-install.sh Enfin, revenir à la racine du projet: cd ../../.. > Plus d'infos ici: #### (optionnel) Docker phpdoc Pour générer la PHP DOC de l'API: docker run --rm -v /opt/opentalent/apps/api/src/:/data -v /opt/opentalent/apps/apidoc:/output phpdoc/phpdoc:3.1 -d /data -t /output Le documentation devrait ensuite être accessible à: ## Démarrer les dockers Pour démarrer une instance docker complète, se placer dans le répertoire de votre projet docker, puis lancer: docker-compose up ### Démarrer le serveur admin Patienter quelques secondes, puis dans un nouveau terminal, lancer: gulp serve ### Démarrer le serveur app Si vous ne l'avez pas encore fait, créer le symlink vers le fichier d'environnement: ln -s .env.local .env Puis, lancer: yarn dev ### Démarrer le serveur frames Si vous ne l'avez pas encore fait, créer le symlink vers le fichier d'environnement: ln -s .env.local .env Puis, lancer: yarn dev ## Description des containers #### Docker: `nginx-proxy` Gère le routage de toutes les requêtes envoyées au ports 80 et 443 de la machine hôte et les redirige vers le container cible. #### Docker: `mariaDb` Héberge les bases de données MariaDb de tous les containers. Les autres docker peuvent ensuite accéder au serveur de base de données de cette manière: ||| | --- | ---| | Db Host | db | | Login | root | | Pass | mysql660 | #### Docker: `nginx` TODO: à quoi il sert? #### Docker: `php70` Héberge la partie back du logiciel: Ce container embarque une installation de php-fpm v7.0. #### Docker: `nginx_new` TODO: à quoi il sert? #### Docker: `ap2i` Serveur sur lequel est présent la version Symfony 5.3 du Back. Penser à copier le dossier ap2i/jwt vers config #### Docker: `python39` Héberge différents scripts python, dont [clonedb](https://gitlab.2iopenservice.com/opentalent/clonedb). Embarque une installation de python3.9. #### Docker: `admin` Héberge l'application frontend Opentalent, version pré-2021: #### Docker: `app` Héberge l'application frontend Opentalent, version post-2021: #### Docker: `portail` Héberge une instance Typo3 version 8.7, qui sert entre autres le portail Opentalent et le site 2iOpenservice #### Docker: `typo3` Héberge une instance Typo3 version 9.5, qui sert tous les mini-sites des clients. #### Docker: `frames` Héberge l'application Frames. Voir ici: https://gitlab.2iopenservice.com/opentalent/frames #### Docker: `adminassos` TODO: à quoi il sert? #### (optionnel) Docker: `metabase` TODO: à quoi il sert? #### Docker: `es` Héberge une instance elasticsearch TODO: à compléter #### Docker: `thumbor` Héberge une instance [thumbor](http://thumbor.org/) dont le rôle est de fournir des fichiers via une API. #### (optionnel) Docker: `phpmyadmin` Héberge une instance phpmyadmin #### (optionnel) Docker: `mailcatcher` TODO: à quoi il sert? #### (optionnel) Docker: `blackfire` Héberge une instance blackfire, utilisée pour l'analyse des performances des dockers php #### (optionnel) Docker: `phpdoc` Héberge une instance phpdoc, qui permet ensuite de générer des documentations automatiques à partir du code PHP. #### (optionnel) Docker: `jsdoc` TODO: à quoi il sert? ## Opérations courantes #### Ajouter un certificat SSL pour un nouveau domaine local Si les docker sont up, tout arrêter: docker-compose stop Ajouter les lignes suivantes au fichier docker/nginx-proxy/certs/ssl_keys.sh cp docker/nginx-proxy/certs/default.key docker/nginx-proxy/certs/.key cp docker/nginx-proxy/certs/default.crt docker/nginx-proxy/certs/.crt en remplaçant `` par le nom de domaine attendu. Copier les deux fichiers nouvellement générés dans Exécuter le script depuis la racine du projet docker: sh docker/nginx-proxy/certs/ssl_keys.sh Supprimer le docker nginx-proxy, puis rebuilder: docker-compose rm nginx-proxy docker-compose build --no-cache Puis relancer docker. ## Problèmes et solutions #### Certificat SSL refusé par Chrome Pour que le certificat soit validé sur chrome, allez à l'adresse cible, ouvrir la console de debugger et entrer : console.log(window.atob('dGhpc2lzdW5zYWZl')); Cliquer ensuite n'importe où sur la page, et taper le mot qui s'est affiché dans la console précédemment. #### Page blanche sur local.admin.opentalent.fr Lorsque vous demandez la page http://local.admin.opentalent.fr/#/login , la page reste blanche, et le message d'erreur suivants s'affichent dans la console: Uncaught Error: Cannot find module "@opentalent/ruler/lib/model/rule.class" Accéder au container adminLegacy: docker exec -it admin bash Puis exécuter: cd modules/ruler && jison -t rule.jison && babel --presets=es2015 model/**/*.js model/*.js -d lib && npm link && cd ../.. && npm link @opentalent/ruler Enfin, relancer: gulp serve #### Problème de permission lors de l'accès à local.api.opentalent.fr/ Lorsque vous demandez la page https://local.api.opentalent.fr/doc, une erreur php s'affiche, avec un message similaire à ceci : RuntimeException in ClassCollectionLoader.php line 280: Cache directory "/var/www/html/app/cache/dev" is not writable. Accéder au docker php70 : docker exec -it php70 bash Puis exécuter : chmod -R 777 /var/www/html/app/cache/ #### L'accès SSH est refusé depuis docker Lorsque l'un de vos containers essaie d'accéder à un serveur extérieur en SSH, l'accès est refusé. Vérifier d'abord que le répertoire ~/.ssh de votre machine a bien été copié dans le docker à l'emplacement: `/root/.ssh` Si ce n'est pas le cas, ajouter la ligne suivante au Dockerfile concerné: COPY /.ssh /root/.ssh Et relancer un: docker-compose build Si le problème persiste, vérifier que les droits du répertoire .ssh sont identiques à ceci: drwxr-xr-x 1 root root 4096 Feb 24 16:01 . drwx------ 1 root root 4096 May 10 12:04 .. -rw-r--r-- 1 root root 0 Mar 18 2020 .gitkeep -rw------- 1 root root 887 Mar 18 2020 id_rsa -rw------- 1 root root 1678 Mar 18 2020 id_rsa_exploitation -rw-r--r-- 1 root root 397 May 15 2020 id_rsa_exploitation.pub -rw-r--r-- 1 root root 888 May 12 14:19 known_hosts #### Erreur de type 'table not found' ou 'column not found' Accéder au docker php70: docker exec -it php70 bash Lancer: app/console d:s:u --force #### Une modification des annotations Doctrine n'est pas prise en compte Suite à une modification des annotations, il faut forcer un vidage du cache symfony: Accéder au docker php70: docker exec -it php70 bash Lancer: rm -r app/cache/* chmod -R 777 app/cache/ Puis quitter le docker: exit et le redémarrer: docker restart #### Erreur liée à l'index Elasticsearch (events, champs de recherche...) Pour regénérer l'index elasticsearch: Accéder au docker php70: docker exec -it php70 bash Lancer, puis interrompre dès qu'il commence à populate les organizations: php app/console fos:elastica:populate --index search Se rendre sur l'interface graphique elasticsearch, et se connecter à https://local.elasticsearch.opentalent.fr/ > Attention à ce que le navigateur ne bloque pas le certificat SSL, essayez d'abord d'ouvrir > https://local.elasticsearch.opentalent.fr/ dans un onglet à part Supprimer l'alias `search` de l'index qui le porte, et ajouter ce même alias à l'index nouvellement créé #### L'adresse Ip publique de docker n'est pas celle du vpn Faire, dans cet ordre précis: 1. Couper le VPN 2. Couper le service docker: sudo systemctl stop docker 3. Redémarrer le VPN 4. Redémarrer docker sudo systemctl start docker #### Une application nuxt.js (app / frames) ne démarre pas: error 504 memory Vérifier que le fichier .env existe dans le projet. Sinon: ln -s .env.local .env #### Le front affiche une erreur 401: "Request failed with status code 401" Il suffit de se loguer pour résoudre cette erreur: local.admin.opentalent.fr/#/login Si on est déjà authentifié côté back, vérifier qu'on accède bien au front en https, sans quoi les cookies opentalent.fr ne seront pas accessibles. ## Quelques commandes docker utiles # Build docker compose docker-compose build # Lancer le docker-compose == lancer les containers docker-compose up # Stopper le docker-compose == stopper les containers docker-compose stop # Stopper tous les containers quelque soit le docker-compose docker stop $(docker ps -a -q) # Supprimer tous les container Docker docker rm $(docker ps -a -q) # Supprimer toutes les images Docker docker rmi $(docker images -q) # Lister les proccess Docker docker ps # Lister les containers actifs docker container ls # Lister tous les containers docker container ls -a # Lister les images docker images # Entrer dans un container en bash docker exec -it db bash ==> db étant le container name que l'on retrouve en faisant docker ps # Docker compose a une facheuse tendance à conserver des config entre chaque lancement (comme la config de la BDD) # si par exemple, on arrive pas à se connecter à la BDD à cause d'un Access Denied, il faut faire: docker-compose rm -v