{ if (e.detail) { bucket_config = { type: 'S3', bucket: '', region: '', access_key: '', secret_key: '', endpoint: '', allow_http: true } } else { bucket_config = undefined } }} />
{#if bucket_config}
Storage usage by folder Runs in the background — large buckets can take several minutes.
{#if usageStatus}
{#if usageStatus.running}
Scanning… {usageStatus.scanned_objects.toLocaleString()} objects inspected {#if usageStatus.current_prefix} — currently under {usageStatus.current_prefix} {/if}
{:else if usageStatus.finished_at}
Scanned {usageStatus.scanned_objects.toLocaleString()} objects · finished at {new Date( usageStatus.finished_at ).toLocaleString()}
{/if} {#if usageStatus.error}
Error: {usageStatus.error}
{/if} {#if usageStatus.folders.length > 0}
{#each usageStatus.folders as item (item.prefix)}
{item.prefix} {displaySize(item.size) ?? '0 B'}{item.partial ? ' (partial)' : ''}
{/each}
Total{usageStatus.running ? ' (partial)' : ''} {displaySize(usageStatus.folders.reduce((acc, item) => acc + item.size, 0)) ?? '0 B'}
{:else if !usageStatus.running && usageStatus.finished_at}
No objects found in the bucket.
{/if}
{/if}
Clean up expired logs Delete expired service & job logs from object storage and disk now, then scan the bucket for orphan log files left behind by previously deleted jobs. Uses batched deletes (up to 1000 objects per request).
{#if cleanupStatus} {@const total = cleanupStatus.total_service + cleanupStatus.total_jobs} {@const processed = cleanupStatus.processed_service + cleanupStatus.processed_jobs}
Phase: {cleanupStatus.phase} S3 deleted: {cleanupStatus.s3_deleted.toLocaleString()} {#if (cleanupStatus.s3_not_found ?? 0) > 0} · already absent (404): {(cleanupStatus.s3_not_found ?? 0).toLocaleString()} {/if} {#if cleanupStatus.errors > 0} · errors: {cleanupStatus.errors.toLocaleString()} {/if}
DB: {processed.toLocaleString()} / {total.toLocaleString()} rows deleted ({cleanupProgress}%) · service {cleanupStatus.processed_service.toLocaleString()}/{cleanupStatus.total_service.toLocaleString()}, job {cleanupStatus.processed_jobs.toLocaleString()}/{cleanupStatus.total_jobs.toLocaleString()}
Orphan scan: {cleanupStatus.orphans_scanned.toLocaleString()} scanned, {cleanupStatus.orphans_deleted.toLocaleString()} deleted
{#if !cleanupStatus.running && cleanupStatus.finished_at}
Finished at {new Date(cleanupStatus.finished_at).toLocaleString()}
{/if} {#if cleanupStatus.last_error}
Last error: {cleanupStatus.last_error}
{/if}
{/if}
{ if (e.detail === 'S3' && bucket_config?.type !== 'S3') { bucket_config = { type: 'S3', bucket: '', region: '', access_key: '', secret_key: '', endpoint: '', allow_http: true } } else if (e.detail === 'Azure' && bucket_config?.type !== 'Azure') { bucket_config = { type: 'Azure', accountName: '', containerName: '', useSSL: false, tenantId: '', clientId: '', accessKey: '' } } else if (e.detail === 'Gcs' && bucket_config?.type !== 'Gcs') { bucket_config = { type: 'Gcs', bucket: '', serviceAccountKey: {} } } else if (e.detail === 'AwsOidc' && bucket_config?.type !== 'AwsOidc') { bucket_config = { type: 'AwsOidc', bucket: '', region: '', roleArn: '' } } }} >
{#if bucket_config.type === 'S3'}
Disable if using https only policy
{ if (bucket_config?.type === 'S3') { bucket_config = { ...bucket_config, allow_http: e.detail } } }} options={{ right: 'Allow http' }} />
{:else if bucket_config.type === 'Azure'} {:else if bucket_config.type === 'AwsOidc'} {:else if bucket_config.type === 'Gcs'} {:else}
Unknown bucket type {bucket_config['type']}
{/if}
{/if}