diff --git a/frontend/src/lib/api/endpoints/admin.ts b/frontend/src/lib/api/endpoints/admin.ts index 3a9d8643..23834d19 100644 --- a/frontend/src/lib/api/endpoints/admin.ts +++ b/frontend/src/lib/api/endpoints/admin.ts @@ -65,9 +65,13 @@ export function reextractPhotoMetadata(): Promise { } /** A freshly generated AES-256 at-rest blob-encryption key (base64) plus a - * data-loss warning authored by the server. */ + * data-loss warning authored by the server. The `fingerprint` is the + * SSH-style colon-hex render the boot log / admin pair-chain / rotate + * reports all use — admins can paste the key into `.env`, restart, and + * check the fingerprint matches to confirm the key made it in intact. */ export interface GeneratedKey { key: string; + fingerprint: string; warning: string; } diff --git a/frontend/src/routes/admin/[[tab]]/+page.svelte b/frontend/src/routes/admin/[[tab]]/+page.svelte index 1900597a..2c32adf2 100644 --- a/frontend/src/routes/admin/[[tab]]/+page.svelte +++ b/frontend/src/routes/admin/[[tab]]/+page.svelte @@ -2080,8 +2080,52 @@ The legacy form + related handlers/state live in git history; deleted here in one sweep. ══════════════════════════════════════════════════════════ --> + + {#if storage} +
+

+ {t('admin.storage_content_stats_title', 'Content store')} +

+

+ {t( + 'admin.storage_content_stats_hint', + 'Aggregate over the DB blob store — independent of which backend entry holds the bytes.' + )} +

+
+
+
{t('admin.storage_blobs', 'Blobs')}
+
{storage.total_blobs ?? '—'}
+
+
+
{t('admin.storage_size', 'Stored')}
+
+ {storage.total_bytes_stored != null ? formatBytes(storage.total_bytes_stored) : '—'} +
+
+
+
{t('admin.storage_dedup', 'Dedup ratio')}
+
+ {storage.dedup_ratio != null ? `${storage.dedup_ratio.toFixed(2)}x` : '—'} +
+
+
+
+ {/if} + +
-

{t('admin.storage_title', 'Storage entries')}

+

{t('admin.storage_title', 'Storage backend')}

{t( 'admin.storage_move_hint', @@ -2137,9 +2181,9 @@ + a highlight ring. Migrate & activate is per-card + and only shown on non-active cards when no other + migration is in flight. --> {@const migrationInFlight = migration != null && (migration.status === 'running' || migration.status === 'paused')}

@@ -2289,20 +2333,6 @@
{entry.backend}
{t('admin.entry_location', 'Location')}
{entry.location_hint ?? '—'}
- {#if entry.is_active} -
{t('admin.storage_blobs', 'Blobs')}
-
{storage.total_blobs ?? '—'}
-
{t('admin.storage_size', 'Stored')}
-
- {storage.total_bytes_stored != null - ? formatBytes(storage.total_bytes_stored) - : '—'} -
-
{t('admin.storage_dedup', 'Dedup ratio')}
-
- {storage.dedup_ratio != null ? `${storage.dedup_ratio.toFixed(2)}x` : '—'} -
- {/if}