# Incus/LXD Deployment Configuration

Ce dossier contient les configurations pour déployer Veza avec Incus (LXD) **sans Docker** - déploiement natif complet.

## Prérequis

```bash
# Installer Incus
sudo snap install incus

# Initialiser Incus (première fois)
sudo incus admin init

# Vérifier les outils de build
make check-tools-incus
```

## Architecture

Chaque service est déployé dans un container Incus séparé avec des binaires natifs :

| Service | Container | IP | Port | Description |
|---------|-----------|-----|------|-------------|
| Infrastructure | `veza-infra` | 10.10.10.10 | 5432, 6379 | PostgreSQL + Redis |
| Backend API | `veza-backend-api` | 10.10.10.2 | 8080 | Backend Go (binaire natif) |
| Chat Server | `veza-chat-server` | 10.10.10.3 | 8081 | Serveur Chat Rust (binaire natif) |
| Stream Server | `veza-stream-server` | 10.10.10.4 | 3002 | Serveur Stream Rust (binaire natif) |
| Web Frontend | `veza-web` | 10.10.10.5 | 80 | Frontend React (Apache - fichiers statiques uniquement) |
| HAProxy | `veza-haproxy` | 10.10.10.6 | 80 | Reverse Proxy |

## Réseau

Le réseau `veza-network` est créé automatiquement avec :
- Subnet: 10.10.10.0/24
- NAT activé pour l'accès externe
- Adresses IP statiques pour chaque service

## Déploiement

### Déploiement complet (recommandé)

```bash
# Build et déploiement complet
make deploy-incus
```

Cette commande :
1. Compile tous les services nativement (Go, Rust, Node.js)
2. Crée le réseau Incus
3. Déploie l'infrastructure (PostgreSQL, Redis)
4. Déploie tous les services applicatifs
5. Démarre tous les services

### Déploiement étape par étape

```bash
# 1. Build natif de tous les services
make build-all-native

# 2. Setup réseau
make incus-setup-network

# 3. Déployer l'infrastructure
make incus-deploy-infra

# 4. Déployer les services
make incus-deploy-all-native

# 5. Démarrer tous les services
make incus-start-all
```

### Déploiement d'un service spécifique

```bash
# Build un service
./config/incus/build-native.sh backend-api

# Déployer un service
make incus-deploy-service-native SERVICE=backend-api

# Démarrer un service
incus exec veza-backend-api -- systemctl start veza-backend-api
```

## Gestion des services

### Vérifier le déploiement

```bash
# Script de vérification
./config/incus/verify-deployment.sh

# Ou manuellement
make status-full
```

### Logs

```bash
# Logs d'un service
make incus-logs SERVICE=backend-api

# Ou directement
incus exec veza-backend-api -- journalctl -u veza-backend-api -f
```

### Arrêter/Démarrer

```bash
# Arrêter tous les containers
make incus-stop-all

# Démarrer un service
incus exec veza-backend-api -- systemctl start veza-backend-api

# Redémarrer un service
incus exec veza-backend-api -- systemctl restart veza-backend-api

# Status d'un service
incus exec veza-backend-api -- systemctl status veza-backend-api
```

## Configuration

### Variables d'environnement

Les fichiers de configuration sont dans `config/incus/env/` :
- `backend-api.env` - Configuration Backend API
- `chat-server.env` - Configuration Chat Server
- `stream-server.env` - Configuration Stream Server

Modifiez ces fichiers avant le déploiement ou éditez-les dans les containers :

```bash
incus exec veza-backend-api -- nano /etc/veza/backend-api.env
incus exec veza-backend-api -- systemctl restart veza-backend-api
```

### Services systemd

Les fichiers systemd sont dans `config/incus/systemd/` :
- `veza-backend-api.service`
- `veza-chat-server.service`
- `veza-stream-server.service`

## Accès aux services

Une fois déployé, les services sont accessibles via :

- **HAProxy (point d'entrée)** : http://10.10.10.6:80
- **Backend API** : http://10.10.10.2:8080
- **Chat Server** : ws://10.10.10.3:8081/ws
- **Stream Server** : ws://10.10.10.4:3002/stream
- **Web Frontend** : http://10.10.10.5:80

## Dépannage

### Container ne démarre pas

```bash
# Vérifier les logs du container
incus exec veza-backend-api -- journalctl -xe

# Vérifier la configuration réseau
incus network show veza-network
incus list -c n4
```

### Service ne démarre pas

```bash
# Vérifier les logs systemd
incus exec veza-backend-api -- systemctl status veza-backend-api
incus exec veza-backend-api -- journalctl -u veza-backend-api -n 50

# Vérifier les variables d'environnement
incus exec veza-backend-api -- cat /etc/veza/backend-api.env
```

### Problème de connectivité

```bash
# Tester la connectivité entre containers
incus exec veza-backend-api -- ping -c 3 10.10.10.10
incus exec veza-backend-api -- curl http://10.10.10.10:5432
```

### Rebuild complet

```bash
# Supprimer tous les containers
make incus-stop-all
for container in $(incus list -c n --format csv | grep veza-); do
    incus delete $container --force
done

# Rebuild et redéployer
make deploy-incus
```

## Architecture de Routing

**HAProxy** est le point d'entrée principal et gère tout le routing :
- `/api/v1/*` → Backend API (10.10.10.2:8080)
- `/ws/*` → Chat Server (10.10.10.3:8081)
- `/stream/*` → Stream Server (10.10.10.4:3002)
- `/*` → Web Frontend (10.10.10.5:80)

**Apache** dans `veza-web` sert uniquement les fichiers statiques du frontend React. HAProxy route toutes les requêtes vers les services appropriés.

## Différences avec Docker

Le déploiement Incus natif diffère du déploiement Docker :

1. **Pas de Docker** : Les services s'exécutent directement dans les containers Incus
2. **Binaires natifs** : Compilation locale puis copie dans les containers
3. **Systemd** : Gestion des services via systemd dans chaque container
4. **IP statiques** : Adresses IP fixes pour chaque service
5. **Performance** : Overhead minimal, performances proches du bare metal
6. **HAProxy unique** : Un seul reverse proxy gère tout le routing (pas de Nginx)

## Avantages

- ✅ Pas de dépendance Docker
- ✅ Performance optimale
- ✅ Isolation complète entre services
- ✅ Gestion native via systemd
- ✅ Configuration réseau flexible
- ✅ Déploiement rapide et reproductible
