From 4eb9f22813dc3bbb1babb0451667a8653b696d41 Mon Sep 17 00:00:00 2001 From: Flag Date: Fri, 24 Apr 2026 00:16:21 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20migration=20vers=20cosma-vm=20(.83)=20?= =?UTF-8?q?=E2=80=94=20dispatcher+dashboard,=20OpenVPN,=20docs=20infra=20m?= =?UTF-8?q?is=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/_build/html/.doctrees/environment.pickle | Bin 29155 -> 29406 bytes .../html/.doctrees/infrastructure.doctree | Bin 20348 -> 22023 bytes .../html/_sources/infrastructure.rst.txt | 164 ++++++++--------- docs/_build/html/index.html | 6 +- docs/_build/html/infrastructure.html | 173 ++++++++---------- docs/_build/html/searchindex.js | 2 +- docs/infrastructure.rst | 164 ++++++++--------- .../__pycache__/dispatcher.cpython-311.pyc | Bin 47943 -> 49356 bytes 8 files changed, 235 insertions(+), 274 deletions(-) diff --git a/docs/_build/html/.doctrees/environment.pickle b/docs/_build/html/.doctrees/environment.pickle index 157c960aa9bc95aa9a03140c10298396c5a58c14..1451346f4aab07db42149c6297e867b2a7bdd87e 100644 GIT binary patch literal 29406 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 diff --git a/docs/_build/html/.doctrees/infrastructure.doctree b/docs/_build/html/.doctrees/infrastructure.doctree index 949bede994336380e415ced5ce343f4f60293366..90677b7d4646df483f83434f787f6919b87dcb52 100644 GIT binary patch literal 22023 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 s2Syr;2NR7eOub%B@km% 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 diff --git a/docs/_build/html/_sources/infrastructure.rst.txt b/docs/_build/html/_sources/infrastructure.rst.txt index 2e3cc58..ea9738d 100644 --- a/docs/_build/html/_sources/infrastructure.rst.txt +++ b/docs/_build/html/_sources/infrastructure.rst.txt @@ -6,49 +6,68 @@ Réseau LAN — 192.168.0.0/24 .. code-block:: text - ┌─────────────────────────────────────────────────────────┐ - │ LAN 192.168.0.0/24 │ - │ │ - │ .82 CORE Dispatcher (systemd) + FastAPI :3849 │ - │ Gitea + Grafana + InfluxDB + Caddy │ - │ │ - │ .84 ml-stack GPU worker RTX 3090 24GB │ - │ .87 gpu GPU worker RTX 3060 12GB │ - │ │ - │ .168 z620 Proxmox host HP Z620 │ - │ SSD → /mnt/portablessd (MP4 bruts) │ - └─────────────────────────────────────────────────────────┘ + ┌───────────────────────────────────────────────────────────────┐ + │ LAN 192.168.0.0/24 │ + │ │ + │ .82 CORE Gitea + Grafana + InfluxDB + Caddy │ + │ Reverse-proxy → cosma-vm pour /cosma-qc │ + │ │ + │ .83 cosma-vm Dispatcher cosma-qc (systemd) │ + │ Dashboard FastAPI :3849 │ + │ OpenVPN server :1194 UDP │ + │ │ + │ .84 ml-stack GPU worker RTX 3090 24GB │ + │ .87 gpu GPU worker RTX 3060 12GB │ + │ │ + │ .168 z620 Proxmox host HP Z620 — SSD MP4 bruts │ + │ .101 poxML Proxmox hyperviseur — héberge cosma-vm (VM 202)│ + └───────────────────────────────────────────────────────────────┘ -Nœud core (.82) ----------------- +Nœud cosma-vm (.83) — serveur principal cosma-qc +-------------------------------------------------- -**Rôle :** orchestrateur central du pipeline. +VM #202 sur Proxmox poxML (.101). 4 vCPU, 4 GB RAM, 40 GB SSD. +User : ``cosma`` (avec docker group et sudo). -Services actifs : +Services : -- **Dispatcher** — service systemd cosma-qc-dispatcher. - Boucle principale qui dispatch les jobs aux workers GPU. +- **Dispatcher** — ``cosma-qc-dispatcher.service`` (systemd) + Lance les extractions ffmpeg sur les workers GPU. -- **Dashboard FastAPI** — conteneur Docker exposé sur le port **3849**. - Interface web de monitoring des jobs. +- **Dashboard FastAPI** — conteneur Docker ``cosma-qc-app``, port **3849**. + Accès via Caddy sur core : ``http://192.168.0.82/cosma-qc`` -- **Gitea** — dépôt source floppyrj45/cosma-qc. - -- **Grafana / InfluxDB** — monitoring infrastructure. +- **OpenVPN** — ``openvpn-server@cosma.service``, port 1194 UDP. + Permet aux collègues daccéder au LAN depuis lextérieur. Commandes utiles : .. code-block:: bash + # SSH vers cosma-vm + ssh cosma@192.168.0.83 + # Statut dispatcher sudo systemctl status cosma-qc-dispatcher - # Logs dispatcher temps réel - sudo journalctl -u cosma-qc-dispatcher -f + # Logs dispatcher + tail -f /home/cosma/cosma-qc-data/dispatcher.log - # Dashboard - http://192.168.0.82:3849 + # Dashboard local + http://192.168.0.83:3849 + + +Nœud core (.82) +---------------- + +**Rôle :** routeur et services communs. + +Services actifs : + +- **Caddy** — reverse proxy HTTPS, route ``/cosma-qc`` vers .83:3849. +- **Gitea** — dépôt source ``floppyrj45/cosma-qc``. +- **Grafana / InfluxDB** — monitoring infrastructure. Nœuds GPU workers (.84 et .87) @@ -59,7 +78,7 @@ Nœuds GPU workers (.84 et .87) :widths: 15 25 20 40 * - IP - - Nom + - Nom SSH - GPU - VRAM * - .84 @@ -71,83 +90,46 @@ Nœuds GPU workers (.84 et .87) - RTX 3060 - 12 GB -**Rôle :** exécution de ffmpeg (extraction frames) et lingbot-map (reconstruction 3D). - -Répertoire de travail sur chaque worker : +**Rôle :** exécution de ffmpeg et lingbot-map. .. code-block:: text /cosma-qc-frames/ - ├── job_1/ - │ ├── frame_000001.jpg … frame_NNNNNN.jpg - │ ├── .video_0.done - │ ├── reconstruction.ply - │ └── reconstruction.glb (généré à la demande) - ├── job_2/ - │ └── … - └── stitch_1.ply + └── job_N/ + ├── frame_NNNNNN.jpg + ├── .video_V.done + ├── reconstruction.ply + └── reconstruction.glb -Nœud z620 (.168) ------------------ +Nœud z620 (.168) — stockage MP4 +---------------------------------- -**Rôle :** stockage des MP4 bruts GoPro. +HP Z620 (Proxmox). SSD /mnt/portablessd avec les MP4 GoPro bruts. +Les MP4 **ne quittent jamais** z620 — ffmpeg sy exécute via SSH-relay. -- Proxmox host HP Z620. -- SSD monté sur /mnt/portablessd. -- Les MP4 **ne quittent jamais** z620 — ffmpeg s'y exécute via SSH. - -Accès SSH depuis core : +SSH relay (depuis cosma-vm ou core) : .. code-block:: bash - ssh floppyrj45@192.168.0.168 + ssh ml-stack "ssh z620 \\"commande\\"" -Service systemd dispatcher ---------------------------- +OpenVPN — accès collègues +-------------------------- -Fichier de service : /etc/systemd/system/cosma-qc-dispatcher.service +Serveur OpenVPN sur cosma-vm (.83:1194 UDP). +Adresse externe : ``laboratoire.freeboxos.fr:1194`` -.. code-block:: ini +Profil client : ``cosma-qc-collegue1.ovpn`` (Nextcloud sync). - [Unit] - Description=COSMA QC Dispatcher - After=network.target - - [Service] - User=floppyrj45 - WorkingDirectory=/home/floppyrj45/docker/cosma-qc - ExecStart=/usr/bin/python3 app/dispatcher.py - Restart=on-failure - RestartSec=10 - - [Install] - WantedBy=multi-user.target - -Commandes de gestion : +Génération dun nouveau client : .. code-block:: bash - sudo systemctl start cosma-qc-dispatcher - sudo systemctl stop cosma-qc-dispatcher - sudo systemctl restart cosma-qc-dispatcher - sudo systemctl enable cosma-qc-dispatcher # démarrage auto - - -Conteneur Docker dashboard ---------------------------- - -Le dashboard FastAPI tourne dans un conteneur Docker. - -.. code-block:: bash - - cd /home/floppyrj45/docker/cosma-qc - docker compose up -d # démarrer - docker compose down # arrêter - docker compose logs -f # logs - -Accès : http://192.168.0.82:3849 + cd /home/cosma/openvpn-ca/easyrsa3 + ./easyrsa gen-req NOMCLIENT nopass + ./easyrsa sign-req client NOMCLIENT Ports réseau récapitulatifs @@ -160,12 +142,16 @@ Ports réseau récapitulatifs * - Host - Port - Service - * - .82 + * - .83 - 3849 - Dashboard FastAPI cosma-qc + * - .83 + - 1194/udp + - OpenVPN server * - .84 / .87 - 8100+N - - Viser viewer (reconstruction job N) + - Viser viewer (job N) * - .84 / .87 - 8300 - - HTTP server GLB export + - HTTP server GLB/PLY export + diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 2841519..8c92129 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -93,11 +93,11 @@
  • Infrastructure
  • diff --git a/docs/_build/html/infrastructure.html b/docs/_build/html/infrastructure.html index 5cd0572..43c4ec7 100644 --- a/docs/_build/html/infrastructure.html +++ b/docs/_build/html/infrastructure.html @@ -47,11 +47,11 @@
  • Pipeline cosma-qc
  • Infrastructure
  • @@ -87,44 +87,62 @@

    Infrastructure

    Réseau LAN — 192.168.0.0/24

    -
    ┌─────────────────────────────────────────────────────────┐
    -│                  LAN 192.168.0.0/24                     │
    -│                                                          │
    -│  .82  CORE       Dispatcher (systemd) + FastAPI :3849   │
    -│                  Gitea + Grafana + InfluxDB + Caddy      │
    -│                                                          │
    -│  .84  ml-stack   GPU worker  RTX 3090 24GB               │
    -│  .87  gpu        GPU worker  RTX 3060 12GB               │
    -│                                                          │
    -│  .168 z620       Proxmox host  HP Z620                   │
    -│                  SSD → /mnt/portablessd  (MP4 bruts)     │
    -└─────────────────────────────────────────────────────────┘
    +
    ┌───────────────────────────────────────────────────────────────┐
    +│                    LAN 192.168.0.0/24                         │
    +│                                                                │
    +│  .82  CORE       Gitea + Grafana + InfluxDB + Caddy            │
    +│                  Reverse-proxy → cosma-vm pour /cosma-qc       │
    +│                                                                │
    +│  .83  cosma-vm   Dispatcher cosma-qc (systemd)                 │
    +│                  Dashboard FastAPI :3849                        │
    +│                  OpenVPN server :1194 UDP                       │
    +│                                                                │
    +│  .84  ml-stack   GPU worker  RTX 3090 24GB                     │
    +│  .87  gpu        GPU worker  RTX 3060 12GB                     │
    +│                                                                │
    +│  .168 z620       Proxmox host HP Z620 — SSD MP4 bruts          │
    +│  .101 poxML      Proxmox hyperviseur — héberge cosma-vm (VM 202)│
    +└───────────────────────────────────────────────────────────────┘
    +
    +
    +
    +
    +

    Nœud cosma-vm (.83) — serveur principal cosma-qc

    +

    VM #202 sur Proxmox poxML (.101). 4 vCPU, 4 GB RAM, 40 GB SSD. +User : cosma (avec docker group et sudo).

    +

    Services :

    +
      +
    • Dispatchercosma-qc-dispatcher.service (systemd) +Lance les extractions ffmpeg sur les workers GPU.

    • +
    • Dashboard FastAPI — conteneur Docker cosma-qc-app, port 3849. +Accès via Caddy sur core : http://192.168.0.82/cosma-qc

    • +
    • OpenVPNopenvpn-server@cosma.service, port 1194 UDP. +Permet aux collègues daccéder au LAN depuis lextérieur.

    • +
    +

    Commandes utiles :

    +
    # SSH vers cosma-vm
    +ssh cosma@192.168.0.83
    +
    +# Statut dispatcher
    +sudo systemctl status cosma-qc-dispatcher
    +
    +# Logs dispatcher
    +tail -f /home/cosma/cosma-qc-data/dispatcher.log
    +
    +# Dashboard local
    +http://192.168.0.83:3849
     

    Nœud core (.82)

    -

    Rôle : orchestrateur central du pipeline.

    +

    Rôle : routeur et services communs.

    Services actifs :

      -
    • Dispatcher — service systemd cosma-qc-dispatcher. -Boucle principale qui dispatch les jobs aux workers GPU.

    • -
    • Dashboard FastAPI — conteneur Docker exposé sur le port 3849. -Interface web de monitoring des jobs.

    • -
    • Gitea — dépôt source floppyrj45/cosma-qc.

    • +
    • Caddy — reverse proxy HTTPS, route /cosma-qc vers .83:3849.

    • +
    • Gitea — dépôt source floppyrj45/cosma-qc.

    • Grafana / InfluxDB — monitoring infrastructure.

    -

    Commandes utiles :

    -
    # Statut dispatcher
    -sudo systemctl status cosma-qc-dispatcher
    -
    -# Logs dispatcher temps réel
    -sudo journalctl -u cosma-qc-dispatcher -f
    -
    -# Dashboard
    -http://192.168.0.82:3849
    -
    -

    Nœuds GPU workers (.84 et .87)

    @@ -137,7 +155,7 @@ http://192.168.0.82:3849

    IP

    -

    Nom

    +

    Nom SSH

    GPU

    VRAM

    @@ -155,69 +173,36 @@ http://192.168.0.82:3849 -

    Rôle : exécution de ffmpeg (extraction frames) et lingbot-map (reconstruction 3D).

    -

    Répertoire de travail sur chaque worker :

    +

    Rôle : exécution de ffmpeg et lingbot-map.

    /cosma-qc-frames/
    -├── job_1/
    -│   ├── frame_000001.jpg  …  frame_NNNNNN.jpg
    -│   ├── .video_0.done
    -│   ├── reconstruction.ply
    -│   └── reconstruction.glb   (généré à la demande)
    -├── job_2/
    -│   └── …
    -└── stitch_1.ply
    +└── job_N/
    +    ├── frame_NNNNNN.jpg
    +    ├── .video_V.done
    +    ├── reconstruction.ply
    +    └── reconstruction.glb
     
    -
    -

    Nœud z620 (.168)

    -

    Rôle : stockage des MP4 bruts GoPro.

    -
      -
    • Proxmox host HP Z620.

    • -
    • SSD monté sur /mnt/portablessd.

    • -
    • Les MP4 ne quittent jamais z620 — ffmpeg s’y exécute via SSH.

    • -
    -

    Accès SSH depuis core :

    -
    ssh floppyrj45@192.168.0.168
    +
    +

    Nœud z620 (.168) — stockage MP4

    +

    HP Z620 (Proxmox). SSD /mnt/portablessd avec les MP4 GoPro bruts. +Les MP4 ne quittent jamais z620 — ffmpeg sy exécute via SSH-relay.

    +

    SSH relay (depuis cosma-vm ou core) :

    +
    ssh ml-stack "ssh z620 \\"commande\\""
     
    -
    -

    Service systemd dispatcher

    -

    Fichier de service : /etc/systemd/system/cosma-qc-dispatcher.service

    -
    [Unit]
    -Description=COSMA QC Dispatcher
    -After=network.target
    -
    -[Service]
    -User=floppyrj45
    -WorkingDirectory=/home/floppyrj45/docker/cosma-qc
    -ExecStart=/usr/bin/python3 app/dispatcher.py
    -Restart=on-failure
    -RestartSec=10
    -
    -[Install]
    -WantedBy=multi-user.target
    +
    +

    OpenVPN — accès collègues

    +

    Serveur OpenVPN sur cosma-vm (.83:1194 UDP). +Adresse externe : laboratoire.freeboxos.fr:1194

    +

    Profil client : cosma-qc-collegue1.ovpn (Nextcloud sync).

    +

    Génération dun nouveau client :

    +
    cd /home/cosma/openvpn-ca/easyrsa3
    +./easyrsa gen-req NOMCLIENT nopass
    +./easyrsa sign-req client NOMCLIENT
     
    -

    Commandes de gestion :

    -
    sudo systemctl start cosma-qc-dispatcher
    -sudo systemctl stop cosma-qc-dispatcher
    -sudo systemctl restart cosma-qc-dispatcher
    -sudo systemctl enable cosma-qc-dispatcher   # démarrage auto
    -
    -
    -
    -
    -

    Conteneur Docker dashboard

    -

    Le dashboard FastAPI tourne dans un conteneur Docker.

    -
    cd /home/floppyrj45/docker/cosma-qc
    -docker compose up -d       # démarrer
    -docker compose down        # arrêter
    -docker compose logs -f     # logs
    -
    -
    -

    Accès : http://192.168.0.82:3849

    Ports réseau récapitulatifs

    @@ -234,17 +219,21 @@ docker compose logs -

    .82

    +

    .83

    3849

    Dashboard FastAPI cosma-qc

    -

    .84 / .87

    -

    8100+N

    -

    Viser viewer (reconstruction job N)

    +

    .83

    +

    1194/udp

    +

    OpenVPN server

    .84 / .87

    +

    8100+N

    +

    Viser viewer (job N)

    + +

    .84 / .87

    8300

    -

    HTTP server GLB export

    +

    HTTP server GLB/PLY export

    diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index af5f5e7..474e2bc 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles":{"Base de donn\u00e9es":[[4,"base-de-donnees"]],"Budget disque observ\u00e9":[[0,"budget-disque-observe"]],"Conteneur Docker dashboard":[[2,"conteneur-docker-dashboard"]],"Contenu":[[1,null]],"Dashboard web":[[4,"dashboard-web"]],"Donn\u00e9es \u2014 Stockage et budget disque":[[0,null]],"Export GLB":[[0,"export-glb"]],"Flux de donn\u00e9es global":[[3,"flux-de-donnees-global"]],"Frames JPEG":[[0,"frames-jpeg"]],"Infrastructure":[[2,null]],"Ing\u00e9rer une nouvelle acquisition":[[4,"ingerer-une-nouvelle-acquisition"]],"Logs dispatcher":[[4,"logs-dispatcher"]],"N\u0153ud core (.82)":[[2,"noeud-core-82"]],"N\u0153ud z620 (.168)":[[2,"noeud-z620-168"]],"N\u0153uds GPU workers (.84 et .87)":[[2,"noeuds-gpu-workers-84-et-87"]],"O\u00f9 sont stock\u00e9es les donn\u00e9es":[[0,"ou-sont-stockees-les-donnees"]],"PLY interm\u00e9diaires":[[0,"ply-intermediaires"]],"Pipeline cosma-qc":[[3,null]],"Politique de nettoyage":[[0,"politique-de-nettoyage"]],"Ports r\u00e9seau r\u00e9capitulatifs":[[2,"ports-reseau-recapitulatifs"]],"Red\u00e9marrer le pipeline complet":[[4,"redemarrer-le-pipeline-complet"]],"Relancer un job \u00e9chou\u00e9":[[4,"relancer-un-job-echoue"]],"Reprise sur crash \u2014 marqueurs .done":[[0,"reprise-sur-crash-marqueurs-done"]],"R\u00e9seau LAN \u2014 192.168.0.0/24":[[2,"reseau-lan-192-168-0-0-24"]],"Service systemd dispatcher":[[2,"service-systemd-dispatcher"]],"Statuts de jobs":[[3,"statuts-de-jobs"]],"Surveiller les jobs":[[4,"surveiller-les-jobs"]],"T\u00e9l\u00e9charger un GLB":[[4,"telecharger-un-glb"]],"Utilisation":[[4,null]],"Visualiser un nuage de points PLY":[[4,"visualiser-un-nuage-de-points-ply"]],"Vue d\u2019ensemble":[[3,"vue-d-ensemble"]],"V\u00e9rification espace disque":[[0,"verification-espace-disque"]],"V\u00e9rifications rapides post-mission":[[4,"verifications-rapides-post-mission"]],"cosma-qc \u2014 Documentation":[[1,null]],"\u00c9tape 1 \u2014 Ingest":[[3,"etape-1-ingest"]],"\u00c9tape 2 \u2014 Extraction des frames":[[3,"etape-2-extraction-des-frames"]],"\u00c9tape 3 \u2014 Reconstruction 3D":[[3,"etape-3-reconstruction-3d"]],"\u00c9tape 4 \u2014 Stitch par AUV":[[3,"etape-4-stitch-par-auv"]],"\u00c9tape 5 \u2014 Stitch cross-AUV":[[3,"etape-5-stitch-cross-auv"]],"\u00c9tape 6 \u2014 Export GLB (\u00e0 la demande)":[[3,"etape-6-export-glb-a-la-demande"]]},"docnames":["data","index","infrastructure","pipeline","usage"],"envversion":{"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","infrastructure.rst","pipeline.rst","usage.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"06d":3,"12gb":2,"1920x1080":0,"24gb":2,"3d":[1,2],"5_000_000":0,"5m":0,"After":2,"BY":4,"FROM":4,"WHERE":4,"absolu":3,"acc\u00e8":2,"acc\u00e9der":4,"acquis":3,"acquisit":1,"actif":2,"adapt\u00e9":3,"affich":4,"align":3,"all\u00e9g\u00e9":0,"api":[0,4],"app":2,"apr\u00e8":[0,3,4],"arr\u00eater":[2,4],"assign\u00e9":4,"assur":4,"attendr":4,"attent":3,"au":[3,4],"auto":2,"automatiqu":[0,3,4],"auv":[0,1,4],"auv009":4,"aux":2,"avant":0,"avec":[0,3,4],"base":[0,3],"bin":2,"boucl":2,"bruit":3,"brut":[0,2,3],"brute":3,"budget":1,"c":4,"caddi":2,"calcul":0,"cam\u00e9ra":3,"cas":[0,3],"cd":[2,4],"ce":3,"central":2,"chacun":0,"chaqu":[0,2,3,4],"charg":4,"chemin":3,"choic":0,"ciel":3,"close":4,"cloudcompar":4,"color":0,"command":2,"complet":1,"compl\u00e8t":[0,4],"compos":[2,4],"concern\u00e9":4,"conn":4,"connect":4,"conserv":0,"conserv\u00e9":0,"consommateur":0,"conteneur":1,"contr\u00f4l":1,"convers":3,"copi":3,"copier":4,"copi\u00e9":0,"core":[1,3,4],"cosma":[0,2,4],"count":4,"cour":[3,4],"crash":[1,3],"creat":3,"created_at":3,"cross":1,"cross_auv":3,"cr\u00e9\u00e9":3,"cr\u00e9\u00e9s":4,"curl":[0,4],"cycl":4,"d":[0,1,2,4],"dan":[2,3,4],"dashboard":[0,1],"db":[3,4],"de":[1,2],"demand":[0,1,2],"demo":3,"dens":3,"densit\u00e9":0,"depui":[0,2,3,4],"derni\u00e8r":4,"des":[0,1,2,4],"descript":[2,3],"dessus":3,"deux":3,"df":[0,4],"direct":3,"directori":[0,3,4],"dispatch":[1,3],"dispon":3,"disqu":[1,4],"do_extract":3,"do_reconstruct":3,"do_stitch_cross_auv":3,"do_stitch_per_auv":3,"docker":[1,4],"doit":4,"done":[1,2,3,4],"donn\u00e9":1,"dont":3,"drone":[1,3],"du":[0,2,3,4],"d\u00e9clenchement":3,"d\u00e9j\u00e0":[0,3],"d\u00e9marrag":2,"d\u00e9marrer":[2,4],"d\u00e9marr\u00e9":3,"d\u00e9pass":3,"d\u00e9pend":0,"d\u00e9p\u00f4t":2,"d\u00e9tient":3,"eau":3,"emplac":0,"en":[0,3,4],"enabl":2,"ensembl":1,"entr":3,"entr\u00e9":[0,3],"erreur":[3,4],"error":4,"espac":4,"est":[0,3],"et":[1,3,4],"etc":[2,4],"execstart":2,"execut":4,"export":[1,2],"export_glb":[0,4],"expos\u00e9":2,"extract":[0,1,2,4],"extrait":0,"ex\u00e9cut":[2,3],"f":[0,2,4],"fail":[3,4],"failur":2,"fals":0,"fastapi":2,"ffmpeg":[2,3],"fichier":[0,2,3],"file":3,"filtr":3,"filtrer":4,"fin":4,"final":[0,3],"floppyrj45":[0,2,4],"flux":1,"foi":0,"fonction":3,"forcer":[0,4],"form":3,"fps":[0,3],"frame":[1,2,4],"frame_":[0,3],"frame_000001":2,"frame_nnnnnn":2,"frames_dir":3,"fusion":[0,3],"gb":[0,2],"gestion":2,"gitea":2,"glb":[1,2],"global":[0,1,4],"gopro":[0,2,3,4],"gpu":[1,3],"grafana":2,"grep":4,"group\u00e9":3,"gx":3,"gxxx":3,"g\u00e9n\u00e8re":0,"g\u00e9n\u00e9ration":[0,4],"g\u00e9n\u00e9rer":4,"g\u00e9n\u00e9r\u00e9":[0,2],"h":[0,4],"head":0,"heuristiqu":3,"home":[2,4],"hor":[0,3],"host":2,"hp":2,"http":[0,2,3,4],"http8300":4,"id":[0,3,4],"idx":0,"ignor\u00e9":3,"il":4,"import":[0,4],"indiqu":3,"influxdb":2,"infrastructur":1,"ingest":[1,4],"ing\u00e9rer":1,"input":3,"instal":2,"intact":0,"integ":3,"inter":3,"interfac":2,"ip":2,"jamai":[0,2,3],"job":[0,1,2],"job_":[0,3,4],"job_1":2,"job_2":2,"job_21":0,"job_id":[0,3,4],"journalctl":[2,4],"jpeg":3,"jpg":[0,2,3],"json":3,"jusqu":3,"key":3,"l":[0,3,4],"la":[0,1,2,4],"lan":1,"lancer":[0,4],"lanc\u00e9":[3,4],"le":[0,1,2,3],"len":0,"les":[1,2,3],"lh":[0,4],"lien":4,"lign":[0,4],"lingbot":[2,3],"list":3,"load":0,"log":[2,3],"logiqu":3,"lorsqu":3,"ls":[0,4],"luminosit\u00e9":3,"m":[0,3,4],"manuell":0,"map":[2,3],"marin":[1,3],"marqueur":[1,3,4],"mb":0,"million":3,"min":0,"minim":3,"minut":[3,4],"mission":[0,1],"ml":2,"mnt":[0,2,3,4],"monitor":2,"mont\u00e9":2,"moyenn":3,"mp4":[0,2,3,4],"multi":2,"m\u00eame":3,"n":[0,2,3,4],"navigateur":3,"navigu":[3,4],"ne":[0,2,3],"nettoyag":1,"network":2,"nohup":4,"nom":2,"nouveau":3,"nouvell":1,"np":0,"nuag":[0,1,3],"null":4,"numpi":0,"num\u00e9ro":[3,4],"n\u00e9cessair":4,"n\u0153ud":1,"observ\u00e9":1,"ok":4,"op\u00e9rat":3,"orchestrateur":2,"order":4,"ou":[3,4],"outil":3,"ouvrir":4,"o\u00f9":1,"par":[0,1,4],"param\u00e8tr":3,"particularit\u00e9":3,"pas":3,"path":[3,4],"pc":[0,3,4],"pend":[3,4],"pendant":[3,4],"per_auv":[0,3],"permettr":0,"peut":4,"peuvent":0,"pipelin":[1,2],"pkill":4,"pli":[1,2,3],"point":[0,1,3],"pointcloud":0,"politiqu":1,"port":[1,3],"portablessd":[0,2,3,4],"post":[0,1],"pour":[0,1,3,4],"prend":4,"prendr":4,"primari":3,"principal":2,"print":4,"prochain":4,"produir":3,"progress":4,"proxmox":2,"pr\u00e9sent":4,"py":[2,3,4],"python3":[0,2,3,4],"q":3,"qc":[0,2,4],"qualit\u00e9":1,"quand":3,"que":[0,3,4],"quelqu":4,"qui":[2,3],"quittent":[0,2,3],"random":0,"rapid":1,"reconstruct":[0,1,2,4],"red\u00e9marr":1,"red\u00e9marrag":3,"regroup":3,"relanc":1,"remarqu":0,"remettr":4,"remplac":4,"replac":0,"reprend":4,"repris":[1,3],"restart":[2,4],"restartsec":2,"retourn":4,"rf":0,"rh":0,"rm":[0,4],"row":4,"rtx":2,"run":[3,4],"r\u00e9":[0,4],"r\u00e9capitulatif":1,"r\u00e9duit":3,"r\u00e9el":[2,3,4],"r\u00e9pertoir":[2,3],"r\u00e9seau":[1,3],"r\u00f4le":[2,3],"s":[2,3,4],"saut":0,"sauvegard\u00e9":0,"scale":3,"scanner":3,"scp":4,"script":[3,4],"sc\u00e8ne":0,"segment":[0,3,4],"select":4,"selon":4,"server":[0,2,3,4],"serveur":[0,3,4],"servic":1,"set":4,"seuil":3,"seul":3,"sh":0,"si":[3,4],"somm":0,"sont":[1,3,4],"sort":0,"sorti":3,"sourc":[2,3],"sous":[1,3],"sqlite":3,"sqlite3":4,"ssd":[2,3,4],"ssh":[0,2,3,4],"stack":2,"start":[2,4],"status":[2,3,4],"statut":[1,2,4],"stitch":[0,1],"stitch_":[0,3],"stitch_1":2,"stitch_glob":[0,3],"stockag":[1,2],"stock\u00e9":[1,3],"stop":[2,4],"structur":3,"sub":0,"succ\u00e8":0,"sudo":[2,4],"suppress":0,"supprim":[0,4],"supprim\u00e9":[0,3],"sur":[1,2,3,4],"surfac":3,"surveil":1,"system":2,"systemctl":[2,4],"systemd":1,"tabl":3,"taill":[0,4],"target":2,"temp":[2,3,4],"temporel":3,"termin\u00e9":3,"text":3,"timestamp":3,"tmp":4,"top":0,"total":0,"tourn":2,"tous":[0,3,4],"tout":0,"trait":3,"traitement":3,"trait\u00e9":[0,3],"travail":2,"trimesh":[0,3],"type":0,"typiqu":0,"t\u00e9l\u00e9chargement":[0,3,4],"t\u00e9l\u00e9charger":[0,1,3],"t\u00e9l\u00e9charg\u00e9":4,"u":[2,4],"un":[0,1,2,3],"une":[0,1],"uniqu":0,"unit":2,"updat":4,"updated_at":[3,4],"user":2,"usr":2,"util":2,"utilis":1,"v":3,"valid":0,"valid\u00e9":[0,3],"variabl":0,"ver":[3,4],"version":0,"vertic":0,"vf":3,"via":[0,2,3,4],"video_":[0,4],"video_0":[0,2],"video_1":0,"video_n":3,"vid\u00e9o":[0,1,3],"viewer":[2,3,4],"viser":[2,3,4],"visualis":[0,1,3],"visuel":0,"voir":3,"voyag":3,"vram":2,"vue":1,"v\u00e9rific":1,"v\u00e9rifier":[0,4],"wantedbi":2,"web":[0,2,3],"wget":[0,3,4],"worker":[0,1,3,4],"worker_frames_dir":3,"worker_ip":3,"workingdirectori":2,"x":[0,4],"y":2,"yml":4,"z620":[0,1,3,4],"\u00e0":[0,1,2,4],"\u00e9cart":3,"\u00e9chantillonnag":3,"\u00e9chou\u00e9":1,"\u00e9crire":3,"\u00e9tape":1,"\u00e9tat":4,"\u00eatre":0},"titles":["Donn\u00e9es \u2014 Stockage et budget disque","cosma-qc \u2014 Documentation","Infrastructure","Pipeline cosma-qc","Utilisation"],"titleterms":{"3d":3,"acquisit":4,"auv":3,"base":4,"budget":0,"complet":4,"conteneur":2,"contenu":1,"core":2,"cosma":[1,3],"crash":0,"cross":3,"d":3,"dashboard":[2,4],"de":[0,3,4],"demand":3,"des":3,"dispatch":[2,4],"disqu":0,"docker":2,"document":1,"done":0,"donn\u00e9":[0,3,4],"ensembl":3,"espac":0,"et":[0,2],"export":[0,3],"extract":3,"flux":3,"frame":[0,3],"glb":[0,3,4],"global":3,"gpu":2,"infrastructur":2,"ingest":3,"ing\u00e9rer":4,"interm\u00e9diair":0,"job":[3,4],"jpeg":0,"la":3,"lan":2,"le":4,"les":[0,4],"log":4,"marqueur":0,"mission":4,"nettoyag":0,"nouvell":4,"nuag":4,"n\u0153ud":2,"observ\u00e9":0,"o\u00f9":0,"par":3,"pipelin":[3,4],"pli":[0,4],"point":4,"politiqu":0,"port":2,"post":4,"qc":[1,3],"rapid":4,"reconstruct":3,"red\u00e9marr":4,"relanc":4,"repris":0,"r\u00e9capitulatif":2,"r\u00e9seau":2,"servic":2,"sont":0,"statut":3,"stitch":3,"stockag":0,"stock\u00e9":0,"sur":0,"surveil":4,"systemd":2,"t\u00e9l\u00e9charger":4,"un":4,"une":4,"utilis":4,"visualis":4,"vue":3,"v\u00e9rific":[0,4],"web":4,"worker":2,"z620":2,"\u00e0":3,"\u00e9chou\u00e9":4,"\u00e9tape":3}}) \ No newline at end of file +Search.setIndex({"alltitles":{"Base de donn\u00e9es":[[4,"base-de-donnees"]],"Budget disque observ\u00e9":[[0,"budget-disque-observe"]],"Contenu":[[1,null]],"Dashboard web":[[4,"dashboard-web"]],"Donn\u00e9es \u2014 Stockage et budget disque":[[0,null]],"Export GLB":[[0,"export-glb"]],"Flux de donn\u00e9es global":[[3,"flux-de-donnees-global"]],"Frames JPEG":[[0,"frames-jpeg"]],"Infrastructure":[[2,null]],"Ing\u00e9rer une nouvelle acquisition":[[4,"ingerer-une-nouvelle-acquisition"]],"Logs dispatcher":[[4,"logs-dispatcher"]],"N\u0153ud core (.82)":[[2,"noeud-core-82"]],"N\u0153ud cosma-vm (.83) \u2014 serveur principal cosma-qc":[[2,"noeud-cosma-vm-83-serveur-principal-cosma-qc"]],"N\u0153ud z620 (.168) \u2014 stockage MP4":[[2,"noeud-z620-168-stockage-mp4"]],"N\u0153uds GPU workers (.84 et .87)":[[2,"noeuds-gpu-workers-84-et-87"]],"OpenVPN \u2014 acc\u00e8s coll\u00e8gues":[[2,"openvpn-acces-collegues"]],"O\u00f9 sont stock\u00e9es les donn\u00e9es":[[0,"ou-sont-stockees-les-donnees"]],"PLY interm\u00e9diaires":[[0,"ply-intermediaires"]],"Pipeline cosma-qc":[[3,null]],"Politique de nettoyage":[[0,"politique-de-nettoyage"]],"Ports r\u00e9seau r\u00e9capitulatifs":[[2,"ports-reseau-recapitulatifs"]],"Red\u00e9marrer le pipeline complet":[[4,"redemarrer-le-pipeline-complet"]],"Relancer un job \u00e9chou\u00e9":[[4,"relancer-un-job-echoue"]],"Reprise sur crash \u2014 marqueurs .done":[[0,"reprise-sur-crash-marqueurs-done"]],"R\u00e9seau LAN \u2014 192.168.0.0/24":[[2,"reseau-lan-192-168-0-0-24"]],"Statuts de jobs":[[3,"statuts-de-jobs"]],"Surveiller les jobs":[[4,"surveiller-les-jobs"]],"T\u00e9l\u00e9charger un GLB":[[4,"telecharger-un-glb"]],"Utilisation":[[4,null]],"Visualiser un nuage de points PLY":[[4,"visualiser-un-nuage-de-points-ply"]],"Vue d\u2019ensemble":[[3,"vue-d-ensemble"]],"V\u00e9rification espace disque":[[0,"verification-espace-disque"]],"V\u00e9rifications rapides post-mission":[[4,"verifications-rapides-post-mission"]],"cosma-qc \u2014 Documentation":[[1,null]],"\u00c9tape 1 \u2014 Ingest":[[3,"etape-1-ingest"]],"\u00c9tape 2 \u2014 Extraction des frames":[[3,"etape-2-extraction-des-frames"]],"\u00c9tape 3 \u2014 Reconstruction 3D":[[3,"etape-3-reconstruction-3d"]],"\u00c9tape 4 \u2014 Stitch par AUV":[[3,"etape-4-stitch-par-auv"]],"\u00c9tape 5 \u2014 Stitch cross-AUV":[[3,"etape-5-stitch-cross-auv"]],"\u00c9tape 6 \u2014 Export GLB (\u00e0 la demande)":[[3,"etape-6-export-glb-a-la-demande"]]},"docnames":["data","index","infrastructure","pipeline","usage"],"envversion":{"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","infrastructure.rst","pipeline.rst","usage.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"06d":3,"12gb":2,"1920x1080":0,"24gb":2,"3d":1,"5_000_000":0,"5m":0,"After":[],"BY":4,"FROM":4,"WHERE":4,"absolu":3,"acc\u00e8":1,"acc\u00e9der":4,"acquis":3,"acquisit":1,"actif":2,"adapt\u00e9":3,"adress":2,"affich":4,"align":3,"all\u00e9g\u00e9":0,"api":[0,4],"app":2,"apr\u00e8":[0,3,4],"arr\u00eater":4,"assign\u00e9":4,"assur":4,"attendr":4,"attent":3,"au":[2,3,4],"auto":[],"automatiqu":[0,3,4],"auv":[0,1,4],"auv009":4,"aux":2,"avant":0,"avec":[0,2,3,4],"base":[0,3],"bin":[],"boucl":[],"bruit":3,"brut":[0,2,3],"brute":3,"budget":1,"c":4,"ca":2,"caddi":2,"calcul":0,"cam\u00e9ra":3,"cas":[0,3],"cd":[2,4],"ce":3,"central":[],"chacun":0,"chaqu":[0,3,4],"charg":4,"chemin":3,"choic":0,"ciel":3,"client":2,"close":4,"cloudcompar":4,"collegue1":2,"coll\u00e8gu":1,"color":0,"command":2,"commun":2,"complet":1,"compl\u00e8t":[0,4],"compos":4,"concern\u00e9":4,"conn":4,"connect":4,"conserv":0,"conserv\u00e9":0,"consommateur":0,"conteneur":2,"contr\u00f4l":1,"convers":3,"copi":3,"copier":4,"copi\u00e9":0,"core":[1,3,4],"cosma":[0,4],"count":4,"cour":[3,4],"crash":[1,3],"creat":3,"created_at":3,"cross":1,"cross_auv":3,"cr\u00e9\u00e9":3,"cr\u00e9\u00e9s":4,"curl":[0,4],"cycl":4,"d":[0,1,4],"dacc\u00e9der":2,"dan":[3,4],"dashboard":[0,2],"data":2,"db":[3,4],"de":[1,2],"demand":[0,1],"demo":3,"dens":3,"densit\u00e9":0,"depui":[0,2,3,4],"derni\u00e8r":4,"des":[0,1,4],"descript":3,"dessus":3,"deux":3,"df":[0,4],"direct":3,"directori":[0,3,4],"dispatch":[2,3],"dispon":3,"disqu":[1,4],"do_extract":3,"do_reconstruct":3,"do_stitch_cross_auv":3,"do_stitch_per_auv":3,"docker":[2,4],"doit":4,"done":[1,2,3,4],"donn\u00e9":1,"dont":3,"drone":[1,3],"du":[0,3,4],"dun":2,"d\u00e9clenchement":3,"d\u00e9j\u00e0":[0,3],"d\u00e9marrag":[],"d\u00e9marrer":4,"d\u00e9marr\u00e9":3,"d\u00e9pass":3,"d\u00e9pend":0,"d\u00e9p\u00f4t":2,"d\u00e9tient":3,"easyrsa":2,"easyrsa3":2,"eau":3,"emplac":0,"en":[0,3,4],"enabl":[],"ensembl":1,"entr":3,"entr\u00e9":[0,3],"erreur":[3,4],"error":4,"espac":4,"est":[0,3],"et":[1,3,4],"etc":4,"execstart":[],"execut":4,"export":[1,2],"export_glb":[0,4],"expos\u00e9":[],"extern":2,"extract":[0,1,2,4],"extrait":0,"ex\u00e9cut":[2,3],"f":[0,2,4],"fail":[3,4],"failur":[],"fals":0,"fastapi":2,"ffmpeg":[2,3],"fichier":[0,3],"file":3,"filtr":3,"filtrer":4,"fin":4,"final":[0,3],"floppyrj45":[0,2,4],"flux":1,"foi":0,"fonction":3,"forcer":[0,4],"form":3,"fps":[0,3],"fr":2,"frame":[1,2,4],"frame_":[0,3],"frame_000001":[],"frame_nnnnnn":2,"frames_dir":3,"freeboxo":2,"fusion":[0,3],"gb":[0,2],"gen":2,"gestion":[],"gitea":2,"glb":[1,2],"global":[0,1,4],"gopro":[0,2,3,4],"gpu":[1,3],"grafana":2,"grep":4,"group":2,"group\u00e9":3,"gx":3,"gxxx":3,"g\u00e9n\u00e8re":0,"g\u00e9n\u00e9ration":[0,2,4],"g\u00e9n\u00e9rer":4,"g\u00e9n\u00e9r\u00e9":0,"h":[0,4],"head":0,"heuristiqu":3,"home":[2,4],"hor":[0,3],"host":2,"hp":2,"http":[0,2,3,4],"http8300":4,"https":2,"hyperviseur":2,"h\u00e9berg":2,"id":[0,3,4],"idx":0,"ignor\u00e9":3,"il":4,"import":[0,4],"indiqu":3,"influxdb":2,"infrastructur":1,"ingest":[1,4],"ing\u00e9rer":1,"input":3,"instal":[],"intact":0,"integ":3,"inter":3,"interfac":[],"ip":2,"jamai":[0,2,3],"job":[0,1,2],"job_":[0,3,4],"job_1":[],"job_2":[],"job_21":0,"job_id":[0,3,4],"job_n":2,"journalctl":4,"jpeg":3,"jpg":[0,2,3],"json":3,"jusqu":3,"key":3,"l":[0,3,4],"la":[0,1,4],"laboratoir":2,"lan":1,"lanc":2,"lancer":[0,4],"lanc\u00e9":[3,4],"le":[0,1,3],"len":0,"les":[1,2,3],"lext\u00e9rieur":2,"lh":[0,4],"lien":4,"lign":[0,4],"lingbot":[2,3],"list":3,"load":0,"local":2,"log":[2,3],"logiqu":3,"lorsqu":3,"ls":[0,4],"luminosit\u00e9":3,"m":[0,3,4],"manuell":0,"map":[2,3],"marin":[1,3],"marqueur":[1,3,4],"mb":0,"million":3,"min":0,"minim":3,"minut":[3,4],"mission":[0,1],"ml":2,"mnt":[0,2,3,4],"monitor":2,"mont\u00e9":[],"moyenn":3,"mp4":[0,1,3,4],"multi":[],"m\u00eame":3,"n":[0,2,3,4],"navigateur":3,"navigu":[3,4],"ne":[0,2,3],"nettoyag":1,"network":[],"nextcloud":2,"nohup":4,"nom":2,"nomclient":2,"nopass":2,"nouveau":[2,3],"nouvell":1,"np":0,"nuag":[0,1,3],"null":4,"numpi":0,"num\u00e9ro":[3,4],"n\u00e9cessair":4,"n\u0153ud":1,"observ\u00e9":1,"ok":4,"openvpn":1,"op\u00e9rat":3,"orchestrateur":[],"order":4,"ou":[2,3,4],"outil":3,"ouvrir":4,"ovpn":2,"o\u00f9":1,"par":[0,1,4],"param\u00e8tr":3,"particularit\u00e9":3,"pas":3,"path":[3,4],"pc":[0,3,4],"pend":[3,4],"pendant":[3,4],"per_auv":[0,3],"permet":2,"permettr":0,"peut":4,"peuvent":0,"pipelin":1,"pkill":4,"pli":[1,2,3],"point":[0,1,3],"pointcloud":0,"politiqu":1,"port":[1,3],"portablessd":[0,2,3,4],"post":[0,1],"pour":[0,1,2,3,4],"poxml":2,"prend":4,"prendr":4,"primari":3,"princip":1,"principal":[],"print":4,"prochain":4,"produir":3,"profil":2,"progress":4,"proxi":2,"proxmox":2,"pr\u00e9sent":4,"py":[3,4],"python3":[0,3,4],"q":3,"qc":[0,4],"qualit\u00e9":1,"quand":3,"que":[0,3,4],"quelqu":4,"qui":3,"quittent":[0,2,3],"ram":2,"random":0,"rapid":1,"reconstruct":[0,1,2,4],"red\u00e9marr":1,"red\u00e9marrag":3,"regroup":3,"relanc":1,"relay":2,"remarqu":0,"remettr":4,"remplac":4,"replac":0,"reprend":4,"repris":[1,3],"req":2,"restart":4,"restartsec":[],"retourn":4,"revers":2,"rf":0,"rh":0,"rm":[0,4],"rout":2,"routeur":2,"row":4,"rtx":2,"run":[3,4],"r\u00e9":[0,4],"r\u00e9capitulatif":1,"r\u00e9duit":3,"r\u00e9el":[3,4],"r\u00e9pertoir":3,"r\u00e9seau":[1,3],"r\u00f4le":[2,3],"s":[3,4],"saut":0,"sauvegard\u00e9":0,"scale":3,"scanner":3,"scp":4,"script":[3,4],"sc\u00e8ne":0,"segment":[0,3,4],"select":4,"selon":4,"server":[0,2,3,4],"serveur":[0,1,3,4],"servic":2,"set":4,"seuil":3,"seul":3,"sh":0,"si":[3,4],"sign":2,"somm":0,"sont":[1,3,4],"sort":0,"sorti":3,"sourc":[2,3],"sous":[1,3],"sqlite":3,"sqlite3":4,"ssd":[2,3,4],"ssh":[0,2,3,4],"stack":2,"start":4,"status":[2,3,4],"statut":[1,2,4],"stitch":[0,1],"stitch_":[0,3],"stitch_1":[],"stitch_glob":[0,3],"stockag":1,"stock\u00e9":[1,3],"stop":4,"structur":3,"sub":0,"succ\u00e8":0,"sudo":[2,4],"suppress":0,"supprim":[0,4],"supprim\u00e9":[0,3],"sur":[1,2,3,4],"surfac":3,"surveil":1,"sy":2,"sync":2,"system":[],"systemctl":[2,4],"systemd":2,"tabl":3,"tail":2,"taill":[0,4],"target":[],"temp":[3,4],"temporel":3,"termin\u00e9":3,"text":3,"timestamp":3,"tmp":4,"top":0,"total":0,"tourn":[],"tous":[0,3,4],"tout":0,"trait":3,"traitement":3,"trait\u00e9":[0,3],"travail":[],"trimesh":[0,3],"type":0,"typiqu":0,"t\u00e9l\u00e9chargement":[0,3,4],"t\u00e9l\u00e9charger":[0,1,3],"t\u00e9l\u00e9charg\u00e9":4,"u":4,"udp":2,"un":[0,1,3],"une":[0,1],"uniqu":0,"unit":[],"updat":4,"updated_at":[3,4],"user":2,"usr":[],"util":2,"utilis":1,"v":3,"valid":0,"valid\u00e9":[0,3],"variabl":0,"vcpu":2,"ver":[2,3,4],"version":0,"vertic":0,"vf":3,"via":[0,2,3,4],"video_":[0,4],"video_0":0,"video_1":0,"video_n":3,"video_v":2,"vid\u00e9o":[0,1,3],"viewer":[2,3,4],"viser":[2,3,4],"visualis":[0,1,3],"visuel":0,"vm":1,"voir":3,"voyag":3,"vram":2,"vue":1,"v\u00e9rific":1,"v\u00e9rifier":[0,4],"wantedbi":[],"web":[0,3],"wget":[0,3,4],"worker":[0,1,3,4],"worker_frames_dir":3,"worker_ip":3,"workingdirectori":[],"x":[0,4],"y":[],"yml":4,"z620":[0,1,3,4],"\u00e0":[0,1,4],"\u00e9cart":3,"\u00e9chantillonnag":3,"\u00e9chou\u00e9":1,"\u00e9crire":3,"\u00e9tape":1,"\u00e9tat":4,"\u00eatre":0},"titles":["Donn\u00e9es \u2014 Stockage et budget disque","cosma-qc \u2014 Documentation","Infrastructure","Pipeline cosma-qc","Utilisation"],"titleterms":{"3d":3,"acc\u00e8":2,"acquisit":4,"auv":3,"base":4,"budget":0,"coll\u00e8gu":2,"complet":4,"conteneur":[],"contenu":1,"core":2,"cosma":[1,2,3],"crash":0,"cross":3,"d":3,"dashboard":4,"de":[0,3,4],"demand":3,"des":3,"dispatch":4,"disqu":0,"docker":[],"document":1,"done":0,"donn\u00e9":[0,3,4],"ensembl":3,"espac":0,"et":[0,2],"export":[0,3],"extract":3,"flux":3,"frame":[0,3],"glb":[0,3,4],"global":3,"gpu":2,"infrastructur":2,"ingest":3,"ing\u00e9rer":4,"interm\u00e9diair":0,"job":[3,4],"jpeg":0,"la":3,"lan":2,"le":4,"les":[0,4],"log":4,"marqueur":0,"mission":4,"mp4":2,"nettoyag":0,"nouvell":4,"nuag":4,"n\u0153ud":2,"observ\u00e9":0,"openvpn":2,"o\u00f9":0,"par":3,"pipelin":[3,4],"pli":[0,4],"point":4,"politiqu":0,"port":2,"post":4,"princip":2,"qc":[1,2,3],"rapid":4,"reconstruct":3,"red\u00e9marr":4,"relanc":4,"repris":0,"r\u00e9capitulatif":2,"r\u00e9seau":2,"serveur":2,"servic":[],"sont":0,"statut":3,"stitch":3,"stockag":[0,2],"stock\u00e9":0,"sur":0,"surveil":4,"systemd":[],"t\u00e9l\u00e9charger":4,"un":4,"une":4,"utilis":4,"visualis":4,"vm":2,"vue":3,"v\u00e9rific":[0,4],"web":4,"worker":2,"z620":2,"\u00e0":3,"\u00e9chou\u00e9":4,"\u00e9tape":3}}) \ No newline at end of file diff --git a/docs/infrastructure.rst b/docs/infrastructure.rst index 2e3cc58..ea9738d 100644 --- a/docs/infrastructure.rst +++ b/docs/infrastructure.rst @@ -6,49 +6,68 @@ Réseau LAN — 192.168.0.0/24 .. code-block:: text - ┌─────────────────────────────────────────────────────────┐ - │ LAN 192.168.0.0/24 │ - │ │ - │ .82 CORE Dispatcher (systemd) + FastAPI :3849 │ - │ Gitea + Grafana + InfluxDB + Caddy │ - │ │ - │ .84 ml-stack GPU worker RTX 3090 24GB │ - │ .87 gpu GPU worker RTX 3060 12GB │ - │ │ - │ .168 z620 Proxmox host HP Z620 │ - │ SSD → /mnt/portablessd (MP4 bruts) │ - └─────────────────────────────────────────────────────────┘ + ┌───────────────────────────────────────────────────────────────┐ + │ LAN 192.168.0.0/24 │ + │ │ + │ .82 CORE Gitea + Grafana + InfluxDB + Caddy │ + │ Reverse-proxy → cosma-vm pour /cosma-qc │ + │ │ + │ .83 cosma-vm Dispatcher cosma-qc (systemd) │ + │ Dashboard FastAPI :3849 │ + │ OpenVPN server :1194 UDP │ + │ │ + │ .84 ml-stack GPU worker RTX 3090 24GB │ + │ .87 gpu GPU worker RTX 3060 12GB │ + │ │ + │ .168 z620 Proxmox host HP Z620 — SSD MP4 bruts │ + │ .101 poxML Proxmox hyperviseur — héberge cosma-vm (VM 202)│ + └───────────────────────────────────────────────────────────────┘ -Nœud core (.82) ----------------- +Nœud cosma-vm (.83) — serveur principal cosma-qc +-------------------------------------------------- -**Rôle :** orchestrateur central du pipeline. +VM #202 sur Proxmox poxML (.101). 4 vCPU, 4 GB RAM, 40 GB SSD. +User : ``cosma`` (avec docker group et sudo). -Services actifs : +Services : -- **Dispatcher** — service systemd cosma-qc-dispatcher. - Boucle principale qui dispatch les jobs aux workers GPU. +- **Dispatcher** — ``cosma-qc-dispatcher.service`` (systemd) + Lance les extractions ffmpeg sur les workers GPU. -- **Dashboard FastAPI** — conteneur Docker exposé sur le port **3849**. - Interface web de monitoring des jobs. +- **Dashboard FastAPI** — conteneur Docker ``cosma-qc-app``, port **3849**. + Accès via Caddy sur core : ``http://192.168.0.82/cosma-qc`` -- **Gitea** — dépôt source floppyrj45/cosma-qc. - -- **Grafana / InfluxDB** — monitoring infrastructure. +- **OpenVPN** — ``openvpn-server@cosma.service``, port 1194 UDP. + Permet aux collègues daccéder au LAN depuis lextérieur. Commandes utiles : .. code-block:: bash + # SSH vers cosma-vm + ssh cosma@192.168.0.83 + # Statut dispatcher sudo systemctl status cosma-qc-dispatcher - # Logs dispatcher temps réel - sudo journalctl -u cosma-qc-dispatcher -f + # Logs dispatcher + tail -f /home/cosma/cosma-qc-data/dispatcher.log - # Dashboard - http://192.168.0.82:3849 + # Dashboard local + http://192.168.0.83:3849 + + +Nœud core (.82) +---------------- + +**Rôle :** routeur et services communs. + +Services actifs : + +- **Caddy** — reverse proxy HTTPS, route ``/cosma-qc`` vers .83:3849. +- **Gitea** — dépôt source ``floppyrj45/cosma-qc``. +- **Grafana / InfluxDB** — monitoring infrastructure. Nœuds GPU workers (.84 et .87) @@ -59,7 +78,7 @@ Nœuds GPU workers (.84 et .87) :widths: 15 25 20 40 * - IP - - Nom + - Nom SSH - GPU - VRAM * - .84 @@ -71,83 +90,46 @@ Nœuds GPU workers (.84 et .87) - RTX 3060 - 12 GB -**Rôle :** exécution de ffmpeg (extraction frames) et lingbot-map (reconstruction 3D). - -Répertoire de travail sur chaque worker : +**Rôle :** exécution de ffmpeg et lingbot-map. .. code-block:: text /cosma-qc-frames/ - ├── job_1/ - │ ├── frame_000001.jpg … frame_NNNNNN.jpg - │ ├── .video_0.done - │ ├── reconstruction.ply - │ └── reconstruction.glb (généré à la demande) - ├── job_2/ - │ └── … - └── stitch_1.ply + └── job_N/ + ├── frame_NNNNNN.jpg + ├── .video_V.done + ├── reconstruction.ply + └── reconstruction.glb -Nœud z620 (.168) ------------------ +Nœud z620 (.168) — stockage MP4 +---------------------------------- -**Rôle :** stockage des MP4 bruts GoPro. +HP Z620 (Proxmox). SSD /mnt/portablessd avec les MP4 GoPro bruts. +Les MP4 **ne quittent jamais** z620 — ffmpeg sy exécute via SSH-relay. -- Proxmox host HP Z620. -- SSD monté sur /mnt/portablessd. -- Les MP4 **ne quittent jamais** z620 — ffmpeg s'y exécute via SSH. - -Accès SSH depuis core : +SSH relay (depuis cosma-vm ou core) : .. code-block:: bash - ssh floppyrj45@192.168.0.168 + ssh ml-stack "ssh z620 \\"commande\\"" -Service systemd dispatcher ---------------------------- +OpenVPN — accès collègues +-------------------------- -Fichier de service : /etc/systemd/system/cosma-qc-dispatcher.service +Serveur OpenVPN sur cosma-vm (.83:1194 UDP). +Adresse externe : ``laboratoire.freeboxos.fr:1194`` -.. code-block:: ini +Profil client : ``cosma-qc-collegue1.ovpn`` (Nextcloud sync). - [Unit] - Description=COSMA QC Dispatcher - After=network.target - - [Service] - User=floppyrj45 - WorkingDirectory=/home/floppyrj45/docker/cosma-qc - ExecStart=/usr/bin/python3 app/dispatcher.py - Restart=on-failure - RestartSec=10 - - [Install] - WantedBy=multi-user.target - -Commandes de gestion : +Génération dun nouveau client : .. code-block:: bash - sudo systemctl start cosma-qc-dispatcher - sudo systemctl stop cosma-qc-dispatcher - sudo systemctl restart cosma-qc-dispatcher - sudo systemctl enable cosma-qc-dispatcher # démarrage auto - - -Conteneur Docker dashboard ---------------------------- - -Le dashboard FastAPI tourne dans un conteneur Docker. - -.. code-block:: bash - - cd /home/floppyrj45/docker/cosma-qc - docker compose up -d # démarrer - docker compose down # arrêter - docker compose logs -f # logs - -Accès : http://192.168.0.82:3849 + cd /home/cosma/openvpn-ca/easyrsa3 + ./easyrsa gen-req NOMCLIENT nopass + ./easyrsa sign-req client NOMCLIENT Ports réseau récapitulatifs @@ -160,12 +142,16 @@ Ports réseau récapitulatifs * - Host - Port - Service - * - .82 + * - .83 - 3849 - Dashboard FastAPI cosma-qc + * - .83 + - 1194/udp + - OpenVPN server * - .84 / .87 - 8100+N - - Viser viewer (reconstruction job N) + - Viser viewer (job N) * - .84 / .87 - 8300 - - HTTP server GLB export + - HTTP server GLB/PLY export + diff --git a/scripts/__pycache__/dispatcher.cpython-311.pyc b/scripts/__pycache__/dispatcher.cpython-311.pyc index 88ee68dcc3ddfbd67fd7964d5aef409c9196e58c..792aa4952e118876233b735ffaafb0ec59ebcbc1 100644 GIT binary patch delta 5577 zcma)A2~=Fyd46~1z1diXVHuVY@L0vLBP1lD1tGBv2yGxmhR7Zdb007;0(9qrB=p8e zj-sPFij91o1|J_(>?l~Nkfn5F7oRNEX>w|v9M>JxIWCz7SGC)tDzzKZI60~7r2X$3 zRw>&(!*~Dt-~ayqUB0_K-uad0-E-R5*JEN#9HhXppLz<UJXHxLcR@xJOTN3d>Xeyz5|co zFG9W(pTWl>L>IKIvASsZ+~w0_0kbL%(<*gs*cLDQK7@%?g^Nuf``*@1%wIZBh`O z{ic=vdQbe}W6;>I@oN>0!eKsj(F?~#dgzN*^}?fi!Yf*=>(aDw&`Q5j`wE8*vOs@( zA#L;(ZbFNV%*1XQ`LI=zhe*HZ64?+$BDt`u(<_Ocr$xC(5>F10K8c8~ek`8skw8O4 zk1Tq8qBPhe9hZp9E4p3o9;wu15+NNVQkO)CgjH|VBK8o;EvsI|E;4YO`5YB}JuWaQ zlTOJJ=?4!!d4RaOCDGHhI;PvzFZv|V%B8CB2A9{{>2mi~gFUl$iQWM>YfaqF!qR;Q zH;V3o!PDYE|0*YumgE{t9{CXiFUO5?L}X$nKm*AJ91+Txlf!l``5vqJK7)GzcAm5| zd5*!~Gk6cc#{;m@l6VlpHX`{3yu*?+GFQ$BA$$Wv#4VA328#v+ZJq<+EVmHN8EC@p zs?oWqgt6iAzEE=Ey{N)qRN=LrnfyD}@0Q*xbp%Tta|yQbBV#qe=Sht3F`UznQykB3AfH*m7rLn>THPz;fnwn|j6fpn#^40<4m{rD{f)vdZ zY^3Y(7fEnz!2s;0{p!Mw7-Y#OizQtmVLnE5qUduEibHJp;)fSr6xEd<(Uz8$jtEdw zEq)7;T~KM)kCOe6lfPgv$>0P7#so6XAP8XBMd+Xs;~$y!Ck#FS2pfP!uo>KaJ{=Sp zMV3gCCiVM<$nWOJhhWh-(Sa&1#*2rwZ?oh#QD6k)2Kg-vL_<9iLdCOSg zc-Lg_EMF1gD}qZum4CFku|N|t(K~Tz^!dhx(KV~4!BNxEYuB}o8`C~nq@HpHzY)jC zu`v3@1T>13Bk|Q_{Y$%idWlN?dYh`pe zQ%S@k{rEr%?@y9*=$!+pM-r7JoTV6`%h`$^Fh@xQ%$?9r=S{)+d7Yi1YC@c1!BOfQ zT0qJlfvtn177vTZAr46M@?Q7LtlSy#R<{&Fzc09>ivpTHua$Y&#k8l*7*>BeuM&^<};m%1<@h8Y-OEI8t z#fniKPYUL63H{$K8T_+I&ZNx;GI%A16sZ%YE+mSk&$Ng^F9WI+Lf3$ve&*k!!j`c26bux{jw5TZ;4puY@N_fS3lOr)f2Xj_8h9M|HE;& zD`^mKhhhWVsjLI6nK1s2*g&nAbxN9Io8A?n5sjU;#^c)6lY)1vo2`&`wVG@GaM(R+ zs5&Jb0@nY&!R~;;s&);3e5h-?48&lZZL~Gw+G)q5lcZ?j(rTjKw$@noF5&DbEWp!- z$n^Vd`Ly`(CkFM+GNP%bDMwyM9|!Inc?;DWrT!uI@RFslw&7q~SZLbU=sX(99O`?6 zunUFMFgVR%FN0SB!rJ4We)T4!-#xlDM!nqr4)pd6@)7;b(WWXryj`5&K8%LLn&Gan z9^QoPjYgL5xv&-wk+4xZ<&m9T9sr^4dO-9Sj)U2d$MA( z>ss$j@m=lRx_6DUhSrdwHE3uJyw|Y~q5A=J>>p6Yef5?!Hlg`w^O$bzOeiiVnAdni zn(mt^oGq;nmDWQMezVbzP_!c$?FfAK zJx=^R)=7_9Tfy48XdU;6@8o6c$jixZqE)VnvXn)09Zp@kr}`~Q6i!>#+m`hLUPu4j zRe{p!6<0F-7gq+#puct5;YhyX%4fSqRPV$r#RPJ;5)GK6!~o{14Jr@CC*-O3M!t&c z6%EuC(5cQ$i(R!YR9hBJ2-C&%ebAOHA1a(;#--C`^xVz_n(9uBSyh9}m%O72cI492 z?w+y@{-k!UpFhc+(zbIak&@(Vl#M{P#RQMU)gCHo94^b*sKh~kHYxFNv{rptvl1J$ zn-wc)x6s+0S!G+HwP{UlH5>N??@w0XUQ~2lY-?@XPjVp|c|iXPpU3uNFZ}H<3*N0! zw_10lnvAb^ zu`i4tx}5P+#zoyl-JCITOulEd1&y{pv1YEQihkh9MfQNU_Zdy%JGMLr;_jkoN1XPq z83DQxb?rzDe9QYiUh{yXub#=E7fw`Y1Wn-W6Gf=#Q|NM7z(dCeed;^cZY1peNj5V0 zh*j!b?h{TACY99eJ1p#iVf;MM<9kPkHU!E?1`ygrC(pE^^?_fUNkY~wY$A;0{Whe6m8>T5kLc%@;?a3VxgEfcNC%xBx8<|*Rz1`S zqZna}voZ#923pxoaH@YYo)f1=$z}#>C^r>f&Juc{d^XVVa)5_^el}5nw$hv{CBg|% zUkMz!(yE1Ny!Ps75?dbPWsQ$B=w~oMx4)L7o^Chc3(Hpvy0hFoefrAAz&BotLWl%z zenUXQDbW8-;O(o;DC-l}A3kh$_DFEQbxJPT2_OA~VI6$3`Xrg0qPbIrf*%_ED9|=_ z8R-^S*a!5duQykcG!|1GypFJLN50C`1yjGu*s75P7D1!(mbhv6wJc#2OoM^1UULX2 zOy9o|hJE?%H)>66KqDHl09gI`8(WH=1*Oh`43j9W!*mwQiN7){s@a4*19kzpRr-MJ}-N zeyY2bCA*;c9!lE8{X&iwc8uo{*QHKkO6zFMqVSoX3}R2{)fRBSceTx^+n-ylIu*@!gS`k z`i9ygEr*>)547&BZ*7ZgZSE gHk7--tpz3U@!QSFVlg?=xx48}jwxmC{KBbiaZP=6%n}$EF#F|lNj=COdR77 zn;9X;PPCcL7?UA7U`G3yM4KjU+G)(BX@!Kz(2Y(tlT1otGTNre^p8$^?zaM>ZTii( zzw@}~o^$T`&b=2td`f-wdzJZBlPOrh=SKakCuwNZY$qL~DZ`}o;)OQVq1`m`h^9G- zCLIx)lU0H{c?>Pbxw-NXfws{-H2sLSIfb^~z%biNI*P{)kG#9mL)J^k{ zrqd3(8fgaYq-&9`pj~tw(oE{11xT}KVRJU^rp3swqAb;}1{ zJq;0!a|sB-3j#HY=0&ne47*?U>AVI>jdo_A${Vb3p`uj~;NQm_YPB~6uGKn77#v?6 z1y9sk;C8ho%@95Bz-yF@)Ua306>Ohqn;#IU<(`+A2pTRCYF(Iw!6M+@i&hc^cOQw4 zwMiNpIfQjU#Q8WHB?Tec=h86fCZfl1d|U-ZTccX_5|Kj2Fyy!rmWL#Q=vWA?j4SqY zIR*ap~^O$1Xf+U$lBf!?|xEM*Gnnf8qBn{@Y#HaO|X)G^?)jUQp z2mA#d99?>^OyMMsbJ2!}EaDX}PQ|XKHr%@Gp*RVA%=VCPpV=F#e2PS6?(RB^ohJFz zfwIh{KmUm z1@3N7PnN>5Qv&TydTpX>ZlWM`&-V>o0jKISNG4D7zZ5tN?$*b`%7z5h=_t4uzATJ6 z7kxeq*N_M!r_GvPg0Wv{a9Oh-s_;s55*2IrTE*;z6ljj5$935yI~8aygluyL>Z9^% zl)@>W{N4@-(_p{x-nBM#*`7gsuJXw}5l2P-70 z8w6J^G&I$N+>{)q%^YCutwVazJs`$sbi~8gn_^=$1MU0cSr2|o_5s3>DnI@lVa3S8 zOw+e;ZO0h7B@Z^gK`PW0wGDpl#x0et+XJMEeZ;5rb2!Oil0y-P$2e?4@M}H2)P0b> z#Ci2TPcQWET&sT%CD&3m18?r!xQ-0^Rf8S=p#5#4=w`j_V{WR)OxwHM?R))ddVu*2 z?t>n&wZqfn_N(@E`hx~Nw6*uZK3LWAO0WUXx(fUad<~zsj9O+));mI;b~m}J;4p#b zccmSgu`ipnt;hHL(#vGZl|Svu56Hv8H>{B(gD3Y+N2N}t*S>z>(&N9$pITiry}AZP ze5b5+)7HAl`i5!iwqgBDh;^j@Six|?4Wnf;yuw#_);Z-!pLV39fbWG>my<6Q26)6N zW9785a?)7YaKjimGH^2Y#AA~wJI}UXs5{qn*>bK21$-|z1?V4_PB!hB+Sok3u{ofa zG`36`Tc(XI$lNeSpLCvVJl#BH%$hc4O&YW0JG+*Us5^SW8vT6wbLl7hM>9`ko-UaR zPZ|!Ikxjd=k<@?a1cPz7Vr1R4F>cbi;e66W+J)|^)RO7c5)|>B(w9x^%O>?@vT4sY z6={S$bQV5#XJ&@)RZdW*qt=~xIC_m!qLL~Kg!c-Jl}7c|5Q5lFpuZqOp6GvDqq;7@ z_2Wz7nZaz;---OI!8Af<;jfP_G0$LBzpkylztuxo3WOirrp?7Df06edys9I~a?YVX zLR|3a@i_SHlR3mDfB&S7M5d#O%fL?IWR}Z4s0Kuq1<4komvs+ydxhwU!^7Q!^gky zlRv?0a!D}HX-E~n99#9D@|u!I(aNuBW1R!+AhMk}iqFj=R*n)YMcyy4G|nd@9N_`_Ul`f+qJcojdLA8ru?C0