mirror of
https://github.com/HarborGuard/HarborGuard.git
synced 2026-03-23 00:02:41 +08:00
- Updated Prisma schema to use PostgreSQL provider - Modified Dockerfile to bundle PostgreSQL 16 in the image - Simplified init-database.js for PostgreSQL only - Updated environment variables in .env and docker-compose.yml - Created PostgreSQL migration files - Configured automatic PostgreSQL initialization on container start The application now includes a bundled PostgreSQL database that automatically initializes on first run, eliminating the need for external database setup.
91 lines
2.8 KiB
JavaScript
Executable File
91 lines
2.8 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const { exec } = require('child_process');
|
|
const { promisify } = require('util');
|
|
|
|
const execAsync = promisify(exec);
|
|
|
|
console.log('[DB] Starting PostgreSQL database initialization...');
|
|
|
|
/**
|
|
* Check if Prisma CLI is available
|
|
*/
|
|
async function checkPrismaAvailability() {
|
|
try {
|
|
await execAsync('which prisma || command -v prisma');
|
|
console.log('[DB] Prisma CLI found');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('[DB] ERROR: Prisma CLI not found. Please ensure Prisma is installed.');
|
|
console.error('[DB] You can install it with: npm install -g prisma');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize PostgreSQL database
|
|
*/
|
|
async function initializeDatabase() {
|
|
try {
|
|
// Check if Prisma is available first
|
|
const prismaAvailable = await checkPrismaAvailability();
|
|
if (!prismaAvailable) {
|
|
throw new Error('Prisma CLI is not available. Cannot initialize database.');
|
|
}
|
|
|
|
const databaseUrl = process.env.DATABASE_URL || 'postgresql://harborguard:harborguard@localhost:5432/harborguard?sslmode=disable';
|
|
console.log('[DB] Using PostgreSQL database');
|
|
console.log('[DB] Database URL:', databaseUrl.replace(/:[^:@]+@/, ':****@')); // Hide password
|
|
|
|
// Generate Prisma client for PostgreSQL
|
|
console.log('[DB] Generating Prisma client for PostgreSQL...');
|
|
await execAsync('prisma generate', {
|
|
env: { ...process.env, DATABASE_URL: databaseUrl }
|
|
});
|
|
|
|
// Run migrations
|
|
console.log('[DB] Running database migrations...');
|
|
try {
|
|
await execAsync('prisma migrate deploy', {
|
|
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
timeout: 30000
|
|
});
|
|
console.log('[DB] Migrations applied successfully');
|
|
} catch (migrateError) {
|
|
// If migrations fail, try db push as fallback
|
|
console.log('[DB] Migration failed, trying db push...');
|
|
await execAsync('prisma db push --accept-data-loss', {
|
|
env: { ...process.env, DATABASE_URL: databaseUrl },
|
|
timeout: 30000
|
|
});
|
|
console.log('[DB] Database schema synchronized');
|
|
}
|
|
|
|
console.log('[DB] PostgreSQL database initialized successfully');
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error(`[DB] Database initialization failed: ${error.message}`);
|
|
console.error(error.stack);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
// Run initialization if called directly
|
|
if (require.main === module) {
|
|
initializeDatabase()
|
|
.then((result) => {
|
|
if (result.success) {
|
|
console.log('[DB] Initialization completed successfully');
|
|
process.exit(0);
|
|
} else {
|
|
console.error('[DB] Initialization failed');
|
|
process.exit(1);
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
console.error('[DB] Fatal error during initialization:', error);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
module.exports = { initializeDatabase }; |