Compare commits

...

4 Commits

Author SHA1 Message Date
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
5 changed files with 106 additions and 13 deletions

58
docker/entrypoint.sh Executable file
View File

@@ -0,0 +1,58 @@
#!/bin/sh
# ---------------------------------------------------------------
# Entrypoint IPAM
# ---------------------------------------------------------------
# 1. Attend la base de données si PostgreSQL
# 2. Applique les migrations Prisma (prisma migrate deploy)
# 3. Optionnel : seed initial si RUN_SEED=true
# 4. Démarre le serveur Next.js (mode standalone)
# ---------------------------------------------------------------
set -eu
log() { printf '\033[36m[entrypoint]\033[0m %s\n' "$*"; }
err() { printf '\033[31m[entrypoint]\033[0m %s\n' "$*" >&2; }
# --- 1. Attente DB (PostgreSQL uniquement) ------------------------
if [ "${DATABASE_PROVIDER:-sqlite}" = "postgresql" ]; then
if [ -z "${DATABASE_URL:-}" ]; then
err "DATABASE_URL requis pour PostgreSQL"
exit 1
fi
log "Attente de PostgreSQL…"
# Extraction host:port de l'URL (format postgresql://user:pass@host:port/db?…)
HOST_PORT=$(printf '%s' "$DATABASE_URL" | sed -E 's#.*@([^/?]+).*#\1#')
HOST=$(printf '%s' "$HOST_PORT" | cut -d: -f1)
PORT=$(printf '%s' "$HOST_PORT" | cut -d: -f2)
[ "$PORT" = "$HOST" ] && PORT=5432
RETRIES=30
while ! nc -z "$HOST" "$PORT" 2>/dev/null; do
RETRIES=$((RETRIES - 1))
if [ "$RETRIES" -le 0 ]; then
err "PostgreSQL injoignable après 30 tentatives ($HOST:$PORT)"
exit 1
fi
sleep 1
done
log "PostgreSQL disponible ($HOST:$PORT)"
fi
# --- 2. Crée le dossier data pour SQLite --------------------------
if [ "${DATABASE_PROVIDER:-sqlite}" = "sqlite" ]; then
mkdir -p /app/data
fi
# --- 3. Migrations Prisma -----------------------------------------
log "Application des migrations Prisma…"
npx prisma migrate deploy
# --- 4. Seed optionnel --------------------------------------------
if [ "${RUN_SEED:-false}" = "true" ]; then
log "Exécution du seed initial…"
npx tsx prisma/seed.ts || err "Seed échoué (non bloquant)"
fi
# --- 5. Lancement du serveur --------------------------------------
log "Démarrage du serveur Next.js sur :${PORT:-3000}"
exec node server.js

View File

@@ -2,14 +2,9 @@
const nextConfig = {
reactStrictMode: true,
output: 'standalone', // Optimisé pour Docker
experimental: {
// Permet l'utilisation de paquets natifs côté serveur (ping, bonjour, etc.)
serverComponentsExternalPackages: [
'ping',
'bonjour-service',
'@prisma/client',
],
},
// Remplace `experimental.serverComponentsExternalPackages` (déprécié en Next 15).
serverExternalPackages: ['ping', 'bonjour-service', '@prisma/client'],
// Empêche le bundling des modules réseau côté client
webpack: (config, { isServer }) => {
if (!isServer) {

View File

@@ -18,6 +18,8 @@
"db:studio": "prisma studio",
"db:seed": "tsx prisma/seed.ts",
"db:reset": "prisma migrate reset",
"db:use-sqlite": "node scripts/switch-db-provider.mjs sqlite",
"db:use-postgres": "node scripts/switch-db-provider.mjs postgresql",
"docker:up": "docker compose -f docker/docker-compose.yml up -d",
"docker:down": "docker compose -f docker/docker-compose.yml down",
"docker:logs": "docker compose -f docker/docker-compose.yml logs -f",
@@ -59,6 +61,7 @@
"autoprefixer": "^10.4.20",
"eslint": "^9.12.0",
"eslint-config-next": "^15.0.0",
"pino-pretty": "^11.3.0",
"postcss": "^8.4.47",
"prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.8",

View File

@@ -1,9 +1,10 @@
// IPAM — Schéma Prisma
// ---------------------------------------------------------------------
// Le `provider` est injecté via la variable d'environnement DATABASE_PROVIDER
// (SQLite par défaut, PostgreSQL en option). Les deux sont pris en charge.
// Lors d'un changement de provider, régénérer le client : `pnpm db:generate`
// et lancer une nouvelle migration : `pnpm db:migrate`.
// Prisma n'accepte PAS `env()` pour le champ `provider` (seulement pour `url`).
// Le provider par défaut est donc `sqlite`. Pour basculer vers PostgreSQL :
// npm run db:use-postgres
// puis régénérer le client : `npm run db:generate` et migrer : `npm run db:migrate`.
// Pour revenir à SQLite : `npm run db:use-sqlite`.
// ---------------------------------------------------------------------
generator client {
@@ -11,7 +12,7 @@ generator client {
}
datasource db {
provider = env("DATABASE_PROVIDER")
provider = "sqlite"
url = env("DATABASE_URL")
}

View File

@@ -0,0 +1,36 @@
#!/usr/bin/env node
/**
* Bascule le provider Prisma entre SQLite et PostgreSQL.
* Prisma n'accepte pas env() pour `provider`, donc on réécrit le fichier.
*
* Usage : node scripts/switch-db-provider.mjs sqlite
* node scripts/switch-db-provider.mjs postgresql
*/
import { readFileSync, writeFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, resolve } from 'node:path';
const __dirname = dirname(fileURLToPath(import.meta.url));
const schemaPath = resolve(__dirname, '..', 'prisma', 'schema.prisma');
const target = process.argv[2];
if (!['sqlite', 'postgresql'].includes(target)) {
console.error('Usage : node scripts/switch-db-provider.mjs <sqlite|postgresql>');
process.exit(1);
}
const content = readFileSync(schemaPath, 'utf8');
const next = content.replace(
/provider\s*=\s*"(sqlite|postgresql)"/,
`provider = "${target}"`,
);
if (next === content) {
console.log(`Provider déjà réglé sur "${target}", rien à faire.`);
process.exit(0);
}
writeFileSync(schemaPath, next);
console.log(`✅ Provider Prisma basculé sur "${target}"`);
console.log(' Pense à adapter DATABASE_URL dans .env puis :');
console.log(' npm run db:generate && npm run db:migrate');