From 76394375eaede284fdf92a380f9c043ee0310a82 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 30 Oct 2025 11:22:40 +0100 Subject: [PATCH] chore(docker): update Docker configuration for database initialization - Changed exposed port from 3006 to 3007 in docker-compose.yml. - Updated Dockerfile to copy init-db.js script and modified CMD to use it for database initialization instead of Prisma migrations. --- Dockerfile | 7 +++-- docker-compose.yml | 4 +-- scripts/init-db.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100755 scripts/init-db.js diff --git a/Dockerfile b/Dockerfile index 40456fb..771e22c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,6 +68,9 @@ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # Copy Prisma schema COPY --from=builder /app/prisma ./prisma +# Copy scripts (including init-db.js) +COPY --from=builder /app/scripts ./scripts + # Copy pnpm node_modules (includes .pnpm store with Prisma client) COPY --from=builder /app/node_modules ./node_modules @@ -83,5 +86,5 @@ USER nextjs EXPOSE 3000 -# Start the application with database migration -CMD ["sh", "-c", "pnpm prisma migrate deploy && node server.js"] +# Start the application with smart database initialization +CMD ["sh", "-c", "node scripts/init-db.js && node server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index 43009da..dca4027 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: dockerfile: Dockerfile target: runner ports: - - '3006:3000' + - '3007:3000' environment: NODE_ENV: production DATABASE_URL: 'file:../data/dev.db' # Prisma @@ -49,7 +49,7 @@ services: command: > sh -c "pnpm install && pnpm prisma generate && - pnpm prisma migrate deploy && + node scripts/init-db.js && pnpm run dev" profiles: - dev diff --git a/scripts/init-db.js b/scripts/init-db.js new file mode 100755 index 0000000..b73a9eb --- /dev/null +++ b/scripts/init-db.js @@ -0,0 +1,64 @@ +#!/usr/bin/env node +/** + * Smart database initialization script + * - Fresh DB (no tables) -> prisma db push (fast, applies full schema) + * - Existing DB with data -> prisma migrate deploy (safe, incremental) + */ + +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +function exec(command) { + try { + return execSync(command, { encoding: 'utf-8', stdio: 'pipe' }); + } catch (error) { + return null; + } +} + +function getDatabasePath() { + const dbUrl = process.env.DATABASE_URL || 'file:./data/prod.db'; + // Extract path from SQLite URL (file:./path or file:/absolute/path) + return dbUrl.replace(/^file:/, ''); +} + +function isDatabaseEmpty() { + const dbPath = getDatabasePath(); + const absolutePath = path.resolve(dbPath); + + console.log(`πŸ” Checking database at: ${absolutePath}`); + + // Si le fichier DB n'existe pas, c'est vide + if (!fs.existsSync(absolutePath)) { + console.log('πŸ“¦ Database file does not exist - fresh install'); + return true; + } + + // VΓ©rifier si des tables existent + const result = exec('pnpm prisma db execute --stdin <<< ".tables"'); + if (!result || result.trim() === '') { + console.log('πŸ“¦ Database exists but has no tables - fresh install'); + return true; + } + + console.log('πŸ”„ Database has existing tables'); + return false; +} + +function main() { + console.log('πŸš€ Starting database initialization...\n'); + + if (isDatabaseEmpty()) { + console.log('✨ Applying full schema with prisma db push...'); + execSync('pnpm prisma db push --skip-generate', { stdio: 'inherit' }); + } else { + console.log('πŸ“ Applying migrations with prisma migrate deploy...'); + execSync('pnpm prisma migrate deploy', { stdio: 'inherit' }); + } + + console.log('\nβœ… Database ready!'); +} + +main(); +