This release includes 4 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+14 more
Affected surfaces
Summary
AI summaryxsrv now requires Debian 13, removes netdata and several roles, and adds Victoriametrics‑based monitoring.
Full changelog
v2.0.0 - 2026-04-02
[!IMPORTANT]
The mirror at https://gitlab.com/nodiscc/xsrv will no longer be maintained after this release.
Please use https://github.com/nodiscc/xsrv or https://codeberg.org/nodiscc/xsrv instead
Issues have been moved to https://codeberg.org/nodiscc/xsrv/issues
Upgrade procedure: Follow these steps in order:
0. Upgrade to v1.27.0 and deploy, if not already done
1. Update your playbook (xsrv edit-playbook):
- Remove the
nodiscc.xsrv.monitoringandnodiscc.xsrv.monitoring_netdataroles from all your hosts - Add the
nodiscc.xsrv.monitoring.utils,nodiscc.xsrv.monitoring.rsyslogandnodiscc.xsrv.monitoring.exportersroles to all your hosts, early in the playbook - Add the
nodiscc.xsrv.monitoring.victoriametricsrole to one of your hosts. This host will act as a central monitoring point and receive metrics from all hosts wherenodiscc.xsrv.monitoring.exportersis deployed (via remote write) - Add the
nodiscc.xsrv.monitoring.grafanarole to the same host as the victoriametrics role (but after theapacherole). This will provide visualizations/dashboards for metrics collected by victoriametrics - If present, rename
nodiscc.xsrv.monitoring_goaccesstonodiscc.xsrv.monitoring.goaccess
2. Migrate variables (xsrv edit-host / xsrv edit-group):
Remove all variables named netdata_* and use these equivalents:
netdata_allow_connections_from:grafana_allowed_hostsnetdata_http_checks:victoriametrics_http_checksnetdata_x509_checks: Removed - usevictoriametrics_http_checksinstead (includes automatic certificate validity/expiration checks)netdata_port_checks: Removednetdata_fping_hosts: Removednetdata_firewalld_zones:exporter_firewalld_zonesrsnapshot_enable_cron:rsnapshot_enable_service
3. Add required variables for the new monitoring roles:
# xsrv edit-group default all
monitoring_victoriametrics_url: "https://my.CHANGEME.org:8428"
# xsrv edit-group-vault default all
victoriametrics_exporters_auth_password: CHANGEME
monitoring_exporters_auth_password: CHANGEME
# xsrv edit-host default my.CHANGEME.org
grafana_fqdn: grafana.CHANGEME.org
- Network/firewall: Remove all NAT/firewall rules allowing access to hosts on port 19999/tcp (netdata)
- Network/firewall: Ensure hosts where exporters are deployed can access the host where victoriametrics is deployed on port 8428/tcp (NAT, firewalls)
- The
nodiscc.xsrv.monitoring.exportersrole will uninstall netdata and remove all its configuration files/historical data unless you explicitly setnetdata_uninstall: false
4. Other role-specific changes:
- libvirt: In
libvirt_port_forwards, move*.dnat.*.host_interfaceto the top-level list (same level asvm_name) - wireguard: remove the
data/wireguard/directory and its contents from your project directory (no longer used) - wireguard: If you had custom
routesdefined underwireguard_peers, update them to use the new list syntax:
-# routes: "1.2.3.4/32, 192.168.18.0/24"
+# routes:
+# - 1.2.3.4/32
+# - 192.168.18.0/24
5. Deploy the changes:
xsrv self-upgrade # upgrade the xsrv script
xsrv upgrade # upgrade roles/ansible environments to the latest release
xsrv check # (optional) simulate changes that will be applied
xsrv deploy # apply changes
Removed:
- monitoring_netdata: remove role, archive it to separate repository
- graylog: remove role, archive it to separate repository
- ollama: remove role, archive it to separate repository
- gotty: remove role, archive it to separate repository
- monitoring_utils: remove lynis, archive it to separate role/repository
- common/ssh: remove ability to revoke SSH keys globally using
ssh_server_revoked_keys - common/ssh: no longer look for/replace weak DH parameters
- libvirt: remove ability to route/forward ports between bridges (
libvirt_port_forwards.*.forward) - libvirt: remove ability to forward ports using
host_ip(onlyhost_interfacemust be used) - gitea_act_runner: remove support for
gitea_act_runner_container_engine: docker, only podman is supported - nextcloud: remove support for external user authentication
Added:
- add
monitoring.exportersrole (monitoring agents/metrics exporters) - add
monitoring.victoriametricsrole (monitoring metrics scraper and time-series database) - add
monitoring.grafanarole (analytics and interactive visualization web application) - add
kiwixrole (offline viewer for Wikipedia and other wikis) - add
llamacpprole (run Large Langue Models (LLM) locally) - common/firewalld: allow defining a manual IP address/network blocklist (
firewalld_blocklist) - common: allow automatically putting mechanical/rotational hard drives in standby mode after 1 hour (
hdparm_auto_standby_drives: false/true) - searxng: allow protecting the web interface behind HTTP Basic authentication (
searxng_auth_enabled/username/password) - moodist/owncast/searxng/stirlingpdf: automatically remove unused podman images/containers, nightly (conserve disk space)
- wireguard: generate a QR code for each wireguard_peer containing the configuration (can be scanned with mobile apps such as WG Tunnel)
- backup: add
rsnapshot_remote_backups[*].portoption (default 22, allows backups over different SSH port) - common/users: make the default system
umaskconfigurable - common/sysctl: make the value of
kernel.yama.ptrace_scopeconfigurable - add support for Debian 13 in all roles
Changed:
- rename
monitoring_utilsrole tomonitoring.utils - rename
monitoring_rsyslogrole tomonitoring.rsyslog - rename
monitoring_goaccesstomonitoring.goaccess - default playbook: only enable the common role by default, let user select which roles to enable
- common/firewalld: ensure ufw is removed before installing firewalld
- wireguard: allow specifying
wireguard_peerswithout apublic_key, in which case a private/public key pair will be generated automatically on the server - libvirt: use firewalld to manage port forwarding to libvirt VMs, remove direct iptables management
- backup: migrate from cron to systemd timers/services
- wireguard: allow wireguard clients/peers traffic to flow out the default network interface by default (allows clients to tunnel all their internet traffic through the VPN)
- wireguard: allow wireguard peers to connect to the DNS service on the wireguard server by default
- wireguard: allow forwarding of wireguard peers network traffic to other zones by default (
wireguard_allow_forwarding: yes/no) - shaarli: preserve thumbnails cache during upgrades
- nextcloud: schedule start of maintenance window (resource intensive tasks) at 02:00
- searxng: allow returning results as JSON (add
&format=jsonto URL parameters) - searxng: increase sepiasearch search engine weight to 2
- searxng: increase wiby search engine weight to 1.2
- searxng: enable searchmysite search engine by default
- common: fail2ban: use
hash:netipset types instead ofhash:ip - common: ssh: ensure ssh is automatically started at boot, disable socket activation
- common: ensure cron is installed
- monitoring.rsyslog: ensure logrotate is installed
- libvirt: allow accessing VM SPICE graphical consoles remotely
- apache: set a fixed 30 day renewal threshold for SSL/TLS certificates obtained through
mod_md - kiwix: update rationalwiki download URL
- readme-gen: always write SSH client configuration and GTK bookmarks for all hosts to README.md, even for hosts that are not in
readme_gen_limit - doc: gitea actions: document manually triggering a workflow from the actions page (workflow_dispatch)
- xsrv: self-upgrade now also updates the bash completion script if it exists
- shaarli: update stack template to v0.12 [1] [1]
- shaarli: udpate to v0.16.0 [1
- nextcloud: update to 31.0.13 [1] [2] [3] [4]
- gitea: update to v1.25.5
- owncast: update to v0.2.4 [1] [2] [3]
- postgresql: update pgmetrics to v1.18.0 [1] [2]
- stirlingpdf: update to v2.7.1
- searxng: allow returning results as JSON (add
&format=jsonto URL parameters) - searxng: increase sepiasearch search engine weight to 2
- searxng: increase wiby search engine weight to 1.2
- monitoring_rsyslog: ensure logrotate is installed
- jellyfin: update opensubtitles plugin to v22.0.0
- searxng: enable searchmysite search engine by default, increase weight to 2
- matrix: update element-web to v1.12.12
- matrix: update synapse-admin to v0.11.4
- openldap: update ldap-account-manager to v9.5.1
- openldap: upgrade self-service-password to v1.7.3
- xsrv: update ansible to v12.3.0 [1] [1]
- xsrv: update trivy security scanner to v0.69.3
- xsrv: init-template: update installer image to Debian 13
- gitea_act_runner: update act-runner to v0.2.12 [1]
- gitea_act_runner: update
debian-latestandubuntu-latestbase image aliases to usenode:22-trixie - gitea_act_runner: always enable nightly cleanup of podman volumes and containers created by act-runner, regardless of
gitea_act_runner_daily_podman_prune - goaccess: update IP to Country GeoIP database, adjust version number automatically base on current date
- common: ssh: ensure ssh is automatically started at boot, disable socket activation
- common: ensure cron is installed
- common/apt: make unattended-upgrades configuration and sources.list file compatible with Debian 13
- make all roles compatibles with debian 13, except jitsi
- doc: gitea actions: document manually triggering a workflow from the actions page (workflow_dispatch)
- doc: update comments in several files to reflect new documentation in Debian 13
- doc: migrate all gitlab.com/nodiscc/xsrv and gitlab.com/nodiscc/toolbox URLs to github, deprecate gitlab mirror
- doc: mark jitsi role as incompatible with Debian 13
- update documentation
- CI/CD: migrate from GitLab CI to GitHub Actions
Fixed:
- xsrv: fix fetch-backups failing with numeric ansible_ssh_port
- tt-rss: switch git repository to mirror on https://gitlab.com/nodiscc/tt-rss (upstream repository removed)
- tt-rss:
clone/upgrade tt-rsstask no longer always returns changed (pin version to latest commit from upstream) - searxng: remove engines that no longer exist from config file, fix warnings in logs
- jitsi: fix apt prosody apt repository failing to update with
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F7A37EB33D0B25D7 - matrix: update APT repository signing key (the previous key has expired)
- postgresql: fix
'postgresql_version' is undefinederror when running themonitoringtag alone - wireguard: really delete peers and associated keys/configuration when
wireguard_peers[*].stateis set toabsent - wireguard: fix missing /32 in generated client config files
- shaarli: fix missing php extension php-xml
- nextcloud: fix
trusted_proxies is not correctly definedwarning in admin area - monitoring.utils: fix bonnie++ report generation
- tt_rss: fix DB update error on first deployment
- podman/owncast: fix
"pasta": executable file not found
Breaking Changes
- Minimum runtime requirement changed to Debian 13 (xsrv no longer supports earlier Debian releases).
- Removed monitoring_netdata role and all associated netdata configuration variables (`netdata_*`).
- Removed several roles: graylog, ollama, gotty, common/ssh `ssh_server_revoked_keys`, libvirt port‑forwarding features, gitea_act_runner docker engine support, nextcloud external authentication.
- Renamed monitoring roles: `monitoring_utils` → `monitoring.utils`, `monitoring_rsyslog` → `monitoring.rsyslog`, `monitoring_goaccess` → `monitoring.goaccess`.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About xsrv
Install and manage self-hosted services/applications, on your own server(s).
Related context
Related tools
Beta — feedback welcome: [email protected]