This commit is contained in:
tamakyi
2026-09-08 10:10:44 +08:00
commit 2ed27dd55e
288 changed files with 67061 additions and 0 deletions
+122
View File
@@ -0,0 +1,122 @@
<h1 align="center">
<img src="https://box-user-assets.n3ko.cc/public/Neko.png" width=100px/>
NekoBox
</h1>
<p align="center">
匿名提问箱 / Anonymous Question Box
</p>
<p align="center">
<a href="https://goreportcard.com/badge/github.com/NekoWheel/NekoBox">
<img src="https://github.com/NekoWheel/NekoBox/workflows/Go/badge.svg" alt="Go Report Card">
</a>
<a href="https://sourcegraph.com/github.com/NekoWheel/NekoBox">
<img src="https://img.shields.io/badge/view%20on-Sourcegraph-brightgreen.svg?logo=sourcegraph" alt="Sourcegraph">
</a>
<a href="https://deepsource.io/gh/NekoWheel/NekoBox/?ref=repository-badge">
<img src="https://deepsource.io/gh/NekoWheel/NekoBox.svg/?label=active+issues&token=7nuU5C-4QG3CP_5g9qFf3Bl9" alt="DeepSource">
</a>
<a href="https://goreportcard.com/report/github.com/NekoWheel/NekoBox">
<img src="https://goreportcard.com/badge/github.com/NekoWheel/NekoBox" alt="Go Report Card">
<a>
</p>
<p align="center">
<a href="/README.zh-CN.md">简体中文</a> | <a href="/README.md">English</a>
</p>
![Screenshot](./dev/screenshot.svg)
## 安装
### 需求
* [Go](https://golang.org/dl/) (v1.19 或更高版本,`go.mod` 声明 `go 1.25.0`)
* [MySQL](https://www.mysql.com/downloads/) (v5.7 或更高版本)
* [Redis](https://redis.io/download/) (v6.0 或更高版本)
> 编译依赖说明:`chai2010/webp` 需要 CGO 与系统 `libwebp`(Debian/Ubuntu:`apt install libwebp-dev`),
> 静态图片上传时会自动转换为 WebP。若安装失败,转换将自动回退为原始格式(不影响编译之外的功能)。
> 动画 GIF 转 WebP 需要系统安装 `cwebp` 命令行工具,未安装时回退为原始 GIF。
### 从源码编译
```bash
git clone https://github.com/NekoWheel/NekoBox.git
cd NekoBox
go build -o NekoBox
```
### 编辑配置文件
```bash
cp conf/app.sample.ini conf/app.ini
```
### 运行
```bash
./NekoBox web
```
### 常用命令
| 命令 | 用途 |
| ---- | ---- |
| `./NekoBox web` | 启动 Web 服务 |
| `./NekoBox censor` | 批量补审未审查的提问/回答(需配置文本审查服务) |
| `./NekoBox uid` | 为历史用户补生成 UID |
| `./NekoBox ban --email [email protected]` | 封禁用户并连带清理其提问、追问、私聊与消息(不可恢复,执行前二次确认) |
## 功能特性
- **匿名提问 / 私密提问**:支持匿名或登录后提问,可标记私密(仅通过 token 链接可见)
- **问题置顶 / 精选回答**:提问箱主人在管理页置顶提问,公开主页置顶优先展示
- **回答后追问**:提问者凭 token 可对已回答的问题最多追问 3 次,主人可回复
- **Markdown 回答**:回答支持 Markdown 排版(服务端渲染 + 白名单过滤防 XSS)
- **分享图**:提问箱主页分享图与单题分享图(含二维码,复用同一绘制模块)
- **页面密码 / 提问密码**:可选为提问箱页面设置访问密码、为提问设置密码
- **同 IP 重复内容拦截**:同一 IP 在 5 分钟内提交相同内容会被拒绝
- **匿名 / 登录分级限流**:登录用户享有更高请求额度(端点级滑动窗口限流)
- **IP 黑名单**:支持精确 IP 与 CIDR,命中后跳转到指定 URL
- **私聊**:登录用户可向开启私聊的提问箱发起会话,支持图片、拉黑、每日上限
- **提问箱统计看板**:管理页展示总提问 / 已回答 / 未回答 / 私密 / 置顶 / 私聊统计
- **全文搜索**:管理页可按关键词搜索自己提问箱的提问与回答
- **热门问题 / 标签榜**:探索页展示热门标签与最新活跃的公开提问
- **数据导出**:支持 Excel 导出与 JSON 全量导出(含追问与私聊,可迁移备份)
- **多语言**:简体中文 / 繁體中文 / English / 日本語,支持按 cookie、用户配置与提问箱配置切换
- **深色模式**:全站一键切换深/浅色(cookie 持久化)
- **内容审查**:七牛 + 阿里云文本审查(可配置),结果带 30 天缓存
## 架构
![Architecture](./dev/nekobox-arch-light.png#gh-light-mode-only)
![Architecture](./dev/nekobox-arch-dark.png#gh-dark-mode-only)
NekoBox 使用 GitHub Actions 进行持续集成和部署。
当用户访问 NekoBox 时,请求将会被发送至阿里云 CDN,CDN 的访问日志将会被实时推送到阿里云日志服务
(SLS)。日志数据将在 SLS 中存储 180 天,用于审计。
用户的信息、提问和回答将被存储在 MySQL 数据库中。
用户的会话、CSRF 令牌和电子邮件验证令牌将被暂时存储在 Redis 中。
用户的整个请求和响应链路将被上传到 Uptrace 用于调试。这些数据将被储存 30 天。管理员可以使用用户提供的 `TraceID`
来追踪查询指定的请求。
当用户提交提问时,问题的内容将被发送到七牛文本审查服务进行审查。如果提问内容存在问题,该内容将被发送到阿里云文本审查服务进行二次审查。
如果内容审查仍未通过,该提问将被拒绝发送。这是由于七牛文本审查服务不是很准确,一些非冒犯性的内容可能被七牛文本审查误报。
当用户收到新的提问时,阿里云邮件服务(DM)会向用户的邮箱发送一封邮件。
你可以在主页查看 NekoBox 的更新日志,也欢迎访问赞助页面来打钱支持 NekoBox。 更新日志和赞助商名单存储在独立部署的
Pocketbase 服务中。
## 开源协议
MIT License