1. uptime-kuma 简介
uptime-kuma是一款开源监控工具,类似于“Uptime Robot”,UI简洁美观,支持TCP/PING/HTTP监控等,支持多语言其中包括中文。当服务出现故障时,可自动通过 Telegram、Discord、Gotify、Slack、Pushover、Email (SMTP) 等多种服务发送通知消息。
项目地址:https://github.com/louislam/uptime-kuma
官方演示:https://demo.uptime.kuma.pet

2. 搭建前的环境准备
以下我将采用宝塔面板与Docker混合部署的方式(宝塔面板开启HTTPS,Docker安装uptime-kuma),VPS系统用的是Debian 10 ×86_64。
VPS的购买及配置、域名解析、宝塔面板的搭建及使用、Docker的概念及使用…这些基本的就不再赘述了,如果不会的话见我的另一篇博客:VPS基本部署环境的搭建与配置。
2.1 Docker环境搭建
$ apt-get update -y && apt-get install curl -y # 安装curl
$ curl https://get.docker.com | sh - # 安装docker
$ sudo systemctl start docker # 启动docker服务
$ docker version # 查看docker版本(客户端要与服务端一致)
复制
2.2 申请泛域名SSL证书
SSL证书是一种数字证书,用于加密从用户的浏览器发送到Web服务器的数据。 通过这种方式,发送的数据对于使用Wireshark等数据包嗅探器来拦截和窃听您的通信的黑客来说是安全的。
Chrome一直在推动https,所有的http协议网站被标记为不安全,如果再不对网站进行https改造的话,那么可能会对信任度造成一定的影响,所以说对一个面向用户的网站来说,开启https是非常有必要的。
下面将使用acme.sh开源项目申请免费的 Let’s Encrypt 泛域名SSL证书。
注:如果懒得折腾泛域名证书,后面也可在宝塔面板直接傻瓜式申请Let’s Encrypt的单域名SSL证书(宝塔面板——网站——设置——SSL——Let’s Encrypt——勾选域名,点文件验证——申请出来后设置强制HTTPS)。
2.2.1 安装 acme.sh
$ curl https://get.acme.sh | sh
复制

普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:
- [1] 把 acme.sh 安装到你的 root 目录下,并创建 一个 bash 的 alias, 方便你的使用。
- [2] 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。
注:安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中。那个socat未安装的问题不用管,那是http验证无Web Server时才需要的。
2.2.2 生成SSL泛域名证书
acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。
- http 验证:http 方式需要在你的网站根目录下放置一个文件,来验证你的域名所有权。
- dns 验证:dns 方式,在域名上添加一条 txt 解析记录,验证域名所有权。
dns 方式的可以使用域名解析商提供的 API 自动添加 txt 记录完成验证,下面我们将采用这种方法申请Namesilo的泛域名证书。
Step1:打开 https://www.namesilo.com/account/api-manager 去申请 NameSilo API,勾选第2个复选框,点击Generate,即可生成。

注:务必不要勾选上Generate key for read-only access的哪个复选框,否则会导致Unable to add the DNS record. Error add txt for domain
的问题。另外,生成的API只出现一次,如果没记下来只能重置。
Step2:在服务器输入以下命令,实现自动dns验证生成泛域名证书。
$ cd /root/.acme.sh
$ export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
$ ./acme.sh --issue --dns dns_namesilo --dnssleep 1800 -d example.com -d *.example.com
复制
等待1800s即可看到申请下来的SSL证书(NameSilo的验证比较慢,官方文档上写的900s有时不足以验证完)

生成文件都放在/root/.acme.sh/example.com/
目录下,其中:example.com.key
是密钥文件,fullchain.cer
是证书文件。
注:如果你的域名不是NameSilo的,上述操作有所不同,具体请参考: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
2.3 申请Telegram Bot
这个是用于消息通知的,如果你不打算用TG进行消息通知,略过本节即可。如果你对Telegram和Telegram Bot还不够熟悉,可以先去看看我的另一篇博客:Telegram及Telegram Bot使用指南。
2.3.1 申请 Telegram Bot
找 BotFather 官方机器人申请自己的 Telegram Bot,需要记录下:BotName、TOKEN、CHATID等信息。
- Step1:在Telegram中添加
BotFather
这个账号,然后依次发送/start
,/newbot
,按照提示即可创建一个新的机器人。记下来给你生成的token。
- Step2:搜索刚刚创建的机器人的名字,并给它发送一条消息。(注意:需要先与机器人之间创建会话,机器人才能下发消息,否则机器人无法主动发送消息)
- Step3:在Telegram中搜索
userinfobot
,并给它发送一条消息,它会返回给你chatid
,将它也记下来。
2.3.2 修改 Telegram Bot 头像
还是找 BotFather 官方机器人,先发送/setuserpic
,它会让你选择为哪个Bot修改,选择完之后发送头像图片给它即可。
注:头像以图片的形式发送,不要以文件的形式发送(发送时点上那个压缩图片即为图片的形式发送)
3. 搭建 uptime-kuma 面板
3.1 使用 Docker 部署服务
$ docker volume create uptime-kuma
$ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
复制
3.2 设置反向代理并开启HTTPS
3.2.1 新建网站
宝塔面板——网站——添加站点——填写域名即可(其他的都不需要,我们只是用它来做反向代理和配置HTTPS)
3.2.2 给网站开启HTTPS
宝塔面板——网站——设置——SSL——其他证书,把example.com.key
密钥文件、fullchain.cer
证书文件复制上去,强制https。

3.2.3 设置反向代理
宝塔面板——网站——设置——反向代理——添加反向代理——填写代理名称和目标URL(http://127.0.0.1:3001
)
注意:与其他 Web 应用程序不同,Uptime Kuma 基于 WebSocket。还需要在 Nginx 里配置 “Upgrade” and “Connection” 才能反向代理 WebSocket。具体操作步骤如下:
宝塔面板——网站——设置——配置文件,在location /
内添加上”Upgrade” and “Connection”的那两行配置。
server {
listen 443 ssl http2;
server_name sub.domain.com;
ssl_certificate /path/to/ssl/cert/crt;
ssl_certificate_key /path/to/ssl/key/key;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:3001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
复制
4. 使用 uptime-kuma 面板
4.1 面板基本配置
Chrome浏览器访问:https://域名
,即可查看 uptime-kuma 服务监控面板,初始界面如下:

点击设置按钮,可以对语言、主题、时区、是否允许搜索引擎索引、是否需要身份验证等多个方面进行个性化配置。
4.2 设置Telegram 消息通知
4.2.1 国外服务器设置TG消息通知
我们可以点击新增,创建监控项,填写 Bot Token 和 Chat ID 即可配置好 Telegram 消息通知。

4.2.2 解决国内部署无法发送TG通知的问题
由于国内GFW的原因,如果把 uptime-kuma 部署在国内服务器,则无法成功发送TG通知。我们可以用CloudFlare的workers部署Telegram Bot消息通知的反向代理来解决这个问题。
有关CloudFlare的基本使用就不再赘述了,如果不会的话见我的另一篇博客:VPS基本部署环境的搭建与配置。
Step1:解析一个子域名备用(即反代域名)
在CloudFlare的网站DNS处解析一个域名,注意这里的 IPv4 地址填写成2.2.2.2
,而不是你的服务器IP。

Step2:创建CloudFlare workers并配置路由
打开账号下的Workers侧边栏,点击创建服务,起一个服务名称,选择HTTP处理程序。

进去之后,点击“快速编辑”,在此配置js脚本,将Telegram官方地址转发到你的反代地址上。
脚本内容如下,注意将第一行bot之后的数字换成你TG token的数字部分。
const whitelist = ["/bot1111111111:"];
const tg_host = "api.telegram.org";
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
function validate(path) {
for (var i = 0; i < whitelist.length; i++) {
if (path.startsWith(whitelist[i]))
return true;
}
return false;
}
async function handleRequest(request) {
var u = new URL(request.url);
u.host = tg_host;
if (!validate(u.pathname))
return new Response('Unauthorized', {
status: 403
});
var req = new Request(u, {
method: request.method,
headers: request.headers,
body: request.body
});
const result = await fetch(req);
return result;
}
复制

配置好这里之后,点击“保存并部署”。
打开根域名下的Workers侧边栏,点击添加路由,路由填写成反代域名/*
,服务选择我们刚才配置的那个,环境选择production,保存即可。

Step3:修改uptime-kuma的代码
$ docker exec -it uptime-kuma /bin/bash
$ apt-get update && apt-get install vim -y // 安装vim
$ vim /app/src/components/notifications/Telegram.vue // 找到:api.telegram.org,将其替换成你的反代域名(就一处)
$ vim /app/server/notification-providers/telegram.js // 找到:api.telegram.org,将其替换成你的反代域名(就一处)
$ exit
$ docker restart uptime-kuma
复制
之后再次使用 uptime-kuma 的消息通知,即可正常发送到你的 Telegram Bot上了。
4.3 面板版本更新
只需要如下命令即可更新,其他配置无需更改,数据也不会丢失(因为对其进行挂载了)
$ docker pull louislam/uptime-kuma:1
$ docker stop uptime-kuma
$ docker rm uptime-kuma
$ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
复制
5. 参考资料
[1] 一个花哨的自托管监控工具 from Github
[2] uptime-kuma的高级安装 from Github
[3] uptime-kuma反向代理配置 from Github
[4] uptime-kuma 如何更新 from Github
[5] 一个UPTIME监控系统:UPTIME KUMA from 周先生
[6] 用CloudFlare的workers部署Telegram Bot通知反代 from 周先生
[7] 自建CloudFlare Serverless Worker反代Telegram通知+支持Post from 1024ee
[8] 使用CloudFlare的Workers反向代理网站的三种源码 from 行而思雨
[9] Cloudflare Workers 反代使用 GitHub 仓库搭建的图床 from Rabbir