This commit is contained in:
Dmitry 2026-01-05 01:22:50 +03:00
parent 446dfaad3c
commit c51788dfae
2 changed files with 56 additions and 24 deletions

View file

@ -17,4 +17,9 @@ COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma
EXPOSE 3000 EXPOSE 3000
# Используем shell для лучшего логирования ошибок # Используем shell для лучшего логирования ошибок
CMD sh -c "echo '=== Starting Backend ===' && npx prisma migrate deploy && echo '=== Migrations completed ===' && node dist/main" # Отключаем буферизацию для Node.js чтобы логи сразу видны
ENV NODE_ENV=production
ENV NODE_NO_WARNINGS=1
# Явно выводим логи в stdout/stderr без буферизации
CMD sh -c "echo '========================================' && echo '=== STARTING BACKEND ===' && echo '========================================' && npx prisma migrate deploy && echo '=== MIGRATIONS COMPLETED ===' && exec node --no-warnings dist/main"

View file

@ -4,6 +4,16 @@ import { ConfigService } from '@nestjs/config';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
async function bootstrap() { async function bootstrap() {
// Принудительно выводим в stdout и stderr для Docker/Coolify
const log = (message: string) => {
console.log(message);
console.error(`[LOG] ${message}`); // Дублируем в stderr для надежности
};
log('========================================');
log('=== BACKEND STARTING ===');
log('========================================');
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
const configService = app.get(ConfigService); const configService = app.get(ConfigService);
@ -11,30 +21,37 @@ async function bootstrap() {
const corsOrigin = configService.get<string>('CORS_ORIGIN') || 'http://localhost:5173'; const corsOrigin = configService.get<string>('CORS_ORIGIN') || 'http://localhost:5173';
const allowedOrigins = corsOrigin.split(',').map(origin => origin.trim()); const allowedOrigins = corsOrigin.split(',').map(origin => origin.trim());
console.log('=== Backend Starting ==='); log(`CORS_ORIGIN from env: ${configService.get<string>('CORS_ORIGIN') || 'NOT SET (using default)'}`);
console.log(`CORS_ORIGIN from env: ${configService.get<string>('CORS_ORIGIN') || 'NOT SET (using default)'}`); log(`CORS allowed origins: ${allowedOrigins.join(', ')}`);
console.log(`CORS allowed origins: ${allowedOrigins.join(', ')}`);
app.enableCors({ app.enableCors({
origin: (origin, callback) => { origin: (origin, callback) => {
// Логируем все входящие запросы // Логируем все входящие запросы
console.log(`[CORS] Request from origin: ${origin || 'NO ORIGIN (direct request)'}`); const logMsg = `[CORS] Request from origin: ${origin || 'NO ORIGIN (direct request)'}`;
console.log(logMsg);
console.error(logMsg); // Дублируем в stderr
// Разрешаем запросы без origin (например, Postman, мобильные приложения) // Разрешаем запросы без origin (например, Postman, мобильные приложения)
if (!origin) { if (!origin) {
console.log(`[CORS] Allowing request without origin`); const allowMsg = `[CORS] Allowing request without origin`;
console.log(allowMsg);
console.error(allowMsg);
return callback(null, true); return callback(null, true);
} }
// Проверяем, есть ли origin в списке разрешенных // Проверяем, есть ли origin в списке разрешенных
if (allowedOrigins.includes(origin)) { if (allowedOrigins.includes(origin)) {
console.log(`[CORS] ✓ Allowed origin: ${origin}`); const allowedMsg = `[CORS] ✓ Allowed origin: ${origin}`;
console.log(allowedMsg);
console.error(allowedMsg);
return callback(null, true); return callback(null, true);
} }
// Логируем отклоненные запросы для отладки // Логируем отклоненные запросы для отладки
console.error(`[CORS] ✗ BLOCKED origin: ${origin}`); const blockedMsg = `[CORS] ✗ BLOCKED origin: ${origin}`;
console.error(`[CORS] Allowed origins are: ${allowedOrigins.join(', ')}`); const allowedListMsg = `[CORS] Allowed origins are: ${allowedOrigins.join(', ')}`;
console.error(blockedMsg);
console.error(allowedListMsg);
return callback(new Error('Not allowed by CORS')); return callback(new Error('Not allowed by CORS'));
}, },
credentials: true, credentials: true,
@ -44,7 +61,9 @@ async function bootstrap() {
// Добавляем middleware для логирования всех запросов // Добавляем middleware для логирования всех запросов
app.use((req, res, next) => { app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.path} - Origin: ${req.headers.origin || 'NO ORIGIN'}`); const requestLog = `[${new Date().toISOString()}] ${req.method} ${req.path} - Origin: ${req.headers.origin || 'NO ORIGIN'}`;
console.log(requestLog);
console.error(requestLog); // Дублируем в stderr
next(); next();
}); });
@ -57,26 +76,34 @@ async function bootstrap() {
const host = configService.get<string>('HOST') || '0.0.0.0'; const host = configService.get<string>('HOST') || '0.0.0.0';
try { try {
log(`Attempting to start server on ${host}:${port}...`);
await app.listen(port, host); await app.listen(port, host);
console.log(`=== Backend Started Successfully ===`);
console.log(`Backend running on http://${host}:${port}`); log('========================================');
console.log(`CORS allowed origins: ${allowedOrigins.join(', ')}`); log('=== BACKEND STARTED SUCCESSFULLY ===');
console.log(`Environment variables:`); log('========================================');
console.log(` - DATABASE_URL: ${configService.get<string>('DATABASE_URL') ? 'SET' : 'NOT SET'}`); log(`Backend running on http://${host}:${port}`);
console.log(` - JWT_SECRET: ${configService.get<string>('JWT_SECRET') ? 'SET' : 'NOT SET'}`); log(`CORS allowed origins: ${allowedOrigins.join(', ')}`);
console.log(` - PORT: ${port}`); log(`Environment variables:`);
console.log(` - HOST: ${host}`); log(` - DATABASE_URL: ${configService.get<string>('DATABASE_URL') ? 'SET' : 'NOT SET'}`);
console.log(` - CORS_ORIGIN: ${corsOrigin}`); log(` - JWT_SECRET: ${configService.get<string>('JWT_SECRET') ? 'SET' : 'NOT SET'}`);
log(` - PORT: ${port}`);
log(` - HOST: ${host}`);
log(` - CORS_ORIGIN: ${corsOrigin}`);
log('========================================');
log('Backend is ready to accept requests!');
log('========================================');
} catch (error) { } catch (error) {
console.error(`=== Backend Failed to Start ===`); const errorMsg = `=== Backend Failed to Start ===\nError: ${error.message}\n${error.stack}`;
console.error(`Error: ${error.message}`); console.error(errorMsg);
console.error(error); process.stderr.write(errorMsg + '\n');
process.exit(1); process.exit(1);
} }
} }
bootstrap().catch((error) => { bootstrap().catch((error) => {
console.error('=== Fatal Error During Bootstrap ==='); const fatalError = `=== Fatal Error During Bootstrap ===\n${error.message}\n${error.stack}`;
console.error(error); console.error(fatalError);
process.stderr.write(fatalError + '\n');
process.exit(1); process.exit(1);
}); });