Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
Dashboard web auto-hébergé pour les services d'un serveur tuiles, stats, Docker, widgets Jellyfin/Plex/qBittorrent/Sonarr/Radarr
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Dashboard web auto-hébergé, dans l'esprit de Homarr, pour accéder aux services de ton serveur depuis une seule page. Interface en français et en anglais (bouton EN / FR).
Captures réalisées avec les faux services de npm run mocks.
nas.maison:8080) ou une recherche web (DuckDuckGo, Google, Qwant…, ou une adresse personnalisée, réglable dans Affichage).dl-stats est placé devant Immich, ses totaux (téléchargements, photos téléchargées, visiteurs) s’affichent aussi.#medias). La recherche parcourt tous les onglets.Stack : Node.js + Express côté serveur, HTML/CSS/JS sans étape de build côté client. La config est stockée dans data/config.json.
L'image est publiée à chaque version sur ghcr.io/circule-studio/server-dashboard (amd64 et arm64, donc Raspberry Pi compris) : pas besoin de cloner le dépôt.
Récupère les deux fichiers de configuration :
mkdir server-dashboard && cd server-dashboard
curl -fsSLO https://raw.githubusercontent.com/Circule-studio/server-dashboard/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/Circule-studio/server-dashboard/main/.env.example -o .env
Ouvre .env et remplace change-moi par un vrai mot de passe. .env ne doit jamais être publié : ne mets pas de mot de passe directement dans compose.yaml.
Lance :
docker compose up -d
Ouvre http://IP-DU-SERVEUR:7575 : un écran d'accueil te guide (Connexion, puis Éditer).
Mettre à jour : docker compose pull && docker compose up -d. La config reste dans ./data.
Depuis le code source (développement) : clone le dépôt, remplace la ligne image: de compose.yaml par build: ., puis docker compose up -d --build.
Une commande, en root, sur Debian 12+ ou Ubuntu 22.04+ avec systemd. Ça marche aussi dans un conteneur LXC Proxmox ou sur un Raspberry Pi :
curl -fsSL https://raw.githubusercontent.com/Circule-studio/server-dashboard/main/packaging/install.sh | sudo bash
Le script :
/opt/server-dashboard ;server-dashboard et un service systemd du même nom ;| Quoi | Où |
|---|---|
Réglages (mot de passe, port, REQUIRE_LOGIN…) | /etc/server-dashboard/server-dashboard.env, puis sudo systemctl restart server-dashboard |
| Config du dashboard (tuiles, widgets) | /var/lib/server-dashboard/ |
| Logs | journalctl -u server-dashboard -f |
… | sudo SD_VERSION=v0.1.0 SD_PORT=8080 SD_ADMIN_PASSWORD=… bash… | sudo bash -s -- --uninstall (ajoute --purge pour effacer aussi la config).docker. Sinon, le panneau est simplement masqué.npm install
npm run dev
Puis ouvre http://localhost:7575. Le mot de passe est celui de ton fichier .env s'il existe (attention aux majuscules), sinon admin.
Pour travailler sur les widgets sans avoir les vrais services, lance un faux service pour chaque widget (Jellyfin, Plex, Proxmox, Home Assistant, GitHub…) et un faux Docker dans un second terminal :
npm run mocks
Les URL et clés de test à saisir sont en tête de dev/mocks.js.
En mode édition, le bouton Disques liste les disques détectés sur la machine (C:\, D:\… sous Windows, les partitions réelles comme / ou /mnt/data sous Linux). Coche ceux à afficher et donne-leur un nom (« Films », « Sauvegardes »…) : chacun a sa carte dans les stats. Tu peux aussi saisir un chemin à la main (partage réseau monté, dossier…).
Avec Docker, le conteneur ne voit que ce qui est monté. compose.yaml monte déjà la racine de l'hôte en lecture seule (/:/host:ro) : les autres disques de l'hôte apparaissent sous /host/… (ex. /host/mnt/data). Un disque monté ailleurs peut être ajouté explicitement :
volumes:
- /srv/films:/host/srv/films:ro
Dans un conteneur LXC Proxmox, le dashboard ne voit que le disque du conteneur : utilise plutôt le widget Proxmox VE pour les stockages de l'hôte.
| Service | Champs | Où les trouver |
|---|---|---|
| Jellyfin | URL + clé API | Tableau de bord > Clés API > « + » |
| Plex | URL + token | Valeur X-Plex-Token (doc Plex) |
| qBittorrent | URL + utilisateur / mot de passe de la WebUI | Options > Interface web |
| Sonarr / Radarr / Lidarr / Readarr / Prowlarr | URL + clé API | Settings > General > API Key |
| Bazarr | URL (http://IP:6767) + clé API | Settings > General > Security > API Key |
| Pulse | URL (http://IP:7655) + jeton d’API | Pulse > Paramètres > API Access, scope monitoring:read |
| Proxmox VE | URL (https://IP:8006) + identifiant et secret d’un jeton d’API | Voir ci-dessous |
| Proxmox Backup Server | URL (https://IP:8007) + identifiant et secret d’un jeton d’API | Configuration > Access Control > API Token, avec le rôle Audit sur / pour le jeton (lecture seule) |
| Scrutiny | URL de l’interface (http://IP:8080) | Aucune clé |
| Speedtest Tracker | URL + jeton d’API facultatif | v1 : Settings > API Tokens (lecture). Sans jeton : ancienne API publique (v0) |
| Pi-hole (v6) | URL (http://IP) + mot de passe | Celui de l’interface web. Avec la 2FA : mot de passe d’application (Paramètres > Web interface / API, mode Expert, « Configure app password »). Vide si Pi-hole n’a pas de mot de passe |
| AdGuard Home | URL (http://IP) + utilisateur / mot de passe | Ceux de l’interface web (vides si elle n’en a pas) |
| Immich | URL (http://IP:2283) + clé API | Paramètres du compte > Clés API, avec un compte administrateur (permission server.statistics si la clé est limitée) |
| Calendrier | Adresse(s) .ics + identifiant / mot de passe facultatifs |
Pulse : coche les blocs à afficher (Santé, Alertes, Nœuds / VM / LXC). Pour les placer librement, ajoute plusieurs widgets Pulse avec chacun un bloc, puis déplace-les par glisser-déposer.
Proxmox VE : le widget affiche les stats de l’hôte (CPU, RAM, disque), l’état de toutes les VM et conteneurs LXC, et les stockages. C’est la façon de voir la machine complète quand le dashboard tourne lui-même dans un LXC, qui ne voit que ses propres limites. Crée un jeton en lecture seule dans le shell de l’hôte Proxmox :
pveum user token add root@pam dashboard --privsep 1
pveum acl modify / --tokens "root@pam!dashboard" --roles PVEAuditor
La première commande affiche le secret (une seule fois). Dans le widget : identifiant root@pam!dashboard, secret = la valeur value affichée.
Les URL doivent être joignables depuis le serveur du dashboard (par exemple http://jellyfin:8096 si les deux sont dans le même réseau Docker). Les clés et mots de passe restent sur le serveur : ils ne sont jamais renvoyés au navigateur.
Les versions stables sont publiées dans les Releases, et le détail des changements est dans le CHANGELOG. Pour publier une version : mettre à jour version dans package.json et CHANGELOG.md, fusionner dans main, puis pousser un tag vX.Y.Z. Le workflow release.yml crée la release.
Les contributions sont bienvenues, en particulier sur l'interface. Voir CONTRIBUTING.md.
| Variable | Défaut | Rôle |
|---|---|---|
PORT | 7575 | Port HTTP |
ADMIN_PASSWORD | admin | Mot de passe du mode édition |
DATA_DIR | ./data | Dossier de la config et du secret de session |
SERVER_NAME | nom de la machine | Nom affiché à côté du titre (utile en Docker) |
DISK_PATH | / (C:\ sous Windows) | Disque affiché par défaut, tant qu'aucun disque n'est choisi en mode édition |
DOCKER_SOCKET | /var/run/docker.sock | Socket de l'API Docker |
REQUIRE_LOGIN | false | true : tout le dashboard (lecture comprise) exige d’être connecté |
TRUST_PROXY | – | Derrière un reverse proxy, mettre 1 pour que la limite de tentatives de connexion voie la vraie IP des visiteurs |
SESSION_SECRET | généré dans data/.secret | Clé de signature des cookies de session |
NOTIFY_INTERVAL_MS | 60000 | Intervalle de vérification des applications pour les notifications (en millisecondes) |
UPDATE_CHECK | true | false : ne pas vérifier sur GitHub si une nouvelle version existe (la version installée reste affichée à l’admin) |
ADMIN_PASSWORD déconnecte toutes les sessions ouvertes.REQUIRE_LOGIN=true./var/run/docker.sock donne au conteneur un accès équivalent à root sur l'hôte. Les actions Docker exigent d'être connecté, mais n'expose pas le dashboard directement sur Internet : place-le derrière un reverse proxy en HTTPS (Nginx Proxy Manager, Caddy, Traefik) ou derrière un VPN (WireGuard, Tailscale).tecnativa/docker-socket-proxy et pointe DOCKER_SOCKET dessus (ou retire simplement le volume).| Méthode | Route | Auth |
|---|---|---|
| GET | /api/config | – |
| PUT | /api/config | ✔ |
| GET | /api/status | – |
| GET | /api/system | – |
| GET | /api/widgets/:id | – |
| GET | /api/docker/containers | – |
| POST | /api/docker/containers/:id/(start|stop|restart) | ✔ |
| POST | /api/login, /api/logout · GET /api/me | – |
| Nextcloud : ⋯ > Copier le lien privé ; Google Agenda : Paramètres > Adresse secrète au format iCal. Plusieurs agendas : adresses séparées par un espace. L’adresse est gardée sur le serveur comme une clé |
| GoAccess | URL du rapport JSON (goaccess … -o rapport.json) | Aucune clé. Pour ne rien exposer de sensible, génère un rapport limité au panneau des visiteurs (--ignore-panel pour tous les autres, dont HOSTS) : il ne contient aucune adresse IP |
| Alwaysdata | Jeton d’API + nom du compte (facultatif) | Alwaysdata > Profil > Gestion des jetons. Le compte n’est utile que si le jeton en gère plusieurs. Le widget lit seulement la liste des sites, puis teste lui-même leur première adresse (HTTPS, sinon HTTP) |
| Wazuh | URL de l’API du manager (https://IP:55000) + utilisateur et mot de passe de l’API ; facultatif : URL de l’indexer (https://IP:9200) et utilisateur:mot de passe de l’indexer | Compte de l’API Wazuh (idéalement avec le rôle readonly). Sans l’indexer, seuls les agents s’affichent. Certificats auto-signés acceptés |
| Traefik | URL de l’API (http://IP:8080 ou le routeur qui publie api@internal) ; utilisateur et mot de passe si un middleware basicAuth la protège | Activer api.dashboard (ou api.insecure sur un réseau privé) dans la configuration statique de Traefik |
| CrowdSec | URL de l’API locale (http://IP:8080) + compte machine ou clé de bouncer | Sur la machine CrowdSec : cscli machines add dashboard --password … (attaques détaillées : pays, opérateur, scénario) ou cscli bouncers add dashboard (lecture seule : adresses bannies). La liste communautaire n’est pas comptée comme une attaque |
| Météo | Lieu : ville (Nantes, Paris, France) ou coordonnées (47.21, -1.55) | Aucun compte. L’URL est facultative : seulement pour une instance Open-Meteo auto-hébergée |
| Uptime Kuma | URL (http://IP:3001) + nom de la page de statut, ou l’adresse complète de la page | Aucune clé : les pages de statut sont publiques (Uptime Kuma > Pages de statut) |
| Glances | URL (http://IP:61208) + mot de passe facultatif | Lance glances -w sur la machine (avec --password pour en exiger un ; utilisateur glances par défaut) |
| Frigate | URL (http://IP:5000), ou https://IP:8971 + utilisateur / mot de passe | Port 5000 : rien à saisir. Port 8971 (Frigate 0.14+) : un compte Frigate, idéalement avec le rôle « viewer ». Les miniatures passent par le dashboard et suivent REQUIRE_LOGIN |
| Home Assistant | URL (http://IP:8123) + jeton + entités (une par ligne) | Ton profil > Sécurité > Jetons d’accès longue durée. Les identifiants d’entités (sensor.salon_temperature) sont dans Paramètres > Appareils et services > Entités |
| Nginx Proxy Manager | URL (http://IP:81) + e-mail / mot de passe | Le compte de l’interface d’administration. Un compte dédié avec la permission « Proxy Hosts » en lecture suffit |
| GitHub | Dépôt (propriétaire/dépôt ou son adresse) + jeton facultatif | Jeton obligatoire pour un dépôt privé : Settings > Developer settings > Fine-grained tokens, en lecture seule (Contents, Issues, Pull requests, Metadata). Sans jeton, GitHub limite à 60 requêtes par heure : rafraîchi toutes les 15 min (2 min avec un jeton), ce qui permet 4 à 5 widgets. Si la limite est atteinte, les dernières données restent affichées. L’URL de l’API ne sert que pour GitHub Enterprise |
| API personnalisée | URL qui renvoie du JSON + valeurs (une par ligne : chemin | libellé | format) + authentification facultative | Chemin avec des points : data.users.count, items.0.name, liste.length. Formats : texte, nombre, pourcentage, octets, débit, date. Authentification : un en-tête (X-Api-Key: …, ou une valeur seule envoyée en Authorization: Bearer …) ou identifiant / mot de passe (Basic) |