← Tous les projets

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.

Lire l’article : Terraform, OIDC et une CSP stricte →

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

Architecture de ce siteGitLab CI construit le site et le dépose dans un bucket S3 privé grâce à OIDC. CloudFront lit le bucket via Origin Access Control et sert les visiteurs en HTTPS avec des en-têtes de sécurité. Terraform définit les ressources AWS.VisiteurnavigateurHTTP/3CloudFrontHTTPS, en-têtesTLS 1.2+CSPHSTSS3bucket privéPrivéOAC seulGitLab CIbuild, scansOIDCSASTCheckovrequêteOACsync OIDCTerraformS3, CloudFront, ACM,IAM, Budgets, alarmesétat dans S3verrouilléArchitecture de ce siteGitLab CI construit le site et le dépose dans un bucket S3 privé grâce à OIDC. CloudFront lit le bucket via Origin Access Control et sert les visiteurs en HTTPS avec des en-têtes de sécurité. Terraform définit les ressources AWS.GitLab CIbuild, scansOIDCSASTCheckovS3bucket privéPrivéOAC seulCloudFrontHTTPS, en-têtesTLS 1.2+CSPHSTSVisiteurnavigateurHTTP/3sync OIDCOACrequêteTerraformS3, CloudFront, ACM, IAM, Budgets, alarmesétat dans S3verrouillé

Pipeline de déploiement

  1. 1BuildSite statique Astro
  2. 2Scan codeSAST, secrets
  3. 3Scan infraCheckov sur Terraform
  4. 4LighthouseChaque catégorie ≥ 95
  5. 5HTML et liensValide, sans lien cassé
  6. 6Deploymain, via OIDC
  7. 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 min
    Vérification de disponibilité

    Une petite Lambda Python vérifie que le site répond 200 avec le contenu attendu.

  • quotidien
    Canary 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’échec
    Alarmes 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’écrireLinkedIn

Basé à Lyon, France

Dernière mise à jour

Télécharger le CV (en anglais)Contact