Improve logging recovery, resource scaling, and app deploy logging.

Auto-reconnect Elasticsearch port-forward after cluster or API restarts, poll log status in the UI, and apply storage changes through billing upgrade for all workloads. Add Redis/RabbitMQ PVC resize, Helm ES credentials for Fluent Bit, and fix deploy progress overlay behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
keyhan
2026-05-25 21:41:00 +03:30
parent bf9e827f85
commit dc9830383b
18 changed files with 1068 additions and 414 deletions
@@ -2,7 +2,7 @@
import { useEffect, useMemo } from 'react';
import { usePathname } from 'next/navigation';
import { useQuery, useQueries } from '@tanstack/react-query';
import { useQuery, useQueries, keepPreviousData } from '@tanstack/react-query';
import api from '@/lib/api';
import type { Application } from '@/types';
import { useAuthStore } from '@/lib/store';
@@ -49,16 +49,15 @@ export function DeploymentProgressManager() {
.get<{ progress: BuildProgress | null }>(`/deployments/applications/${app.id}/build-progress`)
.then((r) => r.data.progress),
refetchInterval: 1500,
placeholderData: keepPreviousData,
})),
});
const activeItems = useMemo(() => {
return deployingApps
.map((app, i) => ({
app,
progress: progressQueries[i]?.data ?? null,
}))
.filter(({ progress }) => isActiveBuildProgress(progress));
return deployingApps.map((app, i) => ({
app,
progress: progressQueries[i]?.data ?? null,
}));
}, [deployingApps, progressQueries]);
const routeAppId =
@@ -66,10 +65,10 @@ export function DeploymentProgressManager() {
pathname.match(/\/dashboard\/services\/([^/]+)/)?.[1];
useEffect(() => {
if (activeItems.length === 0) {
if (deployingApps.length === 0) {
useDeployProgressStore.setState({ minimized: false, focusedAppId: null });
}
}, [activeItems.length]);
}, [deployingApps.length]);
useEffect(() => {
if (activeItems.length === 0) return;
@@ -84,12 +83,15 @@ export function DeploymentProgressManager() {
const focusedItem =
activeItems.find((item) => item.app.id === focusedAppId) ?? activeItems[0];
const focusedProgress = focusedItem?.progress;
const focusedProgress =
focusedItem?.progress ??
({ phase: 'building', percent: 0, message: 'Loading progress…' } satisfies BuildProgress);
const showModal =
!minimized &&
!!focusedItem &&
!!focusedProgress &&
isActiveBuildProgress(focusedProgress);
(!focusedItem.progress ||
isActiveBuildProgress(focusedItem.progress) ||
focusedItem.progress.phase === 'done');
const handleMinimize = () => {
if (focusedItem) minimize(focusedItem.app.id);
@@ -99,7 +101,7 @@ export function DeploymentProgressManager() {
expand(appId);
};
if (activeItems.length === 0) return null;
if (deployingApps.length === 0) return null;
return (
<>
@@ -109,7 +111,7 @@ export function DeploymentProgressManager() {
</div>
)}
{showModal && focusedProgress && (
{showModal && (
<BuildProgressModal
appId={focusedItem.app.id}
appName={focusedItem.app.name}