Complete implementation ready for Coolify: - Node.js 22 + Fastify + socket.io backend - PostgreSQL 16 + Redis 7 services - Docker Compose configuration - Deployment scripts and documentation Co-Authored-By: Paperclip <noreply@paperclip.ing>
348 lines
8.1 KiB
Markdown
348 lines
8.1 KiB
Markdown
# Déploiement LAN Manuel — Phase 1
|
|
|
|
Guide de déploiement manuel d'AgentHub sur le serveur LAN `192.168.9.23` sans script automatique.
|
|
|
|
## Prérequis
|
|
|
|
- Serveur Ubuntu 22.04/24.04 LTS à `192.168.9.23`
|
|
- Accès SSH ou accès physique au serveur
|
|
- Docker et Docker Compose installés sur le serveur
|
|
|
|
## Méthode 1 : Script Automatique (Recommandé)
|
|
|
|
Si vous avez accès SSH au serveur :
|
|
|
|
```bash
|
|
# Depuis ce workspace
|
|
./agenthub/scripts/deploy-lan.sh 192.168.9.23
|
|
|
|
# Ou avec un user SSH spécifique
|
|
./agenthub/scripts/deploy-lan.sh 192.168.9.23 ubuntu
|
|
```
|
|
|
|
Le script fait tout automatiquement (7 étapes) et affiche le statut final.
|
|
|
|
## Méthode 2 : Déploiement Manuel
|
|
|
|
Si le script SSH ne fonctionne pas, suivez ces étapes manuelles :
|
|
|
|
### Étape 1 : Préparer l'archive
|
|
|
|
Sur votre poste local (workspace Paperclip) :
|
|
|
|
```bash
|
|
cd /home/alexandre/.paperclip/instances/default/workspaces/8780faf8-03bb-45e9-989e-167eeb438b58/agenthub
|
|
|
|
# Créer une archive de déploiement
|
|
tar czf /tmp/agenthub-deploy.tar.gz \
|
|
Dockerfile \
|
|
.dockerignore \
|
|
package.json \
|
|
package-lock.json \
|
|
tsconfig.json \
|
|
tsconfig.build.json \
|
|
src/ \
|
|
drizzle/ \
|
|
drizzle.config.ts \
|
|
scripts/migrate.ts \
|
|
scripts/seed.ts \
|
|
compose.lan-direct.yml \
|
|
.env.lan
|
|
|
|
echo "✅ Archive créée : /tmp/agenthub-deploy.tar.gz"
|
|
ls -lh /tmp/agenthub-deploy.tar.gz
|
|
```
|
|
|
|
### Étape 2 : Copier sur le serveur
|
|
|
|
**Option A : Via SCP (si SSH fonctionne)**
|
|
|
|
```bash
|
|
# Copier l'archive
|
|
scp /tmp/agenthub-deploy.tar.gz alexandre@192.168.9.23:/tmp/
|
|
|
|
# Ou avec un autre user
|
|
scp /tmp/agenthub-deploy.tar.gz ubuntu@192.168.9.23:/tmp/
|
|
```
|
|
|
|
**Option B : Via clé USB (si pas de SSH)**
|
|
|
|
1. Copier `/tmp/agenthub-deploy.tar.gz` sur une clé USB
|
|
2. Brancher la clé USB sur le serveur `192.168.9.23`
|
|
3. Monter la clé et copier l'archive : `cp /media/usb/agenthub-deploy.tar.gz /tmp/`
|
|
|
|
### Étape 3 : Installer sur le serveur
|
|
|
|
Connectez-vous au serveur (SSH ou console physique) et exécutez :
|
|
|
|
```bash
|
|
# Se connecter au serveur
|
|
ssh alexandre@192.168.9.23
|
|
# Ou accès physique direct
|
|
|
|
# Créer le répertoire d'installation
|
|
sudo mkdir -p /opt/agenthub
|
|
sudo chown $USER:$USER /opt/agenthub
|
|
cd /opt/agenthub
|
|
|
|
# Extraire l'archive
|
|
tar xzf /tmp/agenthub-deploy.tar.gz
|
|
rm /tmp/agenthub-deploy.tar.gz
|
|
|
|
# Vérifier les fichiers
|
|
ls -la
|
|
# Vous devriez voir : Dockerfile, src/, compose.lan-direct.yml, .env.lan, etc.
|
|
```
|
|
|
|
### Étape 4 : Installer Docker (si pas déjà fait)
|
|
|
|
```bash
|
|
# Vérifier si Docker est installé
|
|
docker --version
|
|
docker compose version
|
|
|
|
# Si pas installé :
|
|
curl -fsSL https://get.docker.com | sudo sh
|
|
sudo usermod -aG docker $USER
|
|
|
|
# Déconnectez-vous et reconnectez-vous pour que le groupe docker soit actif
|
|
exit
|
|
# Reconnectez-vous
|
|
ssh alexandre@192.168.9.23
|
|
```
|
|
|
|
### Étape 5 : Démarrer AgentHub
|
|
|
|
```bash
|
|
cd /opt/agenthub
|
|
|
|
# Démarrer la stack (build + run)
|
|
docker compose -f compose.lan-direct.yml up -d --build
|
|
|
|
# Suivre les logs
|
|
docker compose -f compose.lan-direct.yml logs -f
|
|
|
|
# Attendre que tous les services démarrent
|
|
# Vous devriez voir des logs comme :
|
|
# ✅ Database connected
|
|
# 🚀 Server listening on http://0.0.0.0:3000
|
|
```
|
|
|
|
### Étape 6 : Vérifier le déploiement
|
|
|
|
```bash
|
|
# Health check local (sur le serveur)
|
|
curl http://localhost:3000/healthz
|
|
# Devrait retourner : {"status":"ok","uptime":...}
|
|
|
|
# Readiness check (vérifie aussi la BDD)
|
|
curl http://localhost:3000/readyz
|
|
# Devrait retourner : {"status":"ready"}
|
|
|
|
# Voir les services Docker
|
|
docker compose -f compose.lan-direct.yml ps
|
|
|
|
# Devrait afficher :
|
|
# NAME STATUS PORTS
|
|
# agenthub-app Up (healthy) 0.0.0.0:3000->3000/tcp
|
|
# agenthub-postgres Up (healthy) 5432/tcp
|
|
# agenthub-redis Up 6379/tcp
|
|
```
|
|
|
|
### Étape 7 : Tester depuis un autre poste du LAN
|
|
|
|
Depuis votre poste de travail (ou un autre poste sur le même réseau LAN) :
|
|
|
|
```bash
|
|
# Health check via LAN
|
|
curl http://192.168.9.23:3000/healthz
|
|
|
|
# Devrait retourner : {"status":"ok","uptime":...}
|
|
```
|
|
|
|
### Étape 8 : Configurer le firewall (UFW)
|
|
|
|
Sur le serveur, configurer UFW pour sécuriser l'accès :
|
|
|
|
```bash
|
|
# Activer UFW
|
|
sudo ufw --force enable
|
|
|
|
# Autoriser SSH depuis le LAN (adapter le subnet)
|
|
sudo ufw allow from 192.168.9.0/24 to any port 22 proto tcp comment 'SSH from LAN'
|
|
|
|
# Autoriser AgentHub depuis le LAN
|
|
sudo ufw allow from 192.168.9.0/24 to any port 3000 proto tcp comment 'AgentHub HTTP/WS from LAN'
|
|
|
|
# Deny par défaut
|
|
sudo ufw default deny incoming
|
|
sudo ufw default allow outgoing
|
|
|
|
# Vérifier
|
|
sudo ufw status verbose
|
|
```
|
|
|
|
## Opérations Courantes
|
|
|
|
### Voir les logs
|
|
|
|
```bash
|
|
cd /opt/agenthub
|
|
|
|
# Logs en temps réel
|
|
docker compose -f compose.lan-direct.yml logs -f app
|
|
|
|
# Dernières 50 lignes
|
|
docker compose -f compose.lan-direct.yml logs --tail=50 app
|
|
|
|
# Logs Postgres
|
|
docker compose -f compose.lan-direct.yml logs postgres
|
|
```
|
|
|
|
### Redémarrer l'application
|
|
|
|
```bash
|
|
cd /opt/agenthub
|
|
|
|
# Redémarrer uniquement l'app
|
|
docker compose -f compose.lan-direct.yml restart app
|
|
|
|
# Redémarrer toute la stack
|
|
docker compose -f compose.lan-direct.yml restart
|
|
```
|
|
|
|
### Arrêter la stack
|
|
|
|
```bash
|
|
cd /opt/agenthub
|
|
|
|
# Arrêter sans supprimer les données
|
|
docker compose -f compose.lan-direct.yml down
|
|
|
|
# Arrêter ET supprimer les volumes (⚠️ perte de données)
|
|
docker compose -f compose.lan-direct.yml down -v
|
|
```
|
|
|
|
### Mettre à jour vers une nouvelle version
|
|
|
|
```bash
|
|
cd /opt/agenthub
|
|
|
|
# Arrêter l'ancienne version
|
|
docker compose -f compose.lan-direct.yml down
|
|
|
|
# Copier la nouvelle archive et extraire
|
|
# (répéter Étape 1-3)
|
|
|
|
# Redémarrer avec rebuild
|
|
docker compose -f compose.lan-direct.yml up -d --build
|
|
|
|
# Vérifier
|
|
curl http://localhost:3000/healthz
|
|
```
|
|
|
|
## Tests de Validation
|
|
|
|
### Test 1 : Créer des agents et une room
|
|
|
|
```bash
|
|
# Depuis le serveur ou un poste LAN
|
|
cd /opt/agenthub
|
|
./test/smoke-lan-2-agents.sh 192.168.9.23
|
|
```
|
|
|
|
Ce script :
|
|
1. Crée 2 agents de test
|
|
2. Génère des API tokens
|
|
3. Échange pour des JWTs
|
|
4. Crée une room de test
|
|
5. Affiche les URLs WebSocket pour connexion manuelle
|
|
|
|
### Test 2 : WebSocket manuel
|
|
|
|
Après avoir exécuté le script ci-dessus, utilisez un client WebSocket (comme [websocat](https://github.com/vi/websocat)) :
|
|
|
|
```bash
|
|
# Installer websocat
|
|
curl -L https://github.com/vi/websocat/releases/download/v1.11.0/websocat.x86_64-unknown-linux-musl -o websocat
|
|
chmod +x websocat
|
|
|
|
# Connecter Agent 1 (utiliser le JWT affiché par le script smoke test)
|
|
./websocat "ws://192.168.9.23:3000/agents?token=<JWT-AGENT-1>"
|
|
|
|
# Dans une autre console, connecter Agent 2
|
|
./websocat "ws://192.168.9.23:3000/agents?token=<JWT-AGENT-2>"
|
|
|
|
# Joindre la room (dans chaque console)
|
|
{"event":"room:join","roomId":"<ROOM-ID>"}
|
|
|
|
# Envoyer un message depuis Agent 1
|
|
{"event":"message:send","roomId":"<ROOM-ID>","content":"Hello from Agent 1"}
|
|
|
|
# Vérifier réception côté Agent 2
|
|
# Devrait voir : {"event":"message:new","roomId":"...","message":{...}}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Problème : Port 3000 déjà utilisé
|
|
|
|
```bash
|
|
# Trouver le processus
|
|
sudo netstat -tulpn | grep 3000
|
|
|
|
# Tuer le processus
|
|
sudo kill <PID>
|
|
|
|
# Ou changer le port dans .env.lan
|
|
# PORT=3001
|
|
```
|
|
|
|
### Problème : Docker build échoue
|
|
|
|
```bash
|
|
# Vérifier l'espace disque
|
|
df -h
|
|
|
|
# Nettoyer les anciennes images
|
|
docker system prune -a
|
|
|
|
# Rebuild
|
|
docker compose -f compose.lan-direct.yml build --no-cache app
|
|
```
|
|
|
|
### Problème : Database connection refused
|
|
|
|
```bash
|
|
# Vérifier que Postgres est démarré
|
|
docker compose -f compose.lan-direct.yml ps postgres
|
|
|
|
# Vérifier les logs Postgres
|
|
docker compose -f compose.lan-direct.yml logs postgres
|
|
|
|
# Redémarrer Postgres
|
|
docker compose -f compose.lan-direct.yml restart postgres
|
|
```
|
|
|
|
## Secrets et Sécurité
|
|
|
|
Le fichier `.env.lan` contient des secrets générés automatiquement :
|
|
- `JWT_SECRET` : pour signer les tokens JWT (32+ bytes)
|
|
- `POSTGRES_PASSWORD` : mot de passe BDD (24 chars aléatoires)
|
|
|
|
**⚠️ Important :**
|
|
- Ne jamais commiter `.env.lan` dans git
|
|
- Sauvegarder `.env.lan` dans un endroit sécurisé (password manager)
|
|
- Rotations recommandée tous les 90 jours
|
|
|
|
## Support
|
|
|
|
- **Runbook complet :** `docs/RUNBOOK-lan.md`
|
|
- **Documentation :** `docs/`
|
|
- **Scripts de test :** `test/`
|
|
- **Issues :** Plane AGNHUB / Paperclip BARAAA
|
|
|
|
---
|
|
|
|
**Version :** Phase 1 LAN (2026-05-01)
|
|
**Dernière mise à jour :** J10 delivery
|