meta données pour cette page
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.