Panneau de configuration système moderne pour Pop!_OS et Linux
Style HarmonyOS · Architecture Modulaire · Rust + Vue.js 3
Architecture • Installation • Ajouter un module • Modules • Développement
Vertebr réinvente le panneau de configuration Linux en combinant :
- ✨ Une interface moderne inspirée de HarmonyOS (glassmorphism, animations fluides)
- 🏗️ Une architecture robuste inspirée de Spring Boot (7 couches, modularité maximale)
- 🔒 Une sécurité granulaire avec CAPABILITIES Linux et séparation des privilèges
- 🚀 Des performances exceptionnelles grâce à Rust et au socket UNIX
"Vertebr constitue la structure centrale qui relie l'interface utilisateur aux composants profonds du système Linux."
Vertebr
├── daemon/ # Backend Rust (daemon système root)
│ └── src/
│ ├── main.rs # Point d'entrée
│ ├── server/ # Serveur UNIX Socket (Tokio async)
│ ├── router/ # Routeur central (HashMap + libloading)
│ ├── loader/ # Chargeur de modules .so
│ └── permissions/ # Gestion user/sudo/caps
│
├── modules/ # Modules dynamiques (.so) — Architecture Spring Boot
│ ├── wifi_module/ # Wi-Fi (nmcli)
│ ├── bluetooth_module/ # Bluetooth (bluetoothctl)
│ ├── audio_module/ # Audio (pactl)
│ ├── display_module/ # Affichage (xrandr)
│ ├── power_module/ # Alimentation (upower, systemctl)
│ ├── theme_module/ # Thème GNOME (gsettings)
│ └── caps_module/ # CAPABILITIES Linux (setcap/getcap)
│
├── config/
│ └── routes.toml # Configuration centrale des routes
│
├── systemd/
│ └── vertebr.service # Unit file systemd
│
└── frontend/ # Interface Vue.js 3 + Electron
└── src/
├── views/ # Pages (Wi-Fi, Bluetooth, Audio...)
├── stores/ # État global (Pinia)
├── services/ # Communication daemon
├── components/ # Composants UI HarmonyOS
└── assets/ # CSS système de design
module/
├── lib.rs # Point d'entrée + exports C
├── controller.rs # Gestion des requêtes (parsing JSON)
├── service.rs # Logique métier
├── repository.rs # Accès système (nmcli, bluetoothctl...)
├── mapper.rs # Conversion Entity ↔ DTO
├── entity.rs # Modèle interne
├── dto.rs # Modèle API
└── config.rs # Configuration
[Utilisateur] → [Vue.js] → [Service] → [Socket UNIX]
↓
[Daemon Rust] → [Routeur] → [Permission Check]
↓
[Module .so] → [Controller] → [Service] → [Repository]
↓
[Commande Linux] → [nmcli/bluetoothctl/pactl]
↓
[Matériel] → [Réponse JSON] → [Mise à jour UI]
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Node.js et npm
sudo apt install nodejs npm
# Dépendances système
sudo apt install \
build-essential \
libssl-dev \
pkg-config \
libdbus-1-dev \
network-manager \
bluetooth \
bluez \
pulseaudio-utils \
xrandr \
upower# 1. Cloner le dépôt
git clone https://github.com/dev-houssam/vertebr
cd vertebr
# 2. Lancer l'installation automatique
sudo ./install.sh
# 3. Démarrer Vertebr
vertebr# Compiler le daemon
cd daemon
cargo build --release
sudo cp target/release/vertebr-daemon /usr/bin/
# Installer le service systemd
sudo cp systemd/vertebr.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable vertebr
sudo systemctl start vertebr
# Compiler le frontend
cd ../frontend
npm install
npm run build
# Lancer l'application
npm run electron:start# Lancer le générateur interactif
./scripts/generate_module.sh
# Suivre les instructions
? Nom du module: printer
? Description: Gestion des imprimantes
? Permission: user
? Routes: list, add, remove, set_default
# Résultat : printer_module.zip (backend + frontend)-
Créer la structure du module
mkdir -p modules/mon_module/src
-
Implémenter les 7 couches (voir template dans
docs/template/) -
Compiler le module
cd modules/mon_module cargo build --release sudo cp target/release/libmon_module.so /usr/lib/vertebr/modules/ -
Ajouter les routes dans
/etc/vertebr/routes.toml[[route]] path = "mon:action" module = "libmon_module.so" handler = "ma_fonction" permission = "user"
-
Redémarrer le daemon
sudo systemctl restart vertebr
[[route]]
path = "wifi:list" # Identifiant unique
module = "wifi_module.so" # Fichier .so
handler = "list_handler" # Fonction C exportée
permission = "user" # user | sudo | caps
required_caps = ["CAP_NET_ADMIN"] # Optionnel (uniquement pour caps)| Module | Routes | Commandes système | Permission |
|---|---|---|---|
| wifi_module | wifi:list, wifi:connect, wifi:disconnect, wifi:status, wifi:enabled, wifi:airplane, wifi:forget |
nmcli |
user |
| bluetooth_module | bluetooth:status, bluetooth:list, bluetooth:power, bluetooth:connect, bluetooth:pair, bluetooth:remove |
bluetoothctl |
user |
| audio_module | audio:sinks, audio:sources, audio:volume, audio:mute, audio:default |
pactl |
user |
| display_module | display:list, display:mode, display:resolution, display:rotation, display:brightness |
xrandr |
user |
| power_module | power:status, power:profile, power:reboot, power:shutdown, power:suspend, power:hibernate |
systemctl, upower |
sudo |
| theme_module | theme:get, theme:set, theme:list, theme:accent |
gsettings, dconf |
user |
| caps_module | caps:list, caps:get, caps:grant, caps:revoke |
setcap, getcap |
caps |
# Backend
cd daemon
cargo build --release
# Frontend
cd ../frontend
npm install
npm run build# Vérifier les logs du daemon
sudo journalctl -u vertebr -f
# Tester via le socket UNIX
echo '{"route":"wifi:list","payload":{}}' | nc -U /tmp/vertebr.sock | jq .# Activer les logs détaillés
sudo sed -i 's/log_level = "info"/log_level = "debug"/' /etc/vertebr/config.toml
sudo systemctl restart vertebr
# Vérifier les modules chargés
sudo journalctl -u vertebr | grep "routes chargées"# Tests unitaires backend
cd daemon
cargo test
# Tests frontend
cd frontend
npm run test:unit
# Tests d'intégration
npm run test:e2e| Niveau | Description | Exemples |
|---|---|---|
| user | Tout utilisateur connecté | Wi-Fi scan, lecture thème |
| sudo | Processus root ou membre sudo | Redémarrage, reset réseau |
| caps | CAPABILITIES spécifiques | Configuration réseau avancée |
# Visualiser les CAPABILITIES d'un binaire
vertebr caps:list --binary /usr/bin/ping
# Ajouter CAP_NET_ADMIN
vertebr caps:grant --binary /usr/bin/my_tool --caps CAP_NET_ADMIN- Socket UNIX
/tmp/vertebr.sock(permissions 0660) - Groupe dédié
vertebr-users - Vérification UID via
SO_PEERCRED - Isolation des modules (crash d'un module n'affecte pas le daemon)
| Documentation | Description |
|---|---|
| Architecture | Architecture technique détaillée |
| API Reference | Documentation de l'API JSON |
| Modules Guide | Création de modules pas à pas |
| Security | Modèle de sécurité et CAPABILITIES |
| Contributing | Comment contribuer au projet |
Les contributions sont les bienvenues !
- Fork le projet
- Créez votre branche (
git checkout -b feature/amazing-feature) - Commitez vos changements (
git commit -m 'Add amazing feature') - Poussez (
git push origin feature/amazing-feature) - Ouvrez une Pull Request
- Suivez le style de code Rust (
rustfmt) et Vue.js (Prettier) - Ajoutez des tests pour les nouvelles fonctionnalités
- Mettez à jour la documentation
- Respectez le code de conduite
- Architecture Rust + Vue.js complète
- 7 modules fonctionnels (Wi-Fi, Bluetooth, Audio, Display, Power, Theme, CAPABILITIES)
- Thème HarmonyOS dynamique
- Générateur de modules interactif
- Module imprimantes (CUPS)
- Module scanners (SANE)
- Dashboard temps réel
- Profils de configuration
- Support Wayland complet
- Store de modules
- Application mobile companion
- Interface tactile
- Support multi-distribution (Ubuntu, Debian, Fedora)
Vertebr est distribué sous licence MIT.
MIT License
Copyright (c) 2026 Houssam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
- Houssam BACAR - Architecte principal - GitHub
- System76 pour Pop!_OS et l'inspiration
- Rust Community pour l'écosystème Rust
- Vue.js Team pour le framework Vue.js
- Electron Team pour Electron
⭐ Starrezzz le projet si vous l'aimez ! ⭐
