# Forgeception: déployer la forge INRAE avec elle-même

Estelle Ancelet, Christian Poirier, Sylvain Lanoë, Guillaume Perréal, Raphaël Flores, Michel Candido

## ► To cite this version:

Estelle Ancelet, Christian Poirier, Sylvain Lanoë, Guillaume Perréal, Raphaël Flores, et al. Forgeception: déployer la forge INRAE avec elle-même. Wébinaire HackESR "la défense en profondeur", HackESR (Thomas Lallart); ANSSI, Jun 2025, Wébinaire, France. hal-05383195

HAL Id: hal-05383195

https://hal.inrae.fr/hal-05383195v1

Submitted on 26 Nov 2025

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
# Forgeception : déployer la forge INRAE avec elle-même

Comment GitLab CI/CD pilote l'installation et la configuration de sa propre instance

Wébinaire défense en profondeur - 27 juin 2025
Cartographie de l'infrastructure

<figure><img src="image_2.png" /></figure>
# Infrastructure

## Les environnements

### Développement :

- VMs multipass

- Minio (s3)

- Chaque développeur peut tester son travail (sans perturber les autres)

- /!\ consommateur de ressources

<figure><img src="image_3.png" /></figure>

MINIO

### Recette :

- Openstack

- S3 : CEPH

- BDD managée

- Intégration des travaux (branche main)

### Preprod et Prod :

- VM managées

- S3 : CEPH + StorageGRID

- BDD managée

<figure><img src="image_4.png" /></figure>

<figure><img src="image_5.png" /></figure>

<figure><img src="image_6.png" /></figure>

PostgreSQL

<figure><img src="image_7.png" /></figure>

<figure><img src="image_8.png" /></figure>

<figure><img src="image_9.png" /></figure>

DSI

<figure><img src="image_10.png" /></figure>

INRAO
## Dépôt git

Projet Gitlab centralisant tous les travaux

<figure><img src="image_11.png" /></figure>

<figure><img src="image_12.png" /></figure>

ANSIBLE

Playbooks + scripts

Secrets chiffrés avec Ansible Vault

Doc technique du projet

<figure><img src="image_13.png" /></figure>

Docusaurus

Template heat (construction infra recette)

<figure><img src="image_14.png" /></figure>

CI+CD

Pre-commit Hooks = contrôles avant commit (notamment sécurité)

<figure><img src="image_15.png" /></figure>

Makefile (construction env de dev, provision & déploiement depuis le poste admin, lint, construction doc, etc.)

pyproject.toml

Gestion des dépendances Python

<figure><img src="image_16.png" /></figure>

python™

<figure><img src="image_17.png" /></figure>

PDM

p.4
<figure><img src="image_18.png" /></figure>

Liste des tâches du projet = issues Gitlab

<figure><img src="image_19.png" /></figure>
> Cadre agile

Sprints

<figure><img src="image_20.png" /></figure>

<figure><img src="image_21.png" /></figure>
## Flux de développement git

~ GitHub Flow

$$1 \text{ fonctionnalité} = 1 \text{ branche} \\ \text{Fusion sur la branche main via Merge Request (MR)}$$

<figure><img src="image_22.png" /></figure>
CI/CD

2

Commits de fusion sur branche principale

Lint

Déploiement sur la recette

Dry-run sur la preprod

Maj documentation

main

fonct. 1

fonct. 1

3

Tag git sur la branche principale

Lint

Déploiement sur la preprod

Dry-run sur la prod

v1.

Déclenchement manuel

Déploiement en prod

Si les tests précédents sont passés

4

Commits sur les branches de fonctionnalité

1

Lint

Dry-run sur la recette

Déploiement documentation sur environnement gitlab de test

<figure><img src="image_23.png" /></figure>
# Documentation technique

## Site Pages Gitlab

<figure><img src="image_24.png" /></figure>
> Pipeline de test quotidien

<figure><img src="image_25.png" /></figure>

Froggit /

<figure><img src="image_26.png" /></figure>

GitLab and Froggit tools /

<figure><img src="image_27.png" /></figure>

My GitLab Check Instance

<figure><img src="image_28.png" /></figure>

My GitLab Check Instance

<figure><img src="image_29.png" /></figure>

main

<figure><img src="image_30.png" /></figure>

mgci

Pipeline

Jobs 27

Tests 0

<figure><img src="image_31.png" /></figure>

artisans DevOps

<figure><img src="image_32.png" /></figure>

CI+CD

start

<figure><img src="image_33.png" /></figure>

info:configuration

<figure><img src="image_34.png" /></figure>

<figure><img src="image_35.png" /></figure>

packages:version

<figure><img src="image_36.png" /></figure>

build

<figure><img src="image_37.png" /></figure>

registry:container:build

<figure><img src="image_38.png" /></figure>

<figure><img src="image_39.png" /></figure>

registry:generic:build

<figure><img src="image_40.png" /></figure>

test

<figure><img src="image_41.png" /></figure>

api:issue

<figure><img src="image_42.png" /></figure>

<figure><img src="image_43.png" /></figure>

dependency_proxy:container

<figure><img src="image_44.png" /></figure>

<figure><img src="image_45.png" /></figure>

mattermost:healthcheck

<figure><img src="image_46.png" /></figure>

<figure><img src="image_47.png" /></figure>

parallel:long

5

<figure><img src="image_48.png" /></figure>

parallel:short

5

<figure><img src="image_49.png" /></figure>

<figure><img src="image_50.png" /></figure>

adminforgemia /

<figure><img src="image_51.png" /></figure>

My GitLab Check Instance /

Schedules

All

1

Active

Inactive

<table><thead><tr><th>Description</th><th>Interval</th><th>Target</th><th>Last Pipeline</th></tr></thead><tbody><tr><td>Scheduled check</td><td>42 17 8<br>**<br>Europe/ Paris</td><td>main</td><td>Passed</td></tr></tbody></table>

delivery

<figure><img src="image_52.png" /></figure>

release

<figure><img src="image_53.png" /></figure>

<figure><img src="image_54.png" /></figure>

release:container

<figure><img src="image_55.png" /></figure>

clean

<figure><img src="image_56.png" /></figure>

purge:releases

<figure><img src="image_57.png" /></figure>

<figure><img src="image_58.png" /></figure>

purge:taqs

<figure><img src="image_59.png" /></figure>

<figure><img src="image_60.png" /></figure>

registry:container:purge

<figure><img src="image_61.png" /></figure>

<figure><img src="image_62.png" /></figure>

registry:purge

<figure><img src="image_63.png" /></figure>

report

<figure><img src="image_64.png" /></figure>

info:report

<figure><img src="image_65.png" /></figure>
> Projet forge INRAE

Et la sécurité ?

- Usage de Passbolt pour les secrets partagés

- Secrets chiffrés dans le code d'infrastructure avec ansible-vault (vérifié par commit hook)

- Sauvegardes : règle du 3-2-1 (non accessibles par les serveurs de prod)

- Sauvegardes localisées hors réseau Inrae chiffrées

- Branche principale protégée : seules quelques personnes ont le droit de merger

- Administrateurs et développeurs doivent activer la 2FA sur leur compte forge INRAE

- Mise à jour mensuelle OS/Gitlab + mise à jour de sécurité au fil de l'eau

- Le recours à Ansible permet de corriger tout écart de configuration (en cas de modification malveillante)

- Le déploiement automatique se fait via un runner dédié

- Tous les déploiements sont enregistrés dans ARA

- Sauf diagnostic et dépannage, pas d'opération manuelle sur les serveurs

- Mais si besoin, accès aux serveurs en ssh via un bastion où les actions sont enregistrées

- ...

--> référencé dans l'homologation SSI

<figure><img src="image_66.png" /></figure>
> **Projet forge INRAE**

Quelques perspectives

Appropriation de ce **nouveau paradigme de déploiement** par l'équipe.

**Collaborations avec la Fédération de forges de l'ESR.**

**Usine logicielle INRAE (SonarQube et autres outils complémentaires)**

- Mise en place et maintenance à discuter

- Lien avec SAPI DevSecOps@INRAE

**Audit de sécurité.**

<figure><img src="image_67.png" /></figure>