# Architecture RΓ©seau - SystΓ¨me Notarial 4NK_IA ## 🌐 Vue d'ensemble du RΓ©seau Le systΓ¨me notarial 4NK_IA utilise une architecture rΓ©seau distribuΓ©e avec des services conteneurisΓ©s et une communication sΓ©curisΓ©e entre composants. ## πŸ”— Topologie du RΓ©seau ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ RΓ‰SEAU EXTERNE β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Client β”‚ β”‚ Notaire β”‚ β”‚ Admin β”‚ β”‚ β”‚ β”‚ Web β”‚ β”‚ (API) β”‚ β”‚ (Grafana) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ HTTPS/WSS β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ TRAEFIK (Port 80/443) β”‚ β”‚ Passerelle et Load Balancer β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ RΓ‰SEAU DOCKER INTERNE β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ API β”‚ β”‚ Worker β”‚ β”‚ Web UI β”‚ β”‚ β”‚ β”‚ (8000) β”‚ β”‚ Celery β”‚ β”‚ (8081) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ PostgreSQL β”‚ β”‚ Redis β”‚ β”‚ MinIO β”‚ β”‚ β”‚ β”‚ (5432) β”‚ β”‚ (6379) β”‚ β”‚ (9000/9001) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Ollama β”‚ β”‚ AnythingLLM β”‚ β”‚ Neo4j β”‚ β”‚ β”‚ β”‚ (11434) β”‚ β”‚ (3001) β”‚ β”‚ (7474) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ OpenSearch β”‚ β”‚ Prometheus β”‚ β”‚ Grafana β”‚ β”‚ β”‚ β”‚ (9200) β”‚ β”‚ (9090) β”‚ β”‚ (3000) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ”Œ Ports et Services ### **Services ExposΓ©s (Accessibles depuis l'extΓ©rieur)** | Service | Port | Protocole | Description | |---------|------|-----------|-------------| | **Traefik** | 80 | HTTP | Passerelle principale | | **Traefik** | 443 | HTTPS | Passerelle sΓ©curisΓ©e | | **Web UI** | 8081 | HTTP | Interface utilisateur | | **MinIO Console** | 9001 | HTTP | Interface d'administration MinIO | | **Grafana** | 3000 | HTTP | Dashboards de monitoring | | **Neo4j Browser** | 7474 | HTTP | Interface Neo4j | ### **Services Internes (RΓ©seau Docker)** | Service | Port | Protocole | Description | |---------|------|-----------|-------------| | **API FastAPI** | 8000 | HTTP | API principale | | **PostgreSQL** | 5432 | TCP | Base de donnΓ©es | | **Redis** | 6379 | TCP | Cache et queue | | **MinIO** | 9000 | HTTP | Stockage objet | | **Ollama** | 11434 | HTTP | LLM local | | **AnythingLLM** | 3001 | HTTP | RAG et chat | | **Neo4j** | 7687 | TCP | Base de donnΓ©es graphe | | **OpenSearch** | 9200 | HTTP | Moteur de recherche | | **Prometheus** | 9090 | HTTP | MΓ©triques | ## 🌍 Communication Inter-Services ### **Flux de DonnΓ©es Principal** ```mermaid graph TD A[Client Web] -->|HTTPS| B[Traefik] B -->|HTTP| C[API FastAPI] C -->|TCP| D[PostgreSQL] C -->|Redis| E[Redis Queue] E -->|Celery| F[Worker] F -->|HTTP| G[Ollama] F -->|HTTP| H[AnythingLLM] F -->|HTTP| I[MinIO] F -->|HTTP| J[OpenSearch] F -->|TCP| K[Neo4j] L[Prometheus] -->|Scrape| C L -->|Scrape| F M[Grafana] -->|Query| L ``` ### **Patterns de Communication** #### **1. API β†’ Base de DonnΓ©es** ```python # PostgreSQL (DonnΓ©es structurΓ©es) DATABASE_URL = "postgresql+psycopg://notariat:notariat_pwd@postgres:5432/notariat" # Redis (Cache et Queue) REDIS_URL = "redis://redis:6379/0" ``` #### **2. Worker β†’ Services Externes** ```python # Ollama (LLM) OLLAMA_BASE_URL = "http://ollama:11434" # AnythingLLM (RAG) ANYLLM_BASE_URL = "http://anythingsqlite:3001" # MinIO (Stockage) MINIO_ENDPOINT = "minio:9000" ``` #### **3. Monitoring** ```yaml # Prometheus (MΓ©triques) - targets: ['api:8000', 'worker:celery', 'postgres:5432'] scrape_interval: 15s # Grafana (Dashboards) - datasource: prometheus:9090 - dashboards: ['api', 'worker', 'database'] ``` ## πŸ”’ SΓ©curitΓ© RΓ©seau ### **Isolation des Services** ```yaml # Docker Compose - RΓ©seaux networks: frontend: driver: bridge ipam: config: - subnet: 172.20.0.0/16 backend: driver: bridge ipam: config: - subnet: 172.21.0.0/16 monitoring: driver: bridge ipam: config: - subnet: 172.22.0.0/16 ``` ### **SΓ©curitΓ© des Communications** #### **1. Chiffrement TLS** - **Traefik** : Certificats Let's Encrypt automatiques - **API** : HTTPS obligatoire en production - **Base de donnΓ©es** : Connexions chiffrΓ©es #### **2. Authentification** ```python # JWT pour l'API JWT_SECRET_KEY = "your-secret-key" JWT_ALGORITHM = "HS256" JWT_EXPIRATION = 3600 # 1 heure # Authentification base de donnΓ©es POSTGRES_USER = "notariat" POSTGRES_PASSWORD = "notariat_pwd" ``` #### **3. Firewall et AccΓ¨s** ```bash # RΓ¨gles iptables (exemple) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -p tcp --dport 8081 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j DROP ``` ## πŸ“‘ APIs Externes ### **Services Gouvernementaux** | Service | URL | Port | Protocole | Description | |---------|-----|------|-----------|-------------| | **Cadastre** | https://apicadastre.apis.gouv.fr | 443 | HTTPS | DonnΓ©es cadastrales | | **GΓ©orisques** | https://www.georisques.gouv.fr/api | 443 | HTTPS | Risques naturels | | **BODACC** | https://bodacc-datadila.opendatasoft.com | 443 | HTTPS | Registre du commerce | | **Gel des Avoirs** | https://gel-des-avoirs.gouv.fr/api | 443 | HTTPS | Sanctions financiΓ¨res | | **Infogreffe** | https://infogreffe.fr/api | 443 | HTTPS | DonnΓ©es entreprises | | **RBE** | https://registre-beneficiaires-effectifs.inpi.fr | 443 | HTTPS | BΓ©nΓ©ficiaires effectifs | ### **Configuration des APIs Externes** ```python # Configuration des timeouts et retry EXTERNAL_API_CONFIG = { "timeout": 30, "retry_attempts": 3, "retry_delay": 1, "rate_limit": { "cadastre": 100, # requΓͺtes/heure "georisques": 50, "bodacc": 200 } } ``` ## πŸ”„ Load Balancing et Haute DisponibilitΓ© ### **Traefik Configuration** ```yaml # docker-compose.yml traefik: image: traefik:v3.0 command: - "--api.dashboard=true" - "--providers.docker=true" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.email=ops@4nkweb.com" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" ``` ### **Health Checks** ```python # API Health Check @app.get("/api/health") async def health_check(): return { "status": "healthy", "services": { "database": check_db_connection(), "redis": check_redis_connection(), "minio": check_minio_connection(), "ollama": check_ollama_connection() } } ``` ## πŸ“Š Monitoring RΓ©seau ### **MΓ©triques CollectΓ©es** - **Latence** : Temps de rΓ©ponse des services - **DΓ©bit** : RequΓͺtes par seconde - **Erreurs** : Taux d'erreur par service - **Connexions** : Nombre de connexions actives - **Bande passante** : Utilisation rΓ©seau ### **Alertes ConfigurΓ©es** ```yaml # Prometheus Alert Rules groups: - name: network_alerts rules: - alert: HighLatency expr: http_request_duration_seconds > 5 for: 2m labels: severity: warning annotations: summary: "High latency detected" - alert: ServiceDown expr: up == 0 for: 1m labels: severity: critical annotations: summary: "Service is down" ``` ## πŸš€ Optimisations RΓ©seau ### **1. Mise en Cache** ```python # Redis Cache @cache(expire=3600) # 1 heure async def get_document_analysis(doc_id: str): # Analyse mise en cache pass ``` ### **2. Compression** ```python # Gzip compression app.add_middleware(GZipMiddleware, minimum_size=1000) ``` ### **3. Connection Pooling** ```python # PostgreSQL engine = create_engine( DATABASE_URL, pool_size=20, max_overflow=30, pool_pre_ping=True ) ``` ## πŸ”§ DΓ©pannage RΓ©seau ### **Commandes de Diagnostic** ```bash # Test de connectivitΓ© docker exec -it 4nk_ia-api-1 ping postgres docker exec -it 4nk_ia-api-1 ping redis # VΓ©rification des ports netstat -tulpn | grep :8000 netstat -tulpn | grep :5432 # Test des services curl -f http://localhost:8000/api/health curl -f http://localhost:8081 # Logs rΓ©seau docker logs 4nk_ia-traefik-1 docker logs 4nk_ia-api-1 ``` ### **ProblΓ¨mes Courants** 1. **Port dΓ©jΓ  utilisΓ©** : `lsof -i :8000` 2. **Connexion refusΓ©e** : VΓ©rifier les services Docker 3. **Timeout** : Augmenter les timeouts dans la config 4. **DNS** : VΓ©rifier la rΓ©solution des noms de services ## πŸ“‹ Checklist de DΓ©ploiement RΓ©seau - [ ] **Ports ouverts** : 80, 443, 8081, 3000, 9001, 7474 - [ ] **Firewall configurΓ©** : RΓ¨gles iptables/ufw - [ ] **Certificats SSL** : Let's Encrypt ou certificats manuels - [ ] **DNS configurΓ©** : RΓ©solution des noms de domaines - [ ] **Load balancer** : Traefik configurΓ© - [ ] **Monitoring** : Prometheus et Grafana opΓ©rationnels - [ ] **Backup rΓ©seau** : Configuration sauvegardΓ©e - [ ] **Tests de charge** : Validation des performances