Trustless hosting extension for Moltbot via EigenCloud infrastructure: - EigenAI provider with x-api-key auth and configPatch registration - Action tier classification for all 23 canonical tools - Receipt logging on after_tool_call hook (medium/high tier) - Anomaly detection (BCC, outbound curl, process, gateway) - SQLite receipt store with EigenDA proxy backend - Dashboard API endpoints (/boltbot/receipts, /receipt, /stats) - EigenCompute TEE deploy script and Dockerfile
65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
#!/usr/bin/env tsx
|
|
import { execFileSync } from "node:child_process";
|
|
import { resolve, dirname } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const projectRoot = resolve(__dirname, "../../..");
|
|
|
|
function required(name: string): string {
|
|
const val = process.env[name];
|
|
if (!val) {
|
|
console.error(`Missing required env var: ${name}`);
|
|
process.exit(1);
|
|
}
|
|
return val;
|
|
}
|
|
|
|
async function main() {
|
|
const privateKey = required("ECLOUD_PRIVATE_KEY");
|
|
const environment = process.env.ECLOUD_ENVIRONMENT ?? "sepolia";
|
|
const appName = process.env.ECLOUD_APP_NAME ?? "boltbot";
|
|
const instanceType = process.env.ECLOUD_INSTANCE_TYPE ?? "e2-medium";
|
|
|
|
const envVars: Record<string, string> = {
|
|
EIGENCLOUD_API_KEY: required("EIGENCLOUD_API_KEY"),
|
|
TELEGRAM_BOT_TOKEN: required("TELEGRAM_BOT_TOKEN"),
|
|
BOLTBOT_RECEIPT_BACKEND: process.env.BOLTBOT_RECEIPT_BACKEND ?? "eigenda",
|
|
NODE_ENV_PUBLIC: "production",
|
|
};
|
|
if (process.env.EIGENDA_PROXY_URL) {
|
|
envVars.EIGENDA_PROXY_URL = process.env.EIGENDA_PROXY_URL;
|
|
}
|
|
|
|
console.log(`Deploying ${appName} to EigenCompute (${environment})...`);
|
|
|
|
const ecloudEnv = { ...process.env, ECLOUD_PRIVATE_KEY: privateKey };
|
|
|
|
console.log("[1/3] Building Docker image...");
|
|
execFileSync("docker", [
|
|
"build", "-t", `${appName}:latest`,
|
|
"-f", "extensions/boltbot/deploy/Dockerfile", ".",
|
|
], { cwd: projectRoot, stdio: "inherit" });
|
|
|
|
console.log("[2/3] Deploying to EigenCompute TEE...");
|
|
const envFlags = Object.entries(envVars).flatMap(([k, v]) => ["--env", `${k}=${v}`]);
|
|
execFileSync("npx", [
|
|
"@layr-labs/ecloud-cli", "compute", "app", "deploy",
|
|
"--name", appName,
|
|
"--instance-type", instanceType,
|
|
"--environment", environment,
|
|
"--dockerfile", "extensions/boltbot/deploy/Dockerfile",
|
|
...envFlags,
|
|
], { cwd: projectRoot, stdio: "inherit", env: ecloudEnv });
|
|
|
|
console.log("[3/3] Fetching deployment info...");
|
|
execFileSync("npx", [
|
|
"@layr-labs/ecloud-cli", "compute", "app", "info",
|
|
"--name", appName,
|
|
], { cwd: projectRoot, stdio: "inherit", env: ecloudEnv });
|
|
|
|
console.log("\nDone. Next: ecloud compute app configure tls");
|
|
}
|
|
|
|
main();
|