v3 : déploiement (image unique, produit à la racine, maquette en sous-domaine) et documentation du chantier

- docker/app.Dockerfile : une image Rust + Svelte, la construction rejoue toute
  la boucle (fmt, clippy -D warnings, tests, svelte-check, vitest) ; utilisateur
  non-root, volume /data. docker/app-compose.yml pour sonic (fabio).
- .woodpecker/app.yml : produit sur decision.librodrome.org, attend la maquette,
  écarte tout conteneur qui revendique encore la racine, healthcheck du commit.
- .woodpecker/maquette.yml (ex .woodpecker.yml) : la maquette v2 telle quelle,
  sur maquette.decision.librodrome.org, mêmes volumes.
- .env.example de la maquette rangé dans maquette/ ; celui de la v3 à la racine.
- Docs : README, CONTRIBUTING (travail à deux), CLAUDE.md v3, HANDOFF,
  docs/chantiers (feuille de route, fiche, contrôles, onboarding de Chiara,
  demande à poka), docs/adr 0001–0006.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-21 03:50:44 +02:00
co-authored by Claude Opus 5.5
parent c2669a3d0b
commit 1f9c241b41
24 changed files with 1187 additions and 281 deletions
+28 -43
View File
@@ -1,49 +1,34 @@
# PostgreSQL
POSTGRES_DB=libredecision
POSTGRES_USER=libredecision
POSTGRES_PASSWORD=change-me-in-production
DATABASE_URL=postgresql+asyncpg://libredecision:change-me-in-production@localhost:5432/libredecision
# libreDecision v3 — variables du serveur (ld-server). Toutes facultatives en dev.
# Le serveur lit son environnement, pas de fichier : `set -a; . ./.env; set +a` avant
# `cargo run -p ld-server`. Le .env n'est jamais commité.
# Backend
SECRET_KEY=change-me-in-production-with-a-real-secret-key
DEBUG=true
# Écoute et dossiers
LD_BIND=0.0.0.0:8002
LD_DATA_DIR=data # SQLite, clone du dépôt des textes, clé de publication — données runtime
LD_WEB_DIR=web/build # interface compilée (npm run build)
LD_SEED_DIR=seeds
LD_PUBLIC_URL=http://127.0.0.1:3002
# Environment: development, staging, production
ENVIRONMENT=development
# Connexion Ğ1 — client OAuth2 de connect.monnaie-libre.fr (les deux sont requis, sinon désactivée)
# LD_CONNECT_URL=https://connect.monnaie-libre.fr
# LD_CONNECT_CLIENT_ID=
# LD_CONNECT_CLIENT_SECRET=
# Logging: DEBUG, INFO, WARNING, ERROR
LOG_LEVEL=INFO
# Accès (trustinWallet)
LD_ADMIN_G1_IDS= # ex. idty:8352 — administrateurs des accès, séparés par des virgules
LD_DEV_LOGIN=1 # dev local uniquement : connexion sans clé, membre de tous les groupes
LD_BOOTSTRAP_ADMIN=0 # 1 = au premier démarrage sans admin, écrit data/bootstrap-admin.txt (0600)
# CORS
CORS_ORIGINS=["http://localhost:3002"]
# Publication des textes en vigueur (dépôt git lu par les applis clientes)
# LD_PUBLISH_REMOTE=git@git.duniter.org:Yvv/libredecision-textes.git
# LD_PUBLISH_BRANCH=main
# LD_PUBLISH_KEY=data/keys/publish_ed25519 # générée au démarrage si absente
# LD_PUBLISH_AUTHOR=libreDecision
# LD_PUBLISH_EMAIL=decision@librodrome.org
# Database connection pool
DATABASE_POOL_SIZE=20
DATABASE_MAX_OVERFLOW=10
# Taille de la toile de confiance (W) — lue sur la chaîne, repli sur l'indexeur puis sur la valeur fixe
# LD_RPC_ENDPOINTS=https://rpc.duniter.org,https://g1.axiom-team.fr/ws/
# LD_INDEXERS=https://indexer.duniter.org/v1/graphql
# LD_WOT_FALLBACK=5745
# Auth / Sessions
SESSION_TTL_HOURS=24
CHALLENGE_EXPIRE_SECONDS=300
# Rate limiting (requests per minute)
RATE_LIMIT_DEFAULT=60
RATE_LIMIT_AUTH=10
RATE_LIMIT_VOTE=30
# Duniter V2 RPC
DUNITER_RPC_URL=wss://gdev.p2p.legal/ws
DUNITER_RPC_TIMEOUT_SECONDS=10
# Blockchain cache TTL (seconds)
BLOCKCHAIN_CACHE_TTL_SECONDS=3600
# IPFS
IPFS_API_URL=http://localhost:5001
IPFS_GATEWAY_URL=http://localhost:8080
IPFS_TIMEOUT_SECONDS=30
# Frontend
NUXT_PUBLIC_API_BASE=http://localhost:8002/api/v1
# Docker / Production
DOMAIN=decision.librodrome.org
RUST_LOG=info,sqlx=warn