70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
|
|
"""
|
||
|
|
强制部署新问卷 + 重置数据库
|
||
|
|
"""
|
||
|
|
import paramiko, time, base64, tarfile, io
|
||
|
|
|
||
|
|
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"
|
||
|
|
|
||
|
|
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=""):
|
||
|
|
if desc:
|
||
|
|
print(f"[{desc}]")
|
||
|
|
stdin, stdout, stderr = c.exec_command(cmd, timeout=30)
|
||
|
|
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)
|
||
|
|
print(f" {out.decode().strip()[:300]}")
|
||
|
|
return out.decode().strip()
|
||
|
|
|
||
|
|
# 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_new.py")
|
||
|
|
ch.sendall(b64_data.encode())
|
||
|
|
ch.shutdown_write()
|
||
|
|
time.sleep(2)
|
||
|
|
ch.recv_exit_status()
|
||
|
|
|
||
|
|
# 2. 替换 NAS 上的 seed_data.py
|
||
|
|
run(f"cp /tmp/seed_new.py {NAS_DEPLOY_PATH}/backend/seed_data.py", "替换文件")
|
||
|
|
|
||
|
|
# 3. 删除旧数据库(强制重新 seed)
|
||
|
|
db_path = f"{NAS_DEPLOY_PATH}/backend/data/gaokao.db"
|
||
|
|
run(f"rm -f {db_path}", "删除旧数据库")
|
||
|
|
|
||
|
|
# 4. 重启后端触发 seed
|
||
|
|
run(f"cd {NAS_DEPLOY_PATH} && {DOCKER} compose restart backend", "重启后端")
|
||
|
|
print("等待容器启动...")
|
||
|
|
time.sleep(12)
|
||
|
|
|
||
|
|
# 5. 检查
|
||
|
|
result = run(f"sqlite3 {db_path} 'SELECT id, title FROM questionnaires;'", "问卷列表")
|
||
|
|
print(f"\n新问卷:\n{result}")
|
||
|
|
|
||
|
|
# 6. 验证 API
|
||
|
|
run("curl -s http://localhost:8080/api/questionnaires", "问卷API")
|
||
|
|
|
||
|
|
# 7. 清理
|
||
|
|
run("rm -f /tmp/seed_new.py", "清理")
|
||
|
|
|
||
|
|
c.close()
|
||
|
|
print("\n完成!刷新问卷页面查看新问卷。")
|