main
Backend Deploy 🚀 / build-and-deploy (push) Has been cancelled

This commit is contained in:
Harun CAN
2026-05-09 05:57:56 +02:00
parent 3d36926fe9
commit 58832e99d1
17 changed files with 1469 additions and 59 deletions
+139
View File
@@ -0,0 +1,139 @@
import { NestFactory } from '@nestjs/core';
import { ValidationPipe, Logger as NestLogger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';
import helmet from 'helmet';
import { Logger, LoggerErrorInterceptor } from 'nestjs-pino';
import * as express from 'express';
import * as path from 'path';
// Prisma BigInt alanları JSON'a serialize edilemiyor — global polyfill
// MediaAsset.sizeBytes gibi alanlar BigInt tipinde
(BigInt.prototype as any).toJSON = function () {
return Number(this);
};
async function bootstrap() {
const logger = new NestLogger('Bootstrap');
logger.log('🔄 ContentGen AI başlatılıyor...');
const app = await NestFactory.create(AppModule, {
bufferLogs: true,
rawBody: true, // Stripe webhook imza doğrulaması için gerekli
});
// Use Pino Logger
app.useLogger(app.get(Logger));
app.useGlobalInterceptors(new LoggerErrorInterceptor());
// Security Headers
app.use(
helmet({
contentSecurityPolicy: false,
crossOriginEmbedderPolicy: false,
crossOriginResourcePolicy: { policy: 'cross-origin' },
}),
);
// Graceful Shutdown (Prisma & Docker)
app.enableShutdownHooks();
// Get config service
const configService = app.get(ConfigService);
const port = configService.get<number>('PORT', 3000);
const nodeEnv = configService.get('NODE_ENV', 'development');
// ── Static File Serving — Medya dosyalarına HTTP erişim ──
const mediaPath = configService.get<string>(
'STORAGE_LOCAL_PATH',
'./data/media',
);
const absoluteMediaPath = path.resolve(mediaPath);
// Medya dosyaları için CORS header'ları (Frontend farklı port'ta çalışıyor)
app.use('/media', (req: any, res: any, next: any) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
next();
});
app.use(
'/media',
express.static(absoluteMediaPath, {
maxAge: '1d',
etag: true,
lastModified: true,
index: false,
dotfiles: 'deny',
}),
);
logger.log(`📂 Medya dizini: ${absoluteMediaPath} → /media/*`);
// Enable CORS
app.enableCors({
origin: true,
credentials: true,
});
// Global prefix
app.setGlobalPrefix('api');
// Validation pipe (Strict)
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
transform: true,
forbidNonWhitelisted: true,
transformOptions: {
enableImplicitConversion: true,
},
}),
);
// Swagger setup
const swaggerConfig = new DocumentBuilder()
.setTitle('ContentGen AI — Video Generation SaaS API')
.setDescription(
'AI destekli video üretim platformu. Senaryo oluşturma, medya üretimi, render pipeline ve billing yönetimi.',
)
.setVersion('1.0.0')
.addBearerAuth()
.addTag('Auth', 'Kimlik doğrulama')
.addTag('Users', 'Kullanıcı yönetimi')
.addTag('Projects', 'Proje ve senaryo yönetimi')
.addTag('Dashboard', 'İstatistikler ve grafikler')
.addTag('Billing', 'Abonelik ve kredi yönetimi')
.addTag('Templates', 'Şablon pazaryeri')
.addTag('Notifications', 'Bildirim yönetimi')
.addTag('Admin', 'Yönetici paneli')
.addTag('Health', 'Sistem sağlık kontrolü')
.build();
logger.log('Swagger başlatılıyor...');
const document = SwaggerModule.createDocument(app, swaggerConfig);
SwaggerModule.setup('api/docs', app, document, {
swaggerOptions: {
persistAuthorization: true,
},
});
logger.log('Swagger hazır');
logger.log(`Port ${port} üzerinde dinleniyor...`);
await app.listen(port, '0.0.0.0');
logger.log('═══════════════════════════════════════════════════════════');
logger.log(`🚀 ContentGen AI API: http://localhost:${port}/api`);
logger.log(`📚 Swagger Docs: http://localhost:${port}/api/docs`);
logger.log(`💚 Health Check: http://localhost:${port}/api/health`);
logger.log(`📂 Medya Dosyaları: http://localhost:${port}/media/`);
logger.log(`🌍 Ortam: ${nodeEnv.toUpperCase()}`);
logger.log('═══════════════════════════════════════════════════════════');
if (nodeEnv === 'development') {
logger.warn('⚠️ Geliştirme modunda çalışıyor');
}
}
void bootstrap();