fix: mount openclaw routes at /openclaw prefix + fix docker.client wrapper + strip duplicate /apps/ paths across sub-routers

- openClawRoutes was mounted at root causing /status vs /openclaw/status mismatch
- ctx.docker is a typed wrapper {client,pull,...} — all calls now use docker.client.*
- templates/deploy/removal/restore sub-routers had /apps/ hardcoded in inner routes
  causing double-stacking when mounted under /apps (→ /apps/apps/templates etc)
- openclaw.js: GET /status, POST /deploy, GET/POST /proxy/*, DELETE /
This commit is contained in:
Hermes
2026-05-27 22:20:21 -07:00
parent 17edb3bc90
commit e07375f642
7 changed files with 300 additions and 16 deletions
+3 -3
View File
@@ -30,7 +30,7 @@ module.exports = function({ docker, caddy, servicesStateManager, asyncHandler, e
* Pulls image, creates container, starts it, recreates Caddy config.
* Skips if container is already running.
*/
router.post('/apps/:appId/restore', asyncHandler(async (req, res) => {
router.post('/:appId/restore', asyncHandler(async (req, res) => {
const { appId } = req.params;
const services = await servicesStateManager.read();
const service = services.find(s => s.id === appId);
@@ -50,7 +50,7 @@ module.exports = function({ docker, caddy, servicesStateManager, asyncHandler, e
* Restore all services that have deployment manifests.
* Returns per-service results.
*/
router.post('/apps/restore-all', asyncHandler(async (req, res) => {
router.post('/restore-all', asyncHandler(async (req, res) => {
const services = await servicesStateManager.read();
const restoreable = services.filter(s => s.deploymentManifest);
@@ -91,7 +91,7 @@ module.exports = function({ docker, caddy, servicesStateManager, asyncHandler, e
/**
* List all services and their restore status.
*/
router.get('/apps/restore-status', asyncHandler(async (req, res) => {
router.get('/restore-status', asyncHandler(async (req, res) => {
const services = await servicesStateManager.read();
const status = [];