""" 重新部署修复后的问卷 """ import paramiko, time, base64 NAS_HOST = "100.85.152.112" NAS_PORT = 22 NAS_USER = "simon" NAS_PASS = "Nas82829330" NAS_DEPLOY_PATH = "/volume1/docker/gaokao-portal" DOCKER = f"echo '{NAS_PASS}' | sudo -S /usr/local/bin/docker" COMPOSE = f"{DOCKER} compose" c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(NAS_HOST, NAS_PORT, NAS_USER, NAS_PASS, timeout=20) def run(cmd, desc="", timeout=30): if desc: print(f"[{desc}]") stdin, stdout, stderr = c.exec_command(cmd, timeout=timeout) time.sleep(1) ch = stdout.channel out = b"" while not ch.exit_status_ready(): if ch.recv_ready(): out += ch.recv(4096) time.sleep(0.2) while ch.recv_ready(): out += ch.recv(4096) result = out.decode().strip() if result: print(f" {result[:400]}") return result # 1. 上传修复后的 seed_data.py with open("C:/Users/simon/WorkBuddy/2026-05-20-15-22-53/deploy/backend/seed_data.py", "rb") as f: content = f.read() b64_data = base64.b64encode(content).decode("ascii") print("上传修复后的 seed_data.py...") transport = c.get_transport() ch = transport.open_session() ch.exec_command("base64 -d > /tmp/seed_fixed.py") ch.sendall(b64_data.encode()) ch.shutdown_write() time.sleep(2) ch.recv_exit_status() run(f"cp /tmp/seed_fixed.py {NAS_DEPLOY_PATH}/backend/seed_data.py", "替换") # 2. 删除旧数据库 db_path = f"{NAS_DEPLOY_PATH}/backend/data/gaokao.db" run(f"rm -f {db_path}", "删除旧数据库") # 3. 重新构建后端 run(f"cd {NAS_DEPLOY_PATH} && {COMPOSE} build backend --no-cache", "重新构建", timeout=180) # 4. 启动 run(f"cd {NAS_DEPLOY_PATH} && {COMPOSE} up -d backend", "启动", timeout=60) print("等待启动...") time.sleep(15) # 5. 检查 result = run(f"sqlite3 {db_path} 'SELECT id, title FROM questionnaires;'", "问卷列表") print(f"\n问卷:\n{result}") # 6. API result = run("curl -s http://localhost:8080/api/questionnaires", "问卷API", timeout=15) print(f"\nAPI:\n{result[:800]}") # 7. 清理 run("rm -f /tmp/seed_fixed.py", "清理") c.close() print("\n完成!刷新问卷页面。")