- 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>
110 lines
3.4 KiB
Markdown
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.
|