diff --git a/server/config.json b/server/config.json
index 4c86ca8..290b195 100644
--- a/server/config.json
+++ b/server/config.json
@@ -1,5 +1,5 @@
-{"servers":
-	[
+{
+	"servers": [
 		{
 			"username": "s01",
 			"name": "node1",
@@ -37,5 +37,27 @@
 			"password": "USER_DEFAULT_PASSWORD",
 			"monthstart": 1
 		}
+	],
+	"watchdog": [
+		{
+			"name": "cpu high warning",
+			"rule": "cpu>90",
+			"callback": "https://yourSMSurl"
+		},
+		{
+			"name": "memory high warning",
+			"rule": "(memory_used/memory_total)*100>90",
+			"callback": "https://yourSMSurl"
+		},
+		{
+			"name": "ipv4 offline warning",
+			"rule": "online4=false",
+			"callback": "https://yourSMSurl"
+		},
+		{
+			"name": "you can parse an expression combining any known field",
+			"rule": "(hdd_used/hdd_total)*100>95",
+			"callback": "https://yourSMSurl"
+		}
 	]
 }
diff --git a/server/src/main.cpp b/server/src/main.cpp
index 22ebf1d..504e39c 100644
--- a/server/src/main.cpp
+++ b/server/src/main.cpp
@@ -411,6 +411,25 @@ int CMain::ReadConfig()
 		}
 	}
 
+	// watch dog
+	// support by: https://cpp.la
+	ID = 0;
+	const json_value &jStart = (*pJsonData)["watchdog"];
+	if(jStart.type == json_array)
+    {
+        for(unsigned i = 0; i < jStart.u.array.length; i++)
+        {
+            if(ID < 0 || ID >= NET_MAX_CLIENTS)
+                continue;
+
+            str_copy(Watchdog(ID)->m_aName, jStart[i]["name"].u.string.ptr, sizeof(Watchdog(ID)->m_aName));
+            str_copy(Watchdog(ID)->m_aRule, jStart[i]["rule"].u.string.ptr, sizeof(Watchdog(ID)->m_aRule));
+            str_copy(Watchdog(ID)->m_aCallback, jStart[i]["callback"].u.string.ptr, sizeof(Watchdog(ID)->m_aCallback));
+
+            ID++;
+        }
+    }
+
 	// if file exists, read last network traffic record,reset m_LastNetworkIN and m_LastNetworkOUT
 	// support by: https://cpp.la
     IOHANDLE nFile = io_open(m_Config.m_aJSONFile, IOFLAG_READ);
diff --git a/server/src/main.h b/server/src/main.h
index 2993809..7cb6592 100644
--- a/server/src/main.h
+++ b/server/src/main.h
@@ -82,6 +82,12 @@ class CMain
 		} m_Stats;
 	} m_aClients[NET_MAX_CLIENTS];
 
+	struct CWatchDog{
+	    char m_aName[128];
+	    char m_aRule[128];
+	    char m_aCallback[128];
+	} m_aCWatchDogs[NET_MAX_CLIENTS];
+
 	struct CJSONUpdateThreadData
 	{
 		CClient *pClients;
@@ -99,6 +105,8 @@ public:
 	int ReadConfig();
 	int Run();
 
+    CWatchDog *Watchdog(int ruleID) { return &m_aCWatchDogs[ruleID]; }
+
 	CClient *Client(int ClientID) { return &m_aClients[ClientID]; }
 	CClient *ClientNet(int ClientNetID);
 	const CConfig *Config() const { return &m_Config; }