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:
@@ -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');
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user