Bootstrap started Mihomo directly while SSClash Web UI only tracked Mihomo processes it started. This split lifecycle ownership made /api/status report stopped while Mihomo was running, so Web Start failed with “Mihomo already running”. Read-only host inspection found one SSClash and one Mihomo process and no stale PID files.
A review follow-up also found that volumes created before PR #4 retained the packaged GEOIP,CN rule and could attempt a runtime geoip.metadb download.
Fix
Make ssclash serve the only bootstrap-supervised process and let SSClash exclusively own Mihomo Start/Stop/status.
Keep the validated subscription as a managed in-memory provider link and validate updates against the persistent core/config.
Atomically migrate only the exact legacy packaged config to managed config version 1 with the local ChinaIp provider. Preserve customized legacy configs and fail with explicit remediation.
Use SSClash Web readiness for health checks and document the Web Start step.
Cover initial/same-volume Web Start, offline legacy-volume migration, and rollback failure through a fake controller.
## Root cause
Bootstrap started Mihomo directly while SSClash Web UI only tracked Mihomo processes it started. This split lifecycle ownership made `/api/status` report stopped while Mihomo was running, so Web Start failed with “Mihomo already running”. Read-only host inspection found one SSClash and one Mihomo process and no stale PID files.
A review follow-up also found that volumes created before PR #4 retained the packaged `GEOIP,CN` rule and could attempt a runtime `geoip.metadb` download.
## Fix
- Make `ssclash serve` the only bootstrap-supervised process and let SSClash exclusively own Mihomo Start/Stop/status.
- Keep the validated subscription as a managed in-memory provider link and validate updates against the persistent core/config.
- Atomically migrate only the exact legacy packaged config to managed config version 1 with the local `ChinaIp` provider. Preserve customized legacy configs and fail with explicit remediation.
- Use SSClash Web readiness for health checks and document the Web Start step.
- Cover initial/same-volume Web Start, offline legacy-volume migration, and rollback failure through a fake controller.
## Verification
- `./scripts/test.sh` (coverage 75.5%, minimum 65%)
- `./tests/container-smoke.sh mohomo-docker:hh-635-config-migration`
- `git diff --check`
Fixes HH-635
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Root cause
Bootstrap started Mihomo directly while SSClash Web UI only tracked Mihomo processes it started. This split lifecycle ownership made
/api/statusreport stopped while Mihomo was running, so Web Start failed with “Mihomo already running”. Read-only host inspection found one SSClash and one Mihomo process and no stale PID files.A review follow-up also found that volumes created before PR #4 retained the packaged
GEOIP,CNrule and could attempt a runtimegeoip.metadbdownload.Fix
ssclash servethe only bootstrap-supervised process and let SSClash exclusively own Mihomo Start/Stop/status.ChinaIpprovider. Preserve customized legacy configs and fail with explicit remediation.Verification
./scripts/test.sh(coverage 75.5%, minimum 65%)./tests/container-smoke.sh mohomo-docker:hh-635-config-migrationgit diff --checkFixes HH-635