Web/1.0.0 #143

Merged
nicolas merged 8 commits from web/1.0.0 into master 2026-11-10 16:29:36 +01:00
Owner

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 nicolas 2026-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
Les configurations nginx du site vitrine sont copiées telles quelles sur le VPS :
même règle que server/deploy/*.conf.
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.
- Ouverture du site.
- Exovival Zombie Reborn 1.8 : zombies rôdeurs, ouïe des zombies, armes,
  soins.
- Launcher 3.4 : versions prioritaires.
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
nicolas_gitea left a comment
Owner

Site magnifique, je valide

Site magnifique, je valide
nicolas moved this to En cours in Site vitrine on 2026-11-10 16:29:26 +01:00
nicolas merged commit 98cf17c294 into master 2026-11-10 16:29:36 +01:00
nicolas moved this to Terminée in Site vitrine on 2026-11-10 16:35:42 +01:00
Sign in to join this conversation.