{ "name": "Paperless Sync: 192.168.2.88 docker-prod", "nodes": [ { "parameters": {}, "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ -208, 0 ], "id": "fb23b532-28c5-4871-8bbf-64eb3cb5e18d", "name": "When clicking ‘Execute workflow’" }, { "parameters": { "url": "https://192.168.2.88:9443/api/stacks", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" } ] }, "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ 240, 0 ], "id": "f11fb787-0f84-4d40-a898-1f7a18de84c9", "name": "get stack list", "credentials": { "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } } }, { "parameters": { "method": "POST", "url": "=https://192.168.2.88:9443/api/stacks/{{$json.stackId}}/stop?endpointId={{$json.endpointId}}\n", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ 688, 0 ], "id": "aa2afca0-c35e-43fd-aa60-cf1fba0144dc", "name": "stop stack", "credentials": { "httpBasicAuth": { "id": "iJkXePPAceSyENTx", "name": "CMI CAN Bus local" }, "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } } }, { "parameters": { "amount": 10 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 912, 0 ], "id": "c14f5705-093b-4d6b-b64b-88b4a2e9f978", "name": "wait 10 secs", "webhookId": "538f2b97-ff8b-4a6f-accd-453d3bbb9df2" }, { "parameters": { "method": "POST", "url": "=https://192.168.2.88:9443/api/stacks/{{ $('select stack by name').item.json.stackId }}/start?endpointId={{ $('select stack by name').item.json.endpointId }}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ 688, 224 ], "id": "fbcc6c71-8204-417a-ae50-fca8570c2504", "name": "start stack", "executeOnce": true, "credentials": { "httpBasicAuth": { "id": "iJkXePPAceSyENTx", "name": "CMI CAN Bus local" }, "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } }, "onError": "continueRegularOutput" }, { "parameters": { "url": "https://192.168.2.88:9443/api/endpoints/2/docker/containers/json?all=1", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ 912, 224 ], "id": "9ced6f31-66a0-41d5-b142-0f049630d420", "name": "list containers", "credentials": { "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "dfe53d42-71aa-4bbd-9cc1-90228d46ba6c", "name": "stackName", "value": "paperless-ngx", "type": "string" }, { "id": "b350e0c4-751a-4b8f-a8fd-29cae43f3953", "name": "endpointId", "value": 2, "type": "number" }, { "id": "bae42f62-9ca5-48ac-ba32-3b9fff0df26a", "name": "confirmWipe", "value": "YES_I_KNOW_THIS_DELETES_DATA", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 16, 0 ], "id": "bc6a9ec1-0f7b-4cfa-a5c4-8bec988ee1ef", "name": "stack config" }, { "parameters": { "jsCode": "const targetName = $('stack config').item.json.stackName; // paperless-ngx\nconst endpointIdWanted = $('stack config').item.json.endpointId; // 3\n\n// get stack list liefert mehrere items (je stack ein item)\nconst stacks = $input.all().map(i => i.json);\n\nconst match = stacks.find(s =>\n s.Name === targetName && Number(s.EndpointId) === Number(endpointIdWanted)\n);\n\nif (!match) {\n throw new Error(`Stack '${targetName}' (endpoint ${endpointIdWanted}) nicht gefunden`);\n}\n\nreturn [{\n json: {\n ...$('stack config').item.json,\n stackId: match.Id,\n endpointId: match.EndpointId,\n stackType: match.Type,\n projectPath: match.ProjectPath,\n entryPoint: match.EntryPoint,\n }\n}];\n" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 464, 0 ], "id": "0b1c748a-857b-448e-8bdc-1967ed58e17c", "name": "select stack by name" }, { "parameters": { "url": "={{ 'https://192.168.2.88:9443/api/endpoints/' + $json.EndpointId + '/docker/volumes' }}\n\n\n\n", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ 1136, 0 ], "id": "5717cb4a-1543-4989-89c0-4999f45bb354", "name": "list volumes", "credentials": { "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } } }, { "parameters": { "jsCode": "const stackCfg = $items('stack config')[0].json;\n\nconst stackName = stackCfg.stackName; // paperless-ngx\nconst confirm = stackCfg.confirmWipe; // YES_I_KNOW_THIS_DELETES_DATA\n\n\nif (confirm !== 'YES_I_KNOW_THIS_DELETES_DATA') {\n throw new Error('confirmWipe fehlt oder falsch. Abbruch (Sicherheitsgurt).');\n}\n\nconst volumes = $input.first().json.Volumes || [];\nconst filtered = volumes.filter(v => {\n const name = v.Name || '';\n const labels = v.Labels || {};\n // Sicherster Weg: compose project label\n const project = labels['com.docker.compose.project'];\n return project === stackName || name.startsWith(`${stackName}_`);\n});\n\nreturn filtered.map(v => ({\n json: {\n volumeName: v.Name,\n volumeNameEncoded: encodeURIComponent(v.Name),\n mountpoint: v.Mountpoint || null\n }\n}));\n\n" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1360, 0 ], "id": "f2f52e0c-5e9f-45f4-b517-66e15dbc2b72", "name": "filter paperless volumes" }, { "parameters": { "method": "DELETE", "url": "=https://192.168.2.88:9443/api/endpoints/{{$items('stack config')[0].json.endpointId}}/docker/volumes/{{$json.volumeNameEncoded}}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": { "allowUnauthorizedCerts": true } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.3, "position": [ -208, 224 ], "id": "2f16a8c9-68ff-4063-b806-027d907ba583", "name": "delete volume", "alwaysOutputData": true, "credentials": { "httpHeaderAuth": { "id": "Ojhv3EAP6KkEpALG", "name": "portainer-api 192.168.2.88" } }, "onError": "continueRegularOutput" }, { "parameters": { "amount": 10 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 16, 224 ], "id": "00de376e-ea99-48e3-9486-4b06262fbcde", "name": "wait 10 secs1", "webhookId": "75bb4335-1be1-4562-a235-f3950cd0568a" }, { "parameters": { "command": "docker exec duplicati sh -lc '\nset -eux\nSRC=\"file:///backups/paperless-ngx\"\nREST=\"/docker-volumes\"\nLOG=\"/backups/_logfiles_/restore-paperless-to-volumes-192_168_2_88.log\"\n\nmkdir -p \"$(dirname \"$LOG\")\"\nrm -f \"$LOG\"\n\n/app/duplicati/duplicati-cli restore \"$SRC\" \\\n --restore-path=\"$REST\" \\\n --passphrase=\"?Aichwald01\" \\\n --overwrite=true \\\n --restore-permissions=true \\\n --restore-metadata=true \\\n --console-log-level=Information \\\n --log-file-log-level=Information \\\n --log-file=\"$LOG\" \\\n --progress\n\necho \"RC=$?\"\ntail -n 40 \"$LOG\" || true\n'" }, "type": "n8n-nodes-base.ssh", "typeVersion": 1, "position": [ 240, 224 ], "id": "e3155e22-4684-47c4-8103-bb9e61b1aba4", "name": "restore auf docker volumes", "executeOnce": true, "credentials": { "sshPassword": { "id": "jIyLVqTSlygyA2PE", "name": "SSH Password account 192.168.2.88" } } }, { "parameters": { "amount": 10 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 464, 224 ], "id": "bbc66e24-1567-4c0f-87ac-a79ddf90b830", "name": "wait 10 secs2", "webhookId": "3d485195-7eeb-4d48-905d-e38100b72f89", "executeOnce": true }, { "parameters": { "rule": { "interval": [ { "triggerAtHour": 23 } ] } }, "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.3, "position": [ -208, -160 ], "id": "60f7830b-712c-444f-a976-3eeeb6ff9166", "name": "Schedule Trigger" }, { "parameters": { "chatId": "749279624", "text": "Paperless-ngx auf 192.168.2.88 wurde aktualisiert.", "additionalFields": {} }, "type": "n8n-nodes-base.telegram", "typeVersion": 1.2, "position": [ 1136, 224 ], "id": "380702df-81a2-4a96-a6dd-6c98756c62d7", "name": "send a message", "webhookId": "57d727e0-7fc6-4a64-a75f-e32efb62c261", "executeOnce": true, "credentials": { "telegramApi": { "id": "EUy2hT71fSdnEr2w", "name": "Telegram account" } } } ], "pinData": {}, "connections": { "When clicking ‘Execute workflow’": { "main": [ [ { "node": "stack config", "type": "main", "index": 0 } ] ] }, "get stack list": { "main": [ [ { "node": "select stack by name", "type": "main", "index": 0 } ] ] }, "stop stack": { "main": [ [ { "node": "wait 10 secs", "type": "main", "index": 0 } ] ] }, "wait 10 secs": { "main": [ [ { "node": "list volumes", "type": "main", "index": 0 } ] ] }, "start stack": { "main": [ [ { "node": "list containers", "type": "main", "index": 0 } ] ] }, "list containers": { "main": [ [ { "node": "send a message", "type": "main", "index": 0 } ] ] }, "stack config": { "main": [ [ { "node": "get stack list", "type": "main", "index": 0 } ] ] }, "select stack by name": { "main": [ [ { "node": "stop stack", "type": "main", "index": 0 } ] ] }, "list volumes": { "main": [ [ { "node": "filter paperless volumes", "type": "main", "index": 0 } ] ] }, "filter paperless volumes": { "main": [ [ { "node": "delete volume", "type": "main", "index": 0 } ] ] }, "delete volume": { "main": [ [ { "node": "wait 10 secs1", "type": "main", "index": 0 } ] ] }, "wait 10 secs1": { "main": [ [ { "node": "restore auf docker volumes", "type": "main", "index": 0 } ] ] }, "restore auf docker volumes": { "main": [ [ { "node": "wait 10 secs2", "type": "main", "index": 0 } ] ] }, "wait 10 secs2": { "main": [ [ { "node": "start stack", "type": "main", "index": 0 } ] ] }, "Schedule Trigger": { "main": [ [ { "node": "stack config", "type": "main", "index": 0 } ] ] } }, "active": true, "settings": { "executionOrder": "v1" }, "versionId": "ab793048-06e5-4e5a-806e-fac86306a04c", "meta": { "templateCredsSetupCompleted": true, "instanceId": "3cc6c4256e2bbdec1b3708c49dc3889c7266357f3e239651c157c2de760e6c65" }, "id": "FLUu0MpMS4Ga49oX", "tags": [ { "name": "Paperless-ngx", "id": "2gKReVMDIhJ1ungJ", "updatedAt": "2025-12-27T15:20:11.288Z", "createdAt": "2025-12-27T15:20:11.288Z" }, { "updatedAt": "2025-12-20T20:16:34.199Z", "createdAt": "2025-12-20T20:16:34.199Z", "id": "RCWZE5pB9KsORMxb", "name": "Office Automation" } ] }