Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8609b30e9 | ||
|
|
9799e04c01 | ||
|
|
f2b94b9c63 | ||
|
|
1dadc1054d | ||
|
|
a92d9e6488 | ||
|
|
195efd007d | ||
|
|
ced7b68762 | ||
|
|
7ecbb4da55 | ||
|
|
d41c1c31ad | ||
|
|
9813219413 | ||
|
|
b15bfc41fc | ||
|
|
05cca16107 | ||
|
|
2866717694 | ||
|
|
2ab6623201 | ||
|
|
406079d076 | ||
|
|
6e4752f62e | ||
|
|
a9a9403744 | ||
|
|
af261e747a | ||
|
|
84faab9b51 | ||
|
|
158621422d | ||
|
|
d926cdc4d6 | ||
|
|
26f1741ae6 | ||
|
|
722a9db853 | ||
|
|
cde62f43dc | ||
|
|
a08bca1fdd | ||
|
|
91165488d0 | ||
|
|
d8529efee9 | ||
|
|
10e8ad3be8 |
@@ -0,0 +1,64 @@
|
|||||||
|
kind: pipeline
|
||||||
|
name: hugo
|
||||||
|
type: docker
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: build hugo site
|
||||||
|
# image: greglebreton/drone-hugo:arm64
|
||||||
|
image: plugins/hugo
|
||||||
|
settings:
|
||||||
|
hugo_version: 0.154.2
|
||||||
|
theme: silhouette-hugo
|
||||||
|
extended: true
|
||||||
|
validate: true
|
||||||
|
config: config.toml
|
||||||
|
content: content
|
||||||
|
output: ./public
|
||||||
|
commands:
|
||||||
|
- hugo
|
||||||
|
|
||||||
|
- name: deploy site on server
|
||||||
|
image: greglebreton/drone-rsync:aarch64
|
||||||
|
settings:
|
||||||
|
hosts: ["192.168.0.100"]
|
||||||
|
target: /var/www/html/gregandev.fr
|
||||||
|
source: public/*
|
||||||
|
port: 2021
|
||||||
|
user:
|
||||||
|
from_secret: RSYNC_USER
|
||||||
|
key:
|
||||||
|
from_secret: RSYNC_SSH_KEY
|
||||||
|
|
||||||
|
- name: notify
|
||||||
|
image: greglebreton/drone-email:arm64
|
||||||
|
settings:
|
||||||
|
from.address: contact@gregandev.fr
|
||||||
|
host: mail.gregandev.fr
|
||||||
|
port: 587
|
||||||
|
debug: true
|
||||||
|
username: contact@gregandev.fr
|
||||||
|
password:
|
||||||
|
from_secret: MAIL_PASSWORD
|
||||||
|
recipients: [ greg@gregandev.fr ]
|
||||||
|
subject: >
|
||||||
|
[{{ build.status }}]
|
||||||
|
{{ repo.owner }}/{{ repo.name }}
|
||||||
|
body: >
|
||||||
|
📝 {{repo.name}} / {{commit.branch}} - {{commit.message}} <br />
|
||||||
|
{{#success build.status}}
|
||||||
|
✅ succeeded for 👷♂️ build {{build.number}}
|
||||||
|
{{else}}
|
||||||
|
🛑 failed for 👷♂️ build {{build.number}}
|
||||||
|
{{/success}}
|
||||||
|
<br /><img src='https://git.gregandev.fr/assets/img/logo.svg'/>
|
||||||
|
when:
|
||||||
|
status: [ success, failure ]
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[submodule "themes/zen"]
|
|
||||||
path = themes/zen
|
|
||||||
url = https://github.com/frjo/hugo-theme-zen.git
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
FROM nginx:alpine
|
FROM nginx:alpine
|
||||||
|
|
||||||
COPY ./public /var/www/html
|
COPY ./public /var/www/html
|
||||||
COPY ./nginx-docker/nginx.conf /etc/nginx/conf.d/default.conf
|
COPY ./nginx-proxy/nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Spencer Lyon
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -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.
|
||||||
@@ -1,69 +1,61 @@
|
|||||||
# HUGO SITE AVEC DOCKER
|
# gregandev.fr — Portfolio DevOps / SRE
|
||||||
|
|
||||||
Cette branche à pour but de conteneurisé un site HUGO compilé avec un server NGINX.
|
Portfolio professionnel de Grégory Lebreton, construit avec Hugo.
|
||||||
La configuration pour le NGINX reverse proxy en front se trouve dans le dossir nginx-proxy.
|
|
||||||
|
|
||||||
## UTILISATION:
|
## Positionnement
|
||||||
|
|
||||||
Pour l'utiliser avec un autre site Hugo, copier simplement la Dockerfile ou le docker-compose.yml
|
Le site est volontairement orienté :
|
||||||
ainsi que les dossiers nginx-docker et nginx-proxy à la racine du projet Hugo (à côté du config.toml)
|
|
||||||
et éxécuter la commande pour construire le site:
|
- 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/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Développement local
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
hugo
|
hugo server -D
|
||||||
```
|
```
|
||||||
|
|
||||||
Un dossier public s'est créé avec les fichiers statiques du site, il faut maintenant configurer
|
Build de production :
|
||||||
les Nginx (le proxy et celui dans l'image Docker:
|
|
||||||
|
|
||||||
## CONFIGURATION:
|
|
||||||
|
|
||||||
Editer le fichier de configuration
|
|
||||||
```bash
|
|
||||||
nano nginx-proxy/nginx.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
/\ Attention, le nom de domaine (ici exemple.com) est à configuré dans le proxy NGINX !
|
|
||||||
Une fois tout bien renseigné
|
|
||||||
|
|
||||||
Redémarrer NGINX:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl restart nginx
|
hugo --minify
|
||||||
```
|
```
|
||||||
|
|
||||||
## DEMARRER L'IMAGE:
|
## CI/CD
|
||||||
|
|
||||||
### VIA DOCKER
|
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.
|
||||||
|
|
||||||
```bash
|
## Important
|
||||||
docker build -t hugo/hugo-site .
|
|
||||||
docker run -d -p 6666:80 --name hugo-site hugo/hugo-site
|
|
||||||
```
|
|
||||||
|
|
||||||
### VIA DOCKER-COMPOSE
|
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
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### HTTPS:
|
|
||||||
|
|
||||||
Via Certbot:
|
|
||||||
```bash
|
|
||||||
sudo apt install certbot -y
|
|
||||||
sudo certbot certonly -d example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
Une fois le certificat obtenu, décommenter les 3 lignes concernant le SSL en vérifiant
|
|
||||||
le nom des certificats en fonction du nom de domaine:
|
|
||||||
```
|
|
||||||
#ssl on;
|
|
||||||
#ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
|
||||||
#ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
|
||||||
```
|
|
||||||
Créer une redirection vers le HTTPS dans le bloc server HTTP:
|
|
||||||
|
|
||||||
```
|
|
||||||
return 301 https://$host$request_uri;
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
document.documentElement.classList.add("js");
|
||||||
@@ -1,102 +1,23 @@
|
|||||||
# Configuration de l'adresse, titre (onglet) et des chemins vers les contenus
|
baseURL = "https://gregandev.fr/"
|
||||||
baseurl = "https://hugo.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
|
||||||
canonifyurls = true
|
|
||||||
|
|
||||||
# Configuration du language et thème
|
[params]
|
||||||
DefaultContentLanguage = "fr"
|
description = "Portfolio de Grégory Lebreton, ingénieur DevOps / SRE orienté infrastructure, automatisation, CI/CD, conteneurs et observabilité."
|
||||||
theme = "beautifulhugo"
|
author = "Grégory Lebreton"
|
||||||
#theme = "Lanyon"
|
github = "https://github.com/greglebreton"
|
||||||
metaDataFormat = "yaml"
|
gitlab = "https://gitlab.com/greglebreton"
|
||||||
pygmentsUseClasses = true
|
linkedin = "https://www.linkedin.com/in/grégory-lebreton-996b261bb/"
|
||||||
pygmentCodeFences = true
|
email = "greg"
|
||||||
#disqusShortname = "XXX"
|
|
||||||
#googleAnalytics = "XXX"
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
|
||||||
# gcse = "012345678901234567890:abcdefghijk" # Get your code from google.com/cse. Make sure to go to "Look and Feel" and change Layout to "Full Width" and Theme to "Classic"
|
|
||||||
|
|
||||||
#[[Params.bigimg]]
|
|
||||||
# src = "img/triangle.jpg"
|
|
||||||
# desc = "Triangle"
|
|
||||||
#[[Params.bigimg]]
|
|
||||||
# src = "img/sphere.jpg"
|
|
||||||
# desc = "Sphere"
|
|
||||||
#[[Params.bigimg]]
|
|
||||||
# src = "img/hexagon.jpg"
|
|
||||||
# desc = "Hexagon"
|
|
||||||
|
|
||||||
|
|
||||||
# ICONES RESEAUX SOCIAUX
|
|
||||||
[Author]
|
|
||||||
name = "Greg Lebreton"
|
|
||||||
email = "greg.lebreton@hotmail.com"
|
|
||||||
gitlab = "GregLebreton"
|
|
||||||
github = "GregLebreton"
|
|
||||||
twitter = "Gregan"
|
|
||||||
reddit = "username"
|
|
||||||
linkedin = "<greg<lebreton"
|
|
||||||
stackoverflow = "users/XXXXXXX/username"
|
|
||||||
instagram = "username"
|
|
||||||
youtube = "user/username" # or channel/channelname
|
|
||||||
spotify = "username"
|
|
||||||
itchio = "username"
|
|
||||||
#keybase = "username"
|
|
||||||
#xing = "username"
|
|
||||||
#bandcamp = "username"
|
|
||||||
#snapchat = "username"
|
|
||||||
#soundcloud = "username"
|
|
||||||
#facebook = "username"
|
|
||||||
#googleplus = "+username" # or xxxxxxxxxxxxxxxxxxxxx
|
|
||||||
|
|
||||||
|
|
||||||
##### MENU #####
|
|
||||||
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
name = "Post"
|
|
||||||
url = "post/"
|
|
||||||
weight = 1
|
|
||||||
|
|
||||||
# About
|
|
||||||
[[menu.main]]
|
|
||||||
name = "A propos"
|
|
||||||
url = "page/about"
|
|
||||||
weight = 2
|
|
||||||
|
|
||||||
# Tags
|
|
||||||
[[menu.main]]
|
|
||||||
name = "Tags"
|
|
||||||
url = "tags"
|
|
||||||
weight = 3
|
|
||||||
|
|
||||||
# sous menu PROJETS
|
|
||||||
[[menu.main]]
|
|
||||||
parent = "Projets"
|
|
||||||
name = "Projet 1"
|
|
||||||
url = "projets/projet1"
|
|
||||||
weight = 4
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
parent = "Projets"
|
|
||||||
name = "Projet 2"
|
|
||||||
url = "projets/projet2"
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
parent = "Projets"
|
|
||||||
name = "Projet 3"
|
|
||||||
url = "projets/projet3"
|
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
category = "categories"
|
||||||
|
tag = "tags"
|
||||||
|
|
||||||
|
[markup]
|
||||||
|
[markup.goldmark]
|
||||||
|
[markup.goldmark.renderer]
|
||||||
|
unsafe = true
|
||||||
|
|||||||
@@ -1,20 +1,50 @@
|
|||||||
[comment]: <> (PIPELINE)
|
---
|
||||||
|
title: "Grégory Lebreton"
|
||||||
|
description: "Ingénieur DevOps / SRE — Infrastructure, automatisation, CI/CD, conteneurs et observabilité."
|
||||||
|
---
|
||||||
|
|
||||||
## Contenu de la page d'accueil
|
## Ingénieur DevOps / SRE
|
||||||
|
|
||||||
<!-- Ajout image -->
|
**Infrastructure · Automation · CI/CD · Containers · Observability**
|
||||||

|
|
||||||
|
|
||||||
<!-- Ajout vidéo youtube -->
|
Je conçois, automatise et exploite des infrastructures Linux et des plateformes de déploiement.
|
||||||
{{< youtube bdQCxm1YOwY >}}
|
|
||||||
|
|
||||||
### Explication de config
|
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.
|
||||||
This website is powered by [GitLab Pages](https://about.gitlab.com/features/pages/)
|
|
||||||
/ [Hugo](https://gohugo.io) and can be built in under 1 minute.
|
|
||||||
Literally. It uses the `beautifulhugo` theme which supports content on your front page.
|
|
||||||
Edit `/content/_index.md` to change what appears here. Delete `/content/_index.md`
|
|
||||||
if you don't want any content here.
|
|
||||||
|
|
||||||
Head over to the [GitLab project](https://gitlab.com/pages/hugo) to get started.
|
<div class="hero-actions">
|
||||||
|
<a class="button button-primary" href="/projects/">Voir les projets</a>
|
||||||
|
<a class="button" href="/experience/">Parcours professionnel</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
Bienvenu sinon :)
|
## 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.
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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 }}
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -1,41 +1,72 @@
|
|||||||
---
|
---
|
||||||
title: Un titre
|
title: "MON PARCOURS"
|
||||||
subtitle: Un sous titre
|
|
||||||
comments: false
|
comments: false
|
||||||
|
description: "Mon parcours, mes compétences"
|
||||||
|
draft: false
|
||||||
---
|
---
|
||||||
|
|
||||||
## Exemple de texte
|
Après mon Baccalauréat, j'ai choisi de travailler pour être indépendant. C'est plus tard que j'ai trouvé ma vocation et alors ai entrepris de reprendre les études nécessaires pour faire le méter de mes rêves.
|
||||||
|
|
||||||
Mon nom est Greg Lebreton, et voici mes compétences:
|
#### 
|
||||||
|
|
||||||
- Devops
|
La formation de concepteur développeur informatique était orientée Java et web, avec le développement d'applications gérant aussi bien le Frontend que le Backend avec un affichage fenêtré géré par Swing ou un affichage par Jsp.
|
||||||
- Unity
|
|
||||||
- Jenkins
|
|
||||||
- C#
|
|
||||||
- PHP
|
|
||||||
- Java
|
|
||||||
- Bla bla bla
|
|
||||||
- Etc
|
|
||||||
- ...
|
|
||||||
|
|
||||||
Et bien plus encore.
|
J'ai pu aborder également la persistence a travers JPA mais aussi de manière traditionnelle avec le SQL et les bases de données (relationnelles).
|
||||||
|
J'ai alors développer des applications pour des librairie ou de restaurants connectés.
|
||||||
|
|
||||||
du code:
|
En conception, j'ai été formé à la méthode Merise ainsi que l'UML pour la modélisation, puis plus tard la méthode agile avec le développement SCRUM.
|
||||||
```
|
|
||||||
cd /etc/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Des exemples d'ajouts de contenu :
|
[](https://www.afpa.fr/)
|
||||||
|
|
||||||
### lien
|
#### 
|
||||||
Juste le meilleure film : [mon lien](https://www.youtube.com/watch?v=W8sop56DBUs)
|
|
||||||
|
|
||||||
### image
|
J'ai eu la chance de pouvoir développer un module en PHP pour une application liscenciée par Leading Frog.
|
||||||

|
|
||||||
|
|
||||||
### video youtube
|
L'application est déployée sur des totems dans les hôtels touristiques de Disneyland et offrent
|
||||||
{{< youtube ZSWzPI4BqvA >}}
|
différents modules comme la consultation d'horaires des transports (avions, bus, état du trafic routier), etc...
|
||||||
|
|
||||||
### texte
|
Mon module propose de choisir parmi des photos selectionnées par l'établissement pour les envoyer via un service payant (stripe) sous forme de carte postale.
|
||||||
|
|
||||||
juste blabla, et bla !
|
Une fois le paiement effectué, une notification est envoyée à Leading Frog proposant d'imprimer la carte postale avec le visuel précédement choisi et à l'adresse de destination déjà saisie.
|
||||||
|
|
||||||
|
[](https://news.leadingfrog.com/)
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
Puis j'ai suivi une formation DEVOPS avec l'utilisation d'outils comme Jenkins, Ansible ou Kubernetes qui change la façon de concevoir, développer et déployer des services informatiques.
|
||||||
|
|
||||||
|
[](https://fr.wikipedia.org/wiki/Devops)
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
|
||||||
|
[]({{< relref "page/garagenum.md" >}})
|
||||||
|
|
||||||
|
Je suis actuellement employé au Garage Numérique en tant que formateur Devops, avec également les casquettes d'administrateur systèmes, développeur et intégrateur.
|
||||||
|
|
||||||
|
C'est dans cet incubateur de talents que j'ai développé une application web de quiz en python via le framework [Django](https://www.djangoproject.com/), implémenter l'identification centralisée avec le logiciel Keycloak sur tous les services de l'association ([Nextcloud](https://nextcloud.com/fr/), [Kanboard](https://kanboard.org/), [Element](https://element.io/), [Workadventure](https://workadventu.re/), [Portainer](https://www.portainer.io/), [Jenkins](https://www.jenkins.io/), [Penpot](https://penpot.app/), [Gitea](https://gitea.com/)), ainsi que tout un système de PRA avec sauvegardes régulières et redéploiement automatiseé via: [Ansible](https://www.ansible.com/).
|
||||||
|
|
||||||
|
[]({{< relref "page/cnam.md" >}})
|
||||||
|
|
||||||
|
Le [CNAM](https://www.cnam.fr/) est un partenaire dans la formation des jeunes aux métiers de demain, il développe de nouvelles filières qui visent à répondre aux besoins des professionnels de l'informatique et permettent la reconnaissance des nouvelles compétences de l'IT par l'intermédiaire de dipômes.
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
[](https://cv.gregandev.fr)
|
||||||
|
|
||||||
|
## 
|
||||||
|
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
Une autre de mes passion, le skateboard. La plaisir de cruiser avec sa board un soir d'été afin de sentir le vent rafraîchir ces tempes est un des plaisirs de la vie.
|
||||||
|
|
||||||
|
[](https://www.youtube.com/@TheGregan77)
|
||||||
|
|
||||||
|
[](https://www.youtube.com/@TheGregan77)
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
Je suis depuis le début cette technologie qui me fascine tant par son aspect futuriste que par les possibilités qu'elle offre.
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: LE CNAM
|
||||||
|
subtitle: conservatoire national des arts et métiers
|
||||||
|
comments: false
|
||||||
|
description: la partie pédagogique de mon travail
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Dans le cadre d'un partenariat entre le Garage Numérique et le CNAM, j'anime les cours de spécialité DEVOPS technicien d'exploitation.
|
||||||
|
|
||||||
|
Cela me permet de former les jeunes à l'informatique de demain dans une branche offrant tant de métiers différents qu'il est souvent difficile de s'orienter pour un étudiant.
|
||||||
|
|
||||||
|
Pour connaître le contenu de la formation:
|
||||||
|
|
||||||
|
[](https://informatique.cnam.fr/fr/spip.php?article1739)
|
||||||
|
|
||||||
|
[](https://informatique.cnam.fr/fr/spip.php?article1739)
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
---
|
||||||
|
title: LE GARAGE NUMERIQUE
|
||||||
|
subtitle:
|
||||||
|
comments: false
|
||||||
|
description: la partie "technique" de mon travail
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
[](https://www.legaragenumerique.fr)
|
||||||
|
|
||||||
|
L'association Le Garage Numérique prône la culture du logiciel libre. Linux Debian est l'OS de prédilection.
|
||||||
|
|
||||||
|
Nous avons pour but de former la population à l'utilisation de logiciels libres pour que celle-ci s'approprie les outils plutôt que de payer de grands éditeurs pour pouvoir travailler ou faire ses démarches administratives.
|
||||||
|
|
||||||
|
Au Garage Numérique, on répare, on reconditionne et on forme les habitants aux outils libres pour une égalité numérique!
|
||||||
|
|
||||||
|
[](https://fr.wikipedia.org/wiki/Linux) [](https://fr.wikipedia.org/wiki/Debian)
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
##### 
|
||||||
|
|
||||||
|
Voici mes principaux rôles au Garage Numérique:
|
||||||
|
|
||||||
|
* Je suis formateur Devops au [CNAM](https://www.cnam.fr) pour des étudiants BAC +1 ainsi que pour les élèves su Pass numérique pro. Cela me permet de rester en perpétuelle veille technologique afin de transmetre les dernières technos utilisées.
|
||||||
|
|
||||||
|
* Je suis également Administrateur système, en charge de maintenir les serveurs du Garage opérationnels, à jour et sécurisés. La mise en place d'un monitoring automatisé autour de [Prometheus](https://prometheus.io/) ainsi que d'un système de BACKUP régulières permettant de récupérer rapidement en cas d'incident sur un serveur.
|
||||||
|
|
||||||
|
* Je développe également des applications pour la Garage et les intègre dans notre [ecosystème](https://git.legaragenumerique.fr/GARAGENUM/ecosysteme) afin de proposer toujours plus de services utiles à la communauté.
|
||||||
|
|
||||||
|
##### 
|
||||||
|
|
||||||
|
- Le framework python Django m'a permis de développer une application de quiz avec connection centralisée (SSO) vers le gestionnaire d'identité du Garage: Keycloak.
|
||||||
|
|
||||||
|
[](https://www.djangoproject.com/)
|
||||||
|
|
||||||
|
[](https://www.keycloak.org/)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.legaragenumerique.fr/GARAGENUM/django-quiz/src/branch/keycloak)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
- A la manière de [OVERTHEWIRE](https://overthewire.org/wargames/bandit/), nous avons créé un "bash game" pour faire découvrir aux étudiants les commandes terminal Linux via un jeux:
|
||||||
|
|
||||||
|
[](https://devops.legaragenumerique.fr/)
|
||||||
|
|
||||||
|
Pour déployer l'application sur les serveurs du Garage, nous avons choisi de "conteneuriser" celle-ci afin d'optimiser et de sécuriser notre serveur via l'outil [Docker](https://www.docker.com/).
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.legaragenumerique.fr/GARAGENUM/enter-bash)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
- Nous avons également déployer un méta-verse permettant aux étudiants de se retrouver d'une manière ludique pour travailler:
|
||||||
|
|
||||||
|
[](https://workadventu.re/)
|
||||||
|
|
||||||
|
Développé par [The Coding Machine](https://thecodingmachine.com/)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://github.com/workadventure/workadventure)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
- Afin d'assurer "l'indépendance de notre code", nous hébergeons un SCM ([Gitea](https://about.gitea.com/)) ainsi qu'une plateforme de CI/CD via [Drone CI](https://www.drone.io/):
|
||||||
|
|
||||||
|
[](https://git.legaragenumerique.fr)
|
||||||
|
|
||||||
|
|
||||||
|
{{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.legaragenumerique.fr/GARAGENUM/gitea-drone-ci)
|
||||||
|
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- A l'heure de l'intelligence artificielle, le Garage à déployé son propre [LLM](https://fr.wikipedia.org/wiki/Grand_mod%C3%A8le_de_langage) open source permettant d'intéragir avec une "intelligence artificielle".
|
||||||
|
|
||||||
|
[](https://ai.legaragenumerique.xyz)
|
||||||
|
|
||||||
|
Les modèles déployés sont:
|
||||||
|
- [ChatGPT 3.5](https://huggingface.co/openai-community/openai-gpt) Modèle de language conversationnel
|
||||||
|
- [Stable diffusion](https://huggingface.co/runwayml/stable-diffusion-v1-5) Modèle de générateur d'images
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.legaragenumerique.fr/GARAGENUM/garage-AI)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- Un Curiculum Vitae via le framework [HUGO](https://gohugo.io/):
|
||||||
|
|
||||||
|
[](https://cv.gregandev.fr/)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.gregandev.fr/gregandev/hugo-cv)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
- Dans le cadre du CNAM, nous avon développé un exemple d'API simple en Python Flask ainsi que son client Android en python via les modules Kivy et Buildozer:
|
||||||
|
|
||||||
|
[](https://git.legaragenumerique.fr/GARAGENUM/python-api)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source API](https://git.legaragenumerique.fr/GARAGENUM/python-api)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source client Android](https://git.legaragenumerique.fr/GARAGENUM/python-kivy)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
- Nous avons constitué une documentation avec [MKdocs](https://www.mkdocs.org/) au fil du temps archivant nos process et beaucoup de connaissances utiles dans l'informatique, mise à jour régulièrement via un [Drone CI] auto-hébergé:
|
||||||
|
|
||||||
|
[](https://docs.legaragenumerique.xyz)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" "https://git.legaragenumerique.fr/GARAGENUM/docs" >}} [code source](https://git.legaragenumerique.fr/GARAGENUM/docs)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
|
||||||
|
Pour plus de projets open source maintenus par le Garage: [Garagenum code](https://git.legaragenumerique.fr/GARAGENUM)
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
title: LIENS SYMPAS
|
||||||
|
subtitle:
|
||||||
|
comments: false
|
||||||
|
description: quelques liens funs
|
||||||
|
---
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Quentin Langèle est un software engineer qui s'est lançé dans
|
||||||
|
un projet faramineux de reconstitution de l'appartement du célèbre Blade runner Rick Deckard.
|
||||||
|
|
||||||
|
La minutie des textures, le souci du détail et l'athmosphère générale en fait pour moi un monument numérique dédié au chef d'oeuvre du septième art qu'est Blade Runner.
|
||||||
|
Bref, pour les amoureux de Blade Runner, c'est ici :
|
||||||
|
|
||||||
|
[](https://www.br9732.com)
|
||||||
|
|
||||||
|
[](https://www.br9732.com)
|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Grâce à des devs brillants, la plateforme open source de retrogaming "Retroarch" a été déclinée
|
||||||
|
en version web via emscriptem. Une image docker éxistait déjà, cependant voulant héberger le tout sur un Raspberry Pi 4,
|
||||||
|
l'architecture ne correspondait pas. Après réécriture de la Dockerfile et un build plus tard, j'ai constaté le succès de l'opération.
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://github.com/libretro/RetroArch)
|
||||||
|
|
||||||
|
> Image Docker pour Raspberry PI4:
|
||||||
|
[](https://hub.docker.com/r/greglebreton/retroarchwebpi)
|
||||||
|
|
||||||
|
<!-- [RETROARCH WEB PLAYER DÉPLOYÉ](https://retroarch.gregandev.fr) -->
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
EmulationStation est un FrontEnd opensource pour émulateur (généralement Retroarch). Il se décline sous différentes OS tels que Windows, Raspberry pi, débian et Arch OS.
|
||||||
|
|
||||||
|
Cet outil nécessite de la configuration pour fonctionner mais il offre des possibilités et une profondeur pour les afficionados du retro gaming qui mérite un détour.
|
||||||
|
En attendant de partager ma config, un petit lien permet de se faire une bonne idée de la chose.
|
||||||
|
|
||||||
|
J'ai également refait certains screens de menus pour quelques consoles que vous pouvez télécharger ici: [](https://github.com/GregLebreton/emulationstationThemes)
|
||||||
|
|
||||||
|
[](https://emulationstation.org)
|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Le célèbre Mozinor...
|
||||||
|
Mozinor est un amateur de doublages de vieux films qui peu a peu est passé pro dans le détournement de films.
|
||||||
|
|
||||||
|
Le mieux, c'est encore de parcourir son site en commençant par les premières années pour
|
||||||
|
constater l'évolution et l'ampleur du personnage !
|
||||||
|
|
||||||
|
[](http://www.mozinor.com)
|
||||||
|
|
||||||
|
La classe américaine ou le grand détournement. c'est le "flim" qui a inspiré Mozinor tant au niveau du principe que de l'humour.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Film complet: [](https://www.youtube.com/watch?v=W8sop56DBUs)
|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
JSdos est un projet pour faire tourner DosBox (émulateur MS-DOS en JavaScript) sur navigateur.
|
||||||
|
|
||||||
|
Cliquez sur l'icône et choisissez parmis les plus grand classiques DOS tels que DOOM, SIM CITY ou encore BLOOD.
|
||||||
|
Un grand merci à [@caiiiycuk](https://twitter.com/caiiiycuk) pour cet ouvrage.
|
||||||
|
|
||||||
|
Un DOS web avec les grands classiques:
|
||||||
|
[](https://js-dos.com/games/)
|
||||||
|
|
||||||
|
<!-- ### HUMOUR DE DEV
|
||||||
|
|
||||||
|
> les joies du code -->
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
title: PROJETS
|
||||||
|
subtitle:
|
||||||
|
comments: false
|
||||||
|
description: les projets persos
|
||||||
|
---
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Implémentation VR sur [Geographical-Adventures](https://github.com/SebLague/Geographical-Adventures)
|
||||||
|
|
||||||
|
[](https://git.legaragenumerique.fr/greg/Geographical-Adventures-VR)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.legaragenumerique.fr/greg/Geographical-Adventures-VR)
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Un hommage à l'ère des consoles 8 et 16 bits
|
||||||
|
|
||||||
|
[]({{< relref "projets/retroarcade.md" >}})
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Un remake du célèbre jeux sur Nintendo 64 en VR
|
||||||
|
|
||||||
|
[]({{< relref "projets/goldeneyevr.md" >}})
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Un FPS dans le monde post apocalyptique de Terminator en VR
|
||||||
|
|
||||||
|
[]({{< relref "projets/la-2029.md" >}})
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Conduisez la célèbre moto de Kaneda (Akira) en VR dans un Neo Tokyo
|
||||||
|
|
||||||
|
[]({{< relref "projets/akiravr.md" >}})
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Ce site portfolio a été fait avec le framework [HUGO](https://gohugo.io/)
|
||||||
|
|
||||||
|
[](https://git.gregandev.fr/portfolio/hugo-site)
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.gregandev.fr/portfolio/hugo-site)
|
||||||
|
|
||||||
|
L'utilisation du même framework avec un thème monopage pour faire son CV:
|
||||||
|
|
||||||
|
> {{< icons "fab fa-github" "fa-2x" >}} [code source](https://git.gregandev.fr/portfolio/hugo-cv)
|
||||||
|
|
||||||
|
<!-- ### PYTHON METEO
|
||||||
|
|
||||||
|
[![Python meteo]()](https://git.gregandev.fr/gregandev/python-meteo.git) -->
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: Page Test Contenu
|
|
||||||
date: 2021-05-02
|
|
||||||
tags: ["test", "texte", "Rio de Janeiro"]
|
|
||||||
---
|
|
||||||
|
|
||||||
## Du texte:
|
|
||||||
|
|
||||||
Rio de Janeiro (/ˈʁi.u d(ʒi) ʒɐˈnejɾu/2), souvent désignée simplement sous le nom de Rio, et archaïquement Riogénaire en français, est la deuxième plus grande ville du Brésil après São Paulo. Située dans le Sud-Est du pays, elle est la capitale de l'État de Rio de Janeiro.
|
|
||||||
|
|
||||||
Avec ses 6,1 millions d'habitants intra-muros (communément appelés Cariocas, la variante Carioques existant aussi en français) et 12,62 millions dans l'aire urbaine, Rio de Janeiro est l'une des métropoles les plus importantes du continent américain.
|
|
||||||
|
|
||||||
Elle est mondialement connue pour son carnaval, ses plages (Copacabana, Leblon et Ipanema) ainsi que sa statue du Christ Rédempteur au sommet du Corcovado.
|
|
||||||
|
|
||||||
(extrait Wikipédia)
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Des tableaux:
|
|
||||||
|
|
||||||
| Tableau | Article | Prix |
|
|
||||||
| ------------- |:-------------:| -----:|
|
|
||||||
| 1 | Chapeau | €25 |
|
|
||||||
| 2 | Echarpe | €15 |
|
|
||||||
| 3 | Malabar | €0,1 |
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Simple lien:
|
|
||||||
[Je suis un lien!](https://gregandev.fr)
|
|
||||||
|
|
||||||
------
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
---
|
|
||||||
title: post test de divers contenus !
|
|
||||||
date: 2021-05-02
|
|
||||||
tags: ["test", "contenu", "photos", "gif", "code"]
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
## Image via link:
|
|
||||||

|
|
||||||
|
|
||||||
commentaire ...
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Image via url locale (/static):
|
|
||||||

|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Gif via link:
|
|
||||||

|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Vidéo Youtube:
|
|
||||||
{{< youtube ZSWzPI4BqvA >}}
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Du code:
|
|
||||||
```javascript
|
|
||||||
var s = "JavaScript syntax highlighting";
|
|
||||||
alert(s);
|
|
||||||
```
|
|
||||||
|
|
||||||
```python
|
|
||||||
s = "Python syntax highlighting"
|
|
||||||
print s
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /ici/etla
|
|
||||||
echo "Salut le monde!"
|
|
||||||
```
|
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: AKIRA VR
|
||||||
|
subtitle: Jeux VR dev sous Unity
|
||||||
|
comments: false
|
||||||
|
---
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Le but de ce projet est de reproduire le Neo Tokyo d'Akira, au volant de la moto de Kaneda, parcours les autoroutes niponnes en pleine ville suréaliste.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ce projet me permet de travailler sur les lumières et l'optimisation de celles-ci dans une scène sous Unity.
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Il n'y en as pas vraiment, c'est mon projet le moins prioritaire pour le moment, idéalement, ajouter plus de routes / circuits, des ennemis et amèliorer la maniabilité de la bécane.
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: GOLDENEYE VR
|
||||||
|
subtitle: VR multiplayer retro classic remake
|
||||||
|
---
|
||||||
|
|
||||||
|
[](https://fr.wikipedia.org/wiki/GoldenEye_007)
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Le but est de se rapprocher un maximum de la version N64 mais en VR : restituer l'ambiance et les mécanismes de l'original mais en y étant. Un principe des plus simple :
|
||||||
|
transposer GoldenEye 64 en PC VR avec une compatibilité maximale (Oculus Rift(s), HTC Vive, Windows MR, etc...).
|
||||||
|
Je développe sous Unity avec l'api Photon pour le multiplayer. Pour les mécaniques, c'est du pur script! Le projet est à vocation open source,
|
||||||
|
destiné pour les fans de GoldenEye 64 et de VR, le but est de créer une communauté pour améliorer continuellement le jeu à la manière de GoldenEye Source.
|
||||||
|
|
||||||
|
---------------
|
||||||
|
### 
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
(Toutes les maps du jeu originales sont présentes bien entendu!)
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|
##### principal
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
##### in game
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---------------
|
||||||
|
### 
|
||||||
|
|
||||||
|
Suite au contexte de confinement, j'ai pû replonger dans le projet pour y avançer quelque peu.
|
||||||
|
Voici les petits ajouts et une petite update de la road map:
|
||||||
|
- Ajout de différents modèle de player (Connery, Brosnan et Craig)
|
||||||
|
- Ajout du plug-in Steam VR
|
||||||
|
- Ajout du plug-in Photon Voice qui gère le dialogue par voix dans le jeu
|
||||||
|
|
||||||
|
#### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---------------
|
||||||
|
### 
|
||||||
|
|
||||||
|
* Implémenter la création de room personnalisée pour faire des parties privée entre amis.
|
||||||
|
* Intégrer les différents modes de jeu (deathmatch, teammatch, capture the flag, the man with the golden gun, etc...)
|
||||||
|
* Ajouter des options de comfort comme la vignette lors du déplacement, la TP, le remappage des boutons.
|
||||||
|
* Et des features auxquels je n'ai pas encore pensé!
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
---
|
||||||
|
title: LA 2029
|
||||||
|
subtitle: VR Shooter
|
||||||
|
comments: false
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
C'est un FPS en VR pour la plateforme Oculus Quest où l'on tire sur des terminators se présentant.
|
||||||
|
|
||||||
|
La recharge se fait de manière manuelle avec le magasin vide à éjecter avant de se munir du nouveau magasin à sa ceinture pour
|
||||||
|
l'ammener à l'arme, ce qui recharge celle-ci.
|
||||||
|
Le but est de rejoindre la fin du niveau en tuant un maximum de Terminators et en restant en vie : simple et éfficace!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Je voulais tester de créer les scripts de mécanique de recharge manuelle de l'arme :
|
||||||
|
une fois le magasin vide enlevé, on prends celui situé à gauche sur la "ceinture" et finalement celui-ci mis en place, l'arme se recharge.
|
||||||
|
|
||||||
|
L'aspect "limitation technique" vu le support mobile Quest est aussi ce qui m'a motivé pour ce projet.
|
||||||
|
|
||||||
|
Suite à la sortie du jeu Terminator Resistance, j'ai vraiment accroché avec l'ambiance que les
|
||||||
|
devs ont réussis à créer et étant un fan des films, je me suis lançé.
|
||||||
|
C'est une version simple avec des assets téléchargées sur Sketchfab, le tout codé en une semaine.
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
La plateforme Quest étant limité en ressources ([Spécifications Oculus Quest](https://vr-compare.com/headset/oculusquest)), il fallait trouver un moyen d'optimiser le chargement des GameObjects en cours de niveau, j'ai donc implémenté le principe "d'object pooler".
|
||||||
|
|
||||||
|
Le principe s'articule autour de deux scripts fonctionnant de concert:
|
||||||
|
|
||||||
|
- Le premier script, l'ObjectPooler charge en début de scene un nombre défini d'instances de Gameobjects afin que ceux-ci soient disponibles et ainsi éviter des ralentissements en plein niveau.
|
||||||
|
|
||||||
|
- Le second se place sur des "Transform" où les GameObjects sont sensé apparaître. Un composant collider va déclencher l'apparition du GameObject dès que le joueur arrive à une certaine distance. Il suffit au script de piocher dans le "pool" des GameObjects chargés en début de scène.
|
||||||
|
|
||||||
|
<!--
|
||||||
|

|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
##### ObjectPooler.cs
|
||||||
|
|
||||||
|
```cs
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
public class ObjectPoolItem
|
||||||
|
{
|
||||||
|
public int amountToPool;
|
||||||
|
public GameObject objectToPool;
|
||||||
|
public bool shouldExpand;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ObjectPooler : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static ObjectPooler SharedInstance;
|
||||||
|
|
||||||
|
public List<GameObject> pooledObjects;
|
||||||
|
|
||||||
|
public List<ObjectPoolItem> itemsToPool;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
SharedInstance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start ()
|
||||||
|
{
|
||||||
|
pooledObjects = new List<GameObject>();
|
||||||
|
foreach (ObjectPoolItem item in itemsToPool)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < item.amountToPool; i++)
|
||||||
|
{
|
||||||
|
GameObject obj = (GameObject)Instantiate(item.objectToPool);
|
||||||
|
obj.SetActive(false);
|
||||||
|
pooledObjects.Add(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameObject GetPooledObject(string tag)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < pooledObjects.Count; i++) {
|
||||||
|
if (!pooledObjects[i].activeInHierarchy && pooledObjects[i].tag == tag) {
|
||||||
|
return pooledObjects[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (ObjectPoolItem item in itemsToPool) {
|
||||||
|
if (item.objectToPool.tag == tag) {
|
||||||
|
if (item.shouldExpand) {
|
||||||
|
GameObject obj = (GameObject)Instantiate(item.objectToPool);
|
||||||
|
obj.SetActive(false);
|
||||||
|
pooledObjects.Add(obj);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### ObjectLoader.cs
|
||||||
|
|
||||||
|
```cs
|
||||||
|
using UnityEngine;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
|
||||||
|
public class ObjectLoader : MonoBehaviour
|
||||||
|
{
|
||||||
|
public string prefabName;
|
||||||
|
|
||||||
|
private Transform spawnPoint;
|
||||||
|
|
||||||
|
private GameObject clone;
|
||||||
|
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
spawnPoint = this.transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnTriggerEnter(Collider col)
|
||||||
|
{
|
||||||
|
if(col.transform.tag == "Player")
|
||||||
|
{
|
||||||
|
LoadObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnTriggerExit(Collider col)
|
||||||
|
{
|
||||||
|
if(col.transform.tag == "Player")
|
||||||
|
{
|
||||||
|
UnloadObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoadObject()
|
||||||
|
{
|
||||||
|
GameObject clone = ObjectPooler.SharedInstance.GetPooledObject(prefabName);
|
||||||
|
if(clone != null)
|
||||||
|
{
|
||||||
|
clone.transform.position = spawnPoint.transform.position;
|
||||||
|
clone.transform.rotation = spawnPoint.transform.rotation;
|
||||||
|
clone.SetActive(true);
|
||||||
|
this.clone = clone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadObject()
|
||||||
|
{
|
||||||
|
if(clone != null)
|
||||||
|
{
|
||||||
|
clone.SetActive(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Suite aux critiques positive sur SideQuest, j'ai décidé de pousser un peu plus loin la complexité des mécanismes en scriptant un objectif:
|
||||||
|
détruire un batiment pour libérer le passage vers la fin du niveau.
|
||||||
|
Pour se faire, le joueur doit se munir d'une bombe à sa ceinture pour la déposer à un endroit spécifique qui déclenchera un compte à rebours,
|
||||||
|
puis l'explosion du batiment qui libèrera enfin l'accès vers la fin du niveau.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
En attendant le portage qui apportera des améliorations graphiques et au niveau du gameplay, voici une review sur Quest 2 :
|
||||||
|
|
||||||
|
{{< youtube 8Jfupw6VqgU >}}
|
||||||
|
|
||||||
|
La version 2.0 avec le deuxième level est disponible un peu plus bas en téléchargement via le sideloader Sidequest.
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Pour la suite du projet, on passe sur PC, on oublie Oculus et on plonge dans l'open source avec openXR pour le côté VR.
|
||||||
|
|
||||||
|
Par la même occassion, on bascule sur la dernière version d'Unity (2021.3.15), on corrige les petits bugs et on repasse les textures en standard (bye bye textures mobile sans UV maps!).
|
||||||
|
|
||||||
|
Reste à peupler un peu plus la map maintenant que l'on est plus limité par un chipset mobile et on se lançe vers un niveau 3!
|
||||||
|
|
||||||
|
V 3.0 on the way!
|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Télécharger la version 2.0 pour Oculus Quest (compatible Quest 2):
|
||||||
|
|
||||||
|
[](https://sdq.st/a/366)
|
||||||
|
|
||||||
|
[](https://sdq.st/a/366)
|
||||||
|
|
||||||
|
> (Oculus Quest nécessaire ainsi que SideQuest pour l'installation)
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: projet 1
|
|
||||||
tags: ["projet"]
|
|
||||||
---
|
|
||||||
|
|
||||||
### sous titre projet 1
|
|
||||||
|
|
||||||
le projet 1 est un tout nouveau projet ...
|
|
||||||
|
|
||||||

|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
title: projet 2
|
|
||||||
tags: ["projet2", "projet"]
|
|
||||||
---
|
|
||||||
|
|
||||||
le projet 2 est un tout nouveau projet ...
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
et bla !
|
|
||||||
|
|
||||||

|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
title: projet 3
|
|
||||||
tags: ["projet3", "projet"]
|
|
||||||
---
|
|
||||||
|
|
||||||
le projet 3 est un projet de code
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
bla bla bla
|
|
||||||
bla bla bla bla bla bla bla bla bla
|
|
||||||
bla bla bla bla bla bla bla bla bla bla bla bla
|
|
||||||
bla bla bla !
|
|
||||||
|
|
||||||
bla bla bla bla bla bla :
|
|
||||||
- bla bla bla
|
|
||||||
- bla bla
|
|
||||||
|
|
||||||
{{< youtube ZSWzPI4BqvA >}}
|
|
||||||
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
---
|
||||||
|
title: RETRO ARCADE GAME
|
||||||
|
subtitle: A tribute to retro classics
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 
|
||||||
|
|
||||||
|
Le but est de fournir un jeu ludique et personalisé pour mes neveux, dans l'esprit
|
||||||
|
des jeux codés fin des années 90 : plateforme 2D à niveaux themés.
|
||||||
|
Pour ce faire, nous allons récupérer un tas de "sprites" (animation 2D ou suite de différentes poses du personnage) ainsi que des décors pour créer des scènes sous Unity.
|
||||||
|
|
||||||
|
Ensuite, le plus dur est de codé les mécanismes de jeu... mais heureusement, il y a des tutos pour ça! (voir youtube, tutos, unity)
|
||||||
|
Le cahier des charges est le suivant:
|
||||||
|
- Un level type Mario World
|
||||||
|
- Un level type Sonic
|
||||||
|
- Un level type R-type
|
||||||
|
- Un Level de type Street of Rage
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Cela fait un petit bout de temps que je voulais mettre en ligne la version 2 de mon projet de jeu mais des querelles de versions entre Unity et son plugin WebGL ainsi que le boulot m'ont
|
||||||
|
freiné dans le processus, mais voilà la V2.0 avec un niveaux vraiment complet ainsi que pleins de nouvelles mécaniques est là!
|
||||||
|
|
||||||
|
Un petit listing des updates:
|
||||||
|
- Ajout d'un Game Manager qui persiste entre les scènes (persiste le score et les vies)
|
||||||
|
- Le coup de poing est disponible avant l'arme
|
||||||
|
- Le player peut désormais s'agenouiller
|
||||||
|
- Ajout des dragons cracheurs de boule de feu
|
||||||
|
- Ajout du boss Bowser
|
||||||
|
- Ajout d'un Menu avec choix du perso
|
||||||
|
- Nouveau HUD (affichage des vies et du score)
|
||||||
|
- Nouveaux FX visuels
|
||||||
|
J'ai dû en oublier mais l'essentiel est là. Pour essayer, toujours le même lien en dessous,
|
||||||
|
Pour les commandes, les manettes type Xbox360 sont reconnus ainsi que le clavier, control pour tirer, espace pour sauter
|
||||||
|
|
||||||
|
> Version webGL (dans le navigateur):
|
||||||
|
[](../../docs/webgl/index.html)
|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Nouvelle version avec un troisième level!
|
||||||
|
Beaucoup d'améliorations au niveau des animations et du gameplay:
|
||||||
|
- Affinage du code des ennemis,
|
||||||
|
- Ajout d'ennemis au niveau 2 (Sonic)
|
||||||
|
- Ajout niveau 3 : Star wars en mode R-type pour ceux qui ont connus
|
||||||
|
- Ajout du menu pause avec l'option quitter
|
||||||
|
- Build Android avec contrôles tactiles
|
||||||
|
|
||||||
|
> Télécharger au format APK:
|
||||||
|
[](../../docs/android/EwannEtMilhauVSVideoGames.apk)
|
||||||
|
|
||||||
|
------
|
||||||
|
### 
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
(Les références à "One piece" & "Yu-Gi-Oh!", c'est pour mes neveux...)
|
||||||
@@ -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
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
version: '3.9'
|
version: '3.9'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
||||||
hugo:
|
hugo:
|
||||||
image: nginx:alpine
|
image: nginx:alpine
|
||||||
container_name: hugo-site
|
container_name: hugo-site
|
||||||
volumes:
|
volumes:
|
||||||
- ./nginx-docker:/etc/nginx/conf.d
|
- ./nginx-proxy:/etc/nginx/conf.d
|
||||||
- ./public:/var/www/html
|
- ./public:/var/www/html
|
||||||
ports:
|
ports:
|
||||||
- 6060:80
|
- 6060:80
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="{{ .Site.Language.Lang }}">
|
||||||
|
<head>
|
||||||
|
{{ partial "head.html" . }}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{ partial "header.html" . }}
|
||||||
|
<main class="container">
|
||||||
|
{{ block "main" . }}{{ end }}
|
||||||
|
</main>
|
||||||
|
{{ partial "footer.html" . }}
|
||||||
|
{{ $js := resources.Get "js/main.js" | minify | fingerprint }}
|
||||||
|
<script src="{{ $js.RelPermalink }}" defer></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
<header class="page-header">
|
||||||
|
<p class="eyebrow">{{ .Section }}</p>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
{{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
|
||||||
|
</header>
|
||||||
|
<div class="prose">{{ .Content }}</div>
|
||||||
|
{{ end }}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
<article class="article">
|
||||||
|
<header class="page-header">
|
||||||
|
<p class="eyebrow">{{ .Section }}</p>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
{{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
|
||||||
|
</header>
|
||||||
|
<div class="prose">{{ .Content }}</div>
|
||||||
|
</article>
|
||||||
|
{{ end }}
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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>
|
||||||
@@ -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 }}
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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 }}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{{ $iconClass := .Get 0 }}
|
||||||
|
{{ $sizeClass := .Get 1 }}
|
||||||
|
|
||||||
|
<a target="_blank" rel="noopener noreferrer">
|
||||||
|
<i class="{{ $iconClass }} {{ $sizeClass }}"></i>
|
||||||
|
</a>
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# config pour le nginx dans le caontainer
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
listen [::]:80;
|
|
||||||
server_name localhost;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
root /var/www/html;
|
|
||||||
index index.html index.htm;
|
|
||||||
}
|
|
||||||
|
|
||||||
error_page 404 /404.html; # Here and below is 404 error handling docs tried to describe
|
|
||||||
location = /404.html {
|
|
||||||
root /var/www/html;
|
|
||||||
}
|
|
||||||
|
|
||||||
error_page 500 502 503 504 /50x.html;
|
|
||||||
location = /50x.html {
|
|
||||||
root /var/www/html;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# HTTP
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
listen [::]:80;
|
|
||||||
|
|
||||||
server_name example.com;
|
|
||||||
|
|
||||||
client_max_body_size 64M;
|
|
||||||
|
|
||||||
# Redirection HTTP -> HTTPS
|
|
||||||
#return 301 https://$host$request_uri;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Host $server_name;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_pass http://127.0.0.1:6666;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Nécessaire pour les redirections internes à Hugo
|
|
||||||
location /feed {
|
|
||||||
return 302 https://example.com/index.xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
# HTTPS
|
|
||||||
server{
|
|
||||||
listen 443 ssl http2;
|
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
|
|
||||||
server_name example.com;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Host $server_name;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_pass http://127.0.0.1:6666;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Nécessaire pour les redirections internes à Hugo
|
|
||||||
location /feed {
|
|
||||||
return 302 https://example.com/index.xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ssl on;
|
|
||||||
#ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
|
||||||
#ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
|
||||||
|
|
||||||
access_log /var/log/nginx/hugo_access.log;
|
|
||||||
error_log /var/log/nginx/hugo_error.log;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# HTTP
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
client_max_body_size 64M;
|
||||||
|
|
||||||
|
# Redirection HTTP -> HTTPS
|
||||||
|
#return 301 https://$host$request_uri;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /var/www/html/;
|
||||||
|
index index.html;
|
||||||
|
# proxy_buffering off;
|
||||||
|
# proxy_redirect off;
|
||||||
|
# proxy_set_header Host $host;
|
||||||
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
# proxy_set_header X-Forwarded-Host $server_name;
|
||||||
|
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
# proxy_pass http://127.0.0.1:6060;
|
||||||
|
}
|
||||||
|
# Nécessaire pour les redirections internes à Hugo
|
||||||
|
location /feed {
|
||||||
|
return 302 https://example.com/index.xml;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 334 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 723 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<path d="M5.583 7.229c-2.464-0.005-5.755 1.557-5.573 5.479 0.281 6.125 6.557 6.693 9.068 6.745 0.271 1.146 3.224 5.109 5.411 5.318h9.573c5.74-0.38 10.036-17.365 6.854-17.427-5.271 0.25-8.396 0.375-11.073 0.396v5.297l-0.839-0.365-0.005-4.932c-3.073 0-5.781-0.141-10.917-0.396-0.646-0.005-1.542-0.115-2.5-0.115zM5.927 9.396h0.297c0.349 3.141 0.917 4.974 2.068 7.781-2.938-0.349-5.432-1.198-5.891-4.38-0.24-1.646 0.563-3.365 3.526-3.401zM17.339 12.479c0.198 0.005 0.406 0.042 0.594 0.13l1 0.432-0.714 1.302c-0.109 0-0.219 0.016-0.323 0.052-0.464 0.151-0.708 0.604-0.542 1.021 0.036 0.083 0.089 0.161 0.151 0.229l-1.234 2.25c-0.099 0-0.203 0.016-0.297 0.052-0.464 0.146-0.708 0.604-0.542 1.016 0.172 0.417 0.682 0.63 1.151 0.479 0.464-0.146 0.703-0.604 0.536-1.021-0.047-0.109-0.115-0.208-0.208-0.292l1.203-2.188c0.13 0.010 0.26 0 0.391-0.042 0.104-0.031 0.198-0.083 0.281-0.151 0.464 0.198 0.844 0.354 1.12 0.49 0.406 0.203 0.552 0.339 0.599 0.49 0.042 0.146-0.005 0.427-0.24 0.922-0.172 0.37-0.458 0.896-0.797 1.51-0.115 0-0.229 0.016-0.333 0.052-0.469 0.151-0.708 0.604-0.542 1.021 0.167 0.411 0.682 0.625 1.146 0.479 0.469-0.151 0.708-0.604 0.542-1.021-0.042-0.099-0.104-0.193-0.182-0.271 0.333-0.609 0.62-1.135 0.807-1.526 0.25-0.536 0.38-0.938 0.266-1.323s-0.469-0.635-0.932-0.865c-0.307-0.151-0.693-0.313-1.146-0.505 0.005-0.109-0.010-0.214-0.052-0.318s-0.109-0.198-0.193-0.281l0.703-1.281 3.901 1.682c0.703 0.307 0.995 1.057 0.651 1.682l-2.682 4.906c-0.339 0.625-1.182 0.885-1.885 0.578l-5.516-2.38c-0.703-0.307-0.995-1.057-0.656-1.682l2.682-4.906c0.234-0.432 0.708-0.688 1.208-0.708h0.083z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 850 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 938 KiB |
|
After Width: | Height: | Size: 539 KiB |
|
After Width: | Height: | Size: 729 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 393 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 510 KiB |
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 525 KiB |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 746 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 318 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 599 KiB |
|
After Width: | Height: | Size: 918 KiB |
|
After Width: | Height: | Size: 100 KiB |