#!/usr/bin/env node /** * API Antivirus ClamAV * * Cette API permet de scanner des documents pour détecter les virus * en utilisant ClamAV. * * Port: 3023 * Domaine: antivir.certificator.4nkweb.com */ import express from 'express'; import cors from 'cors'; import dotenv from 'dotenv'; import { scanRouter } from './routes/scan.js'; import { healthRouter } from './routes/health.js'; import { logger } from './logger.js'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; // Get the directory of the current module const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Charger les variables d'environnement const envPath = join(__dirname, '../.env'); dotenv.config({ path: envPath }); const app = express(); // Port fixe : 3023 const PORT = 3023; const HOST = process.env.CLAMAV_API_HOST || '0.0.0.0'; // Middleware app.use(cors()); app.use(express.json({ limit: '100mb' })); app.use(express.urlencoded({ extended: true, limit: '100mb' })); // Middleware de logging app.use((req, res, next) => { logger.info(`${req.method} ${req.path}`, { ip: req.ip, userAgent: req.get('user-agent'), }); next(); }); // Routes app.use('/', healthRouter); app.use('/health', healthRouter); app.use('/api/scan', scanRouter); // Route racine app.get('/', (req, res) => { res.json({ service: 'clamav-api', version: '1.0.0', status: 'running', endpoints: { health: '/health', scan: '/api/scan/buffer', }, }); }); // Gestion des erreurs app.use((err, req, res, next) => { logger.error('Unhandled error', { error: err.message, stack: err.stack }); res.status(500).json({ error: 'Internal Server Error', message: process.env.NODE_ENV === 'development' ? err.message : 'An error occurred', }); }); // Démarrer le serveur const server = app.listen(PORT, HOST, () => { logger.info('ClamAV API server started', { host: HOST, port: PORT, env: process.env.NODE_ENV || 'production', }); }); // Gestion de l'arrêt gracieux process.on('SIGTERM', () => { logger.info('SIGTERM received, shutting down gracefully'); server.close(() => { logger.info('Server closed'); process.exit(0); }); }); process.on('SIGINT', () => { logger.info('SIGINT received, shutting down gracefully'); server.close(() => { logger.info('Server closed'); process.exit(0); }); });