AutomationFlowsWeb Scraping › Automatic Self-hosted Application Updates with Coolify Deployments

Automatic Self-hosted Application Updates with Coolify Deployments

ByEdoardo Guzzi @mredodos on n8n.io

This workflow is designed for self-hosted n8n administrators who want to keep their instance automatically updated to the latest stable release. It removes the need for manual version checks and ensures deployments are always up to date.

Cron / scheduled trigger★★★★☆ complexity18 nodesHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8118 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "74922542-1a88-41fd-83ca-9ff2b1599b50",
      "name": "Sticky \u2022 Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -272,
        16
      ],
      "parameters": {
        "color": 3,
        "width": 520,
        "height": 872,
        "content": "## Overview\n**Purpose:** Auto-check your n8n version and deploy an update via Coolify if a newer release is available.\n\n**Pipeline:** Manual/Schedule \u2192 HTTP n8n settings \u2192 HTTP GitHub latest \u2192 Merge (SQL) \u2192 Set (normalize) \u2192 IF compare \u2192 Deploy or No-Op.\n\n**Before running:**\n- Replace the n8n URL in the *N8N Settings* node.\n- Replace the Coolify API URL (domain + UUID) and add a valid Bearer YOUR_TOKEN_HERE credential in *Deploy* node.\n- Adjust the schedule interval if needed."
      },
      "typeVersion": 1
    },
    {
      "id": "34b0fe1d-6b44-4847-a4fe-16a23730cdd0",
      "name": "Sticky \u2022 Manual Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        304
      ],
      "parameters": {
        "color": "blue",
        "width": 384,
        "height": 220,
        "content": "## Manual Trigger\nClick **Execute workflow** to run tests immediately.\nNo configuration required."
      },
      "typeVersion": 1
    },
    {
      "id": "c2f1cd58-bf94-4be0-a938-5b758c966798",
      "name": "Sticky \u2022 Schedule",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        16
      ],
      "parameters": {
        "color": "blue",
        "width": 376,
        "height": 272,
        "content": "## Schedule Trigger\nRuns the check on a timer.\n- Open **Rule \u2192 Interval** and set how often to run (e.g., every 6h).\n- Keep both HTTP nodes connected so data reaches the Merge."
      },
      "typeVersion": 1
    },
    {
      "id": "00114438-dacd-43a4-b344-ea20ec8fab78",
      "name": "Sticky \u2022 N8N Settings",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        0
      ],
      "parameters": {
        "color": 5,
        "width": 468,
        "height": 344,
        "content": "## N8N Settings (HTTP Request)\nFetch your instance settings.\n- **Set URL:** `https://<your-n8n-domain>/rest/settings`\n- Output must include `data.versionCli`.\n- No auth needed for default public settings; add auth only if your instance requires it."
      },
      "typeVersion": 1
    },
    {
      "id": "165a79fe-1a72-4308-9595-8b253ac213f5",
      "name": "Sticky \u2022 GitHub Latest",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        560
      ],
      "parameters": {
        "color": 5,
        "width": 516,
        "height": 324,
        "content": "## GitHub Latest (HTTP Request)\nGets latest n8n release.\n- **URL:** `https://api.github.com/repos/n8n-io/n8n/releases/latest`\n- Field used later: **`name`** (e.g., `n8n@1.60.0`).\n- Keep method GET and no auth."
      },
      "typeVersion": 1
    },
    {
      "id": "29a1e319-7c3f-4442-8563-9ae0dc6dd2f3",
      "name": "Sticky \u2022 Merge SQL",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        32
      ],
      "parameters": {
        "color": "orange",
        "width": 328,
        "height": 528,
        "content": "## Merge (SQL)\nReduces inputs to 2 fields.\nUse this query:\n```sql\nSELECT input1.data->versionCli AS versionCli,\n       input2.name             AS name\nFROM input1\nLEFT JOIN input2 ON 1=1;\n```\n- Requires exactly 1 item per input.\n- Output keys: `versionCli`, `name`."
      },
      "typeVersion": 1
    },
    {
      "id": "80a0247d-df92-416a-8737-2d7319af0cef",
      "name": "Sticky \u2022 Set",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        144
      ],
      "parameters": {
        "color": "orange",
        "width": 356,
        "height": 420,
        "content": "## Set (Normalize)\nCreate clean variables for comparison:\n- `actualn8nversion = $json.versionCli`\n- `newn8nversion = $json.name.split('@')[1]`\nBoth as **string**."
      },
      "typeVersion": 1
    },
    {
      "id": "7f5d83a6-5510-414f-9ccb-c3e31bd4b748",
      "name": "Sticky \u2022 IF",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1888,
        144
      ],
      "parameters": {
        "color": "red",
        "width": 420,
        "height": 420,
        "content": "## IF (Compare)\nCondition: `actualn8nversion !== newn8nversion`.\n- True \u2192 deploy update.\n- False \u2192 do nothing.\nKeep **caseSensitive** and **strict type** enabled."
      },
      "typeVersion": 1
    },
    {
      "id": "86697e08-a3a2-49ee-af28-8540e7f9983e",
      "name": "Sticky \u2022 Deploy",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2384,
        112
      ],
      "parameters": {
        "color": "purple",
        "width": 460,
        "height": 348,
        "content": "## Deploy (HTTP Request)\nTriggers Coolify deploy.\n- **URL:** `https://<your-coolify-domain>/api/v1/services/<APP_UUID>/restart?latest=true`\n- **Auth:** *HTTP Bearer* credential with a valid API token.\n- Optional: set timeout/retries in **Options**.\nReplace domain and UUID."
      },
      "typeVersion": 1
    },
    {
      "id": "f8ae7d2b-4458-4686-b7e5-7737c5d7b95a",
      "name": "Schedule every time you want start the update check",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        496,
        160
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cb7eadb0-7fa3-479c-9fd4-4ef804844999",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2448,
        496
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3217fe2c-eae5-4499-9008-33d4cd7b0f09",
      "name": "If the 2 versions is not the same make an update of image",
      "type": "n8n-nodes-base.if",
      "position": [
        2064,
        368
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c8ee8d9d-1227-4738-a315-478475601721",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.actualn8nversion }}",
              "rightValue": "={{ $json.newn8nversion }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "81a3cf57-6269-4237-8671-0a1e5f46c15d",
      "name": "CALL COOLIFY OR SIMILAR SERVICE FOR UPDATE IMAGE",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2448,
        288
      ],
      "parameters": {
        "url": "https://app.coolify.io/api/v1/services/your-services-uuid/restart?latest=true",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3675b8ea-b9d3-4383-9422-d4335f7bc5f4",
      "name": "Rename variable and unify format",
      "type": "n8n-nodes-base.set",
      "position": [
        1680,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a7787c92-705f-445f-8eee-a36c3555203c",
              "name": "actualn8nversion",
              "type": "string",
              "value": "={{ $json.versionCli }}"
            },
            {
              "id": "7e6dc6fa-44be-4e52-bf5c-1ebf4262f18a",
              "name": "newn8nversion",
              "type": "string",
              "value": "={{ $json.name.split(\"@\")[1] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "16bd29a3-b38a-42ec-97e7-533e145eae65",
      "name": "Merge bot data and pass just what we need",
      "type": "n8n-nodes-base.merge",
      "position": [
        1200,
        368
      ],
      "parameters": {
        "mode": "combineBySql",
        "query": "SELECT\n  input1.data->versionCli AS versionCli,\n  input2.name AS name\nFROM input1\nLEFT JOIN input2 ON 1=1;",
        "options": {
          "emptyQueryResult": "success"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "50112ebc-7fda-4cb9-94a1-4d7cd924e657",
      "name": "When clicking \u2018Execute workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        496,
        384
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "6d60b6eb-9827-4d46-b4ee-27aedefc7801",
      "name": "CALL YOUR N8N INSTANCE and retrieve the version",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        976,
        176
      ],
      "parameters": {
        "url": "https://yourn8ndomain/rest/settings",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "59b20003-8247-43e1-aa68-7435055aa6e9",
      "name": "CALL GITHUB and retrieve the last n8n image stable version",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        960,
        704
      ],
      "parameters": {
        "url": "https://api.github.com/repos/n8n-io/n8n/releases/latest",
        "options": {}
      },
      "typeVersion": 4.2
    }
  ],
  "connections": {
    "Rename variable and unify format": {
      "main": [
        [
          {
            "node": "If the 2 versions is not the same make an update of image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow": {
      "main": [
        [
          {
            "node": "CALL GITHUB and retrieve the last n8n image stable version",
            "type": "main",
            "index": 0
          },
          {
            "node": "CALL YOUR N8N INSTANCE and retrieve the version",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge bot data and pass just what we need": {
      "main": [
        [
          {
            "node": "Rename variable and unify format",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CALL YOUR N8N INSTANCE and retrieve the version": {
      "main": [
        [
          {
            "node": "Merge bot data and pass just what we need",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule every time you want start the update check": {
      "main": [
        [
          {
            "node": "CALL YOUR N8N INSTANCE and retrieve the version",
            "type": "main",
            "index": 0
          },
          {
            "node": "CALL GITHUB and retrieve the last n8n image stable version",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If the 2 versions is not the same make an update of image": {
      "main": [
        [
          {
            "node": "CALL COOLIFY OR SIMILAR SERVICE FOR UPDATE IMAGE",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CALL GITHUB and retrieve the last n8n image stable version": {
      "main": [
        [
          {
            "node": "Merge bot data and pass just what we need",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is designed for self-hosted n8n administrators who want to keep their instance automatically updated to the latest stable release. It removes the need for manual version checks and ensures deployments are always up to date.

Source: https://n8n.io/workflows/8118/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

As n8n instances scale, teams often lose track of sub-workflows—who uses them, where they are referenced, and whether they can be safely updated. This leads to inefficiencies like unnecessary copies o

HTTP Request, n8n, N8N Trigger +1
Web Scraping

This workflow is an improvement of this workflow by Greg Brzezinka.

HTTP Request, Email Send, XML +1
Web Scraping

N8N-Workflow-Github-Manager. Uses github, httpRequest, n8n. Scheduled trigger; 38 nodes.

GitHub, HTTP Request, n8n
Web Scraping

This workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.

N8N Nodes Klicktipp, Salesforce, Salesforce Trigger +1
Web Scraping

This workflow acts as an automated engagement bot. It sends a Direct Message (DM) with a link or resource to any follower who replies to your post with a specific target keyword.

HTTP Request