diff --git a/.env.master b/.env.master index ff67e72..d42f41a 100644 --- a/.env.master +++ b/.env.master @@ -174,3 +174,7 @@ BACK_API_VERSION=/v1 # Configuration idnot IDNOT_ANNUARY_BASE_URL='https://qual-api.notaires.fr/annuaire' IDNOT_API_KEY='ba557f84-0bf6-4dbf-844f-df2767555e3e' + +ALLOW_LOCALHOST_REDIRECTS=false +BACK_HMAC_SECRET=7e0f4a8b7c9d3e2fb6c1a5d4e8f09b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70 +ALLOWED_REDIRECT_HOST_PATTERNS=^dev4\.4nkweb\.com$,^lecoffreio\.4nkweb\.com$ diff --git a/conf/nginx/dev4.4nkweb.com-https.conf b/conf/nginx/dev4.4nkweb.com-https.conf index 21240e8..bb0df7b 100644 --- a/conf/nginx/dev4.4nkweb.com-https.conf +++ b/conf/nginx/dev4.4nkweb.com-https.conf @@ -81,11 +81,6 @@ server { add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; - # Désactiver le cache côté client - add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; - add_header Pragma "no-cache" always; - expires -1; - # Cache pour les assets statiques location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ { expires 1h; @@ -106,12 +101,6 @@ server { add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization"; - # Désactiver le cache proxy/client - proxy_no_cache 1; - proxy_cache_bypass 1; - add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; - add_header Pragma "no-cache" always; - # Timeouts proxy_connect_timeout 10s; proxy_send_timeout 10s; @@ -134,14 +123,35 @@ server { proxy_buffering off; } - # API direct - route /api/ vers le backend (dev3) + # API direct - route /api/ vers le backend + # Autorisations CORS dynamiques pour origines connues + set $cors_origin ""; + if ($http_origin ~* ^(http://local\.4nkweb\.com:3000|https://dev4\.4nkweb\.com)$) { + set $cors_origin $http_origin; + } + location /api/ { - proxy_pass http://31.33.24.235:8080/api/; - proxy_set_header Host dev3.4nkweb.com; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_redirect off; + # CORS pour développement local Next.js + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Credentials; + proxy_hide_header Access-Control-Allow-Headers; + proxy_hide_header Access-Control-Allow-Methods; + + if ($request_method = OPTIONS) { + add_header Access-Control-Allow-Origin $cors_origin always; + add_header Access-Control-Allow-Credentials "true" always; + add_header Access-Control-Allow-Headers "Content-Type, x-session-id, Authorization" always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always; + return 204; + } + + add_header Access-Control-Allow-Origin $cors_origin always; + add_header Access-Control-Allow-Credentials "true" always; + add_header Access-Control-Allow-Headers "Content-Type, x-session-id, Authorization" always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always; + + proxy_pass http://dev3.4nkweb.com:8080/api/; + include /etc/nginx/proxy_params; proxy_read_timeout 300; proxy_connect_timeout 300; proxy_send_timeout 300; @@ -164,14 +174,10 @@ server { proxy_read_timeout 86400; } - # API de transfert de fonds (dev3) + # API de transfert de fonds location /api/v1/funds/ { - proxy_pass http://31.33.24.235:8080/api/v1/funds/; - proxy_set_header Host dev3.4nkweb.com; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_redirect off; + proxy_pass http://dev3.4nkweb.com:8080/api/v1/funds/; + include /etc/nginx/proxy_params; proxy_read_timeout 300; proxy_connect_timeout 300; proxy_send_timeout 300; @@ -189,14 +195,18 @@ server { include /etc/nginx/proxy_params; } - # lecoffre-front - Application LeCoffre - # Forcer le trailing slash pour éviter les redirections et erreurs 500 côté Next.js - location = /lecoffre { - return 301 /lecoffre/; - } + # signer (sdk_signer) avec support WebSocket + # lecoffre-front - Application LeCoffre + location = /lecoffre { return 301 /lecoffre/; } location ^~ /lecoffre/ { - # Déléguer la gestion du basePath à Next.js + # ensure no redirect here; only proxy to Next + add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; + add_header Pragma "no-cache" always; + add_header Expires "-1" always; + proxy_hide_header ETag; + proxy_hide_header Last-Modified; + rewrite ^/lecoffre/(.*)$ /$1 break; proxy_pass http://localhost:3004; include /etc/nginx/proxy_params; proxy_http_version 1.1; @@ -206,8 +216,33 @@ server { proxy_send_timeout 300; proxy_connect_timeout 300; } + # HMR dev front + location ^~ /lecoffre-hmr/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + rewrite ^/lecoffre-hmr/(.*)$ /lecoffre/$1 break; + proxy_pass http://localhost:3000; + } + # ihm_client (root) - DOIT être en dernier + + # Next.js assets for lecoffre-front + location ^~ /_next/ { + proxy_pass http://localhost:3004/_next/; + include /etc/nginx/proxy_params; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 300; + add_header Cache-Control "public, max-age=31536000, immutable"; + } + location / { proxy_pass http://localhost:3003; include /etc/nginx/proxy_params; @@ -216,4 +251,4 @@ server { proxy_set_header Connection "upgrade"; proxy_read_timeout 300; } -} \ No newline at end of file +} diff --git a/scripts/rex/verify_bootstrap_connectivity.sh b/scripts/rex/verify_bootstrap_connectivity.sh deleted file mode 100755 index f636e66..0000000 --- a/scripts/rex/verify_bootstrap_connectivity.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash -# verify_bootstrap_connectivity.sh -# Script de vérification de la connectivité bootstrap WebSocket -# Basé sur REX_BOOTSTRAP_WEBSOCKET.md - -set -e - -# Couleurs pour les logs -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Fonctions de logging -log() { echo -e "${BLUE}[INFO]${NC} $1"; } -log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } -log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } -log_error() { echo -e "${RED}[ERROR]${NC} $1"; } - -# Configuration -BOOTSTRAP_URL="wss://dev3.4nkweb.com/ws/" -TEST_ADDRESS="tsp1qqgmwp9n5p9ujhq2j6cfqe4jpkyu70jh9rgj0pwt3ndezk2mrlvw6jqew8fhsulewzglfr7g2aa48wyj4n0r7yasa3fm666vda8984ke8tuaf9m89" - -# Fonction de test de connectivité WebSocket -test_websocket_connectivity() { - local url="$1" - local timeout="${2:-10}" - - log "Test de connectivité WebSocket vers $url (timeout: ${timeout}s)..." - - if command -v wscat >/dev/null 2>&1; then - # Test avec wscat - local test_message='{"type":"faucet","address":"'$TEST_ADDRESS'"}' - - if timeout "$timeout" wscat -c "$url" -x "$test_message" >/dev/null 2>&1; then - log_success "Connexion WebSocket réussie vers $url" - return 0 - else - log_error "Échec de la connexion WebSocket vers $url" - return 1 - fi - else - log_warning "wscat non installé, test de connectivité basique..." - - # Test basique avec curl (pour les endpoints HTTP) - local http_url=$(echo "$url" | sed 's/wss:/https:/' | sed 's/ws:/http:/') - if curl -f -s --connect-timeout "$timeout" "$http_url" >/dev/null 2>&1; then - log_success "Endpoint HTTP accessible : $http_url" - return 0 - else - log_error "Endpoint HTTP inaccessible : $http_url" - return 1 - fi - fi -} - -# Fonction de test de connectivité réseau -test_network_connectivity() { - local host="$1" - local port="$2" - local timeout="${3:-5}" - - log "Test de connectivité réseau vers $host:$port (timeout: ${timeout}s)..." - - if timeout "$timeout" bash -c "/dev/null; then - log_success "Port $port accessible sur $host" - return 0 - else - log_error "Port $port inaccessible sur $host" - return 1 - fi -} - -# Fonction de vérification des fonds du relai -check_relay_funds() { - log "Vérification des fonds du relai local..." - - if docker ps | grep -q sdk_relay; then - local outputs_count=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq '.outputs | length' 2>/dev/null || echo "0") - - if [ "$outputs_count" -gt 0 ]; then - log_success "Relai local a $outputs_count sortie(s) (fonds disponibles)" - return 0 - else - log_warning "Relai local n'a pas de fonds (0 sorties)" - return 1 - fi - else - log_error "Conteneur sdk_relay non trouvé" - return 1 - fi -} - -# Fonction de vérification de l'adresse SP -check_sp_address() { - log "Vérification de l'adresse SP du relai..." - - if docker ps | grep -q sdk_relay; then - local sp_address=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.sp_address' 2>/dev/null || echo "null") - - if [ "$sp_address" != "null" ] && [ -n "$sp_address" ]; then - log_success "Adresse SP trouvée : $sp_address" - return 0 - else - log_warning "Aucune adresse SP trouvée" - return 1 - fi - else - log_error "Conteneur sdk_relay non trouvé" - return 1 - fi -} - -# Fonction de test du faucet -test_faucet() { - log "Test du faucet bootstrap..." - - if command -v wscat >/dev/null 2>&1; then - local faucet_message='{"type":"faucet","address":"'$TEST_ADDRESS'"}' - - log "Envoi de la requête faucet..." - local response=$(timeout 15 wscat -c "$BOOTSTRAP_URL" -x "$faucet_message" 2>/dev/null || echo "") - - if [ -n "$response" ]; then - log_success "Réponse reçue du faucet : $response" - - # Vérifier si la réponse contient des données de transaction - if echo "$response" | grep -q "NewTx\|tx_hex\|tweak_data"; then - log_success "Faucet fonctionnel - données de transaction reçues" - return 0 - else - log_warning "Faucet répond mais sans données de transaction" - return 1 - fi - else - log_error "Aucune réponse du faucet" - return 1 - fi - else - log_warning "wscat non installé, impossible de tester le faucet" - return 1 - fi -} - -# Fonction principale -main() { - log "=== Vérification de la connectivité bootstrap WebSocket ===" - - local errors=0 - - # 1. Test de connectivité réseau - log "1. Test de connectivité réseau..." - test_network_connectivity "dev3.4nkweb.com" "443" || ((errors++)) - test_network_connectivity "dev3.4nkweb.com" "9090" || ((errors++)) - - # 2. Test de connectivité WebSocket - log "2. Test de connectivité WebSocket..." - test_websocket_connectivity "$BOOTSTRAP_URL" || ((errors++)) - - # 3. Test du faucet - log "3. Test du faucet..." - test_faucet || ((errors++)) - - # 4. Vérification des fonds du relai - log "4. Vérification des fonds du relai..." - check_relay_funds || ((errors++)) - - # 5. Vérification de l'adresse SP - log "5. Vérification de l'adresse SP..." - check_sp_address || ((errors++)) - - # Résumé - echo "" - if [ $errors -eq 0 ]; then - log_success "=== Tous les tests de connectivité bootstrap ont réussi ===" - log_success "Le bootstrap WebSocket est fonctionnel et le relai peut recevoir des fonds" - exit 0 - else - log_error "=== $errors test(s) ont échoué ===" - log_error "Le bootstrap WebSocket nécessite une attention" - exit 1 - fi -} - -# Exécution du script -main "$@" - - - diff --git a/scripts/rex/verify_config_writing.sh b/scripts/rex/verify_config_writing.sh deleted file mode 100755 index 5dce46d..0000000 --- a/scripts/rex/verify_config_writing.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/bin/bash -# verify_config_writing.sh -# Script de vérification de l'écriture effective des fichiers de configuration -# Basé sur REX_CONFIGURATION_MANAGEMENT.md - -set -e - -# Couleurs pour les logs -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Fonctions de logging -log() { echo -e "${BLUE}[INFO]${NC} $1"; } -log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } -log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } -log_error() { echo -e "${RED}[ERROR]${NC} $1"; } - -# Fonction de vérification d'un fichier de configuration -verify_config_file() { - local file="$1" - local expected_content="$2" - local description="$3" - - log "Vérification de $file ($description)..." - - if [ -f "$file" ]; then - if grep -q "$expected_content" "$file"; then - log_success "$file contient '$expected_content'" - return 0 - else - log_error "$file ne contient pas '$expected_content'" - return 1 - fi - else - log_error "$file n'existe pas" - return 1 - fi -} - -# Fonction de vérification de la syntaxe -verify_syntax() { - local file="$1" - - case "$file" in - *.yml|*.yaml) - log "Vérification de la syntaxe YAML pour $file..." - if command -v yq >/dev/null 2>&1; then - if yq eval '.' "$file" >/dev/null 2>&1; then - log_success "Syntaxe YAML valide pour $file" - return 0 - else - log_error "Syntaxe YAML invalide pour $file" - return 1 - fi - else - log_warning "yq non installé, impossible de vérifier la syntaxe YAML" - return 0 - fi - ;; - *.json) - log "Vérification de la syntaxe JSON pour $file..." - if command -v jq >/dev/null 2>&1; then - if jq '.' "$file" >/dev/null 2>&1; then - log_success "Syntaxe JSON valide pour $file" - return 0 - else - log_error "Syntaxe JSON invalide pour $file" - return 1 - fi - else - log_warning "jq non installé, impossible de vérifier la syntaxe JSON" - return 0 - fi - ;; - *.conf) - log "Vérification de la syntaxe pour $file..." - # Vérification basique : fichier non vide et lisible - if [ -s "$file" ] && [ -r "$file" ]; then - log_success "Fichier $file est lisible et non vide" - return 0 - else - log_error "Fichier $file est vide ou non lisible" - return 1 - fi - ;; - *) - log "Vérification basique pour $file..." - if [ -s "$file" ] && [ -r "$file" ]; then - log_success "Fichier $file est lisible et non vide" - return 0 - else - log_error "Fichier $file est vide ou non lisible" - return 1 - fi - ;; - esac -} - -# Fonction principale -main() { - log "=== Vérification de l'écriture effective des configurations ===" - - local errors=0 - - # Vérification des fichiers de configuration critiques - log "Vérification des fichiers de configuration critiques..." - - # 1. Configuration du relai - verify_config_file "relay/sdk_relay.conf" "bootstrap_url=" "Configuration bootstrap" || ((errors++)) - verify_config_file "relay/sdk_relay.conf" "sp_address=" "Adresse SP" || ((errors++)) - - # 2. Variables d'environnement - verify_config_file ".env" "RELAY_URLS=" "URLs des relais" || ((errors++)) - verify_config_file ".env" "SIGNER_WS_URL=" "URL WebSocket du signer" || ((errors++)) - - # 3. Configuration Docker Compose - verify_config_file "docker-compose.yml" "services:" "Services Docker" || ((errors++)) - verify_config_file "docker-compose.yml" "healthcheck:" "Healthchecks" || ((errors++)) - - # 4. Configuration du miner - verify_config_file "miner/.env" "RPC_HOST=" "Configuration RPC" || ((errors++)) - - # Vérification de la syntaxe - log "Vérification de la syntaxe des fichiers..." - - verify_syntax "docker-compose.yml" || ((errors++)) - verify_syntax "miner/.env" || ((errors++)) - - # Vérification des permissions - log "Vérification des permissions..." - - local config_files=("relay/sdk_relay.conf" ".env" "docker-compose.yml" "miner/.env") - for file in "${config_files[@]}"; do - if [ -f "$file" ]; then - if [ -r "$file" ]; then - log_success "Permissions de lecture OK pour $file" - else - log_error "Permissions de lecture insuffisantes pour $file" - ((errors++)) - fi - fi - done - - # Résumé - echo "" - if [ $errors -eq 0 ]; then - log_success "=== Toutes les vérifications ont réussi ===" - exit 0 - else - log_error "=== $errors erreur(s) détectée(s) ===" - exit 1 - fi -} - -# Exécution du script -main "$@" - - -