diff --git a/app/src/lib/backgrounds.ts b/app/src/lib/backgrounds.ts
index 8d2ff6e..c2136d9 100644
--- a/app/src/lib/backgrounds.ts
+++ b/app/src/lib/backgrounds.ts
@@ -1,9 +1,9 @@
/**
- * Scènes du diaporama de fond de l'écran de connexion : de l'art génératif
- * (pas de photo tierce, pour rester libre de droits) - deux à trois taches
- * de couleur douces, floutées, qui dérivent lentement (voir `.tc-drift`
- * dans index.css) et s'enchaînent en fondu. Palette "zen" volontairement
- * sourde : jamais de couleur saturée à pleine opacité.
+ * Scènes du diaporama de fond de l'écran de connexion : art génératif
+ * (pas de photo tierce, pour rester libre de droits) - de larges taches de
+ * couleur saturées, floutées, qui dérivent lentement (voir `.tc-drift` dans
+ * index.css) et s'enchaînent en fondu. Volontairement lumineux et coloré,
+ * pas "noir avec une pointe de couleur" - le fond DOIT se voir.
*/
export interface BackgroundBlob {
color: string;
@@ -14,36 +14,46 @@ export interface BackgroundBlob {
export interface BackgroundScene {
id: string;
+ /** Couleur de base de la scène - un dégradé de fond, pas du noir plat. */
+ base: string;
blobs: BackgroundBlob[];
}
export const BACKGROUND_SCENES: BackgroundScene[] = [
{
id: 'aube',
+ base: 'linear-gradient(160deg, #241a3d 0%, #171029 60%, #0d0a18 100%)',
blobs: [
- { color: 'rgba(123,148,255,0.42)', top: '-12%', left: '58%', size: '56vw' },
- { color: 'rgba(255,168,140,0.24)', top: '52%', left: '2%', size: '44vw' },
+ { color: 'rgba(140,163,255,0.62)', top: '-18%', left: '52%', size: '62vw' },
+ { color: 'rgba(255,140,163,0.42)', top: '46%', left: '-6%', size: '52vw' },
+ { color: 'rgba(255,196,120,0.28)', top: '62%', left: '62%', size: '40vw' },
],
},
{
id: 'nuit',
+ base: 'linear-gradient(160deg, #1c1740 0%, #130f2c 60%, #0b0918 100%)',
blobs: [
- { color: 'rgba(91,102,255,0.38)', top: '-16%', left: '72%', size: '60vw' },
- { color: 'rgba(124,92,255,0.3)', top: '58%', left: '12%', size: '50vw' },
+ { color: 'rgba(110,120,255,0.58)', top: '-20%', left: '66%', size: '66vw' },
+ { color: 'rgba(163,110,255,0.46)', top: '54%', left: '4%', size: '54vw' },
+ { color: 'rgba(94,214,255,0.22)', top: '4%', left: '2%', size: '36vw' },
],
},
{
id: 'foret',
+ base: 'linear-gradient(160deg, #0f2a2e 0%, #0e1f26 60%, #0a1418 100%)',
blobs: [
- { color: 'rgba(94,214,170,0.22)', top: '8%', left: '76%', size: '48vw' },
- { color: 'rgba(53,124,132,0.38)', top: '62%', left: '6%', size: '54vw' },
+ { color: 'rgba(94,224,180,0.48)', top: '2%', left: '70%', size: '54vw' },
+ { color: 'rgba(53,150,166,0.5)', top: '58%', left: '-4%', size: '58vw' },
+ { color: 'rgba(210,255,150,0.2)', top: '70%', left: '68%', size: '38vw' },
],
},
{
id: 'braise',
+ base: 'linear-gradient(160deg, #351a2c 0%, #23122a 60%, #130a1a 100%)',
blobs: [
- { color: 'rgba(255,186,128,0.26)', top: '-6%', left: '18%', size: '50vw' },
- { color: 'rgba(179,111,255,0.3)', top: '54%', left: '68%', size: '54vw' },
+ { color: 'rgba(255,176,110,0.5)', top: '-10%', left: '10%', size: '54vw' },
+ { color: 'rgba(210,120,255,0.44)', top: '48%', left: '64%', size: '58vw' },
+ { color: 'rgba(255,120,150,0.26)', top: '68%', left: '10%', size: '40vw' },
],
},
];
diff --git a/tripoli-edge/deploy/Caddyfile.snippet b/tripoli-edge/deploy/Caddyfile.snippet
index 55b8927..57cb7fc 100644
--- a/tripoli-edge/deploy/Caddyfile.snippet
+++ b/tripoli-edge/deploy/Caddyfile.snippet
@@ -1,15 +1,26 @@
# Bloc ajouté à /opt/edge/Caddyfile sur le serveur (fichier partagé avec
# les 6 autres projets hébergés, donc pas dans ce dépôt en entier — voir
-# le README de ce dossier).
+# le README de ce dossier). Tenu à jour ici pour référence, mais la
+# source de vérité reste le fichier sur le serveur.
#
# Pourquoi Caddy et pas tripoli-edge lui-même sur 80/443 : les ports 80 et
# 443 appartiennent déjà à ce Caddy. tripoli-edge est un service interne
# (172.17.0.1:9000, passerelle docker0, jamais exposé publiquement) :
-# Caddy fait TLS/ACME et le routage par Host, tripoli-edge fait le reste.
+# Caddy fait TLS/ACME et le routage par Host, tripoli-edge fait le reste
+# via /api/*, /healthz et /metrics.
+#
+# Le frontend (build statique React) est servi directement par Caddy
+# depuis /var/www/tripoli-cloud, sans passer par tripoli-edge.
+#
+# Cache-Control explicite, sans quoi le navigateur applique sa propre
+# heuristique - imprévisible, et découvert à nos dépens : un déploiement
+# de frontend restait invisible pour un navigateur qui avait mis en
+# cache l'ancien index.html. `no-cache` force la revalidation à chaque
+# chargement (le fichier change à chaque déploiement) ; les fichiers
+# sous /assets/ ont un nom haché par leur contenu (Vite), donc peuvent
+# être mis en cache indéfiniment sans risque.
tripoli.cloud, www.tripoli.cloud {
- reverse_proxy 172.17.0.1:9000
-
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
@@ -18,6 +29,31 @@ tripoli.cloud, www.tripoli.cloud {
-Server
}
+ handle /api/* {
+ reverse_proxy 172.17.0.1:9000
+ }
+
+ handle /healthz {
+ reverse_proxy 172.17.0.1:9000
+ }
+
+ handle /metrics {
+ reverse_proxy 172.17.0.1:9000
+ }
+
+ handle /assets/* {
+ root * /var/www/tripoli-cloud
+ header Cache-Control "public, max-age=31536000, immutable"
+ file_server
+ }
+
+ handle {
+ root * /var/www/tripoli-cloud
+ header Cache-Control "no-cache"
+ try_files {path} /index.html
+ file_server
+ }
+
log {
output file /var/log/caddy/tripoli-cloud.log
format json