From 2549101af1bcba67f6969a8b7fe231ec75e952ae Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 7 Oct 2026 03:09:53 -0700 Subject: [PATCH] [pending-judge] feat(selector): App Selector deploys via shipdeck catalog (DC-CATALOG-3) Submit rewired from /api/v1/apps/deploy (Docker chain) to /api/v1/deploys/catalog/deploy (shipdeck bridge -> OCI systemd service). Same modal, same fields: port, mediaPath, plex claim token (sent as env). No new UI screens. Docker chain no longer called from the selector. --- status/js/app-selector.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/status/js/app-selector.js b/status/js/app-selector.js index 3855161..0e720cc 100644 --- a/status/js/app-selector.js +++ b/status/js/app-selector.js @@ -777,11 +777,20 @@ } } - // Call deployment API - const response = await secureFetch('/api/v1/apps/deploy', { + // DC-CATALOG-3: deploy through shipdeck (no Docker daemon). The + // bridge renders the catalog entry server-side and runs the OCI + // image as a hardened systemd service. Same modal, same fields. + const catalogPayload = { + app: appTemplate.id, + port: deployConfig.port || appTemplate.defaultPort || null, + media_path: deployConfig.mediaPath || '', + env: deployConfig.plexClaimToken ? { PLEX_CLAIM: deployConfig.plexClaimToken } : {} + }; + + const response = await secureFetch('/api/v1/deploys/catalog/deploy', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(apiDeployConfig) + body: JSON.stringify(catalogPayload) }); const result = await response.json(); @@ -792,8 +801,8 @@ id: deployConfig.subdomain, // Use subdomain as ID name: appTemplate.name, logo: `/assets/${appTemplate.id}.png`, - containerId: result.containerId, - url: result.url, + containerId: null, // shipdeck deploys have no docker container id + url: result.url || `http://127.0.0.1:${catalogPayload.port}`, ip: deployConfig.ip, // Store IP for DNS record deletion appTemplate: appTemplate.id, // Store original template ID tailscaleOnly: deployConfig.tailscaleOnly || false // Tailscale protection status