Salut à tous ! Il y a bien longtemps, je vous avais présenté XCP-ng et Xen Orchestra, les concurrents plus ou moins directs de ESXi et vSphere à l’époque… Depuis plus de 3 ans maintenant, les choses ont bien changé avec une politique très agressive de licensing chez Broadcom, le propriétaire de VMware, et Vates, l’éditeur Français de Xen Orchestra, a le vent en poupe (notamment grâce à ce contexte favorable pour eux). L’heure est venue pour moi (et pour vous, j’espère !) de faire le point.
Vates a grandi depuis 2022, année où je m’étais intéressé à cette jeune pousse française. Je ne vais pas vous refaire son histoire complète, d’autant que j’ai eu l’occasion et le plaisir d’échanger avec Olivier Lambert, son CEO, il y a quelques mois (voir ici). Désormais, Vates est une société très cosmopolite de plus de 130 personnes, qui a beaucoup travaillé sur ses produits bien sûr, mais aussi à étoffer son réseau de partenaires (on voit désormais arriver, notamment dans la santé, des intégrateurs comme Computacenter et Axians) et à progresser dans le monde du cloud européen, avec Cloud Temple par exemple (leurs premiers clients étaient plutôt de l’autre côté de l’Atlantique).
En ce qui concerne leurs produits, on retrouve toujours le socle XCP-ng/Xen Orchestra, mais aussi désormais des partenaires de croissance, avec mes chouchous de chez EasyVirt, ou encore HPE avec son offre Morpheus/VM Essentials, et même des nouveaux entrants qui poussent fort dans la communauté open source avec PegaProx et ProxCenter.
Ce n’est donc pas de tout repos que d’essayer de tester et de creuser cet écosystème en devenir. Malgré tout, pour les abonnés récents de vBlog, c’était le bon moment pour moi de vous re-présenter plus simplement XOA et XCP-ng, alors que les deux solutions deviennent de plus en plus matures.
Histoire de faire de la tech tout en parlant de Vates et de Stratégie (on ne se refait pas), je vais utiliser une approche un peu différente aujourd’hui, en vous présentant Xen Orchestra, XOA pour les intimes, construit directement depuis les sources GitHub, ainsi que la doc assez bien faite et fournie directement par Vates.
Sachez, je le rappelle mais ça va mieux en le disant, qu’il existe une méthode beaucoup plus rapide et directe pour déployer Xen Orchestra, mais je vous laisse la découvrir ici (une fois votre premier XCP-ng déployé).
La base : installer sur Linux Debian Trixie (13)
Xen Orchestra est avant tout basé sur une Linux Debian standard, même si elle peut être déployée sur d’autres distributions bien sûr car basée avant tout sur des outils comme NodeJS, Redis et Yarn un gestionnaire de packages javascript concurrent de npm je crois. Bref, on se lance et on installe Xen Orchestra !
Désinstaller nodejs si déjà présent (je me suis fait avoir)
Première chose qui vous évitera des ennuis si ensuite vous voulez préparer une script de lancement systemed par exemple … et constater après une vingtaines de tentatives infructueuses que j’avais une vieille version 20.10 de nodeJS déjà installé de base sur ma distro Trixie … RTFM comme toujours (car Vates le mentionne).
Installation de Homebrew
Brew, j’espère que vous connaissez, et si ce n’est pas le cas, ruez-vous vers ce gestionnaire d’installations multiplateforme assez génial (surtout pour les Mac Users). L’installation est triviale sous Linux, donc je vous laisse faire 🙂
Installation simplisme de NodeJS à partir d’une Trixie fraîchement installée avec brew
|
1 |
brew install node@24 |
Installation de Yarn, disponible directement via le site officiel
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
cidou@xoa:~ sudo curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /etc/apt/keyrings/yarn-archive-keyring.gpg > /dev/null cidou@xoa:~ sudo echo "deb [signed-by=/etc/apt/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list deb [signed-by=/etc/apt/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main cidou@xoa:~ sudo apt update Get:1 https://dl.yarnpkg.com/debian stable InRelease Hit:2 http://deb.debian.org/debian trixie InRelease Hit:3 http://security.debian.org/debian-security trixie-security InRelease Hit:4 http://deb.debian.org/debian trixie-updates InRelease Get:5 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB] Get:6 https://download.docker.com/linux/debian trixie InRelease [32.5 kB] Get:7 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB] Fetched 70.9 kB in 0s (169 kB/s) 6 packages can be upgraded. Run 'apt list --upgradable' to see them. cidou@sandbox:~ sudo apt install yarn The following packages were automatically installed and are no longer required: libslirp0 slirp4netns Use 'sudo apt autoremove' to remove them. Installing: yarn Installing dependencies: libcares2 libnode115 node-balanced-match node-cjs-module-lexer node-minimatch node-xtend nodejs-doc libicu76 node-acorn node-brace-expansion node-corepack node-undici nodejs Suggested packages: npm Summary: Upgrading: 0, Installing: 14, Removing: 0, Not Upgrading: 6 Download size: 30.6 MB Space needed: 129 MB / 50.4 GB available Continue? [Y/n] y Get:1 http://deb.debian.org/debian trixie/main amd64 libcares2 amd64 1.34.5-1+deb13u1 [98.3 kB] Get:2 http://deb.debian.org/debian trixie/main amd64 libicu76 amd64 76.1-4 [9722 kB] (...) Setting up yarn (1.22.22-1) ... Setting up node-xtend (4.0.2-3) ... Setting up node-acorn (8.8.1+ds+~cs25.17.7-2) ... Setting up node-corepack (0.24.0-5) ... Setting up libnode115:amd64 (20.19.2+dfsg-1+deb13u2) ... Setting up nodejs (20.19.2+dfsg-1+deb13u2) ... update-alternatives: using /usr/bin/nodejs to provide /usr/bin/js (js) in auto mode Processing triggers for man-db (2.13.1-1) ... Processing triggers for libc-bin (2.41-12+deb13u4) ... |
Installation de Redis (depuis le site officiel)
|
1 2 3 4 5 6 |
sudo apt-get install lsb-release curl gpg curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list sudo apt-get update sudo apt-get install redis |
Build et premier run de Vates Xen Orchestra !
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
cidou@xoa:~ cd xen-orchestra/ cidou@xoa:~/xen-orchestra yarn yarn install v1.22.22 (node:5492) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities. (Use `node --trace-deprecation ...` to show where the warning was created) [1/5] Validating package.json... [2/5] Resolving packages... [3/5] Fetching packages... warning bare-fs@4.7.2: The engine "bare" appears to be invalid. warning bare-os@3.9.1: The engine "bare" appears to be invalid. [4/5] Linking dependencies... warning "@commitlint/cli > @commitlint/load > cosmiconfig-typescript-loader@6.3.0" has unmet peer dependency "@types/node@*". warning "@commitlint/cli > @commitlint/load > cosmiconfig-typescript-loader@6.3.0" has unmet peer dependency "typescript@>=5". warning "@typescript-eslint/eslint-plugin > ts-api-utils@1.4.3" has unmet peer dependency "typescript@>=4.2.0". warning " > pinia@3.0.4" has unmet peer dependency "vue@^3.5.11". warning " > vue-router@5.0.6" has unmet peer dependency "vue@^3.5.0". warning " > @xen-orchestra/web-core@0.60.0" has unmet peer dependency "vue@~3.5.13". warning " > @xen-orchestra/web-core@0.60.0" has unmet peer dependency "vue-i18n@^11.1.2". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @xen-orchestra/rest-api > inversify@6.2.2" has unmet peer dependency "reflect-metadata@~0.2.2". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @xen-orchestra/rest-api > swagger-ui-express@5.0.1" has unmet peer dependency "express@>=4.0.0 || >=5.0.0-beta". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @xen-orchestra/web > @vue/test-utils@2.4.11" has unmet peer dependency "@vue/compiler-dom@3.x". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > xo-server > typed-flash@1.0.1" has unmet peer dependency "@types/express@*". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @vates/event-listeners-manager > tap > @tapjs/test > @isaacs/ts-node-temp-fork-for-pr-2009@10.9.7" has unmet peer dependency "@types/node@*". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @xen-orchestra/rest-api > inversify > @inversifyjs/core > @inversifyjs/reflect-metadata-utils@0.2.4" has unmet peer dependency "reflect-metadata@0.2.2". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @vates/event-listeners-manager > tap > @tapjs/asserts > tcompare > react-element-to-jsx-string@15.0.0" has unmet peer dependency "react@^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0". warning "workspace-aggregator-8a7a6f41-8553-496e-b122-fbfb50bae5a8 > @vates/event-listeners-manager > tap > @tapjs/asserts > tcompare > react-element-to-jsx-string@15.0.0" has unmet peer dependency "react-dom@^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0". warning Workspaces can only be enabled in private projects. [5/5] Building fresh packages... $ husky install husky - Git hooks installed Done in 73.87s. cidou@xoa:~/xen-orchestra |
… ensuite on compile et déploie Xen Orchestra :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
cidou@xoa:~/xen-orchestra yarn build yarn run v1.22.22 $ TURBO_TELEMETRY_DISABLED=1 turbo run build --filter xo-server --filter xo-server-'*' --filter xo-web --filter @xen-orchestra/web --filter @xen-orchestra/backup-archive && yarn build:doc • turbo 2.9.17 • Packages in scope: @xen-orchestra/backup-archive, @xen-orchestra/web, xo-server, xo-server-audit, xo-server-auth-github, xo-server-auth-google, xo-server-auth-ldap, xo-server-auth-oidc, xo-server-auth-saml, xo-server-backup-reports, xo-server-ipmi-sensors, xo-server-load-balancer, xo-server-netbox, xo-server-openmetrics, xo-server-perf-alert, xo-server-sdn-controller, xo-server-test-plugin, xo-server-transport-email, xo-server-transport-icinga2, xo-server-transport-nagios, xo-server-transport-slack, xo-server-transport-xmpp, xo-server-usage-report, xo-server-web-hooks, xo-web • Running build in 25 packages • Remote caching disabled Tasks: 36 successful, 36 total Cached: 0 cached, 36 total Time: 1m31.953s $ yarn --cwd docs install && yarn --cwd docs build:xo-server [1/5] Validating package.json... [2/5] Resolving packages... (node:7796) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities. (Use `node --trace-deprecation ...` to show where the warning was created) [3/5] Fetching packages... [4/5] Linking dependencies... warning "@docusaurus/core > react-loadable-ssr-addon-v5-slorber@1.0.3" has unmet peer dependency "react-loadable@*". warning " > @mdx-js/react@3.1.1" has unmet peer dependency "@types/react@>=16". warning "@docusaurus/preset-classic > @docusaurus/theme-search-algolia > @algolia/autocomplete-core > @algolia/autocomplete-plugin-algolia-insights@1.19.8" has unmet peer dependency "search-insights@>= 1 < 3". warning "@docusaurus/preset-classic > @docusaurus/theme-search-algolia > @algolia/autocomplete-core > @algolia/autocomplete-shared@1.19.8" has unmet peer dependency "@algolia/client-search@>= 4.9.1 < 6". warning "@docusaurus/preset-classic > @docusaurus/theme-search-algolia > @docsearch/react > @algolia/autocomplete-core > @algolia/autocomplete-plugin-algolia-insights@1.19.2" has unmet peer dependency "search-insights@>= 1 < 3". warning "@docusaurus/preset-classic > @docusaurus/theme-search-algolia > @docsearch/react > @algolia/autocomplete-core > @algolia/autocomplete-shared@1.19.2" has unmet peer dependency "@algolia/client-search@>= 4.9.1 < 6". warning " > docusaurus-theme-search-typesense@0.26.0" has incorrect peer dependency "@docusaurus/core@~3.8.0". warning " > docusaurus-theme-search-typesense@0.26.0" has unmet peer dependency "@docusaurus/theme-common@~3.8.0". warning "docusaurus-theme-search-typesense > algoliasearch-helper@3.29.2" has unmet peer dependency "algoliasearch@>= 3.1 < 6". warning "docusaurus-theme-search-typesense > typesense-instantsearch-adapter@2.9.0" has unmet peer dependency "@babel/runtime@^7.24.1". warning "docusaurus-theme-search-typesense > typesense-docsearch-react > @algolia/autocomplete-preset-algolia@1.8.2" has unmet peer dependency "@algolia/client-search@>= 4.9.1 < 6". warning "docusaurus-theme-search-typesense > typesense-docsearch-react > @algolia/autocomplete-preset-algolia@1.8.2" has unmet peer dependency "algoliasearch@>= 4.9.1 < 6". warning "docusaurus-theme-search-typesense > typesense-docsearch-react > typesense@1.8.2" has unmet peer dependency "@babel/runtime@^7.23.2". warning "docusaurus-theme-search-typesense > typesense-instantsearch-adapter > typesense@2.1.0" has unmet peer dependency "@babel/runtime@^7.23.2". [5/5] Building fresh packages... $ docusaurus build --config docusaurus.embed.config.ts --out-dir build-embed [INFO] [en] Creating an optimized production build... ✔ Client Compiled successfully in 23.55s ✔ Server Compiled successfully in 14.80s docusaurus-lunr-search:: Building search docs and lunr index file docusaurus-lunr-search:: Start scanning documents in 4 threads docusaurus-lunr-search:: Indexing time: 1.082s docusaurus-lunr-search:: indexed 61 documents out of 73 docusaurus-lunr-search:: writing search-doc.json docusaurus-lunr-search:: writing search-doc-1789975057777.json docusaurus-lunr-search:: writing lunr-index.json docusaurus-lunr-search:: writing lunr-index-1789975057777.json docusaurus-lunr-search:: End of process [SUCCESS] Generated static files in "build-embed". [INFO] Use `npm run serve` command to test your build locally. Done in 146.06s. |
… enfin, quelques paramètres dans le fichier de config …
… et zoo ! Lancement de Xen Orchestra :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cidou@xoa:~/xen-orchestra/packages/xo-server yarn start yarn run v1.22.22 (node:8177) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities. (Use `node --trace-deprecation ...` to show where the warning was created) $ node dist/cli.mjs 2026-09-21T07:29:13.555Z xo:xo-mixins:pool INFO rolling pool reboot of pool pool-1: trace in /tmp/xo-rpr-test-BxLj6b/rpr-pool-1-20260921T072913554Z.ndjson (...) 2026-09-21T07:29:14.215Z xo:main INFO Setting up /robots.txt → /home/cidou/xen-orchestra/packages/xo-server/robots.txt 2026-09-21T07:29:14.294Z xo:plugin INFO register audit 2026-09-21T07:29:14.296Z xo:plugin INFO register auth-github 2026-09-21T07:29:14.296Z xo:plugin INFO register auth-google (...) 2026-09-21T07:29:15.073Z xo:main INFO Setting up /docs → /home/cidou/xen-orchestra/docs/build-embed 2026-09-21T07:29:15.073Z xo:main INFO Setting up / → /home/cidou/xen-orchestra/@xen-orchestra/web/dist |
C’est terminé, la première instance Xen Orchestra se lance directement en XOA6 (avec XOA5 en dessous, car tout n’est pas encore porté sur XOA 6 actuellement) :
Le moins que l’on puisse dire c’est que ça a bien changé, ne serait-ce qu’au niveau de l’ergonomie, beaucoup plus professionnelle, de mon point de vue et plus proche de XO-Lite la version embarqué de XO sur chaque serveur XCP-ng qu’on découvrait en tech preview en 2023 et qui annonçait une refonte complète de l’interface. Aujourd’hui tout n’est pas porté encore mais on voit que Vates a vraiment réfléchi, moins en terme de tech qu’en terme d’ergonomie actuelle (comme c’était le cas avec XOA5, avec certaines logiques un peu « bizarres » ou en tout cas, difficiles à intégrer au départ).


On retrouve toujours XO5 derrière évidemment, étant donné que XO6 est loin d’être terminé. On est souvent redirigé sur l’ancienne interface dès qu’il faut intervenir sur la configuration de XOA. De même, comme on est sur une build from Sources, pas de Hub ni de proxys. Xen Orchestra est fourni « nu » sans accessoire, mais totalement fonctionnel malgré tout. Pour un lab c’est parfait.


Une des spécificités et des forces de XCP-ng, outre sa stabilité et sa sécurité grâce à son hyperviseur Xen (issu du Xen Project), c’est aussi son jeu d’API rétrocompatible avec les produits de Citrix, qui en ont constitué les fondations (Citrix Hypervisor, anciennement XenServer). De facto, quasiment tout peut être géré directement en CLI via les API Xen, et les serveurs XCP-ng sont quasi autonomes, notamment en ce qui concerne les pools, les SR (Storage Repositories) et les réseaux de pool. Si Xen Orchestra n’est pas présent ou a planté, et si vous êtes un kador de la CLI, vous pouvez quasiment tout gérer depuis un prompt SSH !
Ce n’est pas le cas de nos ESXi chez VMware… C’est une philosophie assez différente, que je trouve vraiment appréciable (assez proche de Proxmox aussi, finalement).
La console de chaque hyperviseur est fournie avec un menu d’administration qui permet beaucoup de choses, notamment connecter un SR (NFS ou iSCSI, par exemple) ou intégrer un pool de ressources pour mettre en commun et utiliser les ressources déjà provisionnées sur d’autres hôtes XCP-ng. Bref, toute une série d’outils utiles…
Enfin, Vates propose désormais directement (depuis la conclusion d’un partenariat stratégique il y a quelques mois) l’installation de DCscope et DCnetscope, compléments parfaits pour la gestion du FinOps, du capacity planning et de l’empreinte carbone, ainsi que pour le suivi des flux réseau au sein de vos clusters de virtualisation.

En quelques années, Vates est passée du statut de startup prometteuse à celui d’alternative crédible et mature face à VMware, portée à la fois par la qualité de ses produits et par un contexte de marché qui lui est très favorable. Avec XCP-ng et Xen Orchestra, on dispose d’un socle ouvert, robuste et entièrement pilotable en CLI, désormais enrichi par des partenaires qui couvre des besoins bien au-delà de la simple virtualisation.
Reste à voir comment cet écosystème va se structurer dans les mois à venir, mais une chose est sûre : le paysage de la virtualisation n’a jamais été aussi ouvert, et c’est plutôt une bonne nouvelle pour nous tous, en particulier en Europe car on en a clairement besoin !
Références :
– Les sources de Xen Orchestra : https://github.com/vatesfr/xen-orchestra
– Installing XO from sources : https://docs.xen-orchestra.com/getting-started/install-from-sources
– L’entretien d’Olivier Lambert, CEO de Vates : https://vblog.io/interview-dolivier-lambert-ceo-de-vates/
– Yarn : https://yarnpkg.com/getting-started
