kankwa/Caddyfile.example
Gautier Stefanini 9d08cefe2c feat(admin): G15/ADM-00 — billing fix, droit effectif, audit log, rate limit
Débloque le chantier d'isolation admin (G15). ADM-R2 : la suppression admin
annule désormais l'abonnement Stripe avant d'effacer le compte, sans bloquer
sur un échec fournisseur (journalisé). ADM-R3 : premium_active_clause()
remplace is_premium brut dans les comptages/filtres admin. Ajoute
admin_audit_log (sans FK), la limitation de débit sur /api/admin, le refus
de démarrage sous 32 caractères pour ADMIN_TOKEN, les en-têtes Caddy dédiés,
et la segmentation locale sur growth_events (migrations 0034/0035).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 11:27:04 +00:00

59 lines
3.2 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

tondomaine.com {
encode zstd gzip
# Défense en profondeur : mêmes politiques que lAPI, appliquées aussi au SPA.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
Permissions-Policy "camera=(), geolocation=(), microphone=()"
Content-Security-Policy "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self' https://js.stripe.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https://api.stripe.com https://r.stripe.com; frame-src https://js.stripe.com https://hooks.stripe.com; upgrade-insecure-requests"
}
# Le sitemap est généré par l'API (pages statiques + landing pages), pas servi en statique.
handle /sitemap.xml {
reverse_proxy kankwa-api:8000
}
handle /api/* {
reverse_proxy kankwa-api:8000
}
# Anciens slugs indexés : 301 réelle plutôt que la redirection React côté client
# (un <Navigate> renvoie un 200 puis change d'URL en JS — Google ne transfère
# pas le jus de lien et garde les deux URLs en base). App.tsx garde les mêmes
# redirections en secours ; c'est celle-ci qui compte pour le référencement.
# Le blog a été remplacé par les clusters d'acquisition : chaque article part
# vers la landing qui a repris son intention.
redir /blog / permanent
redir /alternative-doodle-gratuite-sans-compte /outils/sondage-date permanent
redir /alternative-doodle-gratuite-sans-pub /outils/sondage-date permanent
redir /sondage-disponibilite-gratuit-sans-pub /outils/sondage-date permanent
redir /organiser-week-end-entre-amis /organiser/week-end-entre-amis permanent
redir /cadeau-commun-partage-frais-sans-commission /organiser/cadeau-commun permanent
redir /qui-apporte-quoi-fete-ecole /organiser/fete-ecole permanent
# Slugs anglais (kankwa.com) — à déclarer dans le bloc du domaine anglais.
redir /free-availability-poll-no-ads /tools/date-poll permanent
redir /plan-a-weekend-with-friends /plan/weekend-with-friends permanent
redir /group-gift-expense-sharing-no-fee /plan/group-gift permanent
redir /who-brings-what-school-party /plan/school-party permanent
# Pages privées accessibles par lien : jamais indexées, y compris par les
# crawlers qui n'exécutent pas le JS (le noindex côté React ne les couvre pas).
@private path /share/* /cancel/* /hub/p/* /kontrib/* /kount/* /join /compte* /admin*
header @private X-Robots-Tag "noindex, nofollow"
# Interface admin (ADM-00) : au-delà des politiques globales ci-dessus,
# aucun referrer ne doit fuiter vers un tiers embarqué (Recharts/nivo/day-picker
# ne chargent rien d'externe, mais l'outil reste un point d'entrée sensible).
@admin path /admin*
header @admin {
X-Frame-Options "DENY"
X-Content-Type-Options "nosniff"
Referrer-Policy "no-referrer"
}
handle {
reverse_proxy kankwa-frontend:3001
}
}