conf: sync Nginx configs with deployment fixes (2025-09-24)
All checks were successful
lecoffre_node-ci-ext / ci (push) Successful in 6s
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:
parent
e25771494b
commit
07c07ad2e5
@ -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$
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 "$@"
|
||||
|
||||
|
||||
|
@ -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 "$@"
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user