====== Guide — Générer (VS Code) et déployer manuellement le serveur .NET sur Windows Server + IIS ====== //Ce guide couvre le flux de travail développeur : écrire/builder l'application dans VS Code, générer le paquet de publication, puis le déployer **à la main** (copie de fichiers, sans CI/CD ni Web Deploy automatisé). Pour la configuration serveur/IIS elle-même (Hosting Bundle, site IIS, CORS, base SQLite, dépannage), voir le guide dédié — celui-ci se concentre sur le cycle "je code → je publie → je copie sur le serveur".// ---- ===== 1. Objectif ===== Trois temps : développer et vérifier en local dans VS Code, générer un paquet de publication propre (``dotnet publish``), puis le transférer sur le serveur par copie manuelle (RDP ou partage réseau) sans écraser ce qui doit rester stable côté serveur (configuration de production, base de données). **Ce qui ne doit jamais être écrasé par un déploiement**, à garder en tête tout du long : * ``appsettings.Production.json`` (contient les vraies valeurs CORS, chemin de base, éventuellement la licence) — ne doit pas être committé avec des secrets, ni écrasé à chaque copie s'il diffère de celui du dépôt. * Le dossier/fichier de la base SQLite — déjà hors du dossier de déploiement si vous avez suivi le guide serveur, donc naturellement épargné par une copie du dossier de publication. ===== 2. Prérequis ===== * VS Code installé, avec l'extension **C# Dev Kit** (ou a minima l'extension **C#** d'OmniSharp) — Extensions (Ctrl+Shift+X) → rechercher « C# Dev Kit ». * Le SDK .NET 8 installé sur le poste de développement : dotnet --version * Un accès au serveur de déploiement : soit par **Bureau à distance (RDP)**, soit par un **partage réseau** (lecteur mappé ou chemin UNC type ``\\app-logeas-ovh\c$\RemoteApp\``). * Le serveur déjà configuré côté IIS (rôle, Hosting Bundle, VC++ Redistributable, site créé) — voir le guide serveur dédié si ce n'est pas encore fait. ===== 3. Étape 1 — Ouvrir et vérifier le projet dans VS Code ===== * ``Fichier → Ouvrir le dossier...`` → sélectionner la racine du projet (celle contenant le ``.csproj``). * VS Code propose généralement d'ajouter les fichiers ``.vscode/tasks.json`` et ``launch.json`` nécessaires au débogage — acceptez si proposé (ou voir étape 3.1 pour les créer manuellement). * Ouvrez un terminal intégré : ``Terminal → Nouveau terminal`` (ou ``` Ctrl+` ```), il s'ouvre déjà positionné à la racine du projet. ==== 3.1 (Optionnel) Créer une tâche de build/publish réutilisable ==== Pour éviter de retaper la commande à chaque fois, créez ``.vscode/tasks.json`` : { "version": "2.0.0", "tasks": [ { "label": "publish", "command": "dotnet", "type": "process", "args": [ "publish", "${workspaceFolder}/Logeas.Forms.Server.csproj", "-c", "Release", "-o", "${workspaceFolder}/publish" ], "problemMatcher": "$msCompile" } ] } Ensuite, ``Terminal → Exécuter la tâche...`` → ``publish`` lance la publication sans retaper la commande. ===== 4. Étape 2 — Vérifier en local avant de publier ===== Ne publiez jamais sans avoir vérifié que l'application compile et démarre proprement en local : dotnet build dotnet run Vérifiez dans la console qu'il n'y a pas d'erreur de compilation, que les migrations EF Core s'appliquent sans erreur, et que le message ``Application started`` apparaît. Arrêtez ensuite avec ``Ctrl+C``. > Si votre ``appsettings.json`` de développement pointe vers une base SQLite locale de test, c'est normal et attendu — c'est ``appsettings.Production.json``, présent uniquement sur le serveur (ou explicitement exclu du paquet, voir étape 6), qui redirigera vers la vraie base en production. ===== 5. Étape 3 — Publier (générer le paquet de déploiement) ===== Dans le terminal intégré VS Code : dotnet publish -c Release -o ./publish (ou ``Terminal → Exécuter la tâche... → publish`` si vous avez créé la tâche de l'étape 3.1). Cette commande génère dans ``./publish`` : les DLL compilées, les dépendances, le ``web.config`` prêt pour IIS, et tout fichier marqué « Copy to Output Directory » dans le ``.csproj`` (typiquement ``appsettings.json``, et ``appsettings.Production.json`` **si** il est inclus dans le projet — voir avertissement étape 6). ===== 6. Étape 4 — Vérifier le contenu du paquet avant de le copier ===== Get-ChildItem ./publish Contrôlez la présence de : * ``Logeas.Forms.Server.dll`` (ou le nom réel de votre assembly) et ``web.config``. * ``appsettings.json`` (toujours présent, valeurs par défaut/dev). * Le fichier de licence Stimulsoft, si votre code le charge par fichier. > **Point d'attention sur ``appsettings.Production.json`` :** s'il est versionné dans votre dépôt Git avec les vraies valeurs de production (CORS, chemin de base), il sera republié et écrasera la version du serveur à chaque déploiement — ce qui est en fait acceptable **si** ce fichier ne contient aucun secret sensible et que ses valeurs sont censées être identiques à chaque déploiement (ex. l'origine CORS ne change pas souvent). Si en revanche il contient des valeurs qui ne doivent **jamais** être committées (chaîne de connexion avec mot de passe, clé de licence), gardez-le **hors du dépôt Git** (``.gitignore``) et **hors du dossier publié** — dans ce cas il doit être créé une seule fois manuellement sur le serveur (voir guide serveur, étape 8) et jamais recopié depuis le poste de dev. Adaptez l'étape 8 ci-dessous en fonction de votre choix. ===== 7. Étape 5 — Copier vers le serveur ===== Deux méthodes possibles, au choix selon votre confort : ==== 7.1 Par Bureau à distance (RDP) ==== - Ouvrez une session RDP vers le serveur (``mstsc``). - Activez le partage du presse-papiers et/ou des lecteurs locaux dans les options de connexion RDP (``Options d'affichage → Ressources locales → Lecteurs`` avant de vous connecter), pour pouvoir glisser-déposer ou copier-coller le dossier ``publish`` depuis votre poste vers le serveur. - Collez le contenu dans ``C:\RemoteApp\Formulaire\`` (voir étape 8 pour la méthode qui préserve les fichiers à ne pas écraser). ==== 7.2 Par partage réseau (recommandé, plus fiable pour les mises à jour répétées) ==== Si le serveur expose un partage administratif ou dédié accessible depuis le poste de dev : # Depuis le poste de développement, dans le terminal VS Code robocopy .\publish "\\app-logeas-ovh\c$\RemoteApp\Formulaire" /MIR /XF appsettings.Production.json /XD logs ===== 8. Étape 6 — Ce que la copie doit préserver ===== Que vous copiiez à la main (RDP) ou via ``robocopy`` (partage réseau), n'écrasez jamais : * ``appsettings.Production.json`` **si** vous avez choisi de le maintenir uniquement côté serveur (voir avertissement étape 6) — avec ``robocopy``, l'option ``/XF appsettings.Production.json`` l'exclut automatiquement de la synchronisation, dans les deux sens. * Le dossier ``logs\`` s'il existe déjà côté serveur (pas besoin de le republier, ``/XD logs`` l'exclut). * Tout dossier de données (base SQLite) — normalement déjà hors de ``C:\RemoteApp\Formulaire\`` si vous avez suivi le guide serveur, donc naturellement non concerné par cette copie. Si vous copiez à la main via RDP (pas de ``robocopy``), soyez vigilant à ne pas écraser ``appsettings.Production.json`` par un glisser-déposer global du dossier ``publish`` — copiez plutôt fichier par fichier, ou dossier par dossier en excluant ce fichier spécifique. ===== 9. Étape 7 — Libérer les fichiers verrouillés avant la copie ===== Le process .NET de l'application a certains fichiers ouverts (DLL en cours d'exécution) — les écraser directement peut échouer ou nécessiter un redémarrage du pool après coup. Méthode propre : - Sur le serveur, déposez un fichier vide nommé ``app_offline.htm`` à la racine de ``C:\RemoteApp\Formulaire\`` (IIS/ANCM arrête proprement l'application en le détectant) : New-Item -ItemType File -Path "C:\RemoteApp\Formulaire\app_offline.htm" -Force - Effectuez la copie (étape 7). - Supprimez ``app_offline.htm`` : Remove-Item "C:\RemoteApp\Formulaire\app_offline.htm" L'application redémarre automatiquement à la requête suivante. ===== 10. Étape 8 — Vérifier après déploiement ===== Reprenez la méthode de test fiable du guide serveur (le piège du SNI avec curl s'applique toujours) : curl.exe -v -k --resolve formulaire.logeas-web.fr:443:127.0.0.1 https://formulaire.logeas-web.fr/ Un ``404`` sur ``/`` est normal (API sans route racine). Testez ensuite une vraie route, puis depuis l'application Angular réelle pour valider CORS. En cas de problème, reportez-vous à la table de décision du guide serveur (annexe A) plutôt que de repartir de zéro. ===== 11. Checklist rapide de déploiement ===== ^ Élément ^ Statut ^ | Build local sans erreur (dotnet build) | ☐ | | Démarrage local sans exception (dotnet run, puis Ctrl+C) | ☐ | | Publication générée (dotnet publish -c Release -o ./publish) | ☐ | | Contenu du dossier publish vérifié (DLL, web.config, licence) | ☐ | | app_offline.htm déposé avant la copie | ☐ | | Copie effectuée SANS écraser appsettings.Production.json ni le dossier logs/données | ☐ | | app_offline.htm supprimé après la copie | ☐ | | Test post-déploiement réussi (curl --resolve, route réelle, Angular) | ☐ | ===== 12. Annexe — Script de déploiement manuel prêt à copier-coller ===== Un script qu'on **lance soi-même à la main** (pas de CI/CD), juste pour fiabiliser la séquence et éviter les oublis (app_offline, exclusions) : # À exécuter depuis le poste de dev, dans le terminal VS Code, à la racine du projet $serveur = "\\app-logeas-ovh\c$\RemoteApp\Formulaire" dotnet publish -c Release -o ./publish New-Item -ItemType File -Path "$serveur\app_offline.htm" -Force Start-Sleep -Seconds 2 robocopy .\publish $serveur /MIR /XF appsettings.Production.json /XD logs Remove-Item "$serveur\app_offline.htm" Write-Host "Déploiement terminé. Pensez à tester avec curl --resolve." ---- //Document préparé le 18 août 2026.//