xpeditis2.0/apps/backend/startup.js
David 08787c89c8
Some checks failed
Dev CI / Unit Tests (${{ matrix.app }}) (backend) (push) Blocked by required conditions
Dev CI / Unit Tests (${{ matrix.app }}) (frontend) (push) Blocked by required conditions
Dev CI / Notify Failure (push) Blocked by required conditions
Dev CI / Quality (${{ matrix.app }}) (backend) (push) Has been cancelled
Dev CI / Quality (${{ matrix.app }}) (frontend) (push) Has been cancelled
chore: sync full codebase from cicd branch
Aligns dev with the complete application codebase (cicd branch).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 12:56:16 +02:00

103 lines
2.9 KiB
JavaScript

#!/usr/bin/env node
const { Client } = require('pg');
const { DataSource } = require('typeorm');
const path = require('path');
const { spawn } = require('child_process');
async function waitForPostgres(maxAttempts = 30) {
console.log('⏳ Waiting for PostgreSQL to be ready...');
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const client = new Client({
host: process.env.DATABASE_HOST,
port: parseInt(process.env.DATABASE_PORT, 10),
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
});
await client.connect();
await client.end();
console.log('✅ PostgreSQL is ready');
return true;
} catch (error) {
console.log(`⏳ Attempt ${attempt}/${maxAttempts} - PostgreSQL not ready, retrying...`);
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
console.error('❌ Failed to connect to PostgreSQL after', maxAttempts, 'attempts');
process.exit(1);
}
async function runMigrations() {
console.log('🔄 Running database migrations...');
const AppDataSource = new DataSource({
type: 'postgres',
host: process.env.DATABASE_HOST,
port: parseInt(process.env.DATABASE_PORT, 10),
username: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
entities: [path.join(__dirname, 'dist/**/*.orm-entity.js')],
migrations: [path.join(__dirname, 'dist/infrastructure/persistence/typeorm/migrations/*.js')],
synchronize: false,
logging: true,
});
try {
await AppDataSource.initialize();
console.log('✅ DataSource initialized');
const migrations = await AppDataSource.runMigrations();
if (migrations.length === 0) {
console.log('✅ No pending migrations');
} else {
console.log(`✅ Successfully ran ${migrations.length} migration(s):`);
migrations.forEach((migration) => {
console.log(` - ${migration.name}`);
});
}
await AppDataSource.destroy();
console.log('✅ Database migrations completed');
return true;
} catch (error) {
console.error('❌ Error during migration:', error);
process.exit(1);
}
}
function startApplication() {
console.log('🚀 Starting NestJS application...');
const app = spawn('node', ['dist/main'], {
stdio: 'inherit',
env: process.env
});
app.on('exit', (code) => {
process.exit(code);
});
process.on('SIGTERM', () => app.kill('SIGTERM'));
process.on('SIGINT', () => app.kill('SIGINT'));
}
async function main() {
console.log('🚀 Starting Xpeditis Backend...');
await waitForPostgres();
await runMigrations();
startApplication();
}
main().catch((error) => {
console.error('❌ Startup failed:', error);
process.exit(1);
});