阅读视图

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

Lofi - 极简、纯粹、黑白风格的 Hexo 博客主题

好久没写博客了,各位好久不见。这一年真的有好多话想说,期待我今年的午马年度总结吧,把今年一年的事情,都和大家聊一聊。

原本的博客程序,使用的是我毕业论文开发的 DaRM,现在回过头来看,当年这个项目写的跟屎一样,我已经彻底的放弃维护这个项目,转投 Hexo 的阵营了。

好久没写博客,希望带来点变化,花了半天时间写出来这个主题,总体来说还是比较满意的,别的没什么话说,希望2026年,能对我好一些。

一个新的主题新的主题,希望能带来新的开始。

Lofi

极简、纯粹、黑白风格的 Hexo 博客主题。

A minimalist, black & white theme for Hexo.

项目地址:Lofi

介绍 (Introduction)

Lofi 是一款专为专注于写作的人设计的 Hexo 主题。它剥离了所有不必要的装饰,只保留最核心的阅读体验。

核心特点:

  • 极简黑白设计:经典的报纸风格,耐看且不干扰阅读。
  • 超快加载:体积小巧,没有复杂的动画和沉重的库。
  • 响应式布局:在手机、平板和电脑上都有完美的阅读体验。
  • PJAX 支持:页面切换无刷新,体验丝般顺滑。
  • 评论系统:内置 Artalk 评论系统支持(自托管的隐私友好评论系统)。
  • 站内搜索:原生支持本地搜索功能。

安装指南 (Installation)

就像给手机换壁纸一样简单,只需三步即可使用。

第一步:下载主题

进入你的 Hexo 博客目录,打开终端(命令行),运行以下命令:

1
git clone https://github.com/spatiostu/lofi.git themes/lofi

或者,你也可以点击 Lofi 进入仓库,直接点击右上角的 Code -> Download ZIP,下载后解压,把文件夹改名为 lofi,然后放入博客的 themes 目录下。

第二步:启用主题

打开博客根目录下的 _config.yml 文件(不是主题目录下的那个),找到 theme 这一行,修改为:

1
theme: lofi

第三步:安装必要插件

为了让主题的搜索和渲染功能正常工作,你需要安装几个小插件。在博客根目录下运行:

1
npm install hexo-renderer-ejs hexo-generator-searchdb --save

配置指南 (Configuration)

主题的配置文件位于 themes/lofi/_config.yml。你可以根据需要修改它。

1. 菜单设置 (Menu)

设置导航栏的链接。

1
2
3
4
5
menu:
首页: /
归档: /archives
友链: /friends
关于: /about

需在source目录下创建两个页面文档:about/index.mdfriends/index.md。每个文档的内容可以自定义,例如:

1
2
3
4
5
6
7
8
9
10
---
title: 友情链接
date: 2024-03-20 12:00:00
type: friends
---
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<a href="https://www.FriendDomain.com/" target="_blank" class="friend-card">
<div class="font-bold text-lg mb-2">FriendName</div>
<div class="text-xs font-mono opacity-60">FriendDescription</div>
</a>

2. 个人信息 (Profile)

设置你的头像和社交媒体链接。

1
2
3
4
5
avatar: /images/avatar.jpg  # 头像路径
favicon: /images/favicon.png # 网站图标
description: "这里写一句你的座右铭"
social:
github: https://github.com/yourname

3. 评论系统 (Comments)

本主题内置了 Artalk 评论系统。如果你部署了 Artalk Server,可以在这里配置:

1
2
3
4
artalk:
enable: true
server: 'https://your-artalk-server.com'
site: '你的站点名称'

如果不需要评论功能,将 enable 改为 false 即可。

4. 底部信息 (Footer)

自定义页面底部的版权信息。

1
2
footer:
copyright: "© 2025 你的名字"

5. CDN 配置

为了加速主题静态资源加载,你可以配置 CDN。

1
2
3
cdn:
enable: true
url: https://res.your-domain.com/

如不需要 CDN 加速,将 enable 改为 false 即可。


如果有什么功能需求,也可以在评论区留言一下,如果是不错的提议,我会给主题加上!

🔲 ☆

Cusdis - 轻量、保护隐私、开源的 Disqus 评论系统替代方案

由于之前将博客全静态化了导致评论无法使用,原本是不打算做的,但是还是又挺多朋友通过各种各样的渠道联系我交流问题,故打算解决一下这个问题,方便后续交流。

我的解决方案是能自建就自建,无法自建的基本上就不考虑了。Disqus 不能自建,加之实际使用起来效果并不理想,隐私问题,还有界面不太喜欢就直接被我 Pass 掉了。

相交于 Disqus,Commento++也是不错的解决方案,但是界面不太喜欢,以及不够轻量,故没有选择,综合来考虑来看,Cusdis是非常不错的解决方案,足够轻量、支持自建、UI简洁,致使我最终选择了 Cusdis。

此处介绍两种方式 Docker、手工部署 Cusdis,均基于宝塔面板。


项目介绍

项目地址:Cusdis

Cusdis是Disqus的开源、轻量级(约5kb gzip)、隐私友好的绝佳替代品,主要用于纯静态化网站。

Cusdis 并非旨在成为 Disqus 的完整替代品。它的目的是为小型网站(例如您的静态博客)实现一个极简主义和可嵌入的评论系统。

官方文档:Cusdis Docs

特性

  • Cusdis 是开源的并且可以自我托管。因此,您拥有自己的数据。
  • SDK 是轻量级的(~5kb gzipped)。
  • Cusdis 不需要您的用户登录即可发表评论。
  • Cusdis 根本不使用 cookie。

缺点:

  • Cusdis 正处于其开发的早期阶段。
  • 没有垃圾邮件过滤器,因此,您必须手动审核您的评论部分,并且在您批准之前不会显示评论。

其UI简洁、支持自托管、支持邮件推送,在邮件内即可进行批准以及回复是我比较看重的功能。


环境配置

由于 Cusdis 基于Node.js 开发,采用 SQLite 或 MySQL 或 Postgresql 数据库存储数据,所以配置要求如下:

  • 系统上需要安装 Node.js 和 yarn
  • 服务器上安装了 MySQL 或 Postgresql

本文基于宝塔面板,使用 SQLite 进行安装

安装配置 Node.js

如您已安装 Node.js 和yarn 并且配置成功,则此步可以跳过。

安装 Node.js 命令如下

1
2
3
4
5
6
cd /www/server/nodejs
#国外服务器选择
wget https://nodejs.org/dist/v14.15.0/node-v14.15.0-linux-x64.tar.gz
#国内服务器选择
wget https://registry.npmmirror.com/-/binary/node/v14.15.0/node-v14.15.0-linux-x64.tar.gz
tar -zvxf node-v14.15.0-linux-x64.tar.gz

设置 Node.js 全局变量:

在宝塔面板打开 /etc/profile 文件,将以下配置输入文件最后面,并保存

1
2
export NODE_HOME=/www/server/nodejs/node-v14.15.0-linux-x64
export PATH=$NODE_HOME/bin:$PATH

输入以下命令用于重载全局配置。

1
source /etc/profile

输入 node -v 和 npm -v 返回以下信息即配置完成

img配置成功

安装 yarn

1
npm install -g yarn

查看版本信息,如遇 yarn:未找到命令,请看:《NodeJS 和 npm 配置全局变量

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

部署 Cusdis

此处介绍两种方式部署,手动部署与使用Dokcer

手动部署

一、克隆仓库

1
2
cd /www/wwwroot
git clone https://github.com/djyde/cusdis.git

img

二、安装 Cusdis 所需依赖

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

1
2
cd cusdis
yarn install

img

三、配置 .env 文件

在 cusdis 文件夹中新建一个名为 .env 的文件

img

文件具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
USERNAME=admin
PASSWORD=password
JWT_SECRET=ofcourseistillloveyou
NEXTAUTH_URL=http://IP_ADDRESS_OR_DOMAIN
HOST=http://IP_ADDRESS_OR_DOMAIN
DB_TYPE=sqlite
DB_URL=file:./data.db
#以下配置为 EMAIL 配置 可选
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=your gmail email
SMTP_PASSWORD=<app password>
SMTP_SENDER=your gmail email

其中

为用户名
1
2
3
4
5
6
7
8
9
10
PASSWORD 为密码
JWT_SECRET 为 JWT 令牌
NEXTAUTH_URL 与 HOST 需要填写项目所用的域名/IP
DB_TYPE、DB_URL 为 数据库类型、数据地址
SMTP_HOST 为 SMTP 主机
SMTP_USER 为 SMTP 用户名
SMTP_PASSWORD 为 SMTP 密码
SMTP_SENDER 为发件人电子邮件地址
SMTP_PORT 为 SMTP 端口 默认为 587
SMTP_SECURE 为是否启用 SMTP 安全,默认值为true

img

四、构建 Cusdis

1
yarn run build:without-migrate

img

这一步可能会出现错误,错误代码如下:

1
2
3
4
5
6
7
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! cusdis@ db:generate: `prisma generate --schema ./prisma/$DB_TYPE/schema.prisma`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the cusdis@ db:generate script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

这一步需要到 ./cusdis/prisma 选择需要设置的数据库类型,然后将该文件夹内的 schema.prisma 文件 复制到 ./cusdis/prisma 构建即可解决。

五、运行 Cusdis

1
yarn run start:with-migrate

img

设置程序守护,此处以systemd为例

打开目录 /usr/lib/systemd/system/

新建文件:cusdis.service

文件配置如下(以下配置仅供参考):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=CusdisServer

[Unit]
Description=CusdisServer

[Service]
ExecStart=/www/server/nodejs/node-v14.15.0-linux-x64/bin/npm start
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin:/www/server/nodejs/node-v14.15.0-linux-x64/bin
Environment=NODE_ENV=production
WorkingDirectory=/www/wwwroot/cusdis/

[Install]
WantedBy=multi-user.target

此时保存即可,运行:

1
2
3
4
5
6
# 更新配置
systemctl daemon-reload
# 启动服务
systemctl start cusdis
# 设置开机启动
systemctl enable cusdis

详细的管理命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 启动服务
systemctl start cusdis
# 设置开机启动
systemctl enable cusdis
# 停止服务
systemctl stop cusdis
# 重启服务
systemctl restart cusdis
# 查看状态
systemctl status cusdis
# 更新配置
systemctl daemon-reload

Docker部署

一、获取镜像

镜像名如下:

1
djyde/cusdis

img

国内服务器获取镜像会极慢,请耐心等待。

二、创建容器

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
配置如下:
容器端口:3000
容器目录:/data
环境变量:
-e USERNAME=admin \
-e PASSWORD=password \
-e JWT_SECRET=ofcourseistillloveyou \
-e DB_URL=file:/data/db.sqlite \
-e NEXTAUTH_URL=http://IP_ADDRESS_OR_DOMAIN \
其中
USERNAME 为用户名
PASSWORD 为密码
JWT_SECRET 为 JWT 令牌
NEXTAUTH_URL 需要填写项目所用的域名/IP
DB_TYPE、DB_URL 为 数据库类型、数据地址

#以下配置为 EMAIL 配置 可选
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=your gmail email
SMTP_PASSWORD=<app password>
SMTP_SENDER=your gmail email

img

启动完成。

后语

设置反向代理

宝塔新建站点 -> 打开SSL - > 反向代理 ->添加反向代理

目标 URL 填写:http://127.0.0.1:3000

img

img

配置站点

进入页面登陆,然后创建一个默认的网站,选择 Embed Code ,复制代码到网站的合适位置即可。

img

WordPress 配置

以下配置仅供参考,主要包括 data-page-id、data-page-url、data-page-title

1
2
3
data-page-id="<?php the_ID(); ?>"
data-page-url="<?php $id =get_the_ID();echo get_permalink($id); ?>"
data-page-title="<?php the_title(); ?>"

跨域问题

最开始使用的时候可能会出现跨域问题。

在反向代理的配置文件中添加:

1
add_header 'Access-Control-Allow-Origin' 'yousitedomain';

两种方法,更推荐 DOCKER 如选择手工安装,可能会遇到各种各样的问题。

🔲 ☆

使用 acme.sh 签发通配符 SSL 证书

看了很多使用 acme.sh 签发 通配符 SSL 的教程,但讲的比较笼统,所以打算写个详细教程记录一下。

此处以 ZeroSSL 为例,acme.sh也可签发其他证书,可自行研究。

不同品牌证书之间优劣不在此赘述。

2024-08-18更新:增加安装证书以及自动续期。


部署 ACME.SH

下载 acme.sh

1
curl  https://get.acme.sh | sh

img

创建文件链接

1
alias acme.sh=~/.acme.sh/acme.sh

img

切换证书为 ZeroSSL

1
2
3
acme.sh --set-default-ca --server zerossl
#国内服务器推荐 letsencrypt
acme.sh --set-default-ca --server letsencrypt

img

获取zeroSSL eab

打开 https://app.zerossl.com/developer

注册账号并登录,打开页面后点击 Generate

img

绑定邮箱,输入你注册使用的邮箱

1
acme.sh --register-account -m YourEmail

img

获取 EAB KID 和 EAB HMAC Key 并且按格式填写

1
2
3
acme.sh  --register-account  --server zerossl \
--eab-kid EAB KID \
--eab-hmac-key EAB HMAC Key

img

获取DNSPOD API

这里是通过自动 DNS 解析来进行 DNS 验证,也可选择文件验证,但推荐自动验证。

此处以 DNSPOD为例,其他运营商操作类似。

打开 https://console.dnspod.cn/account/token/token 获取 ID/KEY

img

配置DNSPOD API

1
2
export DP_Id="YourID"
export DP_Key="YourKey"

img

自动签发通配符

1
acme.sh --issue --dns dns_dp -d *.domain.com -d domain.com --keylength ec-256

img

img

此时证书签发成功,绿色的部分为证书的存储路径,部署在服务器即可。

fullchain.cer 是证书内容,xxx.key 是证书的私钥。

安装证书及自动续期

在 shell 命令行输入以下命令

1
2
3
4
acme.sh --install-cert -d *.domain.com -d domain.com  --ecc \
--key-file /cert/domain.com/privkey.pem \
--fullchain-file /cert/domain.com/fullchain.pem \
--reloadcmd "service nginx force-reload"

其中具体的目录以及域名需要手动修改。

后语

步骤可能有错误,希望大家斧正。

🔲 ☆

myTinyTodo - 简洁、高效、功能强大的开源待办程序

曾经有段时间,事情很多,每天早上起来都不知道何从下手,以致越忙越乱。很多不该搞杂的事情让我给搞砸了。

后来养成了把东西写下来的习惯、但是这样不够方便、也不能随时想看就看,也是非常苦恼的。

现在市面上很多待办程序,无论是 微软待办 还是其他的待办程序,都比较臃肿。

最主要是数据全部不在自己手中,这是我无法接受的。


项目简介

项目官网:myTinyTodo

该项目基于 PHP(54-74) 和 jQuery开发。支持 SQLite 以及 MySQL

特性

  • 多个任务列表
  • 支持标签
  • 设置截止时间
  • 设置任务优先级
  • 密码保护
  • 不同的排序,包括拖放排序

你如果也有类似的苦恼,个人感觉这个项目可以解决这部分问题。

配置 myTinyTodo

一、打开网站下载程序。

img

二、新建网站并且将下载下来的文件上传到站点目录并解压

img

三、打开以下地址运行安装程序

1
http(s):// youdomain /setup.php

此时需要选择使用的数据库,这里目前有个问题,暂时不了解作者所设计的 MySQL数据库 的逻辑,但导入数据无法备份恢复数据。

总而言之一句话,不要使用 MySQL 请选择 SQLite

img

点击 install 进行安装

img

安装完成,请删除目录下的 setup.php

img

四、设置

设置其中只讲一点,有关于 会话处理机制(Session handling mechanism)请选择 PHP,否则会出现意想不到的错误。

img

此时即可开始设置使用。

后语

有关程序的升级:保留程序目录的 DB 目录以及其中文件,其他目录以及文件直接用新目录覆盖即可。

这也是我目前所使用的一款 todo 程序,如果使用得当,可以大大提高生活以及学习效率。

🔲 ☆

LskyPro2 - 拓展、UI、性能俱佳的开源图床程序

现在由于服务器带宽太小,为了节省带宽资源,已经很多站点都在使用图床。

很多人都在使用如 WeiBo、Gitee 此类平台为图床,由于使用人数、成本增加过高,这些平台也相继开启了防盗链。现在绝大多数都无法再作为图床使用。

此时如果选择自建图床,配合诸如 百度云/又拍云 此类拥有免费额度的 CDN 还是非常不错的。

曾经也有计划构思过做开放的免费图床,但是许多程序的性能还有UI设计大多不太满意,还有成本原因所以没有开放,一直都是自用。

前段时间发现 Lsky Pro 更新了 2.0 版本,以前用过 1.0 的版本但是整体UI不太满意,但是看了 2.0 的版本,UI还有性能也非常满意,借着这个机会做了免费的图床:PUBLIC IMAGE SERVICE 有需要的朋友可以看一下。


项目简介

项目地址:Lsky Pro

文档地址:Lsky Pro Docs

特性

  • 支持本地等多种第三方云储存 AWS S3、阿里云 OSS、腾讯云 COS、七牛云、又拍云、SFTP、FTP、WebDav、Minio
  • 多种数据库驱动支持,MySQL 5.7+、PostgreSQL 9.6+、SQLite 3.8.8+、SQL Server 2017+
  • 支持配置使用多种缓存驱动,Memcached、Redis、DynamoDB、等其他关系型数据库,默认以文件的方式缓存
  • 支持图片水印、文字水印、水印平铺、设置水印位置、X/y 轴偏移量设置、旋转角度等
  • 支持通过接口上传、管理图片、管理相册
  • 支持在线增量更新、跨版本更新

环境需求

  • PHP >= 8.0.2
  • PHP 拓展:BCMath、Ctype、DOMFileinfo、JSON、Mbstring、OpenSSL、PDO 、Tokenizer、XML、Imagick
  • PHP 函数:exec、shell_exec、readlink、symlink、putenv、getenv

配置 Lsky Pro

本教程基于宝塔进行。

下载安装包

打开 Lsky Pro releases 选择最新版本下载。注:请不要下载 Source code

img

新建站点,将安装包上传到网站目录并解压

img

创建数据库

在宝塔面板左侧选择 数据库->添加数据库 输入相关信息即可提交

img

设置网站相关配置

关闭 放跨站攻击、修改网站运行目录:打开站点设置->站点目录,把 防跨站攻击(open_basedir) 前面勾取消,运行目录选择 /public

img

设置站点伪静态:选择 伪静态,输入以下伪静态规则,然后保存:

1
2
3
location / {
try_files $uri $uri/ /index.php?$query_string;
}

img

配置 SSL,PHP 版本切换为 8.0

img

运行环境配置

打开 PHP 设置,配置相关运行环境,由于宝塔默认已经安装了部分相关拓展,开启了部分相关函数,仅需配置以下函数、拓展即可

  • 安装拓展:fileinfo、imagemagick
  • 开启函数:readlink、symlink、putenv、exec、shell_exec、chown

执行程序安装

打开绑定的域名,程序会自动检测运行环境是否合格

img

点击下一步,然后输入数据库以及站点相关信息即会自动安装

img

至此安装完成

后语

站点目前支持三种鉴黄方式:腾讯云、阿里云、NsfwJs,关于 NSFW API 的安装可以点击链接查看教程。

有关CDN配置可以参考有关这篇 文章

有关站点配置等相关信息,或其他高阶操作可查看官方文档。

🔲 ☆

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 实现国内国外双线监控。保证网站服务稳定运行。

🔲 ☆

NSFW API - 开源的图片鉴黄API

前段时间看到 lskypro 升级到了2.0的版本,所以就想服务器闲着也是闲着,不如搭建个图床,造福大家。由于是开放注册,肯定会有坏东西捣乱,无法去筛选每个图片,就想到了去依靠第三方的图片审查服务。

但是目前 lskypro 2.0 支持的图片审查服务不多仅有三种:腾讯、阿里、NsfwJS,前面两个收费的服务价格实在是。。。。。。。不是我能负担的起的,所以便选择了自建 NsfwJS,来降低成本。

Lsky pro 官方群里的大佬们分享了一个项目,使用 Docker封装 部署和使用起来十分方便,输出的 json 格式和 Lsky pro 所有要的完全吻合,所以今天分享出来。

NSFWJS项目地址:NSFWJS

上面的项目地址并非本次所需的项目地址,有能力的大佬可以研究下。

2023年2月18日更新:在迁移服务器的途中,发现原作者的新版镜像是无法直接通过Lsky Pro去调用的。所以将可以用的镜像版本上传到了 Docker Hub。


项目介绍

项目地址:NSFW-API

项目仅支持 PNG JPG文件!!!!!!!

请求示例:

1
2
POST /classify HTTP/1.1
Content-Type: multipart/form-data

应在 image 字段中提供图片数据

响应示例:

1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Content-Type: application/json
{
"porn": 0.59248286485672,
"sexy": 0.39802199602127075,
"hentai": 0.006243097595870495,
"neutral": 0.0031403270550072193,
"drawing": 0.00011181648733327165
}

部署 NSFW-API

本教程基于 宝塔面板搭建,相应命令请自行转换

获取镜像

在宝塔的 Docker 管理面板中选择 公网库 官方库 输入以下仓库地址获取镜像:

1
2
3
ghcr.io/arnidan/nsfw-api:latest
#上面的镜像已经不能再配合LskyPro进行使用,请使用下面的。
roywangdev/nsfw-api:latest

img

由于镜像比较大,而且托管于 Github,国内服务器获取起来比较缓慢,请耐心等待。

部署镜像

选择镜像,将容器的 3000 端口映射出即可。

img

此时提交即可。

设置反代

此时调用以下地址即可调用API

1
http(s)://IP:port/classify

使用IP+端口的组合肯定不够方便,那就需要反代

新建网站开启HTTPS等操作不再演示,具体配置如下:

1
2
代理名称:自定义
代理地址:http://127.0.0.1:自定义的服务器端口

img

点击提交即可反代成功

测试

此处以 Lsky pro调用进行测试

在后台填写 API地址如下:

img切记一定要在域名后面加上 /classify

img

后语

按照 NSFWJS 官方的说法,准确率可以到达 93%,如果调用至商用项目请慎重考虑,如用于公益图床,请不定时审查图片。

🔲 ☆

ForsakenMail - 搭建临时邮箱

NPM安装转载自 MOERATS.COM

Forsaken Mail是一个临时邮箱系统,可以接受任何邮件,既收即毁。而且支持自定义邮箱地址前缀,提供了两种安装教程,选择一种即可


环境配置

1、VPS需要打开25端口,如果默认没有开启,可联系主机商开启(部分云服务商不支持开启25号端口)

2、域名解析,如果你想要邮箱地址后缀为 xxx@xx.xx的话,则需要设置XX.XX为MX记录,具体解析记录如下:

1
2
3
4
#MX记录
XX.XX MX 10 mx.xx.xx
#A记录
mx.xx.com A 服务器IP

部署 Forsaken Mail

项目开源地址:Forsaken Mail

NPM 部署

1
2
3
4
5
6
#Debian/Ubuntu系统
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs git screen
#Centos系统
curl -sL https://rpm.nodesource.com/setup_10.x | bash –
yum install nodejs git screen -y

安装ForSaken Mail

1
2
3
4
5
6
7
git clone https://github.com/denghongcai/forsaken-mail.git
cd forsaken-mail
#安装Forsaken Mail
npm install
#后台运行Forsaken Mail
screen -S forsakenmail
npm start

最后按Ctrl+A,再按D键返回主界面,然后打开http//mx.xx.com:3000就可以查看Forsaken Mail邮箱界面了,如果你打不开界面,可能还需要开启防火墙端口,如何打开端口这里不再细讲

Docker 部署

这里Docker的安装方式使用宝塔进行演示

打开宝塔面板,找到Docker管理器并进行安装

img

获取Forsake Mail镜像

设置再点击镜像管理获取镜像,选择官方库输入:denghongcai/forsaken-mail 点击获取镜像即可

img

点击创建容器,选择镜像,然后设置端口映射,在此之前一定要在宝塔开放此端口其他设置默认即可

img

此时 输入IP:3000即可打开临时邮箱系统了

img

测试:

img发送邮件成功

设置反代

如果直接用IP来收发邮件未免有点太麻烦,要设置一个域名来作为后缀(直接将域名解析到服务器IP即可),使用宝塔进行反代就非常简单了

img

提交即可

img

测试

img

后语

接收邮件时必须打开网页,否则会接收失败! 如果需要更改项目打开端口,在项目的 bin 目录的 www 文件,以文本打开修改端口后重启服务器即可 如需修改首页在项目 public 文件夹的 index.html 的文件中修改代码即可

🔲 ☆

Umami - 自建网站访问量统计系统

由于站点较多,而且为了保护隐私,比较抵触使用 CNZZ 或 GOOGLE 等第三方的访问量统计系统。最近发现了一个统计网站访问量的工具。也使用了一段时间,现在将搭建教程分享出来:


项目介绍

项目地址:Umami

UMAMI 基于Node.js 开发,并且支持 MySQL 或 Postgresql 等数据库存储方式,可以将数据掌握在自己手中。并且 UMAMI 还提供了非常详细的流量分析可视化的界面,UI 体验以及统计准确度十分不错(此处所讲统计精准度为实际真是访客的访问量,有可能一天只有1-2请做好心理准备。)

官方文档:Umami Docs

环境需求

由于 Umami 基于Node.js 开发,采用 MySQL 或 Postgresql 数据库存储数据,所以配置要求如下:

  • Node.js 14.18 或更高的版本
  • 服务器上安装了 MySQL 5.7 或以上 或 Postgresql 12.14 或以上

2022-7-22 更新:今天更新 umami 时,发现更换了 umami 构建安装方式,遂更新一波,可能配图不正确,但步骤基本一致。

2023-5-3更新:更新了一下 Node.js 的版本,以及文章上的一些错误。

2023-8-21更新:程序守护更改为 PM2 管理,进而放弃 systemctl ,其在我这次将服务迁移到国内服务器内出现了很大的问题,以及文章上的一些错误。

2024-2-8更新:更新了Node.js 的版本,以及文章上的一些错误。


环境配置

本文基于宝塔面板,使用 MySQL 进行安装

安装配置 Node.js

此处 MySQL 安装方式此处不再进行演示,如您已安装 Node.js 并且配置成功,则此步可以跳过。

安装 Node.js 命令如下

1
2
3
cd /www/server/nodejs
wget https://nodejs.org/dist/v21.6.0/node-v21.6.0-linux-x64.tar.gz
tar -xzvf node-v21.6.0-linux-x64.tar.gz

设置 Node.js 全局变量:

在宝塔面板打开 /etc/profile 文件,将以下配置输入文件最后面,并保存

1
2
export NODE_HOME=/www/server/nodejs/node-v21.6.0-linux-x64
export PATH=$NODE_HOME/bin:$PATH

输入以下命令用于重载全局配置。

1
source /etc/profile

输入 node -v 和 npm -v 返回以下信息即配置完成

img

配置成功

安装 Yarn

1
npm install -g yarn

查看版本信息,如遇 yarn:未找到命令,请看:《NodeJS 和 npm 配置全局变量

img

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

部署 Umami

克隆仓库

1
2
cd /www/wwwroot
git clone https://github.com/umami-software/umami

img

安装依赖

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

1
2
cd umami
yarn install

img

依赖安装完成

配置数据库

创建数据库:打开宝塔面板,点击左侧 数据库->添加数据库。输入数据库相关信息即可。

img

配置 .env 文件

在 umami 文件夹中新建一个名为 .env 的文件

img

文件具体配置如下:

1
2
DATABASE_URL=mysql://用户名:密码@localhost:3306/库名
HASH_SALT=roywang (加密字符 随机即可)

img

配置示例

构建 Umami

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

1
yarn build

img

构建完成

导入数据库

1
yarn update-db

运行

1
yarn start

img

默认用户名:admin 默认密码:umami

此时即可通过 IP:3000访问网站了,但为了方便使用,还需进行以下操作

其他配置

设置程序守护,此处以 PM2 为例

打开目录 umami 安装目录

1
2
3
4
5
6
#全局安装 pm2
yarn global add pm2

pm2 start yarn --name umami -- start
pm2 startup
pm2 save

img

设置网站反代

宝塔新建站点 -> 打开SSL - > 反向代理 ->添加反向代理

目标 URL 填写:http://127.0.0.1:3000

img配置反代

img

配置站点

登录 Umami

默认账号:admin
默认密码:umami

img

添加站点,并将代码放到网站

部分来收集数据。

升级配置

此时必须保证 Umami 没有正在运行,重新 拉取仓库、安装依赖、构建项目、启动即可

1
2
3
4
5
6
7
8
9
10
#拉取仓库
git pull
#安装
yarn install
#构建项目
yarn build
#更新数据库
yarn update-db
#启动项目
systemctl start umami

后语

特别强调,无论国外源多慢都强烈要求使用国外源。在使用淘宝源时,构建会失败!!!!!!!!!!!!!

**解决了统计JS被广告拦截插件给屏蔽的问题:**https://bcon.roywang.cn/umami-js-name/

🔲 ☆

BitWarden - 自建个人密码管理服务

因为使用网站的变多,所以最近老是忘记网站的密码,无奈只能重新找回密码,得以重新登录….然而下一次登录的时候,大概率还是重复以上操作苦不堪言,市面上提供有很多密码托管服务,但用起来会不是很放心,毕竟是托管到别人的服务器上,担心密码泄露。所以自建可以一定程度上避免这个问题~

而且支持跨平台服务,安卓、IOS、PC均受支持


部署 BitWarden

服务器以及域名是必须的,由于项目的特殊性,所以还需要SSL,可以极大的提高数据传输的安全性~

但申请SSL的过程此处就不再演示,可以使用阿里、腾讯之类的免费SSL。此处推荐ECC加密,详细好处请百度。

安装

一、打开宝塔面板软件商店找到 Docker 并安装。

img

二、打开 Docker 容器 设置 选项,打开 镜像管理 并 获取镜像。

img

三、在 镜像名称 处输入 bitwardenrs/server 获取镜像 (此步骤所需时间略长,不同服务器带宽所需时间不同)

img

四、获取镜像后在 容器列表 中 新建容器 需要映射容器端口 80 到 自定义的端口号(需提前开放未使用的自定义端口)。将容器的 /data 目录映射到服务器储存数据的目录上,在环境变量中写入:

1
ADMIN_TOKEN = 自定义字符 (此操作是打开管理员面板方便管理)。

设置反代

一、创建网站设置域名

二、点击 SSL 配置 SSL 证书

img

三、设置 反向代理 代理名称随意填写,目标URL 填写 http://127.0.0.1:自定义的端口号

img

服务的配置及使用

一、显示下图才代表服务运行成功

img

二、第一次使用需要注册账号

img

三、打开 域名/admin 即可打开后台,输入设置的密钥即可登录

img

四、如果仅自己使用的话建议关闭可注册用户,其他操作自定义即可

img

后语

设置完成后即可正常开始使用了。 BitWarden 的功能十分强大,而且支持 Chrome插件 Windows客户端 安卓APPs的使用,剩下的就靠自己发掘了~

🔲 ☆

AutoPlan - 自建B站挂机升级服务

今年2月15的时候发表过一篇文章:BilibiliTask– B站自动挂机升级脚本

由于作者已经删库跑路(bushi) 已经不再维护此项目,而项目是托管到 GitHub 上,又有随时被删库的风险,而且B站的登录信息存储在 GitHub 上总感觉不安全。

在 GitHub 上发现了一个新的项目,是基于 BilibiliTask 进行开发的。可以自建于自己的服务器,数据更安全,也可以分享给朋友一起使用。

您可以使用项目 Demo 进行自动签到。

Demo地址:AutoPlan Demo


项目简介

项目地址:AutoPlan

这是一个自动化的托管系统,目前支持网易云签到刷歌,bilibili赚经验+自动赛事预测,米游社原神签到。

已经实现的功能:

  • b站每日自动经验任务
  • b站赛事预测赚硬币任务
  • 网易云自动签到刷歌任务
  • 米游社原神签到领奖励任务以及米游币任务

详细可以查看项目地址

经过实际测试,这个项目在运行单个任务时,内存占用会到 500MB 左右,如果您的内存低于1G不建议您安装。

准备

由于 AutoPlan 基于 JAVA 开发,采用 MySQL 数据库存储数据,所以配置要求如下:

  • JDK 8或以上版本
  • MySQL 服务

本教程基于宝塔进行可视化操作搭建。

安装 Tomcat

由于使用宝塔,所以这里只需要安装 Tomcat 即可自动配置 JDK;

如您已安装 Tomcat 并且配置成功,则此步可以跳过。

在软件商店中搜索 Tomcat 进行安装,这里推荐安装 8.5

img

这样即可配置完成。

此处 MySQL 安装方式此处不再进行演示。

部署 AutoPlan

下载编译包

项目地址 中下载最新编译好的 JAR包。您也可以选择自行编译。

img

将下载好的 JAR包 上传到自定义的文件夹中。

img

新建 JAVA 站点

选择 网站->JAVA项目->添加JAVA项目,从而部署项目。

img

需修改的配置信息如下:

  • 项目jar路径:修改为自定义的路径名,并且选择上传的 jar包
  • 项目端口:自定义端口

其余配置可按需求修改,然后提交项目。

点击站点设置,设置域名,开启外网映射,并配置SSL。

img

新建数据库

选择数据库新建,输入配置信息后提交

img

此时需导入数据库文件,文件地址位于 项目仓库 中的 auto_plan.sql 文件,将仓库代码文件下载,然后将 SQL文件导入数据库。

img

配置 配置文件

在项目jar包同级目录中新建 application.yml 文件

img

需修改服务器端口以及数据库配置,文件具体配置如下:

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
server:
#服务器端口,此处端口号为创建站点时所设置的端口。
port: 26666
spring:
#数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/数据库名称?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: 数据库用户名
password: 数据库密码
main:
allow-bean-definition-overriding: true
mvc: #静态文件
static-path-pattern: /static/**
# actable自动建表
actable:
table:
auto: update
model:
#分号或者逗号隔开
pack: com.oldwu.entity;com.oldwu.domain;com.netmusic.model;com.miyoushe.model
database:
type: mysql
index:
#自己定义的索引前缀#该配置项不设置默认使用actable_idx_
prefix: INDEX_
unique:
#自己定义的唯一约束前缀#该配置项不设置默认使用actable_uni_
prefix: INDEX_UNIQUE_
# mybatis自有的配置信息,key也可能是:mybatis.mapperLocations
mybatis-plus:
global-config:
db-config:
id-type: auto
#mapper配置文件
mapper-locations: classpath:mapper/*.xml,classpath:mapper/**/*.xml,classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml
type-aliases-package: com.oldwu.entity
#开启驼峰命名
configuration:
map-underscore-to-camel-case: true
#输出mybatis日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

img服务器端口及数据库配置信息需修改,其余信息可根据自定义修改

启动任务,即可打开网站,注册账户。

链接:https://youdomain.com/reg

img点击未启动,即可启动项目

打开网址,即可注册账号

img

修改账号为管理员账号。

修改数据库 sys_role_user 表中 sys_role_id 为 1即为管理员

img

配置账号,并使用

推荐使用 BILIBILI客户端 扫码登录,具体获取 B站 COOKIE 以及完成推送可以参考 BILIBILITASK – B站自动挂机升级脚本 这里不再赘述。

img

系统默认每天8点自动进行任务,如需修改可通过 自动任务管理 中的 B站自动任务修改。

img

后语

由于是第三方脚本,所以有大概率的封号几率,而且如果全部托管到一台服务器上,封禁概率会大大提高

强烈建议自建,如通过本项目造成的一切损失本人概不负责!请谨慎使用。

🔲 ☆

SearX - 私人的搜索引擎系统

搜索主页一直以来使用的都是一个单页,可以选择跳转到百度搜索还是谷歌搜索。一直想搭建一个属于自己的搜索引擎,无奈没有合适的开源项目,今天在Telegram上某群群主分享了一个项目,使用了一段时间感觉还可以,就分享出来。


项目简介

项目地址:SearX

Searx是一个免费的互联网搜索引擎,汇集了70多种搜索引擎的结果,用户既不被跟踪也不被分析。这些搜索引擎包括 Bing,Google,Reddit,Wikipedia,duckduckgo、Yahoo和Yandex 等。

部署 SearX

该项目提供了多种的安装方式,不过这里选择了使用 Docker + 宝塔的方式进行安装,其他的安装方式可以参考作者的官方文档

获取镜像

打开宝塔的Docker管理器,选择镜像管理–>获取镜像,输入 searx/searx

img

创建容器

容器端口填写 8080 服务器端口自定义(非80端口)。其余默认即可

img

设置反向代理

创建网站,输入域名

img设置SSL

输入127.0.0.1:自定义设置的端口号

img

搭建完成

img

后语

该项目不适合搭建于国内服务器,如果搭建于国内服务器会无法获取Google等网站的引擎内容。

🔲 ☆

EwoMail - 搭建个人邮件服务器

国内的各大厂都有免费的企业邮箱,体验也算不错。但是限制于容量,如果经常发一些附件的话免费的那么几个G根本不够用,套餐又太贵,此时节约成本的方法就是自建邮箱


准备

  • 一个纯净的服务器(此处以CentOS为例)
  • 域名(使用国内服务器,域名需备案)
  • EwoMail 程序
  • 打开端口:TCP类型8000,8010,8020,25,143,993,995,587,110,109,22,80,465

设置SWAP(服务器内存 2g 及以上可忽略)

检查是否设置SWAP,在命令行输入 free -m

img

显示 0 0 0 则没有设置SWAP,如显示非 0 0 0 则直接跳到下一步安装 EWOMAIL

安装SWAP 在命令行输入:

1
dd if=/dev/zero of=/mnt/swap bs=1M count=1024

img

1024 为设置 SWAP 大小,建议大小为服务器内存大小

设置交换分区文件:

1
mkswap /mnt/swap

img

显示如图,即设置成功

启动SWAP:

1
swapon /mnt/swap

img

显示如图,即设置成功

设置开机时自启用SWAP分区

在命令行输入:

1
vi /etc/fstab

img

打开文件

在末行输入:

1
swap /mnt/swap swap defaults 0 0

img

按下ESC然后输入 :wq 按回车保存并退出

安装 EwoMail

打开 EwoMail 输入域名获取安装地址

image-20240818174348194

复制安装代码到命令行

image-20240818174448936

回车开始安装,等待安装结束

img

显示Complete installation即为安装成功

设置域名解析

打开域名解析见面添加以下解析

1
2
3
4
5
6
7
8
9
前缀:@        类型:A           值:youip
前缀:mail 类型:A 值:youip
前缀:pop3 类型:CNAME 值:mail.youdomain
前缀:pop 类型:CNAME 值:mail.youdomain
前缀:imap 类型:CNAME 值:mail.youdomain
前缀:smtp 类型:CNAME 值:mail.youdomain
前缀:@ 类型:MX 值:mail.youdomain MX记录优先级:10
前缀:@ 类型:TXT 值:v=spf1 ip4:youip -all
此处 youdomain 为你的域名,youip 为你的IP

设置DKIM

DKIM是电子邮件验证标准,域名密钥识别邮件标准,主要是用来防止被判定为垃圾邮件。每个域名都需要添加一个dkim的key,EwoMail默认安装后已自动添加主域名DKIM,只需要设置好dkim的dns即可。

登录安装 EwoMail 的服务器,执行查看代码

1
2
centos6 : amavisd showkeys
centos7 : amavisd -c /etc/amavisd/amavisd.conf showkeys

img

复制粘贴到 EwoMail 整理信息

img

增加以下域名解析

1
前缀:dkim_domainkey          类型:TXT                      值:获取到的记录值

等待10分钟测试是否设置正确

测试命令:

1
2
Centos6 : amavisd testkeys
Centos7 : amavisd -c /etc/amavisd/amavisd.conf testkeys

img

显示pass即为正常

登陆使用

  • 邮箱管理后台:IP:8010
  • web邮件系统:IP:8000
  • 更多配置可以请查看详细文档 EWOMAIL
  • 初始用户:admin 初始密码:ewomail1233

测试

添加邮箱

img

发送测试邮件

img

发送成功

img

收取成功

img

后语

如果在发送邮件时,提示连接服务器失败,请确认打开了25端口,如果已经打开了还是无法发送,部分服务商会默认封掉25端口(如腾讯云),请申请解封

🔲 ☆

BilibiliTask - B站自动挂机升级脚本

B站如果正常使用,偶尔投币不投稿的话升级实在太过缓慢。。。今天在刷百度时偶然发现了一个项目,可以进行自动挂机升级,每天可以获得65点经验。


BilibiliTask

项目地址:BilibiliTask

特性

  • 自动获取经验(投币、点赞、分享视频)
  • 直播辅助(直播签到,自动送出即将过期的礼物)
  • 自动兑换银瓜子为硬币
  • 自动领取年度大会员每月权益(每月1号领取B币劵、权益礼包)
  • 月底自动用B币卷给自己充电(每月28号)
  • 月底自动用B币卷兑换金瓜子(每月28号)
  • 漫画辅助脚本(漫画APP签到)
  • 支持功能自定义(自定义投币数量,银瓜子兑换硬币开关等)
  • 账户失效提醒(发送到你的微信或者钉钉)
  • 增加用server酱推送运行结果到微信
  • 增加推送运行结果到钉钉

搭建

项目给了两种搭建方式,一种是直接托管到GitHub,一种使用的是使用Docker搭建,不过使用Docker搭建的话,管理起来太过麻烦。故此次演示的是直接托管到GitHub。

获取需要的参数

打开 Bilibili,按下F12–>Application–>Cookies–> “https://www.bilibili.com”,需要三个参数SESSDATA、bili_jct、DedeUserID。

img

将项目Fork到自己的仓库

打开项目地址 BilibiliTask 登录账号后点击 Fork 到自己仓库

img

将获取到的信息填写到Secrets,一共三个参数

img

点击 New repository secret 新建三个存储库信息

img

Name填写BILI_JCT、DEDEUSERID、SESSDATA,Value填写所获得的数据

运行

默认Actions处于禁止状态,在Actions选项中开启Actions功能,把那个绿色的长按钮点一下,开启运行。

img

点击 按钮开启actions (引用自作者教程)

默认push操作会触发工作流运行。打开README.md,将里面的 笑脸 删除一个即可。

img

删除笑脸后保存配置文件(引用自作者教程)

查看actions,显示对勾就说明运行成功了。以后会在每天的10:30执行,自动完成每日任务。

img

查看运行情况(引用自作者教程)

使用Telegram Bot推送到Telegram群组

创建Telegram Bot

发送 /newbot 到 @BotFather,并给这个机器人取一个名字,获取Telegram Bot Token

img

获取Telegram Bot Token

获取群组ID并将机器人加入其中

在搜索框搜索 你的机器人名字,添加进群组

img

将机器人添加至群组

向机器人发送 “https://api.telegram.org/bot你的botToken/getUpdates”,打开网址箭头为群组ID

img

获取群组ID

在Secrets中新增TELEGRAM_BOT_TOKEN、TELEGRAM_CHAT_ID将获取的数据输入到value

img

此处TELEGRAM_BOT_TOKEN value填写 bot token,TELEGRAM_CHAT_ID value填写群组ID

即可完成 Telegram Bot 推送

img

完成 TG 推送

配置文件说明

配置文件的位置在 src/main/resource/config.yml

img

🔲 ☆

Puff - 开源的域名监控工具

昨天早上在群里吹水,关注的一个域名橘子已经回复会删除了,但多久删除没有底,想问问群里的大佬多久会删除,但是问了一圈都不知道,所以萌生了写一个域名监控的想法。

目前这个服务呢,仅支持监控域名掉落,不能负责抢注,但抢注更多的不是技术难题,而是别的方面。后续打算增加一个域名动态检测的功能,如果域名过期了、进入赎回期、待删除之类的,都可以提醒一下(已支持)。

如果大佬们有更好的建议,可以给我留言一下。

2025-12-27更新,项目已经完成了重构,稳定性UI,交互体验大幅提升,欢迎体验~

现文章已经失效,如有需要可以查看新版文档 Puff Docs

2024-10-1更新,增加了几个新功能:

  • 增加域名进入赎回期、待删除之类的通知。
  • 登录会话两小时超时。
  • 增加个Logo
  • 修复了几个 BUG

Puff

项目地址:Puff

开源、快速、便捷、基于Go的域名监控程序。

image-20240927180004803

特性

性能优秀

基于 Go 语言开发,快速且性能优秀!

易于使用

部署简单,支持不同平台的多种部署方式。

提供了一个用户友好的界面和直观的操作流程,使得即使是初学者也能轻松上手。

UI 现代化

不知道怎么吹了…………..

部署 Puff

目前支持三种部署方式,编译部署、手动部署、Docker 部署。

编译部署

环境要求

  • Go 版本 >=1.22.0

克隆仓库

1
git clone https://github.com/bitaur/puff.git

构建程序

1
go build -o Puff.exe main.go

运行

1
./Puff

手动部署

下载 Puff

打开 Puff Release 下载对应的平台以及系统的文件。

如果最新的包没有您对应的二进制文件,可以提交 issues ,或可以选择自己编译安装。

其中:

armv6 对应 arm 架构32位版本,arm64 对应 arm 架构64位版本。

x86 对应 x86 平台32位版本,x86_64 对应 x86 平台64位版本。

克隆模板文件以及静态资源文件。

手动运行

Linux / MacOS

1
2
3
4
5
6
7
# 解压下载后的文件,请求改为您下载的文件名
tar -zxvf filename.tar.gz

# 授予执行权限
chmod +x Puff

./Puff

Windows

双击运行即可。

持久化运行

Linux

使用编辑器编辑 /usr/lib/systemd/system/puff.service 添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=puff
After=network.target

[Service]
Type=simple
WorkingDirectory=puff_path
ExecStart=puff_path/Puff
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存后,使用 systemctl deamon-reload 重载配置。具体使用命令如下:

  • 启动: systemctl start puff
  • 关闭: systemctl stop puff
  • 配置开机自启: systemctl enable puff
  • 取消开机自启: systemctl disable puff
  • 状态: systemctl status puff
  • 重启: systemctl restart puff

更新版本

如果有新版本更新,下载新版本,将旧版本的文件删除即可。

Docker 部署

首先请确保您正确的安装并配置了 Docker 以及 Docker Compose

Docker CLI

1
docker run -d --restart=unless-stopped -v /data/puff:/app/data -p 8080:8080 --name="Puff" bitaur/puff:latest

Docker Compose

在空目录中创建 docker-compose.yaml 文件,将下列内容保存。

1
2
3
4
5
6
7
8
9
services:
Puff:
image: bitaur/puff:latest
container_name: Puff
volumes:
- /data/puff:/app/data
restart: unless-stopped
ports:
- 8080:8080

保存后,使用 docker compose up -d 创建并启动容器。

Docker 容器更新

CLI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#查看容器ID
docker ps -a

#停止容器
docker stop ID

#删除容器
docker rm ID

#获取新镜像
docker pull bitaur/puff:latest

# 输入安装命令
docker run -d --restart=unless-stopped -v /data/puff:/app/data -p 8080:8080 --name="Puff" bitaur/puff:latest

Docker Compose

1
2
3
4
5
#获取新镜像
docker pull bitaur/puff:latest

#创建并启动容器
docker compose up -d

访问

此时打开 localhost:8080 即可打开站点。默认账号密码均为 admin

后语

这东西写的很快,其实也没什么难度,但是就是没有看到啥开源项目,具体的使用就不多介绍了,基本上就是一看就会。

如果有什么功能需求,也可以在评论区留言一下,如果是不错的提议,我会考虑更新给软件加上!

🔲 ☆

AuthenTik - 开源的身份验证服务

一直以来都想部署一个前置验证的服务,作为前置验证的网关(类似于Nginx Auth),用来保护一些开放于公网上但自用的服务。但 Nginx Auth 太过简单(丑),虽想着找到一个能够满足我的这些功能的一个身份验证服务,经过 @Shell 的安利,选择了 AuthenTik。

选择 AuthenTik 最主要的原因是因为其 UI 讨喜,另一个便是使用的人相对较多而且也在积极维护。但中文互联网上有关于 AuthenTik 的内容不多。

每次访问同一域名下的某个服务时,都会先跳转到 AuthenTik 的认证页面,认证成功后,才会跳转到服务本来的页面。在某一时间内访问同一域名下的其他服务时,则不需要认证,不仅加强了安全性,还保护了隐私。

AuthenTik 不仅可以作为 IdP 进行使用,更多的人是将其作为 SSO 进行使用,一个站点登录,即可于同域名下的其他自建服务进行免登录操作。


AuthenTik

项目地址:AuthenTik

AuthenTik 是一个 IdP(身份提供商)和 SSO(单点登录),其每段代码、每个功能都以安全性为首要构建,并强调灵活性和多功能性。

借助 AuthenTik,网站管理员、应用程序开发人员和安全工程师几乎可以在任何类型的环境中获得可靠且安全的身份验证解决方案。它为用户和应用程序提供了强大的恢复操作,包括用户配置文件和密码管理。您可以快速编辑、停用甚至模拟用户配置文件,并为新用户设置新密码或重置现有密码。

您可以在现有环境中使用 AuthenTik 来添加对新协议的支持,因此将 AuthenTik 引入您当前的技术堆栈不会带来重新架构的挑战。我们支持所有主要提供商,例如 OAuth2SAMLLDAPSCIM,因此您可以为每个应用程序选择所需的协议。

特性

  • 管理界面:用于创建和管理用户和组、令牌和凭据、应用程序集成、事件以及定义标准和可自定义登录和身份验证流程的流程的可视化工具。易于阅读的可视化仪表板显示系统状态、最近的登录和身份验证事件以及应用程序使用情况。
  • 用户界面:AuthenTik 中的控制台视图显示您已实施 AuthenTik 的所有应用程序和集成。单击要访问的应用程序以将其打开,或向下钻取以在管理界面中编辑其配置。
  • 流程流程是登录和身份验证过程的各个阶段发生的步骤。阶段代表登录过程中的单个验证或逻辑步骤。AuthenTik 允许自定义和精确定义这些流程。

配置要求

  • 2个 CPU 核心
  • 2 GB RAM

环境需求

  • Docker
  • Docker Compose(建议使用 Compose v3)

部署 AuthenTik

此处推荐,且仅演示使用 Docker 进行部署。

配置 ENV 文件

全新安装 Authentik 首先需要生成 .env 文件,并向文件中写入生成的密钥以及密码。

1
2
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env

建议开启电子邮件通知,如果系统有安全性以及功能性的更新,可以及时收到更新通知的邮件,将下列配置写入 .env文件。

如果长时间未能接收到邮箱,请查看开启的 TLS 或 SSL 加密对应的端口号是否填写正确!且 TLS 与 SSL 不可同时开启。

  • TLS:587
  • SSL:465

但是经过我实测发现,QQ 邮箱通过 SSL 进行加密会导致发信失败,使用 TLS 则一切正常,但据我推测,这个问题很可能是 AuthenTik 的 bug。

1
2
3
4
5
6
7
8
9
10
11
12
13
# SMTP 主机地址及端口号
AUTHENTIK_EMAIL__HOST=localhost
AUTHENTIK_EMAIL__PORT=25
# 邮箱服务的账号以及密码
AUTHENTIK_EMAIL__USERNAME=roywang
AUTHENTIK_EMAIL__PASSWORD=roywang
# 开启 TLS,与 SSL 不可同时开启。
AUTHENTIK_EMAIL__USE_TLS=false
# 开启 SSL,与 TLS 不可同时开启。
AUTHENTIK_EMAIL__USE_SSL=false
AUTHENTIK_EMAIL__TIMEOUT=10
# 邮箱地址
AUTHENTIK_EMAIL__FROM=authentik@localhost

可选的其他配置

1
2
3
4
5
# 配置服务所使用的端口
COMPOSE_PORT_HTTP=80
COMPOSE_PORT_HTTPS=443
# 启用错误报告
AUTHENTIK_ERROR_REPORTING__ENABLED=true

Docker 部署

将以下内容保存为docker-compose.yml文件,将其与上步中.env文件放于同一目录。

请注意,其中需要修改的各处。

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
services:
postgresql:
image: docker.io/library/postgres:16-alpine
container_name: Authentik-Postgresql
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
//PgSQL数据存放目录,此处需要修改。
- /your-authentik-path/postgresql:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
env_file:
- .env

redis:
image: docker.io/library/redis:alpine
container_name: Authentik-Redis
command: --save 60 1 --loglevel warning
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
volumes:
//Redis缓存存放目录,此处需要修改。
- /your-authentik-path/redis:/data

server:
image: ${AUTHENTIK_IMAGE:-docker.io/beryju/authentik}:${AUTHENTIK_TAG:-latest}
restart: unless-stopped
container_name: Authentik-Server
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
//AuthenTik数据存放目录,此处需要修改。
- /your-authentik-path/media:/media
- /your-authentik-path/custom-templates:/templates
env_file:
- .env
ports:
- "9443:9443"
depends_on:
- postgresql
- redis

worker:
image: ${AUTHENTIK_IMAGE:-docker.io/beryju/authentik}:${AUTHENTIK_TAG:-latest}
restart: unless-stopped
container_name: Authentik-Worker
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
//AuthenTik 数据存放目录,此处需要修改。
- /your-authentik-path/media:/media
- /your-authentik-path/certs:/certs
- /your-authentik-path/custom-templates:/templates
env_file:
- .env
depends_on:
- postgresql
- redis

此时运行 docker compose up -d启动容器,官方默认的docker-compose.yml 的文件中,Server以及Worker均使用的是 ghcr,国内服务器根本拉不到镜像。

待容器均已创建启动完毕,初始化设置时需访问:

1
https://your-ip:9443/if/flow/initial-setup

默认用户名为akadmin

使用

在此主要是介绍一下如何给服务添加验证。

OIDC

如果需要通过 OIDC 接入 SSO,可以参考 Shell 的博客:

https://blog.ning.moe/tags/Authentik/

正向代理

首先需要进入管理员页面。

创建提供程序

进入管理页面后,左侧菜单栏依次点击应用程序-提供程序,点击创建,选择Proxy Provider

然后点击下一步,在此处分别输入程序名称,选择身份验证流程授权流程(默认选择第一个即可),然后选择Forward Auth(单应用)

在下方输入外部主机,也就是服务的域名(需要带 http or https 协议头)以及设置令牌有效期。

高级设置

证书选择,可做作用域全选。

不验证身份的路径,有些服务还会向外提供 API,这个验证路径就是为该部分服务准备的。使用的 Go 语言正则。但是这个不建议使用,有较为严重的性能问题。

具体解决方案可以期待后续文章。

创建应用程序

位于左侧菜单栏应用程序-应用程序,点击创建

输入名称以及Slug,选择刚刚创建的提供程序。策略引擎模式 选择 all

添加前哨

位于左侧菜单栏应用程序-前哨,右侧的操作选择编辑,选择已有的应用程序,将其添加至右侧,点击更新。

Nginx 配置文件

因为是正向代理,所以需要修改一下 Nginx 的配置文件,此配置通用。

在配置文件最上部添加:

1
2
3
4
5
# Upgrade WebSocket if requested, otherwise use keepalive
map $http_upgrade $connection_upgrade_keepalive {
default upgrade;
'' '';
}

在监听的根目录下location /{}中添加配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
proxy_pass          $forward_scheme://$server:$port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade_keepalive;
auth_request /outpost.goauthentik.io/auth/nginx;
error_page 401 = @goauthentik_proxy_signin;
auth_request_set $auth_cookie $upstream_http_set_cookie;
add_header Set-Cookie $auth_cookie;

auth_request_set $authentik_username $upstream_http_x_authentik_username;
auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
auth_request_set $authentik_email $upstream_http_x_authentik_email;
auth_request_set $authentik_name $upstream_http_x_authentik_name;
auth_request_set $authentik_uid $upstream_http_x_authentik_uid;

proxy_set_header X-authentik-username $authentik_username;
proxy_set_header X-authentik-groups $authentik_groups;
proxy_set_header X-authentik-email $authentik_email;
proxy_set_header X-authentik-name $authentik_name;
proxy_set_header X-authentik-uid $authentik_uid;

在配置文件底部添加,请注意的是,需要修改服务地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
location /outpost.goauthentik.io {
# 修改 AuthenTik 地址
proxy_pass http://authentik.company:9000/outpost.goauthentik.io;

proxy_set_header Host $host;

proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
add_header Set-Cookie $auth_cookie;
auth_request_set $auth_cookie $upstream_http_set_cookie;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}

location @goauthentik_proxy_signin {
internal;
add_header Set-Cookie $auth_cookie;
return 302 /outpost.goauthentik.io/start?rd=$request_uri;
}

此时访问需要验证的服务,跳转到了 AuthenTik 页面。

后语

AuthenTik 在正常使用的时候,坑还是比较多的,整个过程折腾了接近半个月,才完全达到效果。

在部署这个服务时,陆续碰到了以下问题:

  • 访问发生 500 错误
  • 给 API 放行的路径性能太差
  • 放行正则非常难写

详细要说一下,关于配置完成后访问服务发生 500 错误的问题。首先检查一下是否为该应用添加到前哨之中,尝试将 Nginx 配置文件中的外部的 AuthenTik 服务域名更换为内网IP。

如果使用内网IP一切正常,使用公网域名访问不正常,恭喜你咱们碰到了一样的问题。后续我会水一篇新的文章以解决这个问题。

另外我部署了一个 AList用于通过 WebDAV 协议去同步文件,但经过实测,性能差距能有10倍…..这让我放弃了使用 AuthenTik 中放行路径的服务。 这个也会后续水一篇新的文章以解决这个问题。

这里只是写了个大概的使用情况,其他的更多设置,推荐一下 ECWU 大佬关于 AuthenTik 的系列教程,对我有很大的帮助

参考

AuthenTik 官方文档

ECWU AuthenTik 系列教程

❌