Files
mc_cars_gmbh_infraestructure/N8N_WEBHOOK_ROUTING.md
T

4.9 KiB

n8n Webhook Routing Configuration

Overview

n8n is intentionally kept internal to the Docker network and not exposed to the internet. To allow the browser to trigger n8n workflows via webhooks, Kong (the API gateway) proxies webhook requests to the internal n8n service.

Architecture

Browser                Kong (Port 55521)           n8n (Port 5678, internal)
   |                        |                            |
   | POST /webhook/*        |                            |
   |----------------------> | (no strip_path)           |
   |                        | POST /webhook/*            |
   |                        |--------------------------> |
   |                        |    Webhook triggers       |
   |                        |    workflow               |
   |<----- Response --------|<---------------------------|

Configuration Changes

1. Kong Configuration (supabase/kong.yml)

Added a new service to route webhook traffic to internal n8n:

- name: n8n-webhooks
  url: http://n8n:5678/
  routes:
    - name: n8n-webhooks-all
      strip_path: false
      paths:
        - /webhook/
  plugins:
    - name: cors
  • strip_path: false ensures the full /webhook/... path is forwarded to n8n
  • CORS plugin allows browser cross-origin requests (all origins for internal workflow triggers)

2. Docker Compose (docker-compose.yml)

Kong service:

  • Added n8n to the depends_on list (waits for n8n to start before Kong)

n8n service:

  • Updated WEBHOOK_URL environment variable to use ${WEBHOOK_DOMAIN:http://localhost:55590}/
  • This allows production deployments to override the default localhost URL

3. Frontend Configuration (frontend/config.js)

Updated the webhook URL configuration:

N8N_WEBHOOK_URL: "/webhook/manual-email-send"

This is a same-origin request path that works for both:

  • Local: http://localhost:55521/webhook/manual-email-send (Kong on port 55521)
  • Production: https://your-domain.com/webhook/manual-email-send

4. Admin UI (frontend/admin.js)

Updated sendOrderEmailDirect() function to use the configured webhook URL directly:

const n8nUrl = window.MCCARS_CONFIG?.N8N_WEBHOOK_URL || "/webhook/manual-email-send";

Deployment Steps

For Production Deployment:

  1. Update Kong configuration by deploying the modified supabase/kong.yml

    • Kong will automatically reload the config and start proxying /webhook/* requests
  2. Set environment variables (in your .env file):

    # Optional: Override n8n webhook domain (defaults to localhost)
    WEBHOOK_DOMAIN=https://your-domain.com
    

    If not set, n8n will use the default http://localhost:55590/ (only works internally)

  3. Deploy the updated code:

    • frontend/config.js with the new webhook URL
    • frontend/admin.js with the updated sendOrderEmailDirect function
    • docker-compose.yml with Kong n8n dependency
    • supabase/kong.yml with the new n8n service
  4. Restart the stack:

    docker-compose up -d
    

For Local Development:

No special configuration needed:

  • Kong is already on port 55521
  • Browser requests to /webhook/manual-email-send will be proxied to internal n8n
  • Works the same as production (same-origin requests)

How It Works

  1. Browser action: User clicks "Email senden" button in order dialog
  2. Browser request: JavaScript POSTs to /webhook/manual-email-send (same origin)
  3. Kong routing: Kong receives request, forwards to http://n8n:5678/webhook/manual-email-send
  4. n8n webhook: n8n webhook listener triggers the manual-email-send workflow
  5. Workflow execution: n8n fetches order data, builds email, sends via SMTP
  6. Response: Workflow returns success/error response to browser

Security

  • Network isolation: n8n remains internal, not exposed to internet
  • No authentication required: Webhook path is open (can be restricted later if needed)
  • CORS enabled: Allows browser requests to Kong
  • Kong isolation: Kong is the only service exposed; internal services hidden behind it

Troubleshooting

"Failed to fetch" error in browser

  1. Check Kong is routing properly:

    # Test from inside docker network
    docker-compose exec kong curl -v http://n8n:5678/webhook/manual-email-send
    
  2. Verify Kong config loaded:

    docker-compose logs kong | grep "n8n-webhooks"
    
  3. Check n8n is running:

    docker-compose logs n8n
    

n8n workflow not triggering

  1. Verify webhook path in n8n workflow (should be exactly /webhook/manual-email-send)
  2. Check n8n logs for webhook errors:
    docker-compose logs n8n | grep webhook
    

References