Choix : ASP.NET Core (Razor Pages), intégré à Visual Studio
Les deux options ne se valaient pas techniquement, ASP.NET est le meilleur choix :
Le site réutilise le code exact du launcher. Il vérifie la signature de launcher-update.json avec la même clé publique que le launcher, intégrée à l’exe du site. Il nettoie et borne les notes de version avec les mêmes règles que le launcher. Le bouton de téléchargement n’apparaît que si la signature est valide et si l’exe est sur le même serveur.
Même déploiement que la Launcher API : exe autonome, service systemd durci, nginx. Aucun paquet tiers.
Isolé de l’API. Le site lit seulement les fichiers .json, de son côté, toutes les 10 minutes. Les visiteurs ne contactent jamais le serveur du launcher, sauf en cliquant sur « Télécharger ».
Vos questions
Le second VPS : utile, je le recommande. Une faille dans le site n’atteindrait alors ni l’API d’administration, ni le journal d’audit (qui contient des adresses IP), ni les demandes des joueurs. Un pic de trafic sur le site ne ralentirait pas non plus les mises à jour. Ce n’est pas indispensable, car le site est déjà très cloisonné, mais vous avez déjà ce VPS. Rien ne change sur le VPS du launcher.
Liseuse Markdown : inutile pour les notes du launcher, que launcher-update.json fournit déjà dans le même format que celles du jeu. Je l’ai utilisée pour les actualités : un fichier .md par article, versionné dans le dépôt. Le HTML brut et les liens javascript: y sont neutralisés.
Direction artistique
Launcher et accueil : le violet et cyan du thème par défaut, avec la planète.
Exovival : noir et vert néon, titres condensés. En haut de la page, le curseur fait office de lampe UV et révèle « Léa ♥ Papa » sur le mur du couloir. La galerie montre des images extraites de vos cassettes VHS, et une section présente « L’abri » comme en développement. -Il n’y a aucun code ni solution d’énigme sur le site.
Jeu multijoueur : un thème ambre, sur une page « En préparation ».
**Choix : ASP.NET Core (Razor Pages), intégré à Visual Studio**
Les deux options ne se valaient pas techniquement, ASP.NET est le meilleur choix :
- **Le site réutilise le code exact du launcher**. Il vérifie la signature de `launcher-update.json` avec la même clé publique que le launcher, intégrée à l’exe du site. Il nettoie et borne les notes de version avec les mêmes règles que le launcher. Le bouton de téléchargement n’apparaît que si la signature est valide et si l’exe est sur le même serveur.
- **Même déploiement que la Launcher API** : exe autonome, service systemd durci, nginx. Aucun paquet tiers.
- **Isolé de l’API**. Le site lit seulement les fichiers `.json`, de son côté, toutes les 10 minutes. Les visiteurs ne contactent jamais le serveur du launcher, sauf en cliquant sur « Télécharger ».
**Vos questions**
- **Le second VPS : utile, je le recommande**. Une faille dans le site n’atteindrait alors ni l’API d’administration, ni le journal d’audit (qui contient des adresses IP), ni les demandes des joueurs. Un pic de trafic sur le site ne ralentirait pas non plus les mises à jour. Ce n’est pas indispensable, car le site est déjà très cloisonné, mais vous avez déjà ce VPS. Rien ne change sur le VPS du launcher.
- **Liseuse Markdown** : inutile pour les notes du launcher, que **launcher-update.json** fournit déjà dans le même format que celles du jeu. Je l’ai utilisée pour les **actualités** : un fichier .md par article, versionné dans le dépôt. Le HTML brut et les liens `javascript:` y sont neutralisés.
**Direction artistique**
- **Launcher et accueil** : le violet et cyan du thème par défaut, avec la planète.
- **Exovival** : noir et vert néon, titres condensés. En haut de la page, le curseur fait office de **lampe UV** et révèle « Léa ♥ Papa » sur le mur du couloir. La galerie montre des images extraites de vos cassettes VHS, et une section présente « L’abri » comme en développement. -Il n’y a aucun code ni solution d’énigme sur le site.
- **Jeu multijoueur** : un thème ambre, sur une page « En préparation ».
nicolas
added this to the Site vitrine milestone 2026-11-10 16:25:24 +01:00
nicolas
added the Ajout label 2026-11-10 16:25:24 +01:00
nicolas
self-assigned this 2026-11-10 16:25:24 +01:00
nicolas_gitea
was assigned by nicolas2026-11-10 16:25:24 +01:00
nicolas
added this to the Site vitrine project 2026-11-10 16:25:24 +01:00
nicolas
added 8 commits 2026-11-10 16:25:25 +01:00
Projet ajouté à la solution (dossier « website »), sans paquet NuGet tiers.
Références : GameLauncher.Contracts et GameLauncher.Core.
Isolé de la Launcher API : le site ne l'appelle jamais. En arrière-plan, côté
serveur, il lit seulement les fichiers publics launcher-update.json et
manifest.json :
- toutes les 10 minutes, avec requêtes conditionnelles (ETag, Last-Modified) ;
- https uniquement, aucune redirection suivie, taille et délai bornés.
Les pages ne déclenchent aucune requête sortante.
launcher-update.json :
- signature vérifiée avec la clé update-signing.pub, intégrée à l'exe du site,
par le même code que le launcher (UpdateSignature) ;
- l'exécutable doit être sur le même serveur, en https ;
- produit attendu facultatif (Site:Launcher:Product) ;
- fichier refusé : téléchargement retiré ; serveur injoignable : dernière
version valide conservée.
Notes de version : bornées et nettoyées comme dans le launcher
(ChangelogLimits.Normalize). Sections réservées à l'équipe masquées pour le
launcher (Site:Launcher:HiddenSections).
Certificat HTTPS du serveur du launcher : même règle que par défaut ; en cas de
refus, le journal détaille la chaîne de certificats (TlsDiagnostics) et la
cause complète de l'erreur réseau.
Actualités en Markdown (Content/News) : liseuse maison SafeMarkdown.
- tout le texte est encodé ;
- liens http(s), mailto et chemins du site seulement ;
- images du site (/img/) seulement.
Sécurité HTTP :
- CSP stricte (aucun script en ligne, aucune ressource externe), HSTS,
nosniff, X-Frame-Options, Referrer-Policy, Permissions-Policy, COOP/CORP ;
- GET/HEAD seulement (405 sinon) ;
- limite de requêtes par IP ;
- aucun cookie, clés de protection des données en mémoire ;
- en-tête Server retiré.
Autres :
- réglages contrôlés au démarrage (SiteOptionsValidator) ;
- dates en français sans dépendance à ICU (InvariantGlobalization) ;
- robots.txt, sitemap.xml, /healthz réservé à la machine locale.
Pages :
- accueil ;
- /launcher : présentation des fonctions joueur, téléchargement vérifié
(version, taille, empreinte SHA-256), première installation, notes de la
dernière version, lien vers les publications Gitea, questions fréquentes ;
- /jeux et /jeux/exovival-zombie-reborn : histoire, contenu, cassettes VHS,
extension « L'abri » en développement, configuration ;
- /jeux/<jeu>/notes-de-version : toutes les versions ;
- page générique des jeux en préparation (projet multijoueur) ;
- actualités, mentions légales, confidentialité, erreurs 404 et 500.
Thèmes par page (data-theme) :
- launcher : violet et cyan, police Sora ;
- exovival : noir et vert, Barlow Condensed ; en-tête « lampe UV » qui révèle
le message de Léa sous le pointeur ;
- multi : ambre.
Notes de version affichées comme dans le launcher (titre, sous-titre,
introduction, sections, étiquettes), textes toujours encodés.
Bouton « Nous contacter » : simple lien mailto. Aucun formulaire.
Responsive jusqu'au mobile, focus clavier visible, mouvement réduit respecté.
Script sans dépendance (menu mobile, copie de l'empreinte, lampe UV),
compatible avec la CSP (aucun script en ligne).
- Polices auto-hébergées Sora, Barlow et Barlow Condensed (WOFF2), avec leurs
licences OFL : aucune requête vers un service externe.
- Captures d'Exovival : couloir de l'école, encre UV, images des cassettes VHS
sans les dates qui révèlent un code, et vues de l'abri en développement. Le
tout en WebP.
- Captures du launcher (docs/preview*.png et UiSnapshot) en WebP.
- Favicon et icônes reprises du launcher, images de partage (Open Graph) du
launcher et d'Exovival.
Les sources du site (Services, Options) et la clé publique sont compilées
dans le projet de tests, sans référence au projet du site : une référence
copierait l'appsettings.json du site à la place de celui de la Launcher API
dans le dossier des tests.
Tests :
- launcher-update.json : signature valide, contenu modifié, autre clé,
exécutable hors du serveur (autre hôte, http, autre port, paramètres),
produit inattendu, clé intégrée ;
- manifest : bornes et nettoyage des notes, autre jeu, fichier illisible ;
- réseau : adresses https uniquement, lecture bornée, message d'erreur
détaillé (certificat refusé) ;
- Markdown : HTML brut, liens javascript:, data: et //, injection
d'attribut, images externes, syntaxe prise en charge ;
- actualités : en-tête, noms de fichiers invalides, brouillons.
- publish-site.bat : exe autonome linux-x64, archive et empreinte SHA-256.
- installer-site.sh :
- archive vérifiée par son empreinte ;
- binaires dans /opt/lanisys-site (propriétaire root) ;
- appsettings.Production.json conservé d'une version à l'autre ;
- sorties réseau autorisées recalculées (serveur du launcher + DNS) dans
sortie.conf ;
- retour à la version précédente si le site ne répond pas.
- lanisys-site.service :
- compte temporaire (DynamicUser), système en lecture seule, aucun privilège ;
- dossier personnel /var/lib/lanisys-site (700), nécessaire à .NET pour
vérifier un certificat HTTPS sous Debian 11 ;
- connexions sortantes limitées au serveur du launcher ;
- mémoire limitée.
- nginx-site.conf :
- redirection http → https et domaine nu → www ;
- HTTP/2 compatible nginx 1.18 (listen … http2) ;
- TLS 1.2 et 1.3, renouvellement Let's Encrypt par webroot ;
- lectures seulement, fichiers cachés jamais servis, gzip, limite de
requêtes (nginx-site-zones.conf).
- LISEZMOI.md : pourquoi un VPS séparé, domaine, publication, installation,
nginx et HTTPS, mentions légales, journaux, mise à jour, écriture des
actualités, ajout d'un jeu, test en local, dépannage, fichiers sur le VPS.
Debian 11, 12 ou 13.
Ligne GameLauncher.Website dans la structure de la solution, nouvelle section
§9 : pages, thèmes, isolation de la Launcher API, téléchargement vérifié,
sécurité HTTP, service durci, liseuse Markdown, tests, captures à mettre à jour.
nicolas
requested review from nicolas_gitea 2026-11-10 16:25:25 +01:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Choix : ASP.NET Core (Razor Pages), intégré à Visual Studio
Les deux options ne se valaient pas techniquement, ASP.NET est le meilleur choix :
launcher-update.jsonavec la même clé publique que le launcher, intégrée à l’exe du site. Il nettoie et borne les notes de version avec les mêmes règles que le launcher. Le bouton de téléchargement n’apparaît que si la signature est valide et si l’exe est sur le même serveur..json, de son côté, toutes les 10 minutes. Les visiteurs ne contactent jamais le serveur du launcher, sauf en cliquant sur « Télécharger ».Vos questions
javascript:y sont neutralisés.Direction artistique
- publish-site.bat : exe autonome linux-x64, archive et empreinte SHA-256. - installer-site.sh : - archive vérifiée par son empreinte ; - binaires dans /opt/lanisys-site (propriétaire root) ; - appsettings.Production.json conservé d'une version à l'autre ; - sorties réseau autorisées recalculées (serveur du launcher + DNS) dans sortie.conf ; - retour à la version précédente si le site ne répond pas. - lanisys-site.service : - compte temporaire (DynamicUser), système en lecture seule, aucun privilège ; - dossier personnel /var/lib/lanisys-site (700), nécessaire à .NET pour vérifier un certificat HTTPS sous Debian 11 ; - connexions sortantes limitées au serveur du launcher ; - mémoire limitée. - nginx-site.conf : - redirection http → https et domaine nu → www ; - HTTP/2 compatible nginx 1.18 (listen … http2) ; - TLS 1.2 et 1.3, renouvellement Let's Encrypt par webroot ; - lectures seulement, fichiers cachés jamais servis, gzip, limite de requêtes (nginx-site-zones.conf). - LISEZMOI.md : pourquoi un VPS séparé, domaine, publication, installation, nginx et HTTPS, mentions légales, journaux, mise à jour, écriture des actualités, ajout d'un jeu, test en local, dépannage, fichiers sur le VPS. Debian 11, 12 ou 13.Site magnifique, je valide