#!/usr/bin/env python3 """Stop and remove Cal.com / Owncast / PeerTube from China VPS.""" from __future__ import annotations import os import sys from pathlib import Path import paramiko from load_dev_env import ssh_config HOST, USER, SSH_PASSWORD = ssh_config() REMOTE_DIR = "/opt/nomadro-services/integrations" NGINX_DIR = "/www/server/panel/vhost/nginx" ROOT = Path(__file__).resolve().parent.parent HEAVY_DOMAINS = ["cal.nomadro.cn", "owncast.nomadro.cn", "peertube.nomadro.cn"] def run(c: paramiko.SSHClient, cmd: str, timeout: int = 300) -> None: print(f"\n$ {cmd.replace(PASSWORD, '***')}") _, o, e = c.exec_command(f"echo '{PASSWORD}' | sudo -S bash -lc \"{cmd}\"", timeout=timeout, get_pty=True) sys.stdout.buffer.write(o.read()) sys.stdout.buffer.write(e.read()) def main() -> None: c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(HOST, username=USER, password=PASSWORD, timeout=30) try: run(c, f"cd {REMOTE_DIR} && docker compose stop calcom owncast peertube redis-int 2>/dev/null || true") run(c, f"cd {REMOTE_DIR} && docker compose rm -f calcom owncast peertube redis-int 2>/dev/null || true") run(c, "docker rmi calcom/cal.com:v4.6.1 owncast/owncast:latest chocobozzz/peertube:production-bullseye 2>/dev/null || true") for domain in HEAVY_DOMAINS: run(c, f"rm -f {NGINX_DIR}/{domain}.conf") sftp = c.open_sftp() sftp.put(str(ROOT / "docker" / "integrations" / "docker-compose.yml"), f"{REMOTE_DIR}/docker-compose.yml") sftp.close() run(c, f"cd {REMOTE_DIR} && docker compose up -d postgres-listmonk listmonk 2>/dev/null || " f"cd {REMOTE_DIR} && docker compose up -d postgres-int listmonk 2>/dev/null || true") run(c, "free -h | head -2") run(c, f"cd {REMOTE_DIR} && docker compose ps -a 2>/dev/null || docker ps -a") run(c, "nginx -t && nginx -s reload") run(c, "curl -sI https://listmonk.nomadro.cn/ | head -3") print("\n=== Heavy services removed, Listmonk kept ===") finally: c.close() if __name__ == "__main__": main()