README.md 15 KB

Docker pour Opentalent

Installer et configurer une instance Docker

Installer docker

Installation pour Linux

Installer Docker Engine : https://docs.docker.com/install/linux/docker-ce/ubuntu/
Et Docker Compose : https://docs.docker.com/compose/install/

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:

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.new.api.opentalent.fr   # Docker 'php74'
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.admin2.opentalent.fr   # Docker 'admin'
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.api-doc.opentalent.fr   # Docker 'php-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...): https://linuxize.com/post/check-listening-ports-linux/

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. 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 https://local.api.opentalent.fr/doc

Docker adminLegacy

Se connecter au docker:

docker exec -it adminLegacy 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: https://gitlab.2iopenservice.com/opentalent/ot_typo3/-/blob/master/doc/docker.md

(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 à: http://local.api-doc.opentalent.fr

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

Patienter quelques secondes, puis dans un nouveau terminal, lancer:

docker exec -it 'adminLegacy' bash
gulp serve

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:

Folder Repo SSH
apps/opentalent Voir le repository
apps/opentalent-admin-2.0 Voir le repository
apps/opentalent-config Voir le repository
apps/opentalent-platform Voir le repository
apps/ot_typo3 Voir le repository
apps/portail - -
apps/metabase Voir le repository
apps/python-scripts/clonedb Voir le repository
apps/frames Voir le repository
Db Host db
Login root
Pass mysql660

Docker: nginx

TODO: à quoi il sert?

Docker: php70

Héberge la partie back du logiciel: https://gitlab.2iopenservice.com/opentalent/opentalent-platform

Ce container embarque une installation de php-fpm v7.0.

Docker: nginx_new

TODO: à quoi il sert?

Docker: php74

Serveur sur lequel est présent la version Symfony 5.3 du Back. Penser à copier le dossier php7.4/jwt vers config

Docker: python39

Héberge différents scripts python, dont clonedb.

Embarque une installation de python3.9.

Docker: adminLegacy

Héberge l'application frontend Opentalent, version pré-2021: https://gitlab.2iopenservice.com/vincent/opentalent-admin-2.0/-/tree/master-front

Docker: admin

Héberge l'application frontend Opentalent, version post-2021: https://gitlab.2iopenservice.com/vincent/admin

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: typo3

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 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/certs/default.key docker/nginx/certs/<my-domain.fr>.key
cp docker/nginx/certs/default.crt docker/nginx/certs/<my-domain.fr>.crt

en remplaçant <my-domain.fr> 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

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 adminLegacy 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éé