# 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