@superyachttimes/cli 1.4.0 → 1.5.0

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.
@@ -0,0 +1,20 @@
1
+ import type { PortainerInstance } from "../config.js";
2
+ export declare const hostLabel: (instance: PortainerInstance) => string;
3
+ export interface HostImage {
4
+ instance: PortainerInstance;
5
+ host: string;
6
+ image: string;
7
+ repo: string;
8
+ tag: string;
9
+ }
10
+ /** The image each api-nodejs container currently runs. */
11
+ export declare function currentImages(instances: PortainerInstance[]): Promise<HostImage[]>;
12
+ /** The single repository all hosts run; throws when they differ. */
13
+ export declare function sharedRepo(hosts: HostImage[]): string;
14
+ /**
15
+ * Pull and recreate every container one host at a time, so the API never
16
+ * loses more than one host. Stops at the first failure (its old container is
17
+ * restored). `image` overrides the image; omit it to re-pull the current one.
18
+ */
19
+ export declare function rollOut(instances: PortainerInstance[], image?: string): Promise<void>;
20
+ //# sourceMappingURL=nodejs-api-hosts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejs-api-hosts.d.ts","sourceRoot":"","sources":["../../src/commands/nodejs-api-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAKtD,eAAO,MAAM,SAAS,GAAI,UAAU,iBAAiB,WACE,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,0DAA0D;AAC1D,wBAAsB,aAAa,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAaxF;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAQrD;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F"}
@@ -0,0 +1,48 @@
1
+ import * as portainer from "../portainer/api.js";
2
+ import { splitImage } from "../portainer/image.js";
3
+ import { recreateContainer } from "../portainer/recreate.js";
4
+ export const hostLabel = (instance) => new URL(instance.portainerUrl).hostname.split(".")[0];
5
+ /** The image each api-nodejs container currently runs. */
6
+ export async function currentImages(instances) {
7
+ return Promise.all(instances.map(async (instance) => {
8
+ const container = await portainer.getContainer({
9
+ portainerUrl: instance.portainerUrl,
10
+ portainerEndpointId: instance.portainerEndpointId,
11
+ portainerApiKey: instance.portainerApiKey,
12
+ portainerContainerName: instance.portainerContainerName,
13
+ });
14
+ const image = container.Config.Image;
15
+ return { instance, host: hostLabel(instance), image, ...splitImage(image) };
16
+ }));
17
+ }
18
+ /** The single repository all hosts run; throws when they differ. */
19
+ export function sharedRepo(hosts) {
20
+ const repos = new Set(hosts.map((h) => h.repo));
21
+ if (repos.size !== 1) {
22
+ throw new Error(`hosts run different images: ${hosts.map((h) => `${h.host}=${h.image}`).join(", ")}`);
23
+ }
24
+ return [...repos][0];
25
+ }
26
+ /**
27
+ * Pull and recreate every container one host at a time, so the API never
28
+ * loses more than one host. Stops at the first failure (its old container is
29
+ * restored). `image` overrides the image; omit it to re-pull the current one.
30
+ */
31
+ export async function rollOut(instances, image) {
32
+ const total = instances.length;
33
+ for (const [i, instance] of instances.entries()) {
34
+ const prefix = `[${instance.portainerUrl} (${instance.portainerContainerName})]`;
35
+ const log = (msg) => console.log(`${prefix} ${msg}`);
36
+ log("Starting...");
37
+ try {
38
+ await recreateContainer(instance, { pull: true, image, log });
39
+ }
40
+ catch (err) {
41
+ throw new Error(`${prefix} failed: ${err.message}. ${i}/${total} instance(s) were recreated; the rest were not touched.`);
42
+ }
43
+ log("Done.");
44
+ }
45
+ console.log();
46
+ console.log(`All ${total} instance(s) completed successfully.`);
47
+ }
48
+ //# sourceMappingURL=nodejs-api-hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejs-api-hosts.js","sourceRoot":"","sources":["../../src/commands/nodejs-api-hosts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAA2B,EAAE,EAAE,CACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAUxD,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B;IAChE,OAAO,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC;YAC7C,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;YACjD,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB;SACxD,CAAC,CAAC;QACH,MAAM,KAAK,GAAW,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9E,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAA8B,EAAE,KAAc;IAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,sBAAsB,IAAI,CAAC;QACjF,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7D,GAAG,CAAC,aAAa,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,YAAa,GAAa,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,yDAAyD,CACpH,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,sCAAsC,CAAC,CAAC;AAClE,CAAC"}
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Pull the latest image and recreate every api-nodejs container, one host at
3
- * a time so the API never loses more than one of its hosts. Stops at the
4
- * first host that fails (its old container is restored).
2
+ * Pull and recreate every api-nodejs container, one host at a time. When any
3
+ * host is pinned to a tag other than `latest` (e.g. after a rollback), ask
4
+ * whether to move all hosts back to `latest`; otherwise the pinned tag is
5
+ * re-pulled as is.
5
6
  */
6
7
  export declare function recreateNodejsApi(): Promise<void>;
7
8
  //# sourceMappingURL=recreate-nodejs-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recreate-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD"}
1
+ {"version":3,"file":"recreate-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBvD"}
@@ -1,26 +1,29 @@
1
+ import { confirm } from "@inquirer/prompts";
1
2
  import { loadConfig } from "../config.js";
2
- import { recreateContainer } from "../portainer/recreate.js";
3
+ import { currentImages, rollOut, sharedRepo } from "./nodejs-api-hosts.js";
3
4
  /**
4
- * Pull the latest image and recreate every api-nodejs container, one host at
5
- * a time so the API never loses more than one of its hosts. Stops at the
6
- * first host that fails (its old container is restored).
5
+ * Pull and recreate every api-nodejs container, one host at a time. When any
6
+ * host is pinned to a tag other than `latest` (e.g. after a rollback), ask
7
+ * whether to move all hosts back to `latest`; otherwise the pinned tag is
8
+ * re-pulled as is.
7
9
  */
8
10
  export async function recreateNodejsApi() {
9
11
  const config = loadConfig();
10
- const total = config.nodejsApi.length;
11
- for (const [i, instance] of config.nodejsApi.entries()) {
12
- const prefix = `[${instance.portainerUrl} (${instance.portainerContainerName})]`;
13
- const log = (msg) => console.log(`${prefix} ${msg}`);
14
- log("Starting...");
15
- try {
16
- await recreateContainer(instance, { pull: true, log });
12
+ const hosts = await currentImages(config.nodejsApi);
13
+ const pinned = hosts.filter((h) => h.tag !== "latest");
14
+ let image;
15
+ if (pinned.length > 0) {
16
+ console.log("Not on latest:");
17
+ for (const h of pinned)
18
+ console.log(` ${h.host} ${h.tag}`);
19
+ const back = await confirm({ message: "Switch back to latest?", default: true });
20
+ if (back) {
21
+ image = `${sharedRepo(hosts)}:latest`;
17
22
  }
18
- catch (err) {
19
- throw new Error(`${prefix} failed: ${err.message}. ${i}/${total} instance(s) were recreated; the rest were not touched.`);
23
+ else {
24
+ console.log("Keeping the current tag(s); re-pulling them as they are.");
20
25
  }
21
- log("Done.");
22
26
  }
23
- console.log();
24
- console.log(`All ${total} instance(s) completed successfully.`);
27
+ await rollOut(config.nodejsApi, image);
25
28
  }
26
29
  //# sourceMappingURL=recreate-nodejs-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recreate-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IAEtC,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,sBAAsB,IAAI,CAAC;QACjF,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7D,GAAG,CAAC,aAAa,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,YAAa,GAAa,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,yDAAyD,CACpH,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,sCAAsC,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"recreate-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;IAEvD,IAAI,KAAyB,CAAC;IAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Put every api-nodejs container on one release tag (e.g. to roll back),
3
+ * chosen from the tags in GHCR or passed as an argument. One host at a time.
4
+ */
5
+ export declare function rollbackNodejsApi(args?: string[]): Promise<void>;
6
+ //# sourceMappingURL=rollback-nodejs-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/rollback-nodejs-api.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C1E"}
@@ -0,0 +1,62 @@
1
+ import { confirm, select } from "@inquirer/prompts";
2
+ import { loadConfig } from "../config.js";
3
+ import { listPackageVersions } from "../github/packages.js";
4
+ import { releaseTags } from "../portainer/image.js";
5
+ import { currentImages, rollOut, sharedRepo } from "./nodejs-api-hosts.js";
6
+ const MENU_SIZE = 15;
7
+ /** `ghcr.io/<org>/<name>` → { org, name }. */
8
+ function ghcrPackage(repo) {
9
+ const match = repo.match(/^ghcr\.io\/([^/]+)\/(.+)$/);
10
+ if (!match)
11
+ throw new Error(`${repo} is not a ghcr.io image; can't list its tags`);
12
+ return { org: match[1], name: match[2] };
13
+ }
14
+ /**
15
+ * Put every api-nodejs container on one release tag (e.g. to roll back),
16
+ * chosen from the tags in GHCR or passed as an argument. One host at a time.
17
+ */
18
+ export async function rollbackNodejsApi(args = []) {
19
+ const config = loadConfig();
20
+ const hosts = await currentImages(config.nodejsApi);
21
+ const repo = sharedRepo(hosts);
22
+ console.log("Live now:");
23
+ for (const h of hosts)
24
+ console.log(` ${h.host} ${h.tag}`);
25
+ console.log();
26
+ const { org, name } = ghcrPackage(repo);
27
+ const { tags, latest } = releaseTags(await listPackageVersions(org, name));
28
+ if (tags.length === 0)
29
+ throw new Error(`no release tags found for ${org}/${name}`);
30
+ const live = new Set(hosts.map((h) => h.tag));
31
+ let tag = args[0];
32
+ if (tag) {
33
+ if (tag !== "latest" && !tags.includes(tag)) {
34
+ throw new Error(`${tag} is not one of the latest release tags (${tags.slice(0, 5).join(", ")}, …)`);
35
+ }
36
+ }
37
+ else {
38
+ const label = (t) => {
39
+ const marks = [live.has(t) && "live", t === latest && "latest"].filter(Boolean);
40
+ return marks.length ? `${t} (${marks.join(", ")})` : t;
41
+ };
42
+ tag = await select({
43
+ message: "Roll the API to which release?",
44
+ choices: [
45
+ { name: `latest${latest ? ` → ${latest}` : ""}${live.has("latest") ? " (live)" : ""}`, value: "latest" },
46
+ ...tags.slice(0, MENU_SIZE).map((t) => ({ name: label(t), value: t })),
47
+ ],
48
+ pageSize: MENU_SIZE + 1,
49
+ });
50
+ }
51
+ const image = `${repo}:${tag}`;
52
+ const ok = await confirm({
53
+ message: `Roll ${hosts.length} host(s) to ${image}?`,
54
+ default: false,
55
+ });
56
+ if (!ok) {
57
+ console.log("Aborted; nothing changed.");
58
+ return;
59
+ }
60
+ await rollOut(config.nodejsApi, image);
61
+ }
62
+ //# sourceMappingURL=rollback-nodejs-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/rollback-nodejs-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PackageVersion } from "../portainer/image.js";
2
+ /**
3
+ * The newest 100 versions of a GHCR container package, via the local `gh`
4
+ * login (needs the read:packages scope). Newest first.
5
+ */
6
+ export declare function listPackageVersions(org: string, name: string): Promise<PackageVersion[]>;
7
+ //# sourceMappingURL=packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/github/packages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,EAAE,CAAC,CAe3B"}
@@ -0,0 +1,23 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const run = promisify(execFile);
4
+ /**
5
+ * The newest 100 versions of a GHCR container package, via the local `gh`
6
+ * login (needs the read:packages scope). Newest first.
7
+ */
8
+ export async function listPackageVersions(org, name) {
9
+ const path = `/orgs/${encodeURIComponent(org)}/packages/container/${encodeURIComponent(name)}/versions?per_page=100`;
10
+ try {
11
+ const { stdout } = await run("gh", ["api", path], { maxBuffer: 20 * 1024 * 1024 });
12
+ return JSON.parse(stdout);
13
+ }
14
+ catch (err) {
15
+ const e = err;
16
+ if (e.code === "ENOENT") {
17
+ throw new Error("the GitHub CLI (gh) is not installed; install it and run `gh auth login`");
18
+ }
19
+ throw new Error(`could not list tags for ${org}/${name} via gh: ${(e.stderr || e.message).trim()}. ` +
20
+ "Run `gh auth login` (or `gh auth refresh -s read:packages`) and try again.");
21
+ }
22
+ }
23
+ //# sourceMappingURL=packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../src/github/packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,IAAY;IAEZ,MAAM,IAAI,GAAG,SAAS,kBAAkB,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,wBAAwB,CAAC;IACrH,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAqB,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAkD,CAAC;QAC7D,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI;YAClF,4EAA4E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { collapseLastModified } from "./commands/collapse-last-modified.js";
7
7
  import { createApiKey } from "./commands/create-api-key.js";
8
8
  import { nodejsApiEnv } from "./commands/nodejs-api-env.js";
9
9
  import { recreateNodejsApi } from "./commands/recreate-nodejs-api.js";
10
+ import { rollbackNodejsApi } from "./commands/rollback-nodejs-api.js";
10
11
  import { restartEc2 } from "./commands/restart-ec2.js";
11
12
  import { syncEc2IpsToCloudflare } from "./commands/sync-ec2-ips-cloudflare.js";
12
13
  import { syncEc2ToRoute53 } from "./commands/sync-ec2-route53.js";
@@ -22,6 +23,7 @@ function printHelp() {
22
23
  console.log(" create-api-key Create a new API key");
23
24
  console.log(" nodejs-api-env List, set or unset env vars on the Node.js API containers");
24
25
  console.log(" recreate-nodejs-api Recreate Node.js API containers via Portainer");
26
+ console.log(" rollback-nodejs-api Roll the Node.js API containers to a chosen release tag");
25
27
  console.log(" restart-ec2 Restart (reboot) one or more EC2 servers");
26
28
  console.log(" sync-ec2-ips-cloudflare Sync EC2 egress IPs to a Cloudflare WAF rule");
27
29
  console.log(" sync-ec2-route53 Sync running EC2 public IPs to Route53 infra records");
@@ -54,6 +56,9 @@ async function runCommand(cmd, cmdArgs = []) {
54
56
  case "recreate-nodejs-api":
55
57
  await recreateNodejsApi();
56
58
  break;
59
+ case "rollback-nodejs-api":
60
+ await rollbackNodejsApi(cmdArgs);
61
+ break;
57
62
  case "restart-ec2":
58
63
  await restartEc2();
59
64
  break;
@@ -93,6 +98,11 @@ async function showMenu() {
93
98
  value: "recreate-nodejs-api",
94
99
  description: "Recreate Node.js API containers via Portainer",
95
100
  },
101
+ {
102
+ name: "rollback-nodejs-api",
103
+ value: "rollback-nodejs-api",
104
+ description: "Roll the Node.js API containers to a chosen release tag",
105
+ },
96
106
  {
97
107
  name: "Restart EC2 servers",
98
108
  value: "restart-ec2",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** A Docker image reference split into repository and tag (default "latest"). */
2
+ export declare function splitImage(ref: string): {
3
+ repo: string;
4
+ tag: string;
5
+ };
6
+ export declare function withTag(ref: string, tag: string): string;
7
+ export interface PackageVersion {
8
+ metadata?: {
9
+ container?: {
10
+ tags?: string[];
11
+ };
12
+ };
13
+ }
14
+ /**
15
+ * Release tags (plain X.Y.Z) from GHCR package versions, newest first, and
16
+ * the release tag that shares an image with "latest", if any.
17
+ */
18
+ export declare function releaseTags(versions: PackageVersion[]): {
19
+ tags: string[];
20
+ latest: string | undefined;
21
+ };
22
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/portainer/image.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CASrE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAChD;AAaD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG;IACvD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAYA"}
@@ -0,0 +1,42 @@
1
+ /** A Docker image reference split into repository and tag (default "latest"). */
2
+ export function splitImage(ref) {
3
+ const noDigest = ref.split("@")[0];
4
+ const lastSlash = noDigest.lastIndexOf("/");
5
+ const lastColon = noDigest.lastIndexOf(":");
6
+ // A colon before the last slash belongs to a registry port, not a tag.
7
+ if (lastColon > lastSlash) {
8
+ return { repo: noDigest.slice(0, lastColon), tag: noDigest.slice(lastColon + 1) };
9
+ }
10
+ return { repo: noDigest, tag: "latest" };
11
+ }
12
+ export function withTag(ref, tag) {
13
+ return `${splitImage(ref).repo}:${tag}`;
14
+ }
15
+ const RELEASE = /^\d+\.\d+\.\d+$/;
16
+ function compareDesc(a, b) {
17
+ const pa = a.split(".").map(Number);
18
+ const pb = b.split(".").map(Number);
19
+ for (let i = 0; i < 3; i++) {
20
+ if (pa[i] !== pb[i])
21
+ return pb[i] - pa[i];
22
+ }
23
+ return 0;
24
+ }
25
+ /**
26
+ * Release tags (plain X.Y.Z) from GHCR package versions, newest first, and
27
+ * the release tag that shares an image with "latest", if any.
28
+ */
29
+ export function releaseTags(versions) {
30
+ const tags = new Set();
31
+ let latest;
32
+ for (const version of versions) {
33
+ const vtags = version.metadata?.container?.tags ?? [];
34
+ const releases = vtags.filter((t) => RELEASE.test(t));
35
+ releases.forEach((t) => tags.add(t));
36
+ if (vtags.includes("latest") && releases.length > 0) {
37
+ latest = [...releases].sort(compareDesc)[0];
38
+ }
39
+ }
40
+ return { tags: [...tags].sort(compareDesc), latest };
41
+ }
42
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/portainer/image.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,uEAAuE;IACvE,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW;IAC9C,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC;AAMD,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAA0B;IAIpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,MAA0B,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC"}
@@ -2,6 +2,8 @@ import type { PortainerInstance } from "../config.js";
2
2
  export interface RecreateOptions {
3
3
  /** Pull the container's image tag before recreating (deploys new code). */
4
4
  pull: boolean;
5
+ /** Create the new container from this image instead of the current one. */
6
+ image?: string;
5
7
  /** Rewrite the Env array; omit to keep it as is. */
6
8
  transformEnv?: (env: string[]) => string[];
7
9
  log: (msg: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"recreate.d.ts","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;IACd,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AA2BD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAuHf"}
1
+ {"version":3,"file":"recreate.d.ts","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AA2BD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAiIf"}
@@ -38,17 +38,22 @@ export async function recreateContainer(instance, options) {
38
38
  portainerContainerName: name,
39
39
  });
40
40
  const oldId = container.Id;
41
+ const image = options.image ?? container.Config.Image;
41
42
  if (options.pull) {
42
- log("Pull the latest image");
43
+ log(`Pull ${image}`);
43
44
  await portainer.pullImage({
44
45
  ...common,
45
46
  portainerRegistryAuth,
46
- image: container.Config.Image,
47
+ image,
47
48
  });
48
49
  }
49
50
  const env = container.Config.Env ?? [];
50
51
  const config = {
51
52
  ...container.Config,
53
+ Image: image,
54
+ // OCI labels (version, revision, created) come from the image; keeping the
55
+ // old container's copies would mask the new image's values.
56
+ Labels: Object.fromEntries(Object.entries((container.Config.Labels ?? {})).filter(([key]) => !key.startsWith("org.opencontainers.image."))),
52
57
  Env: options.transformEnv ? options.transformEnv(env) : env,
53
58
  HostConfig: container.HostConfig,
54
59
  NetworkingConfig: {
@@ -1 +1 @@
1
- {"version":3,"file":"recreate.js","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recreate.js","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superyachttimes/cli",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "SuperYachtTimes CLI",
5
5
  "type": "module",
6
6
  "bin": {