@agentxv2/gateway 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/.env.example +53 -0
- package/db/migrations/001_init.sql +117 -0
- package/db/migrations/002_agents.sql +20 -0
- package/db/migrations/003_a2a_results.sql +23 -0
- package/deploy/.env.deploy.example +23 -0
- package/deploy/add_swap_build.py +45 -0
- package/deploy/build_and_deploy.py +110 -0
- package/deploy/build_deploy_a2a.py +190 -0
- package/deploy/build_no_lint.py +52 -0
- package/deploy/build_on_fe.py +86 -0
- package/deploy/build_on_gw.py +98 -0
- package/deploy/build_prod.py +54 -0
- package/deploy/check_bal.py +31 -0
- package/deploy/check_code.py +47 -0
- package/deploy/check_deploy.sh +20 -0
- package/deploy/check_docs.py +16 -0
- package/deploy/check_frontend.py +42 -0
- package/deploy/check_frontend2.py +35 -0
- package/deploy/check_pks.py +34 -0
- package/deploy/check_status.py +32 -0
- package/deploy/check_v2.py +8 -0
- package/deploy/clean_install.py +28 -0
- package/deploy/deploy_a2a.py +58 -0
- package/deploy/deploy_a2a.sh +33 -0
- package/deploy/deploy_a2a_bg.sh +40 -0
- package/deploy/deploy_a2a_v2.py +151 -0
- package/deploy/deploy_a2a_v2.sh +36 -0
- package/deploy/deploy_bin.py +64 -0
- package/deploy/deploy_config.py +34 -0
- package/deploy/deploy_final.py +42 -0
- package/deploy/deploy_frontend.py +108 -0
- package/deploy/deploy_mcp.py +108 -0
- package/deploy/deploy_now.py +49 -0
- package/deploy/deploy_push_all.py +128 -0
- package/deploy/deploy_script.py +64 -0
- package/deploy/deploy_sep_a2a.sh +18 -0
- package/deploy/dev_mode.py +51 -0
- package/deploy/diag.py +12 -0
- package/deploy/diff_test.py +22 -0
- package/deploy/final_check.py +33 -0
- package/deploy/final_deploy.py +50 -0
- package/deploy/final_fix.py +54 -0
- package/deploy/final_push.py +114 -0
- package/deploy/find_frontend.py +38 -0
- package/deploy/fix_a2a.py +43 -0
- package/deploy/fix_and_build.py +77 -0
- package/deploy/fix_and_verify.py +56 -0
- package/deploy/fix_build.py +51 -0
- package/deploy/forge_deploy.py +67 -0
- package/deploy/full_push.py +101 -0
- package/deploy/full_push2.py +106 -0
- package/deploy/go_prod.py +59 -0
- package/deploy/gw_deploy.py +133 -0
- package/deploy/gw_final.py +206 -0
- package/deploy/gw_restart.py +28 -0
- package/deploy/gw_status.py +18 -0
- package/deploy/inline_build.py +99 -0
- package/deploy/one_shot.py +84 -0
- package/deploy/ox_deploy.py +32 -0
- package/deploy/pg_setup.py +36 -0
- package/deploy/prod_deploy.py +126 -0
- package/deploy/prod_final.py +140 -0
- package/deploy/prod_go.py +61 -0
- package/deploy/prod_one_shot.py +139 -0
- package/deploy/prod_setup.sh +62 -0
- package/deploy/prod_v2.py +91 -0
- package/deploy/prod_v3.py +103 -0
- package/deploy/push_docs.py +93 -0
- package/deploy/push_mcp.py +66 -0
- package/deploy/push_mcp_doc.py +28 -0
- package/deploy/push_v063.py +80 -0
- package/deploy/push_v2.py +71 -0
- package/deploy/qcheck.py +13 -0
- package/deploy/qcheck2.py +18 -0
- package/deploy/quick_check.py +8 -0
- package/deploy/rebuild.py +47 -0
- package/deploy/rebuild_frontend.py +44 -0
- package/deploy/restart.py +28 -0
- package/deploy/restore_frontend.py +42 -0
- package/deploy/restore_frontend2.py +41 -0
- package/deploy/restore_gateway.py +34 -0
- package/deploy/restore_quick.py +33 -0
- package/deploy/run_bash.py +19 -0
- package/deploy/run_sep.py +20 -0
- package/deploy/sdk_upgrade.py +50 -0
- package/deploy/server_prepare.py +41 -0
- package/deploy/server_setup.py +41 -0
- package/deploy/ssh_check.py +14 -0
- package/deploy/ssh_push.py +24 -0
- package/deploy/start_deploy.py +35 -0
- package/deploy/start_frontend.py +12 -0
- package/deploy/start_v2.py +29 -0
- package/deploy/stat.py +18 -0
- package/deploy/tail_log.py +11 -0
- package/deploy/update_env.py +32 -0
- package/deploy/upload_and_start.py +107 -0
- package/deploy/verify_a2a.py +13 -0
- package/deploy/verify_mcp.py +37 -0
- package/deploy/verify_sdk.py +21 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/crypto.d.ts +2 -0
- package/dist/lib/crypto.js +43 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/db.d.ts +3 -0
- package/dist/lib/db.js +26 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/ethers-utils.d.ts +60 -0
- package/dist/lib/ethers-utils.js +186 -0
- package/dist/lib/ethers-utils.js.map +1 -0
- package/dist/middleware/adminAuth.d.ts +2 -0
- package/dist/middleware/adminAuth.js +31 -0
- package/dist/middleware/adminAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +22 -0
- package/dist/middleware/auth.js +192 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +36 -0
- package/dist/middleware/error-handler.js +100 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +5 -0
- package/dist/middleware/rate-limiter.js +107 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/routes/a2a.d.ts +2 -0
- package/dist/routes/a2a.js +84 -0
- package/dist/routes/a2a.js.map +1 -0
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +180 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/agents.d.ts +2 -0
- package/dist/routes/agents.js +43 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/chat.d.ts +2 -0
- package/dist/routes/chat.js +183 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/history.d.ts +2 -0
- package/dist/routes/history.js +92 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/mcp.d.ts +13 -0
- package/dist/routes/mcp.js +513 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/tenant.d.ts +2 -0
- package/dist/routes/tenant.js +154 -0
- package/dist/routes/tenant.js.map +1 -0
- package/dist/services/a2a-worker.d.ts +7 -0
- package/dist/services/a2a-worker.js +406 -0
- package/dist/services/a2a-worker.js.map +1 -0
- package/dist/services/agent-indexer.d.ts +4 -0
- package/dist/services/agent-indexer.js +124 -0
- package/dist/services/agent-indexer.js.map +1 -0
- package/e2e_wallet.js +175 -0
- package/ecosystem.config.js +17 -0
- package/package.json +33 -0
- package/src/config.ts +47 -0
- package/src/index.ts +143 -0
- package/src/lib/crypto.ts +44 -0
- package/src/lib/db.ts +25 -0
- package/src/lib/ethers-utils.ts +229 -0
- package/src/middleware/adminAuth.ts +34 -0
- package/src/middleware/auth.ts +244 -0
- package/src/middleware/error-handler.ts +109 -0
- package/src/middleware/rate-limiter.ts +115 -0
- package/src/routes/a2a.ts +97 -0
- package/src/routes/admin.ts +219 -0
- package/src/routes/agents.ts +52 -0
- package/src/routes/chat.ts +219 -0
- package/src/routes/history.ts +114 -0
- package/src/routes/mcp.ts +567 -0
- package/src/routes/tenant.ts +196 -0
- package/src/services/a2a-worker.ts +486 -0
- package/src/services/agent-indexer.ts +127 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import tarfile, os
|
|
3
|
+
|
|
4
|
+
HOST = '43.156.225.164'
|
|
5
|
+
PWD = 'Asdf1234!'
|
|
6
|
+
|
|
7
|
+
# Upload fresh tar
|
|
8
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
9
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_fe_prod.tar.gz'
|
|
10
|
+
|
|
11
|
+
print("=== Creating tar ===")
|
|
12
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
13
|
+
for root, dirs, files in os.walk(local_dir):
|
|
14
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', '.next', '.git', '__pycache__')]
|
|
15
|
+
for f in files:
|
|
16
|
+
if f.endswith('.tsbuildinfo') or f == 'pnpm-lock.yaml': continue
|
|
17
|
+
full = os.path.join(root, f)
|
|
18
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
19
|
+
tar.add(full, arcname=arc)
|
|
20
|
+
|
|
21
|
+
print("Uploading...")
|
|
22
|
+
t = paramiko.Transport((HOST, 22))
|
|
23
|
+
t.connect(username='ubuntu', password=PWD)
|
|
24
|
+
s = paramiko.SFTPClient.from_transport(t)
|
|
25
|
+
s.put(tar_path, '/tmp/agentx_fe.tar.gz')
|
|
26
|
+
s.close()
|
|
27
|
+
t.close()
|
|
28
|
+
|
|
29
|
+
print("Extracting + building...")
|
|
30
|
+
c = paramiko.SSHClient()
|
|
31
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
32
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=30)
|
|
33
|
+
|
|
34
|
+
# Extract
|
|
35
|
+
stdin, stdout, stderr = c.exec_command(
|
|
36
|
+
"rm -rf /home/ubuntu/agentx-platform && mkdir -p /home/ubuntu/agentx-platform && "
|
|
37
|
+
"cd /home/ubuntu/agentx-platform && tar xzf /tmp/agentx_fe.tar.gz && "
|
|
38
|
+
"ls app/page.tsx && echo 'EXTRACT OK' || echo 'EXTRACT FAILED'",
|
|
39
|
+
timeout=30
|
|
40
|
+
)
|
|
41
|
+
print(stdout.read().decode().strip())
|
|
42
|
+
|
|
43
|
+
# Write .env
|
|
44
|
+
env = '''NEXT_PUBLIC_APP_NAME="AgentX"
|
|
45
|
+
NEXT_PUBLIC_APP_URL=http://43.156.225.164:3000
|
|
46
|
+
NEXT_PUBLIC_DEFAULT_CHAIN_ID=11155111
|
|
47
|
+
NEXT_PUBLIC_SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/63ee183a3afa43208e99d6f3f1e7c5fb
|
|
48
|
+
NEXT_PUBLIC_SEPOLIA_IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
49
|
+
NEXT_PUBLIC_SEPOLIA_SUBSCRIPTION_MANAGER=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
50
|
+
NEXT_PUBLIC_SEPOLIA_REPUTATION_REGISTRY=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
51
|
+
NEXT_PUBLIC_SEPOLIA_CONFIGURATION_REGISTRY=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
52
|
+
NEXT_PUBLIC_SEPOLIA_MULTI_ENDPOINT=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
53
|
+
NEXT_PUBLIC_SEPOLIA_A2A_PROTOCOL=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
54
|
+
NEXT_PUBLIC_OXACHAIN_RPC_URL=http://43.156.99.215:18545
|
|
55
|
+
NEXT_PUBLIC_OXACHAIN_EXPLORER=http://43.156.99.215:18400
|
|
56
|
+
NEXT_PUBLIC_OXACHAIN_IDENTITY_REGISTRY=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
57
|
+
NEXT_PUBLIC_OXACHAIN_SUBSCRIPTION_MANAGER=0x019AC9d945467478Dd371CDbD70cb2f325800E6B
|
|
58
|
+
NEXT_PUBLIC_OXACHAIN_REPUTATION_REGISTRY=0x6a18C2664E1b42063860d864b6448b824d7B843F
|
|
59
|
+
NEXT_PUBLIC_OXACHAIN_CONFIGURATION_REGISTRY=0x07280674ccc2898Fd038A9e3C22005CA83ffD2F8
|
|
60
|
+
NEXT_PUBLIC_OXACHAIN_MULTI_ENDPOINT=0xB361d04F49000013FC131D3C59C41c8486C64f8c
|
|
61
|
+
NEXT_PUBLIC_OXACHAIN_A2A_PROTOCOL=0xDF2939EFafEe6439eB2226DbEd07AD6F5Ae2112B
|
|
62
|
+
NEXT_PUBLIC_IDENTITY_REGISTRY_ADDRESS=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
63
|
+
NEXT_PUBLIC_SUBSCRIPTION_MANAGER_ADDRESS=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
64
|
+
NEXT_PUBLIC_REPUTATION_REGISTRY_ADDRESS=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
65
|
+
NEXT_PUBLIC_CONFIGURATION_REGISTRY_ADDRESS=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
66
|
+
NEXT_PUBLIC_MULTI_ENDPOINT_ADDRESS=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
67
|
+
NEXT_PUBLIC_A2A_PROTOCOL_ADDRESS=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
68
|
+
NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090
|
|
69
|
+
'''
|
|
70
|
+
import base64
|
|
71
|
+
b64 = base64.b64encode(env.encode()).decode()
|
|
72
|
+
c.exec_command(f"echo '{b64}' | base64 -d > /home/ubuntu/agentx-platform/.env.production", timeout=10)
|
|
73
|
+
|
|
74
|
+
# npm install in background
|
|
75
|
+
print("\n=== npm install (background) ===")
|
|
76
|
+
channel = c.get_transport().open_session()
|
|
77
|
+
channel.exec_command(
|
|
78
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
79
|
+
"npm install > /tmp/npm-install.log 2>&1 && echo 'NPM_DONE' >> /tmp/agentx-deploy.log"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Poll for npm install completion
|
|
83
|
+
import time
|
|
84
|
+
for i in range(30):
|
|
85
|
+
time.sleep(10)
|
|
86
|
+
stdin2, stdout2, stderr2 = c.exec_command("tail -1 /tmp/agentx-deploy.log 2>/dev/null")
|
|
87
|
+
tail = stdout2.read().decode().strip()
|
|
88
|
+
if 'NPM_DONE' in tail:
|
|
89
|
+
print("npm install done")
|
|
90
|
+
break
|
|
91
|
+
print(f" [{i+1}s] installing...")
|
|
92
|
+
|
|
93
|
+
# Build in background
|
|
94
|
+
print("\n=== next build (background, 2-4 min) ===")
|
|
95
|
+
channel2 = c.get_transport().open_session()
|
|
96
|
+
channel2.exec_command(
|
|
97
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
98
|
+
"NODE_OPTIONS='--max-old-space-size=2560' npx next build >> /tmp/agentx-deploy.log 2>&1; "
|
|
99
|
+
"echo 'BUILD_EXIT='$? >> /tmp/agentx-deploy.log"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
for i in range(40):
|
|
103
|
+
time.sleep(15)
|
|
104
|
+
stdin3, stdout3, stderr3 = c.exec_command("tail -3 /tmp/agentx-deploy.log 2>/dev/null")
|
|
105
|
+
tail = stdout3.read().decode()
|
|
106
|
+
if 'BUILD_EXIT' in tail:
|
|
107
|
+
print(f"\nBUILD RESULT: {tail.strip()}")
|
|
108
|
+
break
|
|
109
|
+
# Show progress
|
|
110
|
+
if i % 4 == 0:
|
|
111
|
+
lines = tail.strip().split('\n')
|
|
112
|
+
last = [l for l in lines if l.strip() and not l.startswith('===')]
|
|
113
|
+
if last:
|
|
114
|
+
print(f" [{i*15}s] {last[-1][:150]}")
|
|
115
|
+
else:
|
|
116
|
+
print("Build timeout. Checking...")
|
|
117
|
+
|
|
118
|
+
# Check result + start
|
|
119
|
+
stdin4, stdout4, stderr4 = c.exec_command(
|
|
120
|
+
"grep BUILD_EXIT /tmp/agentx-deploy.log; "
|
|
121
|
+
"ls /home/ubuntu/agentx-platform/.next/BUILD_ID 2>/dev/null && echo BUILD_ID_OK"
|
|
122
|
+
)
|
|
123
|
+
print(stdout4.read().decode())
|
|
124
|
+
|
|
125
|
+
# Start
|
|
126
|
+
print("\n=== Starting ===")
|
|
127
|
+
c.exec_command("fuser -k 3000/tcp 2>/dev/null; sleep 1", timeout=10)
|
|
128
|
+
channel3 = c.get_transport().open_session()
|
|
129
|
+
channel3.exec_command(
|
|
130
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
131
|
+
"nohup npx next start -p 3000 > /tmp/agentx-run.log 2>&1 & disown; "
|
|
132
|
+
"sleep 5; ss -tlnp | grep 3000 >> /tmp/agentx-deploy.log"
|
|
133
|
+
)
|
|
134
|
+
time.sleep(8)
|
|
135
|
+
|
|
136
|
+
stdin5, stdout5, stderr5 = c.exec_command("ss -tlnp | grep 3000 && echo --- && curl -sI http://localhost:3000/ 2>&1 | head -3")
|
|
137
|
+
print(stdout5.read().decode())
|
|
138
|
+
|
|
139
|
+
c.close()
|
|
140
|
+
print("\n✅ Done")
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import paramiko, time
|
|
2
|
+
|
|
3
|
+
HOST = '43.156.225.164'
|
|
4
|
+
PWD = 'Asdf1234!'
|
|
5
|
+
|
|
6
|
+
c = paramiko.SSHClient()
|
|
7
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
8
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=30)
|
|
9
|
+
|
|
10
|
+
# Run npm install directly (sync)
|
|
11
|
+
print("=== npm install ===")
|
|
12
|
+
stdin, stdout, stderr = c.exec_command(
|
|
13
|
+
"cd /home/ubuntu/agentx-platform && npm install 2>&1 | tail -10",
|
|
14
|
+
timeout=600
|
|
15
|
+
)
|
|
16
|
+
out = stdout.read().decode()
|
|
17
|
+
err = stderr.read().decode()
|
|
18
|
+
print(out)
|
|
19
|
+
if err: print("ERR:", err[-300:])
|
|
20
|
+
|
|
21
|
+
# Verify
|
|
22
|
+
stdin, stdout, stderr = c.exec_command(
|
|
23
|
+
"ls /home/ubuntu/agentx-platform/node_modules/next/package.json 2>/dev/null && echo 'next installed' || echo 'MISSING'; "
|
|
24
|
+
"ls /home/ubuntu/agentx-platform/app/page.tsx && echo 'app exists'"
|
|
25
|
+
)
|
|
26
|
+
print(stdout.read().decode())
|
|
27
|
+
|
|
28
|
+
# Build directly with the installed next (not npx)
|
|
29
|
+
print("\n=== next build ===")
|
|
30
|
+
stdin, stdout, stderr = c.exec_command(
|
|
31
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
32
|
+
"NODE_OPTIONS='--max-old-space-size=2560' ./node_modules/.bin/next build 2>&1 | tail -25",
|
|
33
|
+
timeout=600
|
|
34
|
+
)
|
|
35
|
+
out = stdout.read().decode()
|
|
36
|
+
err = stderr.read().decode()
|
|
37
|
+
print(out)
|
|
38
|
+
if err: print("ERR:", err[-300:])
|
|
39
|
+
ec = stdout.channel.recv_exit_status()
|
|
40
|
+
print(f"\nBuild exit: {ec}")
|
|
41
|
+
|
|
42
|
+
if ec != 0:
|
|
43
|
+
print("BUILD FAILED")
|
|
44
|
+
c.close()
|
|
45
|
+
exit(1)
|
|
46
|
+
|
|
47
|
+
# Kill old + start
|
|
48
|
+
print("\n=== Start ===")
|
|
49
|
+
stdin, stdout, stderr = c.exec_command(
|
|
50
|
+
"fuser -k 3000/tcp 2>/dev/null; sleep 2; "
|
|
51
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
52
|
+
"nohup ./node_modules/.bin/next start -p 3000 > /tmp/agentx-run.log 2>&1 &",
|
|
53
|
+
timeout=10
|
|
54
|
+
)
|
|
55
|
+
time.sleep(6)
|
|
56
|
+
|
|
57
|
+
stdin, stdout, stderr = c.exec_command("ss -tlnp | grep 3000 && echo '---' && curl -sI http://localhost:3000/ 2>&1 | head -5")
|
|
58
|
+
print(stdout.read().decode())
|
|
59
|
+
|
|
60
|
+
c.close()
|
|
61
|
+
print("\n✅ PROD deployed: http://43.156.225.164:3000")
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import paramiko, tarfile, os, base64, time
|
|
2
|
+
|
|
3
|
+
HOST = '43.156.225.164'
|
|
4
|
+
PWD = 'Asdf1234!'
|
|
5
|
+
|
|
6
|
+
# 1. Create fresh tar
|
|
7
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
8
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_fe_prod.tar.gz'
|
|
9
|
+
|
|
10
|
+
print("=== Creating tar ===")
|
|
11
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
12
|
+
for root, dirs, files in os.walk(local_dir):
|
|
13
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', '.next', '.git', '__pycache__')]
|
|
14
|
+
for f in files:
|
|
15
|
+
if f.endswith('.tsbuildinfo') or f == 'pnpm-lock.yaml': continue
|
|
16
|
+
full = os.path.join(root, f)
|
|
17
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
18
|
+
tar.add(full, arcname=arc)
|
|
19
|
+
print(f"{os.path.getsize(tar_path)//1024} KB")
|
|
20
|
+
|
|
21
|
+
# 2. Upload
|
|
22
|
+
print("Uploading...")
|
|
23
|
+
t = paramiko.Transport((HOST, 22))
|
|
24
|
+
t.connect(username='ubuntu', password=PWD)
|
|
25
|
+
s = paramiko.SFTPClient.from_transport(t)
|
|
26
|
+
s.put(tar_path, '/tmp/agentx_fe.tar.gz')
|
|
27
|
+
s.close()
|
|
28
|
+
t.close()
|
|
29
|
+
|
|
30
|
+
# 3. Deploy script (all in one)
|
|
31
|
+
script = '''#!/bin/bash
|
|
32
|
+
set -e
|
|
33
|
+
export NODE_OPTIONS="--max-old-space-size=2560"
|
|
34
|
+
APP=/home/ubuntu/agentx-platform
|
|
35
|
+
LOG=/tmp/agentx-deploy.log
|
|
36
|
+
rm -rf $APP && mkdir -p $APP
|
|
37
|
+
|
|
38
|
+
echo "=== extract ===" >> $LOG
|
|
39
|
+
cd $APP && tar xzf /tmp/agentx_fe.tar.gz
|
|
40
|
+
|
|
41
|
+
cat > $APP/.env.production << 'EOF'
|
|
42
|
+
NEXT_PUBLIC_APP_NAME="AgentX"
|
|
43
|
+
NEXT_PUBLIC_APP_URL=http://43.156.225.164:3000
|
|
44
|
+
NEXT_PUBLIC_DEFAULT_CHAIN_ID=11155111
|
|
45
|
+
NEXT_PUBLIC_SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/63ee183a3afa43208e99d6f3f1e7c5fb
|
|
46
|
+
NEXT_PUBLIC_SEPOLIA_IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
47
|
+
NEXT_PUBLIC_SEPOLIA_SUBSCRIPTION_MANAGER=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
48
|
+
NEXT_PUBLIC_SEPOLIA_REPUTATION_REGISTRY=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
49
|
+
NEXT_PUBLIC_SEPOLIA_CONFIGURATION_REGISTRY=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
50
|
+
NEXT_PUBLIC_SEPOLIA_MULTI_ENDPOINT=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
51
|
+
NEXT_PUBLIC_SEPOLIA_A2A_PROTOCOL=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
52
|
+
NEXT_PUBLIC_OXACHAIN_RPC_URL=http://43.156.99.215:18545
|
|
53
|
+
NEXT_PUBLIC_OXACHAIN_EXPLORER=http://43.156.99.215:18400
|
|
54
|
+
NEXT_PUBLIC_OXACHAIN_IDENTITY_REGISTRY=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
55
|
+
NEXT_PUBLIC_OXACHAIN_SUBSCRIPTION_MANAGER=0x019AC9d945467478Dd371CDbD70cb2f325800E6B
|
|
56
|
+
NEXT_PUBLIC_OXACHAIN_REPUTATION_REGISTRY=0x6a18C2664E1b42063860d864b6448b824d7B843F
|
|
57
|
+
NEXT_PUBLIC_OXACHAIN_CONFIGURATION_REGISTRY=0x07280674ccc2898Fd038A9e3C22005CA83ffD2F8
|
|
58
|
+
NEXT_PUBLIC_OXACHAIN_MULTI_ENDPOINT=0xB361d04F49000013FC131D3C59C41c8486C64f8c
|
|
59
|
+
NEXT_PUBLIC_OXACHAIN_A2A_PROTOCOL=0xDF2939EFafEe6439eB2226DbEd07AD6F5Ae2112B
|
|
60
|
+
NEXT_PUBLIC_IDENTITY_REGISTRY_ADDRESS=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
61
|
+
NEXT_PUBLIC_SUBSCRIPTION_MANAGER_ADDRESS=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
62
|
+
NEXT_PUBLIC_REPUTATION_REGISTRY_ADDRESS=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
63
|
+
NEXT_PUBLIC_CONFIGURATION_REGISTRY_ADDRESS=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
64
|
+
NEXT_PUBLIC_MULTI_ENDPOINT_ADDRESS=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
65
|
+
NEXT_PUBLIC_A2A_PROTOCOL_ADDRESS=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
66
|
+
NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090
|
|
67
|
+
EOF
|
|
68
|
+
|
|
69
|
+
cat > $APP/.env.local << 'EOF'
|
|
70
|
+
NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090
|
|
71
|
+
EOF
|
|
72
|
+
|
|
73
|
+
echo "=== npm install ===" >> $LOG
|
|
74
|
+
cd $APP && npm install --legacy-peer-deps 2>&1 | tail -5 >> $LOG
|
|
75
|
+
|
|
76
|
+
echo "=== build ===" >> $LOG
|
|
77
|
+
cd $APP && ./node_modules/.bin/next build 2>&1 | tail -25 >> $LOG
|
|
78
|
+
BUILD_EXIT=${PIPESTATUS[0]}
|
|
79
|
+
|
|
80
|
+
echo "BUILD_EXIT=$BUILD_EXIT" >> $LOG
|
|
81
|
+
|
|
82
|
+
echo "=== start ===" >> $LOG
|
|
83
|
+
fuser -k 3000/tcp 2>/dev/null || true
|
|
84
|
+
sleep 2
|
|
85
|
+
cd $APP && nohup ./node_modules/.bin/next start -p 3000 > /tmp/agentx-run.log 2>&1 &
|
|
86
|
+
sleep 6
|
|
87
|
+
ss -tlnp | grep 3000 >> $LOG
|
|
88
|
+
echo "DONE $(date)" >> $LOG
|
|
89
|
+
'''
|
|
90
|
+
|
|
91
|
+
b64 = base64.b64encode(script.encode()).decode()
|
|
92
|
+
c = paramiko.SSHClient()
|
|
93
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
94
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=15)
|
|
95
|
+
|
|
96
|
+
stdin, stdout, stderr = c.exec_command(f"echo '{b64}' | base64 -d > /tmp/go.sh && chmod +x /tmp/go.sh && echo OK")
|
|
97
|
+
print(stdout.read().decode().strip())
|
|
98
|
+
|
|
99
|
+
# Start in background
|
|
100
|
+
channel = c.get_transport().open_session()
|
|
101
|
+
channel.exec_command("nohup bash /tmp/go.sh &>/dev/null & disown")
|
|
102
|
+
time.sleep(2)
|
|
103
|
+
c.close()
|
|
104
|
+
|
|
105
|
+
print("=== Build started. Polling log... ===")
|
|
106
|
+
|
|
107
|
+
# Poll
|
|
108
|
+
for i in range(50):
|
|
109
|
+
time.sleep(15)
|
|
110
|
+
try:
|
|
111
|
+
c2 = paramiko.SSHClient()
|
|
112
|
+
c2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
113
|
+
c2.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
114
|
+
stdin2, stdout2, stderr2 = c2.exec_command("tail -5 /tmp/agentx-deploy.log 2>/dev/null")
|
|
115
|
+
tail = stdout2.read().decode()
|
|
116
|
+
lines = [l for l in tail.split('\n') if l.strip()]
|
|
117
|
+
|
|
118
|
+
for line in lines:
|
|
119
|
+
if 'DONE' in line:
|
|
120
|
+
print(f"\n✅ {line}")
|
|
121
|
+
c2.close()
|
|
122
|
+
# Verify
|
|
123
|
+
stdin3, stdout3, stderr3 = c2.exec_command("ss -tlnp | grep 3000 && curl -sI http://localhost:3000/ 2>&1 | head -3")
|
|
124
|
+
print(stdout3.read().decode())
|
|
125
|
+
exit(0)
|
|
126
|
+
if 'FAIL' in line or 'Error' in line:
|
|
127
|
+
print(f" ⚠️ {line[:200]}")
|
|
128
|
+
|
|
129
|
+
# Status line
|
|
130
|
+
if lines and '===' in lines[-1]:
|
|
131
|
+
print(f" [{i*15}s] {lines[-1][:100]}")
|
|
132
|
+
elif lines and ('Compiling' in tail or 'Route' in tail or 'Static' in tail or 'BUILD' in tail):
|
|
133
|
+
print(f" [{i*15}s] {lines[-1][:150]}")
|
|
134
|
+
|
|
135
|
+
c2.close()
|
|
136
|
+
except:
|
|
137
|
+
continue
|
|
138
|
+
|
|
139
|
+
print("\nCheck: http://43.156.225.164:3000")
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
APP_DIR=/home/ubuntu/agentx-platform
|
|
4
|
+
LOG=/tmp/agentx-deploy.log
|
|
5
|
+
PORT=3000
|
|
6
|
+
|
|
7
|
+
exec > >(tee -a $LOG) 2>&1
|
|
8
|
+
echo "===== AgentX Deploy $(date) ====="
|
|
9
|
+
|
|
10
|
+
# Extract
|
|
11
|
+
cd /tmp
|
|
12
|
+
tar xzf /tmp/agentx_fe.tar.gz -C $APP_DIR/
|
|
13
|
+
echo "extracted"
|
|
14
|
+
|
|
15
|
+
# Write env files
|
|
16
|
+
cat > $APP_DIR/.env.production << 'ENVEOF'
|
|
17
|
+
NEXT_PUBLIC_APP_NAME="AgentX"
|
|
18
|
+
NEXT_PUBLIC_APP_URL=http://43.156.225.164:3000
|
|
19
|
+
NEXT_PUBLIC_DEFAULT_CHAIN_ID=11155111
|
|
20
|
+
NEXT_PUBLIC_SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/63ee183a3afa43208e99d6f3f1e7c5fb
|
|
21
|
+
NEXT_PUBLIC_SEPOLIA_IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
22
|
+
NEXT_PUBLIC_SEPOLIA_SUBSCRIPTION_MANAGER=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
23
|
+
NEXT_PUBLIC_SEPOLIA_REPUTATION_REGISTRY=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
24
|
+
NEXT_PUBLIC_SEPOLIA_CONFIGURATION_REGISTRY=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
25
|
+
NEXT_PUBLIC_SEPOLIA_MULTI_ENDPOINT=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
26
|
+
NEXT_PUBLIC_SEPOLIA_A2A_PROTOCOL=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
27
|
+
NEXT_PUBLIC_OXACHAIN_RPC_URL=http://43.156.99.215:18545
|
|
28
|
+
NEXT_PUBLIC_OXACHAIN_EXPLORER=http://43.156.99.215:18400
|
|
29
|
+
NEXT_PUBLIC_OXACHAIN_IDENTITY_REGISTRY=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
30
|
+
NEXT_PUBLIC_OXACHAIN_SUBSCRIPTION_MANAGER=0x019AC9d945467478Dd371CDbD70cb2f325800E6B
|
|
31
|
+
NEXT_PUBLIC_OXACHAIN_REPUTATION_REGISTRY=0x6a18C2664E1b42063860d864b6448b824d7B843F
|
|
32
|
+
NEXT_PUBLIC_OXACHAIN_CONFIGURATION_REGISTRY=0x07280674ccc2898Fd038A9e3C22005CA83ffD2F8
|
|
33
|
+
NEXT_PUBLIC_OXACHAIN_MULTI_ENDPOINT=0xB361d04F49000013FC131D3C59C41c8486C64f8c
|
|
34
|
+
NEXT_PUBLIC_OXACHAIN_A2A_PROTOCOL=0xDF2939EFafEe6439eB2226DbEd07AD6F5Ae2112B
|
|
35
|
+
NEXT_PUBLIC_IDENTITY_REGISTRY_ADDRESS=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
36
|
+
NEXT_PUBLIC_SUBSCRIPTION_MANAGER_ADDRESS=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
37
|
+
NEXT_PUBLIC_REPUTATION_REGISTRY_ADDRESS=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
38
|
+
NEXT_PUBLIC_CONFIGURATION_REGISTRY_ADDRESS=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
39
|
+
NEXT_PUBLIC_MULTI_ENDPOINT_ADDRESS=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
40
|
+
NEXT_PUBLIC_A2A_PROTOCOL_ADDRESS=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
41
|
+
NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090
|
|
42
|
+
ENVEOF
|
|
43
|
+
|
|
44
|
+
cat > $APP_DIR/.env.local << 'EOF'
|
|
45
|
+
NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090
|
|
46
|
+
EOF
|
|
47
|
+
|
|
48
|
+
echo "=== npm install ==="
|
|
49
|
+
cd $APP_DIR
|
|
50
|
+
npm install 2>&1 | tail -5
|
|
51
|
+
|
|
52
|
+
echo "=== next build ==="
|
|
53
|
+
NODE_OPTIONS="--max-old-space-size=2560" npx next build 2>&1 | tail -25
|
|
54
|
+
|
|
55
|
+
echo "=== starting port $PORT ==="
|
|
56
|
+
fuser -k $PORT/tcp 2>/dev/null || true
|
|
57
|
+
nohup npx next start -p $PORT > /tmp/agentx-run.log 2>&1 &
|
|
58
|
+
sleep 6
|
|
59
|
+
ss -tlnp | grep $PORT
|
|
60
|
+
curl -sI http://localhost:$PORT/ 2>&1 | head -3
|
|
61
|
+
|
|
62
|
+
echo "===== DONE $(date) ====="
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import tarfile
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
HOST = '43.156.225.164'
|
|
7
|
+
PWD = 'Asdf1234!'
|
|
8
|
+
|
|
9
|
+
# 1. Create tar
|
|
10
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
11
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_fe_prod.tar.gz'
|
|
12
|
+
sh_path = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway\deploy\prod_setup.sh'
|
|
13
|
+
|
|
14
|
+
print("=== Creating tar ===")
|
|
15
|
+
count = 0
|
|
16
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
17
|
+
for root, dirs, files in os.walk(local_dir):
|
|
18
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', '.next', '.git', '__pycache__')]
|
|
19
|
+
for f in files:
|
|
20
|
+
if f.endswith('.tsbuildinfo') or f == 'pnpm-lock.yaml': continue
|
|
21
|
+
full = os.path.join(root, f)
|
|
22
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
23
|
+
tar.add(full, arcname=arc)
|
|
24
|
+
count += 1
|
|
25
|
+
print(f"{count} files, {os.path.getsize(tar_path)//1024} KB")
|
|
26
|
+
|
|
27
|
+
# 2. Upload both files via SFTP
|
|
28
|
+
print("\n=== Uploading ===")
|
|
29
|
+
t = paramiko.Transport((HOST, 22))
|
|
30
|
+
t.connect(username='ubuntu', password=PWD)
|
|
31
|
+
sftp = paramiko.SFTPClient.from_transport(t)
|
|
32
|
+
sftp.put(tar_path, '/tmp/agentx_fe.tar.gz')
|
|
33
|
+
sftp.put(sh_path, '/tmp/agentx_setup.sh')
|
|
34
|
+
sftp.close()
|
|
35
|
+
t.close()
|
|
36
|
+
|
|
37
|
+
# 3. Start background deploy
|
|
38
|
+
print("\n=== Starting deploy script ===")
|
|
39
|
+
c = paramiko.SSHClient()
|
|
40
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
41
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=15)
|
|
42
|
+
stdin, stdout, stderr = c.exec_command(
|
|
43
|
+
"rm -rf /home/ubuntu/agentx-platform && mkdir -p /home/ubuntu/agentx-platform && "
|
|
44
|
+
"chmod +x /tmp/agentx_setup.sh && "
|
|
45
|
+
"nohup bash /tmp/agentx_setup.sh > /tmp/agentx-deploy.log 2>&1 & "
|
|
46
|
+
"echo 'PID='$!",
|
|
47
|
+
timeout=10
|
|
48
|
+
)
|
|
49
|
+
print(stdout.read().decode().strip())
|
|
50
|
+
c.close()
|
|
51
|
+
|
|
52
|
+
print("\nDeploy running in background. Checking progress...")
|
|
53
|
+
|
|
54
|
+
# 4. Poll log every 30s
|
|
55
|
+
for attempt in range(20):
|
|
56
|
+
time.sleep(30)
|
|
57
|
+
try:
|
|
58
|
+
c = paramiko.SSHClient()
|
|
59
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
60
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
61
|
+
stdin, stdout, stderr = c.exec_command(
|
|
62
|
+
"tail -8 /tmp/agentx-deploy.log 2>/dev/null; "
|
|
63
|
+
"echo '---CHECK---'; "
|
|
64
|
+
"ps aux | grep -E 'next (build|start)' | grep -v grep | head -2"
|
|
65
|
+
)
|
|
66
|
+
out = stdout.read().decode()
|
|
67
|
+
print(f"\n[{attempt+1}] {out.strip()[:400]}")
|
|
68
|
+
|
|
69
|
+
if 'DONE' in out:
|
|
70
|
+
print("\n✅ Deploy completed!")
|
|
71
|
+
c.close()
|
|
72
|
+
break
|
|
73
|
+
if 'FAILED' in out or 'error' in out.lower():
|
|
74
|
+
print("\n⚠️ Check log for errors")
|
|
75
|
+
c.close()
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
c.close()
|
|
79
|
+
except Exception as e:
|
|
80
|
+
print(f" Poll error: {e}")
|
|
81
|
+
continue
|
|
82
|
+
|
|
83
|
+
print("\n=== Verifying ===")
|
|
84
|
+
c = paramiko.SSHClient()
|
|
85
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
86
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
87
|
+
stdin, stdout, stderr = c.exec_command(
|
|
88
|
+
"ss -tlnp | grep 3000; echo ---; curl -sI http://localhost:3000/ 2>&1 | head -3"
|
|
89
|
+
)
|
|
90
|
+
print(stdout.read().decode())
|
|
91
|
+
c.close()
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import tarfile
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
HOST = '43.156.225.164'
|
|
7
|
+
PWD = 'Asdf1234!'
|
|
8
|
+
|
|
9
|
+
# 1. Create tar
|
|
10
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
11
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_fe_prod.tar.gz'
|
|
12
|
+
sh_path = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway\deploy\prod_setup.sh'
|
|
13
|
+
|
|
14
|
+
print("=== Creating tar ===")
|
|
15
|
+
count = 0
|
|
16
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
17
|
+
for root, dirs, files in os.walk(local_dir):
|
|
18
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', '.next', '.git', '__pycache__')]
|
|
19
|
+
for f in files:
|
|
20
|
+
if f.endswith('.tsbuildinfo') or f == 'pnpm-lock.yaml': continue
|
|
21
|
+
full = os.path.join(root, f)
|
|
22
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
23
|
+
tar.add(full, arcname=arc)
|
|
24
|
+
count += 1
|
|
25
|
+
print(f"{count} files, {os.path.getsize(tar_path)//1024} KB")
|
|
26
|
+
|
|
27
|
+
# 2. Upload both files via SFTP
|
|
28
|
+
print("\n=== Uploading ===")
|
|
29
|
+
t = paramiko.Transport((HOST, 22))
|
|
30
|
+
t.connect(username='ubuntu', password=PWD)
|
|
31
|
+
sftp = paramiko.SFTPClient.from_transport(t)
|
|
32
|
+
sftp.put(tar_path, '/tmp/agentx_fe.tar.gz')
|
|
33
|
+
sftp.put(sh_path, '/tmp/agentx_setup.sh')
|
|
34
|
+
sftp.close()
|
|
35
|
+
t.close()
|
|
36
|
+
|
|
37
|
+
# 3. Start deploy via exec_command (don't read stdout for nohup)
|
|
38
|
+
print("\n=== Triggering deploy ===")
|
|
39
|
+
c = paramiko.SSHClient()
|
|
40
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
41
|
+
c.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
42
|
+
|
|
43
|
+
# Use channel directly to avoid read timeout on nohup
|
|
44
|
+
channel = c.get_transport().open_session()
|
|
45
|
+
channel.exec_command(
|
|
46
|
+
"rm -rf /home/ubuntu/agentx-platform && mkdir -p /home/ubuntu/agentx-platform && "
|
|
47
|
+
"chmod +x /tmp/agentx_setup.sh && "
|
|
48
|
+
"nohup bash /tmp/agentx_setup.sh > /tmp/agentx-deploy.log 2>&1 & disown; echo 'OK'"
|
|
49
|
+
)
|
|
50
|
+
time.sleep(2)
|
|
51
|
+
# Read what we can
|
|
52
|
+
try:
|
|
53
|
+
out = channel.recv(1024).decode()
|
|
54
|
+
print(f"Trigger: {out.strip()}")
|
|
55
|
+
except:
|
|
56
|
+
print("Trigger: launched (no output)")
|
|
57
|
+
channel.close()
|
|
58
|
+
c.close()
|
|
59
|
+
|
|
60
|
+
print("\n=== Deploy running. Polling... ===")
|
|
61
|
+
|
|
62
|
+
# 4. Poll log every 30s
|
|
63
|
+
for attempt in range(25):
|
|
64
|
+
time.sleep(30)
|
|
65
|
+
try:
|
|
66
|
+
c2 = paramiko.SSHClient()
|
|
67
|
+
c2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
68
|
+
c2.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
69
|
+
stdin, stdout, stderr = c2.exec_command(
|
|
70
|
+
"tail -10 /tmp/agentx-deploy.log 2>/dev/null"
|
|
71
|
+
)
|
|
72
|
+
out = stdout.read().decode().strip()
|
|
73
|
+
# Show last meaningful line
|
|
74
|
+
lines = [l for l in out.split('\n') if l.strip()]
|
|
75
|
+
if lines:
|
|
76
|
+
print(f"[{attempt+1}] {lines[-1][:200]}")
|
|
77
|
+
|
|
78
|
+
if 'DONE' in out:
|
|
79
|
+
print("\n✅ DEPLOY COMPLETE!")
|
|
80
|
+
c2.close()
|
|
81
|
+
break
|
|
82
|
+
if '=== next build ===' in out and attempt > 0:
|
|
83
|
+
# Build just started
|
|
84
|
+
if 'Compiled' in out or 'Static' in out:
|
|
85
|
+
print(f" Build output seen...")
|
|
86
|
+
|
|
87
|
+
c2.close()
|
|
88
|
+
except Exception as e:
|
|
89
|
+
print(f"[{attempt+1}] Poll error: {e}")
|
|
90
|
+
continue
|
|
91
|
+
else:
|
|
92
|
+
print("\nTimeout waiting for deploy. Check log manually.")
|
|
93
|
+
|
|
94
|
+
# 5. Verify
|
|
95
|
+
print("\n=== Verification ===")
|
|
96
|
+
c3 = paramiko.SSHClient()
|
|
97
|
+
c3.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
98
|
+
c3.connect(HOST, username='ubuntu', password=PWD, timeout=10)
|
|
99
|
+
stdin, stdout, stderr = c3.exec_command(
|
|
100
|
+
"echo 'Port:'; ss -tlnp | grep 3000; echo 'HTTP:'; curl -sI http://localhost:3000/ 2>&1 | head -3"
|
|
101
|
+
)
|
|
102
|
+
print(stdout.read().decode())
|
|
103
|
+
c3.close()
|