A simple but powerful orchestrator, designed to be easy to use and API-first.
  • Go 85%
  • Shell 14.9%
Find a file
GnomeZworc 17e4795096
All checks were successful
Documentation / publish (push) Successful in 38s
tesT
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2026-09-09 23:49:02 +02:00
.forgejo/workflows tesT 2026-09-09 23:49:02 +02:00
api f-33: net: add multi net in dispatch et vms #33 2026-08-25 22:48:13 +02:00
cmd f-46: dhcp: add the dhcp binary, its unit and its wrapper #46 2026-09-05 23:17:59 +02:00
conf/agent f-46: dhcp: add the dhcp binary, its unit and its wrapper #46 2026-09-05 23:17:59 +02:00
docs tesT 2026-09-09 23:49:02 +02:00
internal f-46: dhcpapi: always send served on the wire #46 2026-09-09 22:38:14 +02:00
pkg f-46: dhcpbackend: drive dnsmasq or the built-in server through one interface #46 2026-09-08 21:49:33 +02:00
release_notes f-46: doc: document the dhcp backend and its switch procedure #46 2026-09-09 22:38:27 +02:00
scripts f-46: dhcp: add the dhcp binary, its unit and its wrapper #46 2026-09-05 23:17:59 +02:00
systemd f-46: dhcp: add the dhcp binary, its unit and its wrapper #46 2026-09-05 23:17:59 +02:00
.gitignore ci: build and publish the documentation to the pages branch 2026-09-09 22:54:23 +02:00
go.mod f-46: dhcpd: build dhcp replies over insomniacslk/dhcp #46 2026-09-05 23:17:58 +02:00
go.sum f-46: dhcpd: build dhcp replies over insomniacslk/dhcp #46 2026-09-05 23:17:58 +02:00
LICENSE update license 2026-04-21 23:19:36 +02:00
README.md f-46: doc: document the dhcp backend and its switch procedure #46 2026-09-09 22:38:27 +02:00

syonad/two

Orchestrateur réseau et machines virtuelles mono-nœud, pensé pour être piloté par un logiciel plutôt que par un humain.

Il expose une API HTTP qui crée des VPC — isolés par network namespace —, des subnets — en VXLAN ou attachés à un bridge existant — et des VM QEMU/KVM raccordées à ces subnets, avec DHCP, routage et metadata cloud-init fournis automatiquement.

Installation

curl -O https://git.g3e.fr/syonad/two/raw/branch/main/scripts/deploy.sh
bash ./deploy.sh -t 0.1.0 -i

deploy.sh se met à jour lui-même depuis la branche, télécharge binaires, units systemd et scripts depuis la release, et les vérifie contre le manifeste SHA256SUMS. Le drapeau -i prépare l'host : paquets, module br_netfilter, sysctl, et bridges.

Options utiles :

Option Effet
-t <tag> déployer une release donnée
-b <branche> déployer depuis une branche au lieu d'une release
-i préparer l'host (paquets, noyau, réseau)
-u <iface> interface physique d'uplink, eno1 par défaut
-B <bridge> bridge principal auquel l'uplink est rattaché
-d dry-run : affiche les commandes sans les exécuter
-V désactiver la vérification des sommes de contrôle

Un déploiement relève les instances dnsmasq@, dhcp@ et metadata@ actives avant l'arrêt des services, et les redémarre ensuite — c'est la seule façon de savoir lesquelles relancer.

Configuration

Un seul fichier, /etc/two/agent.yml, partagé par les trois binaires. Voir conf/agent/config.exemple.yml pour l'ensemble des options : chemins de la base et des sockets QEMU, pool de workers, correspondance des types d'interface vers les bridges physiques, watchdog, API d'administration, journalisation.

Prise en main

# Un VPC, avec son CIDR interne
curl -X POST http://127.0.0.1:8080/vpcs \
  -d '{"name": "vp-admin", "cidr": "192.168.0.0/16"}'

# Un subnet en VXLAN dans ce VPC
curl -X POST http://127.0.0.1:8080/subnets \
  -d '{"name": "sn-000001", "vpc": "vp-admin", "mode": "vxlan", "vxlan_id": 1,
       "iface_type": "vms", "interface_ip": "10.1.1.1", "cidr": "10.1.0.0/23"}'

# Une VM, avec une clé SSH et un user-data cloud-init en base64
curl -X POST http://127.0.0.1:8080/vms \
  -d '{"name": "i-web", "memory": 2048, "cpus": 2,
       "metadata": {"sshkey": "ssh-ed25519 AAAA…",
                    "user_data": "'"$(base64 -w0 < user-data.yml)"'"},
       "interfaces": [{"subnet": "sn-000001", "ip": "10.1.1.2", "primary": true}],
       "storage": [{"path": "/data/disks/vms/i-web.qcow2", "dev": "vda"}]}'

Les créations sont asynchrones : l'API répond 202 et l'état de la ressource passe de creating à running en base. GET /vms/i-web renvoie l'état courant.

Une VM peut porter plusieurs interfaces, dans un même VPC ; exactement une doit être marquée primary — elle porte la route par défaut et le serveur de metadata.

La spécification complète est dans api/agent.yaml.

Composants

Binaire Rôle
agent processus principal : API, dispatcher, exécution, watchdog
metadata serveur de metadata cloud-init, une instance par VM dans le netns du VPC
db inspection de la base clé-valeur en ligne de commande

L'agent prend -config, les deux autres -conf.

Versions

Les notes de version sont dans release_notes/. Chaque version porte un nom de code, dérivé du rang de sa publication : anges et démons alternés, listés dans release_notes/codenames.md.