AutomationFlowsGeneral › Server Health Monitoring Alert Workflow

Server Health Monitoring Alert Workflow

Original n8n title: Schedule Stickynote

Schedule Stickynote. Uses emailSend, ssh, stickyNote, scheduleTrigger. Scheduled trigger; 10 nodes.

Cron / scheduled trigger★★★★☆ complexity10 nodesEmail SendSsh
General Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

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": "ba168090-4727-4b72-a0cf-3f15ef3a9f17",
      "name": "Send Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        580,
        360
      ],
      "parameters": {
        "text": "=System resources are above the threshold.\n\nCPU: {{ $json.CPU.toNumber().round(2) }}%\nRAM: {{ $json.RAM.toNumber().round(2) }}%\nDisk: {{ $json.Disk.toNumber().round(2) }}%",
        "options": {},
        "subject": "System Resource Alert",
        "toEmail": "change@me.com",
        "fromEmail": "change@me.com"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "79afc30f-c3db-4ba1-8f0d-a1000b5e0abe",
      "name": "Check RAM usage",
      "type": "n8n-nodes-base.ssh",
      "position": [
        160,
        40
      ],
      "parameters": {
        "command": "free | awk '/Mem:/ {printf \"%.2f\", (1 - $7/$2) * 100}'"
      },
      "credentials": {
        "sshPassword": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "d09aa314-8d60-42a8-9933-d7e8d73e2c7d",
      "name": "Check Disk usage",
      "type": "n8n-nodes-base.ssh",
      "position": [
        380,
        40
      ],
      "parameters": {
        "command": "df -h | awk '$NF==\"/\"{printf \"%.2f\", $5}'"
      },
      "credentials": {
        "sshPassword": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "bc6a0df2-f4cc-484a-ac39-c92e8795175e",
      "name": "Check CPU usage",
      "type": "n8n-nodes-base.ssh",
      "position": [
        580,
        40
      ],
      "parameters": {
        "command": "top -bn 1 | grep \"Cpu(s)\" | sed \"s/.*, *\\([0-9.]*\\)%* id.*/\\1/\" | awk '{print 100 - $1}'"
      },
      "credentials": {
        "sshPassword": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "de0df734-1e4a-4bf0-9f7d-d60b52e06f48",
      "name": "Merge check results",
      "type": "n8n-nodes-base.merge",
      "position": [
        -40,
        380
      ],
      "parameters": {
        "mode": "combineBySql",
        "query": "SELECT input1.stdout as CPU, input2.stdout as Disk, input3.stdout as RAM FROM input1 LEFT JOIN input2 ON input1.name = input2.id LEFT JOIN input3 ON input1.name = input3.id",
        "numberInputs": 3
      },
      "typeVersion": 3
    },
    {
      "id": "7b7d6c0a-3f46-48b3-aa1d-191839540196",
      "name": "Check results against thresholds",
      "type": "n8n-nodes-base.if",
      "position": [
        240,
        380
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json.CPU }}",
              "value2": 80,
              "operation": "largerEqual"
            },
            {
              "value1": "={{ $json.Disk }}",
              "value2": 80,
              "operation": "largerEqual"
            },
            {
              "value1": "={{ $json.RAM }}",
              "value2": 80,
              "operation": "largerEqual"
            }
          ]
        },
        "combineOperation": "any"
      },
      "typeVersion": 1
    },
    {
      "id": "92331c38-cab8-4719-8746-6fb341954516",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        260
      ],
      "parameters": {
        "width": 320,
        "height": 280,
        "content": "## Update email addresses\nUpdate From and To email addresses in this node to receive notifications"
      },
      "typeVersion": 1
    },
    {
      "id": "3117fdbc-fde9-469b-bd47-59f45c349162",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -260,
        -120
      ],
      "parameters": {
        "width": 320,
        "height": 260,
        "content": "## Check VPS resource usage every 15 minutes\nThis workflow checks VPS CPU, RAM and Disk usage every 15 minutes and if any of it exceeds 80% will inform you by email"
      },
      "typeVersion": 1
    },
    {
      "id": "45b4c33a-8f02-4535-b67f-56d9d0aaf2ae",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        180,
        260
      ],
      "parameters": {
        "width": 360,
        "height": 280,
        "content": "## Update threshold\nIf needed, you can increase/decrease the 80% threshold in this node individually per resource "
      },
      "typeVersion": 1
    },
    {
      "id": "0bf83ea8-b1c4-40f7-8a60-39f765e8ec2c",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -40,
        40
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "typeVersion": 1.2
    }
  ],
  "connections": {
    "Check CPU usage": {
      "main": [
        [
          {
            "node": "Merge check results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check RAM usage": {
      "main": [
        [
          {
            "node": "Check Disk usage",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge check results",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Check Disk usage": {
      "main": [
        [
          {
            "node": "Check CPU usage",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge check results",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Check RAM usage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge check results": {
      "main": [
        [
          {
            "node": "Check results against thresholds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check results against thresholds": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

How this works

Keep your servers running smoothly without constant monitoring by receiving automated email alerts for critical resource issues, saving time and preventing downtime for busy system administrators or DevOps teams. This workflow checks CPU, RAM, and disk usage on remote servers via SSH, merges the results, and compares them against predefined thresholds to trigger notifications only when necessary. The key step involves the conditional evaluation that decides whether to send an alert, integrating seamlessly with email services for instant delivery.

Use this workflow for routine health checks on Linux servers where resources often fluctuate, such as during peak hours or after deployments, ensuring proactive issue resolution. Avoid it for non-SSH environments like cloud dashboards with built-in monitoring, or if you need real-time alerts beyond scheduled intervals. Common variations include adjusting cron triggers for hourly versus daily runs, or adding Slack notifications instead of email for team collaboration.

About this workflow

Schedule Stickynote. Uses emailSend, ssh, stickyNote, scheduleTrigger. Scheduled trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

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

General

Code Schedule. Uses ssh, emailSend, scheduleTrigger, stickyNote. Scheduled trigger; 7 nodes.

Ssh, Email Send
General

Amazon Product Price Tracker. Uses googleSheets, splitInBatches, httpRequest, emailSend. Scheduled trigger; 16 nodes.

Google Sheets, HTTP Request, Email Send
General

Datetime Googlecalendar. Uses dateTime, noOp, googleCalendar, emailSend. Scheduled trigger; 13 nodes.

Google Calendar, Email Send
General

Generate Weekly Energy Consumption Reports with API, Email and Google Drive. Uses httpRequest, convertToFile, emailSend, googleDrive. Scheduled trigger; 12 nodes.

HTTP Request, Email Send, Google Drive
General

Weekly hiring‑manager snapshot from Breezy HR to email (pipeline, next‑week interviews, stuck). Uses httpRequest, emailSend. Scheduled trigger; 12 nodes.

HTTP Request, Email Send