Projets

Starter full-stack

Une fondation de production pour les projets Next.js et Django

Année
2026
Type
Indépendant
Rôle
Auteur
Statut
Maintenu

La fondation réutilisable que j’ai extraite des bases de code d’Au Cœur du Népal et de LWNF : authentification renforcée, primitives d’API, outils de contenu bilingue, piles Docker de développement et de production, CI, sauvegardes et outillage de mise en production. Les nouveaux projets, dont ce site, en partent.

Contexte

Après deux projets en production sur la même pile, les mêmes problèmes revenaient : rotation des jetons, verrouillage, parcours e-mail, pagination sans doublons, en-têtes de cache, sauvegardes restaurables. Le starter réunit les versions de ces solutions qui ont résisté aux revues.

Approche

Les modules ont été repris des deux projets sources et leurs points d’intégration adaptés, en excluant données clients, identifiants, photographies et fonctionnalités métier (dons, exploitation de treks). Un manifeste de provenance indique l’origine de chaque fichier.

Un générateur copie le starter sans dépendances, secrets, données ni historique Git, le renomme et crée de nouveaux secrets. Aucun mot de passe administrateur n’est partagé par défaut.

Architecture du système

Frontend

  • Next.js 16 · App Router · BFF

    Des routes de même origine gardent les jetons dans des cookies HttpOnly ; les mutations vérifient l’en-tête Origin.

    Appelle Identité · Appelé par Compose · Nginx

Backend

  • Identité · JWT · sessions · MFA

    Vérification d’e-mail, gestion des mots de passe, rotation des jetons avec détection de rejeu, révocation de session, verrouillage, TOTP.

    Appelle core/, PostgreSQL · Redis · Appelé par Next.js 16

  • core/ · Primitives d’API

    Enveloppes de réponse, pagination stable, modèles publiables, champs bilingues, assainissement, stockage et revalidation.

    Appelé par Identité

  • PostgreSQL · Redis · Données · cache · file

    PostgreSQL pour les données ; Redis pour le cache, le verrouillage et le broker Celery.

    Appelle Celery · Beat (asynchrone) · Appelé par Identité, Sauvegardes

  • Celery · Beat · E-mails · planification

    E-mails à gabarits et planifications en base.

    Appelé par PostgreSQL · Redis

Exploitation

  • Compose · Nginx · Piles dev et prod

    Piles de développement et de production, routage TLS, processus non-root, sondes de santé et tâche de migration.

    Appelle Next.js 16 (asynchrone) · Appelé par CI · release

  • CI · release · Images au commit exact

    Vérifications, audits de dépendances, intégration PostgreSQL et tests navigateur en HTTPS conditionnent la publication ; le déploiement utilise des références d’image immuables.

    Appelle Compose · Nginx (asynchrone)

  • Sauvegardes · Locales · distantes

    Sauvegardes quotidiennes vérifiées, avec procédure de restauration.

    Appelle PostgreSQL · Redis (asynchrone)

Décisions techniques

Pourquoi extraire un starter plutôt qu’utiliser un modèle public ?

Décision

Construire la fondation à partir de code déjà éprouvé en production et audité, plutôt que d’un modèle générique.

Pourquoi

Chaque module arrive avec les tests de régression et les commentaires qui expliquent la défaillance qu’il évite : c’est ce qui rend sa réutilisation sûre.

Compromis

Opiniâtre : il suppose Next.js, Django, PostgreSQL et Docker, et doit être tenu à jour à la main.

Infrastructure et déploiement

Piles Compose de développement et de production, routage TLS par Nginx, processus de production non-root, sondes de santé et tâche de migration. La publication sur GHCR dépend de la réussite des vérifications sur le commit exact ; le déploiement utilise des références d’image immuables et une sauvegarde quotidienne vérifiée.

Technologies

  • TypeScript
  • Next.js
  • Django
  • Django REST Framework
  • Celery
  • PostgreSQL
  • Redis
  • Docker
  • Nginx
  • GitHub Actions
  • Playwright
esc