Envole est une solution qui propose un ensemble d'applicatifs web fédérés autour d'un annaire afin de gérer l'identité ainsi qu'un SSO afin de gérer l'authentification.
+
Il s'appuit sur la distrution EOLE pour déployer ses différents composants.
+
Envole rencontre depuis des années des problèmatiques :
+
+
Elle doit se baser sur une version précise d'EOLE 2.5 ou 2.6 ou 2.7 ou 2.8 ou 2.9 qui ont chacune leur contrainte de version php
+
Les différentes applications Envole ont leur propre contrainte de version php.
+
Ce qui oblige de limiter les possibilités de montée de version de l'application dans une version x d'eole car cette dernière ne fournit pas la version minimum de php requise
+
Ou qui empéche le passage d'une application de fonctionner dans une version x d'eole car cette dernière propose une version trop résente de php pour l'application
+
+
Ce document va chercher à évaluer la possibilité de conteneriser les applications Envole, afin qu'elles puissent fonctionner le moins possible en contrainte avec la version d'Eole
+
Architecture
+
EoleBase
+
La présente étude part du principe qu'Envole ne serait plus installé sur une instance Scribe mais sur une installation EoleBase d'Eole
+
Avantages
+
+
Décharger le serveur Scribe et lui laisser ses fonctions principales. C'est à dire
+
+
Contrôleur de Domaine
+
SSO
+
Annuaire
+
Imap (et SMTP ?)
+
+
+
Faire évoluer plus facilement le serveur Envole vers des versions plus récente d'Eole avec moins de contrainte tout en assurant une mise à jour de sécurité plus régulière
+
+
Inconvéhients
+
+
L'adminstrateur devra configurer le lien SSO et Annaire qui eux restent sur le scribe.
+
Il devra donc fixer certains secrets sur le Scribe (notamment le compte reader/writer annuaire sur le scibe)
+
Connaitre et renseigner les hosts/ports des service SSO et Annuaire
+
Avoir un second nom de domaine pour l'accès aux applications Envole
+
+
Paquet Debian
+
Contrairement à la précédente logique Envole, il n'y aurait qu'un seul paquet Debian pour Envole. Il n'installerait pas les sources des applications, mais uniquement
+
+
le dictionnaire eole de configuration
+
les templates de configuration
+
le dossier de définitions de l'ensemble des conteneurs possible pour Envole
+
un script qui viendrait monter ou non les conteneurs souhaités par l'administateur
+
+
POC
+
Afin de s'assurer de la faisabilité d'un tel changement, un POC a été initié, dans le cadre des éléments précédents cités. La première question fut de savoir quelle technologie de conteneurisation serait à utiliser PODMAN ou DOCKER, et dans leur logique de composer PODMAN-COMPOSE ou DOCKER-COMPOSER.
+
PODMAN vs DOCKER sur Eole
+
PODMAN
+
Eole a intégré à partir de la 2.9 dans sa distribution podman. Ce qui de prime abord devrait-être la technologie à utiliser, sauf que
+
+
Ubuntu 22.04 ne dispose pas de paquet pour podman-compose
+
Pour installer podman-compose, il est nécessaire de l'installer via pip
+
De plus la version de podman disponible sur Ubuntu 22.04 est une version 3.4 qui n'est pas compatible avec la version de podman-compose
+
Il est nécessaire d'installer la dernière version 4.4 de Podman PPA pour faire fonctionner l'ensemble
+
Par la suite il est possible de créer un composer d'image docker comme on pourrait le faire avec docker-compose. Podman est juste plus stricte dans sa synthaxe et certaines commandes ne sont pas tout à fait indentique
+
Mais il apparait qu'un reconfigure rendra totalement inopérant le réseau des conteneurs. Pour le rendre de nouveau opérant, il est nécessaire de le détruire pour le reconstruire.
+
+
DOCKER
+
Eole n'a pas intégré nativement docker. Mais il est tout à fait possible de l'installer par ses propres moyens sauf que
+
+
Tout comme Podman Ubuntu ne propose pas de paquet suffisament à jour de docker-ce et docker-compose
+
Il est nécessaire de les installer via la mise en place d'un PPA
+
Par la suite docker se comporte bien mieux que podman. Il est plus souple d'usage, moins verbeux
+
Mais tout comme podman, un reconfigure vient rendre totalement inopérant le reseau des conteneurs. Il est nécessaire de réinitialiser docker-ce pour rétablir le reseau.
+
+
CONCLUSION
+
Quoi qu'il arrive, une intégration compléte que cela soit avec Podman ou avec Docker, demandera un travail d'intégration d'Eole
+
+
afin de disposer des dernières versions possibles de l'un ou de l'autre
+
que l'un ou l'autre ne détruit pas le réseau associé au composer de conteneur
+
+
Ma préférence va malgrés tout sur Docker, il est plus souple moins verbeux et me semble plus fiable à long terme. Il serait possible de maitenir les deux solutions en parrallèle avec un effort supplémentaire d'intégration et de maintenance.
+
POC
+
Sources
+
Les sources du POC sont disponible ici
+https://forge.cadoles.com/Envole/envole
+
Elles sont pour l'instant hébergé à Cadoles pour des raisons de simplicité de mise en oeuvre, mais à terme elles seront bien stockées chez Eole
+
Repository
+
Certaines images sont hébergées elles aussi sur un repository public de Cadoles. Là aussi pour des raisons de simplicité de mise en oevre, mais à terme Eole devra fournir un repository propre aux images Envole.
+
Les images en questions sont celles des applications maintenues par Envole, en l'occurence pour l'instant uniquement Ninegate. Mais à terme pourra aussi y figurer des images d'applications tiers sur lesquelles nous aurions besion d'altérer légèrement le comportement.
+
Installation du POC
+
1- Instancier un eolebase 2.9
+
2- Installer eole-web
+
apt-get install eole-web
+Genconfig
+Services > Activer l'interface web de l'EAD = non
+Services > Activer le serveur de bases de données MySQL = non
+Services > Activer l’interface d’administration du module (EAD3) = non
+Applications Web > Nom de domaine des applications web = mondomaine.fr
+save & quit
+Reconfigure
+
+
+
+
diff --git a/src/envole-1.0/doc/etude.md b/src/envole-1.0/doc/etude.md
new file mode 100644
index 0000000..bc047ef
--- /dev/null
+++ b/src/envole-1.0/doc/etude.md
@@ -0,0 +1,149 @@
+# Envole
+
+## Introduction
+
+Envole est une solution qui propose un ensemble d'applicatifs web fédérés autour d'un annaire afin de gérer l'identité ainsi qu'un SSO afin de gérer l'authentification.
+
+Il s'appuit sur la distrution EOLE pour déployer ses différents composants.
+
+Envole rencontre depuis des années des problèmatiques :
+
+- Elle doit se baser sur une version précise d'EOLE 2.5 ou 2.6 ou 2.7 ou 2.8 ou 2.9 qui ont chacune leur contrainte de version php
+- Les différentes applications Envole ont leur propre contrainte de version php.
+- Ce qui oblige de limiter les possibilités de montée de version de l'application dans une version x d'eole car cette dernière ne fournit pas la version minimum de php requise
+- Ou qui empéche le passage d'une application de fonctionner dans une version x d'eole car cette dernière propose une version trop résente de php pour l'application
+
+Ce document va chercher à évaluer la possibilité de conteneriser les applications Envole, afin qu'elles puissent fonctionner le moins possible en contrainte avec la version d'Eole
+
+## Architecture
+
+### EoleBase
+
+La présente étude part du principe qu'Envole ne serait plus installé sur une instance Scribe mais sur une installation EoleBase d'Eole
+
+**Avantages**
+- Décharger le serveur Scribe et lui laisser ses fonctions principales. C'est à dire
+ - Contrôleur de Domaine
+ - SSO
+ - Annuaire
+ - Imap (et SMTP ?)
+- Faire évoluer plus facilement le serveur Envole vers des versions plus récente d'Eole avec moins de contrainte tout en assurant une mise à jour de sécurité plus régulière
+
+**Inconvéhients**
+- L'adminstrateur devra configurer le lien SSO et Annaire qui eux restent sur le scribe.
+- Il devra donc fixer certains secrets sur le Scribe (notamment le compte reader/writer annuaire sur le scibe)
+- Connaitre et renseigner les hosts/ports des service SSO et Annuaire
+- Avoir un second nom de domaine pour l'accès aux applications Envole
+
+
+### Paquet Debian
+
+Contrairement à la précédente logique Envole, il n'y aurait qu'un seul paquet Debian pour Envole. Il n'installerait pas les sources des applications, mais uniquement
+
+- le dictionnaire eole de configuration
+- les templates de configuration
+- le dossier de définitions de l'ensemble des conteneurs possible pour Envole
+- un script qui viendrait monter ou non les conteneurs souhaités par l'administateur
+
+### POC
+
+Afin de s'assurer de la faisabilité d'un tel changement, un POC a été initié, dans le cadre des éléments précédents cités. La première question fut de savoir quelle technologie de conteneurisation serait à utiliser PODMAN ou DOCKER, et dans leur logique de composer PODMAN-COMPOSE ou DOCKER-COMPOSER.
+
+### PODMAN vs DOCKER sur Eole
+
+**PODMAN**
+
+Eole a intégré à partir de la 2.9 dans sa distribution podman. Ce qui de prime abord devrait-être la technologie à utiliser, sauf que
+
+- Ubuntu 22.04 ne dispose pas de paquet pour podman-compose
+- Pour installer podman-compose, il est nécessaire de l'installer via pip
+- De plus la version de podman disponible sur Ubuntu 22.04 est une version 3.4 qui n'est pas compatible avec la version de podman-compose
+- Il est nécessaire d'installer la dernière version 4.4 de Podman PPA pour faire fonctionner l'ensemble
+- Par la suite il est possible de créer un composer d'image docker comme on pourrait le faire avec docker-compose. Podman est juste plus stricte dans sa synthaxe et certaines commandes ne sont pas tout à fait indentique
+- Mais il apparait qu'un reconfigure rendra totalement inopérant le réseau des conteneurs. Pour le rendre de nouveau opérant, il est nécessaire de le détruire pour le reconstruire.
+
+**DOCKER**
+
+Eole n'a pas intégré nativement docker. Mais il est tout à fait possible de l'installer par ses propres moyens sauf que
+- Tout comme Podman Ubuntu ne propose pas de paquet suffisament à jour de docker-ce et docker-compose
+- Il est nécessaire de les installer via la mise en place d'un PPA
+- Par la suite docker se comporte bien mieux que podman. Il est plus souple d'usage, moins verbeux
+- Mais tout comme podman, un reconfigure vient rendre totalement inopérant le reseau des conteneurs. Il est nécessaire de réinitialiser docker-ce pour rétablir le reseau.
+
+**CONCLUSION**
+
+Quoi qu'il arrive, une intégration compléte que cela soit avec Podman ou avec Docker, demandera un travail d'intégration d'Eole
+- afin de disposer des dernières versions possibles de l'un ou de l'autre
+- que l'un ou l'autre ne détruit pas le réseau associé au composer de conteneur
+
+Ma préférence va malgrés tout sur Docker, il est plus souple moins verbeux et me semble plus fiable à long terme. Il serait possible de maitenir les deux solutions en parrallèle avec un effort supplémentaire d'intégration et de maintenance.
+
+## POC
+
+### Sources
+
+Les sources du POC sont disponible ici
+https://forge.cadoles.com/Envole/envole
+
+Elles sont pour l'instant hébergé à Cadoles pour des raisons de simplicité de mise en oeuvre, mais à terme elles seront bien stockées chez Eole
+
+### Repository
+
+Certaines images sont hébergées elles aussi sur un repository public de Cadoles. Là aussi pour des raisons de simplicité de mise en oevre, mais à terme Eole devra fournir un repository propre aux images Envole.
+
+Les images en questions sont celles des applications maintenues par Envole, en l'occurence pour l'instant uniquement Ninegate. Mais à terme pourra aussi y figurer des images d'applications tiers sur lesquelles nous aurions besion d'altérer légèrement le comportement.
+
+### Installation du POC
+
+1- Instancier un eolebase 2.9
+
+2- Installer eole-web
+```
+apt-get install eole-web
+Genconfig
+Services > Activer l'interface web de l'EAD = non
+Services > Activer le serveur de bases de données MySQL = non
+Services > Activer l’interface d’administration du module (EAD3) = non
+Applications Web > Nom de domaine des applications web = mondomaine.fr
+save & quit
+Reconfigure
+```
+
+3- Installer docker & docker-compose
+```
+apt install git make apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
+echo \
+"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
+$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+apt update
+apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
+```
+
+4- Installer Envole
+
+```
+cd /usr/share
+mkdir -p envole
+cd /usr/share/envole
+mkdir -p docker
+cd /usr/share/envole/docker
+git clone https://forge.cadoles.com/Envole/envole.git
+cd /root/git/envole
+make install
+```
+
+5- Configurer Envole
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/envole-1.0/doc/etude.pdf b/src/envole-1.0/doc/etude.pdf
new file mode 100644
index 0000000..6f214e3
Binary files /dev/null and b/src/envole-1.0/doc/etude.pdf differ
diff --git a/src/envole-1.0/env/.env b/src/envole-1.0/env/.env
index fc52b56..d504c3e 100644
--- a/src/envole-1.0/env/.env
+++ b/src/envole-1.0/env/.env
@@ -26,7 +26,7 @@ MARIADB_ACTIVATE=1
MARIADB_LOCAL=1
MARIADB_ROOT_PASSWORD=${ADMIN_PASSWORD}
MARIADB_USER=user
-MARIADB_PASSWORD=changeme
+MARIADB_PASSWORD=${ADMIN_PASSWORD}
# LDAP
# LDAP_SYNC Si MASTERIDENTITY = SQL permet la synchronisation des utilisateurs SQL vers LDAP
@@ -46,6 +46,17 @@ LDAP_BASENIVEAU01=ou=niveau01,ou=ninegate,${LDAP_BASEDN}
LDAP_BASENIVEAU02=ou=niveau02,ou=ninegate,${LDAP_BASEDN}
LDAP_BASEGROUP=ou=groups,ou=ninegate,${LDAP_BASEDN}
LDAP_SYNC=1
+LDAP_TEMPLATE=
+LDAP_USERNAME=uid
+LDAP_FIRSTNAME=givenname
+LDAP_LASTNAME=sn
+LDAP_EMAIL=mail
+LDAP_MEMBER=memberUid
+SCRIBE_GROUP=1
+SCRIBE_MASTER=1
+OPENLDAPREQNIVEAU01=
+OPENLDAPSYNCHROGROUP=0
+OPENLDAPREQGROUP=
# CAS
# attention si localhost = ajouter keycloak dans votre propre host : le service web doit valider son ticket via le nom du service et votre navigateur doit assi le voir
diff --git a/src/envole-1.0/env/.env.zapp.phpldapadmin b/src/envole-1.0/env/.env.zapp.phpldapadmin
index d07d66d..aee41a8 100644
--- a/src/envole-1.0/env/.env.zapp.phpldapadmin
+++ b/src/envole-1.0/env/.env.zapp.phpldapadmin
@@ -3,4 +3,5 @@
PHPLDAPADMIN_LDAP_HOSTS=ldap://${LDAP_SERVICE_NAME}:${LDAP_PORT}
PHPLDAPADMIN_HTTPS="false"
+PHPLDAPADMIN_SERVER_PATH=
diff --git a/src/envole-1.0/envole.sh b/src/envole-1.0/envole.sh
index 756812f..eddcdc5 100755
--- a/src/envole-1.0/envole.sh
+++ b/src/envole-1.0/envole.sh
@@ -15,10 +15,6 @@ cat ./env/.env* >> ./.env.local
clear
BigTitle "ENVOLE"
-echo "========"
-echo ${WEB_URL}
-echo "========"
-
# on remplace les valeur reprise dans les autres .env car podman interprète mal
sed -i 's#${WEB_URL}#'${WEB_URL}'#g' ./.env.local
sed -i 's#${WEB_PROTOCOL}#'${WEB_PROTOCOL}'#g' ./.env.local
@@ -61,9 +57,11 @@ sed -i 's#${NEXTCLOUD_URL}#'${NEXTCLOUD_URL}'#g' ./.env.local
#== STOP ===================================================================================================================================
#===========================================================================================================================================
#1 = service to stop if null all service
+#2 = stopper par destroyall
stop() {
- Title "STOP"
+ if [[ "$2" != 1 ]]; then Title "STOP"; fi
+
$PODCOMPOSEBIN stop $1
if [[ "$PODCOMPOSEBIN" == "podman-compose" ]]
then
@@ -90,15 +88,15 @@ wait_for_container() {
waiting_done="false"
while [[ "${waiting_done}" != "true" ]]; do
- container_state="$($PODBIN inspect "${container_id}" --format '{{ .State.Status }}')"
- if [[ "${container_state}" == "running" ]]; then
- health_status="$($PODBIN inspect "${container_id}" --format '{{ .State.Health.Status }}')"
- if [[ ${health_status} == "healthy" ]]; then
- waiting_done="true"
- fi
- else
- waiting_done="true"
- fi
+ container_state="$($PODBIN inspect "${container_id}" --format '{{ .State.Status }}')"
+ if [[ "${container_state}" == "running" ]]; then
+ health_status="$($PODBIN inspect "${container_id}" --format '{{ .State.Health.Status }}')"
+ if [[ ${health_status} == "healthy" ]]; then
+ waiting_done="true"
+ fi
+ else
+ waiting_done="true"
+ fi
sleep 1;
done;
}
@@ -214,7 +212,7 @@ up(){
echo
fi
else
- EchoVert ${1^^}
+ Title ${1^^}
$PODCOMPOSEBIN up -d $1
fi
}
@@ -245,9 +243,10 @@ destroyall(){
#2 = ne pas poser de questions
destroy(){
- stop $1
-
Title "DESTROY "${1^^}
+
+ stop $1 1
+
if [[ "$PODCOMPOSEBIN" == "docker-compose" ]]
then
$PODBIN rm "envole-$1"
@@ -340,6 +339,9 @@ then
elif [[ $1 == "logs" ]]
then
$PODCOMPOSEBIN logs -f $2
+elif [[ $1 == "iswait" ]]
+then
+ wait_for_container $2
elif [[ $1 == "env" ]]
then
EchoVert "Fichier .env.local regénéré"
diff --git a/src/envole-1.0/misc/tools/cadoles_theme.css b/src/envole-1.0/misc/tools/cadoles_theme.css
new file mode 100644
index 0000000..b6fd54e
--- /dev/null
+++ b/src/envole-1.0/misc/tools/cadoles_theme.css
@@ -0,0 +1,129 @@
+@font-face {
+ font-family: "Roboto";
+ src: url("fonts/Roboto/Roboto-Regular.ttf") format('truetype');
+}
+
+body {
+ font-family: "Roboto" !important;
+ color: #333;
+ max-width: 1200px;
+ margin: auto;
+}
+
+.title {
+ color: #078eb5;
+ text-transform: uppercase;
+ font-size: 3em;
+ margin-top:30px;
+ text-align: center;
+ line-height: 1em;
+ font-weight: bold
+}
+
+h1 {
+ text-transform: uppercase;
+ page-break-before: always;
+}
+
+h2 {
+ text-transform: uppercase;
+ text-decoration: underline;
+}
+
+h3 {
+ text-decoration: underline;
+}
+
+a, a:hover, a:visited , h1, h2, h3, h4, h5, h6 {
+ color: #078eb5;
+ font-weight: bold
+}
+
+img {
+ max-width:100%;
+ margin:auto;
+ display: block;
+}
+
+.center {
+ text-align: center;
+}
+
+footer img {
+ width: 32px;
+}
+
+.info,
+.success,
+.warning,
+.danger {
+ padding: 1rem;
+ margin-bottom: 1rem;
+}
+
+.info {
+ background-color: rgba(41, 128, 185, .1);
+ border-left: solid 4px rgba(41, 128, 185,1.0);
+ color: rgba(41, 128, 185,1.0);
+}
+
+.success {
+ background-color: rgba(39, 174, 96, .1);
+ border-left: solid 4px rgba(39, 174, 96,1.0);
+ color:rgba(39, 174, 96,1.0);
+}
+
+.warning {
+ padding: 1rem;
+ background-color: rgba(243, 156, 18, .1);
+ border-left: solid 4px #f39c12;
+ color: #f39c12;
+}
+
+.danger {
+ background-color: rgba(231, 76, 60, .1);
+ border-left: solid 4px rgba(231, 76, 60,1.0);
+ color: rgba(231, 76, 60,1.0);
+}
+
+.page-break {
+ page-break-after: always;
+}
+
+.center {
+ text-align: center;
+}
+
+table {
+ width:100%;
+}
+
+table > thead > tr > th {
+ border: 1px solid;
+ text-align:center;
+}
+
+table > tbody > tr > td {
+ border: 1px solid;
+}
+
+.matriceresponsabilites {
+ text-align:center;
+ font-size: 10px;
+}
+
+.matriceresponsabilites td:nth-child(2) {
+ text-align:left;
+}
+
+.matriceresponsabilites td {
+ padding: 2px;
+}
+
+img[alt="schéma declenchement PCA"] { width: 500px; }
+img[alt="Type Epique"] { width: 500px; }
+img[alt="Type Epique Dependance"] { width: 200px; }
+img[alt="Type Scenario"] { width: 500px; }
+img[alt="Type Scenario Dependance"] { width: 200px; }
+img[alt="Type Tache"] { width: 500px; }
+img[alt="Jalon"] { width: 200px; }
\ No newline at end of file
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/LICENSE.txt b/src/envole-1.0/misc/tools/fonts/Roboto/LICENSE.txt
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/src/envole-1.0/misc/tools/fonts/Roboto/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Black.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Black.ttf
new file mode 100644
index 0000000..2d45238
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Black.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BlackItalic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BlackItalic.ttf
new file mode 100644
index 0000000..29a4359
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BlackItalic.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Bold.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Bold.ttf
new file mode 100644
index 0000000..d998cf5
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Bold.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BoldItalic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BoldItalic.ttf
new file mode 100644
index 0000000..b4e2210
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-BoldItalic.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Italic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Italic.ttf
new file mode 100644
index 0000000..5b390ff
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Italic.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Light.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Light.ttf
new file mode 100644
index 0000000..3526798
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Light.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-LightItalic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-LightItalic.ttf
new file mode 100644
index 0000000..46e9bf7
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-LightItalic.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Medium.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Medium.ttf
new file mode 100644
index 0000000..f714a51
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Medium.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-MediumItalic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-MediumItalic.ttf
new file mode 100644
index 0000000..5dc6a2d
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-MediumItalic.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Regular.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Regular.ttf
new file mode 100644
index 0000000..2b6392f
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Regular.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Thin.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Thin.ttf
new file mode 100644
index 0000000..4e797cf
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-Thin.ttf differ
diff --git a/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-ThinItalic.ttf b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-ThinItalic.ttf
new file mode 100644
index 0000000..eea836f
Binary files /dev/null and b/src/envole-1.0/misc/tools/fonts/Roboto/Roboto-ThinItalic.ttf differ
diff --git a/src/envole-1.0/misc/tools/logo.png b/src/envole-1.0/misc/tools/logo.png
new file mode 100644
index 0000000..6b0753a
Binary files /dev/null and b/src/envole-1.0/misc/tools/logo.png differ
diff --git a/tmpl/envole-apache.conf b/tmpl/envole-apache.conf
new file mode 100644
index 0000000..9d8128e
--- /dev/null
+++ b/tmpl/envole-apache.conf
@@ -0,0 +1,19 @@
+
+ProxyPass /ninegate http://0.0.0.0:9000/ninegate retry=0 keepalive=On
+ProxyPassReverse /ninegate http://0.0.0.0:9000/ninegate retry=0
+ProxyPass /wssninegate ws://0.0.0.0:9000/wssninegate retry=0 keepalive=On
+ProxyPassReverse /wssninegate ws://0.0.0.0:9000/wssninegate retry=0
+
+ProxyPass /nextcloud http://0.0.0.0:9001 retry=0 keepalive=On
+ProxyPassReverse /nextcloud http://0.0.0.0:9001 retry=0
+
+ProxyPass /adminer http://0.0.0.0:9100 retry=0 keepalive=On
+ProxyPassReverse /adminer http://0.0.0.0:9100 retry=0
+
+ProxyPass /phpldapadmin http://0.0.0.0:9101/phpldapadmin retry=0 keepalive=On
+ProxyPassReverse /phpldapadmin http://0.0.0.0:9101/phpldapadmin retry=0
+
+ProxyPass /nineapache http://0.0.0.0:9102 retry=0 keepalive=On
+ProxyPassReverse /nineapache http://0.0.0.0:9102 retry=0
+
+
diff --git a/tmpl/envole-nextcloud.env b/tmpl/envole-nextcloud.env
new file mode 100644
index 0000000..03e6ff8
--- /dev/null
+++ b/tmpl/envole-nextcloud.env
@@ -0,0 +1,7 @@
+
+#-- LOCAL
+
+NEXTCLOUD_ACTIVATE=1
+NEXTCLOUD_ALIAS=/nextcloud
+NEXTCLOUD_URL=${WEB_PROTOCOL}://${WEB_URL}/nextcloud
+
diff --git a/tmpl/envole-phpldapadmin.env b/tmpl/envole-phpldapadmin.env
new file mode 100644
index 0000000..ffc3726
--- /dev/null
+++ b/tmpl/envole-phpldapadmin.env
@@ -0,0 +1,7 @@
+
+#-- LOCAL
+
+PHPLDAPADMIN_ACTIVATE=1
+PHPLDAPADMIN_URL=/phpldapadmin
+PHPLDAPADMIN_SERVER_PATH=${PHPLDAPADMIN_URL}
+
diff --git a/tmpl/envole-realm.json b/tmpl/envole-realm.json
new file mode 100644
index 0000000..978a0d7
--- /dev/null
+++ b/tmpl/envole-realm.json
@@ -0,0 +1,2422 @@
+{
+ "id": "envole",
+ "realm": "envole",
+ "displayName": "Keycloak",
+ "displayNameHtml": "