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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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`
|
||||||
|
|
||||||
|
|||||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -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": {
|
||||||
|
|||||||
Reference in New Issue
Block a user