"""Deploy Caddy vhosts for mirotalk/lounge .com -> .cn proxy.""" from __future__ import annotations import sys from pathlib import Path import paramiko sys.stdout.reconfigure(encoding="utf-8", errors="replace") HOST = "107.173.30.245" USER = "root" PASS = "Xiao4669805" REMOTE = "/opt/nomadweb" FILES = [ "deploy/caddy/mirotalk.nomadro.com.caddy", "deploy/caddy/lounge.nomadro.com.caddy", ] RELOAD = """ set -euo pipefail for f in mirotalk.nomadro.com.caddy lounge.nomadro.com.caddy; do install -m 644 "/opt/nomadweb/deploy/caddy/$f" "/etc/caddy/sites/$f" done caddy validate --config /etc/caddy/Caddyfile 2>&1 || caddy fmt --overwrite /etc/caddy/sites/*.caddy systemctl reload caddy || systemctl restart caddy sleep 2 curl -skI https://mirotalk.nomadro.com/ | head -4 curl -skI https://lounge.nomadro.com/ | head -4 """ def ensure_dir(sftp, path: str) -> None: parts = path.strip("/").split("/") cur = "" for p in parts: cur += "/" + p try: sftp.stat(cur) except FileNotFoundError: try: sftp.mkdir(cur) except OSError: pass def main() -> int: root = Path(__file__).resolve().parents[1] client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(HOST, username=USER, password=PASS, timeout=30) sftp = client.open_sftp() for rel in FILES: local = root / rel remote = f"{REMOTE}/{rel}" print(f"UPLOAD {rel}") ensure_dir(sftp, str(Path(remote).parent).replace("\\", "/")) sftp.put(str(local), remote) ensure_dir(sftp, "/etc/caddy/sites") sftp.put(str(local), f"/etc/caddy/sites/{Path(rel).name}") sftp.close() _, stdout, stderr = client.exec_command(RELOAD, timeout=60) print(stdout.read().decode()) err = stderr.read().decode() if err.strip(): print("ERR:", err) code = stdout.channel.recv_exit_status() client.close() return code if __name__ == "__main__": raise SystemExit(main())