Site Lock guards a website's document root by recording a SHA-256 hash of every file and comparing the live tree against that snapshot on demand. Each site can hold several snapshots; an integrity check reports files that were added, modified or deleted since the one you pick, and a restore copies the recorded files back over the docroot. There is also an optional immutable lock that sets the chattr +i flag on the docroot so nothing — including a compromised PHP process — can write to it until an admin unlocks it again, which means you must unlock before any legitimate deploy or CMS update.
Beyond on-demand checks, a per-site watch mode registers the domain with a Go watcher running as the vinza-sitelock-watch systemd unit, installed by the plugin's install.sh; it uses inotify and appends detections to an alert log the page reads back. All filesystem work happens through the root agent, and on multi-node installs snapshots, the watcher and the alert log all live on the node that actually hosts the site, so the plugin resolves each domain to its node before acting. Website owners can snapshot, check, restore, lock and watch their own domains only — every tenant action re-verifies domain ownership against the same ABAC rules the Websites page uses — while the watcher service status stays admin-only. Snapshots are stored under /var/lib/vinzapanel/sitelocks, and the plugin cleans them up when a website is deleted. If Go is absent at install time and no prebuilt binary matches your architecture, the watcher will not run and only the manual snapshot/check/restore path is available.
Each site can exclude paths (caches, uploads, logs) from the integrity check and the watcher, and have an hourly or daily integrity check run as root from cron. Added or modified files are scanned with ClamAV and Vinza Scanner when present; infections are reported in the check and the alerts, never deleted. With panel 1.3.78 or later, snapshots leave excluded paths out and a restore never deletes them; on older panels snapshots cover the whole document root and a restore is refused while excludes are set.
Use VinzaPanel's REST API to download and install this app programmatically.
POST /plugins/api/download/site-lock/ Content-Type: application/json { "panel_version": "1.0.0" }
{
"success": true,
"plugin_id": "site-lock",
"version": "1.0.8",
"download_url": "..."
}