Files
ipwatch/architecture.md
2026-02-07 16:57:37 +01:00

589 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Architecture réseau (draft)
Date: 2025-12-25
## Vision générale
- Modèle principal: boîtes imbriquées (composition) + liaisons (graph).
- Objectifs: représenter la topologie physique/logique et les relations réseau.
## Composition (boîtes imbriquées)
- Exemple de hiérarchie:
- World (Internet)
- Maison
- Livebox
- Switch
- Borne WiFi
- Laptop
- Smartphone
- Server Proxmox
- VM Debian
- Docker
- Service
- Raspberry Pi
- Service(s)
- IoT Hub
- Service(s)
## Liaisons (graph)
- Les boîtes peuvent être reliées entre elles indépendamment de la hiérarchie.
- Exemples:
- Service -> Docker -> VM -> Server -> Switch -> Livebox -> Maison -> World
- AP (WiFi) -> Laptop / Smartphone
- Style des liaisons:
- LAN: trait plein
- WiFi: trait pointillé
## Ports
- Nombre de ports ajustable.
- Plusieurs connexions possibles sur un même port.
## Objets composés
- Un objet peut contenir des enfants.
- Enfants positionnés par rapport au parent (coordonnées locales).
- Types possibles denfants: icône, forme, texte, badge, objet complet.
## Redimensionnement
- Les conteneurs sont redimensionnables pour inclure dautres objets.
- À décider:
- Taille des enfants figée ou proportionnelle au parent lors du resize.
## Modèle de données (à préciser)
- Node (id, type, label, size, children[], ports[])
- Port (id, label, capacity)
- Edge (from, to, kind: LAN/WiFi)
## Modèle dobjet (draft)
- Parent optionnel + enfants multiples.
- Types dobjets: rectangle, icône, image, table, texte, lien, commande, connecteur.
- Propriétés communes:
- id, name, parentId, children[]
- category
- position: x, y (locales au parent), zIndex
- size: width, height
- rotation: degrés
- keep_ratio: true | false
- visible
- anchor: free | edge, edgeSide: 1|2|3|4
- style: fillColor, strokeColor, opacity
- font: family, size, weight (normal|bold), style (normal|italic), color
- state: libre | accroché | en bordure
- command: texte/commande associée (optionnel)
- connecteurs: liste dIDs dobjets connecteur
### Image
- formats: png, jpg, svg, webp
- size: width, height
- anchor: position daccrochage
- state: libre | accroché | en bordure
- storage: fichier sur disque + chemin (`src`) dans JSON/DB (pas dimage brute)
- displayName: nom lisible optionnel
- naming: conserver le nom lisible + suffixe unique (ex: `livebox_7f3a.png`)
- upload:
- création dun nouveau fichier avec métadonnées
- réduction de poids possible à lupload et après (optimize)
- library:
- images ajoutées dans une bibliothèque
- metadata category obligatoire
### Table
- size: width, height
- position: x, y (locales au parent)
- parentId, children[]
- grid: rows, cols
- headers: title1, title2, title3...
- style spécifique:
- borderColor, fillColor, headerColor, textColor
- fontWeight (normal|bold), fontStyle (normal|italic), fontSize, fontFamily
- anchor: x, y, zIndex
- connecteurs: liste dIDs dobjets connecteur
### Connecteur
- Objet à part entière:
- id, name, parentId, children[]
- endpoints: connecteur1 -> targetId, connecteur2 -> targetId
## Exemple Mermaid (boîtes imbriquées + liaisons)
```mermaid
flowchart TB
%% Boîtes imbriquées
subgraph World["World (Internet)"]
subgraph Maison["Maison"]
Livebox["Livebox"]
Switch["Switch"]
subgraph Server["Server Proxmox"]
VM["VM Debian"]
subgraph Docker["Docker"]
Service["Service"]
end
end
Laptop["Laptop"]
Smartphone["Smartphone"]
end
end
%% Liaisons (réseau/logique)
Service --> Docker
Docker --> VM
VM --> Server
Server --> Switch
Switch --> Livebox
Livebox --> Maison
Maison --> World
```
## Exemple JSON (draft)
```json
{
"nodes": [
{
"id": "world",
"type": "rectangle",
"name": "World",
"parentId": null,
"children": ["maison"],
"position": { "x": 0, "y": 0 },
"zIndex": 0,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#2B2D2A",
"strokeColor": "#8F8F7A",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 14,
"weight": "bold",
"style": "normal",
"color": "#E6DB74"
},
"state": "libre",
"command": null,
"connecteurs": []
},
{
"id": "maison",
"type": "rectangle",
"name": "Maison",
"parentId": "world",
"children": ["livebox", "server"],
"position": { "x": 40, "y": 40 },
"zIndex": 1,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#3A3D39",
"strokeColor": "#A6E22E",
"opacity": 0.95
},
"font": {
"family": "Space Grotesk",
"size": 12,
"weight": "bold",
"style": "normal",
"color": "#E6DB74"
},
"state": "libre",
"command": null,
"connecteurs": []
},
{
"id": "livebox",
"type": "image",
"name": "Livebox",
"category": "network",
"parentId": "maison",
"children": [],
"position": { "x": 20, "y": 30 },
"size": { "width": 48, "height": 48 },
"rotation": 0,
"keepRatio": true,
"zIndex": 2,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#272822",
"strokeColor": "#F92672",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 11,
"weight": "normal",
"style": "normal",
"color": "#F8F8F2"
},
"state": "libre",
"command": null,
"connecteurs": ["c-livebox"],
"image": {
"format": "svg",
"src": "livebox.svg",
"displayName": "Livebox",
"category": "network",
"sizeBytes": 12456,
"width": 48,
"height": 48
}
},
{
"id": "server",
"type": "rectangle",
"name": "Server Proxmox",
"parentId": "maison",
"children": ["vm-debian"],
"position": { "x": 140, "y": 30 },
"zIndex": 2,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#2F3130",
"strokeColor": "#66D9EF",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 11,
"weight": "bold",
"style": "normal",
"color": "#E6DB74"
},
"state": "libre",
"command": "ssh root@server",
"connecteurs": ["c-server"]
},
{
"id": "vm-debian",
"type": "rectangle",
"name": "VM Debian",
"parentId": "server",
"children": ["docker"],
"position": { "x": 16, "y": 36 },
"zIndex": 3,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#1F2A2A",
"strokeColor": "#A6E22E",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 10,
"weight": "normal",
"style": "normal",
"color": "#E6DB74"
},
"state": "libre",
"command": null,
"connecteurs": []
},
{
"id": "docker",
"type": "rectangle",
"name": "Docker",
"parentId": "vm-debian",
"children": ["service-web"],
"position": { "x": 12, "y": 28 },
"zIndex": 4,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "#263238",
"strokeColor": "#F8F8F2",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 10,
"weight": "normal",
"style": "normal",
"color": "#F8F8F2"
},
"state": "libre",
"command": "docker ps",
"connecteurs": []
},
{
"id": "service-web",
"type": "text",
"name": "Service Web",
"parentId": "docker",
"children": [],
"position": { "x": 10, "y": 18 },
"zIndex": 5,
"visible": true,
"anchor": "free",
"edgeSide": null,
"style": {
"fillColor": "transparent",
"strokeColor": "transparent",
"opacity": 1
},
"font": {
"family": "Space Grotesk",
"size": 10,
"weight": "normal",
"style": "italic",
"color": "#A6E22E"
},
"state": "libre",
"command": null,
"connecteurs": ["c-service"]
}
],
"connecteurs": [
{
"id": "c-livebox",
"name": "LAN Livebox",
"parentId": "livebox",
"children": [],
"endpoints": [
{ "name": "c1", "targetId": "c-server" },
{ "name": "c2", "targetId": "world" }
]
},
{
"id": "c-server",
"name": "LAN Server",
"parentId": "server",
"children": [],
"endpoints": [
{ "name": "c1", "targetId": "c-livebox" },
{ "name": "c2", "targetId": "c-service" }
]
},
{
"id": "c-service",
"name": "Service Link",
"parentId": "service-web",
"children": [],
"endpoints": [
{ "name": "c1", "targetId": "c-server" },
{ "name": "c2", "targetId": "docker" }
]
}
],
"edges": [
{ "from": "c-livebox", "to": "c-server", "kind": "lan" },
{ "from": "c-livebox", "to": "world", "kind": "lan" }
]
}
```
## UML (tables SQLite - draft)
```mermaid
classDiagram
class diagram {
+id TEXT
+name TEXT
+created_at TEXT
+updated_at TEXT
+version TEXT
}
class node {
+id TEXT
+diagram_id TEXT
+type TEXT
+name TEXT
+category TEXT
+parent_id TEXT
+x REAL
+y REAL
+width REAL
+height REAL
+rotation REAL
+keep_ratio INTEGER
+z_index INTEGER
+visible INTEGER
+anchor TEXT
+edge_side INTEGER
+state TEXT
}
class node_style {
+node_id TEXT
+fill_color TEXT
+stroke_color TEXT
+opacity REAL
+font_family TEXT
+font_size REAL
+font_weight TEXT
+font_style TEXT
+font_color TEXT
}
class node_command {
+node_id TEXT
+command_text TEXT
}
class node_media {
+node_id TEXT
+media_type TEXT
+src TEXT
+format TEXT
+display_name TEXT
+category TEXT
+size_bytes INTEGER
+width REAL
+height REAL
}
class node_text {
+node_id TEXT
+content TEXT
}
class node_link {
+node_id TEXT
+url TEXT
+label TEXT
}
class node_table {
+node_id TEXT
+rows INTEGER
+cols INTEGER
+width REAL
+height REAL
+header_color TEXT
+header_text_color TEXT
+border_color TEXT
+cell_color TEXT
+font_family TEXT
+font_size REAL
+font_weight TEXT
+font_style TEXT
}
class node_table_header {
+node_id TEXT
+col_index INTEGER
+title TEXT
}
class connector {
+id TEXT
+diagram_id TEXT
+name TEXT
+parent_id TEXT
+x REAL
+y REAL
+z_index INTEGER
+visible INTEGER
}
class connector_endpoint {
+id TEXT
+connector_id TEXT
+name TEXT
+target_id TEXT
}
class edge {
+id TEXT
+diagram_id TEXT
+from_id TEXT
+to_id TEXT
+kind TEXT
+style TEXT
+label TEXT
+color TEXT
}
class port {
+id TEXT
+node_id TEXT
+name TEXT
+capacity INTEGER
+x REAL
+y REAL
+anchor TEXT
+edge_side INTEGER
}
diagram "1" --> "many" node
diagram "1" --> "many" connector
diagram "1" --> "many" edge
node "1" --> "0..1" node : parent
node "1" --> "0..1" node_style
node "1" --> "0..1" node_command
node "1" --> "0..1" node_media
node "1" --> "0..1" node_text
node "1" --> "0..1" node_link
node "1" --> "0..1" node_table
node "1" --> "many" node_table_header
node "1" --> "many" port
connector "1" --> "many" connector_endpoint
```
## Frontend (UI - draft)
- Panneau gauche: **Édition** (mode édition activable).
- Palette dobjets: carré, rectangle, rond, ovale, pilule, image, texte, table, commande.
- Liaisons: ligne, connexion, flèche, spline.
- Boutons:
- Supprimer un objet du monde (avec choix de cascade):
- supprimer les enfants
- relier les enfants au grandparent
- Importer un objet (bibliothèque) + enfants (JSON).
- Bibliothèque:
- stockage local (JSON)
- export/import possible
- Panneau droit: **Propriétés** (exActions).
- Propriétés organisées par sections (plus lisible).
- Parent/enfants configurables depuis Propriétés.
- Image: afficher poids + catégorie.
- Afficher rotation + dimensions (avec poignées de resize/rotation activables).
- Barre doutils dépliable (outils courants):
- couper, copier, coller, supprimer, cloner
- palette couleurs (trait / intérieur)
- police (liste déroulante) + taille (boutons + / -)
- zoom (loupe + / -)
- épaisseur de trait
## Stockage des ressources (arborescence proposée)
```
architecture/
backend/
app/
diagrams/
world.json
database/
resources/
toolbars/
editbar.json
prop_bar.json
outils.json
images/
originals/
optimized/
thumbs/
police/
palettes/
commandes/
library/
objects.json
simple_objects.json
images.json
tables.json
commands.json
palettes.json
fonts.json
exports/
imports/
```
Descriptions:
- backend/: API + logique serveur pour léditeur.
- app/: code UI + logique front.
- diagrams/: fichiers de diagrammes (world.json, etc.).
- database/: base SQLite locale.
- resources/toolbars/: définitions des barres doutils.
- resources/images/: images sources, optimisées, miniatures.
- resources/police/: polices disponibles.
- formats acceptés: ttf (support initial), woff/woff2 possibles plus tard.
- resources/palettes/: palettes de couleurs.
- resources/commandes/: commandes prêtes à lemploi.
- library/: bibliothèque dobjets réutilisables.
- exports/: exports (JSON, images, etc.).
- imports/: imports.
- Les deux volets sont repliés par défaut; un bouton en haut permet de les déplier.
- Drag & drop depuis Édition vers larbre réseau:
- crée un nouvel objet dans le monde avec paramètres par défaut.
- Mode lecture:
- édition désactivée = pas de déplacement ni de modification.