Compare commits
4 Commits
fbb6138c28
...
c18d831d89
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c18d831d89 | ||
|
|
db7ea77a63 | ||
|
|
676b7f9f88 | ||
|
|
73d016ec24 |
58
docker/entrypoint.sh
Executable file
58
docker/entrypoint.sh
Executable 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
|
||||||
@@ -2,14 +2,9 @@
|
|||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
output: 'standalone', // Optimisé pour Docker
|
output: 'standalone', // Optimisé pour Docker
|
||||||
experimental: {
|
|
||||||
// Permet l'utilisation de paquets natifs côté serveur (ping, bonjour, etc.)
|
// Permet l'utilisation de paquets natifs côté serveur (ping, bonjour, etc.)
|
||||||
serverComponentsExternalPackages: [
|
// Remplace `experimental.serverComponentsExternalPackages` (déprécié en Next 15).
|
||||||
'ping',
|
serverExternalPackages: ['ping', 'bonjour-service', '@prisma/client'],
|
||||||
'bonjour-service',
|
|
||||||
'@prisma/client',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
// Empêche le bundling des modules réseau côté client
|
// Empêche le bundling des modules réseau côté client
|
||||||
webpack: (config, { isServer }) => {
|
webpack: (config, { isServer }) => {
|
||||||
if (!isServer) {
|
if (!isServer) {
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
"db:studio": "prisma studio",
|
"db:studio": "prisma studio",
|
||||||
"db:seed": "tsx prisma/seed.ts",
|
"db:seed": "tsx prisma/seed.ts",
|
||||||
"db:reset": "prisma migrate reset",
|
"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:up": "docker compose -f docker/docker-compose.yml up -d",
|
||||||
"docker:down": "docker compose -f docker/docker-compose.yml down",
|
"docker:down": "docker compose -f docker/docker-compose.yml down",
|
||||||
"docker:logs": "docker compose -f docker/docker-compose.yml logs -f",
|
"docker:logs": "docker compose -f docker/docker-compose.yml logs -f",
|
||||||
@@ -59,6 +61,7 @@
|
|||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^9.12.0",
|
"eslint": "^9.12.0",
|
||||||
"eslint-config-next": "^15.0.0",
|
"eslint-config-next": "^15.0.0",
|
||||||
|
"pino-pretty": "^11.3.0",
|
||||||
"postcss": "^8.4.47",
|
"postcss": "^8.4.47",
|
||||||
"prettier": "^3.3.3",
|
"prettier": "^3.3.3",
|
||||||
"prettier-plugin-tailwindcss": "^0.6.8",
|
"prettier-plugin-tailwindcss": "^0.6.8",
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// IPAM — Schéma Prisma
|
// IPAM — Schéma Prisma
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Le `provider` est injecté via la variable d'environnement DATABASE_PROVIDER
|
// Prisma n'accepte PAS `env()` pour le champ `provider` (seulement pour `url`).
|
||||||
// (SQLite par défaut, PostgreSQL en option). Les deux sont pris en charge.
|
// Le provider par défaut est donc `sqlite`. Pour basculer vers PostgreSQL :
|
||||||
// Lors d'un changement de provider, régénérer le client : `pnpm db:generate`
|
// npm run db:use-postgres
|
||||||
// et lancer une nouvelle migration : `pnpm db:migrate`.
|
// 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 {
|
generator client {
|
||||||
@@ -11,7 +12,7 @@ generator client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
datasource db {
|
datasource db {
|
||||||
provider = env("DATABASE_PROVIDER")
|
provider = "sqlite"
|
||||||
url = env("DATABASE_URL")
|
url = env("DATABASE_URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
36
scripts/switch-db-provider.mjs
Normal file
36
scripts/switch-db-provider.mjs
Normal 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');
|
||||||
Reference in New Issue
Block a user