Refonte de mon site vitrine : du PHP « statique » à un écosystème modulaire en Flask, Next.js & PostgreSQL

Temps de lecture estimé: 4 minutes

🔍 Préambule

Ce projet est plus qu’un simple CV en ligne. J’ai conçu une architecture modulaire composée de trois applications distinctes — toutes exposées publiquement :

  • 🧠 Une API REST en Python/Flask
  • 🛠️ Un backoffice d’administration en Next.js
  • 🌐 Un site vitrine / CV dynamique en Python/Flask

Chacune de ces applications est déployée en production, mais je propose également une version démo de l’ensemble pour permettre à d’autres de tester librement les fonctionnalités.

Enfin, l’ensemble du code source est disponible en accès libre sur mon GitLab, pour celles et ceux qui souhaiteraient explorer le projet ou s’en inspirer.

Pourquoi refaire mon site vitrine ?

Depuis plusieurs années, mon site personnel me sert de CV en ligne. À l’origine, il s’agissait d’un site PHP développé avec CodeIgniter, utilisé principalement pour :

  • Le routing
  • La gestion de formulaires (ex. : envoi d’e-mail)
  • Quelques fonctionnalités annexes

Mais le cœur du contenu (notamment mon CV) était intégralement écrit en dur dans les templates HTML (un template pour le français, un template pour l’anglais). Difficile à maintenir, difficile à faire évoluer.

timeline-experience
Expériences hardcodées

Je l’ai fait initialement de cette manière par manque de temps. J’ai eu envie d’un projet plus structuré, plus dynamique, et surtout d’un terrain de jeu pour expérimenter de nouvelles technologies.


🧪 Pourquoi trois applis séparées ?

Ce choix est volontaire et pédagogique. En séparant mon projet en 3 blocs indépendants, je voulais :

  • Jouer avec différentes technos (React/Next, Flask, PostgreSQL, Redis…)
  • Me créer un environnement plus proche de ce qu’on peut voir en production :
    • Une API exposée
    • Un backoffice d’administration
    • Un front de présentation publique
  • M’exercer à la modularité et à la séparation des responsabilités

🏗️ Une refonte complète autour de trois applications

1. 🧠 Une API centrale en Python + Flask

API-postman
API-postman

J’ai commencé par développer une API REST en Python avec Flask. Cette API gère tout le CRUD des entités principales de mon CV :

  • About (le texte d'accueil)
  • User
  • APIKey
  • Services
  • Experiences
  • Diploma
  • Languages
  • Keyword

Ainsi qu’une passerelle pour l’envoi d’emails, qui utilise l’API Graph de Microsoft (via OAuth2).

Quelques choix techniques notables :

  • 🔧 Pas d’ORM : Requêtes SQL écrites à la main pour un contrôle total
  • 🗃️ Base de données : PostgreSQL
  • ⚡️ Redis utilisé pour appliquer du rate limiting sur les appels API

à défaut d’avoir fait une documentation, une collection Postman est disponible sur mon gitlab .

2. 🛠️ Un backoffice admin en Next.js + React

interface-backoffice-nextjs-liste-experience
Liste des expériences sur l’interface d’administration

Je voulais aussi explorer React et Next.js, deux technos largement utilisées côté front.

J’ai donc développé une interface d’administration en Next.js (avec TypeScript), pour gérer facilement la modifications des données, des images et des PDF de mon CV :

  • Ajout/modification/suppression d’expériences, de compétences, de formations…
  • Visualisation rapide des données

Cela m’a permis de :

  • Prendre en main un framework React moderne
  • Apprendre la logique des composants, des hooks, du routeur App Router, etc.

3. 🌐 Un site vitrine dynamique en Flask

Enfin, j’ai refait mon site vitrine (le CV en ligne) toujours avec Flask, mais cette fois :

  • J’utilise SQLAlchemy comme ORM (pour changer par rapport à l’API)
  • Le rendu HTML est généré côté serveur (avec Jinja2), mais basé sur des données vivantes

🚀 Déploiement en production et en démo

🔄 Déploiement automatique de la version demo

La version de démonstration est automatiquement déployée grâce à GitLab CI/CD :

Cela me permet de tester en conditions réelles la dernière version de mes applications, sans avoir à intervenir manuellement.

🧼 Réinitialisation automatique de la démo

Un cron job régulier s’assure que la version démo reste propre et fonctionnelle :

  • La base de données est réinitialisée
  • Les fichiers sensibles sont supprimés (logos, PDF…)
  • Cela permet à chaque visiteur de :
    • Tester l’application dans de bonnes conditions
    • Éviter tout débordement (ex. : images ou fichiers malveillants ou inappropriés)

🛠️ Mise à jour de la production

Le déploiement en production, quant à lui, reste manuel. Cela me permet de :

  • M’assurer que les versions déployées sont stables
  • Ne pas exposer de fonctionnalités expérimentales
  • Garder le contrôle sur l’environnement live

J’ai fait un article si tu souhaite en savoir plus sur mon infra.

⚠️ Disclaimer

Ce projet reste un side project, développé sur mon temps personnel, dans une logique de preuve de concept (POC).

Il fonctionne globalement bien, mais je tiens à préciser quelques points importants pour toute personne qui souhaiterait :

  • explorer le code,
  • déployer les applications,
  • ou simplement comprendre l’architecture :

💬 Peu (ou pas) de documentation :

  • Les fichiers README.md sont vides
  • L’API n’est pas documentée (pas de Swagger ou autre.. mais une collection Postman)
  • Les fichiers .env nécessaires à chaque application ne sont pas décrits en détail

🔍 Code encore perfectible :

  • Certains edge cases ne sont pas gérés
  • Des améliorations sont possibles un peu partout : fonctionnalité, structure, robustesse, sécurité, etc.

🎯 Cela dit, le fonctionnement global est assuré, et l’objectif initial — proposer un CV en ligne dynamique, administrable et bien découpé — est atteint.

🔚 Conclusion : un projet personnel devenu terrain d’expérimentation

Ce projet de refonte m’a permis de :

  • Remettre à jour mon site vitrine, mais aussi mon niveau technique
  • Me former sur React / Next.js tout en consolidant Flask
  • Apprendre à mieux structurer une application multi-services

Partagez l'article:
FacebookTwitterEmailLinkedIn

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.