Solution open source de gestion de parc informatique et de déploiement logiciel.
- Architecture
- Prérequis
- Installation du serveur
- Lancer le serveur en tant que service (Linux / systemd)
- Build de la console web
- Variables d'environnement
- Premier démarrage
- Installation de l'agent Windows (script automatique)
- Installation de l'agent Windows (manuel)
- Configuration de l'agent
- Gestion des groupes
- Déploiement d'une application
- Rôles utilisateurs
- Sécurité en production
┌─────────────────────────────────────────┐
│ Serveur AppliDeploy │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ Backend │ │ Console Web │ │
│ │ Node.js / │ │ React + Vite │ │
│ │ Express │ │ (servi en │ │
│ │ (port 3000) │ │ statique) │ │
│ └──────────────┘ └─────────────────┘ │
│ ▲ API REST + JWT │
└─────────┼───────────────────────────────┘
│ HTTP(S) X-Agent-Secret
┌─────────┴───────────────────────────────┐
│ Postes clients Windows 10/11 │
│ AppliDeployAgent (service Python) │
└─────────────────────────────────────────┘
- Backend : Node.js / Express — API REST, authentification JWT, stockage JSON
- Console web : React 19 + Vite + Tailwind CSS 4, servie en statique par le backend
- Agent : service Windows Python, interroge le serveur toutes les N secondes
| Composant | Version minimale |
|---|---|
| Node.js | 20.x LTS |
| npm | 9 |
| OS | Linux, macOS ou Windows Server |
Remarque : Aucune base de données externe n'est requise. Les données sont stockées dans
data.jsonà la racine du projet.
| Composant | Version minimale |
|---|---|
| Windows | 10 / 11 (64 bit) |
| Python | 3.10 |
| pip | 22 |
git clone https://github.com/Doud-FR/console-ready.git
cd console-readynpm installcd console
npm install
npm run build # génère les fichiers statiques dans ../public/
cd ..Copier le fichier d'exemple et renseigner les valeurs :
cp .env.example .envÉditer .env à la racine du projet :
# Obligatoire en production
JWT_SECRET=<chaine-aleatoire-longue>
AGENT_SECRET=<chaine-aleatoire-longue>
# Optionnel
PORT=3000
ADMIN_PASSWORD=<mot-de-passe-initial-admin>✅ Le fichier
.envest chargé automatiquement au démarrage du serveur.
⚠️ SansJWT_SECRETniAGENT_SECRET, le serveur démarre avec des valeurs par défaut non sécurisées et affiche un avertissement. Ne pas utiliser les valeurs par défaut en production.
npm startLe serveur écoute sur http://0.0.0.0:3000 (ou sur le port défini par PORT).
Pour que le serveur démarre automatiquement au boot et redémarre en cas d'erreur, utilisez le fichier de service systemd fourni (applideploy.service).
sudo useradd --system --no-create-home --shell /usr/sbin/nologin applideploy/opt/applideploy sert de répertoire de travail du serveur (stockage de data.json, lecture de .env). L'utilisateur applideploy doit avoir les droits d'écriture sur ce dossier.
sudo mkdir -p /opt/applideploy
sudo cp -r . /opt/applideploy/
sudo chown -R applideploy:applideploy /opt/applideploy
# Restreindre les permissions du fichier .env (contient les secrets)
sudo chmod 600 /opt/applideploy/.envsudo cp /opt/applideploy/applideploy.service /etc/systemd/system/Le fichier
applideploy.servicepointe par défaut vers/opt/applideploy. Si vous utilisez un autre chemin, modifiez les champsWorkingDirectoryetEnvironmentFiledans le fichier.
sudo systemctl daemon-reload
sudo systemctl enable applideploy # démarrage automatique au boot
sudo systemctl start applideploysudo systemctl status applideploysudo systemctl start applideploy # Démarrer
sudo systemctl stop applideploy # Arrêter
sudo systemctl restart applideploy # Redémarrer
sudo journalctl -u applideploy -f # Suivre les journaux en temps réel| Variable | Défaut | Description |
|---|---|---|
PORT |
3000 |
Port d'écoute HTTP |
JWT_SECRET |
(valeur insécurisée par défaut) | Secret de signature des tokens JWT |
AGENT_SECRET |
applideploy-agent-secret |
Clé partagée entre le serveur et les agents |
ADMIN_PASSWORD |
(mot de passe aléatoire au démarrage) | Mot de passe du compte admin créé au premier démarrage |
Au premier lancement, si aucun utilisateur admin n'existe dans data.json, le serveur crée automatiquement le compte administrateur :
- Identifiant :
admin - Mot de passe : affiché dans les logs au démarrage (ou valeur de
ADMIN_PASSWORD)
✅ Compte admin créé.
Identifiants : admin / <mot-de-passe>
⚠️ Notez ce mot de passe, il ne sera plus affiché.
Ouvrir la console web dans un navigateur : http://<adresse-serveur>:3000
Le script PowerShell install-agent.ps1 installe automatiquement l'agent et toutes ses dépendances en une seule commande.
- Windows 10 / 11 (64 bit)
- PowerShell 5.1+ (inclus dans Windows 10/11)
- Session PowerShell en tant qu'administrateur
Copier agent.py et install-agent.ps1 sur le poste client (dans le même dossier), puis ouvrir PowerShell en tant qu'administrateur et exécuter :
Set-ExecutionPolicy Bypass -Scope Process -Force
.\install-agent.ps1 -ServerUrl "http://<adresse-serveur>:3000" -AgentSecret "<valeur-de-AGENT_SECRET>"Le script :
- Vérifie les droits administrateur
- Détecte Python 3.10+ (et propose l'installation via
wingetsi absent) - Installe les dépendances Python (
requests,pywin32,wmi,psutil) - Copie
agent.pydansC:\Program Files\AppliDeployAgent\ - Crée le fichier de configuration dans
%ProgramData%\AppliDeployAgent\agent.conf - Installe et démarre le service Windows AppliDeployAgent (démarrage automatique)
| Paramètre | Obligatoire | Défaut | Description |
|---|---|---|---|
-ServerUrl |
✅ | — | URL du serveur AppliDeploy |
-AgentSecret |
✅ | — | Valeur de AGENT_SECRET côté serveur |
-PollInterval |
❌ | 300 |
Intervalle d'interrogation en secondes |
-InstallDir |
❌ | C:\Program Files\AppliDeployAgent |
Dossier d'installation |
-HostnameOverride |
❌ | (auto) | Forcer un nom de machine spécifique |
.\install-agent.ps1 `
-ServerUrl "https://applideploy.entreprise.fr" `
-AgentSecret "MonSecretTresLong1234" `
-PollInterval 120 `
-HostnameOverride "PC-COMPTA-01"ℹ️ Utilisez cette méthode uniquement si vous ne pouvez pas utiliser le script automatique ci-dessus.
Sur le poste client Windows, installer Python 3.10+ depuis python.org. Cocher « Add Python to PATH » lors de l'installation.
Ouvrir une invite de commande en tant qu'administrateur :
pip install requests pywin32 wmi psutil
wmietpywin32sont nécessaires pour la collecte de l'inventaire matériel/logiciel via WMI. Sur une machine hors-Windows (test/dev), l'agent fonctionne en mode dégradé sans ces modules.
Copier le fichier agent.py sur le poste client, par exemple dans :
C:\Program Files\AppliDeployAgent\agent.py
Créer le dossier de données et le fichier de configuration :
mkdir "$env:ProgramData\AppliDeployAgent"Créer le fichier %ProgramData%\AppliDeployAgent\agent.conf avec le contenu suivant :
{
"server_url": "http://<adresse-serveur>:3000",
"agent_secret": "<valeur-de-AGENT_SECRET>",
"poll_interval": 300,
"hostname_override": null
}Depuis une invite de commande en tant qu'administrateur, dans le dossier contenant agent.py :
python agent.py install
python agent.py startVérifier que le service est actif :
Get-Service AppliDeployAgentpython agent.py start # Démarrer le service
python agent.py stop # Arrêter le service
python agent.py restart # Redémarrer le service
python agent.py remove # Désinstaller le servicePour lancer l'agent en mode console (sans service, utile pour le débogage) :
python agent.pyLes journaux de l'agent sont écrits dans :
%ProgramData%\AppliDeployAgent\agent.log
La rotation automatique est configurée à 5 Mo par fichier, avec 3 fichiers de sauvegarde.
Le fichier %ProgramData%\AppliDeployAgent\agent.conf est un JSON avec les paramètres suivants :
| Paramètre | Défaut | Description |
|---|---|---|
server_url |
http://localhost:3000 |
URL du serveur AppliDeploy |
agent_secret |
applideploy-agent-secret |
Doit correspondre à AGENT_SECRET côté serveur |
poll_interval |
300 |
Intervalle d'interrogation du serveur en secondes |
hostname_override |
null |
Forcer un nom de machine spécifique (null = auto-détection) |
Exemple complet :
{
"server_url": "https://applideploy.entreprise.fr",
"agent_secret": "MonSecretTresLong1234",
"poll_interval": 120,
"hostname_override": null
}Après toute modification du fichier de configuration, redémarrer le service :
python agent.py restartCette section explique comment créer un paquet de déploiement dans la console AppliDeploy et le pousser vers les postes clients. L'exemple complet utilise 7-Zip (installeur .exe en mode silencieux).
Console Web Serveur Agent Windows
│ │ │
│ Créer un paquet │ │
│ ──────────────────>│ │
│ │ Commande en attente │
│ Assigner machines │ ─────────────────────>│
│ ──────────────────>│ │
│ │ Exécution commande │
│ │ <─────────────────────│
│ Résultat (log) │ │
│ <──────────────────│ │
Dans la console web, aller dans Paquets → Nouveau paquet.
Le formulaire de création comporte les champs suivants :
| Champ | Description |
|---|---|
| Nom (obligatoire) | Nom affiché dans la console |
| Version | Version du logiciel |
| Éditeur | Nom de l'éditeur / fabricant |
| Type | Type d'installeur : exe, msi, script, zip, other |
| Description | Description libre du paquet |
| Commande d'installation | Commande exécutée sur les postes pour installer le logiciel |
| Commande de désinstallation | Commande exécutée pour désinstaller le logiciel |
⚠️ Les commandes d'installation et de désinstallation sont exécutées avec les droits du service Windows (SYSTEMpar défaut). L'installeur doit être accessible depuis le poste client (partage réseau, chemin UNC, etc.).
7-Zip est un archiveur open source dont l'installeur .exe accepte le commutateur /S pour une installation silencieuse (sans interface graphique ni confirmation utilisateur).
| Champ | Valeur à saisir |
|---|---|
| Nom | 7-Zip |
| Version | 24.09 (adapter à la version téléchargée) |
| Éditeur | Igor Pavlov |
| Type | exe |
| Description | Archiveur de fichiers open source 7-Zip |
| Commande d'installation | (voir ci-dessous) |
| Commande de désinstallation | (voir ci-dessous) |
Copier l'installeur 7z2409-x64.exe sur un partage réseau accessible depuis tous les postes, puis saisir dans le champ Commande d'installation :
\\serveur\partage\7z2409-x64.exe /S
Le commutateur
/Sest sensible à la casse : il doit être en majuscule. Il déclenche l'installation silencieuse sans aucune fenêtre ni interaction utilisateur.Par défaut, 7-Zip s'installe dans
C:\Program Files\7-Zip\. Pour choisir un dossier d'installation différent, ajouter l'option/Den dernier :\\serveur\partage\7z2409-x64.exe /S /D=C:\Outils\7-Zip
L'installeur de 7-Zip dépose un exécutant de désinstallation dans son répertoire. Saisir dans le champ Commande de désinstallation :
"C:\Program Files\7-Zip\Uninstall.exe" /S
Les guillemets sont nécessaires car le chemin contient des espaces. Le commutateur
/Sactive là aussi le mode silencieux.Si vous avez installé 7-Zip dans un répertoire personnalisé via
/D, adaptez le chemin en conséquence.
Une fois le paquet créé :
- Aller dans Déploiements → Nouveau déploiement (ou cliquer sur le paquet puis Déployer).
- Sélectionner le ou les postes cibles dans la liste des machines enregistrées.
- Choisir l'action Installer ou Désinstaller.
- Valider — le déploiement passe à l'état En attente.
L'agent sur chaque poste récupère la commande lors de sa prochaine vérification (selon poll_interval), l'exécute et remonte le résultat (code de retour, sortie console) dans les journaux de déploiement.
Dans la console web, aller dans Déploiements et consulter le statut de chaque tâche :
| Statut | Signification |
|---|---|
pending |
En attente de récupération par l'agent |
running |
En cours d'exécution sur le poste |
success |
Commande terminée avec le code de retour 0 |
failed |
Commande terminée avec un code de retour non nul |
En cas d'échec, cliquer sur la tâche pour afficher la sortie complète de la commande et identifier l'erreur.
| Rôle | Droits |
|---|---|
admin |
Accès complet : gestion des utilisateurs, des groupes (créer, renommer, supprimer), des paquets, des déploiements et des machines |
tech |
Peut créer des groupes, déplacer des machines entre groupes, modifier des paquets, déclencher des déploiements et des actions sur les machines |
viewer |
Consultation uniquement (inventaire, groupes, déploiements, journaux) |
La gestion des comptes se fait depuis la console web → Paramètres → Utilisateurs.
La fonctionnalité Groupes permet d'organiser les machines en ensembles logiques et d'effectuer des actions en masse.
Dans la console web, cliquer sur Groupes dans la barre de navigation latérale.
| Action | Rôle requis | Description |
|---|---|---|
| Voir les groupes | Tous | Afficher la liste des groupes et leurs machines |
| Créer un groupe | admin, tech |
Ajouter un nouveau groupe |
| Renommer un groupe | admin |
Renommer un groupe existant (cascade sur les machines) |
| Supprimer un groupe | admin |
Supprimer un groupe (les machines sont déplacées vers default) |
| Déplacer une machine | admin, tech |
Changer le groupe d'une machine |
| MàJ groupe | admin, tech |
Déclencher update_windows sur toutes les machines du groupe |
| Redémarrer tout | admin, tech |
Planifier un redémarrage de toutes les machines du groupe |
| Déployer | admin, tech |
Déployer un paquet sur toutes les machines du groupe |
Note : Le groupe
defaultne peut pas être supprimé. Il sert de groupe de secours pour les machines non assignées.
- Définir des secrets forts pour
JWT_SECRETetAGENT_SECRET(32 caractères aléatoires minimum). - Exposer le serveur derrière un reverse-proxy (nginx, Caddy…) avec HTTPS (certificat TLS).
- Restreindre le port 3000 au seul reverse-proxy via le pare-feu.
- Changer le mot de passe
adminpar défaut dès le premier démarrage. - Sur les agents, restreindre les permissions de
agent.confau seul compteSYSTEM:
$path = "$env:ProgramData\AppliDeployAgent\agent.conf"
$acl = Get-Acl $path
$acl.SetAccessRuleProtection($true, $false)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"SYSTEM", "FullControl", "Allow")
$acl.AddAccessRule($rule)
Set-Acl $path $acl