# FRASA Ecosystem — reverse proxy # Las apps se construyeron con base path (/quote/, /client/, /pay/); # el proxy conserva la URI completa (sin slash final en proxy_pass). # HTTP → HTTPS (excepto el challenge de Let's Encrypt) server { listen 80; server_name frasadesarrollos.ddns.net; location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$server_name$request_uri; } } server { listen 443 ssl; server_name frasadesarrollos.ddns.net; ssl_certificate /etc/letsencrypt/live/frasadesarrollos.ddns.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/frasadesarrollos.ddns.net/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_protocols TLSv1.2 TLSv1.3; # Uploads de hasta 10MB (expedientes de clientes) client_max_body_size 10m; # API Gateway location /api/ { proxy_pass http://api:3000; 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; } # Webhooks de Monday (mismo upstream, ruta explícita para claridad) location = /api/webhooks/monday { proxy_pass http://api:3000; 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; } # Apps web (cada contenedor sirve su SPA con su base path) location /quote/ { proxy_pass http://cotizador:80; proxy_set_header Host $host; } location /client/ { proxy_pass http://alta-clientes:80; proxy_set_header Host $host; } location /pay/ { proxy_pass http://cobranza:80; proxy_set_header Host $host; } # Landing (raíz) location / { proxy_pass http://landing:80; 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; } }