From df0daaad463566b45254897d6c5e79ab4a00057b Mon Sep 17 00:00:00 2001 From: Krystie Date: Sat, 14 Mar 2026 06:52:18 +0100 Subject: [PATCH] Add full cross-platform path support - Added automatic volume path translation in deployment (deploy.js) - Updated FileBrowser template to use /opt/ instead of hard-coded E:/ - Migrated self-updater.js to use centralized platformPaths module - Updated UI placeholders to use platform-neutral paths (/media/) - All paths now automatically adapt to Windows or Linux at runtime via process.platform detection --- dashcaddy-api/app-templates.js | 4 ++-- dashcaddy-api/routes/apps/deploy.js | 9 ++++++++- dashcaddy-api/self-updater.js | 11 +++++------ status/js/app-selector.js | 4 ++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/dashcaddy-api/app-templates.js b/dashcaddy-api/app-templates.js index 610ca29..e5b13b8 100644 --- a/dashcaddy-api/app-templates.js +++ b/dashcaddy-api/app-templates.js @@ -672,8 +672,8 @@ const APP_TEMPLATES = { image: "filebrowser/filebrowser:latest", ports: ["{{PORT}}:80"], volumes: [ - "E:/docker-progs/filebrowser/data:/srv", - "E:/docker-progs/filebrowser/database:/database" + "/opt/filebrowser/data:/srv", + "/opt/filebrowser/database:/database" ], environment: {} }, diff --git a/dashcaddy-api/routes/apps/deploy.js b/dashcaddy-api/routes/apps/deploy.js index 841960d..8026771 100644 --- a/dashcaddy-api/routes/apps/deploy.js +++ b/dashcaddy-api/routes/apps/deploy.js @@ -106,13 +106,20 @@ module.exports = function(ctx, helpers) { throw new Error(`[DC-203] Port conflict detected: ${conflictDetails}. Please choose a different port.`); } + // Translate volume paths for cross-platform compatibility + const translatedVolumes = (processedTemplate.docker.volumes || []).map(volume => { + const [hostPath, ...rest] = volume.split(':'); + const translatedHost = platformPaths.toDockerMountPath(hostPath); + return rest.length > 0 ? `${translatedHost}:${rest.join(':')}` : translatedHost; + }); + const containerConfig = { Image: processedTemplate.docker.image, name: containerName, ExposedPorts: {}, HostConfig: { PortBindings: {}, - Binds: processedTemplate.docker.volumes || [], + Binds: translatedVolumes, RestartPolicy: { Name: 'unless-stopped' }, LogConfig: DOCKER.LOG_CONFIG }, diff --git a/dashcaddy-api/self-updater.js b/dashcaddy-api/self-updater.js index d57ae46..c5ba1de 100644 --- a/dashcaddy-api/self-updater.js +++ b/dashcaddy-api/self-updater.js @@ -16,18 +16,17 @@ const path = require('path'); const crypto = require('crypto'); const { execSync } = require('child_process'); const zlib = require('zlib'); - -const isWindows = process.platform === 'win32'; +const platformPaths = require('./platform-paths'); const DEFAULTS = { CHECK_INTERVAL: 30 * 60 * 1000, // 30 minutes UPDATE_URL: 'https://get.dashcaddy.net/release', MIRROR_URL: 'https://get2.dashcaddy.net/release', - UPDATES_DIR: isWindows ? 'C:/caddy/updates' : '/app/updates', + UPDATES_DIR: platformPaths.isWindows ? path.join(platformPaths.caddyBase, 'updates') : '/app/updates', // API_SOURCE_DIR is the HOST path — written to trigger.json for the host-side updater - API_SOURCE_DIR: isWindows ? 'C:/caddy/sites/dashcaddy-api' : '/etc/dashcaddy/sites/dashcaddy-api', + API_SOURCE_DIR: path.join(platformPaths.caddySites, 'dashcaddy-api'), // FRONTEND_DIR is the container path — dashboard is volume-mounted at /app/dashboard - FRONTEND_DIR: isWindows ? 'C:/caddy/sites/status' : '/app/dashboard', + FRONTEND_DIR: platformPaths.isWindows ? path.join(platformPaths.caddySites, 'status') : '/app/dashboard', MAX_BACKUPS: 3, HEALTH_TIMEOUT: 60000, DOWNLOAD_TIMEOUT: 120000, @@ -44,7 +43,7 @@ class SelfUpdater extends EventEmitter { updatesDir: options.updatesDir || DEFAULTS.UPDATES_DIR, // hostUpdatesDir is the HOST path that maps to updatesDir inside the container. // Used when writing trigger.json so the host-side script can find staging files. - hostUpdatesDir: options.hostUpdatesDir || (isWindows ? options.updatesDir || DEFAULTS.UPDATES_DIR : '/opt/dashcaddy/updates'), + hostUpdatesDir: options.hostUpdatesDir || (platformPaths.isWindows ? options.updatesDir || DEFAULTS.UPDATES_DIR : '/opt/dashcaddy/updates'), apiSourceDir: options.apiSourceDir || DEFAULTS.API_SOURCE_DIR, frontendDir: options.frontendDir || DEFAULTS.FRONTEND_DIR, maxBackups: parseInt(options.maxBackups || DEFAULTS.MAX_BACKUPS, 10), diff --git a/status/js/app-selector.js b/status/js/app-selector.js index 0733a5f..7442add 100644 --- a/status/js/app-selector.js +++ b/status/js/app-selector.js @@ -104,7 +104,7 @@
-