This commit is contained in:
2026-09-29 10:55:01 +02:00
parent 9799e04c01
commit f8609b30e9
34 changed files with 603 additions and 429 deletions
+15
View File
@@ -0,0 +1,15 @@
# Migration
Cette archive est une refonte du contenu et du rendu Hugo.
À conserver depuis le dépôt existant avant remplacement :
- `.drone.yml`
- `Dockerfile`
- `docker-compose.yml`
- `nginx-proxy/`
- les secrets CI/CD (ne jamais les mettre dans Git)
- les assets/images utiles dans `static/images/`
Le nouveau `config.toml`, `content/`, `layouts/` et `assets/` sont prêts à remplacer les équivalents existants.
Les anciens projets VR/jeu vidéo peuvent être conservés dans une branche ou déplacés vers une section d'archive si tu souhaites garder l'historique.
+44 -206
View File
@@ -1,223 +1,61 @@
# ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&width=435&height=70&lines=HUGO-SITE) # gregandev.fr — Portfolio DevOps / SRE
[![Build Status](https://drone.gregandev.fr/api/badges/gregandev/hugo-site/status.svg)](https://drone.gregandev.fr/gregandev/hugo-site) Portfolio professionnel de Grégory Lebreton, construit avec Hugo.
## INSTALLATION :hammer: ## Positionnement
- Via APT: Le site est volontairement orienté :
```bash
sudo apt install hugo - Infrastructure Linux
- Automation / Infrastructure as Code
- CI/CD
- Docker / Kubernetes
- Observability
- Reliability / backup / PRA
- Documentation et transmission
## Architecture
Le thème Silhouette a été remplacé par des layouts Hugo locaux afin de maîtriser complètement le rendu et d'éviter qu'un thème générique de portfolio ne domine le positionnement technique.
```text
content/
├── experience/
├── projects/
├── lab/
├── stack/
├── notes/
└── about/
layouts/
├── _default/
├── partials/
├── projects/
├── experience/
├── lab/
└── notes/
assets/
├── css/
└── js/
``` ```
- Via la ligne de commande: ## Développement local
```bash
cd /tmp
curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest \
| grep browser_download_url \
| grep linux-amd64.deb \
| grep extended \
| cut -d '"' -f 4 \
| wget -i -
sudo dpkg -i hugo*_linux-amd64.deb
rm -rf hugo*_linux-amd64.deb
```
## UTILISATION
### CREATION DU SITE :page_with_curl:
- Vérifier l'installation:
```bash
hugo version
```
- Créer la structure du site:
```bash
hugo new site mon-site
```
- Créer du contenu:
```bash
cd mon-site
hugo new posts/mon-post.md
nano posts/mon-post.md
```
Ajouter des medias:
- images:
```bash
## Image via link:
![](https://pbs.twimg.com/media/DGKRMoPXcAIyA8y.jpg)
------
## Image via url locale (/static):
![](/images/test/1.png)
```
- videos:
```bash
## Vidéo Youtube:
{{< youtube ZSWzPI4BqvA >}}
```
### AJOUT D'UN THEME :art:
```bash ```bash
git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
echo theme = \"ananke\" >> config.toml
```
Les thèmes HUGO:
- https://jamstackthemes.dev/ssg/hugo/
- https://hugothemesfree.com/
- https://master--hugothemes.netlify.app/
### CONFIGURATION DU CONFIG.TOML :wrench:
- Configuration de base
```bash
# Configuration de l'adresse, titre (onglet) et des chemins vers les contenus
baseurl = "/"
contentdir = "content"
layoutdir = "layouts"
publishdir = "public"
title = "Mon super site!!!"
canonifyurls = true
# ACCUEIL
[Params]
subtitle = "Portfolio made in HUGO !"
logo = "img/logo2.png"
favicon = "img/favicon.ico"
dateFormat = "January 2, 2006"
commit = false
rss = false
comments = true
```
- Création d'un menu
```bash
[[menu.main]]
name = "Post 1"
url = "/post/post1"
weight = 1
[[menu.main]]
name = "A propos"
url = "/page/about"
weight = 2
[[menu.main]]
name = "Projets"
url = "/page/about"
weight = 3
```
- Création d'un sous menu
```bash
[[menu.main]]
parent = "Projets"
name = "Projet 1"
url = "/projets/projet1"
weight = 1
[[menu.main]]
parent = "Projets"
name = "Projet 2"
url = "/projets/projet2"
weight = 2
```
:warning: Créer les dossiers et les fichiers correspondant. Les urls ne prennent pas l'extension .md du fichier
- Création des icônes reseaux sociaux
```bash
[Author]
name = ""
email = ""
gitlab = ""
github = ""
twitter = ""
reddit = ""
linkedin = ""
```
### LANCER LE SERVEUR :rocket:
```bash
# L'option -D est pour servir les fichiers en Draft = true (non publiés)
hugo server -D hugo server -D
``` ```
> Visiter http://localhost:1313 Build de production :
### BUILDER LE SITE :construction:
```bash ```bash
hugo hugo --minify
``` ```
> Les fichiers générés sont dans le dossier public ## CI/CD
## DEPLOIEMENT :checkered_flag: Le dépôt historique utilise Drone CI pour construire et déployer le site. Cette refonte conserve volontairement cette approche : le portfolio peut ainsi démontrer une chaîne Git → CI → build Hugo → déploiement.
### VIA GITLAB AUTO DEVOPS ## Important
Compléter le config.toml comme ceci: Les projets et expériences sont à compléter avec les réalisations réelles, métriques et liens disponibles. Les sections de lab servent à distinguer les expérimentations personnelles des expériences professionnelles.
```bash
baseURL = "https://gitlab_user.gitlab.io/"
```
Compléter le fichier .gitlab-ci.yml comme ceci:
```bash
image: registry.gitlab.com/pages/hugo/hugo_extended:latest
variables:
GIT_SUBMODULE_STRATEGY: recursive
pages:
script:
- hugo
artifacts:
paths:
- public
only:
- main
```
### VIA DOCKER :whale:
- Créer une Dockerfile contenant:
```Dockerfile
FROM nginx:alpine
COPY ./public/* /usr/share/nginx/html
COPY ./docs/nginx-exemple.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```
```bash
docker build -t hugo-site:1.0 .
docker run -d -p 8989:80 hugo-site:1.0
```
## DOCUMENTATION :books:
[DOC DU GARAGE](https://docs.legaragenumerique.xyz/divers/devops/hugo/)
[DOC OFFICIELLE](https://gohugo.io/documentation/)
[DOC MARKDOWN](https://www.markdownguide.org/basic-syntax/)
## CI/CD :repeat:
- WEB2PDF.py
- .drone.yml
## TO DO :bookmark_tabs:
- [ ] CI/CD schema
+87
View File
@@ -0,0 +1,87 @@
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Inter:wght@400;500;600;700&display=swap');
:root {
--bg: #0b0d0f;
--surface: #111417;
--surface-2: #171b1f;
--text: #e7ebe8;
--muted: #99a39e;
--line: #29302e;
--accent: #8fe388;
--accent-dark: #162319;
--max: 1120px;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { margin:0; background:var(--bg); color:var(--text); font-family:Inter,system-ui,sans-serif; line-height:1.7; }
a { color:var(--text); text-decoration:none; }
a:hover { color:var(--accent); }
.container { width:min(calc(100% - 40px), var(--max)); margin:auto; }
.site-header { border-bottom:1px solid var(--line); position:sticky; top:0; background:rgba(11,13,15,.94); backdrop-filter:blur(12px); z-index:10; }
.nav { min-height:70px; display:flex; align-items:center; gap:28px; }
.brand { font:500 15px "IBM Plex Mono",monospace; white-space:nowrap; }
.brand strong, .brand span { color:var(--accent); }
.nav nav { display:flex; gap:20px; margin-left:auto; }
.nav nav a, .nav-links a { font:400 12px "IBM Plex Mono",monospace; color:var(--muted); text-transform:uppercase; letter-spacing:.04em; }
.nav-links { display:flex; gap:12px; padding-left:12px; border-left:1px solid var(--line); }
.hero { padding:110px 0 80px; max-width:900px; }
.eyebrow, .status, .project-index { font:500 11px "IBM Plex Mono",monospace; color:var(--accent); text-transform:uppercase; letter-spacing:.12em; }
.hero h1 { font-size:clamp(42px,8vw,82px); line-height:1; margin:12px 0; letter-spacing:-.055em; }
.hero-role { font-size:clamp(25px,4vw,42px); margin:0; font-weight:600; }
.hero-subtitle { font:500 14px "IBM Plex Mono",monospace; color:var(--accent); margin:12px 0 25px; }
.hero-copy { max-width:760px; color:var(--muted); font-size:18px; }
.hero-actions { display:flex; flex-wrap:wrap; gap:10px; margin-top:28px; }
.button { display:inline-block; border:1px solid var(--line); padding:10px 15px; font:500 12px "IBM Plex Mono",monospace; text-transform:uppercase; }
.button:hover { border-color:var(--accent); }
.button-primary { background:var(--accent); color:#0b0d0f; border-color:var(--accent); }
.button-primary:hover { color:#0b0d0f; }
.prose { color:#c9cfcb; max-width:800px; }
.prose h2 { margin-top:48px; color:var(--text); }
.prose h3 { color:var(--text); margin-top:30px; }
.prose code, pre { font-family:"IBM Plex Mono",monospace; }
.prose code { background:var(--surface-2); padding:2px 5px; }
.prose pre { background:#070809; border:1px solid var(--line); padding:20px; overflow:auto; }
.prose blockquote { margin:30px 0; padding:15px 20px; border-left:2px solid var(--accent); color:var(--muted); background:var(--surface); }
.page-header { padding:75px 0 45px; border-bottom:1px solid var(--line); margin-bottom:45px; }
.page-header h1 { font-size:clamp(40px,6vw,64px); line-height:1.05; margin:8px 0; letter-spacing:-.04em; }
.lead { color:var(--muted); font-size:18px; max-width:760px; }
.engineering-grid, .project-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:14px; margin:25px 0 65px; }
.engineering-grid article, .project-card, .lab-card { border:1px solid var(--line); background:var(--surface); padding:22px; }
.engineering-grid span { font:12px "IBM Plex Mono",monospace; color:var(--accent); }
.engineering-grid h3 { margin:10px 0 4px; }
.engineering-grid p, .project-card p, .lab-card p { color:var(--muted); margin:0; }
.project-card { min-height:230px; display:flex; flex-direction:column; }
.project-top { display:flex; justify-content:space-between; margin-bottom:25px; }
.project-index { color:#59635e; }
.project-card h2 { font-size:22px; margin:0 0 8px; }
.project-card p { margin-bottom:18px; }
.tags { display:flex; flex-wrap:wrap; gap:6px; margin-top:auto; }
.tags span { font:11px "IBM Plex Mono",monospace; color:#aab3ae; border:1px solid var(--line); padding:3px 7px; }
.tags-large { margin:20px 0; }
.project-link { font:12px "IBM Plex Mono",monospace; color:var(--accent); margin-top:16px; }
.timeline { border-left:1px solid var(--line); }
.timeline-item { display:grid; grid-template-columns:230px 1fr; gap:35px; padding:30px 0 30px 28px; position:relative; }
.timeline-item:before { content:""; width:7px; height:7px; background:var(--accent); position:absolute; left:-4px; top:39px; }
.timeline-item h2 { margin:0 0 3px; }
.muted { color:var(--muted); }
.notes-list { display:grid; gap:0; }
.notes-list article { display:grid; grid-template-columns:140px 1fr; gap:20px; padding:22px 0; border-bottom:1px solid var(--line); }
.notes-list span { font:11px "IBM Plex Mono",monospace; color:var(--muted); }
.notes-list h2 { margin:0; font-size:20px; }
.notes-list p { grid-column:2; margin:0; color:var(--muted); }
.site-footer { margin-top:100px; border-top:1px solid var(--line); }
.footer-inner { min-height:80px; display:flex; justify-content:space-between; align-items:center; color:var(--muted); font:11px "IBM Plex Mono",monospace; }
@media(max-width:850px) {
.nav nav { display:none; }
.nav-links { margin-left:auto; }
.engineering-grid, .project-grid { grid-template-columns:1fr 1fr; }
.timeline-item { grid-template-columns:1fr; gap:5px; }
.notes-list article { grid-template-columns:1fr; }
.notes-list p { grid-column:auto; }
}
@media(max-width:560px) {
.container { width:min(calc(100% - 28px), var(--max)); }
.hero { padding:75px 0 55px; }
.engineering-grid, .project-grid { grid-template-columns:1fr; }
.footer-inner { flex-direction:column; align-items:flex-start; justify-content:center; gap:5px; }
}
+1
View File
@@ -0,0 +1 @@
document.documentElement.classList.add("js");
+19 -48
View File
@@ -1,52 +1,23 @@
# Configuration de l'adresse, titre (onglet) et des chemins vers les contenus baseURL = "https://gregandev.fr/"
baseurl = "https://gregandev.fr" languageCode = "fr-fr"
contentdir = "content" defaultContentLanguage = "fr"
layoutdir = "layouts" title = "Grégory Lebreton — Ingénieur DevOps / SRE"
publishdir = "public" enableRobotsTXT = true
title = "Gregandev" enableGitInfo = true
logo = "images/logos/logo.png"
favicon = "images/logos/favicon.png"
theme = "silhouette-hugo"
author = "Grégory Lebreton"
[pagination]
pagerSize = 10
relativeURLs = false
canonifyURLs = true
#disqusShortname = ""
#googleAnalytics = ""
[params] [params]
author = "Grégory Lebreton" description = "Portfolio de Grégory Lebreton, ingénieur DevOps / SRE orienté infrastructure, automatisation, CI/CD, conteneurs et observabilité."
introDescription = "Ingénieur Devops" author = "Grégory Lebreton"
enableRobotsTXT = true github = "https://github.com/greglebreton"
contentSharing = "" gitlab = "https://gitlab.com/greglebreton"
linkedin = "https://www.linkedin.com/in/grégory-lebreton-996b261bb/"
email = "greg"
[Params.social] [taxonomies]
github = "greglebreton" category = "categories"
linkedin = "grégory-lebreton-996b261bb" tag = "tags"
gitlab = "greglebreton"
email = "greg"
[Params.social.share] [markup]
linkedin = true [markup.goldmark]
email = true [markup.goldmark.renderer]
unsafe = true
# CONFIG LANGAGE
DefaultContentLanguage = "fr"
# theme = ["osm", "beautifulhugo"]
metaDataFormat = "yaml"
pygmentsUseClasses = true
pygmentCodeFences = true
# ICONES RESEAUX SOCIAUX
[Author]
name = "Greg Lebreton"
email = "contact@gregandev.fr"
# gitlab = "GregLebreton"
github = "GregLebreton"
linkedin = "grégory-lebreton-996b261bb"
itchio = "gregan"
+35 -18
View File
@@ -1,33 +1,50 @@
--- ---
title: Accueil title: "Grégory Lebreton"
description: "Portfolio pour GreganDev" description: "Ingénieur DevOps / SRE — Infrastructure, automatisation, CI/CD, conteneurs et observabilité."
date: 2025-06-26
draft: false
--- ---
<div class="contenu"> ## Ingénieur DevOps / SRE
### ![Typing SVG](https://readme-typing-svg.demolab.com?font=Anton&pause=1000&size=40&random=false&repeat=false&width=435&height=70&lines=INTRODUCTION) **Infrastructure · Automation · CI/CD · Containers · Observability**
Développeur passionné par les technologies de l'information et de communication, autodidacte de formation, j'aime le partage de connaissances par l'intermédiaire de tout vecteur possible dont l'open source ! Je conçois, automatise et exploite des infrastructures Linux et des plateformes de déploiement.
### LES PROJETS Mon travail se situe à l'intersection de l'administration système, du développement et de l'industrialisation : Infrastructure as Code, configuration management, conteneurisation, CI/CD, monitoring, sauvegarde et documentation.
Voici les projets sur lesquels je travaille actuellement : <div class="hero-actions">
<a class="button button-primary" href="/projects/">Voir les projets</a>
<a class="button" href="/experience/">Parcours professionnel</a>
</div>
[![LA2029](images/jeux/CaptureTerminatorQuest00.png)]({{< relref "projets/la-2029.md" >}}) ## Engineering
[![GEVR](images/jeux/GEVRCover.jpg)]({{< relref "projets/goldeneyevr.md" >}}) <div class="engineering-grid">
<article><span>01</span><h3>Systems</h3><p>Linux · Debian · VPS · On-premise · Réseau</p></article>
<article><span>02</span><h3>Automation</h3><p>Ansible · Terraform · Python · Bash</p></article>
<article><span>03</span><h3>Delivery</h3><p>Git · CI/CD · Jenkins · Drone CI</p></article>
<article><span>04</span><h3>Platform</h3><p>Docker · Docker Compose · Kubernetes</p></article>
<article><span>05</span><h3>Observability</h3><p>Prometheus · Grafana · supervision</p></article>
<article><span>06</span><h3>Reliability</h3><p>Backup · restauration · PRA · documentation</p></article>
</div>
[![E&MVSW](images/jeux/AkiraCover.JPG)]({{< relref "projets/akiravr.md" >}}) ## Projets mis en avant
[![E&MVSW](images/jeux/cover.jpg)]({{< relref "projets/retroarcade.md" >}}) <div class="project-grid">
{{ range where (where .Site.RegularPages "Params.featured" true) "Section" "projects" }}
{{ partial "project-card.html" . }}
{{ end }}
</div>
[![GARAGE](images/formation/garagenum.png)]({{< relref "page/garagenum.md" >}}) ## Actuellement
[![CNAM](images/formation/cnam.png)]({{< relref "page/cnam.md" >}}) **Le Garage Numérique — Paris**
[![SK8](images/projets/skate.png)](https://git.gregandev.fr/explore/repos) Formateur DevOps / Administrateur Systèmes.
</div> Infrastructure · Automation · Platform · Observability
## Approche
> Je construis → j'automatise → je déploie → je supervise → je documente.
Je privilégie les environnements reproductibles, les processus simples à exploiter et les solutions dont le fonctionnement peut être compris, testé et maintenu.
+23
View File
@@ -0,0 +1,23 @@
---
title: "À propos"
description: "Profil de Grégory Lebreton."
---
# À propos
Ingénieur DevOps / SRE et administrateur systèmes, également formateur technique.
Je m'intéresse particulièrement à l'automatisation, à la reproductibilité des environnements, à la fiabilité des déploiements et à la conception de plateformes simples à exploiter et maintenir.
## Formation
- Ingénieur DevOps — GT'm Ingénierie
- Concepteur Développeur Informatique — AFPA Paris XII
- Bac ES
## Langues
- Français — natif
- Anglais — C2
- Espagnol — B1
- Allemand — B1
+20
View File
@@ -0,0 +1,20 @@
---
title: "Expérience"
description: "Expérience professionnelle en administration systèmes, DevOps, développement et formation technique."
---
# Expérience
Un parcours à l'interface entre développement logiciel, administration systèmes, infrastructure et transmission des compétences.
{{ range .Pages.ByDate.Reverse }}
<article class="timeline-item">
<div class="timeline-date">{{ .Params.period }}</div>
<div>
<h2>{{ .Title }}</h2>
<p class="muted">{{ .Params.company }} · {{ .Params.location }}</p>
{{ .Content }}
{{ with .Params.technologies }}<div class="tags">{{ range . }}<span>{{ . }}</span>{{ end }}</div>{{ end }}
</div>
</article>
{{ end }}
+15
View File
@@ -0,0 +1,15 @@
---
title: "Ingénieur / Développeur freelance"
company: "Freelance"
location: "France"
period: "Janvier 2020 — Février 2021"
date: 2020-01-01
technologies: ["Python", "PHP", "SQL", "Linux", "Docker", "Git"]
---
Interventions sur des projets logiciels et infrastructure, avec une attention portée à l'automatisation, au déploiement et à la maintenabilité.
- Développement d'outils et d'applications.
- Administration d'environnements Linux.
- Automatisation et scripting.
- Intégration et déploiement d'applications.
+16
View File
@@ -0,0 +1,16 @@
---
title: "Formateur DevOps / Administrateur Systèmes"
company: "Le Garage Numérique"
location: "Paris"
period: "Mars 2021 — aujourd'hui"
date: 2021-03-01
technologies: ["Linux", "Ansible", "Docker", "CI/CD", "Monitoring", "Git"]
---
Accompagnement technique et transmission autour de l'administration systèmes, du DevOps et des pratiques d'industrialisation.
- Administration et maintenance d'environnements Linux.
- Automatisation des opérations récurrentes.
- Accompagnement sur Git, conteneurs et chaînes de déploiement.
- Mise en place et documentation de pratiques reproductibles.
- Formation et accompagnement de publics techniques.
+14
View File
@@ -0,0 +1,14 @@
---
title: "Développeur"
company: "Leading Frog"
location: "France"
period: "Octobre 2017 — Décembre 2018"
date: 2017-10-01
technologies: ["PHP", "JavaScript", "SQL", "Git"]
---
Développement d'applications web et participation aux différentes étapes du cycle de vie logiciel.
- Développement et maintenance.
- Intégration de fonctionnalités.
- Correction et évolution d'applications existantes.
+14
View File
@@ -0,0 +1,14 @@
---
title: "Ingénieur développement"
company: "Safran Aircraft Engines"
location: "France"
period: "Juin 2019 — Décembre 2019"
date: 2019-06-01
technologies: ["C#", "SQL", "Git", "Industrialisation"]
---
Participation au développement et à l'industrialisation de solutions logicielles dans un contexte industriel.
- Développement et maintenance d'applications.
- Travail avec des environnements techniques contraints.
- Collaboration avec les équipes projet et documentation des solutions.
+25
View File
@@ -0,0 +1,25 @@
---
title: "Lab"
description: "Laboratoire personnel : infrastructure, automatisation, Kubernetes et observabilité."
---
# Lab
Le lab sert à tester des architectures et des outils avant de les documenter ou de les réutiliser.
{{ range .Pages.ByDate.Reverse }}
<article class="lab-card">
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
<p>{{ .Description }}</p>
</article>
{{ end }}
## Axes
- Linux & administration systèmes
- Infrastructure as Code
- Ansible & automatisation
- Docker & Kubernetes
- Prometheus & Grafana
- CI/CD
- Backup, restauration et PRA
+7
View File
@@ -0,0 +1,7 @@
---
title: "Automation Lab"
description: "Expérimentations autour de l'automatisation système et de l'idempotence."
date: 2026-09-01
---
Tests de rôles Ansible, scripts Bash/Python et procédures de provisioning reproductibles.
+7
View File
@@ -0,0 +1,7 @@
---
title: "Observability Lab"
description: "Expérimentations autour des métriques, dashboards et alertes."
date: 2026-09-01
---
Expérimentations Prometheus/Grafana : collecte de métriques, dashboards et supervision de services.
+8
View File
@@ -0,0 +1,8 @@
---
title: "Notes"
description: "Notes techniques et retours d'expérimentation."
---
# Notes techniques
Cette section accueillera progressivement des articles courts et reproductibles : procédures, retours de lab, automatisation et troubleshooting.
+18
View File
@@ -0,0 +1,18 @@
---
title: "Projets"
description: "Projets techniques autour de l'infrastructure, de l'automatisation, du CI/CD et de l'observabilité."
---
# Projets
Une sélection de travaux techniques et d'expérimentations orientés infrastructure et platform engineering.
<div class="project-grid">
{{ range .Pages.ByDate.Reverse }}
{{ partial "project-card.html" . }}
{{ end }}
</div>
## Archive
Les anciens projets personnels orientés VR / jeu vidéo restent disponibles comme archive technique, mais ne constituent plus le cœur du portfolio professionnel.
+16
View File
@@ -0,0 +1,16 @@
---
title: "Ansible Role — Certbot"
description: "Rôle Ansible pour automatiser l'installation et la configuration de Certbot / Let's Encrypt."
date: 2026-07-29
featured: true
technologies: ["Ansible", "Linux", "Let's Encrypt", "Idempotence"]
categories: ["automation", "infrastructure"]
tags: ["ansible", "certbot", "tls", "linux"]
status: "active"
links:
repository: "https://git.gregandev.fr/gregandev/ansible-role-certbot"
---
Un rôle Ansible dédié à l'automatisation de la gestion de Certbot et des certificats TLS.
Ce type d'automatisation illustre une approche infrastructure-as-code : installation reproductible, configuration déclarative et réduction des opérations manuelles.
+32
View File
@@ -0,0 +1,32 @@
---
title: "Portfolio Hugo & CI/CD"
description: "Site statique Hugo construit, validé et déployé automatiquement par CI/CD."
date: 2026-09-01
featured: true
technologies: ["Hugo", "Drone CI", "Docker", "Git", "Linux"]
categories: ["cicd", "platform"]
tags: ["hugo", "drone", "docker", "deployment"]
status: "active"
links:
repository: "https://git.gregandev.fr/gregandev/hugo-site"
---
Le portfolio lui-même sert de démonstrateur d'industrialisation.
### Chaîne
```text
Git push
↓
Drone CI
↓
Hugo build
↓
Validation
↓
Déploiement
↓
gregandev.fr
```
Objectifs : rendre le build reproductible, limiter les régressions et garder une chaîne de livraison lisible.
@@ -0,0 +1,19 @@
---
title: "Infrastructure as Code"
description: "Provisionnement et configuration automatisés d'infrastructures Linux."
date: 2026-08-15
featured: true
technologies: ["Terraform", "Ansible", "Linux", "Git"]
categories: ["infrastructure", "automation"]
tags: ["terraform", "ansible", "iac", "linux"]
status: "lab"
---
Expérimentations autour du provisionnement et de la configuration reproductible d'environnements Linux.
### Principes
- Déclarer l'infrastructure plutôt que la configurer manuellement.
- Séparer provisioning et configuration.
- Rendre les changements reproductibles et auditables.
- Documenter les opérations de maintenance et de restauration.
+14
View File
@@ -0,0 +1,14 @@
---
title: "Kubernetes Lab"
description: "Laboratoire de conteneurisation et d'orchestration pour expérimenter les pratiques Platform Engineering."
date: 2026-08-01
featured: true
technologies: ["Kubernetes", "Docker", "Linux", "Prometheus", "Grafana"]
categories: ["platform", "observability"]
tags: ["kubernetes", "docker", "monitoring", "lab"]
status: "lab"
---
Laboratoire destiné à expérimenter le déploiement d'applications conteneurisées, la configuration des workloads et leur supervision.
Les expérimentations sont documentées séparément afin de distinguer clairement les travaux de laboratoire des environnements de production.
+27
View File
@@ -0,0 +1,27 @@
---
title: "Stack"
description: "Technologies et outils utilisés dans mon environnement technique."
---
# Stack
## Systems
Linux · Debian · SSH · Nginx · systemd
## Infrastructure
Terraform · Ansible · VPS · On-premise
## Containers
Docker · Docker Compose · Kubernetes
## Delivery
Git · Drone CI · Jenkins · CI/CD
## Observability
Prometheus · Grafana · logs · monitoring
## Programming
Python · Bash · Go · PHP · C# · Java · SQL · JavaScript
## Practices
Infrastructure as Code · automatisation · documentation · backup/restore · PRA
+13 -65
View File
@@ -1,67 +1,15 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="{{ .Site.Language.Lang }}">
<head> <head>
<meta charset="utf-8"> {{ partial "head.html" . }}
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> </head>
<body>
<!-- {{ template "_internal/opengraph.html" . }} {{ partial "header.html" . }}
{{ template "_internal/twitter_cards.html" . }} --> <main class="container">
{{ block "main" . }}{{ end }}
<title>{{ block "title" . }}{{ with .Params.Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title> </main>
{{ partial "footer.html" . }}
<link rel="icon" type="image/png" href='{{ "images/logos/favicon.png" | absURL }}' sizes="16x16"> {{ $js := resources.Get "js/main.js" | minify | fingerprint }}
<link rel="icon" type="image/png" href='{{ "images/logos/favicon.png" | absURL }}' sizes="32x32"> <script src="{{ $js.RelPermalink }}" defer></script>
</body>
<link href="https://fonts.googleapis.com/css?family=Oswald:400" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
{{ $css := resources.Match "css/*.css" }}
{{ with $css }}
{{ $bundle := . | resources.Concat "css/bundle.min.css" | minify | fingerprint }}
<link rel="stylesheet"
href="{{ $bundle.Permalink }}"
integrity="{{ $bundle.Data.Integrity }}">
{{ end }}
{{ block "head" . }}{{ end }}
</head>
<body>
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark py-1 top-nav">
<div class="container">
{{ partial "navbar-brand" . }}
<button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<i class="fas fa-bars"></i>
</button>
<div class="navbar-collapse collapse" id="navbarCollapse">
<ul class="navbar-nav mr-auto">
{{ partial "top-nav-text-links" . }}
</ul>
<div class="social-icons d-none d-lg-block">
{{ partial "social-icons" . }}
</div>
</div>
</div>
</nav>
{{ block "header" .}}{{ end }}
<div class="main">
{{ block "main" . }}{{ end }}
</div>
<footer class="mt-auto footer d-print-none">
<div class="container-fluid">
<div class="d-flex justify-content-center icons">
{{ partial "social-icons" . }}
</div>
</div>
</footer>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
</body>
</html> </html>
+6 -66
View File
@@ -1,68 +1,8 @@
{{ define "head" }}
<style type="text/css">
.feature-image {
background-image: linear-gradient(
rgba(0, 0, 0, 0.15),
rgba(0, 0, 0, 0.15)
), url('{{ "images/unix.jpg" | absURL }}');
height: 500px;
}
.feature-image-text {
margin-top: 20px;
}
@media (min-width: 1200px) {
.feature-image {
background-position: 0% 30%;
}
}
@media (max-width: 768px) {
.feature-image {
height: 250px;
background-position: 0% 0%;
}
}
</style>
{{ end }}
{{ define "header" }}
{{ if .IsHome }}
<header class="feature-image">
<div class="feature-image-text white-shadow-text">
{{ partial "header-about-me" . }}
</div>
</header>
{{ end }}
{{ if not .IsHome }}
<header class="feature-image">
<div class="feature-image-text">
<h1 class="text-center">{{ .Title }}</h1>
</div>
</header>
{{ end }}
{{ end }}
{{ define "main" }} {{ define "main" }}
<div class="container mt-4 mb-4 recent-posts" style="text-align: center;"> <header class="page-header">
{{ $pages := .Pages }} <p class="eyebrow">{{ .Section }}</p>
{{ if .IsHome }} <h1>{{ .Title }}</h1>
{{ $pages := where .Site.RegularPages "Section" "page" }} {{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
</header>
{{ range $pages }} <div class="prose">{{ .Content }}</div>
<div><a class="title" id="front-title" href="{{ .Permalink }}"><h2>{{ .Title }}</h2></a></div>
<div><p id="front-title">{{ .Description }}</p></div>
{{ end }}
<!-- {{ $pages := where .Site.RegularPages "Section" "projets" }}
{{ range $pages }}
<div><a href="{{ .Permalink }}"><h5>{{ .Title }}</h5></a></div>
{{ end }} -->
{{ end }}
</div>
{{ end }} {{ end }}
+9 -26
View File
@@ -1,27 +1,10 @@
{{ define "head" }}
<style type="text/css">
p {
text-align: center;
}
img {
max-width: 95%
}
</style>
{{ end }}
{{ define "title" }}
{{ .Title }} | {{ .Site.Title }}
{{ end }}
{{ define "main" }} {{ define "main" }}
<div class="container mt-4 post"> <article class="article">
<!-- <h1>{{ .Title }}</h1> --> <header class="page-header">
{{ partial "post-meta" . }} <p class="eyebrow">{{ .Section }}</p>
<h1>{{ .Title }}</h1>
<div class="mt-4 mb-4 main-content"> {{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
{{ .Content }} </header>
</div> <div class="prose">{{ .Content }}</div>
</div> </article>
{{ end }} {{ end }}
+15
View File
@@ -0,0 +1,15 @@
{{ define "main" }}
<header class="page-header">
<p class="eyebrow">CAREER</p>
<h1>{{ .Title }}</h1>
<p class="lead">{{ .Description }}</p>
</header>
<div class="timeline">
{{ range .Pages.ByDate.Reverse }}
<article class="timeline-item">
<div class="timeline-date">{{ .Params.period }}</div>
<div><h2>{{ .Title }}</h2><p class="muted">{{ .Params.company }} · {{ .Params.location }}</p><div class="prose">{{ .Content }}</div>{{ with .Params.technologies }}<div class="tags">{{ range . }}<span>{{ . }}</span>{{ end }}</div>{{ end }}</div>
</article>
{{ end }}
</div>
{{ end }}
+15
View File
@@ -0,0 +1,15 @@
{{ define "main" }}
<section class="hero">
<p class="eyebrow">OPEN TO ENGINEERING</p>
<h1>{{ .Title }}</h1>
<p class="hero-role">Ingénieur DevOps / SRE</p>
<p class="hero-subtitle">Infrastructure · Automation · CI/CD · Containers · Observability</p>
<p class="hero-copy">{{ .Description }}</p>
<div class="hero-actions">
<a class="button button-primary" href="/projects/">Projets</a>
<a class="button" href="/experience/">Expérience</a>
<a class="button" href="/stack/">Stack</a>
</div>
</section>
<div class="prose">{{ .Content }}</div>
{{ end }}
+6
View File
@@ -0,0 +1,6 @@
{{ define "main" }}
<header class="page-header"><p class="eyebrow">LAB</p><h1>{{ .Title }}</h1><p class="lead">{{ .Description }}</p></header>
<div class="project-grid">
{{ range .Pages.ByDate.Reverse }}<article class="project-card"><span class="status">LAB</span><h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2><p>{{ .Description }}</p></article>{{ end }}
</div>
{{ end }}
+6
View File
@@ -0,0 +1,6 @@
{{ define "main" }}
<header class="page-header"><p class="eyebrow">NOTES</p><h1>{{ .Title }}</h1><p class="lead">{{ .Description }}</p></header>
<div class="notes-list">
{{ range .Pages.ByDate.Reverse }}<article><span>{{ .Date.Format "2006-01-02" }}</span><h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2><p>{{ .Description }}</p></article>{{ end }}
</div>
{{ end }}
+6
View File
@@ -0,0 +1,6 @@
<footer class="site-footer">
<div class="container footer-inner">
<span>© {{ now.Year }} Grégory Lebreton</span>
<span>Built with Hugo · deployed with CI/CD</span>
</div>
</footer>
+8
View File
@@ -0,0 +1,8 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} — {{ .Site.Title }}{{ end }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
<link rel="canonical" href="{{ .Permalink }}">
{{ $css := resources.Get "css/main.css" | minify | fingerprint }}
<link rel="stylesheet" href="{{ $css.RelPermalink }}">
{{ with .OutputFormats.Get "RSS" }}<link rel="alternate" type="application/rss+xml" href="{{ .RelPermalink }}">{{ end }}
+17
View File
@@ -0,0 +1,17 @@
<header class="site-header">
<div class="container nav">
<a class="brand" href="/"><span>greg</span>@<strong>dev</strong></a>
<nav aria-label="Navigation principale">
<a href="/experience/">Experience</a>
<a href="/projects/">Projects</a>
<a href="/lab/">Lab</a>
<a href="/stack/">Stack</a>
<a href="/notes/">Notes</a>
<a href="/about/">About</a>
</nav>
<div class="nav-links">
<a href="{{ .Site.Params.github }}" target="_blank" rel="noopener">GitHub</a>
<a href="{{ .Site.Params.linkedin }}" target="_blank" rel="noopener">LinkedIn</a>
</div>
</div>
</header>
+14
View File
@@ -0,0 +1,14 @@
<article class="project-card">
<div class="project-top">
<span class="status">{{ .Params.status | default "active" }}</span>
<span class="project-index">PROJECT</span>
</div>
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
<p>{{ .Description }}</p>
{{ with .Params.technologies }}
<div class="tags">{{ range . }}<span>{{ . }}</span>{{ end }}</div>
{{ end }}
{{ with .Params.links.repository }}
<a class="project-link" href="{{ . }}" target="_blank" rel="noopener">Repository ↗</a>
{{ end }}
</article>
+12
View File
@@ -0,0 +1,12 @@
{{ define "main" }}
<article class="article">
<header class="page-header">
<p class="eyebrow">PROJECT / {{ .Params.status | default "active" }}</p>
<h1>{{ .Title }}</h1>
<p class="lead">{{ .Description }}</p>
{{ with .Params.technologies }}<div class="tags tags-large">{{ range . }}<span>{{ . }}</span>{{ end }}</div>{{ end }}
</header>
<div class="prose">{{ .Content }}</div>
{{ with .Params.links.repository }}<p><a class="button button-primary" href="{{ . }}" target="_blank" rel="noopener">Voir le repository ↗</a></p>{{ end }}
</article>
{{ end }}