diff --git a/dashcaddy-api/src/docker/self-updater.js b/dashcaddy-api/src/docker/self-updater.js index b328ec1..0da2101 100644 --- a/dashcaddy-api/src/docker/self-updater.js +++ b/dashcaddy-api/src/docker/self-updater.js @@ -105,16 +105,27 @@ class SelfUpdater extends EventEmitter { // ── Version / Identity Info ── getLocalVersion() { - try { - const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); - let commit = null; + // Resolve package.json/VERSION relative to the api root, not __dirname. + // This module is loaded via `./src/docker/self-updater` so __dirname is + // `/app/src/docker` inside the container, which has no package.json. + // Fall back to __dirname (matches the legacy root-copy contract) so + // existing callers and future restructurings keep working. + const candidates = [ + path.join(__dirname, '..', '..', 'package.json'), + path.join(__dirname, 'package.json'), + ]; + for (const pkgPath of candidates) { try { - commit = fs.readFileSync(path.join(__dirname, 'VERSION'), 'utf8').trim(); - } catch { /* ignore */ } - return { version: pkg.version, commit }; - } catch (e) { - return { version: '0.0.0', commit: null }; + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); + let commit = null; + try { + commit = fs.readFileSync(pkgPath.replace(/package\.json$/, 'VERSION'), 'utf8').trim(); + } catch { /* ignore */ } + return { version: pkg.version, commit }; + } catch { /* try next candidate */ } } + console.error('[SelfUpdater] getLocalVersion failed: no candidate package.json found'); + return { version: '0.0.0', commit: null }; } getInstanceInfo() {