Ctrl K
ComunidadGuías…

src/domain/local-n8n-supergrok.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { validateLocalDockerHost } from "../infrastructure/local-process.js";
import { validateDockerName } from "./validation.js";
import { validateDockerObjectId } from "./local-n8n-sidecar.js";
import { createGrokBuildDockerfile, createLocalDockerignore, validateInstallId, validateSha256Verifier } from "./local-endpoints.js";
import packageManifest from "../../package.json" with { type: "json" };

export const LOCAL_N8N_SUPERGROK_TARGET = "n8n-supergrok-oauth";
export const LOCAL_N8N_SUPERGROK_HOSTNAME = "n8n-supergrok";
export const LOCAL_N8N_SUPERGROK_PORT = 14_502;
export const LOCAL_N8N_SUPERGROK_ENDPOINT = "http://n8n-supergrok:14502/v1";

export function createLocalN8nSuperGrokPlan({ dockerHost, n8nContainerId, n8nContainerName, dockerNetworkId, networkName }) {
  return {
    kind: "n8n-supergrok",
    target: LOCAL_N8N_SUPERGROK_TARGET,
    label: "SuperGrok for n8n",
    endpoint: LOCAL_N8N_SUPERGROK_ENDPOINT,
    baseUrl: LOCAL_N8N_SUPERGROK_ENDPOINT,
    protocol: "openai-chat-completions",
    upstreamAuth: "provider-owned-oauth",
    dockerHost: validateLocalDockerHost(dockerHost),
    n8nContainerId: validateDockerObjectId(n8nContainerId, "n8n container"),
    n8nContainerName: validateDockerName(n8nContainerName),
    dockerNetworkId: validateDockerObjectId(dockerNetworkId, "Docker network"),
    networkName: validateDockerName(networkName),
    managedPath: "~/.relmio/local/n8n-supergrok-oauth",
    hostPublication: "none",
    experimental: true,
  };
}

export function normalizeLocalN8nSuperGrokPlan(value) {
  if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError("The private SuperGrok plan is invalid.");
  const normalized = createLocalN8nSuperGrokPlan(value);
  if (Object.keys(value).some(key => !Object.hasOwn(normalized, key) && key !== "disposableHarnessWarning") ||
      (Object.hasOwn(value, "disposableHarnessWarning") && typeof value.disposableHarnessWarning !== "boolean") ||
      Object.entries(normalized).some(([key, expected]) => value[key] !== expected)) {
    throw new TypeError("The private SuperGrok plan is invalid.");
  }
  return normalized;
}

export function createLocalN8nSuperGrokDockerfile({ installId }) {
  const id = validateInstallId(installId);
  return `${createGrokBuildDockerfile()}\nLABEL io.relmio.managed="true" \\
      io.relmio.target="${LOCAL_N8N_SUPERGROK_TARGET}" \\
      io.relmio.install="${id}"\n`;
}

export function createLocalN8nSuperGrokDockerignore() {
  return createLocalDockerignore("xai-grok-build");
}

export function createLocalN8nSuperGrokComposeFile({ installId, networkName, tokenSha256 }) {
  const id = validateInstallId(installId);
  const network = validateDockerName(networkName);
  const verifier = validateSha256Verifier(tokenSha256);
  return `services:
  supergrok-oauth:
    image: relmio-n8n-supergrok-oauth-${id}:local
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    init: true
    environment:
      RELMIO_GATEWAY_TOKEN_SHA256: ${verifier}
      RELMIO_GATEWAY_VERSION: ${packageManifest.version}
      RELMIO_GATEWAY_HOST: 0.0.0.0
      RELMIO_GATEWAY_PORT: "14502"
      RELMIO_GATEWAY_PUBLIC_PORT: "14502"
      RELMIO_GATEWAY_PRIVATE_HOST: "n8n-supergrok:14502"
      RELMIO_GATEWAY_INSTALL_ID: "${id}"
    volumes:
      - grok-home:/home/node/.grok
    networks:
      n8n-shared:
        aliases:
          - n8n-supergrok
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    read_only: true
    tmpfs:
      - /tmp:size=64m,mode=1777,nodev,nosuid
      - /run:size=16m,mode=0755,nodev,nosuid
    pids_limit: 128
    mem_limit: 2g
    cpus: 2.0
    healthcheck:
      test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:14502/health').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"]
      interval: 10s
      timeout: 5s
      retries: 9
      start_period: 20s
    labels:
      io.relmio.managed: "true"
      io.relmio.target: "${LOCAL_N8N_SUPERGROK_TARGET}"
      io.relmio.install: "${id}"

networks:
  n8n-shared:
    external: true
    name: ${network}

volumes:
  grok-home:
    labels:
      io.relmio.managed: "true"
      io.relmio.target: "${LOCAL_N8N_SUPERGROK_TARGET}"
      io.relmio.install: "${id}"
`;
}