fix: recursive data nesting guard + VM destroy in uninstall wizard

- Cleaned 242MB of recursive data/data/data/ nesting
- Added nesting-guard.js: auto-detects and removes recursive duplicates at startup
- Wired VM sandbox cleanup into uninstall wizard (calls vmDestroy before regular uninstall)
- Container stats, health data, and VM disk all cleaned on uninstall
This commit is contained in:
Krystie
2026-08-13 02:49:25 -07:00
parent 2ff6c05a45
commit 8ac1937784
11 changed files with 1789 additions and 8 deletions
+1
View File
@@ -28,6 +28,7 @@ const auditLogger = require('./security/audit-logger');
const portLockManager = require('./managers/port-lock-manager');
const resourceMonitor = require('./managers/resource-monitor');
const backupManager = require('./utilities/backup-manager');
require("./utilities/nesting-guard")();
const healthChecker = require('./monitoring/health-checker');
const updateManager = require('./managers/update-manager');
const selfUpdater = require('./docker/self-updater');
+38
View File
@@ -135,6 +135,44 @@ const TRANSLATIONS = {
'error.disk_full': 'Espace disque critique',
},
zh: {
'dashboard.title': '仪表盘',
'dashboard.services': '服务',
'dashboard.containers': '容器',
'dashboard.health': '健康',
'dashboard.settings': '设置',
'dashboard.backups': '备份',
'dashboard.monitoring': '监控',
'dashboard.security': '安全',
'service.status.healthy': '健康',
'service.status.degraded': '降级',
'service.status.down': '宕机',
'service.status.unknown': '未知',
'service.status.pending': '待处理',
'action.start': '启动',
'action.stop': '停止',
'action.restart': '重启',
'action.delete': '删除',
'action.update': '更新',
'action.deploy': '部署',
'action.save': '保存',
'action.cancel': '取消',
'action.confirm': '确认',
'error.not_found': '未找到资源',
'error.unauthorized': '未授权',
'error.forbidden': '禁止访问',
'error.rate_limited': '请求过多',
'error.internal': '内部服务器错误',
'error.container_not_found': '未找到容器',
'error.service_not_found': '未找到服务',
'error.invalid_input': '输入无效',
'error.docker_unreachable': '无法连接 Docker 守护进程',
'error.disk_full': '磁盘空间严重不足',
},
de: {
'dashboard.title': 'Dashboard',
'dashboard.services': 'Dienste',
@@ -0,0 +1,41 @@
/**
* Recursive data nesting guard.
*
* In past versions, a buggy update/restore path created data/data/data/...
* directories — each containing a full recursive copy of the parent.
* This module runs at startup, detects and removes nested duplicates.
*
* Add to app.js: require('./utilities/nesting-guard')();
*/
const fs = require('fs');
const path = require('path');
const log = require('./logging');
module.exports = function nestingGuard() {
try {
const dataDir = require('../config/paths').dataDir;
const dataDataPath = path.join(dataDir, 'data');
// If data/data exists, it's a recursive duplicate — remove it
if (fs.existsSync(dataDataPath)) {
const stat = fs.statSync(dataDataPath);
if (stat.isDirectory()) {
// Verify it's truly a duplicate (contains config.json like the parent)
const markerFile = path.join(dataDataPath, 'config.json');
const parentMarker = path.join(dataDir, 'config.json');
if (fs.existsSync(markerFile) && fs.existsSync(parentMarker)) {
const size = require('child_process')
.execSync(`du -sh '${dataDataPath}' 2>/dev/null | cut -f1`)
.toString().trim();
log.warn('startup', `Removing recursive data nesting: ${dataDataPath} (${size})`);
fs.rmSync(dataDataPath, { recursive: true, force: true });
log.info('startup', 'Recursive nesting removed');
}
}
}
} catch (e) {
// Non-fatal — don't crash startup over cleanup
log.warn('startup', `Nesting guard skipped: ${e.message}`);
}
};