Commit Graph

14 Commits

Author SHA1 Message Date
c1519bff2e docs: clarifie le déploiement Docker (host vs bridge)
- README racine : section Docker réécrite avec distinction Linux
  natif (host mode, découverte LAN active) vs macOS/Windows/Docker
  Desktop (override bridge, découverte désactivée). Mention de la
  contrainte Compose v2.24+.
- docker/README.md : pré-requis précisés, limitation Docker Desktop
  documentée explicitement.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:33:24 +02:00
0685fcd2c5 fix(docker): garantit l'existence de /app/public au build
Le dossier public/ étant vide n'était pas tracké par git, donc
absent après clone sur une machine Linux. Le COPY runner échouait
sur 'failed to compute cache key: "/app/public": not found'.

- Ajoute public/.gitkeep pour versionner le dossier
- Ajoute `mkdir -p /app/public` dans le stage builder en filet
  de sécurité si le dossier disparaît à nouveau

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:33:16 +02:00
39f37ee2b8 fix(compose): retire network_mode hérité via !reset en bridge
Le parent docker-compose.yml fixe `network_mode: host` ; combiné
avec une déclaration `networks:` dans l'override, Compose refuse
le projet (mutuellement exclusifs). On utilise `!reset null` pour
supprimer la clé héritée et permettre l'usage du réseau bridge
personnalisé. Requiert Compose v2.24+.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:22:15 +02:00
2afb2e3bd2 fix(prisma): déclare les binaryTargets Alpine x64 et arm64
Sans binaryTargets explicites, Prisma ne génère l'engine que pour
la plateforme du builder, ce qui fait échouer le runtime sur les
containers Alpine arm64 (Raspberry Pi, Apple Silicon en émulation).
Ajout des cibles linux-musl-openssl-3.0.x et
linux-musl-arm64-openssl-3.0.x en plus de "native".

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:22:09 +02:00
6278c3691f fix(docker): copie node_modules/.bin dans le stage runner
L'entrypoint utilise `npx prisma` et `npx tsx` mais les symlinks
correspondants vivent dans node_modules/.bin, qui n'était pas
copié depuis le builder. Résultat : `sh: prisma: not found` au
démarrage. On ajoute la copie de .bin ; les symlinks vers les
paquets non copiés deviendront dangling sans impact (on utilise
uniquement prisma et tsx au runtime).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:21:52 +02:00
f7ca7a0929 fix(mdns-scanner): browser par type au lieu d'une recherche globale
bonjour-service exige un `type` dans BrowserConfig ; il n'existe pas
d'option pour écouter "tous les services". Le scanner instancie
maintenant un browser par type mDNS courant en homelab (http, ssh,
smb, airplay, googlecast, homekit, ipp, etc.) et agrège les
annonces par IP via une fonction `ingest` partagée.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:21:45 +02:00
1273368c9a fix(arp-scanner): remplace map+filter null par flatMap typé
Le combo `map -> satisfies DiscoveryResult -> filter (r is …)` ne
passait pas le typecheck strict de Next : le type littéral produit
par `satisfies` n'était pas considéré sous-type valide du prédicat.
`flatMap<DiscoveryResult>` retourne [] quand la ligne ne matche pas,
ce qui évite la nullité intermédiaire et respecte la propriété
optionnelle `macAddress?: string`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:10:07 +02:00
dc8dbc3cd7 fix(prisma): remplace les enums par des String (compat SQLite)
SQLite ne supporte pas les enums Prisma. Les 6 enums (HostStatus,
HostSource, Protocol, PortState, ScanType, ScanStatus) sont
convertis en champs String avec valeurs par défaut littérales et
documentation inline des valeurs autorisées. La validation reste
assurée par Zod côté app.

Adapte aussi les mappings statusVariant des pages hosts/scans
en Record<string, BadgeVariant> avec fallback 'default'.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:09:57 +02:00
6c020e7ee3 feat(docker): finalise le déploiement compose (sqlite + postgres)
- Compose nettoyé en deux profils isolés (sqlite, postgres) avec
  healthcheck HTTP et network_mode host pour la découverte LAN.
- Override docker-compose.bridge.yml pour les environnements où
  host mode n'est pas disponible (macOS/Windows).
- Entrypoint tolérant : fallback prisma db push quand aucune
  migration n'existe encore.
- Dockerfile robuste sans package-lock.json (npm install fallback).
- .env.docker.example et docker/README.md pour un démarrage en
  une commande.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 14:03:46 +02:00
Mathieu BOURBON
c18d831d89 feat(docker): script d'entrypoint avec attente DB + migrations auto
Le script docker/entrypoint.sh :
- Attend PostgreSQL (netcat sur host:port extrait de DATABASE_URL)
- Cree le dossier /app/data si SQLite
- Applique les migrations via prisma migrate deploy
- Execute le seed si RUN_SEED=true (non bloquant)
- Demarre server.js (mode standalone Next)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 16:45:11 +02:00
Mathieu BOURBON
db7ea77a63 chore(next): migre vers serverExternalPackages (Next 15)
La cle experimental.serverComponentsExternalPackages est depreciee depuis
Next 15 au profit de serverExternalPackages au niveau racine de la config.
Meme comportement, moins de warnings au build.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 16:40:52 +02:00
Mathieu BOURBON
676b7f9f88 fix(logger): ajoute pino-pretty en devDependencies
Le module src/lib/utils/logger.ts configure un transport pino-pretty
en developpement, mais le paquet manquait du package.json. Resultat:
crash au premier import du logger (donc au boot du serveur Next en dev).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 16:40:46 +02:00
Mathieu BOURBON
73d016ec24 fix(prisma): provider statique + scripts de bascule SQLite/PostgreSQL
Prisma ne supporte pas env() pour le champ `provider` d'un datasource
(uniquement pour `url`). Le schéma utilise maintenant `provider = "sqlite"`
en statique, et deux scripts npm (`db:use-sqlite` / `db:use-postgres`)
réécrivent le fichier pour basculer entre les deux moteurs.

Sans ce fix, `prisma generate` échoue au boot.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 16:38:03 +02:00
Mathieu BOURBON
fbb6138c28 first commit 2026-04-18 16:24:44 +02:00