nomadweb/scripts/deploy_live_caddy.py
eric ff7b721acb feat: NomadCNA community layer, social matching, payments, and ebook
Port meetups, discussions, gigs, dating/chat, VIP pay (ZPay/XorPay), MiroTalk live, digital academy, and ebook reader. Add persistent community_store, git-first deploy docs, and env template for production secrets.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 09:38:13 -05:00

75 lines
2.0 KiB
Python

"""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())