Files
IPAM/docker/README.md
Mathieu 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

110 lines
3.4 KiB
Markdown

# 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 compose` et non `docker-compose`)
- Linux conseillé (le mode `network_mode: host` n'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
```bash
# 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
```bash
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 :
```bash
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
```bash
# 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`](../.env.docker.example).
Les plus importantes pour Docker :
- `DATABASE_PROVIDER``sqlite` (défaut) ou `postgresql`
- `DATABASE_URL` — fichier `file:/app/data/ipam.db` ou DSN PostgreSQL
- `RUN_SEED``true` pour exécuter `prisma/seed.ts` au premier boot
- `DISCOVERY_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.