v0.9.0: Storage paths registry, per-app HDD_PATH resolution, storage management UI

- Fix backup toggles not appearing (read each app's own HDD_PATH from app.yaml)
- Storage paths registry in settings.json with auto-discovery from deployed apps
- Settings page "Adattárolók" section with disk usage, add/remove/default/schedulable
- Deploy page path field as dropdown of registered storage paths
- Health check storage monitoring (mount point, disk usage alerts)
- Mount-point validation utilities (Linux syscall + cross-platform stubs)
- Controller docker-compose mount changed to /mnt:/mnt:rw for multi-storage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 09:04:28 +01:00
parent 465dec443f
commit aca3b8680a
17 changed files with 963 additions and 33 deletions
@@ -1976,6 +1976,85 @@ a.stat-card:hover {
border-color: rgba(218, 54, 51, 0.3);
}
/* --- Settings page: Storage paths --- */
.storage-paths-list {
display: flex;
flex-direction: column;
gap: .75rem;
}
.storage-path-item {
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 1rem;
}
.storage-path-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 1rem;
margin-bottom: .5rem;
}
.storage-path-info {
display: flex;
flex-direction: column;
gap: .15rem;
}
.storage-path-label {
font-weight: 600;
font-size: .95rem;
}
.storage-path-path {
font-family: 'JetBrains Mono', monospace;
font-size: .8rem;
color: var(--text-muted);
}
.storage-path-badges {
display: flex;
gap: .35rem;
flex-shrink: 0;
flex-wrap: wrap;
}
.storage-path-details {
margin: .5rem 0;
}
.storage-path-disk {
margin-bottom: .5rem;
}
.storage-path-meta {
font-size: .8rem;
color: var(--text-muted);
}
.storage-path-actions {
display: flex;
gap: .5rem;
margin-top: .75rem;
flex-wrap: wrap;
}
.btn-xs {
padding: .2rem .5rem;
font-size: .75rem;
border-radius: 6px;
}
.btn-danger-outline {
background: transparent;
border: 1px solid rgba(218, 54, 51, 0.5);
color: var(--red);
}
.btn-danger-outline:hover {
background: var(--red-bg);
border-color: var(--red);
}
.storage-add-details {
margin-top: .5rem;
}
.storage-add-details[open] summary {
margin-bottom: 1rem;
}
.storage-add-form {
margin-top: .75rem;
}
/* Responsive */
@media(max-width: 768px) {
.sidebar { width: 100%; height: auto; position: relative; border-right: none; border-bottom: 1px solid var(--border-color); }