Files
dashcaddy/dashcaddy-api/platform-paths.js
Sami e615f24627 Add Docker hygiene, deployment manifests, and daily log digest
Prevents Docker disk bloat by adding log rotation (10MB max, 3 files)
to all container creation and update paths, auto-pruning dangling
images after deploy/remove/update, and a daily maintenance module
that cleans build cache and warns on disk thresholds.

Saves a deployment manifest in services.json at deploy time so users
can restore all their apps after a Docker purge. Adds restore-all
and restore-single endpoints that recreate containers, Caddy config,
and DNS records from the saved manifests.

Adds an hourly log collector and daily digest generator that
summarizes errors, warnings, and events across all services into
a single human-readable report with guidance on where to investigate.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:41:40 -07:00

83 lines
2.8 KiB
JavaScript

// DashCaddy Platform Paths
// Provides cross-platform path resolution for Windows and Linux deployments.
// All paths can be overridden via environment variables.
const path = require('path');
const isWindows = process.platform === 'win32';
// Base directories
const CADDY_BASE = process.env.CADDY_BASE || (isWindows ? 'C:/caddy' : '/etc/dashcaddy');
const DOCKER_DATA = process.env.DOCKER_DATA || (isWindows ? 'E:/dockerdata' : '/opt/dockerdata');
const CADDY_SITES = process.env.CADDY_SITES || path.join(CADDY_BASE, 'sites');
// Caddy PKI certificates
const CADDY_PKI = process.env.CADDY_PKI || (isWindows
? 'C:/caddy/certs/pki/authorities/local'
: '/var/lib/caddy/.local/share/caddy/pki/authorities/local');
const paths = {
// Base directories
caddyBase: CADDY_BASE,
caddySites: CADDY_SITES,
dockerData: DOCKER_DATA,
// Caddy configuration
caddyfile: process.env.CADDYFILE_PATH || path.join(CADDY_BASE, 'Caddyfile'),
caddyAdminUrl: process.env.CADDY_ADMIN_URL || (isWindows ? 'http://host.docker.internal:2019' : 'http://localhost:2019'),
// Service config files
servicesFile: process.env.SERVICES_FILE || path.join(CADDY_BASE, 'services.json'),
configFile: process.env.CONFIG_FILE || path.join(CADDY_BASE, 'config.json'),
dnsCredentialsFile: process.env.DNS_CREDENTIALS_FILE || path.join(CADDY_BASE, 'dns-credentials.json'),
// CA certificate paths
caCertDir: path.join(CADDY_SITES, 'ca'),
pkiRootCert: path.join(CADDY_PKI, 'root.crt'),
pkiIntermediateCert: path.join(CADDY_PKI, 'intermediate.crt'),
// Static site base path
sitePath: (subdomain) => path.join(CADDY_SITES, subdomain),
// Docker data path for app volumes
appData: (appName) => path.join(DOCKER_DATA, appName),
// Log digest directory
digestDir: process.env.DIGEST_DIR || path.join(CADDY_BASE, 'digests'),
// Log paths (for allowed log file access)
allowedLogPaths: isWindows
? [
process.env.LOCALAPPDATA || 'C:\\Users',
process.env.APPDATA || 'C:\\Users',
'C:\\ProgramData',
'/var/log',
'/opt'
]
: [
'/var/log',
'/opt',
'/home'
],
// Platform detection helpers
isWindows,
isLinux: process.platform === 'linux',
};
// Convert host paths to Docker-compatible mount paths
// On Windows Docker Desktop: C:/foo → //mnt/host/c/foo
// On Linux: paths pass through unchanged (native Docker)
paths.toDockerMountPath = function(hostPath) {
if (!isWindows) return hostPath;
if (hostPath.startsWith('//mnt/host/') || hostPath.startsWith('/')) return hostPath;
const match = hostPath.match(/^([A-Za-z]):[/\\](.*)$/);
if (match) {
const driveLetter = match[1].toLowerCase();
const restOfPath = match[2].replace(/\\/g, '/');
return `//mnt/host/${driveLetter}/${restOfPath}`;
}
return hostPath;
};
module.exports = paths;