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:
parent
e5d7a0155e
commit
3114d99fec
10
.dockerignore
Normal file
10
.dockerignore
Normal file
@ -0,0 +1,10 @@
|
||||
.git
|
||||
node_modules
|
||||
.next
|
||||
coverage
|
||||
dist
|
||||
.DS_Store
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.env*
|
10
.env.exemple
10
.env.exemple
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
74
docs/ROUTAGE_API.md
Normal file
@ -0,0 +1,74 @@
|
||||
### Routage API et bonnes pratiques de déploiement
|
||||
|
||||
- **Objectif**: éviter les appels directs vers `localhost:8080`, standardiser l’URL 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 l’API 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 d’URL configurée** côté front (variable d’environnement) et **des chemins relatifs** (`/back/…` ou `/api/…`).
|
||||
|
||||
### Variables d’environnement 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 d’hardcoding d’hô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 d’URL 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 l’absence d’erreurs 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 l’image 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
43
tests/api_routing.md
Normal 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 d’erreurs 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 qu’aucune requête ne vise `http://localhost:8080`:
|
||||
- Recharger avec cache vidé et surveiller l’onglet Réseau.
|
||||
- Télécharger une ressource HTML/JS et vérifier l’absence 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.
|
Loading…
x
Reference in New Issue
Block a user