From 49658a4249756875a212ac4739bd7f9f4a225f9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com>
Date: Wed, 5 Oct 2022 15:42:07 +0000
Subject: [PATCH] feat: OpenShift deployment

---
 .gitignore                                    |   3 +-
 .vscode/launch.json                           |  25 +---
 Dockerfile                                    |   4 +-
 README.md                                     |  14 +-
 backup-build/Dockerfile.db-backup             |  30 -----
 backup-build/backup-cron-job                  |   2 -
 backup-build/backup.sh                        |  20 ---
 backup-build/restore.sh                       |   5 -
 dbinit/dbinit.sql                             |   2 +-
 dbinit/{fluidprices.CSV => fluidprices.csv}   |   0
 dbinit/init.md                                |  22 ++++
 docker-compose.yml                            |  43 +------
 internal/rootmux/rootmux_test.go              |   2 +-
 k8s/README.md                                 | 120 ++++++++++++++++++
 .../ecolyo-agent-client-deployment.yml        |  27 ++++
 .../ecolyo-agent-database-deployment.yml      |  49 +++++++
 .../ecolyo-agent-meilisearch-deployment.yml   |  58 +++++++++
 .../ecolyo-agent-server-deployment.yml        |  89 +++++++++++++
 k8s/secrets/ecolyo-agent-database.yml         |  10 ++
 k8s/secrets/meilisearch.yml                   |   8 ++
 k8s/secrets/sge-api.yml                       |   8 ++
 k8s/services/backend.yml                      |  15 +++
 k8s/services/ecolyo-agent-client-service.yml  |  12 ++
 .../ecolyo-agent-database-service.yml         |  12 ++
 .../ecolyo-agent-meilisearch-service.yml      |  12 ++
 main.go                                       |   2 +-
 {configs => mnt/configs}/tokenskey.json       |   0
 27 files changed, 456 insertions(+), 138 deletions(-)
 delete mode 100644 backup-build/Dockerfile.db-backup
 delete mode 100644 backup-build/backup-cron-job
 delete mode 100644 backup-build/backup.sh
 delete mode 100644 backup-build/restore.sh
 rename dbinit/{fluidprices.CSV => fluidprices.csv} (100%)
 create mode 100644 k8s/README.md
 create mode 100644 k8s/deployments/ecolyo-agent-client-deployment.yml
 create mode 100644 k8s/deployments/ecolyo-agent-database-deployment.yml
 create mode 100644 k8s/deployments/ecolyo-agent-meilisearch-deployment.yml
 create mode 100644 k8s/deployments/ecolyo-agent-server-deployment.yml
 create mode 100644 k8s/secrets/ecolyo-agent-database.yml
 create mode 100644 k8s/secrets/meilisearch.yml
 create mode 100644 k8s/secrets/sge-api.yml
 create mode 100644 k8s/services/backend.yml
 create mode 100644 k8s/services/ecolyo-agent-client-service.yml
 create mode 100644 k8s/services/ecolyo-agent-database-service.yml
 create mode 100644 k8s/services/ecolyo-agent-meilisearch-service.yml
 rename {configs => mnt/configs}/tokenskey.json (100%)

diff --git a/.gitignore b/.gitignore
index ccce815..f78bfaf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 .env
 backoffice.db
-meili_data/
\ No newline at end of file
+meili_data/
+db_data/
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 785de51..2fe17c0 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -10,30 +10,7 @@
       "request": "launch",
       "mode": "debug",
       "program": "${workspaceFolder}/main.go",
-      "env": {
-        "HOSTNAME": "localhost",
-        "ADMIN_ROLE": "ADMINS",
-        "DEBUG_MODE": "true",
-        "MOCK_OAUTH2": "true",
-        "HTTPS_PORT": "1443",
-        "IMAGE_FOLDER": "image-lib",
-
-        "REDIRECT_URL": "https://localhost:1443/OAuth2Callback",
-        "CLIENT_ID": "foo",
-        "CLIENT_SECRET": "bar",
-        "AUTH_URL": "http://localhost:8090/auth",
-        "TOKEN_URL": "http://localhost:8090/token",
-        "USERINFO_URL": "http://localhost:8090/admininfo",
-
-        "DATABASE_USER": "root",
-        "DATABASE_PASSWORD": "password",
-        "DATABASE_NAME": "backoffice",
-        "DATABASE_HOST": "127.0.0.1",
-        "LOGOUT_URL": "/",
-        "SGE_API_TOKEN": "sgeapitoken",
-        "MEILI_HOST": "http://localhost:7700",
-        "MEILI_MASTER_KEY": "masterkey"
-      },
+      "envFile": "${workspaceFolder}/.env",
       "showLog": true
     },
     {
diff --git a/Dockerfile b/Dockerfile
index 87bf245..ac1e774 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -42,7 +42,7 @@ RUN setcap cap_net_bind_service=+ep /app/backoffice-server
 ##############################
 # STEP 2 build a small image #
 ##############################
-FROM scratch
+FROM curlimages/curl:7.85.0
 
 WORKDIR /app
 
@@ -56,7 +56,7 @@ COPY --from=builder /etc/mime.types /etc/mime.types
 # Copy static executable and application resources
 COPY --from=builder /app/backoffice-server /app/backoffice-server
 COPY --from=builder /app/dev_certificates /app/dev_certificates
-COPY --from=builder /app/configs /app/configs
+COPY --from=builder /app/mnt/configs /app/mnt/configs
 
 # Use an unprivileged user.
 USER appuser:appuser
diff --git a/README.md b/README.md
index e530d50..7148c7d 100644
--- a/README.md
+++ b/README.md
@@ -30,23 +30,15 @@ Once deployed, you can access to a Swagger documentation of the API on https://$
 
 ## Launch locally
 
-To launch it locally :
+Launch all necessary services :
 
 - Run `docker-compose up -d`
 
 In local you can access phpmyadmin interface to manage the database : http://localhost:8008
 
-## Launch locally in standalone for development
+Launch the server by pressing F5 on vscode, you will see the logs on the debug console.
 
-To launch the backend for development goal:
-
-- edit _main.go_ file, uncomment the last line "log.Fatal(http.ListenAndServe(":"+strconv.Itoa(httpsPort), rootMux.Router))" and comment the line above "log.Fatal(http.ListenAndServeTLS(":"+strconv.Itoa(httpsPort), "./dev_certificates/localhost.crt", "./dev_certificates/localhost.key", rootMux.Router))"
-- This way you disable https so make sure your requests goes on http adresses
-- in _vscode/launch.json_ set "REDIRECT_URL" to "http://localhost:1443/OAuth2Callback",
-- also comment the port and host values
-- if you comment the DATABASE_USER line, it will launches with a sqlite database instead of mysql
-- launch the app by pressing F5 on vscode, you will see the logs on the debug console.
-- this way you won't have the login every time you relaunch the backend for development
+All API routes are available on https://localhost:1443
 
 ## Build image for local
 
diff --git a/backup-build/Dockerfile.db-backup b/backup-build/Dockerfile.db-backup
deleted file mode 100644
index a478bbc..0000000
--- a/backup-build/Dockerfile.db-backup
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM alpine:3.14.0
-
-RUN apk add apk-cron mysql-client findutils
-
-# Copy cron job file to the cron.d directory
-COPY backup-cron-job /etc/cron.d/backup-cron-job
-
-# Give execution rights on the cron job
-RUN chmod 0644 /etc/cron.d/backup-cron-job
-
-# Copy backup script
-COPY backup.sh /etc/cron.d/backup.sh
-
-# Give execution rights on backup script
-RUN chmod 0644 /etc/cron.d/backup.sh
-
-# Copy restore script
-COPY restore.sh /etc/cron.d/restore.sh
-
-# Give execution rights on restore script
-RUN chmod 0644 /etc/cron.d/restore.sh
-
-# Apply cron job
-RUN crontab /etc/cron.d/backup-cron-job
-
-# Create the log file to be able to run tail
-RUN touch /var/log/cron.log
-
-# Run the command on container startup
-CMD crond && tail -f /var/log/cron.log
\ No newline at end of file
diff --git a/backup-build/backup-cron-job b/backup-build/backup-cron-job
deleted file mode 100644
index 35dace2..0000000
--- a/backup-build/backup-cron-job
+++ /dev/null
@@ -1,2 +0,0 @@
-# Run the backup script every day at 12:00AM
-0 0 * * * sh /etc/cron.d/backup.sh
\ No newline at end of file
diff --git a/backup-build/backup.sh b/backup-build/backup.sh
deleted file mode 100644
index 63d1904..0000000
--- a/backup-build/backup.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-
-DATE=$(date +"%Y-%m-%d-%H-%M-%S")
-BACKUP_DIRECTORY="/backup"
-DIRECTORIES_NAME_PATTERN='ecolyo-agent-20*'
-NUMBER_TO_KEEP=14
-BACKUP="${BACKUP_DIRECTORY}/ecolyo-agent-${DATE}"
-
-# Create a new directory into backup directory location for this date
-mkdir -p $BACKUP
-
-# Dumb the database
-mysqldump --host=database-agent --port=3306 -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE >"$BACKUP/$MYSQL_DATABASE.sql"
-
-# Remove all but last n saves
-find $BACKUP_DIR/* -maxdepth 1 -type d -name $DIRECTORIES_NAME_PATTERN -printf '%T@\t%p\n' |
-    sort -t $'\t' -g |
-    head -n -$NUMBER_TO_KEEP |
-    cut -d $'\t' -f 2- |
-    xargs rm -Rf
diff --git a/backup-build/restore.sh b/backup-build/restore.sh
deleted file mode 100644
index 2e135e4..0000000
--- a/backup-build/restore.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-BACKUP_DIR="/backup"
-
-mysql --host=database-agent --port=3306 -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE <"$BACKUP_DIR/$1/$MYSQL_DATABASE.sql"
diff --git a/dbinit/dbinit.sql b/dbinit/dbinit.sql
index 6b7ac16..c754679 100644
--- a/dbinit/dbinit.sql
+++ b/dbinit/dbinit.sql
@@ -1,4 +1,4 @@
-LOAD DATA LOCAL INFILE '/fluidprices.CSV' INTO TABLE prices 
+LOAD DATA LOCAL INFILE '/var/lib/mysql/fluidprices.csv' INTO TABLE prices 
 FIELDS TERMINATED BY ',' 
 LINES TERMINATED BY '\n'
 IGNORE 1 ROWS;
\ No newline at end of file
diff --git a/dbinit/fluidprices.CSV b/dbinit/fluidprices.csv
similarity index 100%
rename from dbinit/fluidprices.CSV
rename to dbinit/fluidprices.csv
diff --git a/dbinit/init.md b/dbinit/init.md
index 21120af..f09af11 100644
--- a/dbinit/init.md
+++ b/dbinit/init.md
@@ -23,3 +23,25 @@ docker exec -it <container-id> bash
 mysql --local-infile=1 -uroot -p backoffice < /dbinit/dbinit.sql
 
 ```
+
+## OpenShift
+
+- Connect to the database pod via the terminal on the console
+- Go to /var/lib/mysql
+
+```
+cd /var/lib/mysql
+```
+
+- Import the two files with curl (you can use temporary hosting solutions like tmpfiles.org)
+
+```
+curl --output dbinit.sql https://tmpfiles.org/dl/80799/dbinit.sql
+curl --output fluidprices.csv https://tmpfiles.org/dl/80799/fluidprices.csv
+```
+
+- Execute dbinit.sql script (the password is the cluster secret named "ecolyo-agent-database")
+
+```
+mysql --local-infile=1 -uroot -p ecolyo-agent-database < /dbinit/dbinit.sql
+```
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 3242f25..9fcc52a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,7 +9,7 @@ services:
             timeout: 10s
             retries: 60
         volumes:
-            - ./dbinit:/dbinit
+            - ./db_data:/var/lib/mysql
         networks:
             - ecolyo-agent-network
         ports:
@@ -19,7 +19,7 @@ services:
             MYSQL_DATABASE: ${DATABASE_NAME}
 
     meilisearch:
-        image: getmeili/meilisearch:v0.27.2
+        image: getmeili/meilisearch:v0.28.1
         healthcheck:
             test: ["CMD", "curl", "-f", "http://0.0.0.0:7700"]
             interval: 10s
@@ -46,46 +46,9 @@ services:
         environment:
             PMA_HOST: database
 
-    backoffice-container:
-        image: backoffice
-        depends_on:
-            database:
-                condition: service_healthy
-            meilisearch:
-                condition: service_healthy
-        build: .
-        restart: unless-stopped
-        volumes:
-            - /etc/localtime:/etc/localtime:ro
-            - ./configs:/app/configs
-            - ./letsencrypt_cache:/app/letsencrypt_cache
-            - ./data:/app/data
-            - ./../${IMAGE_FOLDER}:/app/${IMAGE_FOLDER}
-        networks:
-            - ecolyo-agent-network
-        ports:
-            - ${HTTPS_PORT}:${HTTPS_PORT}
-            - 8090:8090
-        environment:
-            - HOSTNAME=${HOSTNAME}
-            - HTTPS_PORT=${HTTPS_PORT}
-            - ADMIN_ROLE=${ADMIN_ROLE}
-            - REDIRECT_URL=${REDIRECT_URL}
-            - IMAGE_FOLDER=${IMAGE_FOLDER}
-            - CLIENT_ID=${CLIENT_ID}
-            - CLIENT_SECRET=${CLIENT_SECRET}
-            - AUTH_URL=${AUTH_URL}
-            - TOKEN_URL=${TOKEN_URL}
-            - USERINFO_URL=${USERINFO_URL}
-            - DEBUG_MODE=${DEBUG_MODE}
-            - MOCK_OAUTH2=${MOCK_OAUTH2}
-            - DATABASE_USER=${DATABASE_USER}
-            - DATABASE_NAME=${DATABASE_NAME}
-            - DATABASE_PASSWORD=${DATABASE_PASSWORD}
-            - DATABASE_HOST=database
-
 volumes:
     db_data:
+    meili_data:
 
 networks:
     ecolyo-agent-network:
\ No newline at end of file
diff --git a/internal/rootmux/rootmux_test.go b/internal/rootmux/rootmux_test.go
index a215fc1..159c050 100644
--- a/internal/rootmux/rootmux_test.go
+++ b/internal/rootmux/rootmux_test.go
@@ -56,7 +56,7 @@ func TestMain(m *testing.M) {
 
 	// Setup the token manager to use debug mode
 	os.Setenv("DEBUG_MODE", "true")
-	tokens.Init("../configs/tokenskey.json", true)
+	tokens.Init("../mnt/configs/tokenskey.json", true)
 
 	// Convert example objects to string
 	mailSubjectBytes, _ := json.Marshal(mailSubject)
diff --git a/k8s/README.md b/k8s/README.md
new file mode 100644
index 0000000..5f0f5f4
--- /dev/null
+++ b/k8s/README.md
@@ -0,0 +1,120 @@
+## Connexion à la machine de rebond
+
+### Connexion au bureau à distance
+Possible d'utiliser Remmina sous Linux
+
+Configuration:
+- serveur : kubernetes.synaaps.com:33338
+- nom d'utilisateur : paas338.<pnom> (ex: paas338.rpailharey)
+- mot de passe : fourni par SMS + possibilité de le changer sur https://safeweb.synaaps.com/cloud/?orgname=synaaps&domainid=2
+
+### Installer VS Code sur la machine
+- Suivre les étapes d'installation sur https://code.visualstudio.com/download
+
+### Accès à la console OpenShift
+- Se rendre sur https://console-openshift-console.apps.dedicated-0003.kaas.synaaps.intra
+- Se connecter (mêmes identifiants que ceux du bureau à distance)
+
+- Pour pouvoir lancer les commandes OpenShift (ex: oc apply) depuis un terminal
+    - Se rendre sur https://oauth-openshift.apps.dedicated-0003.kaas.synaaps.intra/oauth/token/request
+    - Se connecter avec les identifiants précédents
+    - Cliquer sur "Display login"
+    - Recopier la commande `oc login --token=YOUR_TOKEN --server=https://api-dedicated-0003.kaas.synaaps.intra:6443`
+    - Lancer dans un terminal 
+
+
+## Création des secrets
+### Accès au repo de la forge
+-  Depuis la console Web, se rendre dans la section "Workloads > Secrets" 
+-  Cliquer sur le bouton bleu "Create" puis "Image pull secret"
+-  Donner les informations :
+    -  Secret name : llle-project
+    -  Authentification type : Image registry credentials
+    -  Registry server address : registry.forge.grandlyon.com
+    -  Username: llle-project
+    -  Password: <demander le password>
+- Cliquer sur Create
+
+### Secrets de la database
+- Depuis VS Code, créer un fichier ecolyo-agent-database.yml
+- Copier le contenu du fichier k8s/secrets/ecolyo-agent-database.yml dedans
+- Remplacer les valeurs de "host", "name" et "password"
+- Lancer `oc apply -f ecolyo-agent-database.yml`
+
+### Secrets des APIs SGE
+- Depuis VS Code, créer un fichier sge-api.yml
+- Copier le contenu du fichier k8s/secrets/sge-api.yml dedans
+- Remplacer la valeur de "token"
+- Lancer `oc apply -f sge-api.yml`
+
+### Secrets de Meilisearch
+- Depuis VS Code, créer un fichier meilisearch.yml
+- Copier le contenu du fichier k8s/secrets/meilisearch.yml dedans
+- Remplacer la valeur de "master-key"
+- Lancer `oc apply -f meilisearch.yml`
+
+## Création des volumes
+- Demander la création des Persistent Volumes (PV) de façon à obtenir la configuration suivante (contacter un administrateur du cluster) :
+
+| Name | Capacity |
+| ------ | ------ |
+| pvc-1-ns-selfdata-d01-syn-claim | 1 GiB |
+| pvc-2-ns-selfdata-d01-syn-claim | 500 MiB |
+| pvc-3-ns-selfdata-d01-syn-claim | 2 GiB |
+
+## Création des déploiements 
+### Déployer la base de données MySQL 
+- Depuis VS Code, créer un fichier ecolyo-agent-database-deployment.yml
+- Copier le contenu du fichier k8s/deployments/ecolyo-agent-database-deployment.yml dedans
+- Lancer `oc apply -f ecolyo-agent-database-deployment.yml`
+
+### Créer le service de la base de données MySQL
+- Depuis VS Code, créer un fichier ecolyo-agent-database-service.yml
+- Copier le contenu du fichier k8s/services/ecolyo-agent-database-service.yml dedans
+- Lancer `oc apply -f ecolyo-agent-database-service.yml`
+
+### Déployer la base de données Meilisearch 
+- Depuis VS Code, créer un fichier ecolyo-agent-meilisearch-deployment.yml
+- Copier le contenu du fichier k8s/deployments/ecolyo-agent-meilisearch-deployment.yml dedans
+- Lancer `oc apply -f ecolyo-agent-meilisearch-deployment.yml`
+
+### Créer le service de la base de données Meilisearch
+- Depuis VS Code, créer un fichier ecolyo-agent-meilisearch-service.yml
+- Copier le contenu du fichier k8s/services/ecolyo-agent-meilisearch-service.yml dedans
+- Lancer `oc apply -f ecolyo-agent-meilisearch-service.yml`
+
+### Déployer le serveur d'Ecolyo Agent
+- Depuis VS Code, créer un fichier ecolyo-agent-server-deployment.yml
+- Copier le contenu du fichier k8s/deployments/ecolyo-agent-server-deployment.yml dedans
+- Lancer `oc apply -f ecolyo-agent-server-deployment.yml`
+
+### Créer le service du serveur d'Ecolyo Agent
+- Depuis VS Code, créer un fichier ecolyo-agent-server-service.yml
+- Copier le contenu du fichier k8s/services/ecolyo-agent-server-service.yml dedans
+- Lancer `oc apply -f ecolyo-agent-server-service.yml`
+
+### Déployer le client d'Ecolyo Agent
+- Depuis VS Code, créer un fichier ecolyo-agent-client-deployment.yml
+- Copier le contenu du fichier k8s/deployments/ecolyo-agent-client-deployment.yml dedans
+- Lancer `oc apply -f ecolyo-agent-client-deployment.yml`
+
+### Créer le service du client d'Ecolyo Agent
+- Depuis VS Code, créer un fichier ecolyo-agent-client-service.yml
+- Copier le contenu du fichier k8s/services/ecolyo-agent-client-service.yml dedans
+- Lancer `oc apply -f ecolyo-agent-client-service.yml`
+
+### Créer la route publique d'accès au client d'Ecolyo Agent
+- Extraire les certificats TLS avec la commande `oc extract secret/gl-cert -n default --confirm | Out-Null`
+- Lancer la commande `oc create route edge ecolyo-agent --namespace=ns-selfdata-d01-syn --port=8080 --service=ecolyo-agent-client-service --cert=tls --cert=tls.crt --key=tls.key --hostname=ecolyo-agent.apps.grandlyon.com`
+
+
+## Regénérer et initialiser les assets
+- Depuis la forge, se rendre sur le projet backoffice-server, dans la section CI/CD et lancer la pipeline sur la branche master
+- Lancer manuellement le job import-convert-assets et noter son JOB_ID présent dans l'URL
+- Depuis la console OpenShift, se connecter au terminal du pod ecolyo-agent-server
+- Aller dans le dossier du volume "mnt" avec la commande `cd /app/mnt`
+- Télécharger les assets avec la commande `curl --output image-lib.zip --header "PRIVATE-TOKEN: <BO_SERVER_API_ACCESS_TOKEN>" https://forge.grandlyon.com/api/v4/projects/621/jobs/<JOB_ID>/artifacts`
+- Décompresser l'archive avec la commande `unzip -o image-lib.zip`
+
+## Initialiser la BDD MySQL
+-Suivre les étapes décrites dans le fichier [init.md](/dbinit/init.md)
\ No newline at end of file
diff --git a/k8s/deployments/ecolyo-agent-client-deployment.yml b/k8s/deployments/ecolyo-agent-client-deployment.yml
new file mode 100644
index 0000000..dd38251
--- /dev/null
+++ b/k8s/deployments/ecolyo-agent-client-deployment.yml
@@ -0,0 +1,27 @@
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: ecolyo-agent-client
+  namespace: ns-selfdata-d01-syn
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: ecolyo-agent-client
+  template:
+    metadata:
+      labels:
+        app: ecolyo-agent-client
+    spec:
+      containers:
+        - name: ecolyo-agent-client
+          image: registry.forge.grandlyon.com/web-et-numerique/llle_project/backoffice-client:master
+          imagePullPolicy: Always
+          ports:
+            - containerPort: 8080
+              protocol: TCP
+      nodeSelector:
+        node-role.kubernetes.io/worker: ''
+      imagePullSecrets:
+        - name: llle-project
\ No newline at end of file
diff --git a/k8s/deployments/ecolyo-agent-database-deployment.yml b/k8s/deployments/ecolyo-agent-database-deployment.yml
new file mode 100644
index 0000000..f99fb70
--- /dev/null
+++ b/k8s/deployments/ecolyo-agent-database-deployment.yml
@@ -0,0 +1,49 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.1 (a9d05d509)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: ecolyo-agent-database
+  name: ecolyo-agent-database
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: ecolyo-agent-database
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.1 (a9d05d509)
+      creationTimestamp: null
+      labels:
+        io.kompose.network/ecolyo-agent-network: "true"
+        io.kompose.service: ecolyo-agent-database
+    spec:
+      containers:
+        - env:
+            - name: MYSQL_DATABASE
+              value: ecolyo-agent-database
+            - name: MYSQL_ROOT_PASSWORD
+              value: root_password
+          image: mysql:5
+          livenessProbe:
+            exec:
+              command:
+                - mysqladmin ping -h 127.0.0.1 -u root --password=$MYSQL_ROOT_PASSWORD
+            failureThreshold: 60
+            periodSeconds: 5
+            timeoutSeconds: 10
+          name: ecolyo-agent-database
+          ports:
+            - containerPort: 3306
+          resources: {}
+          
+      restartPolicy: Always
+      
+status: {}
diff --git a/k8s/deployments/ecolyo-agent-meilisearch-deployment.yml b/k8s/deployments/ecolyo-agent-meilisearch-deployment.yml
new file mode 100644
index 0000000..7647963
--- /dev/null
+++ b/k8s/deployments/ecolyo-agent-meilisearch-deployment.yml
@@ -0,0 +1,58 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.1 (a9d05d509)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: ecolyo-agent-meilisearch
+  name: ecolyo-agent-meilisearch
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: ecolyo-agent-meilisearch
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.1 (a9d05d509)
+      creationTimestamp: null
+      labels:
+        io.kompose.network/ecolyo-agent-network: "true"
+        io.kompose.service: ecolyo-agent-meilisearch
+    spec:
+      containers:
+        - env:
+            - name: MEILI_MASTER_KEY
+              valueFrom:
+                secretKeyRef:
+                  name: meilisearch
+                  key: master-key
+          image: getmeili/meilisearch:v0.28.1
+          livenessProbe:
+            exec:
+              command:
+                - curl
+                - -f
+                - http://0.0.0.0:7700
+            failureThreshold: 3
+            periodSeconds: 10
+            timeoutSeconds: 10
+          name: ecolyo-agent-meilisearch
+          ports:
+            - containerPort: 7700
+          resources: {}
+          volumeMounts:
+            - mountPath: /meili_data
+              name: pvc-1-ns-selfdata-d01-syn-claim
+      restartPolicy: Always
+      volumes:
+        - name: pvc-1-ns-selfdata-d01-syn-claim
+          persistentVolumeClaim:
+            claimName: pvc-1-ns-selfdata-d01-syn-claim
+     
+status: {}
diff --git a/k8s/deployments/ecolyo-agent-server-deployment.yml b/k8s/deployments/ecolyo-agent-server-deployment.yml
new file mode 100644
index 0000000..69a11be
--- /dev/null
+++ b/k8s/deployments/ecolyo-agent-server-deployment.yml
@@ -0,0 +1,89 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    kompose.cmd: kompose convert
+    kompose.version: 1.26.1 (a9d05d509)
+  creationTimestamp: null
+  labels:
+    io.kompose.service: ecolyo-agent-server
+  name: ecolyo-agent-server
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      io.kompose.service: ecolyo-agent-server
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      annotations:
+        kompose.cmd: kompose convert
+        kompose.version: 1.26.1 (a9d05d509)
+      creationTimestamp: null
+      labels:
+        io.kompose.network/ecolyo-agent-network: "true"
+        io.kompose.service: ecolyo-agent-server
+    spec:
+      volumes:
+        - name: pvc-2-ns-selfdata-d01-syn-claim
+          persistentVolumeClaim:
+            claimName: pvc-2-ns-selfdata-d01-syn-claim
+      containers:
+        - env:
+          - name: ADMIN_ROLE
+          - name: AUTH_URL
+          - name: CLIENT_ID
+          - name: CLIENT_SECRET
+          - name: HOSTNAME
+          - name: DEBUG_MODE
+          - name: HTTPS_PORT
+          - name: IMAGE_FOLDER
+          - name: MOCK_OAUTH2
+          - name: REDIRECT_URL
+          - name: TOKEN_URL
+          - name: USERINFO_URL
+          - name: MEILI_HOST
+            value: 'http://ecolyo-agent-meilisearch-service:7700'
+          - name: DATABASE_HOST
+            valueFrom:
+              secretKeyRef:
+                name: ecolyo-agent-database
+                key: host
+          - name: DATABASE_NAME
+            valueFrom:
+              secretKeyRef:
+                name: ecolyo-agent-database
+                key: name
+          - name: DATABASE_USER
+            value: root
+          - name: DATABASE_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: ecolyo-agent-database
+                key: password
+          - name: SGE_API_TOKEN
+          valueFrom:
+              secretKeyRef:
+                name: sge-api
+                key: token
+          - name: MEILI_MASTER_KEY
+            valueFrom:
+              secretKeyRef:
+                name: meilisearch
+                key: master-key
+          image: registry.forge.grandlyon.com/web-et-numerique/llle_project/backoffice-server:master
+          imagePullPolicy: Always
+          volumeMounts:
+            - name: pvc-2-ns-selfdata-d01-syn-claim
+              mountPath: /app/mnt
+          name: ecolyo-agent-server
+          ports:
+            - containerPort: 1443
+            - containerPort: 8090
+          resources: {}    
+      imagePullSecrets:
+        - name: llle-project
+      restartPolicy: Always
+
+status: {}
diff --git a/k8s/secrets/ecolyo-agent-database.yml b/k8s/secrets/ecolyo-agent-database.yml
new file mode 100644
index 0000000..6f301e3
--- /dev/null
+++ b/k8s/secrets/ecolyo-agent-database.yml
@@ -0,0 +1,10 @@
+kind: Secret
+apiVersion: v1
+metadata:
+  name: ecolyo-agent-database
+  namespace: ns-selfdata-d01-syn
+stringData:
+  host: DATABASE_HOST
+  name: DATABASE_NAME
+  password: DATABASE_PASSWORD
+type: Opaque
\ No newline at end of file
diff --git a/k8s/secrets/meilisearch.yml b/k8s/secrets/meilisearch.yml
new file mode 100644
index 0000000..d81a096
--- /dev/null
+++ b/k8s/secrets/meilisearch.yml
@@ -0,0 +1,8 @@
+kind: Secret
+apiVersion: v1
+metadata:
+  name: meilisearch
+  namespace: ns-selfdata-d01-syn
+stringData:
+  master-key: MASTER_KEY
+type: Opaque
\ No newline at end of file
diff --git a/k8s/secrets/sge-api.yml b/k8s/secrets/sge-api.yml
new file mode 100644
index 0000000..6383ea0
--- /dev/null
+++ b/k8s/secrets/sge-api.yml
@@ -0,0 +1,8 @@
+kind: Secret
+apiVersion: v1
+metadata:
+  name: sge-api
+  namespace: ns-selfdata-d01-syn
+stringData:
+  token: YOUR_TOKEN
+type: Opaque
\ No newline at end of file
diff --git a/k8s/services/backend.yml b/k8s/services/backend.yml
new file mode 100644
index 0000000..286c941
--- /dev/null
+++ b/k8s/services/backend.yml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: backend
+  namespace: ns-selfdata-d01-syn
+spec:
+  selector:
+    io.kompose.service: ecolyo-agent-server
+  ports:
+    - protocol: TCP
+      port: 1443
+      targetPort: 1443
+    - protocol: TCP
+      port: 8090
+      targetPort: 8090
\ No newline at end of file
diff --git a/k8s/services/ecolyo-agent-client-service.yml b/k8s/services/ecolyo-agent-client-service.yml
new file mode 100644
index 0000000..4cdd3af
--- /dev/null
+++ b/k8s/services/ecolyo-agent-client-service.yml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: ecolyo-agent-client-service
+  namespace: ns-selfdata-d01-syn
+spec:
+  selector:
+    io.kompose.service: ecolyo-agent-client
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: 8080
\ No newline at end of file
diff --git a/k8s/services/ecolyo-agent-database-service.yml b/k8s/services/ecolyo-agent-database-service.yml
new file mode 100644
index 0000000..feb977d
--- /dev/null
+++ b/k8s/services/ecolyo-agent-database-service.yml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: ecolyo-agent-database-service
+  namespace: ns-selfdata-d01-syn
+spec:
+  selector:
+    io.kompose.service: ecolyo-agent-database
+  ports:
+    - protocol: TCP
+      port: 3306
+      targetPort: 3306
\ No newline at end of file
diff --git a/k8s/services/ecolyo-agent-meilisearch-service.yml b/k8s/services/ecolyo-agent-meilisearch-service.yml
new file mode 100644
index 0000000..2f2afd5
--- /dev/null
+++ b/k8s/services/ecolyo-agent-meilisearch-service.yml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: ecolyo-agent-meilisearch-service
+  namespace: ns-selfdata-d01-syn
+spec:
+  selector:
+    io.kompose.service: ecolyo-agent-meilisearch
+  ports:
+    - protocol: TCP
+      port: 7700
+      targetPort: 7700
\ No newline at end of file
diff --git a/main.go b/main.go
index 560052b..bbc7735 100644
--- a/main.go
+++ b/main.go
@@ -24,7 +24,7 @@ func main() {
 	log.Println("--- Server is starting ---")
 
 	// Initializations
-	tokens.Init("./configs/tokenskey.json", debugMode)
+	tokens.Init("./mnt/configs/tokenskey.json", debugMode)
 
 	// Create the server
 	rootMux := rootmux.CreateRootMux()
diff --git a/configs/tokenskey.json b/mnt/configs/tokenskey.json
similarity index 100%
rename from configs/tokenskey.json
rename to mnt/configs/tokenskey.json
-- 
GitLab