123 lines
5.4 KiB
Markdown
123 lines
5.4 KiB
Markdown
<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>
|
||
|
||

|
||
|
||
## 安装
|
||
|
||
### 需求
|
||
|
||
* [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 天缓存
|
||
|
||
|
||
## 架构
|
||
|
||

|
||

|
||
|
||
NekoBox 使用 GitHub Actions 进行持续集成和部署。
|
||
|
||
当用户访问 NekoBox 时,请求将会被发送至阿里云 CDN,CDN 的访问日志将会被实时推送到阿里云日志服务
|
||
(SLS)。日志数据将在 SLS 中存储 180 天,用于审计。
|
||
|
||
用户的信息、提问和回答将被存储在 MySQL 数据库中。
|
||
|
||
用户的会话、CSRF 令牌和电子邮件验证令牌将被暂时存储在 Redis 中。
|
||
|
||
用户的整个请求和响应链路将被上传到 Uptrace 用于调试。这些数据将被储存 30 天。管理员可以使用用户提供的 `TraceID`
|
||
来追踪查询指定的请求。
|
||
|
||
当用户提交提问时,问题的内容将被发送到七牛文本审查服务进行审查。如果提问内容存在问题,该内容将被发送到阿里云文本审查服务进行二次审查。
|
||
如果内容审查仍未通过,该提问将被拒绝发送。这是由于七牛文本审查服务不是很准确,一些非冒犯性的内容可能被七牛文本审查误报。
|
||
|
||
当用户收到新的提问时,阿里云邮件服务(DM)会向用户的邮箱发送一封邮件。
|
||
|
||
你可以在主页查看 NekoBox 的更新日志,也欢迎访问赞助页面来打钱支持 NekoBox。 更新日志和赞助商名单存储在独立部署的
|
||
Pocketbase 服务中。
|
||
|
||
## 开源协议
|
||
|
||
MIT License
|