mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
fix(config): store config.json under the persisted data dir (#86)
CONFIG_PATH resolved to ROOT_DIR/config.json (/app/config.json in Docker), but only DATA_DIR (/app/data) is the mounted volume — every other artifact (DB, cookies, logs, avatars) already lives under DATA_DIR. So on first run the default config was written into the ephemeral image layer (never appearing in the volume), and a manually-placed data/config.json was ignored because the bot read/wrote the root path. - Move CONFIG_PATH to DATA_DIR/config.json so it lands in the volume and manual edits take effect. - Add migrateLegacyConfig(): one-time move of an existing root-level config.json into the data dir, so existing local installs keep their settings (no silent reset). - Tests for first-run persistence + the three migration cases. - README directory tree updated to data/config.json. Fixes #86 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
bea2f92508
commit
dd6affca6d
4 files changed
+102
-10
No files matched your search
+33
-1
@@ -1,4 +1,4 @@
|
||||
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
||||
import { readFileSync, writeFileSync, mkdirSync, existsSync, copyFileSync, rmSync } from "node:fs";
|
||||
import { dirname } from "node:path";
|
||||
|
||||
export interface BotConfig {
|
||||
@@ -58,3 +58,35 @@ export function saveConfig(path: string, config: BotConfig): void {
|
||||
mkdirSync(dirname(path), { recursive: true });
|
||||
writeFileSync(path, JSON.stringify(config, null, 2), "utf-8");
|
||||
}
|
||||
|
||||
/**
|
||||
* One-time migration for the config location fix (#86).
|
||||
*
|
||||
* Older versions wrote config.json to the app/repo ROOT, which is NOT inside the
|
||||
* persisted data directory (the Docker volume is mounted at data/). That meant the
|
||||
* file never landed in the volume on first run and a manually-placed data/config.json
|
||||
* was ignored. config.json now lives under the data dir alongside the DB/cookies/logs.
|
||||
*
|
||||
* If a legacy root-level config exists and the new data-dir config does not yet exist,
|
||||
* move it so existing local installs keep their customized settings. Best-effort:
|
||||
* any failure is swallowed and loadConfig falls back to defaults.
|
||||
*
|
||||
* @returns true if a legacy config was migrated, false otherwise.
|
||||
*/
|
||||
export function migrateLegacyConfig(legacyPath: string, newPath: string): boolean {
|
||||
try {
|
||||
if (legacyPath === newPath) return false;
|
||||
if (existsSync(newPath)) return false; // new location already populated — leave it
|
||||
if (!existsSync(legacyPath)) return false; // nothing to migrate
|
||||
mkdirSync(dirname(newPath), { recursive: true });
|
||||
copyFileSync(legacyPath, newPath); // copy first (works across filesystems)
|
||||
try {
|
||||
rmSync(legacyPath);
|
||||
} catch {
|
||||
/* leave the legacy file if it can't be removed; the new one wins */
|
||||
}
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user