<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[xo-apply — configuration-as-code for Xen Orchestra (looking for feedback &amp; testers)]]></title><description><![CDATA[<p dir="auto">Hi all,</p>
<p dir="auto">I've been working on a project I'd like to share and get feedback on: xo-apply — configuration-as-code for Xen Orchestra.</p>
<p dir="auto">The idea: XO keeps its entire configuration locked inside its own database. There's no way to write any of it down in a reviewable file, so rebuilding an XO means re-creating it all by hand in the UI. xo-apply treats XO as code: declare your XO in a YAML file, keep it in git, and reconcile any instance to match it — the same model Terraform uses for cloud accounts.</p>
<p dir="auto">Backups are where we started — that whole surface is complete today (remotes, jobs, schedules, DR/CR, metadata, mirror, sequences)</p>
<p dir="auto">What you can do with it:</p>
<p dir="auto">Rebuild fast — reinstall XO, reconnect your pools, then xo-apply apply config.yaml and your remotes/jobs/schedules are back without clicking through the UI.<br />
Detect drift — xo-apply diff tells you when someone changed a job in the UI and it no longer matches the file (exits non-zero on drift, so it drops straight into CI).<br />
Review changes in git — every config change is a commit with an author and a diff.<br />
Clone configs — apply one file to several XO instances (e.g. keep staging and production identical).<br />
A quick taste of the diff output:</p>
<p dir="auto">Remotes:</p>
<ul>
<li>create  nas-backups  (nfs://192.168.1.50:/export/xo-backups)<br />
Backup jobs:</li>
<li>create  nightly-critical  (delta, 1 schedule)<br />
~ update  weekly-full<br />
~ schedule weekly<br />
retention: 4 → 8</li>
</ul>
<p dir="auto">Plan: 2 to create, 1 to update, 0 untracked<br />
There's also an interactive terminal UI — just run xo-apply with no arguments and it walks you through connecting, picking a config file, and running diff/apply/export. And a plain export command to write down what you already have on an existing XO, so you can adopt it without starting from scratch.</p>
<p dir="auto">What's covered today (the complete backup surface):</p>
<p dir="auto">Backup remotes (NFS, SMB, S3, local)<br />
VM backup jobs + schedules (delta/full, smart-mode tag selection, explicit VM lists)<br />
Disaster Recovery / Continuous Replication (SR targets)<br />
Pool metadata + XO config backups<br />
Mirror backups<br />
Backup sequences (run schedules one after another)</p>
<p dir="auto">On the roadmap — this is where the project grows beyond backups toward managing the rest of XO, and where I'd love input on priorities:</p>
<ul>
<li>Users &amp; groups</li>
<li>Servers / pool connections</li>
<li>ACLs / RBAC</li>
<li>Backup job health checks</li>
</ul>
<p dir="auto">How it works under the hood: it talks to XO over the network — the REST API where writes are supported, and XO's JSON-RPC websocket via xo-lib (the same client xo-cli uses) for backup jobs/schedules, since the REST API doesn't expose those writes yet. No state file is kept: the running XO is always the source of truth. It runs anywhere Node.js ≥ 20 does — Linux, macOS, Windows — and works against any current XO from sources or XOA.</p>
<p dir="auto">Install is a one-liner from GitHub (details + full docs in the README):</p>
<p dir="auto">npm install -g <a href="https://github.com/acebmxer/xo-apply/archive/refs/heads/main.tar.gz" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/acebmxer/xo-apply/archive/refs/heads/main.tar.gz</a><br />
What I'm looking for: feedback from this community — is this something people want? And if anyone's willing to test what's there today against their own XO, I'd love to hear how it goes. diff and export are read-only and safe to try; apply shows you the full plan and asks for confirmation before it changes anything (and refuses to run unattended without --yes). One heads-up for testers rebuilding onto a fresh XO: connect your pool(s) and set any remote-secret env vars first — the README covers both.</p>
<p dir="auto">It's an independent community project, AGPL-3.0 (the same license as XO itself), and not affiliated with or endorsed by Vates. It stands on Vates' own xo-lib and xo-remote-parser libraries.</p>
<p dir="auto">Repo: <a href="https://github.com/acebmxer/xo-apply" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/acebmxer/xo-apply</a></p>
<p dir="auto">Note: this project was built with Claude Code from the ground up.</p>
]]></description><link>https://xcp-ng.org/forum/topic/12342/xo-apply-configuration-as-code-for-xen-orchestra-looking-for-feedback-testers</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 16:51:24 GMT</lastBuildDate><atom:link href="https://xcp-ng.org/forum/topic/12342.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Jul 2026 14:06:35 GMT</pubDate><ttl>60</ttl></channel></rss>