Skip to content

Architecture technique

Schema detaille

  Navigateur
      |
      | HTTPS
      v
+-----+------+       +------------------+
|  Frontend  |       |     Backend      |
|   React    +------>|    Hono API      |
|  (Nginx)   | /api  |   SQLite (WAL)   |
+------------+       +--------+---------+
                              |
                    HTTP POST | /caddy/reload
                    HTTP GET  | /logs
                   (Bearer)   |
                              v
                  +-----------+---------+
                  |       Agent         |
                  |      Hono API       |
                  +----+----------+-----+
                       |          |
            POST /load |          | read file
                       v          v
                  +----+----+ +---+--------+
                  |  Caddy  | | access.log |
                  |  Admin  | |  (JSON)    |
                  |   API   | +------------+
                  +---------+

Stack technique

CoucheTechnologie
FrontendReact 19, TanStack Router, TanStack Query, Tailwind CSS
BackendHono.js, Better Auth, Drizzle ORM
Base de donneesSQLite (better-sqlite3, mode WAL)
AgentHono.js (service leger sans BDD)
RuntimeNode.js 22+
Package managerpnpm 9.15 (monorepo workspaces)
ConteneurisationDocker multi-stage, Nginx (frontend)

Modele de donnees

users

ColonneTypeDescription
idTEXT PKIdentifiant unique
nameTEXTNom de l'utilisateur
emailTEXT UNIQUEAdresse email
roleTEXTadmin ou user
bannedBOOLEANCompte banni
createdAtTIMESTAMPDate de creation

vhosts

ColonneTypeDescription
idINTEGER PKAuto-increment
domainTEXT UNIQUENom de domaine
configTEXTConfiguration Caddyfile
enabledBOOLEANVhost actif ou non
upstreamTEXTURL upstream (optionnel)
createdAtTIMESTAMPDate de creation
updatedAtTIMESTAMPDerniere modification

changelog

ColonneTypeDescription
idINTEGER PKAuto-increment
userIdTEXT FKReference vers users.id
actionTEXTcreate, update, delete, toggle
domainTEXTDomaine concerne
diffTEXTJSON ancien/nouveau config
createdAtTIMESTAMPDate de la modification

Communication hub / agent

La communication se fait en HTTP avec header Authorization: Bearer <AGENT_TOKEN> :

OperationMethodeEndpointDescription
RechargementPOST/caddy/reloadEnvoie le Caddyfile complet
LogsGET/logsLit les logs d'acces
Health checkGET/healthSans authentification

Generation du Caddyfile

  1. Recuperation des vhosts actifs (enabled = true)
  2. Construction du bloc global (email ACME, logs Caddy)
  3. Concatenation des blocs : domaine { config }
  4. Envoi a l'API admin Caddy (POST /load)
  5. En cas d'echec : rollback de la modification en base

Exemple de Caddyfile genere :

nginx
{
  email admin@exemple.com
  log {
    output file /var/log/caddy/caddy.log
    format json
  }
}

app.exemple.com {
  reverse_proxy http://backend:8080
  log {
    output file /var/log/caddy/access.log {
      roll_size 100mb
      roll_keep 5
    }
    format json
  }
}