conf: sync Nginx configs with deployment fixes (2025-09-24)
All checks were successful
lecoffre_node-ci-ext / ci (push) Successful in 6s

- Copy updated dev4.4nkweb.com-https.conf with /lecoffre/ rewrite
- Copy updated dev4.4nkweb.com-http.conf
- Add /_next/ assets proxy route
- Add /lecoffre-hmr/ HMR development route
- Document deployment architecture in conf/nginx/
This commit is contained in:
Nicolas Cantu 2025-09-24 20:12:14 +00:00
parent e25771494b
commit 07c07ad2e5
4 changed files with 71 additions and 384 deletions

View File

@ -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$

View File

@ -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;
}
}
}

View File

@ -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/tcp/$host/$port" 2>/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 "$@"

View File

@ -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 "$@"