Files
XingfenD 1f8529badc feat: add Docker deployment support
Add Dockerfile, docker-compose.yml, .dockerignore, .env.example, Makefile docker targets, and README/CHANGELOG docs.
2026-08-27 15:32:47 +08:00

133 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/ # 集成测试
```
## 许可证
本项目仅供学习与自用部署场景,请自行负责数据安全与访问控制。