import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import rateLimit from 'express-rate-limit'; import dotenv from 'dotenv'; // Загрузка переменных окружения dotenv.config(); // Импорт конфигурации import { config } from '@/config/server'; // Импорт middleware import { errorHandler } from '@/middleware/errorHandler'; import { requestLogger } from '@/middleware/logger'; // Импорт роутов import { healthRouter } from '@/routes/health'; // Создание Express приложения const app = express(); // Базовые middleware app.use(helmet()); // Защита заголовков app.use(cors({ origin: process.env.CORS_ORIGIN || 'http://localhost:3000', credentials: true })); // Лимитер запросов const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 минут max: 100, // максимум 100 запросов с одного IP message: 'Слишком много запросов с этого IP, попробуйте позже.' }); app.use(limiter); // Парсинг JSON app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true })); // Логирование запросов app.use(requestLogger); // Основные роуты app.use('/api/health', healthRouter); // Обработка 404 app.use('*', (req, res) => { res.status(404).json({ success: false, message: 'Маршрут не найден', path: req.originalUrl }); }); // Обработчик ошибок app.use(errorHandler); // Запуск сервера const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`🚀 Сервер запущен на порту ${PORT}`); console.log(`📊 Окружение: ${process.env.NODE_ENV || 'development'}`); console.log(`🌐 CORS разрешен для: ${process.env.CORS_ORIGIN || 'http://localhost:3000'}`); }); // Обработка graceful shutdown process.on('SIGINT', () => { console.log('\n🛑 Получен SIGINT. Останавливаем сервер...'); process.exit(0); }); process.on('SIGTERM', () => { console.log('\n🛑 Получен SIGTERM. Останавливаем сервер...'); process.exit(0); }); export default app;