阅读视图

发现新文章,点击刷新页面。
🔲 ☆

UptimeKuma - 自建网站状态监控服务

曾经使用过类似的服务 UptimeRobot 通过API配合开源面板体验还是不错的,但是 UPTIMEROBOT 没有国内的节点,由于线路问题很多时候会有误报的情况。而且自建还可以把数据牢牢地放在自己手里。

Uptime Kuma可以通过 Docker 或者手动安装,是一个十分成熟的开源解决方案。


项目简介

项目地址:Uptime Kuma

特性

支持的监控:HTTP(s) / TCP / HTTP(s) 关键字 / Ping / DNS 记录 / PUSH / Steam 游戏服务器的正常运行时间、SSL过期监控。

通过 Telegram、Discord、Gotify、Slack、Pushover、电子邮件 (SMTP) 以及70多种的服务推送通知。

多种语言支持,而且界面十分美观。

手动安装需要 Nodejs 版本 ≥ 14,而且通过PM2进行后台运行。

本文通过宝塔面板以及 DOCKER 进行安装。

配置 Uptime Kuma

安装Docker

在宝塔面板打开 应用商店 选择 Docker 进行安装

img

获取镜像

安装完成后即可进行获取镜像,在宝塔的 Docker 选择镜像管理,获取镜像输入以下镜像名称进行获取镜像

1
louislam/uptime-kuma

img

由于是通过 Docker 官方仓库获取镜像,所以速度较慢,请耐心等待。

配置容器

Uptime Kuma 的容器配置非常简单,详细配置如下:

1
2
3
4
5
镜像选择:louislam/uptime-kuma 
容器端口:3001
服务器端口:自定义即可
容器目录:/app/data
服务器目录:自定义即可

img

即可提交运行。此时通过 IP:自定义端口,即可访问服务。

设置反代

如果不想通过IP访问服务,此时需要进行 NGINX 反向代理。

注:如开启反向代理,请关闭 COCKER 对外设置的服务端口

新建网站,配置好SSL后即可进行反向代理配置,具体配置如下:

1
2
代理名称:自定义
目标URL:http://127.0.0.1:32111 (此处端口为自定义的端口)

完成以上配置,提交即可

img

由于项目的特殊性,需要用到 WebSocket 所以如果不配置WebSocket会出现以下错误:

1
2
3
Cannot connect to the socket server. [Error: websocket error] Reconnecting...
Using a Reverse Proxy? Check how to config it for WebSocket
Uptime Kuma

此时需要在 Nginx 的反向代理配置文件 #Set Nginx Cache后面加入以下代码,用于开启 WebSocket:

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

img

保存后,即可正常访问服务。

img

配置 Uptime Kuma 相关设置

此时需要注册管理员账号

img

输入完成后,即可点击创建

增加网站

img

填写 显示名称 以及 URL 即可提交,如其他有需要可按需配置。

img此时即可正常监控

配置通知服务。

UPTIME KUMA支持70余种服务通知,详细名单如下:

img

img

可按需配置,推荐使用国内的 SMTP、钉钉、企业微信群机器人进行推送。

后语

Uptime Kuma 是一个非常好的开源项目,适合很多网站服务特别多的站长,特别是那些不常访问,但是又非常需要长时间运行的项目。

可以通过配合 UptimeRobot 实现国内国外双线监控。保证网站服务稳定运行。

🔲 ☆

Titles

在澳洲歌剧网站注册会员时,发现 Title 居然有 136 个。吓到了,虽然我知道这种偏门 title 有很多,但真正在一般网站见到,还是第一次;比 gender 还多。还是你们歌剧佬会装……

把这些 title 扒下来,问 AI 出了一份说明,不保证准确,就看个乐子吧:

  • Miss: 用于未婚女性的称谓。
  • Mr: 用于成年男性的称谓,通常不涉及婚姻状况。
  • Mrs: 用于已婚女性,通常后面跟着丈夫的姓氏。
  • Ms: 用于女性的称谓,不特指婚姻状况,适用于希望避免性别角色的场合。
  • Admiral: 海军的高级军官,通常指海军上将。
  • Air Chief Marshal Sir: 英国皇家空军的高级军官,通常是空军元帅,带有“Sir”的称谓表示荣誉。
  • Air Marshal: 空军的高级军官,通常在军衔上低于空军元帅。
  • Air Vice Marshal: 空军的副军官,通常在军衔上低于空军元帅和空军大将。
  • Ambassador: 大使,代表一个国家在另一个国家进行外交事务的高级官员。
  • Archbishop: 大主教,负责监督多个教区的高级神职人员。
  • Archdeacon: 教区的高级神职人员,通常负责管理教区内的事务。
  • Assoc Prof: 副教授,通常在学术界中担任教学和研究职务。
  • Assoc Prof Dr: 副教授,且拥有博士学位。
  • Aunty: 亲属称谓,通常用于称呼母亲或父亲的姐妹,或作为对女性的亲切称呼。
  • Baron: 男爵,通常是欧洲贵族体系中的一种称谓。
  • Baroness: 女男爵,女性的贵族称谓。
  • Bishop: 主教,负责管理教区的高级神职人员。
  • Brig Gen: 准将,通常是军队中的高级军官。
  • Brigadier: 准将,负责指挥一个旅或类似单位的军官。
  • Brother: 对男性修士或兄弟的称谓,通常用于宗教团体。
  • Canon: 教士,通常指在教会中担任特定职务的神职人员。
  • Captain: 队长,通常是指负责某个团队或单位的领导者。
  • Colonel: 上校,军队中的高级军官。
  • Commander: 指挥官,通常负责指挥某个单位或任务。
  • Commissioner: 委员,通常是负责特定事务或机构的高级官员。
  • Commodore: 海军的军衔,通常在海军中负责指挥多个舰艇。
  • Consul: 领事,负责在外国保护本国公民和促进商业事务的官员。
  • Councillor: 顾问,通常在地方政府中担任职务。
  • Count: 伯爵,欧洲贵族中的一种称谓。
  • Countess: 女伯爵,女性的贵族称谓。
  • Dame: 女爵士,通常是对女性的荣誉称谓。
  • Dean: 院长,通常负责管理学院或学术部门的职务。
  • Deputy Lord Mayor: 副市长,协助市长工作的官员。
  • Dr: 博士,通常指拥有博士学位的人。
  • Emeritus Professor: 名誉教授,通常是退休后仍被认可的教授。
  • Father: 神父,通常用于天主教或东正教的神职人员。
  • Federal Magistrate: 联邦法官,负责处理特定法律事务的法官。
  • First Lieutenant: 一等中尉,军队中的军衔。
  • Flt. Lt.: 飞行中尉,空军中的军衔。
  • Frau: 德语中对已婚女性的称谓,相当于“Mrs”。
  • General: 将军,军队中的高级军官。
  • Governor: 州长或省长,负责管理一个州或省的官员。
  • Her Excellency: 对女性高级官员的尊称,通常用于大使或国家元首。
  • Her Excellency Dr: 对女性博士的尊称,通常是指大使或重要官员。
  • Her Excellency Madam: 对女性高级官员的尊称。
  • Her Excellency Mrs: 对已婚女性高级官员的尊称。
  • Her Excellency Ms: 对女性高级官员的尊称,适用于不特指婚姻状况。
  • Her Excellency Prof The Hon: 对女性教授及荣誉称谓的尊称。
  • Her Excellency Professor: 对女性教授的尊称。
  • Her Excellency The Honourable: 对女性高级官员的尊称,通常用于政治职位。
  • Her Honor Judge: 对女性法官的尊称。
  • Herr: 德语中对男性的称谓,相当于“Mr”。
  • His Excellency: 对男性高级官员的尊称,通常用于大使或国家元首。
  • His Excellency Dr: 对男性博士的尊称,通常是指大使或重要官员。
  • His Excellency Gen the Hon: 对男性将军及荣誉称谓的尊称。
  • His Excellency Gen the Hon Sir: 对男性将军及骑士的尊称。
  • His Excellency Lt General: 对中将的尊称。
  • His Excellency Mr: 对男性高级官员的尊称。
  • His Excellency Professor: 对男性教授的尊称。
  • His Excellency The Hon: 对男性高级官员的尊称,通常用于政治职位。
  • His Hon Act Jus: 对法官的尊称,通常用于法律界。
  • His Hon Justice: 对法官的尊称。
  • His Honor Judge: 对男性法官的尊称。
  • Honorary Consul: 名誉领事,通常是非职业领事,负责促进国家利益。
  • Judge: 法官,负责审理案件的法律官员。
  • Justice: 司法官,通常指高级法官。
  • Lady: 对女性的尊称,通常用于贵族或有地位的女性。
  • Lieutenant: 中尉,军队中的军衔。
  • Lieutenant Colonel: 中校,军队中的军衔。
  • Lieutenant Commander: 海军中的中级军官。
  • Lieutenant General: 中将,军队中的高级军官。
  • Lord: 贵族,通常是指拥有土地或权力的男性。
  • Lord Mayor: 大城市的市长,通常是在某些国家的特定称谓。
  • Madam: 对女性的尊称,通常用于正式场合。
  • Madame: 法语中对女性的尊称,相当于“Mrs”或“Ms”。
  • Maestro: 大师,通常用于音乐领域,指优秀的指挥家或作曲家。
  • Magistrate: 地方法官,负责处理轻微案件的官员。
  • Major: 少校,军队中的军衔。
  • Major General: 少将,军队中的高级军官。
  • Marquis: 侯爵,欧洲贵族中的一种称谓。
  • Master: 小男孩或年轻男性的称谓,或指掌握某种技能的人。
  • Mayor: 市长,负责管理城市的官员。
  • Messeur: 法语中的男性称谓,相当于“Mr”。
  • Messrs: 法语中对多位男性的称谓,相当于“Messieurs”。
  • Min.: 部长,通常指政府部门的负责人。
  • Mister: 男性称谓,通常用于成年男性。
  • Mlle: 法语中对未婚女性的称谓,相当于“Miss”。
  • Mons: 法语中对男性的称谓,相当于“Mr”。
  • Mr Justice: 对法官的尊称,通常用于英国法律系统。
  • Mssrs: 对多位男性的称谓,通常用于正式场合。
  • Mx: 性别中立的称谓,适用于不愿意标明性别的人。
  • Pastor: 牧师,通常指基督教教会的领导者。
  • Premier: 总理,通常指国家或省的首席行政官。
  • Prince: 王子,通常是皇室成员。
  • Professor: 教授,大学或学院的高级教师。
  • Professor Dr: 教授且拥有博士学位的人。
  • Professor The Hon: 教授及荣誉称谓的结合。
  • Rabbi: 拉比,犹太教的宗教领袖。
  • Rear Admiral: 海军的后勤将军,通常负责海军的后勤事务。
  • Rector: 学院或大学的院长或校长。
  • Reverend: 牧师,通常用于基督教教会的神职人员。
  • Reverend Canon: 教区的高级神职人员,通常是主教的助手。
  • Reverend Dr: 拥有博士学位的神职人员。
  • Reverend Father: 天主教的神父称谓。
  • Reverend Professor: 拥有教授职称的神职人员。
  • Second Lieutenant: 二等中尉,军队中的军衔。
  • Sen Dame: 女性的贵族称谓,通常是对已婚女性的尊称。
  • Senator: 参议员,负责立法事务的官员。
  • Senator The Hon: 对获得荣誉的参议员的尊称。
  • Sergeant: 军队中的军衔,通常负责指挥士兵。
  • Signor: 意大利语中对男性的称谓,相当于“Mr”。
  • Signora: 意大利语中对女性的称谓,相当于“Mrs”或“Ms”。
  • Sir: 对男性的尊称,通常用于骑士或有地位的人。
  • Sister: 对女性修女或姐妹的称谓,通常用于宗教团体。
  • Superintendant: 监督者,通常负责管理某个机构或部门。
  • Superintendent: 负责管理学校或其他机构的官员。
  • The Hon: 对获得荣誉的人的尊称,通常用于政治职位。
  • The Hon Dr: 对获得荣誉的博士的称谓。
  • The Hon Justice: 对获得荣誉的法官的称谓。
  • The Hon Mr: 对获得荣誉的男性的称谓。
  • The Hon Mr Justice: 对获得荣誉的法官的称谓。
  • The Hon Mrs: 对获得荣誉的已婚女性的称谓。
  • The Hon Senator: 对获得荣誉的参议员的称谓。
  • The Hon. Dr: 对获得荣誉的博士的称谓。
  • The Honorable Sir: 对获得荣誉的骑士的称谓。
  • The Honourable: 对获得荣誉的人的尊称,通常用于政治职位。
  • The Honourable Dame: 对获得荣誉的女爵士的称谓。
  • The Rev: 牧师的缩写。
  • The Rt Hon: 对获得荣誉的人的尊称,通常用于政治职位。
  • The Rt Hon Baroness: 对获得荣誉的女男爵的称谓。
  • The Rt Hon The Lord: 对获得荣誉的男爵的称谓。
  • The Rt Rev: 对主教的尊称。
  • The Very Reverend Dr: 对高级神职人员的尊称,通常是拥有博士学位的牧师。
  • Uncle: 亲属称谓,通常用于称呼父母的兄弟。
  • Vice Adm: 海军的副上将,通常是负责海军的高级军官。

🔲 ☆

GPTs 对比:如何挑选最适合的,找到适合自己的 GPTs

GPTs 可以称为由“角色定制版 ChatGPT” 或 “角色专属 GPT 聊天机器人”。这些 ChatGPT 根据特定的角色或主题进行了优化,以提供更加贴合该角色的交互体验。有赖于广大网友的创建,据不完全统计,已经有超过百万级别甚至过千万级别的 GPTs 被打造出来。本篇文章就来带领大家找到适合自己的 GPTs……
🔲 ⭐

重新开始 - 所以我尝试了一下 Hugo

在疯狂的摆烂 n 年后,某个人终于想起来他还有个博客。经过好几分钟的思想斗争之后,他决定好好折腾它,以 Linux 为抓手,通过 Hugo 和 nginx 深度共建,对标 Hexo,打通原 Blog 与 Simple 之间的垂直领域屏障,实现多维矩阵闭环,为个人博客赋能(确信)。

Why

Why rebuild it?

相较重建而言,我个人感觉更应该称之为重启。

这个博客建立至今其主人都没好好写过几篇文。

更多意义上来,我更希望能写写一些有意思的东西,所以就重启了。

Why choose Hugo?

我使用 Hexo 驱动博客已经三年之久了,之前写过一个开源的 Hexo 主题(虽然没几个月就 make it Archived 了)。

Hexo 对我而言过于臃肿,每次部署都要抓取不少 NPM Package,并且主题依赖的 node-sass 安装依赖 python2,对于现代的发行版而言 python2 基本已经被弃用,甚至完全被移除。

反观 Hugo,作为 golang 编写的静态网站生成器,standalone 足够简单,并且基本满足我只需要关注于文本本身的要求。

So we start with Hugo

简单的配置 Hugo

我使用了 hugo-theme-stack 作为主题。

1
2
git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/stack
echo "theme = 'stack'" >> ./config/_default/config.toml

然后使用 DisqusJS 作为评论的实现方案。

1
2
3
4
5
6
7
# config/_default/params.toml
[comments.disqusjs]
shortname = "secret"
apiUrl = "https://disqus.skk.moe/disqus/"
apiKey = "secret"
admin = "real186526"
adminLabel = "Admin"

作为 RSS 用户,Hugo 默认内嵌的 RSS 实现根本不够看。我在这里使用了 hugo-atom-feed 来实现了 Atom。

1
2
hugo mod init github.com/186526/blog.186526.xyz
hugo mod get -u github.com/kaushalmodi/hugo-atom-feed
1
2
3
4
5
6
7
8
## ./config/_default/module.toml
[imports]
path = "github.com/kaushalmodi/hugo-atom-feed"

## ./config/_default/outputs.toml
home = ["HTML", "RSS", "ATOM"]
section = ["HTML", "RSS", "ATOM"]
taxonomy = ["HTML", "RSS", "ATOM"]

Atom 文件默认位于 /atom.xml 下。

🔲 ☆

为什么我选择用回了Valine?

熟悉我的小伙伴应该知道,我的网站的评论系统经历了几次更换,最开始我用的是Gitalk,但是因为要登录Github账户,而且不是所有人都有Github账户,所以就更换了

后面用上了Valine,Valine用得很舒服,yysy,配置好Valine-Admin后基本上可以撒手不管了,但是后来Valine停止更新了,就想着去用下Waline

Waline用了没多久,发现这东西后端一直连接不上,然后就又更换了

最后换成了Twikoo,这个东西跟Waline一样是要用MongoDB的,所以直接把Waline的MongoDB给它用,没一会就搞定了

你以为到这里就这么简单了嘛?如果真的是的话我就不会发这篇文来吐槽了

Twikoo Vercel部署无法发邮件

最开始我是部署在Vercel上面的,这种方式就是很方便,因为Vercel本来就是一个很便捷的平台,没有很多繁琐的操作,再说,Twikoo支持一键部署,所以就部署在了Vercel里面

用了两周以后发现一个很大的问题:Vercel链接微软服务器会超时!我的域名邮箱是在Office365上面的,自然邮件提醒功能就要链接微软的服务,然后Vercel使用邮件提醒的时候,就会超过Vercel规定的10秒上限,导致函数运行直接超时,然后发不出邮件

幸好,Twikoo不只是能够在Vercel部署,我又把目光投向了Zeabur这个平台

Twikoo Zeabur部署 数据丢失事件

我不能说Zeabur不好用,他确实很好用,非常好用,几乎完美解决了我的容器需求,但是凡事都有个但是,Zeabur在2023年七月初上线了签到延长使用期限的功能,也就是说如果我不签到,我的应用会自动被停机

我在Zeabur部署Twikoo的时候,那还是Zeabur平台的早期,当时的设定是MongoDB会部署在Twikoo容器的内部,这就导致了但凡Twikoo进行了一次重启,所有的数据都会丢失

很不幸,我的数据正是在这种情况下丢失了,一点都没有剩下。幸好,在我之前部署Vercel的Twikoo的时候,里面的MongoDB的数据是还在的,尽管它不是最全的,但是能恢复一部分已经是很不错的事情了

或许你会问我:现在Zeabur的付费机制可以绑定支付宝,为什么不用呢?我只能说数据丢了一次以后,我在想尽各种办法来避免这种情况,所以目前Zeabur不在考虑范围内

Twikoo Render部署 程序底层导致的无法发送邮件

当我把Zeabur上的应用迁移,特别是Valora迁移的时候,我尝试找一个能够连续不断跑容器的平台,最后选择了Render这家,它可以在新加坡部署容器,且一个月有750小时的运行时间,完全够一个容器跑一个月的了,所以我也把Twikoo丢到了这个地方

当我搬上去以后,进行了一系列的配置,然后再次尝试邮件的时候,发现还是发不了,这不是配置上的问题,就是Twikoo发不出去

发现了以后,我又尝试用了Valine-Admin来发送

重新接入Valine

放弃使用Valine其实还有一个原因,就是Leancloud的国际版禁止国内IP访问了(业务域名和自带的引擎域名),我是搬到了国内版去用的,但是国内版要求备案,搞得我很烦(后来找了代备案搞定的)

这次重新接入Valine,我选用的是国际版,国际版之前的数据我都没删掉,就是换用Twikoo以后的新增数据没有了,这个没办法,最后就只要解决国内不能访问业务域名的问题就可以了

这里我用了Vercel作为反代,然后把serverURL设置为了我的反代域名,才解决了国内访问不了的问题

测试Valine邮件

我重新部署了一次Valine-Admin,来避免一些遗留下来的问题,部署完成后,在我的网站匿名发送了一条测试评论,邮件顺利送达

最后我恢复了Valine的使用,尽管它现在已经不更新了,但是它能够满足我的基本需求,所以我还是选用它

FIN

最后我改了一下我导出的MongoDB的数据,发现可以被Valine正常识别,只需要修改一下数据的类型就可以正常被导入了

导入以后发现……这个邮件它以前没发的全给我发了

对不起对不起对不起!!!我没想到它会自己发出去

加更:Twikoo合并入Valine并去重

就像我上面说的,我的Valine数据是导入进去过Twikoo的,现在Twikoo导出的数据是json(用管理面板里面的那个导出),直接导入Leancloud是没问题的,但是珲面临下面的问题:

  • 时间格式不正确:Twikoo的时间格式是时间戳,而Valine用的是Leancloud的Date类型
  • Twikoo无用数据较多,uidmastertop什么的标记需要去除
  • 去重!去重!还是去重!

经过我在火车上的一小时奋战,我终于弄出了这个脚本(Twikoo导入Leancloud后在Leancloud导出数据库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import json
from datetime import datetime


def timestamp_to_iso8601(timestamp):
# Convert timestamp to a datetime object
try:
dt_object = datetime.fromtimestamp(int(timestamp) / 1000)
except TypeError:
return timestamp

# Format the datetime object to ISO 8601 format
iso8601_format = dt_object.strftime('%Y-%m-%dT%H:%M:%S.%fZ')

return iso8601_format


with open('comment.0.jsonl', 'rt', encoding='utf8') as f:
lines = f.readlines()


def write_data(data):
with open('Comment.json', 'wt+', encoding='utf8') as f:
f.write(data)


exist_data = []
finaldata = []
# write_data('#filetype:JSON-streaming {"type":"Class","class":"Comment"}\n')
for line in lines:
if line.startswith('#'):
continue
data = json.loads(line)
if {"nick": data.get('nick'), "link": data.get('link'), 'comment': data.get('comment')} in exist_data: continue
if data.get('created'):
data['insertedAt'] = {"__type":"Date","iso":timestamp_to_iso8601(data.get('created'))} # Valine的时间索引
data['createdAt'] = timestamp_to_iso8601(data.get('created')) # Leancloud自带
data['updatedAt'] = timestamp_to_iso8601(data.get('created')) # Leancloud自带
if data.get('top'):
del data['top']
if data.get('master'):
del data['master']
if data.get('uid'):
del data['uid']
if data.get('created'):
del data['created']
if data.get('mailMd5'):
del data['mailMd5']
finaldata.append(data)
exist_data.append({
"nick": data.get('nick'), "link": data.get('link'), 'comment': data.get('comment')
})

write_data(json.dumps(finaldata, indent=4))
print(len(finaldata))

print('done')

运行完后在Leancloud导入Comment.json文件后,就完成了!

❌