diff --git a/app/api/health/route.ts b/app/api/health/route.ts index d143f33..234a3bc 100644 --- a/app/api/health/route.ts +++ b/app/api/health/route.ts @@ -1,16 +1,52 @@ import { NextResponse } from 'next/server' +import { getPrismaClient } from '@/lib/database/trades' /** - * Health check endpoint for Docker HEALTHCHECK - * Returns 200 OK if the server is running + * Health check endpoint for DNS failover monitoring + * Returns 200 OK only if server AND database are healthy + * + * CRITICAL: If database is down, this returns 503 + * This triggers DNS failover to backup server */ export async function GET() { - return NextResponse.json( - { - status: 'healthy', - timestamp: new Date().toISOString(), - uptime: process.uptime(), - }, - { status: 200 } - ) + const startTime = Date.now() + + try { + // Check database connectivity with 5-second timeout + const prisma = getPrismaClient() + const dbCheck = await Promise.race([ + prisma.$queryRaw`SELECT 1 as health_check`, + new Promise((_, reject) => + setTimeout(() => reject(new Error('Database timeout')), 5000) + ) + ]) + + const responseTime = Date.now() - startTime + + return NextResponse.json( + { + status: 'healthy', + timestamp: new Date().toISOString(), + uptime: process.uptime(), + database: 'connected', + responseTime: `${responseTime}ms` + }, + { status: 200 } + ) + } catch (error: any) { + // Database failure - return 503 to trigger failover + console.error('❌ Health check failed - Database unavailable:', error.message) + + return NextResponse.json( + { + status: 'unhealthy', + timestamp: new Date().toISOString(), + uptime: process.uptime(), + database: 'disconnected', + error: error.message, + responseTime: `${Date.now() - startTime}ms` + }, + { status: 503 } // Service Unavailable - triggers DNS failover + ) + } } diff --git a/app/api/trading/check-risk/route.ts b/app/api/trading/check-risk/route.ts index d419cd1..0702a0e 100644 --- a/app/api/trading/check-risk/route.ts +++ b/app/api/trading/check-risk/route.ts @@ -25,6 +25,7 @@ export interface RiskCheckRequest { rsi?: number volumeRatio?: number pricePosition?: number + maGap?: number // V9: MA gap convergence metric } export interface RiskCheckResponse { diff --git a/app/api/trading/execute/route.ts b/app/api/trading/execute/route.ts index a22e3a1..1922a29 100644 --- a/app/api/trading/execute/route.ts +++ b/app/api/trading/execute/route.ts @@ -29,6 +29,7 @@ export interface ExecuteTradeRequest { rsi?: number volumeRatio?: number pricePosition?: number + maGap?: number // V9: MA gap convergence metric indicatorVersion?: string // Pine Script version (v5, v6, etc.) }