Projet personnel
Ce portfolio
Un portfolio dans la stack de mon stage, où le serveur ne fait que ce qui a besoin d’un serveur. Auto-hébergé, comme le reste.
- Période
- octobre 2026
- Rôle
- Seul
- Technologies
Le serveur ne sert que ce qui a besoin d’un serveur
Le contenu d’un portfolio change quelques fois par an. Le servir depuis une base de données à chaque visite aurait ajouté de la mémoire consommée, du code exposé et une page blanche le jour où l’API tombe.
Le texte vit donc dans le code du front. Au build, chaque page est rendue en HTML statique par React : elle s’affiche avant même que le JavaScript soit chargé, et reste en ligne si l’API est arrêtée.
L’API Spring Boot ne s’occupe que du formulaire de contact, de la lecture des messages, et des mesures du Raspberry Pi affichées sur l’accueil. Là, un serveur a une vraie raison d’exister : valider, filtrer, stocker, protéger l’accès, lire la machine.
Un formulaire de contact qui ne se fait pas spammer
Pas d’adresse e-mail en clair sur le site, pour ne pas la donner aux robots. Le formulaire filtre en plusieurs couches. nginx limite le nombre d’envois par visiteur. Un champ invisible piège les robots qui remplissent tout, et un envoi plus rapide qu’un humain est ignoré. Dans les deux cas, l’API répond comme si de rien n’était, pour ne rien leur apprendre. Enfin, un plafond quotidien global empêche de remplir la base en changeant d’adresse.
Quand un message arrive, mon téléphone reçoit une notification ntfy. Elle ne contient ni le nom ni le texte, seulement le lien vers l’administration. Les messages sont supprimés automatiquement au bout d’un an.
Tout refuser, puis ouvrir au cas par cas
Spring Security refuse toute route qui n’est pas explicitement listée. L’administration s’authentifie en HTTP Basic à chaque requête, avec un mot de passe haché en BCrypt et sans session : le navigateur n’envoie jamais d’identifiants de lui-même, il n’y a donc rien à exploiter par CSRF.
Comme sur Tima, chaque règle d’accès a son test : sans identifiants, mauvais mot de passe, route non déclarée, champ ajouté au formulaire pour tenter de marquer un message comme lu. Les tests d’intégration tournent sur un vrai PostgreSQL lancé par Testcontainers, pas sur une base en mémoire qui se comporte autrement.
Côté nginx : politique de sécurité du contenu stricte (aucun script en ligne, aucune ressource tierce, polices comprises), HSTS, refus d’affichage dans un cadre. L’API et la base n’ont aucun port publié.
Clair, comme une page produit
Le site s’inspire des pages produit d’Apple : blanc et gris très clair en bandes, une seule police sans-serif, peu de texte et de grands visuels. Mes applis sont montrées dans un cadre de navigateur ou de téléphone, dessiné en CSS ; les projets sans capture montrable ont un schéma dessiné à la main.
Les mesures du Raspberry Pi, température, durée depuis le dernier démarrage et charge, sont lues dans /sys et /proc par l’API au moment de la visite, et affichées en grands chiffres comme une fiche technique.