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 = {
|
||||
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) {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
|
||||
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