- No fw.conf required on first run — only option is Add Node
- Adding a node deploys it immediately (saves to fw.conf)
- Shows pending deploys when fw.conf has undeployed nodes
- Status/Remove shown only when nodes are deployed
- DOCKER_DOWNLOAD_URL and WALLARM_IMAGE_URL env vars for custom sources
- Falls back to offline/ dir if present
- Docker installed under /opt/fw/docker/bin/
- Clean Docker approach: pull wallarm/node image, run containers
- No symlinks, no path patching, no filesystem tricks
- Works on any Linux with Docker (VMs, LXC, bare metal)
- Multi-node: each container gets unique port + volume
- Simplified to one Python file
- Single deploy.py (~400 lines) replaces all Go code
- setup.sh installs Python 3.12 via pyenv (cross-distro)
- Same functionality: menu, deploy, edit, remove, status, tunnel
- No build step — script runs directly
- Path patching and port offset in native Python
Bind mounts and unshare namespace approaches are fragile across
systemd versions. Symlink + --config-file for wcli provides
adequate isolation for multi-instance.
- No flags needed — interactive menu on startup
- [1] Deploy: shows .env nodes, ✓ marks deployed, pick by number
- [2] Remove: numbered list of deployed nodes from state.json
- [3] Status: shows all nodes with systemd state
- [4] Tunnel, [5] Dashboard (TUI)
- .env supports WALLARM_NODES=srv1,srv2 with per-node keys
- Backward compatible with legacy single-node .env
- patchPaths uses bash -c 'find ... -exec sed {} +' instead of Go exec
- Port offset applied to ALL yaml/yml/conf files across instance
- Kill deploy-time nginx before systemd starts
- Simplified systemd template (removed broken fuser line)
- Port offset from instance name hash avoids supervisord conflicts
- ExecStartPre kills old nginx before starting new one
- Removed broken patchelf approach
Each instance creates /opt/wallarm -> its own directory before starting.
Removed patchelf approach (broke library paths).
Systemd template updated with ExecStartPre ln -sf.