Update complet du Readme avec procédure de déploiement.

Modification du init.db afin qu'il corresponde à la base en l'état actuel en préproduction.
Update du docker-compose pour faciliter la gestion du back.
Suppression des fichiers yaml liés au Kubernetes, étant outdated et n'étant plus d'aucune utilité.
pull/1/head
Clement FERRERE 2 years ago
parent c70d4c8e94
commit 938d05628a
  1. 173
      README.md
  2. 55
      api-deployment.yaml
  3. 13
      api-ingress-route.yaml
  4. 16
      api-service.yaml
  5. 8
      db-config.yaml
  6. 56
      db-deployment.yaml
  7. 9
      db-secret.yaml
  8. 14
      db-service.yaml
  9. 12
      db-volume.yaml
  10. 66
      db/init_db.sql
  11. 6
      docker-compose.yml
  12. 32
      front-deployment.yaml
  13. 13
      front-ingress-route.yaml
  14. 12
      front-service.yaml

@ -1,3 +1,172 @@
# Collaborateur_Epa_Compose_Doc
# Application Collaborateur-EPA
Regroupe la documentation ainsi que les fichiers communs du projet collaborateur-EPA, notamment le docker-compose.
**Ce git contient la documentation de l'application Collaborateur-EPA de l'agence Tours-Orléans-Poitiers d'Apside. Il
contient également le docker-compose permettant de rapidement build le front et le back, ainsi que le script permettant
d'initialiser la base de données.**
## Mise en préproduction
Cette documentation contient les informations nécessaires pour déployer le front et le back de l'application
Collaborateur-EPA.
Assurez-vous d'avoir bien cloné les 3 repositories du Git à la racine d'un dossier commun.Vous devez donc avoir un
dossier racine contenant ces dossiers :
- Collaborateur_Epa_Compose_Doc
- Collaborateur-Epa-Back
- Collaborateur-Epa-Front
:warning: **Il est très important de respecter le nommage ci-dessus, car docker-compose va naviguer entre vos fichiers
afin de build l'application. Si vos dossiers ne respectent pas ce nommage, docker-compose ne pourra pas build les image
sans être modifié** :warning:
Avant de commencer le déploiement, nous allons vérifiez que les routes utilisées dans l'application front sont bien
celles de la préproduction, et que le back utilise bien la base de données de la préproduction.
Ensuite, nous verrons comment accéder à la base données. Enfin, vous verrez la procédure pour build, push et déployer
votre nouvelle version sur la préproduction d'Apside.
## Vérification des configurations
Il y a plusieurs façons de savoir si le front et bien lié au back de la préproduction :
- si les données que vous récupérez sont identiques à la préproduction,
- si les routes dans les services de l'application sont bien celles de la préproduction,
- l'application doit pouvoir démarrer sans avoir un back local en route.
Il est possible de voir si le back est lié à la BDD de préproduction en vérifiant le fichier appsettings.json. Dans ce
fichier, il y aura 2 lignes "ConnectionString", dont 1 commentée. A la fin de chaque ligne, vous verrez un commentaire
indiquant à quoi correspond celle-ci. Pour build en préproduction, dé-commentez la ligne de la préproduction et
commentez celle du déploiement local.
Les images des applications front et back sont maintenant prêtes à être build.
## Changements dans la base de données (optionnel)
Avant de déployer une nouvelle version, il faut effectuer les changements **si nécessaire** dans la base de données de
la préproduction. L'accès à la base de données se fait sur Rancher, dans le cluster "Collaborateur-EPA", dans le
conteneur "database" du namespace "dev-collaborateur-epa" à l'aide de l'option "Execute Shell". Ensuite, la connection à
MySQL se fait avec :
```
mysql -uroot -proot collaborateur_epa
```
"collaborateur_epa" étant la base de données utilisée, il n'est pas obligatoire de l'ajouter à la commande, vous pouvez
choisir cette base dans un second temps.
Il ne vous reste plus qu'à faire les modifications souhaitées afin que cette base corresponde à la nouvelle version.
Passons maintenant au build des images front et back
## Build les images
Vous l'avez compris, nous utiliserons docker et surtout docker-compose dans la phase de build. Ceci est très fortement
recommandé, car divers problèmes auront lieu si vous tentez de build les images sans docker-compose, notamment pour
l'image du back.
À partir d'un terminal, rendez-vous dans le dossier "Collaborateur_Epa_Compose_Doc". Lancez ensuite la commande :
```docker-compose up --build```
Les images vont se build et vont se lancer selon la configuration du docker-compose. Vous pouvez bien entendu tester les
applications lancées individuellement, mais elles sont normalement configurées pour fonctionner avec la préproduction.
Maintenant, couper les conteneurs (ctrl+c dans le terminal), une fois fait, entrez la commande :
```docker-compose down```
Ceci détruira les conteneurs afin de vous éviter une surconsommation de ressource inutile, puisque nous nous intéressons
ici aux images, pas aux conteneurs.
Nous allons voir comment push vos images sur le registry d'Apside, Harbor.
## Push les images
### Authentification sur Harbor
:warning: Votre compte devra être autorisé sur le projet "collaborateur-epa" avant de pouvoir vous y connecter.
Renseignez-vous auprès de la DSI et des responsables du projet pour obtenir les accès.:warning:
Afin de vous authentifier à Harbor, entrez la commande suivante :
```
docker login harbor.apsdigit.lan
```
Vous devrez ensuite entrer vos identifiants apsdigit (première lettre du prénom suivi du nom de famille en général),
puis votre mot de passe apsdigit correspondant. Pour rappel, il s'agit généralement du même mot de passe que celui de
votre poste.
### Publication sur Harbor
[Lien vers Harbor](https://harbor.apsdigit.lan/harbor/projects)
Une fois authentifié, vous pouvez uploadez vos images sur Harbor en entrant la commande suivante :
*Image Front*
```
docker push harbor.apsdigit.lan/collaborateur-epa/preprod/front:beta
```
*Image Back*
```
docker push harbor.apsdigit.lan/collaborateur-epa/preprod/api:beta
```
Si vous souhaitez changer le tag des images (ici "beta"), assurez-vous de le faire dans le docker-compose, et de le
faire également lors du push des images, vous aurez sinon des erreurs.
Si une erreur d'authentification vous est retournée, assurez-vous que vos credentials ne soient pas expirés en
réeffectuant l'étape d'authentification expliquée plus tôt.
Maintenant que les images sont sur Harbor, nous devons indiquer au namespace Kubernetes d'utiliser cette image.
:warning: Sur Harbor il est possible de vérifier les vulnérabilités de chaque image du repository. Il est fortement
recommandé de ne déployer sur Kubernetes que des versions dont les vulnérabilités ont été reparées au maximum possible.
Il s'agit souvent de mises à jour de dépendances des packages utilisés par les applications.:warning:
## Déploiement Kurbernetes sur Rancher
[Lien vers le cluster Kubernetes sur Rancher](https://rancher.apsdigit.lan/p/c-cxs28:p-f7tpc/workloads)
[Lien vers la préproduction](https://collaborateur-epa.apsdigit.lan/)
Il y a deux cas à différencier sur Kubernetes lorsque l'on veut déployer une nouvelle version de l'application.
Placez-vous dans Rancher dans le cluster Collaborateur-EPA pour suivre la procédure suivante.
### Cas 1 : Tags identiques
Si les tags de vos images sont identiques, alors la manipulation est si simple qu'on a pas besoin d'utiliser notre
cerveau, la moelle épinière suffit !
- Cliquez sur les 3 petits points verticaux sur la ligne de l'application que vous voulez mettre à jour,
- Cliquez sur "Redeploy",
- C'est terminé, attendez quelques minutes, puis rafraichissez le site dans votre navigateur pour vérifier que tout
s'est bien passé.
### Cas 2 : Tags différents
Si les tags de vos images sont différents, alors la manipulation est à peine plus complexe :
- Cliquez sur les 3 petits points verticaux sur la ligne de l'application que vous voulez mettre à jour,
- Cliquez sur "Edit",
- Dans le champs de texte sous "Docker Image" modifiez le tag pour qu'il corresponde à celui de votre image,
- En bas de la page cliquez sur le bouton "Save",
- C'est terminé, attendez quelques minutes, puis rafraichissez le site dans votre navigateur pour vérifier que tout
s'est bien passé.
Pour rappel, le tag d'une image docker est la partie **après** les ":" .
Il n'est pas recommandé de modifier le nom complet de l'image, puisque tout est déjà configuré pour fonctionner tel
quel. Le tag peut être modifié pour indiquer différentes versions, et peut s'avérer utile en cas d'audit ou de
déploiement versionné.
A l'instant où votre manipulation est terminée, vous devriez voir deux pods sur le conteneur que vous avez mis à jour,
un en cours de fermeture (removing) et un en déploiement. Kubernetes gère automatiquement les redéploiements afin que le
service ne soit pas ou peu interrompu. Par exemple, si le front n'arrive pas à compiler sur votre nouvelle version, le
conteneur gardera l'ancienne version et vous pourrez accéder aux logs du pod n'ayant pas réussi à se lancer afin
d'identifier le problème.
En cas de problème avec Rancher ou Harbor, vous pouvez contacter la DSI d'Apside afin d'obtenir de l'aide.

@ -1,55 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: espacecollabbackendapi
imagePullPolicy: Always
tty: true
resources:
limits:
memory: "512Mi"
cpu: "500m"
ports:
- containerPort: 80
- containerPort: 443
env:
- name: DATABASE_HOSTNAME
valueFrom:
configMapKeyRef:
name: db-config
key: hostname
- name: DATABASE_PORT
valueFrom:
configMapKeyRef:
name: db-config
key: port
- name: DATABASE_NAME
valueFrom:
configMapKeyRef:
name: db-config
key: name
- name: DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

@ -1,13 +0,0 @@
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api-http
spec:
entryPoints:
- web
routes:
- match: Host(`localhost`) && PathPrefix(`/api`)
kind: Rule
services:
- name: back
port: 80

@ -1,16 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: api
spec:
ports:
- name: api1
port: 5000
targetPort: 80
- name: api2
port: 5001
targetPort: 443
selector:
app: api
status:
loadBalancer: {}

@ -1,8 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: database-config
data:
hostname: db
port: "3306"
name: collaborateur_epa

@ -1,56 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: db
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
volumes:
- name: db
persistentVolumeClaim:
claimName: mysql-pv-claim
containers:
- name: db
image: mariadb:10.7.1
imagePullPolicy: Always
tty: true
resources:
limits:
memory: "512Mi"
cpu: "500m"
ports:
- name: mariadb
containerPort: 3306
volumeMounts:
- name: db
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: database-secret
key: root-password
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: db-config
key: name
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

@ -1,9 +0,0 @@
apiVersion: v1
kind: Secret
metadata:
name: database-secret
type: Opaque
stringData:
username: epa-dev
password: dev-epa
root-password: root

@ -1,14 +0,0 @@
apiVersion: v1
kind: Service
metadata:
labels:
app: db
name: db
spec:
ports:
- name: mariadb
port: 3307
targetPort: 3306
selector:
app: db
type: ClusterIP

@ -1,12 +0,0 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: db
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

@ -1,20 +1,23 @@
SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET @OLD_SQL_MODE = @@SQL_MODE, SQL_MODE =
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
DROP DATABASE IF EXISTS collaborateur_epa;
CREATE DATABASE IF NOT EXISTS collaborateur_epa /*!40100 DEFAULT CHARACTER SET latin1 */;
USE collaborateur_epa;
DROP TABLE IF EXISTS businessunit;
CREATE TABLE IF NOT EXISTS businessunit(
CREATE TABLE IF NOT EXISTS businessunit
(
Id int NOT NULL AUTO_INCREMENT,
Name varchar(100) NOT NULL UNIQUE,
PRIMARY KEY (Id)
);
DROP TABLE IF EXISTS agence;
CREATE TABLE IF NOT EXISTS agence(
CREATE TABLE IF NOT EXISTS agence
(
Id int NOT NULL AUTO_INCREMENT,
Name varchar(100) NOT NULL UNIQUE,
BusinessUnitId int NOT NULL,
@ -23,7 +26,8 @@ CREATE TABLE IF NOT EXISTS agence(
);
DROP TABLE IF EXISTS collaborateur;
CREATE TABLE IF NOT EXISTS collaborateur(
CREATE TABLE IF NOT EXISTS collaborateur
(
Id int NOT NULL AUTO_INCREMENT,
Name varchar(100) NOT NULL,
FirstName varchar(100) NOT NULL,
@ -35,20 +39,60 @@ CREATE TABLE IF NOT EXISTS collaborateur(
Telephone varchar(15) NOT NULL,
PersonalMail varchar(100) NOT NULL,
ApsideMail varchar(100) NOT NULL UNIQUE,
ResignationDate date NOT NULL,
ResignationDate date,
businessunitId int NOT NUll,
ReferrerId int NOT NULL,
CONSTRAINT FK_COLLABORATEUR_BUSINESSUNIT FOREIGN KEY (businessunitId) REFERENCES businessunit (Id),
CONSTRAINT FK_COLLABORATEUR_PARRAIN FOREIGN KEY (ReferrerId) REFERENCES collaborateur(Id),
PRIMARY KEY (Id)
);
DROP TABLE IF EXISTS referencement;
CREATE TABLE IF NOT EXISTS referencement
(
Id int NOT NULL AUTO_INCREMENT,
StartingDate date NOT NULL,
EndingDate date,
ReferredId int NOT NULL,
ReferrerId int NOT NULL,
CONSTRAINT FK_REFERENCEMENT_REFERRED FOREIGN KEY (ReferredId) REFERENCES collaborateur (Id),
CONSTRAINT FK_REFERENCEMENT_REFERRER FOREIGN KEY (ReferrerId) REFERENCES collaborateur (Id),
PRIMARY KEY (Id)
);
DROP TABLE IF EXISTS periodeessai;
CREATE TABLE IF NOT EXISTS `periodeessai`
(
`Id` int(11) NOT NULL AUTO_INCREMENT,
`StartingDate` date NOT NULL,
`PlannedEndingDate` date NOT NULL,
`RealEndingDate` date,
`Comment` varchar(100),
`Issue` enum ('VALIDEE','PROLONGEE_COLLAB','PROLONGEE_APSIDE','ARRETEE_COLLAB','ARRETEE_APSIDE','INDETERMINEE'),
`CollaborateurId` int(11) NOT NULL,
PRIMARY KEY (`Id`),
KEY `FK_COLLABORATEUR_PERIODEESSAI` (`CollaborateurId`),
CONSTRAINT `FK_COLLABORATEUR_PERIODEESSAI` FOREIGN KEY (`CollaborateurId`) REFERENCES `collaborateur` (`Id`)
);
INSERT INTO businessunit(Name)
VALUES ('Business Unit Clermont-Ferrand');
INSERT INTO agence(Name, BusinessUnitId)
VALUES ('Cournon', 1);
INSERT INTO businessunit(Name)
VALUES ('Business Unit TOP');
INSERT INTO agence(Name, BusinessUnitId)
VALUES ('Tours', 2);
INSERT INTO businessunit(Id, Name) VALUES (1,'Business Unit Clermont-Ferrand');
INSERT INTO agence(Id, Name, BusinessUnitId) VALUES (1,'Cournon',1);
INSERT INTO collaborateur(Name, FirstName, BirthDate, Gender, Status, ChildrenNumber, Address, Telephone, PersonalMail,
ApsideMail, ResignationDate, businessunitId, ReferrerId)
VALUES ('Dupont','Marie','1990-08-08','feminin','cadre',0,'adresse','tel','pmail','amail','2030-08-08',1,1);
ApsideMail, ResignationDate, businessunitId)
VALUES ('RUIZ', 'Alexandre', '1990-07-07', 'masculin', 'cadre', 0, 'adresse', 'tel', 'alexandre.ruiz@gmail.com', 'alexandre.ruiz@apside-groupe.com', null, 1),
('FERRERE', 'Clément', '2000-08-30', 'masculin', 'noncadre', 0, 'adresse', 'tel', 'clement.ferrere@gmail.com',
'clement.ferrere@apside-groupe.com', null, 1);
INSERT INTO referencement(StartingDate, EndingDate, ReferredId, ReferrerId)
VALUES ('2021-08-09', null, 1, 2);
SET SQL_MODE = @OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS;

@ -5,7 +5,7 @@ volumes:
services:
db:
database:
image: "mariadb:10.7.1"
restart: always
ports:
@ -28,9 +28,9 @@ services:
- "5000:80"
- "5001:443"
links:
- db
- database
environment:
- DATABASE_HOSTNAME=db
- DATABASE_HOSTNAME=database
- DATABASE_PORT=3307
- DATABASE_NAME=${DATABASE_NAME}
- DATABASE_USERNAME=${APP_DB_USERNAME}

@ -1,32 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: front
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: front
template:
metadata:
labels:
app: front
spec:
containers:
- image: collab-front
name: front
imagePullPolicy: Always
tty: true
resources:
limits:
memory: "256Mi"
cpu: "500m"
ports:
- name: web
containerPort: 80
env:
- name: BASE_URL
value: http://localhost/api/
- name: LOGOUT_URL
value: http://localhost

@ -1,13 +0,0 @@
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: front-http
spec:
entryPoints:
- web
routes:
- match: Host(`localhost`)
kind: Rule
services:
- name: front
port: 80

@ -1,12 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: front
spec:
selector:
app: front
ports:
- name: web
port: 8083
targetPort: 80
type: ClusterIP
Loading…
Cancel
Save