Domaine : libredecision.org → decision.librodrome.org partout

- docker-compose.yml : labels Traefik + CORS_ORIGINS + NUXT_PUBLIC_API_BASE
- docs/deployment.md : toutes les URLs et exemples curl
- CLAUDE.md : référence domaine
- .env.example : DOMAIN + noms DB/USER glibredecision → libredecision
- package-lock.json : name glibredecision → libredecision

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-03-24 01:29:59 +01:00
parent f87cbc0f2f
commit d5857a91eb
5 changed files with 22 additions and 22 deletions

View File

@@ -1,8 +1,8 @@
# PostgreSQL # PostgreSQL
POSTGRES_DB=glibredecision POSTGRES_DB=libredecision
POSTGRES_USER=glibredecision POSTGRES_USER=libredecision
POSTGRES_PASSWORD=change-me-in-production POSTGRES_PASSWORD=change-me-in-production
DATABASE_URL=postgresql+asyncpg://glibredecision:change-me-in-production@localhost:5432/glibredecision DATABASE_URL=postgresql+asyncpg://libredecision:change-me-in-production@localhost:5432/libredecision
# Backend # Backend
SECRET_KEY=change-me-in-production-with-a-real-secret-key SECRET_KEY=change-me-in-production-with-a-real-secret-key
@@ -46,4 +46,4 @@ IPFS_TIMEOUT_SECONDS=30
NUXT_PUBLIC_API_BASE=http://localhost:8002/api/v1 NUXT_PUBLIC_API_BASE=http://localhost:8002/api/v1
# Docker / Production # Docker / Production
DOMAIN=glibredecision.org DOMAIN=decision.librodrome.org

View File

@@ -84,5 +84,5 @@ docker compose -f docker/docker-compose.yml up
- **Mood system** : `useMood.ts` synchronise `colorMode.preference` avec la palette — **jamais** de `:global()` dans `<style scoped>` pour les styles mood-dépendants (causa le bug dark mode veil) - **Mood system** : `useMood.ts` synchronise `colorMode.preference` avec la palette — **jamais** de `:global()` dans `<style scoped>` pour les styles mood-dépendants (causa le bug dark mode veil)
- **Sceau** `井` (#48 Tsing) : `.app-seal` dans `app.vue`, right-aligned ; SVGs dans `public/` - **Sceau** `井` (#48 Tsing) : `.app-seal` dans `app.vue`, right-aligned ; SVGs dans `public/`
- **CSS drop-shadow()** safe pour effets emboss ; `<filter>` SVG inline cause des artefacts de rendu - **CSS drop-shadow()** safe pour effets emboss ; `<filter>` SVG inline cause des artefacts de rendu
- **Domaine** : libredecision.org (Woodpecker CI ; ancien dossier : Glibredecision) - **Domaine** : decision.librodrome.org (Woodpecker CI ; ancien dossier : Glibredecision)
- **Ed25519 verification** : stub en dev (substrate-interface), autoritaire en prod — ne pas bypasser sans test - **Ed25519 verification** : stub en dev (substrate-interface), autoritaire en prod — ne pas bypasser sans test

View File

@@ -34,13 +34,13 @@ services:
ENVIRONMENT: production ENVIRONMENT: production
DEBUG: "false" DEBUG: "false"
DEMO_MODE: ${DEMO_MODE:-true} DEMO_MODE: ${DEMO_MODE:-true}
CORS_ORIGINS: '["https://${DOMAIN:-libredecision.org}"]' CORS_ORIGINS: '["https://${DOMAIN:-decision.librodrome.org}"]'
DUNITER_RPC_URL: ${DUNITER_RPC_URL:-wss://gdev.p2p.legal/ws} DUNITER_RPC_URL: ${DUNITER_RPC_URL:-wss://gdev.p2p.legal/ws}
IPFS_API_URL: http://ipfs:5001 IPFS_API_URL: http://ipfs:5001
IPFS_GATEWAY_URL: http://ipfs:8080 IPFS_GATEWAY_URL: http://ipfs:8080
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.libredecision-api.rule=Host(`${DOMAIN:-libredecision.org}`) && PathPrefix(`/api`)" - "traefik.http.routers.libredecision-api.rule=Host(`${DOMAIN:-decision.librodrome.org}`) && PathPrefix(`/api`)"
- "traefik.http.routers.libredecision-api.entrypoints=websecure" - "traefik.http.routers.libredecision-api.entrypoints=websecure"
- "traefik.http.routers.libredecision-api.tls.certresolver=letsencrypt" - "traefik.http.routers.libredecision-api.tls.certresolver=letsencrypt"
- "traefik.http.services.libredecision-api.loadbalancer.server.port=8002" - "traefik.http.services.libredecision-api.loadbalancer.server.port=8002"
@@ -57,10 +57,10 @@ services:
depends_on: depends_on:
- backend - backend
environment: environment:
NUXT_PUBLIC_API_BASE: https://${DOMAIN:-libredecision.org}/api/v1 NUXT_PUBLIC_API_BASE: https://${DOMAIN:-decision.librodrome.org}/api/v1
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.libredecision-front.rule=Host(`${DOMAIN:-libredecision.org}`)" - "traefik.http.routers.libredecision-front.rule=Host(`${DOMAIN:-decision.librodrome.org}`)"
- "traefik.http.routers.libredecision-front.entrypoints=websecure" - "traefik.http.routers.libredecision-front.entrypoints=websecure"
- "traefik.http.routers.libredecision-front.tls.certresolver=letsencrypt" - "traefik.http.routers.libredecision-front.tls.certresolver=letsencrypt"
- "traefik.http.services.libredecision-front.loadbalancer.server.port=3000" - "traefik.http.services.libredecision-front.loadbalancer.server.port=3000"

View File

@@ -13,7 +13,7 @@ Ce guide couvre le deploiement complet de libreDecision en production avec Docke
| --------- | ---------------- | ----------- | | --------- | ---------------- | ----------- |
| Docker | 24+ | Moteur de conteneurs | | Docker | 24+ | Moteur de conteneurs |
| Docker Compose | 2.20+ | Orchestration multi-conteneurs | | Docker Compose | 2.20+ | Orchestration multi-conteneurs |
| Nom de domaine | -- | Domaine pointe vers le serveur (ex: `libredecision.org`) | | Nom de domaine | -- | Domaine pointe vers le serveur (ex: `decision.librodrome.org`) |
| Certificat TLS | -- | Genere automatiquement par Traefik via Let's Encrypt | | Certificat TLS | -- | Genere automatiquement par Traefik via Let's Encrypt |
| Traefik | 2.10+ | Reverse proxy avec terminaison TLS (reseau externe `traefik`) | | Traefik | 2.10+ | Reverse proxy avec terminaison TLS (reseau externe `traefik`) |
| Serveur | 2 vCPU, 4 Go RAM, 40 Go SSD | Ressources recommandees | | Serveur | 2 vCPU, 4 Go RAM, 40 Go SSD | Ressources recommandees |
@@ -46,12 +46,12 @@ cp .env.example .env
| `DATABASE_URL` | URL de connexion asyncpg | `postgresql+asyncpg://...@localhost:5432/...` | Construite automatiquement dans docker-compose | | `DATABASE_URL` | URL de connexion asyncpg | `postgresql+asyncpg://...@localhost:5432/...` | Construite automatiquement dans docker-compose |
| `SECRET_KEY` | Cle secrete pour les tokens de session | `change-me-in-production-with-a-real-secret-key` | **Generer une cle aleatoire** (`openssl rand -hex 64`) | | `SECRET_KEY` | Cle secrete pour les tokens de session | `change-me-in-production-with-a-real-secret-key` | **Generer une cle aleatoire** (`openssl rand -hex 64`) |
| `DEBUG` | Mode debug | `true` | **`false`** | | `DEBUG` | Mode debug | `true` | **`false`** |
| `CORS_ORIGINS` | Origines CORS autorisees | `["http://localhost:3002"]` | `["https://libredecision.org"]` | | `CORS_ORIGINS` | Origines CORS autorisees | `["http://localhost:3002"]` | `["https://decision.librodrome.org"]` |
| `DUNITER_RPC_URL` | URL du noeud Duniter V2 RPC | `wss://gdev.p2p.legal/ws` | URL du noeud de production | | `DUNITER_RPC_URL` | URL du noeud Duniter V2 RPC | `wss://gdev.p2p.legal/ws` | URL du noeud de production |
| `IPFS_API_URL` | URL de l'API IPFS (kubo) | `http://localhost:5001` | `http://ipfs:5001` (interne Docker) | | `IPFS_API_URL` | URL de l'API IPFS (kubo) | `http://localhost:5001` | `http://ipfs:5001` (interne Docker) |
| `IPFS_GATEWAY_URL` | URL de la passerelle IPFS | `http://localhost:8080` | `http://ipfs:8080` (interne Docker) | | `IPFS_GATEWAY_URL` | URL de la passerelle IPFS | `http://localhost:8080` | `http://ipfs:8080` (interne Docker) |
| `NUXT_PUBLIC_API_BASE` | URL publique de l'API pour le frontend | `http://localhost:8002/api/v1` | `https://libredecision.org/api/v1` | | `NUXT_PUBLIC_API_BASE` | URL publique de l'API pour le frontend | `http://localhost:8002/api/v1` | `https://decision.librodrome.org/api/v1` |
| `DOMAIN` | Nom de domaine | `libredecision.org` | Votre domaine | | `DOMAIN` | Nom de domaine | `decision.librodrome.org` | Votre domaine |
### Generer les secrets ### Generer les secrets
@@ -108,7 +108,7 @@ docker compose -f docker/docker-compose.yml ps
docker compose -f docker/docker-compose.yml logs -f backend docker compose -f docker/docker-compose.yml logs -f backend
# Health check de l'API # Health check de l'API
curl -s https://libredecision.org/api/health | jq . curl -s https://decision.librodrome.org/api/health | jq .
``` ```
## Migration de base de donnees (Alembic) ## Migration de base de donnees (Alembic)
@@ -182,7 +182,7 @@ services:
- "--entrypoints.web.http.redirections.entryPoint.to=websecure" - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https" - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.email=admin@libredecision.org" - "--certificatesresolvers.letsencrypt.acme.email=admin@decision.librodrome.org"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports: ports:
- "80:80" - "80:80"
@@ -209,8 +209,8 @@ docker compose -f docker-compose.traefik.yml up -d
Le `docker-compose.yml` de libreDecision configure automatiquement les labels Traefik : Le `docker-compose.yml` de libreDecision configure automatiquement les labels Traefik :
- **Frontend** : `Host(libredecision.org)` sur le port 3000 - **Frontend** : `Host(decision.librodrome.org)` sur le port 3000
- **Backend** : `Host(libredecision.org) && PathPrefix(/api)` sur le port 8002 - **Backend** : `Host(decision.librodrome.org) && PathPrefix(/api)` sur le port 8002
- Les deux utilisent le certificat Let's Encrypt (`certresolver=letsencrypt`) - Les deux utilisent le certificat Let's Encrypt (`certresolver=letsencrypt`)
- Redirection HTTP vers HTTPS automatique - Redirection HTTP vers HTTPS automatique
@@ -230,7 +230,7 @@ Le service PostgreSQL dispose d'un health check integre (`pg_isready`). Le backe
```bash ```bash
# Health check de l'API # Health check de l'API
curl -s https://libredecision.org/api/health curl -s https://decision.librodrome.org/api/health
# Reponse attendue : {"status": "healthy"} # Reponse attendue : {"status": "healthy"}
``` ```
@@ -317,7 +317,7 @@ docker image prune -f
# 5. Verifier le deploiement # 5. Verifier le deploiement
docker compose -f docker/docker-compose.yml ps docker compose -f docker/docker-compose.yml ps
curl -s https://libredecision.org/api/health curl -s https://decision.librodrome.org/api/health
``` ```
### Pipeline CI/CD (Woodpecker) ### Pipeline CI/CD (Woodpecker)
@@ -377,7 +377,7 @@ docker compose -f docker/docker-compose.yml up -d # recree avec le nouveau m
**Symptome** : Le site est inaccessible en HTTPS ou affiche un certificat invalide. **Symptome** : Le site est inaccessible en HTTPS ou affiche un certificat invalide.
1. Verifier que le DNS A/AAAA pointe vers le serveur : `dig libredecision.org` 1. Verifier que le DNS A/AAAA pointe vers le serveur : `dig decision.librodrome.org`
2. Verifier que les ports 80 et 443 sont ouverts : `ss -tlnp | grep -E '80|443'` 2. Verifier que les ports 80 et 443 sont ouverts : `ss -tlnp | grep -E '80|443'`
3. Consulter les logs Traefik : `docker logs traefik 2>&1 | grep -i acme` 3. Consulter les logs Traefik : `docker logs traefik 2>&1 | grep -i acme`

View File

@@ -1,11 +1,11 @@
{ {
"name": "glibredecision", "name": "libredecision",
"version": "0.1.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "glibredecision", "name": "libredecision",
"version": "0.1.0", "version": "0.1.0",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {