Environment Details:
-
n8n Version: 1.89.2 (Also observed similar backend failure on 1.88.0, 1.87.2 when using SQLite)
-
Database: PostgreSQL 15 (Issue was different but more severe with SQLite - see below)
-
Running n8n via: Docker Compose
-
Operating System: Windows 11 (using Docker Desktop with WSL 2 Backend)
-
Proxy Setup: Separate Nginx container (image: nginx:alpine) in the same Docker Compose network, handling HTTPS termination.
-
Key n8n Environment Variables (PostgreSQL setup):
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=n8n_postgres_db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=[My_Secure_Password]
- DB_POSTGRESDB_SSL_ENABLED=false
- N8N_PUBLIC_URL=https://n8n.example.app/
- WEBHOOK_URL=https://n8n.example.app/
- N8N_TRUST_PROXY=true
- N8N_LOG_LEVEL=info # (Also tested with debug)
content_copydownload
Use code with caution.Yaml
Problem Description:
When using PostgreSQL as the database, the backend logic for registering webhook paths (both auto-generated and custom) appears to work correctly. Testing the actual webhook URL (e.g., https://n8n.example.app/webhook/mycustompath) results in the expected behavior (either a successful response from a connected “Respond to Webhook” node or a “webhook is not registered for GET requests” error if using the wrong method, but critically, NOT a 404 “not registered” error ).
However, the frontend UI for the Webhook node configuration panel fails to update the displayed Test and Production URLs after saving the workflow. They consistently remain showing /null at the end (e.g., https://n8n.example.app/webhook-test/null), even though the correct path is saved in the “Path” input field itself (if custom) and is functional in the backend.
Steps to Reproduce (with PostgreSQL setup):
-
Run n8n v1.89.2 using Docker Compose with PostgreSQL DB and Nginx proxy as described.
-
Access the n8n editor via the public HTTPS URL (https://n8n.example.app).
-
Create a new, empty workflow.
-
Add a Webhook node.
-
Scenario 1 (Auto-path): Leave the “Path” field empty. Click “Save” workflow. Reload the browser page (Ctrl+Shift+R) or close/re-open the node panel.
-
Scenario 2 (Custom-path): Enter a custom path (e.g., testpostgres) in the “Path” field. Click “Save” workflow. Reload the browser page or close/re-open the node panel.
-
Observe the Test and Production URLs displayed within the node’s panel.
Expected Behavior:
- After saving (and potentially reloading), the displayed Test/Production URLs in the Webhook node panel should update to reflect the registered path (either auto-generated or custom). E.g., …/webhook/testpostgres or …/webhook/a1b2c3d4…
Actual Behavior:
-
After saving and reloading, the displayed Test/Production URLs in the Webhook node panel consistently remain ending in /null .
-
In Scenario 2, the custom path text (e.g., testpostgres) is correctly saved and displayed in the “Path” input field, but the URLs below it do not update.
-
Testing the actual webhook URL constructed manually (e.g., https://n8n.example.app/webhook/testpostgres) confirms the backend did register the path correctly (returns success or wrong method error, not 404 “not registered”).
Important Context - Previous SQLite Issue:
-
Prior to switching to PostgreSQL, extensive troubleshooting was performed using the default SQLite database.
-
With SQLite (tested on n8n v1.87.2, v1.88.0, v1.89.2), the problem was more severe: the backend failed entirely to register the webhook path. Saving the workflow resulted in the UI showing /null, AND testing the actual webhook URL resulted in a 404 “webhook is not registered” error .
-
This SQLite failure occurred both with Docker named volumes and direct bind mounts.
-
Significant issues were encountered with Docker Desktop/WSL 2 failing to create/access the volume/bind mount paths (No such file or directory inside WSL), requiring a full Docker Desktop reinstall and WSL instance recreation (wsl --unregister docker-desktop). Even after resolving the Docker/WSL volume access issues (verified by n8n successfully writing config/running migrations on SQLite via bind mount), the webhook registration still failed with SQLite.
-
Switching to PostgreSQL resolved the backend registration failure, isolating the remaining issue to the UI display.
Troubleshooting Summary:
-
Confirmed backend webhook registration works correctly with PostgreSQL.
-
Confirmed frontend UI fails to update displayed URLs from /null.
-
Confirmed the issue is not browser cache (tested incognito).
-
Checked n8n logs (info and debug levels) during webhook save - no relevant errors are logged for the UI update failure.
-
Confirmed environment variables (WEBHOOK_URL, etc.) are correct.
This appears to be a frontend/UI bug specific to updating the displayed webhook URLs after saving, potentially masked or exacerbated by underlying backend issues when using SQLite in a Docker Desktop/WSL 2 on Windows environment.