# 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 Wi‑Fi - 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 (Wi‑Fi) -> Laptop / Smartphone - Style des liaisons: - LAN: trait plein - Wi‑Fi: 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 d’enfants: icône, forme, texte, badge, objet complet. ## Redimensionnement - Les conteneurs sont redimensionnables pour inclure d’autres 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/Wi‑Fi) ## Modèle d’objet (draft) - Parent optionnel + enfants multiples. - Types d’objets: 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 d’IDs d’objets connecteur ### Image - formats: png, jpg, svg, webp - size: width, height - anchor: position d’accrochage - state: libre | accroché | en bordure - storage: fichier sur disque + chemin (`src`) dans JSON/DB (pas d’image brute) - displayName: nom lisible optionnel - naming: conserver le nom lisible + suffixe unique (ex: `livebox_7f3a.png`) - upload: - création d’un nouveau fichier avec métadonnées - réduction de poids possible à l’upload 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 d’IDs d’objets 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 d’objets: 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 grand‑parent - Importer un objet (bibliothèque) + enfants (JSON). - Bibliothèque: - stockage local (JSON) - export/import possible - Panneau droit: **Propriétés** (ex‑Actions). - 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 d’outils 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 d’outils. - 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 à l’emploi. - library/: bibliothèque d’objets 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 l’arbre 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.