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>
This commit is contained in:
109
docker/README.md
Normal file
109
docker/README.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user