feat(deploy): aligner Nginx et docker-compose (ports/binds), alias /api, docs/tests routage API; nettoyer sub_filter; healthcheck blindbit sur /tweaks/1

This commit is contained in:
Nicolas Cantu 2025-09-17 06:36:09 +00:00
parent e5d7a0155e
commit 3114d99fec
6 changed files with 158 additions and 14 deletions

10
.dockerignore Normal file
View File

@ -0,0 +1,10 @@
.git
node_modules
.next
coverage
dist
.DS_Store
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.env*

View File

@ -1,4 +1,6 @@
#Variables d'environnement pour l'application back-end
NODE_OPTIONS=--max-old-space-size=2048
NODE_ENV=production
# Configuration IDNOT
IDNOT_ANNUARY_BASE_URL=https://qual-api.notaires.fr/annuaire
@ -54,6 +56,14 @@ NEXT_PUBLIC_BACK_API_ROOT_URL=/api
NEXT_PUBLIC_BACK_API_VERSION=/v1
# NEXT_PUBLIC_ANK_BASE_REDIRECT_URI='http://local.4nkweb.com:3000/authorized-client'
NEXT_PUBLIC_ANK_BASE_REDIRECT_URI='https://dev4.4nkweb.com/lecoffre/authorized-client'
NEXT_PUBLIC_TARGET_ORIGIN = https://dev4.4nkweb.com/lecoffre
NEXT_PUBLIC_DOCAPOSTE_API_URL=
NEXT_PUBLIC_API_URL=https://dev4.4nkweb.com/back
NEXT_PUBLIC_DEFAULT_VALIDATOR_ID=
NEXT_PUBLIC_DEFAULT_STORAGE_URLS=https://dev4.4nkweb.com/storage
NEXT_PUBLIC_HOTJAR_SITE_ID=
NEXT_PUBLIC_HOTJAR_VERSION=
# WS
# RELAY_URLS=wss://demo.4nkweb.com/ws

View File

@ -28,7 +28,7 @@ server {
# lecoffre-front
location /lecoffre/ {
proxy_pass http://127.0.0.2:3000/;
proxy_pass http://127.0.0.2:3004/;
include /etc/nginx/proxy_params;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto http;
@ -45,12 +45,12 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto http;
proxy_buffering off;
proxy_pass http://127.0.0.2:3000/_next/webpack-hmr;
proxy_pass http://127.0.0.2:3004/_next/webpack-hmr;
proxy_read_timeout 600s;
}
location /lecoffre/_next/ {
proxy_pass http://127.0.0.2:3000/_next/;
proxy_pass http://127.0.0.2:3004/_next/;
include /etc/nginx/proxy_params;
proxy_read_timeout 300;
}
@ -65,7 +65,7 @@ server {
# Next.js assets (served at root by the app)
location /_next/ {
proxy_pass http://127.0.0.2:3000/_next/;
proxy_pass http://127.0.0.2:3004/_next/;
include /etc/nginx/proxy_params;
proxy_read_timeout 300;
}
@ -77,6 +77,13 @@ server {
proxy_read_timeout 300;
}
# API alias → même backend que /back
location /api/ {
proxy_pass http://127.0.0.1:8080/;
include /etc/nginx/proxy_params;
proxy_read_timeout 300;
}
# blindbit
location /blindbit/ {
proxy_pass http://127.0.0.1:8000/;
@ -134,7 +141,7 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto http;
proxy_buffering off;
proxy_pass http://127.0.0.2:3000/_next/webpack-hmr;
proxy_pass http://127.0.0.2:3004/_next/webpack-hmr;
proxy_read_timeout 300;
}
}

View File

@ -49,8 +49,10 @@ services:
btcnet:
aliases:
- blindbit
ports:
- "127.0.0.1:8000:8000"
healthcheck:
test: ["CMD-SHELL", "code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000); [ \"$code\" != \"000\" ]"]
test: ["CMD-SHELL", "code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1); [ \"$code\" != \"000\" ]"]
interval: 15s
timeout: 5s
retries: 10
@ -67,7 +69,7 @@ services:
- sdk_data:/home/bitcoin/.4nk
- bitcoin_data:/home/bitcoin/.bitcoin
ports:
- "8090:8090"
- "127.0.0.1:8090:8090"
networks:
btcnet:
aliases:
@ -99,7 +101,7 @@ services:
env_file:
- .env
ports:
- "8080:8080"
- "127.0.0.1:8080:8080"
networks:
btcnet:
aliases:
@ -109,13 +111,12 @@ services:
restart: unless-stopped
lecoffre-front:
image: git.4nkweb.com/4nk/lecoffre-front:dev
image: git.4nkweb.com/4nk/lecoffre-front:ext
container_name: lecoffre-front
env_file:
- .env
environment:
- NODE_ENV=production
- NODE_OPTIONS=--max-old-space-size=2048
ports:
- "127.0.0.2:3004:3000"
networks:
@ -125,7 +126,6 @@ services:
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
command: ["sh", "-lc", "npm run build && npm run start"]
ihm_client:
image: git.4nkweb.com/4nk/ihm_client:dev
@ -133,7 +133,7 @@ services:
env_file:
- .env
ports:
- "3003:3003"
- "127.0.0.1:3003:3003"
networks:
btcnet:
aliases:
@ -146,7 +146,7 @@ services:
image: git.4nkweb.com/4nk/sdk_signer:latest
container_name: sdk_signer
ports:
- "3001:3001"
- "127.0.0.1:3001:3001"
networks:
btcnet:
aliases:
@ -159,7 +159,7 @@ services:
image: git.4nkweb.com/4nk/sdk_storage:latest
container_name: sdk_storage
ports:
- "8081:8081"
- "127.0.0.1:8081:8081"
networks:
btcnet:
aliases:

74
docs/ROUTAGE_API.md Normal file
View File

@ -0,0 +1,74 @@
### Routage API et bonnes pratiques de déploiement
- **Objectif**: éviter les appels directs vers `localhost:8080`, standardiser lURL API sous le même domaine que le front, et supprimer les causes de `net::ERR_BLOCKED_BY_CLIENT` (bloqueurs de contenu/balises heuristiques).
### Règles de base
- **Toujours appeler lAPI via le reverse proxy Nginx** du domaine public.
- Front sous `https://dev4.4nkweb.com/lecoffre/`.
- Backend accessible via des chemins de proxy: `https://dev4.4nkweb.com/back/…` (existant) et `https://dev4.4nkweb.com/api/…` (alias recommandé).
- **Ne jamais appeler `http://localhost:8080` depuis le navigateur** en environnement intégré: ces appels sont plus susceptibles dêtre bloqués par des extensions/heuristiques et contournent le proxy (CORS, headers, TLS, logs).
- **Utiliser une base dURL configurée** côté front (variable denvironnement) et **des chemins relatifs** (`/back/…` ou `/api/…`).
### Variables denvironnement recommandées (front)
- `NEXT_PUBLIC_API_BASE` ou `VITE_API_BASE`
- Valeur production/staging: `/back` (ou `/api` si alias activé)
- Valeur locale derrière Nginx: `/back`
- Bénéfice: pas dhardcoding dhôte/port, pas de divergence env.
### Nginx (hôte) — état actuel et alias conseillé
- État actuel confirmé dans `conf/nginx/dev4.4nkweb.com.conf`:
- `location /back/ { proxy_pass http://127.0.0.1:8080/; … }`
- Recommandation: ajouter un alias identique `location /api/ { … }` pointant vers `127.0.0.1:8080/` pour couvrir les fronts qui référencent `/api/`.
- Avantage: déploiements futurs facilités (unification), compatibilité avec conventions courantes (`/api`).
### Réécriture de secours (ihm_client) via sub_filter
- Afin déliminer toute occurrence résiduelle de `http://localhost:8080` côté front (pages et bundles servis par `ihm_client`), la conf Nginx applique une réécriture à la volée:
- Fichier: `conf/nginx/dev4.4nkweb.com.conf`
- Bloc `location /` (ihm_client) et blocs `location /lecoffre/_next/` et `location /_next/`.
- Ajouts: désactivation de la compression en amont pour permettre `sub_filter`, `sub_filter_once off`, et remplacement de `http://localhost:8080` par `https://dev4.4nkweb.com/api`.
- Impact: supprime les références absolues à `localhost` dans HTML/JS/JSON servis par Nginx, évitant `ERR_BLOCKED_BY_CLIENT` et le contenu mixte.
### Pourquoi `ERR_BLOCKED_BY_CLIENT` survient
- La requête était observée vers `http://localhost:8080/api/v1/idnot/auth…`.
- Certains bloqueurs interceptent des requêtes cross-origin ou vers des chemins jugés sensibles quand elles ne passent pas par le même domaine que la page.
- Passer par `https://dev4.4nkweb.com/back/…` (ou `/api/`) sous le même hôte supprime ces heuristiques et évite CORS.
### Ligne directrice pour les repos front
- Centraliser la base dURL API via `.env` et publier cette valeur au build (`NEXT_PUBLIC_…`/`VITE_…`).
- Effectuer les appels via `fetch(\"${API_BASE}/api/v1/...\")` ou équivalent, où `API_BASE` vaut `/back` (ou `/api`).
- Ne pas committer de valeurs absolues (hôte/port) dans le code.
### Validation et tests (voir `tests/api_routing.md`)
- Vérifier que les endpoints répondent correctement via le domaine: `/back/health`, `/storage/health`, etc.
- Contrôler labsence derreurs Nginx et la non-présence de CORS dans la console.
### Procédure de changement (sur validation)
1. Ajouter `location /api/` vers `127.0.0.1:8080/` dans `conf/nginx/dev4.4nkweb.com.conf` juste après le bloc `/back/`.
2. `sudo nginx -t` puis recharge.
3. Mettre à jour la variable `NEXT_PUBLIC_API_BASE`/`VITE_API_BASE` des fronts.
4. Redéployer le front.
### Adoption de limage lecoffre-front:ext-0.1.3
- Image: `git.4nkweb.com/4nk/lecoffre-front:ext-0.1.3` (voir paquet registre)
- Fichier: `docker-compose.yml`
- Ligne modifiée: service `lecoffre-front.image``git.4nkweb.com/4nk/lecoffre-front:ext-0.1.3`
- Effet: les appels API en dur vers `localhost:8080` ont été remplacés dans le build; plus besoin de réécritures de secours côté Nginx.
### Nettoyage des sub_filter Nginx
- Fichier: `conf/nginx/dev4.4nkweb.com.conf`
- Suppression des directives `sub_filter` dans:
- `location /` (ihm_client)
- `location /lecoffre/`
- `location /lecoffre/_next/`
- `location /_next/`
- Raison: la nouvelle image front utilise `/api` et ne référence plus `localhost:8080`.

43
tests/api_routing.md Normal file
View File

@ -0,0 +1,43 @@
### Plan de tests — routage API via Nginx
#### Pré-requis
- Nginx actif avec `conf/nginx/dev4.4nkweb.com.conf` chargé.
- Services: backend (8080), storage (8081), ws relay (8090), blindbit (8000), front (3000/3003).
#### Vérifications HTTP
- GET `https://dev4.4nkweb.com/back/health` → 200
- (Si alias validé) GET `https://dev4.4nkweb.com/api/health` → 200
- GET `https://dev4.4nkweb.com/storage/health` → 200
#### Vérifications front
- Ouvrir `https://dev4.4nkweb.com/lecoffre/` → 200, pas derreurs CORS ni `ERR_BLOCKED_BY_CLIENT`.
- Ouvrir la console réseau: les appels API doivent cibler `/back/...` (ou `/api/...`) sous le même hôte.
#### Non-régression: absence de `localhost:8080` dans les bundles
- Télécharger la page et scanner les scripts:
- `curl -sS https://dev4.4nkweb.com/lecoffre/ -o /tmp/lecoffre_index.html`
- `grep -oP '(?<=<script src=")[^"]+' /tmp/lecoffre_index.html | sed 's#^/#https://dev4.4nkweb.com/#' | while read u; do curl -sS "$u" | grep -q 'localhost:8080' && echo "KO: $u"; done`
- Attendu: aucun `KO:`
#### Vérification réécriture `sub_filter`
- Contrôler quaucune requête ne vise `http://localhost:8080`:
- Recharger avec cache vidé et surveiller longlet Réseau.
- Télécharger une ressource HTML/JS et vérifier labsence de `http://localhost:8080`.
#### Redirections locales
- `curl -I http://local.4nkweb.com:3000/` → 301 Location `https://dev4.4nkweb.com/lecoffre/`
- `curl -I http://local.4nkweb.com:3000/authorized-client?code=ABC` → 301 Location `https://dev4.4nkweb.com/lecoffre/authorized-client?code=ABC`
#### WebSocket
- `wss://dev4.4nkweb.com/ws` handshake OK (101)
#### Journaux Nginx
- `error.log`: aucun message critique après rechargement.