122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
部署语料采集系统到广州服务器
|
|
通过 Gatekeeper API 远程操作
|
|
"""
|
|
import json
|
|
import urllib.request
|
|
|
|
GATEKEEPER = "http://43.139.217.141:3910"
|
|
TOKEN = "GATEKEEPER_TOKEN_REDACTED"
|
|
HEADERS = {
|
|
"Authorization": f"Bearer {TOKEN}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
DEPLOY_DIR = "/data/guanghulab/server/corpus-agent"
|
|
|
|
def gatekeeper(method, path, data=None):
|
|
url = f"{GATEKEEPER}/{path}"
|
|
body = json.dumps(data).encode() if data else None
|
|
req = urllib.request.Request(url, data=body, headers=HEADERS, method="POST")
|
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
return json.loads(resp.read().decode())
|
|
|
|
def exec_cmd(cmd, timeout=30):
|
|
print(f" → {cmd[:80]}...")
|
|
result = gatekeeper("exec", "exec", {"cmd": cmd, "timeout": timeout * 1000})
|
|
stdout = result.get("stdout", "")
|
|
stderr = result.get("stderr", "")
|
|
if stdout.strip():
|
|
for line in stdout.strip().split("\n"):
|
|
print(f" {line}")
|
|
if stderr.strip():
|
|
for line in stderr.strip().split("\n"):
|
|
print(f" [ERR] {line}")
|
|
return result.get("exitCode", 0) == 0
|
|
|
|
def write_file(remote_path, content):
|
|
print(f" → 写入 {remote_path}")
|
|
gatekeeper("write", "file/write", {"path": remote_path, "content": content})
|
|
|
|
def read_local(path):
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
return f.read()
|
|
|
|
print("=" * 60)
|
|
print("部署语料采集系统到广州服务器")
|
|
print("=" * 60)
|
|
|
|
# Step 1: Create directory
|
|
print("\n[1/6] 创建目录...")
|
|
exec_cmd(f"mkdir -p {DEPLOY_DIR}")
|
|
exec_cmd(f"mkdir -p {DEPLOY_DIR}/static")
|
|
exec_cmd(f"mkdir -p {DEPLOY_DIR}/data")
|
|
|
|
# Step 2: Upload files
|
|
print("\n[2/6] 上传代码文件...")
|
|
LOCAL_DIR = "/workspace/guanghulab/server/corpus-agent"
|
|
|
|
for fname in ["server.py", "engine.py", "requirements.txt"]:
|
|
content = read_local(f"{LOCAL_DIR}/{fname}")
|
|
write_file(f"{DEPLOY_DIR}/{fname}", content)
|
|
print(f" ✓ {fname}")
|
|
|
|
# Upload static files
|
|
for fname in ["index.html"]:
|
|
content = read_local(f"{LOCAL_DIR}/static/{fname}")
|
|
write_file(f"{DEPLOY_DIR}/static/{fname}", content)
|
|
print(f" ✓ static/{fname}")
|
|
|
|
# Step 3: Install Python dependencies
|
|
print("\n[3/6] 安装 Python 依赖...")
|
|
exec_cmd(f"pip3 install httpx 2>&1 | tail -5", timeout=60)
|
|
exec_cmd(f"cd {DEPLOY_DIR} && pip3 install -r requirements.txt 2>&1 | tail -5", timeout=120)
|
|
|
|
# Step 4: Stop any existing service
|
|
print("\n[4/6] 停止旧服务...")
|
|
exec_cmd(f"pkill -f 'uvicorn.*corpus-agent' 2>/dev/null; sleep 1; echo 'done'")
|
|
|
|
# Step 5: Update nginx config
|
|
print("\n[5/6] 更新 Nginx 配置...")
|
|
nginx_conf = read_local(f"{LOCAL_DIR}/deploy-nginx.conf")
|
|
write_file("/etc/nginx/sites-enabled/guanghulab", nginx_conf)
|
|
exec_cmd("nginx -t 2>&1")
|
|
exec_cmd("systemctl reload nginx 2>&1 || nginx -s reload 2>&1")
|
|
print(" ✓ Nginx 配置已更新并重载")
|
|
|
|
# Step 6: Start the service
|
|
print("\n[6/6] 启动语料采集服务...")
|
|
start_cmd = (
|
|
f"cd {DEPLOY_DIR} && "
|
|
f"nohup python3 server.py > ../logs/corpus-agent.log 2>&1 & "
|
|
f"echo 'PID: $!'"
|
|
)
|
|
exec_cmd(start_cmd)
|
|
exec_cmd("sleep 2")
|
|
|
|
# Verify
|
|
print("\n" + "=" * 60)
|
|
print("验证部署...")
|
|
|
|
result = gatekeeper("exec", "exec", {"cmd": "ps aux | grep corpus-agent/server.py | grep -v grep", "timeout": 5000})
|
|
stdout = result.get("stdout", "")
|
|
if stdout.strip():
|
|
print(f"✓ 进程已启动: {stdout.strip()}")
|
|
else:
|
|
print("✗ 进程未启动!")
|
|
|
|
result = gatekeeper("exec", "exec", {"cmd": "curl -s http://127.0.0.1:8084/api/health 2>/dev/null || echo 'FAIL'", "timeout": 5000})
|
|
stdout = result.get("stdout", "")
|
|
print(f"✓ 健康检查: {stdout[:200]}")
|
|
|
|
result = gatekeeper("exec", "exec", {"cmd": "curl -s -o /dev/null -w '%{http_code}' https://guanghulab.com/corpus/ 2>/dev/null || echo 'FAIL'", "timeout": 10000})
|
|
stdout = result.get("stdout", "")
|
|
print(f"✓ 公网访问: HTTP {stdout}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("部署完成!")
|
|
print(f"公网地址: https://guanghulab.com/corpus/")
|
|
print(f"本地端口: 127.0.0.1:8084")
|
|
print("=" * 60)
|