281 lines
11 KiB
Markdown
281 lines
11 KiB
Markdown
|
|
# Architecture Infrastructure Talas
|
|||
|
|
|
|||
|
|
> Topologie des serveurs, réseau, stockage et services.
|
|||
|
|
> Infrastructure 100% self-hosted — aucune dépendance cloud.
|
|||
|
|
> Source : [[12_DOCUMENTATION/ANALYSE_PROJET_MARS_2026]] §5
|
|||
|
|
> Dernière mise à jour : 27 mars 2026.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Vue d'ensemble
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Internet (fibre Orange 1 Gbps + 5G backup)
|
|||
|
|
|
|
|||
|
|
[WireGuard VPN]
|
|||
|
|
|
|
|||
|
|
┌───────────────┴───────────────┐
|
|||
|
|
| |
|
|||
|
|
R720 #1 (PRODUCTION) R720 #2 (DATA + BACKUP)
|
|||
|
|
──────────────────── ─────────────────────────
|
|||
|
|
HAProxy (reverse proxy MinIO (stockage audio/fichiers)
|
|||
|
|
+ TLS + Coraza WAF) PostgreSQL replica (HDD 15K)
|
|||
|
|
Veza Backend (Go) x2 Elasticsearch
|
|||
|
|
Veza Stream Server (Rust) x2 ClamAV (antivirus)
|
|||
|
|
Veza Frontend (React) x2 Prometheus + Grafana
|
|||
|
|
PostgreSQL primary (SSD) Alertmanager
|
|||
|
|
Redis (SSD) Zabbix
|
|||
|
|
RabbitMQ Backups PITR
|
|||
|
|
Hyperswitch (paiements) Kibana
|
|||
|
|
| |
|
|||
|
|
└──────── 10 GbE ───────────────┘
|
|||
|
|
(réplication PG, accès MinIO,
|
|||
|
|
transferts de backup)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Flux réseau entrant :
|
|||
|
|
```
|
|||
|
|
Internet → Fibre Orange → WireGuard/port forward → HAProxy (TLS + WAF) → services
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Diagramme Mermaid (pour rendu web / Logseq)
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
Internet["🌐 Internet<br/>Fibre Orange 1 Gbps + 5G backup"]
|
|||
|
|
WG["WireGuard VPN"]
|
|||
|
|
Internet --> WG
|
|||
|
|
|
|||
|
|
subgraph R720_1["R720 #1 — PRODUCTION"]
|
|||
|
|
HAProxy["HAProxy<br/>TLS + Coraza WAF"]
|
|||
|
|
Backend["Veza Backend Go x2"]
|
|||
|
|
Stream["Veza Stream Rust x2"]
|
|||
|
|
Frontend["Veza Frontend React x2"]
|
|||
|
|
PG1["PostgreSQL primary<br/>⚡ SSD"]
|
|||
|
|
Redis["Redis<br/>⚡ SSD"]
|
|||
|
|
RMQ["RabbitMQ"]
|
|||
|
|
HS["Hyperswitch"]
|
|||
|
|
|
|||
|
|
HAProxy --> Backend
|
|||
|
|
HAProxy --> Stream
|
|||
|
|
HAProxy --> Frontend
|
|||
|
|
Backend --> PG1
|
|||
|
|
Backend --> Redis
|
|||
|
|
Backend --> RMQ
|
|||
|
|
Stream --> RMQ
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph R720_2["R720 #2 — DATA + BACKUP"]
|
|||
|
|
MinIO["MinIO S3"]
|
|||
|
|
PG2["PostgreSQL replica<br/>HDD 15K"]
|
|||
|
|
ES["Elasticsearch"]
|
|||
|
|
ClamAV["ClamAV"]
|
|||
|
|
Prom["Prometheus + Grafana"]
|
|||
|
|
Alert["Alertmanager"]
|
|||
|
|
Zabbix["Zabbix"]
|
|||
|
|
PITR["Backups PITR<br/>HDD 1.8 To"]
|
|||
|
|
Kibana["Kibana"]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
WG --> HAProxy
|
|||
|
|
R720_1 <-->|"10 GbE<br/>réplication PG, MinIO, backups"| R720_2
|
|||
|
|
PG1 -->|"réplication"| PG2
|
|||
|
|
Backend -->|"stockage fichiers"| MinIO
|
|||
|
|
Backend -->|"scan uploads"| ClamAV
|
|||
|
|
Backend -->|"recherche"| ES
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Pas de Cloudflare, pas de Tailscale, pas de tiers. Cohérent avec les valeurs Talas (indépendance, transparence, contrôle total).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Matériel
|
|||
|
|
|
|||
|
|
### Serveurs : 2x Dell PowerEdge R720
|
|||
|
|
|
|||
|
|
| Spécification | Par serveur | Total |
|
|||
|
|
|---------------|-------------|-------|
|
|||
|
|
| CPU | 2x Intel Xeon E5-2670 @ 2.60 GHz (8C/16T) | 32 cœurs / 64 threads |
|
|||
|
|
| RAM | 16x 24 Go DDR3 1600 MHz = 384 Go | 768 Go |
|
|||
|
|
| Baies disques | 16 baies 2.5" | 32 baies |
|
|||
|
|
| Réseau | Carte PCIe 10 GbE | Liaison 10 GbE inter-serveurs |
|
|||
|
|
|
|||
|
|
Architecture Sandy Bridge-EP (2012). Performant mais consommation élevée (~400W par serveur en charge).
|
|||
|
|
|
|||
|
|
### Stockage
|
|||
|
|
|
|||
|
|
| Type | Capacités disponibles | Performance | Usage |
|
|||
|
|
|------|-----------------------|-------------|-------|
|
|||
|
|
| SSD (réserve) | Jusqu'à 1 To (anciens) | Excellent en IOPS aléatoires | PostgreSQL primary, Redis |
|
|||
|
|
| HDD 15K RPM 2.5" | 146 Go, 300 Go, 600 Go, 900 Go, 1.8 To | Meilleur HDD pour I/O séquentielles | Système, replicas, stockage |
|
|||
|
|
|
|||
|
|
~100 disques d'occasion disponibles. Taux de panne estimé : 10-15%/an → ZFS mirror obligatoire, SMART monitoring (`smartctl -a`) systématique.
|
|||
|
|
|
|||
|
|
### Réseau
|
|||
|
|
|
|||
|
|
| Composant | Débit | Usage |
|
|||
|
|
|-----------|-------|-------|
|
|||
|
|
| Fibre Orange | 1 Gbps descendant | Trafic Internet |
|
|||
|
|
| 5G backup | Variable | Failover |
|
|||
|
|
| 10 GbE inter-serveurs | 10 Gbps | Réplication PG, MinIO, backups |
|
|||
|
|
| LAN | 1-2.5 Gbps | Équipements locaux |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## R720 #1 — Production
|
|||
|
|
|
|||
|
|
Services applicatifs et bases de données primaires.
|
|||
|
|
|
|||
|
|
| Service | Rôle | Stockage |
|
|||
|
|
|---------|------|----------|
|
|||
|
|
| **HAProxy** | Reverse proxy, terminaison TLS (Let's Encrypt), Coraza WAF | HDD (logs) |
|
|||
|
|
| **Veza Backend** (Go) x2 | API REST, 500+ endpoints, blue-green deployment | — |
|
|||
|
|
| **Veza Stream Server** (Rust) x2 | Streaming HLS adaptatif, WebSocket, transcoding | — |
|
|||
|
|
| **Veza Frontend** (React) x2 | SPA servie par Nginx | — |
|
|||
|
|
| **PostgreSQL primary** | Base de données principale, 60+ tables | **SSD** (IOPS critiques) |
|
|||
|
|
| **Redis** | Sessions, cache HTTP, rate limiting, CSRF tokens | **SSD** (persistance rapide) |
|
|||
|
|
| **RabbitMQ** | Message broker (événements track.uploaded, etc.) | HDD |
|
|||
|
|
| **Hyperswitch** | Orchestrateur de paiements | HDD |
|
|||
|
|
|
|||
|
|
Blue-green deployment : deux instances de chaque service applicatif. HAProxy bascule entre les deux lors des mises à jour (zéro downtime).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## R720 #2 — Data + Backup
|
|||
|
|
|
|||
|
|
Stockage, réplication, monitoring et sauvegardes.
|
|||
|
|
|
|||
|
|
| Service | Rôle | Stockage |
|
|||
|
|
|---------|------|----------|
|
|||
|
|
| **MinIO** | Stockage objet S3-compatible (audio, avatars, exports) | HDD 1.8 To (pool ZFS mirror) |
|
|||
|
|
| **PostgreSQL replica** | Réplique en lecture de la base primaire | HDD 15K 600-900 Go |
|
|||
|
|
| **Elasticsearch** | Recherche full-text (pistes, users, playlists) | HDD 15K 600-900 Go |
|
|||
|
|
| **ClamAV** | Scan antivirus des fichiers uploadés | HDD |
|
|||
|
|
| **Prometheus** | Collecte de métriques (scrape /metrics) | HDD |
|
|||
|
|
| **Grafana** | Dashboards de monitoring | HDD |
|
|||
|
|
| **Alertmanager** | Routage d'alertes | HDD |
|
|||
|
|
| **Zabbix** | Monitoring d'infrastructure (alertes → Matrix, Jira) | HDD |
|
|||
|
|
| **Kibana** | Visualisation des logs Elasticsearch | HDD |
|
|||
|
|
| **Backups PITR** | Archives WAL PostgreSQL, snapshots ZFS | HDD 1.8 To |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Allocation stockage
|
|||
|
|
|
|||
|
|
| Type de disque | Serveur | Usage | Justification |
|
|||
|
|
|----------------|---------|-------|---------------|
|
|||
|
|
| SSD (priorité) | R720 #1 | PostgreSQL primary + WAL | IOPS aléatoires critiques pour les requêtes |
|
|||
|
|
| SSD | R720 #1 | Redis (RDB + AOF) | Persistance rapide, accès aléatoire |
|
|||
|
|
| HDD 15K (146-300 Go) | R720 #1 | Système, logs, swap | I/O séquentielles, pas critique |
|
|||
|
|
| HDD 15K (600-900 Go) | R720 #2 | PostgreSQL replica, Elasticsearch | Bonnes IOPS pour du HDD, lectures séquentielles |
|
|||
|
|
| HDD (1.8 To) | R720 #2 | MinIO (pool ZFS mirror) | Volume > performance, stockage audio |
|
|||
|
|
| HDD (1.8 To) | R720 #2 | Backups PITR, snapshots ZFS | Volume, écritures séquentielles |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Stockage ZFS — Mirror vdevs
|
|||
|
|
|
|||
|
|
Choix retenu : **pools en mirror** (paires de 2 disques), pas RAIDZ2.
|
|||
|
|
|
|||
|
|
| Critère | Mirror (retenu) | RAIDZ2 (alternative) |
|
|||
|
|
|---------|-----------------|----------------------|
|
|||
|
|
| Tolérance panne | 1 disque par paire | 2 disques par vdev |
|
|||
|
|
| Performance lecture | Excellente (striped mirrors) | Bonne |
|
|||
|
|
| Performance écriture | Bonne | Moyenne (calcul parité) |
|
|||
|
|
| Perte capacité | 50% | ~33% |
|
|||
|
|
| Temps de resilver | **Rapide** (1 disque à copier) | Lent (tout le vdev) |
|
|||
|
|
| Adapté aux disques d'occasion | **Oui** (resilver rapide = moins de stress) | Risque (resilver long) |
|
|||
|
|
|
|||
|
|
Avec ~100 disques d'occasion et un taux de panne de 10-15%/an, le mirror est clairement supérieur : le resilver rapide limite la fenêtre de vulnérabilité.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Sécurité réseau
|
|||
|
|
|
|||
|
|
### Couche d'accès
|
|||
|
|
|
|||
|
|
| Composant | Rôle |
|
|||
|
|
|-----------|------|
|
|||
|
|
| **WireGuard** | VPN d'accès aux serveurs. Exposition sécurisée des services sur Internet. |
|
|||
|
|
| **HAProxy** | Point d'entrée unique. Terminaison TLS. Routage vers les services. |
|
|||
|
|
| **Coraza WAF** | Filtrage applicatif (OWASP CRS). Protection contre SQLi, XSS, path traversal. |
|
|||
|
|
| **Let's Encrypt** | Certificats TLS automatiques via certbot. |
|
|||
|
|
|
|||
|
|
### Couche d'administration
|
|||
|
|
|
|||
|
|
| Composant | Rôle |
|
|||
|
|
|-----------|------|
|
|||
|
|
| **JumpServer** | Bastion SSH/RDP. Interface web, audit vidéo, RBAC, MFA. Point d'accès unique pour l'administration. |
|
|||
|
|
| **Hashicorp Vault** | Gestion des secrets (clés SSH, tokens, mots de passe). |
|
|||
|
|
|
|||
|
|
### Monitoring et logs
|
|||
|
|
|
|||
|
|
| Composant | Rôle |
|
|||
|
|
|-----------|------|
|
|||
|
|
| **ELK Stack** | Filebeat → Elasticsearch → Kibana. Centralisation et analyse des logs. |
|
|||
|
|
| **Zabbix** | Monitoring infrastructure (CPU, RAM, disques, réseau). Alertes multi-canal. |
|
|||
|
|
| **Prometheus + Grafana** | Métriques applicatives (endpoints /metrics des services Veza). |
|
|||
|
|
| **Alertmanager** | Routage d'alertes Prometheus vers les canaux configurés. |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Automatisation
|
|||
|
|
|
|||
|
|
### Ansible (46+ rôles)
|
|||
|
|
|
|||
|
|
Rôles regroupés par fonction :
|
|||
|
|
|
|||
|
|
| Catégorie | Rôles |
|
|||
|
|
|-----------|-------|
|
|||
|
|
| **Base système** | docker, crontab, rsyslog, ssh-keygen-and-store |
|
|||
|
|
| **Bases de données** | postgres_client, pg-wal-pull |
|
|||
|
|
| **Reverse proxy** | haproxy (+ Coraza WAF) |
|
|||
|
|
| **Stockage** | minio, zfs |
|
|||
|
|
| **Monitoring** | zabbix_server, filebeat, elasticsearch, prometheus |
|
|||
|
|
| **Sécurité** | jumpserver, vault |
|
|||
|
|
| **Communication** | element-web (Matrix) |
|
|||
|
|
| **CI/CD** | gerrit, git_generic_deploy_files |
|
|||
|
|
| **Conteneurs** | incus, docker |
|
|||
|
|
|
|||
|
|
### Conteneurisation
|
|||
|
|
|
|||
|
|
- **Docker** : services applicatifs (PostgreSQL, Redis, RabbitMQ, ClamAV, MinIO, Elasticsearch)
|
|||
|
|
- **Incus** : machines complètes quand Docker n'est pas adapté (ZFS pool backing)
|
|||
|
|
- **CI/CD prévu** : Woodpecker CI (self-hosted, compatible Gitea/Forgejo)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Coûts d'exploitation
|
|||
|
|
|
|||
|
|
| Poste | Calcul | Coût mensuel |
|
|||
|
|
|-------|--------|-------------|
|
|||
|
|
| Électricité serveurs | 2x R720 ~400W chacun = 800W | |
|
|||
|
|
| Équipement réseau | Switch, routeur ~50W | |
|
|||
|
|
| **Total puissance** | **~850W en continu** | |
|
|||
|
|
| Consommation mensuelle | 850W × 24h × 30j = 612 kWh | |
|
|||
|
|
| Électricité | 612 kWh × 0.22 EUR/kWh | **~135 EUR** |
|
|||
|
|
| Internet fibre Orange + 5G | | **~40-50 EUR** |
|
|||
|
|
| Nom de domaine | ~12 EUR/an | **~1 EUR** |
|
|||
|
|
| **TOTAL** | | **~180 EUR/mois** |
|
|||
|
|
|
|||
|
|
### Comparaison cloud équivalent
|
|||
|
|
|
|||
|
|
| Poste cloud | Coût estimé |
|
|||
|
|
|-------------|-------------|
|
|||
|
|
| 2 serveurs dédiés 384 Go RAM (Hetzner) | 400-600 EUR/mois |
|
|||
|
|
| Managed PostgreSQL + Redis + Elasticsearch (AWS) | 500-800 EUR/mois |
|
|||
|
|
| S3 + monitoring + CI | 100-200 EUR/mois |
|
|||
|
|
| **Total cloud** | **800-1500+ EUR/mois** |
|
|||
|
|
|
|||
|
|
**Économie self-hosted : 620-1320 EUR/mois**, soit 7 500-15 800 EUR/an.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Voir aussi
|
|||
|
|
|
|||
|
|
- [[04_INFRA_DEPLOIEMENT/CI_CD/PROCEDURES_DEPLOIEMENT]] — Procédures de déploiement dev→staging→prod
|
|||
|
|
- [[03_APPS_&_SERVICES/ARCHITECTURE_VEZA]] — Architecture applicative Veza
|
|||
|
|
- [[03_APPS_&_SERVICES/CONFIGURATION_ENVIRONNEMENT]] — Variables d'environnement et Docker
|
|||
|
|
- [[00_META/Glossaire/GLOSSAIRE_TALAS]] — Glossaire des termes techniques
|
|||
|
|
- [[12_DOCUMENTATION/ANALYSE_PROJET_MARS_2026]] — Analyse complète dont ce document est issu
|