diff --git a/Dockerfile b/Dockerfile index e98dd97..79d34ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,7 @@ RUN APKO_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "aarch64" || echo "x86_64") " - busybox" \ " - tzdata" \ " - docker-cli" \ - " - docker-compose=5.1.3-r2" \ + " - docker-compose=5.1.3-r3" \ " - docker-cli-buildx" \ " - sqlite" \ " - postgresql-client" \ @@ -93,7 +93,7 @@ RUN cp -r node_modules/better-sqlite3/build /tmp/better-sqlite3-build \ && rm -rf node_modules/@types /tmp/better-sqlite3-build # Build Go collector -FROM --platform=$BUILDPLATFORM golang:1.25.9 AS go-builder +FROM --platform=$BUILDPLATFORM golang:1.25.10 AS go-builder ARG TARGETARCH WORKDIR /app COPY collector/ ./collector/ diff --git a/VERSION b/VERSION index db97376..385844c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.0.28 +v1.0.29 diff --git a/collector/go.mod b/collector/go.mod index a4a26b2..ffe64b0 100644 --- a/collector/go.mod +++ b/collector/go.mod @@ -1,3 +1,3 @@ module github.com/Finsys/dockhand/collector -go 1.25.9 +go 1.25.10 diff --git a/package.json b/package.json index 6e568c5..acf0e53 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dockhand", "private": true, - "version": "1.0.28", + "version": "1.0.29", "type": "module", "scripts": { "dev": "npx vite dev", @@ -76,7 +76,7 @@ "better-sqlite3": "11.7.0", "croner": "9.1.0", "cronstrue": "3.9.0", - "devalue": "5.6.4", + "devalue": "5.8.1", "drizzle-orm": "0.45.2", "fast-xml-parser": "5.7.3", "js-yaml": "4.1.1", @@ -119,7 +119,7 @@ "lucide-svelte": "^0.562.0", "mode-watcher": "^1.1.0", "postcss": "^8.5.6", - "svelte": "5.53.5", + "svelte": "5.55.7", "svelte-check": "^4.3.5", "svelte-easy-crop": "^5.0.0", "tailwind-merge": "^3.4.0", @@ -137,6 +137,6 @@ "@codemirror/search": "6.6.0", "@lezer/common": "1.5.0", "@lezer/highlight": "1.2.3", - "devalue": "5.6.4" + "devalue": "5.8.1" } } diff --git a/src/app.css b/src/app.css index b4ca927..fbc230d 100644 --- a/src/app.css +++ b/src/app.css @@ -74,6 +74,30 @@ html { max-width: calc(90px * var(--grid-font-size-scale, 1)) !important; } +/* Scrollbar theming */ +* { + scrollbar-color: hsl(var(--border) / 0.5) transparent; + scrollbar-width: thin; +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: hsl(var(--border) / 0.5); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: hsl(var(--border) / 0.7); +} + :root { --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; diff --git a/src/app.d.ts b/src/app.d.ts index b79d95c..4fb1653 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -3,11 +3,12 @@ import type { AuthenticatedUser } from '$lib/server/auth'; -// Build-time constants injected by Vite -declare const __BUILD_DATE__: string | null; -declare const __BUILD_COMMIT__: string | null; - declare global { + // Build-time constants injected by Vite + const __APP_VERSION__: string | null; + const __BUILD_DATE__: string | null; + const __BUILD_COMMIT__: string | null; + namespace App { // interface Error {} interface Locals { diff --git a/src/lib/components/CodeEditor.svelte b/src/lib/components/CodeEditor.svelte index e36595f..6999f7e 100644 --- a/src/lib/components/CodeEditor.svelte +++ b/src/lib/components/CodeEditor.svelte @@ -405,7 +405,7 @@ new RegExp(`(? p.test(line)); diff --git a/src/lib/components/ScanTab.svelte b/src/lib/components/ScanTab.svelte index c79af14..68c83d8 100644 --- a/src/lib/components/ScanTab.svelte +++ b/src/lib/components/ScanTab.svelte @@ -38,6 +38,7 @@ imageName: string; envId?: number | null; autoStart?: boolean; + activeScanner?: 'grype' | 'trivy'; onComplete?: (results: ScanResult[]) => void; onError?: (error: string) => void; onStatusChange?: (status: ScanStatus) => void; @@ -47,6 +48,7 @@ imageName, envId = null, autoStart = false, + activeScanner = $bindable<'grype' | 'trivy'>('grype'), onComplete, onError, onStatusChange @@ -362,7 +364,7 @@ {:else}
{primaryIp}
{/if}
{:else if column.id === 'ports'}
- {#if ports.length > 0}
+ {@const exposedPorts = $appSettings.showExposedPorts ? formatExposedPorts(container.ports) : []}
+ {@const customUrl = container.labels?.['dockhand.url']?.trim() || null}
+ {#if ports.length > 0 || exposedPorts.length > 0 || customUrl}
{@const compactPorts = $appSettings.compactPorts}
{@const displayPorts = compactPorts && ports.length > 1 ? [ports[0]] : ports}
{@const remainingCount = ports.length - 1}
{port.display}
- {port.display}
@@ -1902,6 +1948,9 @@
title={ports.map(p => p.display).join(', ')}
>+{remainingCount}
{/if}
+ {#each exposedPorts as port}
+ {port.display}
+ {/each}
exposed
- {containerPort}
+ exposed
+ {containerPort}
+
If the Hawser agent is configured with TOKEN, enter it here.
+
+
Enter a token manually or generate one. Set the same token as TOKEN env var on your Hawser agent.
hawser --port {formPort}
+ {formHawserToken ? `TOKEN=${formHawserToken} ` : ''}hawser standard --port {formPort}
+ {#if formHawserToken}
+ Show first port with +N count instead of all ports
Shows internal container ports (from EXPOSE directives) that are not published to the host. These appear in the container list with an amber badge to distinguish them from published port mappings.
+Display internal container ports in the container list grid
+No labels found
+Click "Add label" to create one and assign it to environments
+Pick a color
+No environments available
+ {/if} +{addSelectedEnvIds.length > 0 ? `${addSelectedEnvIds.length} environment${addSelectedEnvIds.length !== 1 ? 's' : ''} selected` : '\u00A0'}
+{port.display}
-