// bc.js - Главный файл сервера Battle Club const express = require('express'); const http = require('http'); // Используем HTTP, так как SSL терминируется Apache const { Server } = require('socket.io'); const path = require('path'); // Импорт ваших серверных модулей (предполагаем, что они есть и работают) // const auth = require('./server_modules/auth'); // const GameManager = require('./server_modules/gameManager'); // const db = require('./server_modules/db'); // const GAME_CONFIG = require('./server_modules/config'); const app = express(); const server = http.createServer(app); const BC_APP_INTERNAL_PORT = 3200; // Внутренний порт, на котором слушает bc.js const BC_APP_INTERNAL_HOST = '127.0.0.1'; // Слушать только на localhost const PUBLIC_PATH_PREFIX = '/battleclub'; // Публичный префикс пути, по которому приложение доступно через Apache // Настройка Socket.IO // Клиент будет подключаться к /battleclub/socket.io/ const io = new Server(server, { path: `${PUBLIC_PATH_PREFIX}/socket.io`, cors: { origin: "https://pavel-chagovsky.com", // Укажите ваш домен для безопасности // origin: "*", // Для разработки можно оставить, но для продакшена лучше конкретный домен methods: ["GET", "POST"] } }); // Middleware для логирования каждого запроса (полезно для отладки) app.use((req, res, next) => { console.log(`[BC App] Request: ${req.method} ${req.originalUrl}`); next(); }); // Раздача статических файлов из папки 'public' // Так как Apache проксирует /battleclub/ на корень этого Express-приложения, // Express должен отдавать статику от своего корня. // В HTML ссылки на статику должны быть относительными или начинаться с /battleclub/ // Например, если в public/js/client.js, то в HTML: // Или, если index.html отдается с /battleclub/, то app.use(express.static(path.join(__dirname, 'public'))); // Пример простого маршрута API, если он нужен (доступен по /battleclub/api/test) app.get('/api/test', (req, res) => { res.json({ message: 'Battle Club API is working!' }); }); // Если ваше основное приложение - это SPA (Single Page Application), // вам может понадобиться отдавать index.html для всех не-API и не-статических путей, // начинающихся с префикса /battleclub/. Но так как Apache проксирует /battleclub/ на /, // то Express будет видеть пути без /battleclub/. // Поэтому, если index.html должен отдаваться для /battleclub/ или /battleclub/some/path, // то здесь нужен роут для '*' или специфичные роуты. // Пока для простоты, предположим, что Apache проксирует /battleclub/ на корень bc.js, // и index.html находится в public/ и запрашивается как /battleclub/index.html (или просто /battleclub/) app.get('/', (req, res) => { // Этот роут будет срабатывать, если Apache проксировал /battleclub/ на / этого приложения res.sendFile(path.join(__dirname, 'public', 'index.html')); }); // --- Обработчики событий Socket.IO --- io.on('connection', (socket) => { console.log(`[BC App Socket.IO] User connected: ${socket.id} to path ${socket.nsp.name}`); socket.on('messageFromClient', (data) => { console.log(`[BC App Socket.IO] Message from client ${socket.id}:`, data); socket.emit('messageFromServer', { text: `Server received: ${data.text}` }); }); socket.on('disconnect', (reason) => { console.log(`[BC App Socket.IO] User disconnected: ${socket.id} (Reason: ${reason})`); }); // ... ваши обработчики auth, GameManager и т.д. ... // Убедитесь, что они не полагаются на префикс пути /battleclub/ во внутренних данных, // так как Express его "не видит" после проксирования Apache. }); // Запуск HTTP сервера server.listen(BC_APP_INTERNAL_PORT, BC_APP_INTERNAL_HOST, () => { console.log(`Battle Club HTTP Application Server running at http://${BC_APP_INTERNAL_HOST}:${BC_APP_INTERNAL_PORT}`); console.log(`Socket.IO will be available via proxy at path: ${PUBLIC_PATH_PREFIX}/socket.io`); console.log(`Serving static files from: ${path.join(__dirname, 'public')}`); }); // Обработчики глобальных ошибок process.on('unhandledRejection', (reason, promise) => { console.error('[BC App UNHANDLED REJECTION] At:', promise, 'reason:', reason); }); process.on('uncaughtException', (err) => { console.error('[BC App UNCAUGHT EXCEPTION] Caught exception:', err); // process.exit(1); // В продакшене может быть оправдано });