v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
603
docs/guides/BUILD_DEPLOY_GUIDE.md
Normal file
603
docs/guides/BUILD_DEPLOY_GUIDE.md
Normal file
@@ -0,0 +1,603 @@
|
||||
# Guide Build & Déploiement - Agent V0 + Serveur
|
||||
|
||||
**Date:** 24 novembre 2025
|
||||
|
||||
## 📋 Vue d'Ensemble
|
||||
|
||||
Ce guide explique comment:
|
||||
1. **Builder les exécutables** Windows/macOS/Linux
|
||||
2. **Déployer le serveur API** pour recevoir les uploads
|
||||
3. **Tester end-to-end** agent → serveur
|
||||
|
||||
---
|
||||
|
||||
## 🔨 Part 1: Build des Exécutables
|
||||
|
||||
### Prérequis
|
||||
|
||||
**Tous OS:**
|
||||
- Python 3.10+
|
||||
- pip
|
||||
- Git (pour cloner le projet)
|
||||
|
||||
**Windows:**
|
||||
- Visual Studio Build Tools (pour cryptography)
|
||||
- Ou: Installer via `pip install cryptography` (binaires pré-compilés)
|
||||
|
||||
**macOS:**
|
||||
- Xcode Command Line Tools: `xcode-select --install`
|
||||
|
||||
**Linux:**
|
||||
- `sudo apt-get install python3-dev libssl-dev`
|
||||
|
||||
### 1.1 Build Windows (.exe)
|
||||
|
||||
**Sur une machine Windows:**
|
||||
|
||||
```cmd
|
||||
cd agent_v0
|
||||
|
||||
REM Méthode 1: Script automatique
|
||||
build_windows.bat
|
||||
|
||||
REM Méthode 2: Manuel
|
||||
python -m venv .venv
|
||||
.venv\Scripts\activate
|
||||
pip install -r requirements.txt
|
||||
pip install pyinstaller pywin32
|
||||
pyinstaller agent_v0.spec --clean --noconfirm
|
||||
```
|
||||
|
||||
**Résultat:**
|
||||
```
|
||||
dist/agent_v0.exe (~50-80 MB)
|
||||
```
|
||||
|
||||
**Test:**
|
||||
```cmd
|
||||
dist\agent_v0.exe
|
||||
```
|
||||
|
||||
### 1.2 Build macOS (.app)
|
||||
|
||||
**Sur une machine macOS:**
|
||||
|
||||
```bash
|
||||
cd agent_v0
|
||||
|
||||
# Méthode 1: Script automatique
|
||||
./build_macos.sh
|
||||
|
||||
# Méthode 2: Manuel
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
pip install pyinstaller pyobjc-framework-Cocoa
|
||||
pyinstaller agent_v0.spec --clean --noconfirm
|
||||
```
|
||||
|
||||
**Résultat:**
|
||||
```
|
||||
dist/agent_v0.app/ (~60-90 MB)
|
||||
```
|
||||
|
||||
**Test:**
|
||||
```bash
|
||||
open dist/agent_v0.app
|
||||
```
|
||||
|
||||
**⚠️ Permissions macOS:**
|
||||
|
||||
Première exécution → macOS demandera les permissions:
|
||||
1. System Preferences > Security & Privacy > Privacy
|
||||
2. Accessibility → Cocher `agent_v0`
|
||||
3. Screen Recording → Cocher `agent_v0`
|
||||
|
||||
### 1.3 Build Linux (binaire)
|
||||
|
||||
**Sur une machine Linux:**
|
||||
|
||||
```bash
|
||||
cd agent_v0
|
||||
|
||||
# Méthode 1: Script automatique
|
||||
./build_linux.sh
|
||||
|
||||
# Méthode 2: Manuel
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
pip install pyinstaller
|
||||
pyinstaller agent_v0.spec --clean --noconfirm
|
||||
```
|
||||
|
||||
**Résultat:**
|
||||
```
|
||||
dist/agent_v0 (~60-90 MB)
|
||||
```
|
||||
|
||||
**Test:**
|
||||
```bash
|
||||
./dist/agent_v0
|
||||
```
|
||||
|
||||
**⚠️ Dépendances Linux:**
|
||||
```bash
|
||||
sudo apt-get install xdotool # Pour détection fenêtre active
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Part 2: Déploiement Serveur
|
||||
|
||||
### 2.1 Installation Serveur
|
||||
|
||||
**Sur le serveur Linux (où tourne RPA Vision V3):**
|
||||
|
||||
```bash
|
||||
cd /path/to/rpa_vision_v3
|
||||
|
||||
# Installer dépendances serveur
|
||||
pip install -r server/requirements_server.txt
|
||||
|
||||
# Ou manuellement:
|
||||
pip install fastapi uvicorn[standard] python-multipart cryptography
|
||||
```
|
||||
|
||||
### 2.2 Configuration
|
||||
|
||||
**Définir le password de chiffrement:**
|
||||
|
||||
```bash
|
||||
# Option 1: Variable d'environnement
|
||||
export ENCRYPTION_PASSWORD="VotreCléSecrète2025"
|
||||
|
||||
# Option 2: Fichier .env
|
||||
echo 'ENCRYPTION_PASSWORD="VotreCléSecrète2025"' > server/.env
|
||||
|
||||
# Option 3: Hardcoder dans api_upload.py (pas recommandé)
|
||||
# ENCRYPTION_PASSWORD = "VotreCléSecrète2025"
|
||||
```
|
||||
|
||||
**⚠️ Important:** Utiliser le **même password** que dans `agent_config.json` des agents!
|
||||
|
||||
### 2.3 Démarrage Serveur
|
||||
|
||||
**Méthode 1: Script automatique**
|
||||
```bash
|
||||
cd server
|
||||
./start_server.sh
|
||||
```
|
||||
|
||||
**Méthode 2: Uvicorn direct**
|
||||
```bash
|
||||
cd server
|
||||
uvicorn api_upload:app --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
**Méthode 3: Production avec systemd**
|
||||
|
||||
Créer `/etc/systemd/system/rpa-api.service`:
|
||||
```ini
|
||||
[Unit]
|
||||
Description=RPA Vision V3 - API Upload
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=rpa
|
||||
WorkingDirectory=/path/to/rpa_vision_v3/server
|
||||
Environment="ENCRYPTION_PASSWORD=VotreCléSecrète2025"
|
||||
ExecStart=/path/to/venv/bin/uvicorn api_upload:app --host 0.0.0.0 --port 8000
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Activer:
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable rpa-api
|
||||
sudo systemctl start rpa-api
|
||||
sudo systemctl status rpa-api
|
||||
```
|
||||
|
||||
### 2.4 Vérification Serveur
|
||||
|
||||
**Test status:**
|
||||
```bash
|
||||
curl http://localhost:8000/api/traces/status
|
||||
```
|
||||
|
||||
**Réponse attendue:**
|
||||
```json
|
||||
{
|
||||
"status": "online",
|
||||
"version": "1.0.0",
|
||||
"upload_dir": "data/training/uploads",
|
||||
"sessions_dir": "data/training/sessions",
|
||||
"encryption_enabled": true
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Part 3: Configuration Agent → Serveur
|
||||
|
||||
### 3.1 Configurer URL Serveur
|
||||
|
||||
**Sur chaque agent (Windows/macOS/Linux):**
|
||||
|
||||
Éditer `agent_config.json`:
|
||||
```json
|
||||
{
|
||||
"enable_encryption": true,
|
||||
"encryption_password": "VotreCléSecrète2025",
|
||||
"server_url": "https://votre-serveur.com/api/traces/upload"
|
||||
}
|
||||
```
|
||||
|
||||
**⚠️ Important:**
|
||||
- Utiliser **HTTPS** en production (pas HTTP)
|
||||
- Même `encryption_password` que le serveur
|
||||
- URL complète avec `/api/traces/upload`
|
||||
|
||||
### 3.2 Mettre à Jour config.py
|
||||
|
||||
**Dans `agent_v0/config.py`:**
|
||||
|
||||
```python
|
||||
# Avant (placeholder)
|
||||
SERVER_URL = "https://example.com/api/traces/upload"
|
||||
|
||||
# Après (production)
|
||||
SERVER_URL = "https://votre-serveur.com/api/traces/upload"
|
||||
```
|
||||
|
||||
**Ou:** Lire depuis `agent_config.json` (recommandé):
|
||||
|
||||
```python
|
||||
# config.py
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
config_file = Path(__file__).parent / "agent_config.json"
|
||||
if config_file.exists():
|
||||
with open(config_file) as f:
|
||||
config = json.load(f)
|
||||
SERVER_URL = config.get("server_url", "https://example.com/api/traces/upload")
|
||||
else:
|
||||
SERVER_URL = "https://example.com/api/traces/upload"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Part 4: Test End-to-End
|
||||
|
||||
### 4.1 Test Local (même machine)
|
||||
|
||||
**Terminal 1: Démarrer serveur**
|
||||
```bash
|
||||
cd server
|
||||
./start_server.sh
|
||||
```
|
||||
|
||||
**Terminal 2: Tester agent**
|
||||
```bash
|
||||
cd agent_v0
|
||||
|
||||
# Configurer pour local
|
||||
echo '{
|
||||
"user_id": "test_user",
|
||||
"enable_encryption": true,
|
||||
"encryption_password": "test_password_123",
|
||||
"server_url": "http://localhost:8000/api/traces/upload"
|
||||
}' > agent_config.json
|
||||
|
||||
# Lancer agent
|
||||
python main.py
|
||||
|
||||
# Ou exécutable:
|
||||
./dist/agent_v0 # Linux
|
||||
open dist/agent_v0.app # macOS
|
||||
dist\agent_v0.exe # Windows
|
||||
```
|
||||
|
||||
**Actions:**
|
||||
1. Clic gauche sur icône tray → Start session
|
||||
2. Faire quelques clics dans des applications
|
||||
3. Clic gauche sur icône tray → Stop session
|
||||
4. Vérifier upload dans logs
|
||||
|
||||
**Terminal 3: Vérifier réception**
|
||||
```bash
|
||||
curl http://localhost:8000/api/traces/sessions
|
||||
```
|
||||
|
||||
### 4.2 Test Production (réseau)
|
||||
|
||||
**Serveur:**
|
||||
```bash
|
||||
# Démarrer sur IP publique
|
||||
cd server
|
||||
export ENCRYPTION_PASSWORD="VotreCléSecrète2025"
|
||||
uvicorn api_upload:app --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
**Agent (machine distante):**
|
||||
```json
|
||||
{
|
||||
"encryption_password": "VotreCléSecrète2025",
|
||||
"server_url": "https://votre-serveur.com/api/traces/upload"
|
||||
}
|
||||
```
|
||||
|
||||
**Test upload manuel:**
|
||||
```bash
|
||||
# Créer une session test
|
||||
cd agent_v0
|
||||
python main.py
|
||||
# Start → quelques clics → Stop
|
||||
|
||||
# Vérifier fichier créé
|
||||
ls -lh sessions/*.enc
|
||||
|
||||
# Upload manuel avec curl
|
||||
curl -X POST \
|
||||
-F "file=@sessions/sess_xxx.enc" \
|
||||
-F "session_id=sess_xxx" \
|
||||
https://votre-serveur.com/api/traces/upload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 Part 5: Distribution aux Formateurs
|
||||
|
||||
### 5.1 Package Windows
|
||||
|
||||
**Créer installeur NSIS (optionnel):**
|
||||
|
||||
```nsis
|
||||
; installer.nsi
|
||||
!include "MUI2.nsh"
|
||||
|
||||
Name "Agent V0"
|
||||
OutFile "agent_v0_installer.exe"
|
||||
InstallDir "$PROGRAMFILES\AgentV0"
|
||||
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
|
||||
Section "Install"
|
||||
SetOutPath "$INSTDIR"
|
||||
File "dist\agent_v0.exe"
|
||||
File "agent_config.json"
|
||||
|
||||
CreateShortcut "$DESKTOP\Agent V0.lnk" "$INSTDIR\agent_v0.exe"
|
||||
CreateShortcut "$SMPROGRAMS\Agent V0.lnk" "$INSTDIR\agent_v0.exe"
|
||||
SectionEnd
|
||||
```
|
||||
|
||||
Compiler:
|
||||
```cmd
|
||||
makensis installer.nsi
|
||||
```
|
||||
|
||||
### 5.2 Package macOS
|
||||
|
||||
**Créer DMG:**
|
||||
```bash
|
||||
# Installer create-dmg
|
||||
brew install create-dmg
|
||||
|
||||
# Créer DMG
|
||||
create-dmg \
|
||||
--volname "Agent V0" \
|
||||
--window-pos 200 120 \
|
||||
--window-size 600 400 \
|
||||
--icon-size 100 \
|
||||
--icon "agent_v0.app" 175 120 \
|
||||
--app-drop-link 425 120 \
|
||||
"agent_v0_installer.dmg" \
|
||||
"dist/agent_v0.app"
|
||||
```
|
||||
|
||||
### 5.3 Package Linux
|
||||
|
||||
**Créer .deb:**
|
||||
```bash
|
||||
# Structure
|
||||
mkdir -p agent_v0_deb/DEBIAN
|
||||
mkdir -p agent_v0_deb/usr/local/bin
|
||||
mkdir -p agent_v0_deb/usr/share/applications
|
||||
|
||||
# Control file
|
||||
cat > agent_v0_deb/DEBIAN/control << EOF
|
||||
Package: agent-v0
|
||||
Version: 0.1.0
|
||||
Architecture: amd64
|
||||
Maintainer: RPA Vision <contact@rpavision.com>
|
||||
Description: Agent d'enregistrement pour RPA Vision V3
|
||||
Depends: xdotool
|
||||
EOF
|
||||
|
||||
# Copier binaire
|
||||
cp dist/agent_v0 agent_v0_deb/usr/local/bin/
|
||||
|
||||
# Desktop entry
|
||||
cat > agent_v0_deb/usr/share/applications/agent_v0.desktop << EOF
|
||||
[Desktop Entry]
|
||||
Name=Agent V0
|
||||
Exec=/usr/local/bin/agent_v0
|
||||
Type=Application
|
||||
Categories=Utility;
|
||||
EOF
|
||||
|
||||
# Build
|
||||
dpkg-deb --build agent_v0_deb
|
||||
mv agent_v0_deb.deb agent_v0_0.1.0_amd64.deb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Part 6: Sécurité Production
|
||||
|
||||
### 6.1 HTTPS (Obligatoire)
|
||||
|
||||
**Avec Nginx + Let's Encrypt:**
|
||||
|
||||
```nginx
|
||||
# /etc/nginx/sites-available/rpa-api
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name votre-serveur.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/votre-serveur.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/votre-serveur.com/privkey.pem;
|
||||
|
||||
location /api/traces/ {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
client_max_body_size 100M; # Pour gros uploads
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 Firewall
|
||||
|
||||
```bash
|
||||
# Autoriser seulement HTTPS
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw deny 8000/tcp # Bloquer accès direct à uvicorn
|
||||
```
|
||||
|
||||
### 6.3 Authentification (Optionnel)
|
||||
|
||||
**Ajouter API key:**
|
||||
|
||||
```python
|
||||
# api_upload.py
|
||||
from fastapi import Header, HTTPException
|
||||
|
||||
API_KEY = os.getenv("API_KEY", "changeme")
|
||||
|
||||
@app.post("/api/traces/upload")
|
||||
async def upload_session(
|
||||
file: UploadFile,
|
||||
session_id: str,
|
||||
x_api_key: str = Header(...)
|
||||
):
|
||||
if x_api_key != API_KEY:
|
||||
raise HTTPException(status_code=401, detail="Invalid API key")
|
||||
# ...
|
||||
```
|
||||
|
||||
**Agent:**
|
||||
```python
|
||||
# uploader.py
|
||||
headers = {"X-API-Key": "votre_api_key"}
|
||||
resp = requests.post(SERVER_URL, files=files, data=data, headers=headers)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Part 7: Monitoring
|
||||
|
||||
### 7.1 Logs Serveur
|
||||
|
||||
```bash
|
||||
# Logs en temps réel
|
||||
tail -f /var/log/rpa-api.log
|
||||
|
||||
# Ou avec systemd
|
||||
journalctl -u rpa-api -f
|
||||
```
|
||||
|
||||
### 7.2 Statistiques
|
||||
|
||||
**Endpoint stats (à ajouter):**
|
||||
```python
|
||||
@app.get("/api/traces/stats")
|
||||
async def get_stats():
|
||||
return {
|
||||
"total_sessions": len(list(SESSIONS_DIR.iterdir())),
|
||||
"total_uploads": len(list(UPLOAD_DIR.glob("*.enc"))),
|
||||
"disk_usage_mb": sum(f.stat().st_size for f in SESSIONS_DIR.rglob("*")) / 1024 / 1024
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Checklist Déploiement
|
||||
|
||||
### Agent
|
||||
- [ ] Build exécutables (Windows/macOS/Linux)
|
||||
- [ ] Tester sur chaque OS
|
||||
- [ ] Configurer `server_url` production
|
||||
- [ ] Configurer `encryption_password`
|
||||
- [ ] Créer installeurs (optionnel)
|
||||
- [ ] Distribuer aux formateurs
|
||||
|
||||
### Serveur
|
||||
- [ ] Installer dépendances
|
||||
- [ ] Configurer `ENCRYPTION_PASSWORD`
|
||||
- [ ] Démarrer serveur (systemd)
|
||||
- [ ] Configurer HTTPS (Nginx)
|
||||
- [ ] Configurer firewall
|
||||
- [ ] Tester endpoint `/api/traces/status`
|
||||
- [ ] Configurer monitoring
|
||||
|
||||
### Test End-to-End
|
||||
- [ ] Agent → Upload → Serveur
|
||||
- [ ] Vérifier déchiffrement
|
||||
- [ ] Vérifier extraction ZIP
|
||||
- [ ] Vérifier chargement RawSession
|
||||
- [ ] Vérifier logs
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Troubleshooting
|
||||
|
||||
### Agent ne démarre pas
|
||||
|
||||
**Windows:**
|
||||
- Antivirus bloque → Ajouter exception
|
||||
- DLL manquantes → Installer Visual C++ Redistributable
|
||||
|
||||
**macOS:**
|
||||
- Permissions refusées → Activer Accessibility + Screen Recording
|
||||
- "App is damaged" → `xattr -cr agent_v0.app`
|
||||
|
||||
**Linux:**
|
||||
- `xdotool` manquant → `sudo apt-get install xdotool`
|
||||
|
||||
### Upload échoue
|
||||
|
||||
- Vérifier `server_url` dans config
|
||||
- Vérifier serveur accessible: `curl https://votre-serveur.com/api/traces/status`
|
||||
- Vérifier firewall
|
||||
- Vérifier logs serveur
|
||||
|
||||
### Déchiffrement échoue
|
||||
|
||||
- Vérifier même `encryption_password` agent/serveur
|
||||
- Vérifier fichier .enc pas corrompu
|
||||
- Vérifier version `cryptography` identique
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support
|
||||
|
||||
**Problèmes?**
|
||||
- Logs agent: `agent_v0/logs/agent_v0.log`
|
||||
- Logs serveur: `journalctl -u rpa-api`
|
||||
- GitHub Issues: [lien]
|
||||
|
||||
---
|
||||
|
||||
**Build et déploiement terminés!** 🎉
|
||||
|
||||
Les formateurs peuvent maintenant enregistrer leurs workflows et alimenter le système RPA Vision V3.
|
||||
Reference in New Issue
Block a user