NC.CAM.App.PortailClients.DataPortal
Service Tampon de Données pour le Portail Sociétaires du CAM
🎯 Objectif du projet
NC.CAM.App.PortailClients.DataPortal est un service tampon de données entre le DataPortal V2 et le Portail Sociétaires du CAM. Ce service intermédiaire a pour objectifs de :
- ✅ Rapprocher la source des données du portail sociétaire pour réduire la latence
- ✅ Limiter l'accès aux données strictement nécessaires au fonctionnement du portail
- ✅ Optimiser les performances grâce à une base de données dédiée PostgreSQL et une sérialisation MessagePack
- ✅ Réduire la charge sur le DataPortal V2 principal en servant de cache intelligent
- ✅ Fournir une API haute performance avec un format binaire optimisé (MessagePack)
Architecture du service
┌─────────────────────┐
│ DataPortal V2 │ ← Source principale des données
│ (Base complète) │
└──────────┬──────────┘
│
│ Synchronisation
│ périodique
▼
┌─────────────────────┐
│ DataPortal Portail │ ← Service tampon (ce projet)
│ Sociétaires │
│ (Données filtrées) │
└──────────┬──────────┘
│
│ MessagePack
│ (API binaire)
▼
┌─────────────────────┐
│ Portail Sociétaires │ ← Application finale
│ CAM │
└─────────────────────┘
Caractéristiques principales
| Caractéristique | Technologie | Version |
|---|---|---|
| Framework | ASP.NET Core | .NET 9.0 |
| API docs | Swashbuckle (Swagger) | 9.0.6 |
| Logging | Serilog | 9.0.0 |
| Observability | Sentry / OpenTelemetry | Sentry 5.16.x / OTLP |
| Mapping | AutoMapper | 14.0.0 |
| Sérialisation | MessagePack | 3.1+ |
| Base de données | PostgreSQL | 14.1 |
| ORM | Entity Framework Core | 9.0 |
| Framework de test | xUnit | 2.9.3 |
| Conteneurisation | Docker & Docker Compose | - |
📚 Structure de la solution
Architecture en couches :
- NC.CAM.App.PortailClients.DataPortal.Api : API ASP.NET Core 9.0 exposant les données via MessagePack
- NC.CAM.App.PortailClients.DataPortal.Contracts : DTOs MessagePack et interfaces de services
- NC.CAM.App.PortailClients.DataPortal.Infrastructure : Couche d'accès aux données avec Entity Framework Core et services
- NC.CAM.App.PortailClients.DataPortal.Core : Entités métier (ObjetPret, OperationCav, ContratCavCdg, etc.) et options de configuration
- NC.CAM.App.PortailClients.DataPortal.DbMigrator : Outil en ligne de commande pour appliquer les migrations Entity Framework Core sur la base PostgreSQL du DataPortal
Remarques spécifiques au code :
- Le projet API expose des contrôleurs principaux :
ObjetPretController,OperationCavController,ContratCavCdgController(voirsrc/NC.CAM.App.PortailClients.DataPortal.Api/Controllers). - La configuration d'app (connection string, DataPortalV2) se trouve dans
src/NC.CAM.App.PortailClients.DataPortal.Api/appsettings.jsonet la chaîne de connexion utilisée est la cléConnectionStrings:Default. - Les synchronisations sont gérées par
DailySyncBackgroundServiceetEntitySyncService(dans le projetInfrastructure). - Une migration initiale est incluse :
src/NC.CAM.App.PortailClients.DataPortal.Infrastructure/Migrations/20251208230348_Initial.cs.
🚀 Démarrage rapide
Prérequis
Option 1 - Docker Compose (Recommandé) :
- Docker Desktop (télécharger)
- Docker Compose (inclus avec Docker Desktop)
- Git
Option 2 - Développement local :
- .NET 9 SDK (télécharger)
- PostgreSQL 14.1 (télécharger)
- Visual Studio 2022 (recommandé) ou Rider
- Git
🐳 Option 1 : Démarrage avec Docker Compose (Recommandé)
Le projet dispose d'un environnement Docker Compose complet pour un déploiement rapide.
> 📚 Documentation complète : Voir dans docs/DOCKER-COMPOSE-SETUP.md pour le guide détaillé
Installation rapide
-
Cloner le dépôt :
git clone https://kelios.visualstudio.com/DefaultCollection/NC.CAM.App.PortailClients/_git/NC.CAM.App.PortailClients.DataPortal
cd NC.CAM.App.PortailClients.DataPortal -
Lancer l'environnement complet :
docker-compose up -d --buildCela démarrera automatiquement :
- Base de données PostgreSQL sur le port
5432 - API DataPortal sur le port
5221(https://localhost:5221) - pgAdmin sur le port
5050(http://localhost:5050)
- Base de données PostgreSQL sur le port
-
Accéder aux services :
Service URL Identifiants API DataPortal https://localhost:5221 - Swagger UI https://localhost:5221/swagger - pgAdmin http://localhost:5050 [email protected] / admin Health Check https://localhost:5221/health -
Commandes Docker Compose utiles
# Démarrer en arrière-plan
docker-compose up -d
# Voir les logs en temps réel
docker-compose logs -f
# Voir uniquement les logs de l'API
docker-compose logs -f portailclients-dataportal-api
# Arrêter les services
docker-compose down
# Rebuild et redémarrer
docker-compose up --build --force-recreate
# Arrêter et supprimer volumes/données
docker-compose down -v
Avantages Docker Compose :
- ✅ Configuration automatique de la base de données
- ✅ Isolation complète de l'environnement
- ✅ Certificats SSL configurés automatiquement
- ✅ Environnement reproductible et portable
- ✅ Migration automatique au démarrage
💻 Option 2 : Développement local traditionnel
Installation
-
Cloner le dépôt et restaurer les dépendances NuGet :
git clone https://kelios.visualstudio.com/DefaultCollection/NC.CAM.App.PortailClients/_git/NC.CAM.App.PortailClients.DataPortal
cd NC.CAM.App.PortailClients.DataPortal
dotnet restore -
Ajouter la configuration dans les appsettings.json :
Éditer
src/NC.CAM.App.PortailClients.DataPortal.Api/appsettings.json:{
.
.
.
"DataPortalV2": {
"AzureAd": {
"Instance": "https://login.microsoftonline.com",
"TenantId": "f087b25b-9486-4633-8995-56eb8730e750",
"ClientId": "c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37",
"ClientSecret": "VOTRE_SECRET_ICI",
"Scope": "api://c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37/.default"
},
"BaseAddress": "https://cam-dataportalv2-api.azurewebsites.net"
.
.
.
} -
Générer la base de données et appliquer les migrations :
# Via DbMigrator
dotnet run --project src/NC.CAM.App.PortailClients.DataPortal.DbMigrator -
Démarrer l'API DataPortal :
dotnet runL'API sera accessible par défaut sur :
- HTTPS :
https://localhost:5221
- HTTPS :
-
Compiler la solution complète :
dotnet build
Notes sur l'API et la configuration
- L'API est configurée dans
src/NC.CAM.App.PortailClients.DataPortal.Api/Program.cs: elle active Swagger, un endpoint/healthet les formatteurs MessagePack (application/x-msgpack) pour les entrées/sorties. - Les contrôleurs exposés sont :
ObjetPretController,OperationCavController,ContratCavCdgController(voirsrc/NC.CAM.App.PortailClients.DataPortal.Api/Controllers). - Les DTOs MessagePack se trouvent dans
src/NC.CAM.App.PortailClients.DataPortal.Contracts/Dtoset utilisent les attributs[MessagePackObject]et[Key(n)].
Clés appsettings.json importantes
ConnectionStrings:Default: chaîne de connexion Npgsql utilisée par l'API et le migrator.DataPortalV2:BaseAddress: base URL du DataPortal V2 (source des données).DataPortalV2:AzureAd: objet contenantInstance,TenantId,ClientId,ClientSecret,Scopeutilisés pour récupérer les tokens OAuth2.DataPortalV2:Paths: chemins des endpoints (ex.affectations-cav,contrats-cav-cdg, ...).DataPortalV2:SyncSchedule: optionsSyncTimeetEnableSyncqui pilotentDailySyncBackgroundService.
Synchronisation automatique
Le service DailySyncBackgroundService lit DataPortalV2:SyncSchedule et exécute :
- une synchronisation initiale au démarrage de l'API
- une synchronisation planifiée quotidiennement à l'heure
SyncTimesiEnableSyncesttrue.
En cas de désactivation de la synchronisation automatique, mettez EnableSync à false dans appsettings.json.
📡 Communication MessagePack
Le DataPortal expose des endpoints optimisés avec sérialisation MessagePack pour des performances maximales.
Pourquoi MessagePack ?
- ✅ Performance : 5-10x plus rapide que JSON
- ✅ Taille : Réduction de 30-50% de la taille des données
- ✅ Compression : Support optionnel LZ4 pour réduire encore davantage la taille
- ✅ Binaire : Format compact et efficace
Format des requêtes/réponses
Toutes les communications utilisent le format MessagePack avec :
- Content-Type:
application/x-msgpack - Accept:
application/x-msgpack
Endpoints disponibles
1. ObjetPret - Validation de projet de prêt
GET /ObjetPret/{numeroProjet}/checkValidity?numeroTiers={numeroTiers}
Description : Vérifie si un projet de prêt est valide pour un numéro de tiers donné.
2. OperationCav - Recherche d'opérations CAV
POST /OperationCav/search
Content-Type: application/x-msgpack
Description : Recherche des opérations CAV avec filtres avancés (montant, date, libellé, sens).
3. ContratCavCdg - Gestion des contrats CAV/CDG
GET /ContratCavCdg/{numeroContrat}/solde
GET /ContratCavCdg/Cav/{numeroTiers}
GET /ContratCavCdg/Cdg/{numeroTiers}
Description :
/solde: Récupère le solde disponible et global d'un contrat/Cav/{numeroTiers}: Récupère le contrat CAV d'un titulaire/Cdg/{numeroTiers}: Récupère les contrats CDG d'un titulaire
Exemple d'utilisation (C#)
using MessagePack;
using System.Net.Http;
// Configuration du client HTTP avec MessagePack
var client = new HttpClient
{
BaseAddress = new Uri("https://localhost:5221")
};
// Exemple 1 : Vérifier la validité d'un projet de prêt
var response = await client.GetAsync(
"/ObjetPret/12345/checkValidity?numeroTiers=67890");
var data = await MessagePackSerializer.DeserializeAsync<dynamic>(
await response.Content.ReadAsStreamAsync());
Console.WriteLine($"Projet valide : {data.isValid}");
// Exemple 2 : Récupérer le solde d'un contrat
var soldeResponse = await client.GetAsync(
"/ContratCavCdg/12345/solde");
var solde = await MessagePackSerializer.DeserializeAsync<dynamic>(
await soldeResponse.Content.ReadAsStreamAsync());
Console.WriteLine($"Solde disponible : {solde.soldeDisponible}");
Console.WriteLine($"Solde global : {solde.soldeGlobal}");
Exemple avec requête POST - Recherche d'opérations CAV
using MessagePack;
using NC.CAM.App.PortailClients.DataPortal.Dtos;
// Classe de requête
var searchRequest = new SearchOperationsCavRequestDto
{
NumeroContrat = 12345,
Search = "VIREMENT",
MontantMin = 100,
MontantMax = 5000,
DateDebut = new DateOnly(2025, 1, 1),
DateFin = new DateOnly(2025, 12, 31),
Sens = "D", // Débit
Code = "VIR"
};
// Sérialisation MessagePack
var requestBytes = MessagePackSerializer.Serialize(searchRequest);
// Envoi de la requête
var content = new ByteArrayContent(requestBytes);
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-msgpack");
var response = await client.PostAsync("/OperationCav/search", content);
// Désérialisation de la réponse
var operations = await MessagePackSerializer.DeserializeAsync<IEnumerable<OperationCavDto>>(
await response.Content.ReadAsStreamAsync());
foreach (var op in operations)
{
Console.WriteLine($"{op.DateOperation} - {op.Libelle} : {op.MontantOperation}");
}
🔄 Synchronisation avec DataPortal V2
Le DataPortal Portail Sociétaires synchronise automatiquement ses données depuis le DataPortal V2 (source principale).
Configuration de la synchronisation
La synchronisation utilise le DataPortal V2 hébergé sur Azure :
Configuration dans appsettings.json :
"DataPortalV2": {
"BaseAddress": "https://cam-dataportalv2-api.azurewebsites.net",
"AzureAd": {
"Instance": "https://login.microsoftonline.com",
"TenantId": "f087b25b-9486-4633-8995-56eb8730e750",
"ClientId": "c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37",
"ClientSecret": "VOTRE_SECRET_ICI",
"Scope": "api://c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37/.default"
},
"Paths": {
"AffectationCav": "affectations-cav",
"ContratCavCdg": "contrats-cav-cdg",
"LienClientTitulaire": "liens-clients-titulaires",
"ObjetPret": "objets-prets",
"OperationCav": "operations-cav"
},
"SyncSchedule": {
"SyncTime": "07:30:00",
"EnableSync": true
}
}
Entités synchronisées
| Entité | Description | Endpoint DataPortal V2 |
|---|---|---|
| AffectationCav | Affectations CAV | /affectations-cav |
| ContratCavCdg | Contrats CAV/CDG | /contrats-cav-cdg |
| LienClientTitulaire | Liens clients-titulaires | /liens-clients-titulaires |
| ObjetPret | Objets de prêt | /objets-prets |
| OperationCav | Opérations CAV | /operations-cav |
Synchronisation automatique
Le service DailySyncBackgroundService s'exécute automatiquement :
- Au démarrage de l'API : Synchronisation initiale complète
- Quotidiennement à 07h30 : Synchronisation planifiée (configurable via
SyncTime) - Authentification Azure AD : Token OAuth2 avec cache et renouvellement automatique
Activation/désactivation :
"SyncSchedule": {
"EnableSync": false // Désactive la synchronisation automatique
}
Déclenchement manuel
# Redémarrer le service pour forcer une synchronisation immédiate
docker-compose restart portailclients-dataportal-api
# Vérifier les logs de synchronisation
docker-compose logs -f portailclients-dataportal-api
# En développement local
dotnet run --project src/NC.CAM.App.PortailClients.DataPortal.Api
Logs de synchronisation attendus :
info: NC.CAM.App.PortailClients.DataPortal.Services.DailySyncBackgroundService[0]
Début de la synchronisation initiale au démarrage de l'API
info: NC.CAM.App.PortailClients.DataPortal.Services.EntitySyncService[0]
Synchronisation de AffectationCav : 1250 entités récupérées
info: NC.CAM.App.PortailClients.DataPortal.Services.EntitySyncService[0]
Synchronisation de ContratCavCdg : 3420 entités récupérées
...
info: NC.CAM.App.PortailClients.DataPortal.Services.DailySyncBackgroundService[0]
Synchronisation initiale au démarrage de l'API terminée avec succès
info: NC.CAM.App.PortailClients.DataPortal.Services.DailySyncBackgroundService[0]
Prochaine synchronisation prévue dans 23:45:30
🗄️ Gestion de la base de données
Le DataPortal utilise une base de données PostgreSQL dédiée nommée DataPortalPortailClients.
Sauvegarde manuelle
# Via Docker Compose
docker-compose exec postgres pg_dump -U postgres DataPortalPortailClients > backup_dataportal_$(date +%Y%m%d_%H%M%S).sql
# En local (Windows PowerShell)
pg_dump -h localhost -p 5432 -U postgres DataPortalPortailClients > backup_dataportal_$(Get-Date -Format "yyyyMMdd_HHmmss").sql
# En local (Linux/Mac)
pg_dump -h localhost -p 5432 -U postgres DataPortalPortailClients > backup_dataportal_$(date +%Y%m%d_%H%M%S).sql
Restauration
# Via Docker Compose
docker-compose exec -T postgres psql -U postgres DataPortalPortailClients < backup_dataportal_20251204_143000.sql
# En local
psql -h localhost -p 5432 -U postgres DataPortalPortailClients < backup_dataportal_20251204_143000.sql
Vérification de la base de données
-- Se connecter à la base
psql -h localhost -p 5432 -U postgres -d DataPortalPortailClients
-- Lister les tables
\dt
-- Vérifier le nombre d'enregistrements synchronisés
SELECT 'AffectationCav' AS table_name, COUNT(*) AS count FROM "AffectationCavs"
UNION ALL
SELECT 'ContratCavCdg', COUNT(*) FROM "ContratCavCdgs"
UNION ALL
SELECT 'LienClientTitulaire', COUNT(*) FROM "LienClientTitulaires"
UNION ALL
SELECT 'ObjetPret', COUNT(*) FROM "ObjetPrets"
UNION ALL
SELECT 'OperationCav', COUNT(*) FROM "OperationCavs";
-- Vérifier les dernières opérations synchronisées
SELECT "DateOperation", "Libelle", "MontantOperation", "SensOperation"
FROM "OperationCavs"
ORDER BY "DateOperation" DESC
LIMIT 10;
-- Vérifier l'intégrité des relations
SELECT
lct."NumeroTitulaire",
lct."NumeroClient",
COUNT(op."Id") AS nb_operations
FROM "LienClientTitulaires" lct
LEFT JOIN "OperationCavs" op ON lct."NumeroClient" = op."NumeroContrat"
GROUP BY lct."NumeroTitulaire", lct."NumeroClient"
LIMIT 20;
🔧 Configuration avancée
Monitoring avec Sentry
Le DataPortal intègre Sentry pour le suivi des erreurs et la télémétrie :
{
"Sentry": {
"Dsn": "https://45a406ffe1dcb139a3f9451ced164950@o4509563953348608.ingest.de.sentry.io/4510022883999824",
"SendDefaultPii": true,
"Debug": true
}
}
Fonctionnalités Sentry activées :
- ✅ Capture automatique des exceptions non gérées
- ✅ Traçabilité des requêtes HTTP (performance monitoring)
- ✅ Capture des logs d'erreur structurés
- ✅ Informations de contexte (PII) pour le debugging
Accès au tableau de bord Sentry : o4509563953348608.ingest.de.sentry.io
Logging et monitoring
Le DataPortal intègre des logs structurés pour le monitoring : Le DataPortal utilise :
Serilogpour la journalisation structurée (console, fichiers et sinks configurables).Sentrypour la remontée d'erreurs, corrélation des traces et monitoring des exceptions.OpenTelemetryvia l'intégration Sentry/OpenTelemetry pour exporter traces et métriques si nécessaire.
Les niveaux de logs et les sinks sont configurables via appsettings.json et les variables d'environnement.
En production, il est recommandé d'envoyer les logs vers un stockage centralisé (Log Analytics, S3, ELK, etc.) et d'activer Sentry pour la surveillance des erreurs.
Consultation des logs :
# Docker Compose
docker-compose logs -f portailclients-dataportal-api
# Filtrer les erreurs uniquement
docker-compose logs portailclients-dataportal-api | grep -i error
✅ Tests et validation
Test de l'endpoint de santé
# Vérifier que l'API est opérationnelle
curl -X GET "https://localhost:5221/health"
Réponse positive attendue :
HTTP/1.1 200 OK
Content-Type: text/plain
Healthy
Réponse négative attendue :
HTTP/1.1 503 Service Unavailable
Content-Type: text/plain
Unhealthy
Checklist de validation
- Base de données
DataPortalPortailClientscréée avec succès - Migrations Entity Framework appliquées sans erreur
- API DataPortal démarrée et accessible sur https://localhost:5221
- Endpoint de santé retourne un statut
Healthy - Configuration de synchronisation avec DataPortal V2 validée
- Premier cycle de synchronisation réussi
- Endpoints MessagePack accessibles et fonctionnels
Exécuter les tests
Le repository contient plusieurs projets de tests unitaires et d'intégration. Exemples :
Lancer tous les services nécessaires pour les tests via Docker Compose
docker-compose -f docker-compose-tests.yml up --build --abort-on-container-exit
docker-compose -f docker-compose-tests.yml down
Exécuter tous les tests unitaires et d'intégration localement
dotnet test
Exécuter uniquement les tests d'un projet
dotnet test test/NC.CAM.App.PortailClients.DataPortal.Api.Test
dotnet test test/NC.CAM.App.PortailClients.DataPortal.Infrastructure.Test
Les projets de test partagent des utilitaires dans test/NC.CAM.App.PortailClients.DataPortal.TestCommon.
Authentification par clé d'API (ApiKeyAttribute)
Les contrôleurs de l'API sont protégés par un attribut ApiKeyAttribute appliqué aux contrôleurs. Pour appeler ces endpoints, ajoutez l'en-tête HTTP suivant :
- Nom de l'en-tête :
X-API-KEY - Valeur : la clé configurée dans la configuration de l'application (
ApiKeydansappsettings.jsonou via les variables d'environnement)
Exemple :
curl -k -H "Accept: application/x-msgpack" -H "X-API-KEY: VOTRE_CLE" https://localhost:5221/ContratCavCdg/Cav/12345
Si la clé est absente ou invalide, l'API renverra 401 Unauthorized avec un message simple expliquant que la clé est incorrecte.
🚨 Troubleshooting
Problèmes courants
❌ "Database connection refused"
Cause : PostgreSQL n'est pas démarré ou la chaîne de connexion est incorrecte.
Solution :
- Vérifier que PostgreSQL est démarré :
docker-compose psoupg_isready -h localhost -p 5432 - Contrôler la chaîne de connexion dans
appsettings.json - Vérifier que la base
DataPortalPortailClientsexiste :psql -h localhost -p 5432 -U postgres -l
❌ "MessagePack deserialization error"
Cause : Classes DTO mal configurées ou versions incompatibles.
Solution :
- Vérifier que les classes DTO ont les attributs
[MessagePackObject]et[Key(n)] - Contrôler que les indices
[Key(n)]sont uniques et séquentiels (0, 1, 2, ...) - Vérifier la version de MessagePack côté client et serveur (doit être 3.1+)
- Vérifier le Content-Type de la requête (
application/x-msgpack)
❌ "Synchronization failed with DataPortal V2"
Cause : Échec de l'authentification Azure AD ou DataPortal V2 inaccessible.
Solution :
# 1. Vérifier la configuration Azure AD dans appsettings.json
cat src/NC.CAM.App.PortailClients.DataPortal.Api/appsettings.json | grep -A 6 "AzureAd"
# 2. Tester la connectivité vers DataPortal V2
curl -I https://cam-dataportalv2-api.azurewebsites.net
# 3. Vérifier les logs de synchronisation
docker-compose logs portailclients-dataportal-api | grep -i "error\|exception"
# 4. Vérifier que le ClientSecret est configuré
# IMPORTANT : Ne jamais commiter le ClientSecret dans Git
# Utiliser des variables d'environnement ou Azure Key Vault en production
# 5. Tester manuellement l'obtention d'un token Azure AD
curl -X POST "https://login.microsoftonline.com/f087b25b-9486-4633-8995-56eb8730e750/oauth2/v2.0/token" \
-d "client_id=c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37" \
-d "client_secret=VOTRE_SECRET" \
-d "grant_type=client_credentials" \
-d "scope=api://c18ff4d2-23af-4b4a-9942-0b5d6e4c9e37/.default"
❌ "Timeout during synchronization"
Cause : Synchronisation d'un volume important de données ou problème réseau.
Solution :
# 1. Augmenter le timeout du HttpClient (dans Program.cs ou appsettings.json)
# Valeur par défaut : 100 secondes
# 2. Vérifier les performances du réseau
ping cam-dataportalv2-api.azurewebsites.net
# 3. Désactiver temporairement la synchronisation
# Éditer appsettings.json :
"SyncSchedule": {
"EnableSync": false
}
# 4. Synchroniser les entités une par une manuellement
# (nécessite l'implémentation d'un endpoint de synchronisation manuelle)
# 5. Vérifier les index de la base de données PostgreSQL
psql -h localhost -p 5432 -U postgres -d DataPortalPortailClients -c "\di"
Réinitialisation complète
En cas de problème majeur :
# 1. Arrêter tous les services
docker-compose down -v
# 2. Supprimer les volumes Docker (attention : perte de données)
docker volume prune
# 3. Supprimer la base de données
docker-compose up -d postgres
docker-compose exec postgres psql -U postgres -c "DROP DATABASE IF EXISTS DataPortalPortailClients;"
# 4. Relancer le DbMigrator et l'API
docker-compose up -d
# 5. Vérifier les logs
docker-compose logs -f portailclients-dataportal-api
Commandes de diagnostic
# Vérifier l'état des conteneurs
docker-compose ps
# Inspecter les logs de l'API
docker-compose logs --tail=100 portailclients-dataportal-api
# Vérifier les connexions à la base de données
docker-compose exec postgres psql -U postgres -d DataPortalPortailClients -c "SELECT COUNT(*) FROM pg_stat_activity;"
# Tester la connectivité vers DataPortal V2
curl -I https://cam-dataportalv2-api.azurewebsites.net
# Tester un endpoint de l'API DataPortal local
curl -k -H "Accept: application/x-msgpack" -H "X-API-KEY: VOTRE_CLE" https://localhost:5221/ContratCavCdg/Cav/12345
# Vérifier les performances de la base de données
docker-compose exec postgres psql -U postgres -d DataPortalPortailClients -c "
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size,
pg_total_relation_size(schemaname||'.'||tablename) AS size_bytes
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY size_bytes DESC;"
# Vérifier les logs de Sentry (si configuré)
# Accéder au tableau de bord Sentry pour voir les erreurs capturées
📚 Ressources complémentaires
Documentation technique
Documentation du projet
Support
Pour toute assistance supplémentaire :
- Issues : Système de tickets
- Contact : Équipe NCIT
📝 Propriété intellectuelle
Copyright (c) 2023-2025 NCIT - Tous droits réservés.
La présente licence accorde au client une autorisation non exclusive et non transférable d'utiliser le logiciel. Le client ne peut pas vendre, distribuer, sous-licencier, modifier ou copier le logiciel sans le consentement écrit préalable de NCIT SARL.
📋 Changelog
Version 1.0.0 (2025-12-09)
- ✅ Initialisation du service tampon DataPortal
- ✅ Intégration MessagePack pour sérialisation binaire
- ✅ Base de données PostgreSQL dédiée
- ✅ Synchronisation automatique avec DataPortal V2
- ✅ API REST avec endpoints optimisés
- ✅ Configuration Docker Compose complète
- ✅ Documentation technique exhaustive
✨ Votre DataPortal Portail Sociétaires est maintenant prêt à l'emploi !