122 lines
4.0 KiB
Python
Raw Permalink Normal View History

#!/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)