import os, sys, time import paramiko HOST = "20.191.152.26" USER = "wakka" PASSWORD = os.environ["DEPLOY_PASSWORD"] REMOTE_DIR = "/home/wakka/guest-cs-stack" LOCAL_STACK = os.path.dirname(os.path.abspath(__file__)) FILES = [ "docker-compose.chat.yaml", "docker-compose.chat.remote.yaml", "chatwoot.env", "guest-cs.env", "guest-cs.remote.env", "bootstrap-chatwoot.sh", ] INSTALL_DOCKER = r""" set -e if ! command -v docker >/dev/null 2>&1; then echo "[install] docker..." sudo apt-get update -qq sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose-v2 sudo usermod -aG docker wakka || true fi docker --version docker compose version """ DEPLOY = rf""" set -euo pipefail cd {REMOTE_DIR} echo "[deploy] stop old python app on 7777..." pkill -f "python app.py" 2>/dev/null || true fuser -k 7777/tcp 2>/dev/null || true sleep 2 echo "[deploy] pull..." docker pull ladioussuapp/guest-chat:latest echo "[deploy] up..." docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml down 2>/dev/null || true docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml up -d --force-recreate sleep 25 docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml ps curl -sI http://127.0.0.1:7777/guest-customer-service | head -8 """ def run(client, cmd, timeout=900): print("\n>>>", cmd[:120].replace("\n", " ")) _, o, e = client.exec_command(cmd, timeout=timeout) out = o.read().decode("utf-8", errors="replace") err = e.read().decode("utf-8", errors="replace") code = o.channel.recv_exit_status() if out: print(out) if err: print(err, file=sys.stderr) return code, out, err def main(): c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(HOST, username=USER, password=PASSWORD, timeout=30) run(c, "hostname; pwd; ls -la app.py 2>/dev/null; ps aux | grep 'python app' | grep -v grep") code, _, _ = run(c, INSTALL_DOCKER, timeout=900) if code != 0: return code # re-connect after docker group change may need new session with docker group c.close() time.sleep(2) c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(HOST, username=USER, password=PASSWORD, timeout=30) run(c, f"mkdir -p {REMOTE_DIR}") sftp = c.open_sftp() for name in FILES: sftp.put(os.path.join(LOCAL_STACK, name), f"{REMOTE_DIR}/{name}") print(f"uploaded {name}") sftp.close() # use sudo docker if group not active yet deploy_cmd = DEPLOY.replace("docker ", "sudo docker ") code, out, _ = run(c, deploy_cmd, timeout=900) c.close() return code if __name__ == "__main__": raise SystemExit(main())