mirror of
https://github.com/dokploy/dokploy.git
synced 2026-06-14 03:19:49 +00:00
5f5ed0f2c2
Add 10s AbortSignal timeout to all template fetch calls so they fail cleanly instead of hanging indefinitely when templates.dokploy.com is unreachable. Add try/catch to getTags endpoint which was missing error handling, causing a 500 instead of returning an empty list. Closes #4282
106 lines
2.3 KiB
TypeScript
106 lines
2.3 KiB
TypeScript
import { parse } from "toml";
|
|
|
|
/**
|
|
* Complete template interface that includes both metadata and configuration
|
|
*/
|
|
export interface CompleteTemplate {
|
|
metadata: {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
tags: string[];
|
|
version: string;
|
|
logo: string;
|
|
links: {
|
|
github: string;
|
|
website?: string;
|
|
docs?: string;
|
|
};
|
|
};
|
|
variables: {
|
|
[key: string]: string;
|
|
};
|
|
config: {
|
|
domains: Array<{
|
|
serviceName: string;
|
|
port: number;
|
|
path?: string;
|
|
host?: string;
|
|
}>;
|
|
env: Record<string, string>;
|
|
mounts?: Array<{
|
|
filePath: string;
|
|
content: string;
|
|
}>;
|
|
};
|
|
}
|
|
|
|
interface TemplateMetadata {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
version: string;
|
|
logo: string;
|
|
links: {
|
|
github: string;
|
|
website?: string;
|
|
docs?: string;
|
|
};
|
|
tags: string[];
|
|
}
|
|
|
|
/**
|
|
* Fetches the list of available templates from meta.json
|
|
*/
|
|
export async function fetchTemplatesList(
|
|
baseUrl = "https://templates.dokploy.com",
|
|
): Promise<TemplateMetadata[]> {
|
|
const response = await fetch(`${baseUrl}/meta.json`, {
|
|
signal: AbortSignal.timeout(10000),
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
}
|
|
const templates = (await response.json()) as TemplateMetadata[];
|
|
return templates.map((template) => ({
|
|
id: template.id,
|
|
name: template.name,
|
|
description: template.description,
|
|
version: template.version,
|
|
logo: template.logo,
|
|
links: template.links,
|
|
tags: template.tags,
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* Fetches a specific template's files
|
|
*/
|
|
export async function fetchTemplateFiles(
|
|
templateId: string,
|
|
baseUrl = "https://templates.dokploy.com",
|
|
): Promise<{ config: CompleteTemplate; dockerCompose: string }> {
|
|
const timeout = AbortSignal.timeout(10000);
|
|
const [templateYmlResponse, dockerComposeResponse] = await Promise.all([
|
|
fetch(`${baseUrl}/blueprints/${templateId}/template.toml`, {
|
|
signal: timeout,
|
|
}),
|
|
fetch(`${baseUrl}/blueprints/${templateId}/docker-compose.yml`, {
|
|
signal: timeout,
|
|
}),
|
|
]);
|
|
|
|
if (!templateYmlResponse.ok || !dockerComposeResponse.ok) {
|
|
throw new Error("Template files not found");
|
|
}
|
|
|
|
const [templateYml, dockerCompose] = await Promise.all([
|
|
templateYmlResponse.text(),
|
|
dockerComposeResponse.text(),
|
|
]);
|
|
|
|
const config = parse(templateYml) as CompleteTemplate;
|
|
|
|
return { config, dockerCompose };
|
|
}
|