48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { env } from "@/env";
|
|
import { apiJson } from "@/lib/api";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { rcon } from "@/lib/services/rcon";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
/**
|
|
* Ops health probe: database reachability, emulator RCON reachability, SMTP
|
|
* (when configured), and runtime info. Returns HTTP 200 always (read the
|
|
* `status`/`database` fields), so it's safe for uptime monitors that only care
|
|
* about reachability.
|
|
*/
|
|
export async function GET() {
|
|
const database = await prisma.$queryRaw`SELECT 1`
|
|
.then(() => true)
|
|
.catch(() => false);
|
|
|
|
const emulator = await rcon.send("ping", null).catch(() => false);
|
|
|
|
let smtp = null;
|
|
if (env.SMTP_HOST) {
|
|
const nodemailer = await import("nodemailer");
|
|
const test = nodemailer.createTransport({
|
|
host: env.SMTP_HOST,
|
|
port: env.SMTP_PORT,
|
|
secure: env.SMTP_SECURE,
|
|
auth: env.SMTP_USER
|
|
? { user: env.SMTP_USER, pass: env.SMTP_PASSWORD ?? "" }
|
|
: undefined,
|
|
});
|
|
smtp = await test
|
|
.verify()
|
|
.then(() => true)
|
|
.catch(() => false);
|
|
}
|
|
|
|
return apiJson({
|
|
status: database ? "ok" : "degraded",
|
|
database,
|
|
emulator,
|
|
smtp,
|
|
node: process.version,
|
|
uptime: Math.round(process.uptime()),
|
|
time: new Date().toISOString(),
|
|
});
|
|
}
|