meta données pour cette page
Différences
Ci-dessous, les différences entre deux révisions de la page.
| certif:procedure:miseenplaceserveur:serveurdotnet [2026/08/18 14:12] – créée nicolas | certif:procedure:miseenplaceserveur:serveurdotnet [2026/08/18 14:16] (Version actuelle) – nicolas | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Guide de déploiement — Application | + | ====== Guide de déploiement — API .NET (Stimulsoft.PDF.Forms + EF Core SQLite) sur Windows Server + IIS ====== |
| - | //Précision importante | + | //Projet réel : ASP.NET Core Web API, .NET 8, packages |
| - | //Hypothèse | + | //Topologie |
| - | + | ||
| - | **Comment vérifier rapidement lequel s' | + | |
| - | + | ||
| - | Bonne nouvelle par rapport à Node.js ou Angular : IIS et .NET sont conçus par le même éditeur (Microsoft) pour fonctionner ensemble nativement. Il n'y a **pas besoin | + | |
| - | + | ||
| - | > Le sommaire ci-dessous est généré automatiquement par DokuWiki à partir des titres de section. | + | |
| ---- | ---- | ||
| Ligne 15: | Ligne 9: | ||
| ===== 1. Objectif et architecture ===== | ===== 1. Objectif et architecture ===== | ||
| - | Ce document | + | Ce guide décrit |
| + | |||
| + | Comme pour tout ASP.NET Core, IIS héberge l' | ||
| - | Le modèle d' | + | **Schéma :** Angular (autre site/ |
| - | **Schéma | + | **Point d' |
| ===== 2. Prérequis ===== | ===== 2. Prérequis ===== | ||
| Ligne 25: | Ligne 21: | ||
| * Accès administrateur au Windows Server (2016, 2019, 2022 ou équivalent). | * Accès administrateur au Windows Server (2016, 2019, 2022 ou équivalent). | ||
| * Le rôle « Serveur Web (IIS) » disponible via Gestionnaire de serveur. | * Le rôle « Serveur Web (IIS) » disponible via Gestionnaire de serveur. | ||
| - | * Le SDK .NET installé sur le poste/ | + | * Le SDK .NET 8 installé sur le poste/ |
| - | * Le code de l'application prêt, avec un '' | + | * Un nom de domaine ou sous-domaine dédié à l'API (distinct de celui de l' |
| - | * Un nom de domaine | + | * Un certificat SSL pour ce domaine |
| - | * Un certificat SSL (interne | + | * Le fichier de licence Stimulsoft |
| ===== 3. Étape 1 — Installer le rôle IIS ===== | ===== 3. Étape 1 — Installer le rôle IIS ===== | ||
| - | |||
| - | Si IIS n'est pas encore installé sur le serveur : | ||
| <code powershell> | <code powershell> | ||
| Ligne 38: | Ligne 32: | ||
| Install-WindowsFeature -Name Web-Server -IncludeManagementTools | Install-WindowsFeature -Name Web-Server -IncludeManagementTools | ||
| </ | </ | ||
| - | |||
| - | Ou via l' | ||
| ===== 4. Étape 2 — Installer le .NET Hosting Bundle ===== | ===== 4. Étape 2 — Installer le .NET Hosting Bundle ===== | ||
| - | Étape **indispensable et spécifique à ASP.NET Core** : sans elle, IIS ne sait pas exécuter une application .NET Core (erreur 500.19 ou 502.5 sinon). | + | Indispensable pour qu'IIS sache exécuter une application .NET 8 (sans elle, erreur 500.19 ou 502.5). |
| - | * Télécharger le « ASP.NET Core Runtime – Windows Hosting Bundle » correspondant à la version cible du projet (ex. .NET 8) depuis dotnet.microsoft.com/ | + | * Télécharger le « ASP.NET Core Runtime |
| - | * Lancer l' | + | * Lancer l' |
| - | * Redémarrer IIS pour que le nouveau module soit pris en compte | + | * Redémarrer IIS : |
| <code powershell> | <code powershell> | ||
| Ligne 54: | Ligne 46: | ||
| </ | </ | ||
| - | * Vérifier | + | * Vérifier dans IIS Manager |
| - | ===== 5. Étape 3 — Publier l' | + | ===== 5. Étape 3 — Configurer CORS dans le code ===== |
| - | Sur le poste de build (ou directement | + | Comme l'API et l' |
| + | |||
| + | <code csharp> | ||
| + | var builder = WebApplication.CreateBuilder(args); | ||
| + | |||
| + | builder.Services.AddCors(options => | ||
| + | { | ||
| + | options.AddPolicy(" | ||
| + | { | ||
| + | policy.WithOrigins(" | ||
| + | .AllowAnyHeader() | ||
| + | .AllowAnyMethod(); | ||
| + | // .AllowCredentials() si l'API utilise des cookies d' | ||
| + | }); | ||
| + | }); | ||
| + | |||
| + | // ... reste de la configuration ... | ||
| + | |||
| + | var app = builder.Build(); | ||
| + | |||
| + | app.UseCors(" | ||
| + | |||
| + | // ... app.MapControllers(); | ||
| + | </ | ||
| + | |||
| + | > **Remplacer l'URL par la vraie origine de production** de l' | ||
| + | |||
| + | ===== 6. Étape 4 — Préparer un emplacement persistant pour la base SQLite ===== | ||
| + | |||
| + | **C' | ||
| + | |||
| + | * Créer un dossier dédié, en dehors de tout dossier de déploiement, | ||
| + | * Dans '' | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * S' | ||
| + | * Donner au compte du pool d' | ||
| + | * Si des migrations EF Core doivent s' | ||
| + | |||
| + | > **Sauvegardes | ||
| + | |||
| + | ===== 7. Étape 5 — Publier l' | ||
| <code bash> | <code bash> | ||
| Ligne 64: | Ligne 104: | ||
| </ | </ | ||
| - | Le dossier '' | + | Le dossier '' |
| + | |||
| + | > Vérifier que '' | ||
| - | ===== 6. Étape | + | ===== 8. Étape |
| - | Copier | + | Copier |
| <code bash> | <code bash> | ||
| - | # Exemple avec robocopy, en local sur le serveur ou via un partage réseau | + | robocopy publish D: |
| - | robocopy publish D: | + | |
| </ | </ | ||
| - | ===== 7. Étape | + | > **Rappel :** ''/ |
| + | |||
| + | ===== 9. Étape | ||
| - Ouvrir IIS Manager → clic droit sur « Sites » → Ajouter un site web. | - Ouvrir IIS Manager → clic droit sur « Sites » → Ajouter un site web. | ||
| - | - Nom du site : ex. QuestionnaireApp. | + | - Nom du site : ex. QuestionnaireAPI. |
| - | - Chemin d' | + | - Chemin d' |
| - | - Liaison (Binding) : type http, port 80 (et https / port 443 une fois le certificat installé, | + | - Liaison (Binding) : type https de préférence dès le départ (voir étape |
| - | - Pool d' | + | - Pool d' |
| - | - Démarrer le site. | + | - Forcer explicitement l' |
| - | > **Identité du pool d' | + | <code xml> |
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | ===== 8. Étape 6 — Points spécifiques au module Forms Stimulsoft ===== | + | - Démarrer le site. |
| - | ==== 6.1 Déployer la clé de licence | + | ===== 10. Étape 8 — Licence Stimulsoft et taille des requêtes ===== |
| - | Stimulsoft charge sa licence soit par code (clé en dur dans le '' | + | ==== 10.1 Déployer |
| - | <code csharp> | + | Si le code charge la licence par fichier |
| - | var path = Path.Combine(hostEnvironment.ContentRootPath, | + | |
| - | Stimulsoft.Base.StiLicense.LoadFromFile(path); | + | |
| - | </ | + | |
| - | + | ||
| - | — assurez-vous | + | |
| - | ==== 6.2 Taille maximale des requêtes ==== | + | ==== 10.2 Taille maximale des requêtes ==== |
| - | Les formulaires | + | La génération/ |
| <code xml> | <code xml> | ||
| Ligne 108: | Ligne 152: | ||
| < | < | ||
| < | < | ||
| - | < | + | <!-- 50 Mo, à ajuster --> |
| </ | </ | ||
| </ | </ | ||
| Ligne 114: | Ligne 158: | ||
| </ | </ | ||
| - | Si l' | + | ===== 11. Étape 9 — Configurer HTTPS ===== |
| - | ===== 9. Étape 7 — Configurer | + | * Obtenir un certificat SSL pour '' |
| + | * IIS Manager → site → « Certificats de serveur » → importer le certificat, puis ajouter une liaison https sur le port 443. | ||
| + | * Vérifier que ``app.UseHttpsRedirection()`` est bien présent dans '' | ||
| - | Fortement recommandé dès que le questionnaire transmet des données, même peu sensibles. | + | ===== 12. Étape |
| - | + | ||
| - | * Obtenir un certificat SSL : certificat interne (PKI de l' | + | |
| - | * Dans IIS Manager, sélectionner le site → « Certificats de serveur » → importer le certificat. | + | |
| - | * Ajouter une liaison https sur le port 443 pour le site, en sélectionnant ce certificat. | + | |
| - | * Forcer la redirection HTTP → HTTPS : le plus simple ici est d' | + | |
| - | + | ||
| - | ===== 10. Étape | + | |
| - | + | ||
| - | Autoriser uniquement les ports nécessaires en entrée : 80 et 443. Il n'y a ici aucun port applicatif interne à ouvrir (le module ANCM communique avec l' | + | |
| <code powershell> | <code powershell> | ||
| - | New-NetFirewallRule -DisplayName " | + | New-NetFirewallRule -DisplayName " |
| - | New-NetFirewallRule -DisplayName " | + | New-NetFirewallRule -DisplayName " |
| </ | </ | ||
| - | ===== 11. Étape | + | ===== 13. Étape |
| - | - Depuis un poste client | + | - Depuis un poste : '' |
| - | - Vérifier que le questionnaire fonctionne | + | - Depuis l'application Angular réelle (pas juste Postman) |
| - | - Provoquer volontairement un arrêt du pool d' | + | - Générer un formulaire PDF de test de bout en bout, en conditions réelles depuis l' |
| - | - Redémarrer le serveur et vérifier | + | - Vérifier |
| + | - Redémarrer le serveur et vérifier | ||
| - | ===== 12. Étape | + | ===== 14. Étape |
| - | Par défaut, | + | Activer temporairement |
| <code xml> | <code xml> | ||
| - | < | + | < |
| - | | + | stdoutLogEnabled=" |
| - | stdoutLogEnabled=" | + | |
| - | | + | |
| hostingModel=" | hostingModel=" | ||
| </ | </ | ||
| - | Créer le sous-dossier '' | + | Créer le sous-dossier '' |
| - | + | ||
| - | Les logs IIS classiques restent | + | |
| - | + | ||
| - | ===== 13. Étape 11 — Sécuriser l' | + | |
| - | * Activer HSTS ('' | + | ===== 15. Étape 13 — Sécuriser l' |
| - | * Valider et assainir les entrées du questionnaire côté serveur (pas seulement côté client). | + | |
| - | * Ne jamais stocker de secrets (chaînes de connexion, clés API) en clair dans '' | + | |
| - | * Restreindre les droits NTFS du dossier '' | + | |
| - | * Mettre en place une limite de débit si nécessaire (middleware '' | + | |
| - | ===== 14. Étape 12 — Procédure de mise à jour de l' | + | * Confirmer que Swagger/ |
| + | * Restreindre la politique CORS à l' | ||
| + | * Restreindre les droits NTFS de '' | ||
| + | * Ne jamais committer '' | ||
| + | * Valider côté serveur toutes les entrées reçues de l' | ||
| - | - Sur le poste de build : récupérer la nouvelle version du code, puis relancer '' | + | ===== 16. Étape 14 — Procédure |
| - | - Avant de copier les nouveaux fichiers, déposer un fichier '' | + | |
| - | - Copier les nouveaux fichiers ('' | + | |
| - | - Supprimer '' | + | |
| - | - Vérifier rapidement (étape 9) que le site répond correctement. | + | |
| - | > **Bonnes pratiques | + | - Sur le poste de build : '' |
| + | - Optionnel mais recommandé avant une mise à jour de schéma : copier | ||
| + | - Déposer un '' | ||
| + | - '' | ||
| + | - Supprimer '' | ||
| + | - Vérifier (étape 11) que l'API répond correctement et que les données existantes sont toujours présentes. | ||
| - | ===== 15. Checklist finale ===== | + | ===== 17. Checklist finale ===== |
| ^ Élément ^ Statut ^ | ^ Élément ^ Statut ^ | ||
| | Rôle IIS installé | ☐ | | | Rôle IIS installé | ☐ | | ||
| - | | .NET Hosting Bundle installé, | + | | .NET 8 Hosting Bundle installé, AspNetCoreModuleV2 vérifié |
| + | | Politique CORS configurée avec l' | ||
| + | | Dossier de données SQLite créé hors du dossier de déploiement | ☐ | | ||
| + | | Chaîne de connexion pointant vers ce dossier (appsettings.Production.json) | ☐ | | ||
| + | | Droits NTFS du pool d' | ||
| | Application publiée (dotnet publish -c Release) | ☐ | | | Application publiée (dotnet publish -c Release) | ☐ | | ||
| - | | Fichiers copiés sur le serveur (dossier publish/, avec web.config) | ☐ | | + | | Fichiers copiés sur le serveur (web.config |
| - | | Site créé dans IIS, pool en « No Managed Code » | ☐ | | + | | license.key présent sur le serveur |
| - | | Fichier | + | | Limite de taille des requêtes ajustée si besoin | ☐ | |
| - | | Limite de taille des requêtes | + | | Site créé dans IIS, pool en « No Managed Code », ASPNETCORE_ENVIRONMENT=Production |
| - | | Binding http configuré | + | |
| | Certificat SSL installé, binding https configuré | ☐ | | | Certificat SSL installé, binding https configuré | ☐ | | ||
| - | | Redirection HTTP → HTTPS active | ☐ | | ||
| | Pare-feu : ports 80/443 ouverts | ☐ | | | Pare-feu : ports 80/443 ouverts | ☐ | | ||
| - | | Test de bout en bout du questionnaire réussi | + | | Appel depuis l' |
| - | | Redémarrage serveur testé (reprise automatique) | + | | Génération de PDF testée |
| - | | Droits NTFS restreints sur le dossier du site | ☐ | | + | | Base SQLite vérifiée au bon emplacement, |
| - | | Secrets non stockés | + | | Sauvegarde de la base SQLite planifiée |
| + | | Swagger désactivé/ | ||
| - | ===== 16. Annexe — Dépannage rapide ===== | + | ===== 18. Annexe — Dépannage rapide ===== |
| ^ Symptôme ^ Piste de résolution ^ | ^ Symptôme ^ Piste de résolution ^ | ||
| - | | Erreur HTTP 500.19 | web.config invalide, ou module ANCM absent — vérifier que le Hosting Bundle | + | | Erreur CORS dans la console navigateur | Vérifier l' |
| - | | Erreur HTTP 500.30 (in-process start failure) | L' | + | | Les données disparaissent après un déploiement | La base SQLite était encore dans le dossier de déploiement écrasé par /MIR — la déplacer vers un dossier persistant (étape 4) et restaurer depuis une sauvegarde si disponible. | |
| - | | Erreur HTTP 500.31 / 502.5 | Le module ANCM ne trouve pas l' | + | | Erreur d' |
| - | | Le site ne répond pas après une mise à jour | Vérifier qu''' | + | | Erreur HTTP 500.19 | web.config invalide ou Hosting Bundle |
| - | | Erreur d' | + | | Erreur HTTP 500.30 (in-process start failure) | Activer |
| - | | Le site répond en HTTP mais pas en HTTPS | Vérifier le binding 443 et que le certificat sélectionné est valide et non expiré. | | + | | Erreur de licence Stimulsoft en production | license.key |
| - | | Erreur de licence Stimulsoft en production | + | | Erreur 404.13 |
| - | | Erreur 404.13 | + | |
| ---- | ---- | ||
| //Document préparé le 18 août 2026.// | //Document préparé le 18 août 2026.// | ||