Add Dockerfile, docker-compose.yml, .dockerignore, .env.example, Makefile docker targets, and README/CHANGELOG docs.
133 lines
5.7 KiB
Markdown
133 lines
5.7 KiB
Markdown
# yDropbox
|
||
|
||
yDropbox 是一个自托管的轻量级文件存储服务(灵感来自 Dropbox),使用 Go 编写,编译为单一静态二进制文件,零外部依赖。它提供一个 Web 界面用于上传、管理、下载文件,并支持通过受密码保护和可过期的分享链接将文件分享给他人。
|
||
|
||
## 特性
|
||
|
||
- **单一二进制文件**:使用 `modernc.org/sqlite`(纯 Go 实现的 SQLite),无需 CGO,无需外部数据库或运行时依赖。
|
||
- **工作区(Workspace)模型**:文件存储在工作区下的 `inbox/` 与 `outbox/` 两个目录中,文件元数据保存在 `.ydropbox/db.sqlite`。
|
||
- **磁盘扫描同步**:内置扫描器每 10 秒扫描工作区目录,将磁盘上的新增文件登记进数据库,并移除已被删除文件的元数据。这意味着你也可以直接把文件放进目录,它们会被自动纳入管理。
|
||
- **令牌认证**:服务端通过访问令牌(`--token` 或环境变量 `YDROPBOX_TOKEN`)保护,Web 端登录后使用 HttpOnly、Secure 的会话 Cookie。
|
||
- **分享链接**:可为任意文件生成公开分享链接,支持可选密码保护与过期时间。
|
||
- **基础防护**:登录与分享密码均带有失败次数限制(5 次失败后锁定 60 秒),分享密码使用 bcrypt 哈希存储。
|
||
- **现代 Web UI**:基于 Alpine.js 的前端,支持拖拽上传、Toast 提示与响应式布局。
|
||
|
||
## 构建与运行
|
||
|
||
### 前置要求
|
||
|
||
- Go 1.25+
|
||
|
||
### 构建
|
||
|
||
```bash
|
||
make build
|
||
```
|
||
|
||
该命令会生成名为 `yDropbox` 的静态二进制文件(关闭 CGO)。
|
||
|
||
### 运行
|
||
|
||
```bash
|
||
./yDropbox --addr 127.0.0.1:8999 --workspace ./workspace --token YOUR_SECRET_TOKEN
|
||
```
|
||
|
||
或使用环境变量提供令牌:
|
||
|
||
```bash
|
||
export YDROPBOX_TOKEN=YOUR_SECRET_TOKEN
|
||
./yDropbox --workspace ./workspace
|
||
```
|
||
|
||
启动时会自动创建 `workspace/inbox`、`workspace/outbox` 与 `workspace/.ydropbox` 目录。
|
||
|
||
### 其他命令
|
||
|
||
```bash
|
||
make test # 运行测试 (go test ./...)
|
||
make vet # 静态检查 (go vet ./...)
|
||
make clean # 删除二进制文件
|
||
```
|
||
|
||
## Docker 部署
|
||
|
||
项目提供了 `Dockerfile` 与 `docker-compose.yml`,将编译产物打包为单一镜像(前端资源已通过 `go:embed` 内嵌,SQLite 为纯 Go 实现,镜像无外部依赖)。
|
||
|
||
### 使用 Docker Compose(推荐)
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
# 编辑 .env,设置 YDROPBOX_TOKEN 为一个高强度随机字符串
|
||
docker compose up -d --build
|
||
```
|
||
|
||
服务启动后监听 `8999` 端口,文件与数据库持久化在名为 `ydropbox-data` 的卷中。
|
||
|
||
### 仅使用 Docker
|
||
|
||
```bash
|
||
docker build -t ydropbox .
|
||
docker run -d --name ydropbox \
|
||
-p 8999:8999 \
|
||
-e YDROPBOX_TOKEN=YOUR_SECRET_TOKEN \
|
||
-v "$(pwd)/workspace:/app/workspace" \
|
||
ydropbox
|
||
```
|
||
|
||
> 注意:必须通过 `-e YDROPBOX_TOKEN=...` 或 `--token` 提供访问令牌,否则服务启动会失败(与本地运行一致)。
|
||
|
||
## 配置
|
||
|
||
| 参数 / 环境变量 | 说明 | 默认值 |
|
||
| ---------------------- | --------------------------------- | ---------------- |
|
||
| `--addr` | HTTP 监听地址 | `127.0.0.1:8999` |
|
||
| `--workspace` | 工作区目录(文件与数据库存放处) | `./workspace` |
|
||
| `--token` / `YDROPBOX_TOKEN` | 访问令牌(必填,用于登录校验) | 无(必须提供) |
|
||
|
||
## 使用
|
||
|
||
1. 在浏览器打开 `http://<addr>/`,使用启动时的令牌登录。
|
||
2. 在 `inbox` / `outbox` 面板中通过按钮或拖拽上传文件。
|
||
3. 点击下载 / 删除管理文件。
|
||
4. 点击分享生成链接;可在创建时设置密码与过期时间,链接形如 `/s/<token>`。
|
||
|
||
## HTTP API
|
||
|
||
所有受保护接口均需在请求中携带登录后获得的 `ydropbox_session` Cookie。
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
| ------ | ------------------------------- | -------------------------------------- |
|
||
| POST | `/api/login` | 使用令牌登录(`{"token": "..."}`) |
|
||
| POST | `/api/logout` | 注销当前会话 |
|
||
| POST | `/api/upload` | 上传文件(`multipart/form-data` 字段 `file`) |
|
||
| GET | `/api/files?dir=inbox\|outbox` | 列出指定目录下的文件 |
|
||
| GET | `/api/files/{id}/download` | 下载指定文件 |
|
||
| DELETE | `/api/files/{id}` | 删除指定文件 |
|
||
| POST | `/api/files/{id}/share` | 创建分享链接(可选 `password`、`expires_in_hours`) |
|
||
| GET | `/api/shares` | 列出所有分享链接 |
|
||
| DELETE | `/api/shares/{id}` | 删除指定分享链接 |
|
||
| GET | `/s/{token}` | 访问分享链接(受密码保护时显示表单) |
|
||
| POST | `/s/{token}` | 提交分享链接密码 |
|
||
|
||
### 限制说明
|
||
|
||
- 单次上传文件大小上限为 **100 MiB**。
|
||
- 会话有效期为 7 天,登录失败 5 次后锁定 60 秒。
|
||
- 分享链接过期后再次访问会被自动删除。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
cmd/ydropbox/main.go # 程序入口、命令行参数解析
|
||
internal/app/ # 应用装配(数据库、扫描器、HTTP 服务)
|
||
internal/server/ # HTTP 路由、认证、文件与分享处理、中间件
|
||
internal/store/ # SQLite 存储层(文件与分享元数据)
|
||
internal/scanner/ # 工作区目录扫描与元数据同步
|
||
web/ # 前端静态资源(HTML/CSS/JS,Alpine.js)
|
||
tests/ # 集成测试
|
||
```
|
||
|
||
## 许可证
|
||
|
||
本项目仅供学习与自用部署场景,请自行负责数据安全与访问控制。
|