Yunohost_homePage
Page d'accueil YunoHost personnalisée : applications épinglées en haut de page, groupes repliables/réordonnables, applications sans groupe, bouton Administration à côté de Déconnexion, et détection automatique du logo de chaque application (favicon ou logo officiel YunoHost).
Ce dépôt contient le code générique, réutilisable par n'importe qui a
une instance YunoHost — toutes les informations spécifiques à un serveur
(domaine, identifiants SSH, mot de passe) vivent uniquement dans un fichier
.env local, jamais commité. src/config.json (tes apps/groupes) est lui
aussi local et ignoré par git — voir plus bas comment le renseigner.
Structure du projet
src/ sources de la page (index.html, style.css, app.js)
et de l'éditeur visuel (editor.html/css/js)
+ config.json (tes données, ignoré par git — voir ci-dessous)
+ config.example.json (exemple versionné, point de départ)
+ config.demo.json / catalog.demo.json (données de démo,
utilisées par "make demo" — voir ci-dessous)
scripts/ scripts d'outillage (preview, export, sync, déploiement)
output/ généré par "make export" — c'est ce dossier qui est envoyé
sur le serveur YunoHost (ignoré par git)
Makefile regroupe toutes les commandes ci-dessous
.env tes identifiants/domaine (créé par "make config", jamais commité)
Démarrage rapide
make help # liste toutes les commandes
make config # crée .env et src/config.json (depuis les .example) si absents
Édite ensuite :
.envavec les infos de ton instance YunoHost (voir les commentaires dans.env.example),src/config.jsonavec tes propres applications et groupes — soit à la main (voir la section dédiée plus bas), soit via l'éditeur visuel une fois le serveur lancé, soit en copiant un fichier existant si tu en as déjà un ailleurs (ex. un dépôt séparé où tu gardes tes configs personnelles).
Puis :
make serve # lance l'apercu + l'editeur en local
Faire une démo
make demo
Remplace src/config.json par un jeu de données d'exemple
(src/config.demo.json) — une vingtaine d'applications réalistes réparties
dans plusieurs groupes (Cloud & Fichiers, Média, Communication,
Productivité, Domotique, Administration), avec vraies icônes, couleurs et
initiales — puis lance make serve.
- Si
src/config.jsonexistait déjà et différait de la démo, il est d'abord sauvegardé danssrc/config.json.bak(ignoré par git) pour ne rien perdre. - Le panneau Catalogue YunoHost de l'éditeur (colonnes latérales, qui
normalement liste via SSH les apps installées sur un vrai serveur — voir
make syncplus bas) est lui aussi rempli avec des données de démo (src/catalog.demo.json, une dizaine d'apps supplémentaires) au lieu de tenter une connexion SSH réelle : c'est le rôle de la variableHOMEPAGE_DEMO=1, positionnée automatiquement parmake demopourscripts/preview.py. En dehors demake demo(donc avecmake servenormal), la vraie synchronisation SSH est utilisée.
Pour revenir à ta config perso après la démo : restaure ta sauvegarde
(cp src/config.json.bak src/config.json) ou relance make sync /
make fetch selon d'où elle vient.
Aperçu et édition en local
make serve
(Ctrl+C arrête le serveur.) Un port différent : make serve PORT=8080.
Ça ouvre deux onglets :
http://localhost:8000/editor.html— éditeur : glisser-déposer les applications entre groupes, vers/depuis "Sans groupe" ou vers/depuis "Épinglées" (tout en haut, en dehors de tout groupe), réordonner les groupes (poignée⠿), les renommer (clic sur le nom), cocher "replié par défaut", ajouter (+) ou supprimer (✕) une application ou un groupe.- Le bouton Enregistrer écrit dans
src/config.json. - Le bouton Exporter enregistre puis copie les fichiers déployables
(
index.html,style.css,app.js,config.json) dansoutput/— c'est ce dossier, passrc/, qui est envoyé sur le serveur.
- Le bouton Enregistrer écrit dans
http://localhost:8000/— aperçu de la page finale (celle desrc/), avec rechargement automatique dès qu'un fichier change.
Cette partie ne nécessite aucune information sur ton serveur : tout est local.
Récupérer automatiquement les apps installées sur YunoHost
make sync
Se connecte en SSH (SYNC_SSH_USER@SYNC_SSH_HOST défini dans .env),
récupère la vraie liste des apps installées sur PORTAL_DOMAIN avec leur
nom/URL/logo officiels, et ajoute dans ungrouped uniquement celles qui
manquent encore (comparaison par URL). N'écrase jamais une app déjà classée
dans un groupe ou épinglée.
⚠️ Nécessite un accès root (ou un compte avec sudo, mot de passe requis
à chaque appel) sur le serveur : le fichier lu
(/etc/yunohost/portal/<domaine>.json) n'est lisible par aucun compte moins
privilégié, y compris le compte applicatif utilisé pour le déploiement.
Gérer les applications à la main (optionnel)
Tout se configure aussi directement dans src/config.json (voir
src/config.example.json pour un point de départ), si tu préfères éditer
le fichier toi-même plutôt que d'utiliser l'éditeur visuel.
Ajouter une application
{ "id": "monapp", "name": "Mon App", "url": "/monapp/", "color": "#2196f3", "initials": "MA" }
id: identifiant unique, sans espace.name: nom affiché sous la tuile.url: chemin réel de l'appli sur le domaine (ex./navidrome/). C'est à partir de cette URL que la page tente de chargerfavicon.icoautomatiquement.color/initials: filet de sécurité si aucun favicon ne charge (pastille colorée avec initiales).icon(optionnel) : force une image précise plutôt que le favicon auto-détecté, ex."icon": "https://...".
Ajoute l'objet dans le tableau apps d'un groupe existant, dans le tableau
racine pinned (épinglées en haut de page) ou dans ungrouped si elle ne
doit appartenir à aucun groupe.
Supprimer une application
Supprime son objet { ... } dans le tableau où elle se trouve. Attention aux
virgules JSON (pas de virgule surnuméraire).
Gérer les groupes
- Créer : ajoute un objet dans le tableau racine
groups:{ "id": "domotique", "name": "Domotique", "collapsed": false, "apps": [] } - Réordonner : l'ordre des objets dans
groups= l'ordre vertical affiché. - Renommer : change le champ
name. - Replié par défaut :
"collapsed": true(le choix de chaque visiteur est ensuite mémorisé dans son navigateur et prend le dessus). - Supprimer : retire l'objet de
groups— déplace d'abord ses apps ailleurs, sinon elles disparaissent avec lui.
Vérifier que le JSON reste valide
python3 -m json.tool src/config.json > /dev/null && echo "JSON valide"
Déploiement sur YunoHost
Cette page est conçue pour être servie par une app "Custom Webapp"
(my_webapp) YunoHost, définie comme application par défaut du domaine
pour être visible à la racine (https://tondomaine/) — voir la doc
YunoHost pour installer ce type d'app si ce n'est pas déjà fait.
Le déploiement se fait toujours à partir de output/, jamais de src/
directement :
make export # (ou le bouton Exporter de l'éditeur) : src/ -> output/
make deploy # envoie output/ sur le serveur
Configurer .env
make config
crée .env à partir de .env.example (déjà ignoré par git, ne sera jamais
commité). Toutes les infos de connexion viennent de ce fichier — sans
lui, make deploy et make sync s'arrêtent avec un message expliquant quoi
renseigner :
# Déploiement
REMOTE_HOST=tondomaine.exemple
REMOTE_USER=my_webapp__x
REMOTE_PORT=22
REMOTE_PATH=/www/
REMOTE_PASSWORD=le-mot-de-passe-ici
# Synchronisation des apps (make sync)
SYNC_SSH_USER=root
SYNC_SSH_HOST=tondomaine.exemple
PORTAL_DOMAIN=tondomaine.exemple
scripts/deploy.sh charge ce fichier. Si REMOTE_PASSWORD est renseigné,
il utilise sshpass (installé via make install) pour se connecter sans
invite interactive. Sans mot de passe dans .env, ssh demandera la
saisie manuelle — utile en terminal interactif, mais ne fonctionne pas dans
un contexte sans terminal (script automatisé), où ssh échoue avec une
erreur ssh_askpass.
⚠️ Le compte applicatif (REMOTE_USER) d'une "Custom Webapp" YunoHost est
en général un compte SFTP uniquement, chrooté dans son propre dossier
(ForceCommand internal-sftp côté serveur) :
rsyncne fonctionne pas (il a besoin d'exécuter un shell distant) —scripts/deploy.shutilisescp.REMOTE_PATHest relatif à la racine du chroot de cette app (/var/www/<REMOTE_USER>), donc/www/et pas/var/www/<REMOTE_USER>/www/.
Authentification par clé SSH (alternative)
Pour ne plus dépendre du mot de passe pour le déploiement :
ssh-keygen -t ed25519 -C "deploy-yunohost-pageaccueil"
ssh-copy-id -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST"