logs
This commit is contained in:
parent
446dfaad3c
commit
c51788dfae
2 changed files with 56 additions and 24 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue