diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..41d0a02 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +node_modules +.next +coverage +dist +.DS_Store +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.env* diff --git a/.env.exemple b/.env.exemple index d91e78d..ab45fcb 100644 --- a/.env.exemple +++ b/.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 diff --git a/conf/nginx/dev4.4nkweb.com.conf b/conf/nginx/dev4.4nkweb.com.conf index 45e152f..e0cc381 100644 --- a/conf/nginx/dev4.4nkweb.com.conf +++ b/conf/nginx/dev4.4nkweb.com.conf @@ -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; } } diff --git a/docker-compose.yml b/docker-compose.yml index 36ae807..a4a2a90 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/docs/ROUTAGE_API.md b/docs/ROUTAGE_API.md new file mode 100644 index 0000000..31fa191 --- /dev/null +++ b/docs/ROUTAGE_API.md @@ -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`. diff --git a/tests/api_routing.md b/tests/api_routing.md new file mode 100644 index 0000000..917d410 --- /dev/null +++ b/tests/api_routing.md @@ -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 '(?<=