"""Upload backend hotfix files and restart API (no git commit required).""" from __future__ import annotations import sys import time 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" ROOT = Path(__file__).resolve().parents[1] FILES = [ "backend/app/config.py", "backend/app/main.py", "backend/app/services/pb_client.py", "backend/app/services/pb_repo.py", "backend/app/services/s3_storage.py", "backend/app/services/ntfy_push.py", "backend/app/services/pocketbase.py", "backend/app/services/auth.py", "backend/app/services/community_store.py", "backend/app/services/social_store.py", "backend/app/services/platform_store.py", "backend/app/routers/media.py", "backend/requirements.txt", "backend/scripts/init_pb_collections.py", "deploy/systemd/nomadro-api.service", "deploy/nomadro-api.env.example", ] def main() -> int: 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.replace(chr(92), '/')}" remote_dir = "/".join(remote.split("/")[:-1]) try: sftp.stat(remote_dir) except OSError: parts = remote_dir.split("/") for i in range(2, len(parts) + 1): p = "/".join(parts[:i]) try: sftp.stat(p) except OSError: sftp.mkdir(p) print("upload", rel) sftp.put(str(local), remote) sftp.close() cmd = f""" set -e install -m 644 {REMOTE}/deploy/systemd/nomadro-api.service /etc/systemd/system/nomadro-api.service systemctl daemon-reload cd {REMOTE}/backend .venv/bin/pip install -q -r requirements.txt .venv/bin/python scripts/init_pb_collections.py || true systemctl restart nomadro-api sleep 2 curl -s http://127.0.0.1:8055/api/v1/health """ _, stdout, stderr = client.exec_command(cmd, timeout=180) print(stdout.read().decode()) err = stderr.read().decode() if err.strip(): print("ERR:", err) client.close() return 0 if __name__ == "__main__": raise SystemExit(main())