目录
Sleep-Status 是一个使用 Go 语言编写的简单后端服务。该服务通过读取配置文件 config.json
来获取和修改 sleep
状态。
灵感来源于 这个BiliBili视频。
使用 Go 语言是因为其跨平台交叉编译特性,使得服务可以便捷的在多个操作系统上运行。
- 提供
/status
路由来获取当前的sleep
状态。 - 提供
/change
路由来修改sleep
状态。 - 提供
/heartbeat
路由接收心跳信号,自动检测设备状态。 - 支持访问日志记录,将所有路由请求的 IP 地址记录到
access.log
文件中。 - 配置文件
config.json
不存在时会自动创建并填入默认值。 - 支持配置文件版本管理,自动迁移旧版本配置。
- 支持心跳超时自动设置睡眠状态。
- 支持
Render
一键部署 - 支持使用
Docker
和Docker Compose
一键部署 - 支持使用二进制文件,无需依赖快速运行
配置文件 config.json
包含以下字段:
{
"version": 2, // 配置文件版本
"sleep": false, // 睡眠状态
"key": "your-key", // API密钥
"heartbeat_enabled": false, // 是否启用心跳检测
"heartbeat_timeout": 60 // 心跳超时时间(秒)
}
当启用心跳检测时(heartbeat_enabled=true
),服务器会:
- 监听来自客户端的心跳信号(
/heartbeat
路由) - 如果超过
heartbeat_timeout
秒没有收到心跳,自动将状态设置为睡眠 - 收到心跳信号时,如果状态为睡眠,自动设置为醒来
客户端需要定期发送心跳请求:
curl "http://your-server:8000/heartbeat?key=your-key"
点击下方按钮,使用Render一键部署
不过Render的免费套餐,在无请求的时候会自动 down
Free instances spin down after periods of inactivity. They do not support SSH access, scaling, one-off jobs, or persistent disks. Select any paid instance type to enable these features.
镜像名 shenghuo2/sleep-status:latest
运行命令
docker run -d -p 8000:8000 --name sleep-status shenghuo2/sleep-status:latest
将在本地的8000端口启动,使用docker logs sleep-status
查看自动生成的随机密码
# version: '3.8'
services:
sleep-status:
image: shenghuo2/sleep-status:latest
ports:
- "8000:8000"
将在本地的8000端口启动,使用docker logs sleep-status
查看自动生成的随机密码
-
确保已安装 Go 语言环境(推荐使用 Go 1.16 及以上版本)。
-
下载或克隆此项目到本地:
git clone https://github.com/shenghuo2/sleep-status.git cd sleep-status
-
编译项目:
go build .
-
运行编译后的可执行文件:
./sleep-status [--port=] [--host=]
[ ]
内为可选参数默认情况下,服务将监听在
0.0.0.0
的8000
端口。 -
API 接口说明:
-
获取当前的
sleep
状态:curl http://<host>:<port>/status
响应示例:
{ "sleep": false }
-
获取最近的睡眠记录:
curl http://<host>:<port>/records[?limit=30]
参数说明:
limit
:可选,返回的记录数量,默认为30条
响应示例:
{ "success": true, "records": [ { "action": "sleep", "time": "2025-02-25T15:30:00Z" }, { "action": "wake", "time": "2025-02-25T23:00:00Z" } ] }
-
修改
sleep
状态:curl "http://<host>:<port>/change?key=<your_key>&status=<status>"
参数说明:
key
:配置文件中的key
值,用于校验请求合法性。status
:期望的sleep
状态,1 表示true
,0 表示false
。
成功响应示例:
{ "success": true, "result": "status changed! now sleep is 1" }
失败响应示例:
{ "success": false, "result": "sleep already 1" }
失败状态码为401
-
默认的 config.json
文件格式如下:
{
"sleep": false,
"key": "default_key"
}
首次运行程序时,如果配置文件不存在,将自动创建该文件并随机生成16位密钥。
对 /status
/change
路由的访问请求都会记录到 access.log
文件中,记录格式如下:
2024-08-03T13:18:53+08:00 - [::1]:19469 - /status
2024-08-03T13:19:01+08:00 - [::1]:19469 - /change
https://github.com/shenghuo2/sleep-status-sender
可以通过该应用选择“睡醒”或“睡着”状态,将状态发送到指定的服务器。
以及一个设置页面,用户可以配置服务器的 BASE_URL,并测试与服务器的连接。
Magisk 模块 (magisk-module 分支)
提供 Magisk 模块实现,可以在 Root 设备上实现更深度的系统集成。
示例前端 (frontend-example 分支)
提供一个基于 Web 的示例前端实现,展示如何与服务端进行交互。
- 修复问题
- 修复
/records
API 在并发访问时可能导致的死锁问题 - 优化心跳检测机制,防止与其他操作产生锁竞争
- 改进睡眠记录迁移功能的稳定性
- 修复
- 性能优化
- 使用异步日志记录,避免阻塞API响应
- 实现细粒度锁机制,提高并发性能
- 添加无锁版本的记录保存函数,减少锁竞争
- 代码重构
- 将状态变更逻辑提取到独立函数,提高代码可维护性
- 优化心跳检测器的实现,避免嵌套锁导致的死锁
- 新增功能
- 添加
/records
API,支持查看最近的睡眠记录 - 支持自定义返回记录数量(默认30条)
- 添加
- 优化改进
- 优化睡眠记录的存储格式,改用JSON数组
- 添加旧版本记录格式自动迁移功能
- 改进错误处理,提供更友好的错误信息
- 新增心跳检测功能
- 支持自动检测设备状态
- 可配置心跳超时时间
- 超时自动设置睡眠状态
- 新增配置文件版本管理
- 自动迁移旧版本配置
- 支持配置文件版本号
- 新增部署方式
- 支持 Render 一键部署
- 支持 Docker 和 Docker Compose 部署
- 提供二进制文件快速部署
- 初次启动时自动创建随机强密码
- 对所有路由进行日志记录
- 启动时输出当前key
- 支持
Render
蓝图一键部署 - 支持
Docker
和Docker Compose
快速部署
- 支持 CORS 请求
- 支持入睡和醒来时间的记录
- 初始版本,提供基本功能
- 支持对所有路由的访问日志记录。
- 实现在
config.json
读取 host 和 port 的值 - 实现对于入睡和醒来时间 的记录
- 支持
CORS
- 实现第一次启动时,自动创建随机
key
- 每次启动时输出当前
key
- 增加更多状态和操作的 API。
- 提供更加详细的错误处理和响应信息。
- 支持
Paas
类方法一键部署- 已使用
Render
实现
- 已使用
- 每次
push
自动build新镜像并推送 - 支持
Docker
和Docker Compose