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>
IPAM — Déploiement Docker
Tout ce qu'il faut pour lancer l'application en une commande.
Pré-requis
- Docker Engine ≥ 24
- Docker Compose v2 (
docker composeet nondocker-compose) - Linux conseillé (le mode
network_mode: hostn'est pas pleinement supporté sur Docker Desktop macOS/Windows ; voir la section Bridge mode plus bas)
Fichiers fournis
| Fichier | Rôle |
|---|---|
Dockerfile |
Image multi-stage (deps → build → runner) basée sur node:20-alpine |
entrypoint.sh |
Attente PostgreSQL, migrations Prisma, seed optionnel, lancement Next |
docker-compose.yml |
Compose principal — profils sqlite et postgres, mode host |
docker-compose.bridge.yml |
Override pour passer en mode bridge (sans découverte LAN) |
Démarrage rapide — profil SQLite
# 1. Prépare la config
cp .env.docker.example .env
# (édite .env si besoin — surtout DISCOVERY_DEFAULT_CIDRS)
# 2. Build + run
docker compose -f docker/docker-compose.yml --profile sqlite up -d --build
# 3. Logs
docker compose -f docker/docker-compose.yml logs -f ipam
L'UI est disponible sur http://localhost:3000.
Profil PostgreSQL
cp .env.docker.example .env
# Dans .env, bascule sur PostgreSQL :
# DATABASE_PROVIDER=postgresql
# DATABASE_URL="postgresql://ipam:ipam@127.0.0.1:5432/ipam?schema=public"
docker compose -f docker/docker-compose.yml --profile postgres up -d --build
Le container ipam-postgres expose le port 5432 sur l'hôte (utile pour prisma studio ou un client SQL externe).
Bridge mode (sans découverte LAN)
Utile sur macOS / Windows ou pour un test rapide de l'UI :
docker compose \
-f docker/docker-compose.yml \
-f docker/docker-compose.bridge.yml \
--profile sqlite up -d --build
⚠️ En bridge, ARP / mDNS / ping sweep ne fonctionneront pas sur ton LAN — seule la saisie manuelle reste pleinement utilisable.
Commandes utiles
# Arrêter
docker compose -f docker/docker-compose.yml down
# Tout supprimer (y compris les volumes — perte des données !)
docker compose -f docker/docker-compose.yml down -v
# Re-seeder manuellement
docker exec -it ipam npx tsx prisma/seed.ts
# Prisma studio (depuis l'hôte, profil postgres)
DATABASE_URL="postgresql://ipam:ipam@localhost:5432/ipam?schema=public" npx prisma studio
# Shell dans le container
docker exec -it ipam sh
Variables d'environnement clés
Toutes les variables sont documentées dans .env.docker.example.
Les plus importantes pour Docker :
DATABASE_PROVIDER—sqlite(défaut) oupostgresqlDATABASE_URL— fichierfile:/app/data/ipam.dbou DSN PostgreSQLRUN_SEED—truepour exécuterprisma/seed.tsau premier bootDISCOVERY_DEFAULT_CIDRS— plages scannées par défaut, à adapter à ton LAN
Persistance
| Volume | Contenu |
|---|---|
ipam-data |
Base SQLite (/app/data/ipam.db) |
ipam-postgres |
Données PostgreSQL |
Les deux survivent à docker compose down, mais pas à down -v.
Pourquoi network_mode: host ?
Pour qu'un container puisse :
- envoyer des paquets ICMP (ping sweep)
- lire la table ARP (
ip neigh) du réseau local - recevoir les annonces mDNS (port 5353 UDP multicast)
…il doit partager la pile réseau de l'hôte. Sans host, ces fonctionnalités sont aveugles au LAN.
Les cap_add: [NET_RAW, NET_ADMIN] permettent par ailleurs au binaire ping du container d'ouvrir un socket ICMP en non-root.