false, 'error' => 'Method not allowed'])); } $sig = $_SERVER['HTTP_X_GITEA_SIGNATURE'] ?? ''; $raw = file_get_contents('php://input'); $expected = hash_hmac('sha256', $raw, DEPLOY_SECRET); if (!hash_equals($expected, $sig)) { http_response_code(403); exit(json_encode(['ok' => false, 'error' => 'Bad signature'])); } $payload = json_decode($raw, true); $ref = $payload['ref'] ?? ''; if ($ref !== 'refs/heads/main') { echo json_encode(['ok' => true, 'skipped' => true, 'ref' => $ref]); exit; } // Fire-and-forget — respond immediately, deploy runs in background $cmd = 'nohup ' . escapeshellarg(DEPLOY_SCRIPT) . ' >> ' . escapeshellarg(LOG_FILE) . ' 2>&1 &'; shell_exec($cmd); echo json_encode(['ok' => true, 'deploying' => true, 'ref' => $ref]);