DasherControl : Un tableau de bord et ses trois frontières
DasherControl réunit des liens et des applications intégrées dans des espaces de travail sauvegardés. Vue gère l’interface, Rust et Rocket exposent l’API, et Diesel conserve la disposition dans PostgreSQL. Le contrôle Docker suit un parcours distinct.
Langages du dépôtRust 46.84%6
Parts calculées à partir des octets GitHub Linguist.
| Langage | % | Octets |
|---|---|---|
| Rust | 60 028 | |
| Vue | 55 958 | |
| JavaScript | 5 121 | |
| Shell | 3 267 | |
| Dockerfile | 2 628 | |
| PLpgSQL | 1 145 |
Aperçu
Pourquoi il existe
Architecture homelab découplée : backend Rust/Rocket pilotant le démon Docker via Shiplift, associé à un frontend Vue réactif.
Cas d’usage
Tableau de bord centralisé pour services conteneurisés en homelab, signets et gestion d'espaces de travail.
Démarrage
Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.
// bash scripts/rust-setup-dev.sh
// bash scripts/js-dev-setup.sh
cd frontend && npm install && npm run build && cd ..
cargo install diesel_cli --no-default-features --features postgres
// go in Rocket.toml and .env and change DATABASE_URL to your postgresql server
diesel migration run
// create admin user
cargo run --bin create_admin
// run web app
cargo runCommandes déclarées dans les manifestes
frontend/package.json
linteslint --ext .js,.vue frontend tests/unitbuildnpm run clean && webpack --mode productiontestecho "Error: no test specified" && exit 1
DOCKER_BUILDKIT=1 docker build -t antoinebou13/dashercontrol .
DOCKER_BUILDKIT=1 docker-compose up -d --build && docker-compose logs -fRéférences du dépôt
Le dépôt ne fournit pas de guide détaillé pour ces étapes. Commencez par le README et les fichiers commentés ci-dessus.
Fonctions et composants 2
- Propriété des espaces
- Les routes de liste obtiennent l’identifiant du tenant depuis un jeton. La route de lecture des applets vérifie le tenant de l’espace avant de retourner son contenu. L’espace et ses applets constituent ainsi une disposition persistante liée à un utilisateur.
- Opérations sur les conteneurs
- src/containers/docker.rs regroupe des opérations Docker avec Shiplift. Ces appels gèrent des conteneurs et des images, plutôt que les dispositions. Leur gestion d’échec est importante: une liste en erreur affiche un message et retourne un vecteur vide.
Architecture
Les composants et leurs liens restent lisibles en texte. Le diagramme ajoute une vue interactive.
- Interface Vue
- Routes Rocket
- Diesel et PostgreSQL
- Adaptateur Shiplift
- Démon Docker
Liens vérifiés dans le dépôt.
Mermaid Diagramme interactif (chargement à l’ouverture)
Vue générale des composants et des échanges vérifiés dans le dépôt.

flowchart LR
subgraph group_dashboard["Dashboard UI"]
node_main_ui["Dashboard Shell<br/>[Main.vue]"]
node_grid["Workspace Grid<br/>[GridLayoutMain.vue]"]
node_grid_item["Grid Items<br/>[GridItemApplet.vue]"]
node_applet_router["Applet Selector<br/>[Applet.vue]"]
node_applet_authoring["Applet Creation<br/>[CreateNew.vue]"]
node_editor["Applet Editor<br/>[Editor.vue]"]
node_iframe["Embedded Sites"]
node_shortcut["Shortcuts<br/>[Shortcut.vue]"]
node_canvas["Canvas Applet<br/>[Canvas.vue]"]
node_login_ui["Login Screen<br/>[Login.vue]"]
end
subgraph group_identity["Tenant Identity"]
node_tenant_api["Tenant Endpoints<br/>[handler.rs]"]
node_tenant_model["Tenant Accounts<br/>[model.rs]"]
node_token_auth["Token Validation<br/>[token.rs]"]
end
subgraph group_workspace["Workspace Data"]
node_workspace_api["Workspace Endpoints<br/>[handler.rs]"]
node_workspace_model["Workspace Records<br/>[model.rs]"]
node_database[("PostgreSQL Access<br/>[db.rs]")]
node_schema["Database Schema<br/>[schema.rs]"]
end
subgraph group_integrations["Runtime Integrations"]
node_docker_ui["Docker Manager<br/>[DockerManager.vue]"]
node_container_api["Container Endpoints<br/>[handler.rs]"]
node_docker_engine["Docker Engine<br/>[docker.rs]"]
node_terminal_ui["Terminal Applet<br/>[Terminal.vue]"]
node_terminal_ws["Terminal WebSocket<br/>[websocket.rs]"]
node_server["Rocket Server<br/>[main.rs]"]
end
node_user(("Dashboard User"))
node_user -->|"uses"| node_main_ui
node_main_ui -->|"renders"| node_grid
node_grid -->|"renders"| node_grid_item
node_grid_item -->|"renders"| node_applet_router
node_applet_router -->|"selects"| node_applet_authoring
node_applet_router -->|"selects"| node_editor
node_applet_router -->|"selects"| node_iframe
node_applet_router -->|"selects"| node_shortcut
node_applet_authoring -->|"configures"| node_applet_authoring
node_grid -->|"requests"| node_workspace_api
node_tenant_api -->|"authenticates"| node_tenant_model
node_tenant_api -->|"issues tokens"| node_token_auth
node_token_auth -->|"checks session"| node_tenant_model
node_workspace_api -->|"queries"| node_workspace_model
node_workspace_api -->|"validates"| node_token_auth
node_tenant_model -->|"queries"| node_schema
node_workspace_model -->|"queries"| node_schema
node_tenant_api -->|"uses connection"| node_database
node_workspace_api -->|"uses connection"| node_database
node_docker_ui -->|"requests"| node_container_api
node_container_api -->|"controls"| node_docker_engine
node_applet_router -->|"selects"| node_docker_ui
node_applet_router -->|"selects"| node_terminal_ui
node_server -->|"mounts routes"| node_tenant_api
node_server -->|"mounts routes"| node_workspace_api
node_server -->|"mounts routes"| node_container_api
node_server -->|"references"| node_terminal_ws
node_user -.->|"may use"| node_canvas
node_terminal_ui -.->|"SSH terminal"| node_terminal_ws
class node_main_ui,node_grid,node_grid_item,node_applet_router,node_applet_authoring,node_editor,node_iframe,node_shortcut,node_canvas,node_login_ui,node_user toneBlue
class node_tenant_api,node_tenant_model,node_token_auth toneAmber
class node_workspace_api,node_workspace_model,node_database,node_schema toneMint
class node_docker_ui,node_container_api,node_docker_engine,node_terminal_ui,node_terminal_ws,node_server toneRoseUn tableau de bord homelab configurable où les utilisateurs organisent des espaces de travail composés d’applets. Vue appelle des routes Rocket pour la persistance, les contrôles de locataire et les actions Docker; PostgreSQL conserve les espaces et un adaptateur séparé communique avec Docker.
- Composants
- 24
- Connexions
- 29
- Liens appuyés par le code ou le README
- 26/29
Version texte du diagramme
- Interface Vue → Routes Rocket
- Routes Rocket → Diesel et PostgreSQL
- Routes Rocket → Adaptateur Shiplift
- Adaptateur Shiplift → Démon Docker
Suivre un parcours dans le code
Le chargement d’un espace passe par ses routes et ses applets. Le redémarrage d’un conteneur passe plutôt par l’adaptateur Docker. L’interface doit distinguer un espace vide, Docker indisponible et une iframe bloquée par l’application intégrée.
Déploiement et exploitation
Les ports, le stockage et les relations de démarrage ci-dessous viennent de la configuration du dépôt. depends_on indique l’ordre de démarrage, pas la disponibilité du service.
Réseau. Bridge network dasher-net linking the DasherControl web app with PostgreSQL.
Carte du déploiement
Topologie Compose des services, ports et dépendances de démarrage documentés.

flowchart LR
classDef svc fill:#1b3040,stroke:#6fdbd0,color:#edf4fb
dashercontrol["dashercontrol<br/>8000:8000"]:::svc
postgres["postgres<br/>5432:5432"]:::svc
postgres --> dashercontrolUn tableau de bord homelab configurable où les utilisateurs organisent des espaces de travail composés d’applets. Vue appelle des routes Rocket pour la persistance, les contrôles de locataire et les actions Docker; PostgreSQL conserve les espaces et un adaptateur séparé communique avec Docker.
- Composants
- 24
- Connexions
- 29
- Liens appuyés par le code ou le README
- 26/29
Version texte du diagramme
- dashercontrol — Build from multi-stage Dockerfile · 8000:8000 → postgres, startup healthcheck
- postgres — postgres:14-alpine · 5432:5432
| Service | Image ou build | Ports publiés | Démarrage | Stockage |
|---|---|---|---|---|
| dashercontrol | Build from multi-stage Dockerfile | 8000:8000 | postgres, startup healthcheck | Named volume dasher-data |
| postgres | postgres:14-alpine | 5432:5432 | Named volume pgdata |
Types et structure des fichiers
36 types déclarés, dont 12 dans l’aperçu des relations de base.
Diagramme des types
classDiagram
direction TB
class t883aa4939d84["DockerInterface"] {
<<struct>>
new()
init()
get_containers()
get_images()
}
class t6c6e876f9471["NewTenant"] {
<<struct>>
}
class td007a4775b01["NewTenantConfiguration"] {
<<struct>>
}
class t9d91c22b8e18["DBJsonType"] {
<<struct>>
from_sql()
to_sql()
}
class t11bf41e6278b["Container"] {
<<struct>>
create()
all()
}
class ta9679a334153["NewContainer"] {
<<struct>>
}
class tdc82d141f21c["DbConn"] {
<<struct>>
from_request()
deref()
}
class t981fd8c93b75["CORS"] {
<<struct>>
info()
on_response()
}
class te127dc44374a["HitCount"] {
<<struct>>
}
class t6437f975dc23["TemplateContext"] {
<<struct>>
}
class tb361ddc722e9["JsonMessage"] {
<<struct>>
}
class t8722c44b4eb9["MyError"] {
<<enum>>
from()
fmt()
}
Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.
Index des types
DockerInterface(struct) ·src/containers/docker.rs:27Méthodes dans l’aperçu :
new, init, get_containers, get_images.NewTenant(struct) ·src/bin/create_admin.rs:48NewTenantConfiguration(struct) ·src/bin/create_admin.rs:60DBJsonType(struct) ·src/bin/create_admin.rs:137Méthodes dans l’aperçu :
from_sql, to_sql.Container(struct) ·src/containers/model.rs:9Méthodes dans l’aperçu :
create, all.NewContainer(struct) ·src/containers/model.rs:18DbConn(struct) ·src/db.rs:26Méthodes dans l’aperçu :
from_request, deref.CORS(struct) ·src/fairing.rs:7Méthodes dans l’aperçu :
info, on_response.HitCount(struct) ·src/router.rs:18TemplateContext(struct) ·src/router.rs:21JsonMessage(struct) ·src/router.rs:27MyError(enum) ·src/tenants/error.rs:6Méthodes dans l’aperçu :
from, fmt.
Référence
49 / 49 fichiers admissibles lus (139 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 0 diagnostic de syntaxe.
Ce que couvre l’analyse
Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.
Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.
Carte des fichiers
flowchart TD
root["DasherControl"]
f0["Cargo.toml"]
root --> f0
f1["src/containers/docker.rs"]
root --> f1
f2["src/workspaces/handler.rs"]
root --> f2
f3["README.md"]
root --> f3
f4["docker-compose.yml"]
root --> f4
f5["start-server.sh"]
root --> f5
f6["certs/create_aes128key.sh"]
root --> f6
f7["certs/create_jwt_key.sh"]
root --> f7
f8["certs/create_tls.sh"]
root --> f8
f9["frontend/main.js"]
root --> f9
f10["frontend/package.json"]
root --> f10
f11["frontend/utils.js"]
root --> f11
f12["frontend/webpack.config.js"]
root --> f12
f13["scripts/create_db.sh"]
root --> f13
f14["scripts/install-docker-compose.sh"]
root --> f14
f15["scripts/js-dev-setup.sh"]
root --> f15
Fichiers à lire 3
Références
- GitHubDépôt source
- READMEDocumentation du dépôt
- DasherControl : un tableau de bord homelab organisé en espaces de travailArticle du blog
Fiche projet