1 Commits
Author SHA1 Message Date
gregandev f8609b30e9 start v3 2026-09-29 10:55:01 +02:00
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"
+42 -25
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**
Je conçois, automatise et exploite des infrastructures Linux et des plateformes de déploiement.
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 ! 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.
### LES PROJETS
Voici les projets sur lesquels je travaille actuellement :
[![LA2029](images/jeux/CaptureTerminatorQuest00.png)]({{< relref "projets/la-2029.md" >}})
[![GEVR](images/jeux/GEVRCover.jpg)]({{< relref "projets/goldeneyevr.md" >}})
[![E&MVSW](images/jeux/AkiraCover.JPG)]({{< relref "projets/akiravr.md" >}})
[![E&MVSW](images/jeux/cover.jpg)]({{< relref "projets/retroarcade.md" >}})
[![GARAGE](images/formation/garagenum.png)]({{< relref "page/garagenum.md" >}})
[![CNAM](images/formation/cnam.png)]({{< relref "page/cnam.md" >}})
[![SK8](images/projets/skate.png)](https://git.gregandev.fr/explore/repos)
<div class="hero-actions">
<a class="button button-primary" href="/projects/">Voir les projets</a>
<a class="button" href="/experience/">Parcours professionnel</a>
</div> </div>
## Engineering
<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>
## Projets mis en avant
<div class="project-grid">
{{ range where (where .Site.RegularPages "Params.featured" true) "Section" "projects" }}
{{ partial "project-card.html" . }}
{{ end }}
</div>
## Actuellement
**Le Garage Numérique — Paris**
Formateur DevOps / Administrateur Systèmes.
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 }}
+8 -25
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 }}