Ce site
Projet personnel, 2026
Un portfolio statique conçu pour présenter mon profil en vue d’un stage à l’étranger à l’été 2027, et exploité comme un service en production : infrastructure as code, déploiement automatisé, aucun identifiant longue durée, quelques euros par mois.
En un coup d’œil
- A+Mozilla Observatory, 12/12 tests
- ≥ 95Lighthouse, imposé en CI
- 0 cléstockée : déploiement via OIDC
- 2 USDalerte budget mensuelle
Architecture
Pipeline de déploiement
- 1BuildSite statique Astro
- 2Scan codeSAST, secrets
- 3Scan infraCheckov sur Terraform
- 4LighthouseChaque catégorie ≥ 95
- 5HTML et liensValide, sans lien cassé
- 6Deploymain, via OIDC
- 7InvalidateCache CloudFront
- Les merge requests lancent toutes les vérifications, sans jamais déployer
- Un seul déploiement à la fois
- État Terraform dans S3, verrouillé
- Renovate chaque semaine, versions ≥ 14 jours
Sécurité
- Bucket S3 privé
Accès public bloqué ; CloudFront seul, via OAC.
- CSP et en-têtes stricts
default-src 'none', HSTS 2 ans, sans en-tête Server.
- Aucun code inline
Ni script ni style inline : aucune exception CSP.
- HTTPS uniquement
TLS 1.2 minimum, certificat ACM.
- Déploiement sans clé
Rôle OIDC limité à ce projet et à main.
- SAST et détection de secrets
SAST et détection de secrets à chaque pipeline.
- Mozilla Observatory A+
130 sur 100, les 12 tests réussis.
- Checkov sur Terraform
Règles ignorées documentées ; toute alerte échoue.
Coût
- Hébergement
- Site entièrement statique : pas de serveur, pas de base de données, rien qui ne facture quand il ne sert à rien.
- CDN
- CloudFront PriceClass_100, les emplacements edge les moins chers (Europe et Amérique du Nord).
- Routage
- Une CloudFront Function sert index.html pour les sous-pages, largement dans le niveau gratuit.
- Supervision
- Tout reste dans le niveau gratuit d’AWS.
- Garde-fou
- Une alerte AWS Budgets m’envoie un e-mail à 80 % de la limite, et quand la prévision la dépasse.
- Limite de budget
- 2 USD / mois
Supervision
- toutes les 5 minVérification de disponibilité
Une petite Lambda Python vérifie que le site répond 200 avec le contenu attendu.
- quotidienCanary navigateur
Un canary CloudWatch Synthetics ouvre la page d’accueil et cette étude de cas dans un vrai navigateur et échoue à la moindre erreur de console, y compris les violations de CSP.
- en cas d’échecAlarmes par e-mail
Chaque vérification a une alarme CloudWatch qui m’envoie un e-mail via SNS, et un autre quand le site est rétabli.
Les statistiques de visite viennent des rapports intégrés de CloudFront : pas de script de suivi, pas de cookies, pas de bandeau de consentement.
Qualité
- Lighthouse CI
Audite chaque page avant le déploiement et fait échouer le pipeline si une catégorie passe sous 95.
- HTML valide
Chaque page est vérifiée pour un HTML valide et accessible, et pour les liens cassés.
- Mode sombre
Suit le réglage du système, mémorise le choix du visiteur sans flash, et garde chaque paire de couleurs au-dessus du contraste WCAG AA.
- Feuille d’impression
Un PDF propre pour les recruteurs : pas de navigation, couleurs claires, coordonnées écrites en toutes lettres.
Tous les détails techniques
Objectif
- Présenter mon profil aux recruteurs pour un stage à l’étranger à l’été 2027.
- L’exploiter comme un service en production : infrastructure as code, déploiement automatisé, aucun identifiant longue durée, et un budget mensuel de quelques euros.
Sécurité
- Bucket S3 privé : tout accès public est bloqué et seule ma distribution CloudFront peut le lire, via Origin Access Control.
- Content Security Policy stricte (default-src 'none', scripts, styles et polices depuis 'self' uniquement), HSTS pendant deux ans, X-Frame-Options DENY, une Permissions-Policy restrictive, et l’en-tête Server supprimé.
- Le site ne contient aucun script ni style inline, la CSP n’a donc besoin d’aucune exception.
- HTTPS uniquement, TLS 1.2 minimum, avec un certificat ACM pour le domaine et www.
- GitLab CI déploie via OIDC : aucune clé AWS n’est stockée nulle part. Le rôle est limité à ce projet et à la branche main, et ne peut écrire que dans ce bucket et invalider cette distribution.
- La SAST et la détection de secrets de GitLab s’exécutent à chaque pipeline.
- Mozilla Observatory note les en-têtes de sécurité A+ (130 sur 100, les 12 tests réussis).
- Checkov analyse le code Terraform à chaque pipeline. Chaque règle que j’ignore est documentée avec sa raison, le plus souvent le coût (WAF, KMS) ou l’inadéquation à un site statique ; toute nouvelle alerte fait échouer le build.
Coût
- Site entièrement statique : pas de serveur, pas de base de données, rien qui ne facture quand il ne sert à rien.
- CloudFront PriceClass_100, les emplacements edge les moins chers (Europe et Amérique du Nord).
- Une alerte AWS Budgets m’envoie un e-mail à 80 % d’une limite mensuelle de 2 USD, et quand la prévision la dépasse.
- Une CloudFront Function sert index.html pour les sous-pages, largement dans le niveau gratuit.
Déploiement
- Toutes les ressources AWS sont définies en Terraform.
- Chaque push sur main construit le site, lance les scans de sécurité, puis le synchronise vers S3 et invalide le cache CloudFront.
- Les fichiers avec empreinte sont mis en cache un an ; le HTML est revalidé à chaque visite, donc une nouvelle version est en ligne juste après le déploiement.
- Un seul déploiement peut s’exécuter à la fois.
- L’état Terraform est dans S3 : versionné, chiffré, avec un verrouillage natif pour que deux apply ne s’exécutent jamais en même temps.
- Les merge requests lancent toutes les vérifications mais ne déploient jamais ; seule main peut assumer le rôle de déploiement.
- Renovate ouvre chaque semaine une merge request pour les dépendances obsolètes (npm, images CI, providers Terraform), uniquement pour les versions publiées depuis au moins 14 jours.
Qualité
- Lighthouse CI audite chaque page avant le déploiement et fait échouer le pipeline si une catégorie passe sous 95.
- Chaque page est vérifiée pour un HTML valide et accessible, et pour les liens cassés.
- Le mode sombre suit le réglage du système, mémorise le choix du visiteur sans flash, et garde chaque paire de couleurs au-dessus du contraste WCAG AA.
- Une feuille de style d’impression donne aux recruteurs un PDF propre : pas de navigation, couleurs claires, coordonnées écrites en toutes lettres.
Supervision
- Toutes les 5 minutes, une petite Lambda Python vérifie que le site répond 200 avec le contenu attendu.
- Une fois par jour, un canary CloudWatch Synthetics ouvre la page d’accueil et cette étude de cas dans un vrai navigateur et échoue à la moindre erreur de console, y compris les violations de CSP.
- Chaque vérification a une alarme CloudWatch qui m’envoie un e-mail via SNS, et un autre quand le site est rétabli.
- Les statistiques de visite viennent des rapports intégrés de CloudFront : pas de script de suivi, pas de cookies, pas de bandeau de consentement.
- Tout reste dans le niveau gratuit d’AWS.
Ce que j’améliorerais ensuite
- Citer une recommandation LinkedIn de mon maître d’apprentissage chez EDF, quand j’en aurai une.
Contact
M’écrireLinkedInBasé à Lyon, France
Dernière mise à jour