const isHuggingFaceSpace = !!process.env.HF_SPACE_ID || !!process.env.SPACE_ID; const isProduction = process.env.NODE_ENV === 'production'; if (!isHuggingFaceSpace && !isProduction) { const dotenv = require('dotenv'); const path = require('path'); const fs = require('fs'); const envPath = path.join(__dirname, '../.env'); if (fs.existsSync(envPath)) { dotenv.config({ path: envPath }); console.log(`📄 Development: Loaded .env from: ${envPath}`); } else { dotenv.config(); console.log('📄 Development: Using default .env location'); } } else { console.log('📄 Production: Using environment variables from platform secrets'); } import 'reflect-metadata'; import { AppDataSource } from './config/database'; import app from './app'; import { initializeAdmin } from './scripts/createAdmin'; const PORT = parseInt(process.env.PORT || process.env.SPACE_PORT || '7860', 10); console.log('🔧 Starting server...'); console.log(`📡 Environment: ${process.env.NODE_ENV || 'development'}`); console.log(`🌐 Port: ${PORT}`); if (process.env.DATABASE_URL) { const dbUrl = process.env.DATABASE_URL; const masked = dbUrl.length > 60 ? `${dbUrl.substring(0, 30)}...${dbUrl.substring(dbUrl.length - 10)}` : dbUrl; console.log(`📊 Database URL: Set (${masked})`); } else { console.log(`📊 Database URL: ❌ NOT SET`); } AppDataSource.initialize() .then(async () => { console.log('✅ Database connected'); if (process.env.DB_SYNCHRONIZE !== 'true' && process.env.NODE_ENV === 'production') { try { console.log('🔄 Running migrations...'); await AppDataSource.runMigrations(); console.log('✅ Migrations completed'); } catch (migrationError) { console.warn('⚠️ Migration warning:', migrationError); } } // Initialize permanent admin user from environment variables await initializeAdmin(); app.listen(PORT, '0.0.0.0', () => { console.log(`🚀 Server running on port ${PORT}`); console.log(`🌍 Server accessible at http://0.0.0.0:${PORT}`); console.log(`📚 Swagger docs available at http://0.0.0.0:${PORT}/docs`); console.log(`❤️ Health check at http://0.0.0.0:${PORT}/health`); }); }) .catch((error) => { console.error('❌ Database connection failed:', error); console.error('Error details:', error.message); process.exit(1); }); // Graceful shutdown process.on('SIGTERM', async () => { console.log('SIGTERM received, closing server...'); await AppDataSource.destroy(); process.exit(0); }); process.on('SIGINT', async () => { console.log('SIGINT received, closing server...'); await AppDataSource.destroy(); process.exit(0); });