Files
Orchestrator/privat/CV/andreknie.de/server/index.js

51 lines
1.5 KiB
JavaScript

import express from 'express'
import cors from 'cors'
import helmet from 'helmet'
import { dirname } from 'path'
import { fileURLToPath } from 'url'
import contactRouter from './routes/contact.js'
import talkRequestRouter from './routes/talk-request.js'
import newsletterRouter from './routes/newsletter.js'
import resourceDownloadRouter from './routes/resource-download.js'
import speakerCvRouter from './routes/speaker-cv.js'
const __dirname = dirname(fileURLToPath(import.meta.url))
const PORT = process.env.PORT || 3003
const app = express()
// Behind Caddy reverse proxy — trust the first proxy hop so rate limiting
// and IP logging use the real client IP.
app.set('trust proxy', 1)
app.disable('x-powered-by')
app.use(helmet())
app.use(cors({
origin: process.env.NODE_ENV === 'production'
? 'https://andreknie.de'
: 'http://localhost:5173',
credentials: true,
}))
app.use(express.json({ limit: '10kb' }))
// Routes
app.get('/api/health', (_req, res) => {
res.json({ status: 'ok', time: new Date().toISOString() })
})
app.use('/api/contact', contactRouter)
app.use('/api/talk-request', talkRequestRouter)
app.use('/api/newsletter', newsletterRouter)
app.use('/api/resource-download', resourceDownloadRouter)
app.use('/api/speaker-cv', speakerCvRouter)
// Error handler
app.use((err, _req, res, _next) => {
console.error('[Server Error]', err.message)
res.status(500).json({ error: 'Interner Serverfehler.' })
})
app.listen(PORT, () => {
console.log(`[andreknie.de Backend] Running on port ${PORT}`)
})