5337e17f21
n8n typeVersion 1.2 requires workflowId as resource locator object:
{ "__rl": true, "mode": "list", "value": "<id>" }
not a plain string. This was causing "workflow not found" errors.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
304 lines
9.9 KiB
JSON
304 lines
9.9 KiB
JSON
{
|
|
"name": "Container Actions",
|
|
"nodes": [
|
|
{
|
|
"parameters": {
|
|
"inputSource": "passthrough",
|
|
"schema": {
|
|
"schemaType": "fromFields",
|
|
"inputFieldName": "",
|
|
"fields": [
|
|
{
|
|
"fieldName": "containerId",
|
|
"fieldType": "string"
|
|
},
|
|
{
|
|
"fieldName": "containerName",
|
|
"fieldType": "string"
|
|
},
|
|
{
|
|
"fieldName": "action",
|
|
"fieldType": "string"
|
|
},
|
|
{
|
|
"fieldName": "chatId",
|
|
"fieldType": "number"
|
|
},
|
|
{
|
|
"fieldName": "messageId",
|
|
"fieldType": "number"
|
|
},
|
|
{
|
|
"fieldName": "responseMode",
|
|
"fieldType": "string"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"id": "trigger-sub-workflow",
|
|
"name": "When executed by another workflow",
|
|
"type": "n8n-nodes-base.executeWorkflowTrigger",
|
|
"typeVersion": 1.1,
|
|
"position": [
|
|
240,
|
|
300
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"rules": {
|
|
"values": [
|
|
{
|
|
"id": "route-start",
|
|
"conditions": {
|
|
"options": {
|
|
"caseSensitive": true,
|
|
"typeValidation": "loose"
|
|
},
|
|
"conditions": [
|
|
{
|
|
"id": "is-start",
|
|
"leftValue": "={{ $json.action }}",
|
|
"rightValue": "start",
|
|
"operator": {
|
|
"type": "string",
|
|
"operation": "equals"
|
|
}
|
|
}
|
|
],
|
|
"combinator": "and"
|
|
},
|
|
"renameOutput": true,
|
|
"outputKey": "start"
|
|
},
|
|
{
|
|
"id": "route-stop",
|
|
"conditions": {
|
|
"options": {
|
|
"caseSensitive": true,
|
|
"typeValidation": "loose"
|
|
},
|
|
"conditions": [
|
|
{
|
|
"id": "is-stop",
|
|
"leftValue": "={{ $json.action }}",
|
|
"rightValue": "stop",
|
|
"operator": {
|
|
"type": "string",
|
|
"operation": "equals"
|
|
}
|
|
}
|
|
],
|
|
"combinator": "and"
|
|
},
|
|
"renameOutput": true,
|
|
"outputKey": "stop"
|
|
},
|
|
{
|
|
"id": "route-restart",
|
|
"conditions": {
|
|
"options": {
|
|
"caseSensitive": true,
|
|
"typeValidation": "loose"
|
|
},
|
|
"conditions": [
|
|
{
|
|
"id": "is-restart",
|
|
"leftValue": "={{ $json.action }}",
|
|
"rightValue": "restart",
|
|
"operator": {
|
|
"type": "string",
|
|
"operation": "equals"
|
|
}
|
|
}
|
|
],
|
|
"combinator": "and"
|
|
},
|
|
"renameOutput": true,
|
|
"outputKey": "restart"
|
|
}
|
|
]
|
|
},
|
|
"options": {
|
|
"fallbackOutput": "none"
|
|
}
|
|
},
|
|
"id": "switch-action-type",
|
|
"name": "Route Action",
|
|
"type": "n8n-nodes-base.switch",
|
|
"typeVersion": 3.2,
|
|
"position": [
|
|
460,
|
|
300
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "POST",
|
|
"url": "=http://docker-socket-proxy:2375/v1.47/containers/{{ $json.containerId }}/start",
|
|
"options": {
|
|
"timeout": 15000
|
|
}
|
|
},
|
|
"id": "http-start-container",
|
|
"name": "Start Container",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.2,
|
|
"position": [
|
|
680,
|
|
200
|
|
],
|
|
"onError": "continueRegularOutput"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "POST",
|
|
"url": "=http://docker-socket-proxy:2375/v1.47/containers/{{ $json.containerId }}/stop?t=10",
|
|
"options": {
|
|
"timeout": 15000
|
|
}
|
|
},
|
|
"id": "http-stop-container",
|
|
"name": "Stop Container",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.2,
|
|
"position": [
|
|
680,
|
|
300
|
|
],
|
|
"onError": "continueRegularOutput"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"method": "POST",
|
|
"url": "=http://docker-socket-proxy:2375/v1.47/containers/{{ $json.containerId }}/restart?t=10",
|
|
"options": {
|
|
"timeout": 15000
|
|
}
|
|
},
|
|
"id": "http-restart-container",
|
|
"name": "Restart Container",
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.2,
|
|
"position": [
|
|
680,
|
|
400
|
|
],
|
|
"onError": "continueRegularOutput"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "// Format start action result\nconst triggerData = $('When executed by another workflow').item.json;\nconst containerId = triggerData.containerId;\nconst containerName = triggerData.containerName;\nconst action = triggerData.action;\nconst chatId = triggerData.chatId;\nconst messageId = triggerData.messageId;\nconst responseMode = triggerData.responseMode;\n\n// Check response status\nconst responseCode = $input.item.json?.statusCode || $input.item.json?.$response?.statusCode || 0;\nconst hasError = $input.item.json?.error || false;\n\n// 204: Success, 304: Already in state (also success for user)\nconst success = !hasError && (responseCode === 204 || responseCode === 304);\n\nlet message;\nif (success) {\n message = `\\u25B6\\uFE0F <b>${containerName}</b> started successfully`;\n} else {\n message = `\\u274C Failed to start <b>${containerName}</b>`;\n}\n\nreturn {\n json: {\n success,\n message,\n action,\n containerName,\n containerId,\n chatId,\n messageId,\n responseMode\n }\n};"
|
|
},
|
|
"id": "code-format-start-result",
|
|
"name": "Format Start Result",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
900,
|
|
200
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "// Format stop action result\nconst triggerData = $('When executed by another workflow').item.json;\nconst containerId = triggerData.containerId;\nconst containerName = triggerData.containerName;\nconst action = triggerData.action;\nconst chatId = triggerData.chatId;\nconst messageId = triggerData.messageId;\nconst responseMode = triggerData.responseMode;\n\n// Check response status\nconst responseCode = $input.item.json?.statusCode || $input.item.json?.$response?.statusCode || 0;\nconst hasError = $input.item.json?.error || false;\n\n// 204: Success, 304: Already stopped\nconst success = !hasError && (responseCode === 204 || responseCode === 304);\n\nlet message;\nif (success) {\n message = `\\u23F9\\uFE0F <b>${containerName}</b> stopped`;\n} else {\n message = `\\u274C Failed to stop <b>${containerName}</b>`;\n}\n\nreturn {\n json: {\n success,\n message,\n action,\n containerName,\n containerId,\n chatId,\n messageId,\n responseMode\n }\n};"
|
|
},
|
|
"id": "code-format-stop-result",
|
|
"name": "Format Stop Result",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
900,
|
|
300
|
|
]
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "// Format restart action result\nconst triggerData = $('When executed by another workflow').item.json;\nconst containerId = triggerData.containerId;\nconst containerName = triggerData.containerName;\nconst action = triggerData.action;\nconst chatId = triggerData.chatId;\nconst messageId = triggerData.messageId;\nconst responseMode = triggerData.responseMode;\n\n// Check response status\nconst responseCode = $input.item.json?.statusCode || $input.item.json?.$response?.statusCode || 0;\nconst hasError = $input.item.json?.error || false;\n\n// 204: Success, 304: No change needed\nconst success = !hasError && (responseCode === 204 || responseCode === 304);\n\nlet message;\nif (success) {\n message = `\\u{1F504} <b>${containerName}</b> restarted`;\n} else {\n message = `\\u274C Failed to restart <b>${containerName}</b>`;\n}\n\nreturn {\n json: {\n success,\n message,\n action,\n containerName,\n containerId,\n chatId,\n messageId,\n responseMode\n }\n};"
|
|
},
|
|
"id": "code-format-restart-result",
|
|
"name": "Format Restart Result",
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
900,
|
|
400
|
|
]
|
|
}
|
|
],
|
|
"connections": {
|
|
"When executed by another workflow": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Route Action",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Route Action": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Start Container",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Stop Container",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
],
|
|
[
|
|
{
|
|
"node": "Restart Container",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Start Container": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Format Start Result",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Stop Container": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Format Stop Result",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Restart Container": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Format Restart Result",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"settings": {
|
|
"executionOrder": "v1",
|
|
"callerPolicy": "any"
|
|
}
|
|
} |