hatchkit 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +131 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +629 -0
- package/dist/config.js.map +1 -0
- package/dist/deploy/coolify.d.ts +4 -0
- package/dist/deploy/coolify.d.ts.map +1 -0
- package/dist/deploy/coolify.js +20 -0
- package/dist/deploy/coolify.js.map +1 -0
- package/dist/deploy/github.d.ts +4 -0
- package/dist/deploy/github.d.ts.map +1 -0
- package/dist/deploy/github.js +39 -0
- package/dist/deploy/github.js.map +1 -0
- package/dist/deploy/gpu.d.ts +4 -0
- package/dist/deploy/gpu.d.ts.map +1 -0
- package/dist/deploy/gpu.js +97 -0
- package/dist/deploy/gpu.js.map +1 -0
- package/dist/deploy/keys.d.ts +9 -0
- package/dist/deploy/keys.d.ts.map +1 -0
- package/dist/deploy/keys.js +73 -0
- package/dist/deploy/keys.js.map +1 -0
- package/dist/deploy/terraform.d.ts +4 -0
- package/dist/deploy/terraform.d.ts.map +1 -0
- package/dist/deploy/terraform.js +55 -0
- package/dist/deploy/terraform.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +599 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +52 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +313 -0
- package/dist/prompts.js.map +1 -0
- package/dist/provision/glitchtip.d.ts +6 -0
- package/dist/provision/glitchtip.d.ts.map +1 -0
- package/dist/provision/glitchtip.js +46 -0
- package/dist/provision/glitchtip.js.map +1 -0
- package/dist/provision/index.d.ts +9 -0
- package/dist/provision/index.d.ts.map +1 -0
- package/dist/provision/index.js +108 -0
- package/dist/provision/index.js.map +1 -0
- package/dist/provision/openpanel.d.ts +8 -0
- package/dist/provision/openpanel.d.ts.map +1 -0
- package/dist/provision/openpanel.js +66 -0
- package/dist/provision/openpanel.js.map +1 -0
- package/dist/provision/resend.d.ts +16 -0
- package/dist/provision/resend.d.ts.map +1 -0
- package/dist/provision/resend.js +43 -0
- package/dist/provision/resend.js.map +1 -0
- package/dist/scaffold/app.d.ts +13 -0
- package/dist/scaffold/app.d.ts.map +1 -0
- package/dist/scaffold/app.js +340 -0
- package/dist/scaffold/app.js.map +1 -0
- package/dist/scaffold/dotenvx.d.ts +30 -0
- package/dist/scaffold/dotenvx.d.ts.map +1 -0
- package/dist/scaffold/dotenvx.js +142 -0
- package/dist/scaffold/dotenvx.js.map +1 -0
- package/dist/scaffold/infra.d.ts +17 -0
- package/dist/scaffold/infra.d.ts.map +1 -0
- package/dist/scaffold/infra.js +200 -0
- package/dist/scaffold/infra.js.map +1 -0
- package/dist/scaffold/manifest.d.ts +50 -0
- package/dist/scaffold/manifest.d.ts.map +1 -0
- package/dist/scaffold/manifest.js +83 -0
- package/dist/scaffold/manifest.js.map +1 -0
- package/dist/scaffold/ml-client.d.ts +20 -0
- package/dist/scaffold/ml-client.d.ts.map +1 -0
- package/dist/scaffold/ml-client.js +38 -0
- package/dist/scaffold/ml-client.js.map +1 -0
- package/dist/scaffold/pkg-json.d.ts +20 -0
- package/dist/scaffold/pkg-json.d.ts.map +1 -0
- package/dist/scaffold/pkg-json.js +113 -0
- package/dist/scaffold/pkg-json.js.map +1 -0
- package/dist/scaffold/starter-files.d.ts +40 -0
- package/dist/scaffold/starter-files.d.ts.map +1 -0
- package/dist/scaffold/starter-files.js +197 -0
- package/dist/scaffold/starter-files.js.map +1 -0
- package/dist/scaffold/update.d.ts +8 -0
- package/dist/scaffold/update.d.ts.map +1 -0
- package/dist/scaffold/update.js +255 -0
- package/dist/scaffold/update.js.map +1 -0
- package/dist/templates/addons/analytics/middleware.ts.hbs +13 -0
- package/dist/templates/addons/analytics/sentry.ts.hbs +16 -0
- package/dist/templates/addons/storage/s3.ts.hbs +40 -0
- package/dist/templates/addons/storage/upload.ts.hbs +23 -0
- package/dist/templates/addons/stripe/checkout.ts.hbs +27 -0
- package/dist/templates/addons/stripe/client.ts.hbs +6 -0
- package/dist/templates/addons/stripe/webhook.ts.hbs +39 -0
- package/dist/templates/addons/websocket/redis.ts.hbs +25 -0
- package/dist/templates/addons/websocket/ws.ts.hbs +32 -0
- package/dist/templates/base/.dockerignore.hbs +7 -0
- package/dist/templates/base/Dockerfile.hbs +18 -0
- package/dist/templates/base/env.example.hbs +60 -0
- package/dist/templates/base/github-actions.yml.hbs +35 -0
- package/dist/templates/base/gitignore.hbs +5 -0
- package/dist/templates/base/package.json.hbs +36 -0
- package/dist/templates/base/src/auth/auth.ts.hbs +13 -0
- package/dist/templates/base/src/auth/routes.ts.hbs +19 -0
- package/dist/templates/base/src/config.ts.hbs +36 -0
- package/dist/templates/base/src/db.ts.hbs +12 -0
- package/dist/templates/base/src/index.ts.hbs +80 -0
- package/dist/templates/base/src/routes/health.ts.hbs +12 -0
- package/dist/templates/base/tsconfig.json.hbs +18 -0
- package/dist/templates/ml-clients/3d-extraction.ts.hbs +20 -0
- package/dist/templates/ml-clients/background-removal.ts.hbs +17 -0
- package/dist/templates/ml-clients/custom-hf.ts.hbs +20 -0
- package/dist/templates/ml-clients/image-recognition.ts.hbs +22 -0
- package/dist/templates/ml-clients/subtitles.ts.hbs +26 -0
- package/dist/utils/coolify-api.d.ts +45 -0
- package/dist/utils/coolify-api.d.ts.map +1 -0
- package/dist/utils/coolify-api.js +72 -0
- package/dist/utils/coolify-api.js.map +1 -0
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +31 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/exec.d.ts +23 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +47 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/flags.d.ts +17 -0
- package/dist/utils/flags.d.ts.map +1 -0
- package/dist/utils/flags.js +116 -0
- package/dist/utils/flags.js.map +1 -0
- package/dist/utils/hf-api.d.ts +13 -0
- package/dist/utils/hf-api.d.ts.map +1 -0
- package/dist/utils/hf-api.js +30 -0
- package/dist/utils/hf-api.js.map +1 -0
- package/dist/utils/ports.d.ts +29 -0
- package/dist/utils/ports.d.ts.map +1 -0
- package/dist/utils/ports.js +86 -0
- package/dist/utils/ports.js.map +1 -0
- package/dist/utils/secrets.d.ts +25 -0
- package/dist/utils/secrets.d.ts.map +1 -0
- package/dist/utils/secrets.js +51 -0
- package/dist/utils/secrets.js.map +1 -0
- package/dist/utils/template.d.ts +7 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +35 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/validate.d.ts +16 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +60 -0
- package/dist/utils/validate.js.map +1 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +21 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +48 -0
- package/scripts/copy-templates.mjs +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,oDAAoD;AACpD,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB5F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { getCoolifyConfig } from "../config.js";
|
|
4
|
+
import { execStream } from "../utils/exec.js";
|
|
5
|
+
/** Run the Coolify setup script for the project. */
|
|
6
|
+
export async function runCoolifySetup(config, repoRoot) {
|
|
7
|
+
const coolifyConfig = await getCoolifyConfig();
|
|
8
|
+
const envFile = join(repoRoot, "stacks", `${config.name}.env`);
|
|
9
|
+
console.log(chalk.bold("\n ── Coolify Setup ─────────────────────────────────────────\n"));
|
|
10
|
+
const env = {};
|
|
11
|
+
if (coolifyConfig?.token) {
|
|
12
|
+
env.COOLIFY_TOKEN = coolifyConfig.token;
|
|
13
|
+
}
|
|
14
|
+
const exitCode = await execStream(join(repoRoot, "scripts", "setup-coolify-stack.sh"), ["--config", envFile], { cwd: repoRoot, env });
|
|
15
|
+
if (exitCode !== 0) {
|
|
16
|
+
throw new Error("Coolify setup failed");
|
|
17
|
+
}
|
|
18
|
+
console.log(chalk.green("\n ✓ Coolify app stack created"));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=coolify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAqB,EAAE,QAAgB;IAC3E,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAE5F,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,wBAAwB,CAAC,EACnD,CAAC,UAAU,EAAE,OAAO,CAAC,EACrB,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CACvB,CAAC;IAEF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,2DAA2D;AAC3D,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiD/F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { exec } from "../utils/exec.js";
|
|
3
|
+
/** Initialize git repo, create GitHub remote, and push. */
|
|
4
|
+
export async function setupGitHub(config, appDir) {
|
|
5
|
+
console.log(chalk.bold("\n ── GitHub ────────────────────────────────────────────────\n"));
|
|
6
|
+
// Git init
|
|
7
|
+
await exec("git", ["init"], {
|
|
8
|
+
cwd: appDir,
|
|
9
|
+
spinner: "Initializing git repo...",
|
|
10
|
+
});
|
|
11
|
+
// Initial commit
|
|
12
|
+
await exec("git", ["add", "-A"], { cwd: appDir });
|
|
13
|
+
await exec("git", ["commit", "-m", "Initial scaffold"], {
|
|
14
|
+
cwd: appDir,
|
|
15
|
+
spinner: "Creating initial commit...",
|
|
16
|
+
});
|
|
17
|
+
if (!config.createGithubRepo) {
|
|
18
|
+
console.log(chalk.dim(" Skipped GitHub remote creation."));
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
// Create GitHub repo
|
|
22
|
+
const createResult = await exec("gh", ["repo", "create", config.name, "--private", "--source=.", "--push"], { cwd: appDir, spinner: `Creating GitHub repo: ${config.name}...` });
|
|
23
|
+
if (createResult.exitCode !== 0) {
|
|
24
|
+
console.log(chalk.yellow(" Could not create GitHub repo. Your local git repo is ready;"));
|
|
25
|
+
console.log(chalk.yellow(` push it manually once the remote exists:`));
|
|
26
|
+
console.log(chalk.dim(` cd ${appDir}`));
|
|
27
|
+
console.log(chalk.dim(` gh repo create ${config.name} --private --source=. --push`));
|
|
28
|
+
console.log(chalk.yellow(' Note: the Coolify env will have GITHUB_REPO_URL="" — update it after pushing.'));
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Get the repo URL
|
|
32
|
+
const urlResult = await exec("gh", ["repo", "view", "--json", "url", "-q", ".url"], {
|
|
33
|
+
cwd: appDir,
|
|
34
|
+
});
|
|
35
|
+
const repoUrl = urlResult.stdout.trim();
|
|
36
|
+
console.log(chalk.green(` ✓ GitHub repo: ${repoUrl}`));
|
|
37
|
+
return repoUrl;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB,EAAE,MAAc;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAE5F,WAAW;IACX,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;QAC1B,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,0BAA0B;KACpC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE;QACtD,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,4BAA4B;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,IAAI,CAC7B,IAAI,EACJ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,EACpE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,KAAK,EAAE,CACpE,CAAC;IAEF,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,8BAA8B,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,iFAAiF,CAClF,CACF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;QAClF,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GpuPlatform, MlService } from "../prompts.js";
|
|
2
|
+
/** Deploy ML services that don't exist in the registry. */
|
|
3
|
+
export declare function deployMlServices(services: MlService[], platform: GpuPlatform, repoRoot: string, customHfModelId?: string): Promise<Record<string, string>>;
|
|
4
|
+
//# sourceMappingURL=gpu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu.d.ts","sourceRoot":"","sources":["../../src/deploy/gpu.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG5D,2DAA2D;AAC3D,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoDjC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { ensureGpuProvider, registerMlService } from "../config.js";
|
|
4
|
+
import { exec } from "../utils/exec.js";
|
|
5
|
+
/** Deploy ML services that don't exist in the registry. */
|
|
6
|
+
export async function deployMlServices(services, platform, repoRoot, customHfModelId) {
|
|
7
|
+
if (services.length === 0)
|
|
8
|
+
return {};
|
|
9
|
+
console.log(chalk.bold("\n ── ML Service Deployment ─────────────────────────────────\n"));
|
|
10
|
+
// Ensure GPU provider is configured
|
|
11
|
+
await ensureGpuProvider(platform);
|
|
12
|
+
const endpoints = {};
|
|
13
|
+
for (const service of services) {
|
|
14
|
+
const spinner = ora(`Deploying ${service} to ${platform}...`).start();
|
|
15
|
+
try {
|
|
16
|
+
let endpoint;
|
|
17
|
+
switch (platform) {
|
|
18
|
+
case "modal":
|
|
19
|
+
endpoint = await deployToModal(service, repoRoot, customHfModelId);
|
|
20
|
+
break;
|
|
21
|
+
case "runpod":
|
|
22
|
+
endpoint = await deployToRunpod(service, repoRoot, customHfModelId);
|
|
23
|
+
break;
|
|
24
|
+
case "hf":
|
|
25
|
+
endpoint = await deployToHf(service, customHfModelId);
|
|
26
|
+
break;
|
|
27
|
+
case "replicate":
|
|
28
|
+
endpoint = await deployToReplicate(service, repoRoot, customHfModelId);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
throw new Error(`Unsupported GPU platform: ${platform}`);
|
|
32
|
+
}
|
|
33
|
+
spinner.succeed(`${service} deployed: ${endpoint}`);
|
|
34
|
+
endpoints[service] = endpoint;
|
|
35
|
+
// Register in the shared service registry
|
|
36
|
+
registerMlService(service, {
|
|
37
|
+
platform,
|
|
38
|
+
endpoint,
|
|
39
|
+
deployedAt: new Date().toISOString().split("T")[0],
|
|
40
|
+
gpu: "A10G",
|
|
41
|
+
model: service === "custom-hf" ? customHfModelId || "custom" : service,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
spinner.fail(`Failed to deploy ${service}`);
|
|
46
|
+
console.error(chalk.red(` ${error}`));
|
|
47
|
+
// Continue with other services
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return endpoints;
|
|
51
|
+
}
|
|
52
|
+
async function deployToModal(service, repoRoot, _customHfModelId) {
|
|
53
|
+
const serviceDir = `${repoRoot}/ml/${service}/modal`;
|
|
54
|
+
const result = await exec("modal", ["deploy", "pipeline.py"], {
|
|
55
|
+
cwd: serviceDir,
|
|
56
|
+
});
|
|
57
|
+
if (result.exitCode !== 0) {
|
|
58
|
+
throw new Error(`Modal deploy failed: ${result.stderr}`);
|
|
59
|
+
}
|
|
60
|
+
// Parse endpoint URL from Modal output
|
|
61
|
+
const urlMatch = result.stdout.match(/https:\/\/\S+\.modal\.run/);
|
|
62
|
+
return urlMatch?.[0] || `https://your-org--${service}-api.modal.run`;
|
|
63
|
+
}
|
|
64
|
+
async function deployToRunpod(service, repoRoot, _customHfModelId) {
|
|
65
|
+
// RunPod requires: docker build → push → create endpoint via API
|
|
66
|
+
// For now, return a placeholder
|
|
67
|
+
console.log(chalk.yellow(" RunPod deployment requires manual Docker build + push."));
|
|
68
|
+
console.log(chalk.dim(` See: ${repoRoot}/ml/${service}/runpod/`));
|
|
69
|
+
return `https://api.runpod.ai/v2/${service}/runsync`;
|
|
70
|
+
}
|
|
71
|
+
async function deployToHf(service, customHfModelId) {
|
|
72
|
+
// HF Inference Endpoints: single API call
|
|
73
|
+
const modelId = customHfModelId || getDefaultModelId(service);
|
|
74
|
+
console.log(chalk.dim(` Creating HF Inference Endpoint for ${modelId}...`));
|
|
75
|
+
console.log(chalk.yellow(" Note: HF Endpoint creation via API requires huggingface_hub Python package."));
|
|
76
|
+
return `https://api-inference.huggingface.co/models/${modelId}`;
|
|
77
|
+
}
|
|
78
|
+
async function deployToReplicate(service, repoRoot, _customHfModelId) {
|
|
79
|
+
const serviceDir = `${repoRoot}/ml/${service}/replicate`;
|
|
80
|
+
console.log(chalk.yellow(` Replicate deployment: run 'cog push' in ${serviceDir}`));
|
|
81
|
+
return `https://api.replicate.com/v1/predictions`;
|
|
82
|
+
}
|
|
83
|
+
function getDefaultModelId(service) {
|
|
84
|
+
switch (service) {
|
|
85
|
+
case "3d-extraction":
|
|
86
|
+
return "stabilityai/stable-fast-3d";
|
|
87
|
+
case "subtitles":
|
|
88
|
+
return "openai/whisper-large-v3";
|
|
89
|
+
case "image-recognition":
|
|
90
|
+
return "openai/clip-vit-large-patch14";
|
|
91
|
+
case "background-removal":
|
|
92
|
+
return "briaai/RMBG-2.0";
|
|
93
|
+
default:
|
|
94
|
+
return "unknown";
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=gpu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/deploy/gpu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Print the private key for a project to stdout. */
|
|
2
|
+
export declare function showProjectKey(projectName: string): Promise<void>;
|
|
3
|
+
/** Push DOTENV_PRIVATE_KEY_PRODUCTION onto a Coolify application.
|
|
4
|
+
* Resolves the application by name, defaulting to `<project>-web`
|
|
5
|
+
* which matches scaffoldInfra's naming convention. */
|
|
6
|
+
export declare function pushProjectKeyToCoolify(projectName: string, options?: {
|
|
7
|
+
appName?: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/deploy/keys.ts"],"names":[],"mappings":"AAoBA,qDAAqD;AACrD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;AAED;;uDAEuD;AACvD,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* `hatchkit keys` subcommands — retrieve + push the per-project
|
|
3
|
+
* dotenvx private key that lives in the OS keychain.
|
|
4
|
+
*
|
|
5
|
+
* keys show <project> Print the DOTENV_PRIVATE_KEY_PRODUCTION for
|
|
6
|
+
* the named project so the user can paste it
|
|
7
|
+
* into Coolify / a CI secret / etc.
|
|
8
|
+
*
|
|
9
|
+
* keys push <project> Upsert DOTENV_PRIVATE_KEY_PRODUCTION as an
|
|
10
|
+
* env var on the project's Coolify
|
|
11
|
+
* application. Requires Coolify to already be
|
|
12
|
+
* configured and the application to exist.
|
|
13
|
+
*/
|
|
14
|
+
import chalk from "chalk";
|
|
15
|
+
import ora from "ora";
|
|
16
|
+
import { getCoolifyConfig } from "../config.js";
|
|
17
|
+
import { CoolifyApi } from "../utils/coolify-api.js";
|
|
18
|
+
import { SECRET_KEYS, getSecret } from "../utils/secrets.js";
|
|
19
|
+
/** Print the private key for a project to stdout. */
|
|
20
|
+
export async function showProjectKey(projectName) {
|
|
21
|
+
const key = await getSecret(SECRET_KEYS.dotenvxPrivateKey(projectName));
|
|
22
|
+
if (!key) {
|
|
23
|
+
console.error(chalk.red(` No dotenvx key found for project "${projectName}" in the keychain.`));
|
|
24
|
+
console.error(chalk.dim(" This usually means the project was scaffolded before dotenvx integration, or `config reset` cleared the keychain."));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
// Print plainly so it's easy to pipe into pbcopy etc. No chalk
|
|
28
|
+
// around the value — chalk adds ANSI codes that corrupt the key
|
|
29
|
+
// when redirected.
|
|
30
|
+
process.stdout.write(`${key}\n`);
|
|
31
|
+
}
|
|
32
|
+
/** Push DOTENV_PRIVATE_KEY_PRODUCTION onto a Coolify application.
|
|
33
|
+
* Resolves the application by name, defaulting to `<project>-web`
|
|
34
|
+
* which matches scaffoldInfra's naming convention. */
|
|
35
|
+
export async function pushProjectKeyToCoolify(projectName, options = {}) {
|
|
36
|
+
const key = await getSecret(SECRET_KEYS.dotenvxPrivateKey(projectName));
|
|
37
|
+
if (!key) {
|
|
38
|
+
throw new Error(`No dotenvx key in keychain for project "${projectName}". Was it scaffolded with dotenvx integration?`);
|
|
39
|
+
}
|
|
40
|
+
const coolify = await getCoolifyConfig();
|
|
41
|
+
if (!coolify) {
|
|
42
|
+
throw new Error("Coolify is not configured. Run `hatchkit config add coolify` first.");
|
|
43
|
+
}
|
|
44
|
+
const api = new CoolifyApi({ url: coolify.url, token: coolify.token });
|
|
45
|
+
const appName = options.appName ?? `${projectName}-web`;
|
|
46
|
+
const spinner = ora(`Resolving Coolify app "${appName}"`).start();
|
|
47
|
+
let uuid;
|
|
48
|
+
try {
|
|
49
|
+
const apps = await api.listApplications();
|
|
50
|
+
const match = apps.find((a) => a.name === appName);
|
|
51
|
+
if (!match) {
|
|
52
|
+
spinner.fail(`No Coolify application named "${appName}". Run \`hatchkit create\` with runDeployment first.`);
|
|
53
|
+
throw new Error(`Coolify app not found: ${appName}`);
|
|
54
|
+
}
|
|
55
|
+
uuid = match.uuid;
|
|
56
|
+
spinner.succeed(`Found app ${appName} (${uuid})`);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (spinner.isSpinning)
|
|
60
|
+
spinner.fail();
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
const pushSpinner = ora("Upserting DOTENV_PRIVATE_KEY_PRODUCTION on Coolify").start();
|
|
64
|
+
try {
|
|
65
|
+
await api.setAppEnv(uuid, { DOTENV_PRIVATE_KEY_PRODUCTION: key });
|
|
66
|
+
pushSpinner.succeed("Key pushed to Coolify");
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
pushSpinner.fail("Coolify env update failed");
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/deploy/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../src/deploy/terraform.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,qCAAqC;AACrC,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEzF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { getDnsConfig, getHetznerToken, getS3Config } from "../config.js";
|
|
4
|
+
import { exec, execStream } from "../utils/exec.js";
|
|
5
|
+
/** Run Terraform for the project. */
|
|
6
|
+
export async function runTerraform(config, repoRoot) {
|
|
7
|
+
const hetznerToken = await getHetznerToken();
|
|
8
|
+
const dnsConfig = await getDnsConfig();
|
|
9
|
+
const stackDir = config.deployTarget === "new"
|
|
10
|
+
? join(repoRoot, "terraform", "stacks", "node-realtime")
|
|
11
|
+
: join(repoRoot, "terraform", "stacks", "dns-only");
|
|
12
|
+
const tfvarsFile = join(stackDir, `${config.name}.tfvars`);
|
|
13
|
+
// Build env vars for Terraform
|
|
14
|
+
const env = {};
|
|
15
|
+
if (hetznerToken) {
|
|
16
|
+
env.TF_VAR_hcloud_token = hetznerToken;
|
|
17
|
+
}
|
|
18
|
+
if (dnsConfig?.provider === "inwx") {
|
|
19
|
+
env.TF_VAR_inwx_username = dnsConfig.username || "";
|
|
20
|
+
env.TF_VAR_inwx_password = dnsConfig.password || "";
|
|
21
|
+
}
|
|
22
|
+
if (config.features.includes("s3") &&
|
|
23
|
+
config.s3Provider !== "existing" &&
|
|
24
|
+
config.s3Provider !== "none") {
|
|
25
|
+
const s3 = await getS3Config(config.s3Provider);
|
|
26
|
+
if (s3) {
|
|
27
|
+
env.TF_VAR_s3_access_key = s3.accessKey;
|
|
28
|
+
env.TF_VAR_s3_secret_key = s3.secretKey;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
console.log(chalk.bold("\n ── Terraform ──────────────────────────────────────────────\n"));
|
|
32
|
+
// Init
|
|
33
|
+
const initResult = await exec("terraform", ["init"], {
|
|
34
|
+
cwd: stackDir,
|
|
35
|
+
env,
|
|
36
|
+
spinner: "Initializing Terraform...",
|
|
37
|
+
});
|
|
38
|
+
if (initResult.exitCode !== 0) {
|
|
39
|
+
throw new Error("Terraform init failed");
|
|
40
|
+
}
|
|
41
|
+
// Plan
|
|
42
|
+
console.log(chalk.dim("\n Running terraform plan...\n"));
|
|
43
|
+
const planExitCode = await execStream("terraform", ["plan", `-var-file=${tfvarsFile}`, "-out=tfplan"], { cwd: stackDir, env });
|
|
44
|
+
if (planExitCode !== 0) {
|
|
45
|
+
throw new Error("Terraform plan failed");
|
|
46
|
+
}
|
|
47
|
+
// Apply
|
|
48
|
+
console.log();
|
|
49
|
+
const applyExitCode = await execStream("terraform", ["apply", "tfplan"], { cwd: stackDir, env });
|
|
50
|
+
if (applyExitCode !== 0) {
|
|
51
|
+
throw new Error("Terraform apply failed");
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.green("\n ✓ Terraform apply complete"));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=terraform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/deploy/terraform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|