import dotenv from 'dotenv'; import path from 'path'; dotenv.config({ path: path.resolve(__dirname, '../../.env') }); import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import morgan from 'morgan'; import authRouter from './api/auth'; import postsRouter from './api/posts'; import meetupsRouter from './api/meetups'; import moderationRouter from './api/moderation'; import usersRouter from './api/users'; import categoriesRouter from './api/categories'; import relaysRouter from './api/relays'; import settingsRouter from './api/settings'; import nostrRouter from './api/nostr'; import submissionsRouter from './api/submissions'; import mediaRouter from './api/media'; import faqsRouter from './api/faqs'; import calendarRouter from './api/calendar'; import nip05Router from './api/nip05'; const app = express(); const PORT = parseInt(process.env.BACKEND_PORT || '4000', 10); const FRONTEND_URL = process.env.FRONTEND_URL || 'http://localhost:3000'; // Trust the first proxy (nginx) so req.ip returns the real client IP app.set('trust proxy', 1); app.use(helmet()); app.use(morgan(process.env.NODE_ENV === 'production' ? 'combined' : 'dev')); app.use(cors({ origin: FRONTEND_URL, credentials: true })); app.use(express.json()); app.use('/api/auth', authRouter); app.use('/api/posts', postsRouter); app.use('/api/meetups', meetupsRouter); app.use('/api/moderation', moderationRouter); app.use('/api/users', usersRouter); app.use('/api/categories', categoriesRouter); app.use('/api/relays', relaysRouter); app.use('/api/settings', settingsRouter); app.use('/api/nostr', nostrRouter); app.use('/api/submissions', submissionsRouter); app.use('/api/media', mediaRouter); app.use('/api/faqs', faqsRouter); app.use('/api/calendar', calendarRouter); app.use('/api/nip05', nip05Router); app.get('/api/health', (_req, res) => { res.json({ status: 'ok' }); }); const server = app.listen(PORT, () => { console.log(`Backend running on http://localhost:${PORT}`); }); const shutdown = () => { console.log('Shutting down gracefully…'); server.close(() => { console.log('Server closed.'); process.exit(0); }); // Force exit if connections don't drain within 10 seconds setTimeout(() => process.exit(1), 10_000).unref(); }; process.on('SIGTERM', shutdown); process.on('SIGINT', shutdown);