Layout per user-supplied mockup: - Single header row (title + last sync, no sticky) - 5-card stats strip (Active / Runs 24h / Succeeded / Errors / Fail rate) - Single 'Needs attention' panel showing only anomalies (stale, burning, stuck) - 2-col grid: Workflows (left) + Activity (right) — both compact lists - Activity rows show error_message inline for failed executions - Each anomaly / error gets a deep-link to n8n Also: - Saved user's static HTML prototype to dashboard/public/preview.html (served at /preview.html so they can compare mock vs live) Bundle: 215 KB JS / 67 KB gzipped (smaller than v2 — removed dead components)
619 lines
No EOL
16 KiB
JSON
619 lines
No EOL
16 KiB
JSON
{
|
|
"name": "n8n Monitoring Dashboard - Poller",
|
|
"nodes": [
|
|
{
|
|
"parameters": {
|
|
"content": "## Setup\n1. Create an \"HTTP Header Auth\" credential named \"n8n API Key\" (header X-N8N-API-KEY = your n8n API key).\n2. Create an \"HTTP Header Auth\" credential named \"PocketBase Admin\" (header Authorization = \"Bearer <your PocketBase admin token>\").\n3. PocketBase base URL is pre-set to http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io \u2014 no change needed.\n4. Collections already created in PocketBase.\n5. Activate this workflow when ready.",
|
|
"height": 200,
|
|
"width": 300,
|
|
"color": 4
|
|
},
|
|
"id": "24bccdfd-9f10-497e-b2bc-580f6315ccd2",
|
|
"name": "Sticky Note 67b8b148",
|
|
"type": "n8n-nodes-base.stickyNote",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
-1056,
|
|
272
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"rule": {
|
|
"interval": [
|
|
{
|
|
"field": "minutes"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "d3ef4a9b-7f14-4c2c-a0ea-14eeeea28ceb",
|
|
"name": "Every 5 Minutes",
|
|
"type": "n8n-nodes-base.scheduleTrigger",
|
|
"typeVersion": 1.3,
|
|
"position": [
|
|
-992,
|
|
320
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "https://wfdash.n8n.apphub.co.za/api/v1/workflows",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"options": {}
|
|
},
|
|
"id": "d69f9f84-9a58-42c7-8a03-ab14618b9eeb",
|
|
"name": "Fetch n8n Workflows",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
-688,
|
|
176
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "6H3KsAmWrPkxYDvZ",
|
|
"name": "N8N_API"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"fieldToSplitOut": "data",
|
|
"options": {}
|
|
},
|
|
"id": "7b3c2540-f6d5-48e7-b321-ae5dfebcb5f4",
|
|
"name": "Split Workflows Array",
|
|
"type": "n8n-nodes-base.splitOut",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
-400,
|
|
176
|
|
]
|
|
},
|
|
{
|
|
"parameters": {},
|
|
"id": "b4a435aa-355e-4560-9867-39fdc9ad6a8d",
|
|
"name": "Workflows Sync Done",
|
|
"type": "n8n-nodes-base.noOp",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
1104,
|
|
176
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendQuery": true,
|
|
"queryParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "filter",
|
|
"value": "=(n8n_id=\"{{ $json.id }}\")"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"id": "89d63965-a993-49f7-bb2d-d96dc8f98c74",
|
|
"name": "Check Workflow Record Exists",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
208,
|
|
176
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"options": {
|
|
"caseSensitive": true,
|
|
"leftValue": "",
|
|
"typeValidation": "loose",
|
|
"version": 1
|
|
},
|
|
"conditions": [
|
|
{
|
|
"leftValue": "={{ $json.totalItems }}",
|
|
"operator": {
|
|
"type": "number",
|
|
"operation": "gt"
|
|
},
|
|
"rightValue": 0
|
|
}
|
|
],
|
|
"combinator": "and"
|
|
},
|
|
"options": {}
|
|
},
|
|
"id": "ebbb0f2b-3994-468a-8d91-3066b64e9c2d",
|
|
"name": "Workflow Record Exists?",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2.2,
|
|
"position": [
|
|
512,
|
|
176
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "PATCH",
|
|
"url": "={{ \"http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records/\" + $json.items[0].id }}",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendBody": true,
|
|
"specifyBody": "json",
|
|
"jsonBody": "={{ { \"name\": $(\"Split Workflows Array\").item.json.name, \"active\": $(\"Split Workflows Array\").item.json.active, \"n8n_updated_at\": $(\"Split Workflows Array\").item.json.updatedAt } }}",
|
|
"options": {}
|
|
},
|
|
"id": "59e14242-6059-4bce-b220-14db1c0b2ebe",
|
|
"name": "Update Workflow Record",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
800,
|
|
80
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"options": {}
|
|
},
|
|
"id": "b6f0ba87-7db6-40df-b7df-bba2cccb00a2",
|
|
"name": "Workflows: One At A Time",
|
|
"type": "n8n-nodes-base.splitInBatches",
|
|
"typeVersion": 3,
|
|
"position": [
|
|
-96,
|
|
176
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "POST",
|
|
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/workflows/records",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendBody": true,
|
|
"specifyBody": "json",
|
|
"jsonBody": "={{ { \"n8n_id\": $(\"Split Workflows Array\").item.json.id, \"name\": $(\"Split Workflows Array\").item.json.name, \"active\": $(\"Split Workflows Array\").item.json.active, \"n8n_updated_at\": $(\"Split Workflows Array\").item.json.updatedAt } }}",
|
|
"options": {}
|
|
},
|
|
"id": "2d1eecf4-3161-4e7b-ba48-27f847151d9d",
|
|
"name": "Create Workflow Record",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
800,
|
|
272
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "https://wfdash.n8n.apphub.co.za/api/v1/executions",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendQuery": true,
|
|
"queryParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "limit",
|
|
"value": "50"
|
|
},
|
|
{
|
|
"name": "includeData",
|
|
"value": "true"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"id": "14fcdffc-a949-4a02-b6be-c5574fe075b6",
|
|
"name": "Fetch n8n Executions",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
-688,
|
|
576
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "6H3KsAmWrPkxYDvZ",
|
|
"name": "Header Auth account"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"fieldToSplitOut": "data",
|
|
"options": {}
|
|
},
|
|
"id": "d3b19216-a785-495a-b42d-28f9ac3569d3",
|
|
"name": "Split Executions Array",
|
|
"type": "n8n-nodes-base.splitOut",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
-400,
|
|
576
|
|
]
|
|
},
|
|
{
|
|
"parameters": {},
|
|
"id": "1efb39c7-4fd6-4c43-83f7-1dda5bfcb81e",
|
|
"name": "Executions Sync Done",
|
|
"type": "n8n-nodes-base.noOp",
|
|
"typeVersion": 1,
|
|
"position": [
|
|
1104,
|
|
576
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendQuery": true,
|
|
"queryParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "filter",
|
|
"value": "=(n8n_execution_id=\"{{ $json.id }}\")"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"id": "9e9f478e-2208-4ce4-a010-52ba2ff3bdde",
|
|
"name": "Check Execution Record Exists",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
208,
|
|
576
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"conditions": {
|
|
"options": {
|
|
"caseSensitive": true,
|
|
"leftValue": "",
|
|
"typeValidation": "loose",
|
|
"version": 1
|
|
},
|
|
"conditions": [
|
|
{
|
|
"leftValue": "={{ $json.totalItems }}",
|
|
"operator": {
|
|
"type": "number",
|
|
"operation": "gt"
|
|
},
|
|
"rightValue": 0
|
|
}
|
|
],
|
|
"combinator": "and"
|
|
},
|
|
"options": {}
|
|
},
|
|
"id": "aad63ade-7f8b-4147-a424-452d836f8431",
|
|
"name": "Execution Record Exists?",
|
|
"type": "n8n-nodes-base.if",
|
|
"typeVersion": 2.2,
|
|
"position": [
|
|
512,
|
|
576
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "PATCH",
|
|
"url": "={{ \"http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records/\" + $json.items[0].id }}",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendBody": true,
|
|
"specifyBody": "json",
|
|
"jsonBody": "={{ { \"status\": $(\"Split Executions Array\").item.json.status, \"started_at\": $(\"Split Executions Array\").item.json.startedAt, \"stopped_at\": $(\"Split Executions Array\").item.json.stoppedAt, \"workflow_n8n_id\": $(\"Split Executions Array\").item.json.workflowId, \"error_message\": ((() => { try { return JSON.parse($('Split Executions Array').item.json.data || '{}')?.resultData?.error?.message || ''; } catch { return ''; } })()) } }}",
|
|
"options": {}
|
|
},
|
|
"id": "95424108-0bcd-4445-a666-5ea8bbc2337d",
|
|
"name": "Update Execution Record",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
800,
|
|
480
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"parameters": {
|
|
"options": {}
|
|
},
|
|
"id": "9ad39eac-3880-44b0-9254-04c7fec77760",
|
|
"name": "Executions: One At A Time",
|
|
"type": "n8n-nodes-base.splitInBatches",
|
|
"typeVersion": 3,
|
|
"position": [
|
|
-96,
|
|
576
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "POST",
|
|
"url": "http://pocketbase-fftm1vu8twxfixup17v82xwe.169.239.180.130.sslip.io/api/collections/executions/records",
|
|
"authentication": "genericCredentialType",
|
|
"genericAuthType": "httpHeaderAuth",
|
|
"sendBody": true,
|
|
"specifyBody": "json",
|
|
"jsonBody": "={{ { \"n8n_execution_id\": $(\"Split Executions Array\").item.json.id, \"workflow_n8n_id\": $(\"Split Executions Array\").item.json.workflowId, \"status\": $(\"Split Executions Array\").item.json.status, \"started_at\": $(\"Split Executions Array\").item.json.startedAt, \"stopped_at\": $(\"Split Executions Array\").item.json.stoppedAt, \"error_message\": ((() => { try { return JSON.parse($('Split Executions Array').item.json.data || '{}')?.resultData?.error?.message || ''; } catch { return ''; } })()) } }}",
|
|
"options": {}
|
|
},
|
|
"id": "28f98c6d-0c0d-4aa0-b4ed-3918e8122c2e",
|
|
"name": "Create Execution Record",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.3,
|
|
"position": [
|
|
800,
|
|
672
|
|
],
|
|
"credentials": {
|
|
"httpHeaderAuth": {
|
|
"id": "HC4oQ8isTW3CEuSC",
|
|
"name": "POCKETBASE"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"pinData": {},
|
|
"connections": {
|
|
"Every 5 Minutes": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Fetch n8n Workflows",
|
|
"type": "main",
|
|
"index": 0
|
|
},
|
|
{
|
|
"node": "Fetch n8n Executions",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Fetch n8n Workflows": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Split Workflows Array",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Split Workflows Array": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Workflows: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Check Workflow Record Exists": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Workflow Record Exists?",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Workflow Record Exists?": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Update Workflow Record",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Create Workflow Record",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Update Workflow Record": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Workflows: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Workflows: One At A Time": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Workflows Sync Done",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Check Workflow Record Exists",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Create Workflow Record": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Workflows: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Fetch n8n Executions": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Split Executions Array",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Split Executions Array": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Executions: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Check Execution Record Exists": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Execution Record Exists?",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Execution Record Exists?": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Update Execution Record",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Create Execution Record",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Update Execution Record": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Executions: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Executions: One At A Time": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Executions Sync Done",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Check Execution Record Exists",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Create Execution Record": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Executions: One At A Time",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"active": false,
|
|
"settings": {
|
|
"executionOrder": "v1",
|
|
"binaryMode": "separate",
|
|
"availableInMCP": true
|
|
},
|
|
"versionId": "2509116a-170f-4eda-b3d5-93dc714ac8d1",
|
|
"meta": {
|
|
"aiBuilderAssisted": true,
|
|
"builderVariant": "mcp",
|
|
"instanceId": "05bcfa3b50919141d3600718ff4b7b2b52a3883525b05573a27ba5ef437ac7fb"
|
|
},
|
|
"nodeGroups": [],
|
|
"id": "cM8YciHiEwpslh1y",
|
|
"tags": []
|
|
} |