Compare commits
2
Commits
7557a6364a
...
1c0d765182
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c0d765182 | ||
|
|
2cd62208ac |
@@ -549,7 +549,7 @@ const APP_TEMPLATES = {
|
||||
},
|
||||
subdomain: "dns2",
|
||||
defaultPort: 953,
|
||||
healthCheck: null,
|
||||
healthCheck: "tcp://localhost:53",
|
||||
subpathSupport: 'strip',
|
||||
setupInstructions: [
|
||||
"Configure zone files in /opt/bind9/config/",
|
||||
@@ -640,14 +640,14 @@ const APP_TEMPLATES = {
|
||||
],
|
||||
docker: {
|
||||
image: "coredns/coredns:latest",
|
||||
ports: ["53:53", "53:53/udp"],
|
||||
ports: ["{{PORT}}:53", "53:53", "53:53/udp"],
|
||||
volumes: ["/opt/coredns/config:/etc/coredns"],
|
||||
environment: {},
|
||||
command: ["-conf", "/etc/coredns/Corefile"]
|
||||
},
|
||||
subdomain: "dns4",
|
||||
defaultPort: 53,
|
||||
healthCheck: null,
|
||||
healthCheck: "tcp://localhost:53",
|
||||
subpathSupport: 'strip',
|
||||
setupInstructions: [
|
||||
"Create Corefile in /opt/coredns/config/",
|
||||
@@ -1007,7 +1007,9 @@ const APP_TEMPLATES = {
|
||||
docker: {
|
||||
image: "adminer:latest",
|
||||
ports: ["{{PORT}}:8080"],
|
||||
volumes: [],
|
||||
volumes: [
|
||||
"/opt/adminer:/var/www/html"
|
||||
],
|
||||
environment: {
|
||||
"ADMINER_DEFAULT_SERVER": "postgres"
|
||||
}
|
||||
@@ -1099,6 +1101,7 @@ const APP_TEMPLATES = {
|
||||
popularity: 85,
|
||||
difficulty: "Easy",
|
||||
isDashboardWidget: true,
|
||||
isStaticSite: true,
|
||||
widgetSelector: ".weather-widget-container",
|
||||
subdomain: null,
|
||||
defaultPort: null,
|
||||
@@ -1126,6 +1129,7 @@ const APP_TEMPLATES = {
|
||||
popularity: 80,
|
||||
difficulty: "Easy",
|
||||
isDashboardWidget: true,
|
||||
isStaticSite: true,
|
||||
widgetSelector: ".clock-widget-container",
|
||||
subdomain: null,
|
||||
defaultPort: null,
|
||||
@@ -1908,7 +1912,9 @@ const APP_TEMPLATES = {
|
||||
docker: {
|
||||
image: "traefik/whoami:latest",
|
||||
ports: ["{{PORT}}:80"],
|
||||
volumes: [],
|
||||
volumes: [
|
||||
"/opt/whoami/config:/config"
|
||||
],
|
||||
environment: {}
|
||||
},
|
||||
subdomain: "whoami",
|
||||
@@ -2233,7 +2239,9 @@ const APP_TEMPLATES = {
|
||||
docker: {
|
||||
image: "excalidraw/excalidraw:latest",
|
||||
ports: ["{{PORT}}:80"],
|
||||
volumes: [],
|
||||
volumes: [
|
||||
"/opt/excalidraw/data:/var/lib/excalidraw"
|
||||
],
|
||||
environment: {}
|
||||
},
|
||||
subdomain: "draw",
|
||||
@@ -2258,7 +2266,9 @@ const APP_TEMPLATES = {
|
||||
docker: {
|
||||
image: "corentinth/it-tools:latest",
|
||||
ports: ["{{PORT}}:80"],
|
||||
volumes: [],
|
||||
volumes: [
|
||||
"/opt/it-tools/config:/config"
|
||||
],
|
||||
environment: {}
|
||||
},
|
||||
subdomain: "tools",
|
||||
@@ -2417,7 +2427,7 @@ const APP_TEMPLATES = {
|
||||
},
|
||||
subdomain: "mc",
|
||||
defaultPort: 25565,
|
||||
healthCheck: null,
|
||||
healthCheck: "tcp://localhost:25565",
|
||||
subpathSupport: 'none',
|
||||
setupInstructions: [
|
||||
"Server accepts the Minecraft EULA automatically",
|
||||
@@ -2451,7 +2461,7 @@ const APP_TEMPLATES = {
|
||||
},
|
||||
subdomain: "valheim",
|
||||
defaultPort: 2456,
|
||||
healthCheck: null,
|
||||
healthCheck: "tcp://localhost:2456",
|
||||
subpathSupport: 'none',
|
||||
setupInstructions: [
|
||||
"Connect via Steam: Add Server > IP:2456",
|
||||
|
||||
@@ -317,6 +317,9 @@ class LicenseManager {
|
||||
*/
|
||||
isExpired() {
|
||||
if (!this.activation) return true;
|
||||
// Lifetime licenses never expire
|
||||
if (this.activation.lifetime || this.activation.durationDays === 0) return false;
|
||||
if (!this.activation.expiresAt) return false; // No expiry set = lifetime
|
||||
return Date.now() > new Date(this.activation.expiresAt).getTime();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dashcaddy-api",
|
||||
"version": "1.10.0",
|
||||
"version": "1.11.0",
|
||||
"description": "DashCaddy API server - Dashboard backend for Docker, Caddy & DNS management",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
|
||||
@@ -46,20 +46,20 @@ module.exports = function(ctx) {
|
||||
// Mount sub-routes — pass full ctx so sub-routes can reference ctx.* properties
|
||||
const subCtx = Object.assign({}, ctx, { helpers });
|
||||
|
||||
try { router.use('/deploy', initDeploy(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] deploy routes init failed:', e.message); }
|
||||
try { router.use('/', initDeploy(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] deploy routes init failed:', e.message, e.stack); }
|
||||
|
||||
try { router.use('/remove', initRemoval(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] removal routes init failed:', e.message); }
|
||||
try { router.use('/', initRemoval(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] removal routes init failed:', e.message, e.stack); }
|
||||
|
||||
try { router.use('/apps', initTemplates(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] templates routes init failed:', e.message); }
|
||||
try { router.use('/', initTemplates(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] templates routes init failed:', e.message, e.stack); }
|
||||
|
||||
try { router.use('/restore', initRestore(Object.assign({}, subCtx, { backupManager: ctx.backupManager }))); }
|
||||
catch(e) { (ctx.log || console).error('[apps] restore routes init failed:', e.message); }
|
||||
try { router.use('/', initRestore(Object.assign({}, subCtx, { backupManager: ctx.backupManager }))); }
|
||||
catch(e) { (ctx.log || console).error('[apps] restore routes init failed:', e.message, e.stack); }
|
||||
|
||||
try { router.use('/compose', initCompose(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] compose routes init failed:', e.message); }
|
||||
try { router.use('/', initCompose(subCtx)); }
|
||||
catch(e) { (ctx.log || console).error('[apps] compose routes init failed:', e.message, e.stack); }
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
@@ -73,9 +73,12 @@ process.on('uncaughtException', (error) => {
|
||||
try { bundledWorkflows = require('./bundled-workflows'); } catch { /* optional */ }
|
||||
|
||||
// Initialize workflow engine if bundled-workflows is available
|
||||
// NOTE: createApp() already initializes the workflow engine in src/app.js
|
||||
// This block is kept for backward compat with entry points that don't use createApp()
|
||||
let workflowEngine = null;
|
||||
if (bundledWorkflows) {
|
||||
try {
|
||||
const { fetchT } = require('./src/utils/http');
|
||||
const { WorkflowEngine } = bundledWorkflows;
|
||||
// Create a context with needed services
|
||||
const workflowCtx = {
|
||||
|
||||
@@ -539,7 +539,7 @@ async function createApp() {
|
||||
sslMonitor: ctx.sslMonitor,
|
||||
dnsPropagationChecker: ctx.dnsPropagationChecker
|
||||
}));
|
||||
apiRouter.use(workflowsRoutes({
|
||||
apiRouter.use('/workflows', workflowsRoutes({
|
||||
workflowEngine: ctx.workflowEngine,
|
||||
licenseManager: ctx.licenseManager,
|
||||
asyncHandler: ctx.asyncHandler
|
||||
|
||||
Reference in New Issue
Block a user