diff --git a/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx b/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx
index 5e0adf1..afecba4 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx
@@ -2,6 +2,7 @@ import SearchField from "@/components/SearchField";
import {
Box,
ChevronDown,
+ CloudSyncIcon,
Database,
Loader2,
Plus,
@@ -163,6 +164,23 @@ export default function EnvironmentContainersToolbar({
Deploy Database
+
+
+ Import form Sync
+
) : null}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx
index 1f07898..f7e7a0f 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx
@@ -12,7 +12,9 @@ interface AdvancedSummaryCardProps {
item: AdvancedSummary;
}
-export default function AdvancedSummaryCard({ item }: AdvancedSummaryCardProps) {
+export default function AdvancedSummaryCard({
+ item,
+}: AdvancedSummaryCardProps) {
return (
-
-
+ */}
-
@@ -355,90 +351,7 @@ export default function AdvancedTabPanel({
))}
-
-
-
-
-
-
-
-
-
- Destructive actions require confirmation
-
-
- Remove, reset, and cleanup operations stay behind explicit
- confirmation dialogs before they execute.
-
-
-
-
- {activeAction === "rebuild" ? (
-
- ) : (
-
- )}
- Reset
-
-
- {activeAction === "remove" ? (
-
- ) : (
-
- )}
- Remove
-
-
-
-
+ */}
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx
index b44a219..4e022b3 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx
@@ -9,7 +9,6 @@ import {
ExternalLink,
GitBranch,
GitCommit,
- Package,
Rocket,
XCircle,
} from "lucide-react";
@@ -242,7 +241,6 @@ export default function DeploymentsTabPanel({
Branch
Duration
Deployed At
- Actions
@@ -269,16 +267,6 @@ export default function DeploymentsTabPanel({
{deployment.duration}
{deployment.deployedAt}
-
-
-
-
-
))}
@@ -356,27 +344,6 @@ export default function DeploymentsTabPanel({
-
-
-
-
-
- Deployment history is currently derived from the real container
- record. A permanent deployment history API is not available yet, so
- only the current deployment snapshot is shown here.
-
-
-
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx
index 251a658..c572361 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx
@@ -1,14 +1,11 @@
"use client";
import { useMemo, useState } from "react";
-import TablePagination from "@/components/TablePagination";
import { useTablePagination } from "@/lib/use-table-pagination";
import {
CheckCircle2,
ClipboardCheck,
- KeyRound,
Loader2,
- LockKeyhole,
RotateCcw,
Save,
ShieldAlert,
@@ -178,7 +175,7 @@ export default function EnvironmentTabPanel({
return (
- (
))}
-
+ */}
@@ -444,245 +442,6 @@ export default function EnvironmentTabPanel({
-
-
-
- {environment.variables.length > 0 ? (
- <>
-
-
-
-
- Key
- Value
- Scope
- Source
- Required
- Sensitive
-
-
-
- {pagination.paginatedItems.map((variable) => (
-
-
-
- {variable.key}
-
-
- {variable.value}
-
- {variable.scope}
- {variable.source}
-
-
- {variable.required ? "Required" : "Optional"}
-
-
-
-
- {variable.sensitive ? "Masked" : "Plain"}
-
-
-
- ))}
-
-
-
-
- >
- ) : (
-
-
-
-
- No environment variables detected
-
-
- This container has no stored deploy variables or runtime
- inspect variables available.
-
-
-
- )}
-
-
-
-
- {environment.checks.map((check) => (
-
-
- {check.status === "Ready" ? (
-
- ) : check.status === "Missing" ? (
-
- ) : (
-
- )}
-
-
-
-
- {check.label}
-
-
- {check.status}
-
-
-
- {check.description}
-
-
-
- ))}
-
-
-
-
-
- {environment.groups.map((group) => (
-
-
- {group.description}
-
-
- {group.items.map((item) => (
-
-
- {item.label}
-
-
- {item.value}
-
-
- ))}
-
-
- ))}
-
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx
index 545be23..7fc0908 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx
@@ -28,21 +28,25 @@ const levelColor: Record = {
DEBUG: "#38bdf8",
};
-const sourceStatusClass: Record =
- {
- Streaming: "badge-online",
- Paused: "badge-warning",
- Unavailable: "badge-danger",
- };
+const sourceStatusClass: Record<
+ LogsTabData["sources"][number]["status"],
+ string
+> = {
+ Streaming: "badge-online",
+ Paused: "badge-warning",
+ Unavailable: "badge-danger",
+};
-const summaryToneColor: Record =
- {
- blue: "var(--accent-blue)",
- green: "var(--accent-green)",
- purple: "var(--accent-purple)",
- amber: "var(--accent-yellow)",
- cyan: "var(--accent-cyan)",
- };
+const summaryToneColor: Record<
+ LogsTabData["summaries"][number]["tone"],
+ string
+> = {
+ blue: "var(--accent-blue)",
+ green: "var(--accent-green)",
+ purple: "var(--accent-purple)",
+ amber: "var(--accent-yellow)",
+ cyan: "var(--accent-cyan)",
+};
export default function LogsTabPanel({
logs,
@@ -198,8 +202,7 @@ export default function LogsTabPanel({
{line.level}
-
- {line.source}
-
+ {line.source}
{line.message}
{line.traceId ?? ""}
@@ -356,7 +357,7 @@ export default function LogsTabPanel({
-
-
+
{source.status}
@@ -455,7 +458,7 @@ export default function LogsTabPanel({
))}
-
+ */}
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx
index 30a1be9..ede0fb1 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx
@@ -22,13 +22,19 @@ export default function AppOverview({
-
-
+
-
);
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx
index f066fc7..ae0d9b4 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx
@@ -79,13 +79,13 @@ export default function RecentLogsPanel({
))}
-
View all logs
-
+ */}
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx
index 37e5d5d..559e88b 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx
@@ -181,7 +181,7 @@ export default function RuntimeTabPanel({ runtime }: RuntimeTabPanelProps) {
) : (
+ */}
-
-
+ */}
-
-
+ */}
);
}
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts
index 43659f2..2c0e2b4 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts
@@ -40,7 +40,8 @@ function formatBytes(value: number | null) {
}
function formatCpu(nanoCpus: number | null, cpuQuota: number | null) {
- if (nanoCpus && nanoCpus > 0) return `${(nanoCpus / 1_000_000_000).toFixed(2)} vCPU`;
+ if (nanoCpus && nanoCpus > 0)
+ return `${(nanoCpus / 1_000_000_000).toFixed(2)} vCPU`;
if (cpuQuota && cpuQuota > 0) return `${cpuQuota} quota`;
return "Unlimited";
}
@@ -105,16 +106,16 @@ export function createAdvancedData(
tone: restartName === "no" ? "amber" : "green",
},
{
- label: "Runtime Guard",
- value: runtimeLoaded ? "Loaded" : "Unavailable",
- subvalue: runtimeLoaded ? "Docker inspect available" : "Using DB record",
- tone: runtimeLoaded ? "cyan" : "amber",
+ label: "Root Filesystem",
+ value: readOnlyRootfs ? "Read-only" : "Writable",
+ subvalue: "Docker HostConfig.ReadonlyRootfs",
+ tone: readOnlyRootfs ? "green" : "amber",
},
{
- label: "Danger Zone",
- value: "Protected",
- subvalue: "Confirmation required",
- tone: "purple",
+ label: "Auto Remove",
+ value: autoRemove ? "Enabled" : "Disabled",
+ subvalue: "Docker HostConfig.AutoRemove",
+ tone: autoRemove ? "amber" : "blue",
},
],
metadata: [
@@ -134,7 +135,9 @@ export function createAdvancedData(
label: "CPU Limit",
value: formatCpu(nanoCpus, cpuQuota),
usage: detail ? Math.min(100, Math.round(detail.stats.cpuPercent)) : 0,
- helper: runtimeLoaded ? "Current Docker CPU sampling" : "Runtime unavailable",
+ helper: runtimeLoaded
+ ? "Current Docker CPU sampling"
+ : "Runtime unavailable",
},
{
label: "Memory Limit",
@@ -147,7 +150,10 @@ export function createAdvancedData(
value: pidsLimit && pidsLimit > 0 ? String(pidsLimit) : "Unlimited",
usage:
pidsLimit && pidsLimit > 0
- ? Math.min(100, Math.round((detail?.stats.pids ?? 0) / pidsLimit * 100))
+ ? Math.min(
+ 100,
+ Math.round(((detail?.stats.pids ?? 0) / pidsLimit) * 100),
+ )
: 0,
helper: `${detail?.stats.pids ?? 0} process ID(s) currently visible`,
},
@@ -202,7 +208,8 @@ export function createAdvancedData(
{
id: "reconcile-runtime",
label: "Reconcile runtime state",
- description: "Stored metadata can be refreshed from Docker runtime data.",
+ description:
+ "Stored metadata can be refreshed from Docker runtime data.",
enabled: true,
},
],
diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts
index cdc9884..03d197a 100644
--- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts
+++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts
@@ -53,6 +53,16 @@ function getBranch(container: Container) {
return "-";
}
+function getImageTag(image: string) {
+ if (!image.trim()) return "-";
+ if (image.includes("@")) return "digest";
+
+ const lastSegment = image.split("/").at(-1) ?? image;
+ const tagIndex = lastSegment.lastIndexOf(":");
+
+ return tagIndex >= 0 ? lastSegment.slice(tagIndex + 1) || "latest" : "latest";
+}
+
export function createDeploymentsData(
container: Container,
detail: ContainerDetails | null,
@@ -88,10 +98,10 @@ export function createDeploymentsData(
tone: isSuccessful ? "green" : "amber",
},
{
- label: "Success Rate",
- value: isSuccessful ? "100%" : "0%",
- subvalue: "Based on current container record",
- tone: isSuccessful ? "green" : "amber",
+ label: "Image Tag",
+ value: getImageTag(container.image),
+ subvalue: container.image,
+ tone: "purple",
},
{
label: "Deploy Mode",