diff --git a/app.py b/app.py index 9f30e11..d3abe66 100644 --- a/app.py +++ b/app.py @@ -1210,28 +1210,21 @@ def _deploy_bw_manager_compose(files: dict[str, str]) -> dict: backup = f"/app-config/deployment-backups/bw-manager-{timestamp}" image = "bw-manager-bw-manager" rollback_image = f"{image}:rollback-{timestamp}" - init_script = f"""from pathlib import Path + script = f"""from pathlib import Path import shutil candidate = Path({candidate!r}) if candidate.exists(): shutil.rmtree(candidate) candidate.mkdir(parents=True) +for relative, content in {files!r}.items(): + target = candidate / relative + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text(content) live_env = Path({working_dir!r}) / '.env' if live_env.exists(): shutil.copy2(live_env, candidate / '.env') """ - rc, _out, err = _remote_python(init_script) + rc, _out, err = _remote_python(script) if rc != 0: - raise RuntimeError(f"BW Manager candidate initialization failed: {err[-300:]}") - # Stage one file per SSH call. Sending the complete repository in one - # command exceeds Linux's argv limit once app.py and templates are encoded. - for relative, content in files.items(): - file_script = f"""from pathlib import Path -target = Path({candidate!r}) / {relative!r} -target.parent.mkdir(parents=True, exist_ok=True) -target.write_text({content!r}) -""" - rc, _out, err = _remote_python(file_script) - if rc != 0: - raise RuntimeError(f"BW Manager staging failed for {relative}: {err[-300:]}") + raise RuntimeError(f"BW Manager candidate staging failed: {err[-300:]}") rc, _out, err = _ssh(VPS_SSH, f"cd {candidate} && docker compose config -q && docker compose build --pull", timeout=600) if rc != 0: raise RuntimeError(f"BW Manager candidate build failed: {err[-500:]}")