hatchkit 0.1.39 → 0.1.40

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.
Files changed (42) hide show
  1. package/dist/adopt.js +6 -4
  2. package/dist/adopt.js.map +1 -1
  3. package/dist/deploy/coolify-app.d.ts +9 -9
  4. package/dist/deploy/coolify-app.d.ts.map +1 -1
  5. package/dist/deploy/coolify-app.js +14 -19
  6. package/dist/deploy/coolify-app.js.map +1 -1
  7. package/dist/deploy/coolify.d.ts.map +1 -1
  8. package/dist/deploy/coolify.js +6 -2
  9. package/dist/deploy/coolify.js.map +1 -1
  10. package/dist/deploy/keys.d.ts +7 -2
  11. package/dist/deploy/keys.d.ts.map +1 -1
  12. package/dist/deploy/keys.js +27 -7
  13. package/dist/deploy/keys.js.map +1 -1
  14. package/dist/deploy/rollback.d.ts.map +1 -1
  15. package/dist/deploy/rollback.js +80 -22
  16. package/dist/deploy/rollback.js.map +1 -1
  17. package/dist/deploy/sync.d.ts +10 -7
  18. package/dist/deploy/sync.d.ts.map +1 -1
  19. package/dist/deploy/sync.js +13 -9
  20. package/dist/deploy/sync.js.map +1 -1
  21. package/dist/index.js +77 -6
  22. package/dist/index.js.map +1 -1
  23. package/dist/inventory.d.ts +107 -0
  24. package/dist/inventory.d.ts.map +1 -0
  25. package/dist/inventory.js +1522 -0
  26. package/dist/inventory.js.map +1 -0
  27. package/dist/prompts.d.ts +0 -7
  28. package/dist/prompts.d.ts.map +1 -1
  29. package/dist/prompts.js +1 -7
  30. package/dist/prompts.js.map +1 -1
  31. package/dist/scaffold/app.js +1 -1
  32. package/dist/scaffold/app.js.map +1 -1
  33. package/dist/scaffold/infra.js +1 -1
  34. package/dist/utils/coolify-api.d.ts +11 -0
  35. package/dist/utils/coolify-api.d.ts.map +1 -1
  36. package/dist/utils/coolify-api.js +25 -0
  37. package/dist/utils/coolify-api.js.map +1 -1
  38. package/dist/utils/coolify-server-ips.d.ts +6 -12
  39. package/dist/utils/coolify-server-ips.d.ts.map +1 -1
  40. package/dist/utils/coolify-server-ips.js +26 -81
  41. package/dist/utils/coolify-server-ips.js.map +1 -1
  42. package/package.json +1 -1
@@ -12,26 +12,16 @@
12
12
  * common Docker-on-the-same-box install. That string IS NOT a
13
13
  * routable IPv4 — it's the container-internal alias for the Docker
14
14
  * host. Pointing DNS A records at it (Cloudflare or otherwise) gets
15
- * rejected by the API. We have to look elsewhere for the real public
16
- * IP. Two sources are tried, in order, with a cross-check:
15
+ * rejected by the API. So we ask /servers/{uuid}/domains, which
16
+ * surfaces the configured public_ipv4 / public_ipv6 (the values the
17
+ * operator entered when registering the "localhost" server). On
18
+ * non-Docker installs /servers itself already returns a real IPv4,
19
+ * so we fall back to that.
17
20
  *
18
- * 1. GET /servers/{uuid}/domains. For Docker-based Coolify this
19
- * endpoint surfaces the configured public_ipv4 / public_ipv6
20
- * (the values the operator entered when registering the
21
- * "localhost" server). It's the box's self-reported truth.
22
- * 2. DNS resolution of the Coolify dashboard hostname. The user is
23
- * reaching Coolify over the public internet, so the dashboard's
24
- * A / AAAA records ARE necessarily the box's public IP. This
25
- * catches setups where /servers/{uuid}/domains 404s (older
26
- * Coolify) or the operator left public_ipv4 unset.
27
- *
28
- * When both sources give us an IPv4 and they disagree, we surface a
29
- * yellow warning (stale public_ipv4, misconfigured floating IP, proxy
30
- * in front of the wrong box, …) and proceed with Coolify's value.
21
+ * Coolify is the source of truth — no DNS cross-check, no second
22
+ * opinion. If /servers/{uuid}/domains is wrong, the user fixes it
23
+ * in the dashboard.
31
24
  */
32
- import { resolve4, resolve6 } from "node:dns/promises";
33
- import chalk from "chalk";
34
- import ora from "ora";
35
25
  /** True for valid public-routable IPv4 strings. Filters out the
36
26
  * values Coolify hands back on Docker installs (`host.docker.internal`,
37
27
  * `localhost`, `127.0.0.1`) plus IPv6, which we don't auto-manage. */
@@ -59,77 +49,32 @@ export function isPublicIpv6(s) {
59
49
  return false; // link-local
60
50
  return true;
61
51
  }
62
- /** Resolve the box's public IPv4 + IPv6, preferring Coolify's
63
- * configured values (via /servers/{uuid}/domains, which surfaces the
64
- * instance's `public_ipv4` / `public_ipv6` for localhost-Coolify
65
- * installs that report `host.docker.internal` on /servers), falling
66
- * back to DNS resolution of the dashboard hostname. Cross-checks
67
- * the two IPv4 sources and surfaces a warning when they disagree. */
68
- export async function discoverPublicIps(api, serverUuid, fallbackServerIp, dashboardUrl) {
69
- // Step 1: Coolify-reported IPs. /servers/{uuid}/domains returns
70
- // entries with `ip` set per running domain; for localhost-Coolify
71
- // this falls back to the configured public_ipv4 / public_ipv6.
72
- let coolifyV4;
73
- let coolifyV6;
52
+ /** Resolve the box's public IPv4 + IPv6 from Coolify. Prefers
53
+ * /servers/{uuid}/domains (which surfaces public_ipv4 / public_ipv6
54
+ * for localhost-Coolify installs that report `host.docker.internal`
55
+ * on /servers), and falls back to the /servers ip field for
56
+ * non-Docker installs. */
57
+ export async function discoverPublicIps(api, serverUuid, fallbackServerIp) {
58
+ let v4;
59
+ let v6;
74
60
  try {
75
61
  const domains = await api.getServerDomains(serverUuid);
76
62
  for (const d of domains) {
77
63
  const ip = (d.ip ?? "").trim();
78
- if (!coolifyV4 && isPublicIpv4(ip))
79
- coolifyV4 = ip;
80
- if (!coolifyV6 && isPublicIpv6(ip))
81
- coolifyV6 = ip;
64
+ if (!v4 && isPublicIpv4(ip))
65
+ v4 = ip;
66
+ if (!v6 && isPublicIpv6(ip))
67
+ v6 = ip;
82
68
  }
83
69
  }
84
70
  catch {
85
71
  // /servers/{uuid}/domains can 404 / 501 on older Coolify builds.
86
- // Treat as "Coolify doesn't know" and fall back to DNS only.
87
- }
88
- // /servers itself may return a real IPv4 on non-Docker installs —
89
- // use it as a last-resort source.
90
- if (!coolifyV4 && isPublicIpv4(fallbackServerIp))
91
- coolifyV4 = fallbackServerIp;
92
- if (!coolifyV6 && isPublicIpv6(fallbackServerIp))
93
- coolifyV6 = fallbackServerIp;
94
- // Step 2: independent DNS resolution of the dashboard hostname.
95
- let host;
96
- try {
97
- host = new URL(dashboardUrl).hostname;
98
- }
99
- catch {
100
- /* ignore — dashboard URL might be malformed */
101
- }
102
- let dnsV4;
103
- let dnsV6;
104
- if (host && !isPublicIpv4(host)) {
105
- const spinner = ora(`Resolving ${host} for cross-check`).start();
106
- try {
107
- const [v4, v6] = await Promise.allSettled([resolve4(host), resolve6(host)]);
108
- if (v4.status === "fulfilled" && v4.value[0] && isPublicIpv4(v4.value[0])) {
109
- dnsV4 = v4.value[0];
110
- }
111
- if (v6.status === "fulfilled" && v6.value[0] && isPublicIpv6(v6.value[0])) {
112
- dnsV6 = v6.value[0];
113
- }
114
- const parts = [dnsV4 && `A ${dnsV4}`, dnsV6 && `AAAA ${dnsV6}`].filter(Boolean);
115
- spinner.succeed(`DNS for ${host}: ${parts.length > 0 ? parts.join(", ") : "no records"}`);
116
- }
117
- catch {
118
- spinner.fail(`Couldn't resolve ${host}`);
119
- }
120
- }
121
- else if (host && isPublicIpv4(host)) {
122
- dnsV4 = host;
123
- }
124
- // Step 3: cross-check + decide. Prefer Coolify's value when we have
125
- // it (it's the box's self-reported truth); fall back to DNS.
126
- const v4 = coolifyV4 ?? dnsV4;
127
- const v6 = coolifyV6 ?? dnsV6;
128
- let mismatchWarning;
129
- if (coolifyV4 && dnsV4 && coolifyV4 !== dnsV4) {
130
- mismatchWarning = `Coolify reports public IPv4 ${coolifyV4} but ${host} resolves to ${dnsV4}. Using Coolify's value; double-check the DNS records and any floating-IP / proxy setup.`;
131
- console.log(chalk.yellow(` ⚠ ${mismatchWarning}`));
72
+ // Fall through to the /servers ip field below.
132
73
  }
133
- return { v4, v6, mismatchWarning };
74
+ if (!v4 && isPublicIpv4(fallbackServerIp))
75
+ v4 = fallbackServerIp;
76
+ if (!v6 && isPublicIpv6(fallbackServerIp))
77
+ v6 = fallbackServerIp;
78
+ return { v4, v6 };
134
79
  }
135
80
  //# sourceMappingURL=coolify-server-ips.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coolify-server-ips.js","sourceRoot":"","sources":["../../src/utils/coolify-server-ips.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coolify-server-ips.js","sourceRoot":"","sources":["../../src/utils/coolify-server-ips.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;uEAEuE;AACvE,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC,CAAC,WAAW;IAC/C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;yDAEyD;AACzD,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,aAAa;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAOD;;;;2BAI2B;AAC3B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAe,EACf,UAAkB,EAClB,gBAAwB;IAExB,IAAI,EAAsB,CAAC;IAC3B,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;gBAAE,EAAE,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;gBAAE,EAAE,GAAG,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,+CAA+C;IACjD,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,YAAY,CAAC,gBAAgB,CAAC;QAAE,EAAE,GAAG,gBAAgB,CAAC;IACjE,IAAI,CAAC,EAAE,IAAI,YAAY,CAAC,gBAAgB,CAAC;QAAE,EAAE,GAAG,gBAAgB,CAAC;IACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hatchkit",
3
- "version": "0.1.39",
3
+ "version": "0.1.40",
4
4
  "packageManager": "pnpm@10.33.2",
5
5
  "description": "Interactive CLI for scaffolding full-stack projects and provisioning observability/email clients",
6
6
  "type": "module",