import os import paramiko pw = os.environ["DEPLOY_PASSWORD"] base = os.path.dirname(os.path.abspath(__file__)) remote_stack = "/home/wakka/guest-cs-stack" compose = "docker-compose.chat.yaml -f docker-compose.chat.test7777.yaml" c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect("20.191.152.26", username="wakka", password=pw, timeout=30) sftp = c.open_sftp() for name in ["maxkb_chatwoot_bridge.py", "app.py"]: with open(os.path.join(base, "flask", name), "rb") as fh: data = fh.read().replace(b"\r\n", b"\n") with sftp.file(f"/home/wakka/{name}", "w") as rf: rf.write(data) with open(os.path.join(base, "guest-cs.test.env"), "rb") as fh: data = fh.read().replace(b"\r\n", b"\n") with sftp.file(f"{remote_stack}/guest-cs.test.env", "w") as rf: rf.write(data) sftp.close() cmd = f""" set -e cd {remote_stack} sudo docker compose -f {compose} up -d --force-recreate guest-chat sleep 40 sudo docker cp /home/wakka/maxkb_chatwoot_bridge.py guest-chat:/opt/guest-cs/maxkb_chatwoot_bridge.py sudo docker cp /home/wakka/app.py guest-chat:/opt/guest-cs/app.py # reload gunicorn workers sudo docker exec guest-chat pkill -HUP gunicorn || sudo docker restart guest-chat sleep 15 sudo docker exec guest-chat printenv CHATWOOT_AGENT_BOT_TOKEN sudo docker exec guest-chat python3 -c " import json, urllib.request, importlib, maxkb_chatwoot_bridge as m importlib.reload(m) p={{'event':'conversation_updated','id':3,'account':{{'id':1}},'messages':[{{'id':777777,'content':'你好','message_type':0,'private':False,'conversation_id':3,'account_id':1,'sender':{{'name':'游客'}}}}]}} print('extract', m._extract_incoming(p)) " sudo docker exec guest-chat python3 -c " import json, urllib.request p={{'event':'conversation_updated','id':3,'account':{{'id':1}},'messages':[{{'id':777776,'content':'你好','message_type':0,'private':False,'conversation_id':3,'account_id':1,'sender':{{'name':'游客'}}}}]}} req=urllib.request.Request('http://127.0.0.1:7788/webhook/bot1/chatwoot', data=json.dumps(p).encode(), headers={{'Content-Type':'application/json'}}, method='POST') with urllib.request.urlopen(req, timeout=120) as r: print('webhook', r.status, r.read()[:300]) " sleep 5 sudo docker logs guest-chat 2>&1 | grep -iE 'bridge|MaxKB|401|reply_len|橋接' | tail -8 """ _, o, e = c.exec_command(cmd, timeout=300) print(o.read().decode(errors="replace")) print(e.read().decode(errors="replace")) c.close()