Fixed
moav update/ re-bootstrap silently orphaned every non-initial user's proxy access. Bootstrap regenerates the sing-box + xray configs from templates (envsubst), which drops the per-user entriesmoav user addinserts incrementally — and the re-add loop never re-inserted them into those proxy configs. So after an update, every user created viamoav user addfailed withunknown UUIDon Reality/Trojan/AnyTLS/Hysteria2/CDN/XHTTP (the TLS handshake succeeded, then auth rejected them). Newscripts/lib/sync.shsync_server_usersre-inserts every user from state into the sing-box + xray configs using their stored credentials — idempotent, so already-distributed bundles keep working (no fresh UUIDs) — and it now runs automatically at the end of bootstrap and frommoav regenerate-users(which also reloads the proxies). Also detects the xraysettings.clientsvssettings.usersfield so it matches whatever the running config uses. If you're already affected:moav regenerate-usersreconciles the running server.moav test'sreadmecheck false-failed on CDN — it grepped the rendered README for a "…not configured" sentinel to detect an unfilled section, but the template's CDN QR fallback contains the literal static textor CDN not configured, so an enabled-and-filled CDN section still matched (the first post-1.9.0 domain e2e reportedreadme: failwith every protocol passing). The check now positively asserts each enabled protocol's actual share link is present in the README instead — immune to static sentinel text, and it still catches the unfilled-placeholder class.
Quick Install
curl -fsSL moav.sh/install.sh | bashThis will install MoaV to /opt/moav and guide you through setup.
Documentation
moav.sh/docs — Full documentation
- Setup Guide — Complete installation instructions
- Client Setup — How to connect from devices
- DNS Configuration — DNS records setup
- CLI Reference — All commands and options
- Monitoring — Grafana dashboards and metrics
- Troubleshooting — Common issues and solutions