diff --git a/server/routers/site/createSite.ts b/server/routers/site/createSite.ts index c9b54bf2..b950644a 100644 --- a/server/routers/site/createSite.ts +++ b/server/routers/site/createSite.ts @@ -141,6 +141,7 @@ export async function createSite( niceId, subnet, type, + dockerSocketEnabled: type == "newt", ...(pubKey && type == "wireguard" && { pubKey }) }) .returning(); @@ -154,6 +155,7 @@ export async function createSite( name, niceId, type, + dockerSocketEnabled: type == "newt", subnet: "0.0.0.0/0" }) .returning(); diff --git a/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx b/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx index b59fe93e..69c61105 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx @@ -20,7 +20,7 @@ export default function ResourceInfoBox({}: ResourceInfoBoxType) { const { resource, authInfo, site } = useResourceContext(); const api = createApiClient(useEnvContext()); - const { isEnabled, isAvailable } = useDockerSocket(resource.siteId); + const { isEnabled, isAvailable } = useDockerSocket(site!); let fullUrl = `${resource.ssl ? "https" : "http"}://${resource.fullDomain}`; diff --git a/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx index 8c2365d8..d2bfee4b 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx @@ -776,7 +776,7 @@ export default function ReverseProxyTargets(props: { - {site && ( + {site && site.type == 'newt' && ( )} /> - ( - - - - - - - Enable Docker Socket discovery - for populating container - information, useful in resource - targets. - - - )} - /> + {site && site.type === "newt" && ( + ( + + + + + + + Enable Docker Socket + discovery for populating + container information, + useful in resource targets. + + + )} + /> + )} diff --git a/src/components/ContainersSelector.tsx b/src/components/ContainersSelector.tsx index 6c7c1368..9355692f 100644 --- a/src/components/ContainersSelector.tsx +++ b/src/components/ContainersSelector.tsx @@ -68,8 +68,9 @@ export const ContainersSelector: FC = ({ }) => { const [open, setOpen] = useState(false); const isDesktop = useMediaQuery("(min-width: 768px)"); + const { isAvailable, containers, fetchContainers } = useDockerSocket( - site.siteId + site ); useEffect(() => { diff --git a/src/hooks/useDockerSocket.ts b/src/hooks/useDockerSocket.ts index ef188ac4..bf4746f5 100644 --- a/src/hooks/useDockerSocket.ts +++ b/src/hooks/useDockerSocket.ts @@ -10,15 +10,13 @@ import { } from "@server/routers/site"; import { AxiosResponse } from "axios"; import { toast } from "./useToast"; +import { Site } from "@server/db"; const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); -export function useDockerSocket(siteId: number) { - if (!siteId) { - throw new Error("Site ID is required to use Docker Socket"); - } +export function useDockerSocket(site: Site) { + console.log(`useDockerSocket initialized for site ID: ${site.siteId}`); - const [site, setSite] = useState(); const [dockerSocket, setDockerSocket] = useState(); const [containers, setContainers] = useState([]); @@ -27,40 +25,18 @@ export function useDockerSocket(siteId: number) { const { dockerSocketEnabled: isEnabled = true } = site || {}; const { isAvailable = false, socketPath } = dockerSocket || {}; - const fetchSite = useCallback(async () => { - try { - const res = await api.get>( - `/site/${siteId}` - ); - - if (res.status === 200) { - setSite(res.data.data); - } - } catch (err) { - console.error(err); - toast({ - variant: "destructive", - title: "Failed to fetch resource", - description: formatAxiosError( - err, - "An error occurred while fetching resource" - ) - }); - } - }, [api, siteId]); - const checkDockerSocket = useCallback(async () => { if (!isEnabled) { console.warn("Docker socket is not enabled for this site."); return; } try { - const res = await api.post(`/site/${siteId}/docker/check`); + const res = await api.post(`/site/${site.siteId}/docker/check`); console.log("Docker socket check response:", res); } catch (error) { console.error("Failed to check Docker socket:", error); } - }, [api, siteId, isEnabled]); + }, [api, site.siteId, isEnabled]); const getDockerSocketStatus = useCallback(async () => { if (!isEnabled) { @@ -70,7 +46,7 @@ export function useDockerSocket(siteId: number) { try { const res = await api.get>( - `/site/${siteId}/docker/status` + `/site/${site.siteId}/docker/status` ); if (res.status === 200) { @@ -92,7 +68,7 @@ export function useDockerSocket(siteId: number) { description: "An error occurred while fetching Docker status." }); } - }, [api, siteId, isEnabled]); + }, [api, site.siteId, isEnabled]); const getContainers = useCallback( async (maxRetries: number = 3) => { @@ -111,7 +87,7 @@ export function useDockerSocket(siteId: number) { try { const res = await api.get< AxiosResponse - >(`/site/${siteId}/docker/containers`); + >(`/site/${site.siteId}/docker/containers`); setContainers(res.data.data); return; } catch (error: any) { @@ -160,7 +136,7 @@ export function useDockerSocket(siteId: number) { try { const res = await api.post>( - `/site/${siteId}/docker/trigger` + `/site/${site.siteId}/docker/trigger` ); // TODO: identify a way to poll the server for latest container list periodically? await fetchContainerList(); @@ -169,13 +145,9 @@ export function useDockerSocket(siteId: number) { console.error("Failed to trigger Docker containers:", error); } }, - [api, siteId, isEnabled, isAvailable] + [api, site.siteId, isEnabled, isAvailable] ); - useEffect(() => { - fetchSite(); - }, [fetchSite]); - // 2. Docker socket status monitoring useEffect(() => { if (!isEnabled || isAvailable) {