app/routes/health.tsx (35 lines of code) (raw):
import { json, type LoaderFunctionArgs } from "@remix-run/node";
import { getJobProcessor } from "~/lib/server/jobProcessor";
import { DockerJobExecutor } from "~/lib/server/processors/DockerJobExecutor";
// GET /health - Health check
export async function loader({ request }: LoaderFunctionArgs) {
try {
const jobProcessor = getJobProcessor();
const executionMode = jobProcessor.getExecutionMode();
// Check Docker availability if in Docker mode
let dockerStatus = null;
if (executionMode === "docker") {
const dockerExecutor = new DockerJobExecutor();
dockerStatus = await dockerExecutor.healthCheck();
}
const isHealthy =
executionMode === "api" || (dockerStatus && dockerStatus.available);
return json(
{
status: isHealthy ? "healthy" : "unhealthy",
timestamp: new Date().toISOString(),
executionMode,
docker: dockerStatus,
},
{ status: isHealthy ? 200 : 503 }
);
} catch (error) {
console.error("Health check error:", error);
return json(
{
status: "unhealthy",
timestamp: new Date().toISOString(),
error: "Internal server error",
},
{ status: 500 }
);
}
}