中文 | English
一个基于 Spring Boot 3(JDK 21)、SQLite 的轻量级文件存储与分享服务。支持登录会话、文件浏览/上传/下载、分享直链、基础安全头、可选 HTTPS,以及通过外部配置文件管理默认管理员账号。
本程序以 GNU AGPL-3.0 或更高版本(SPDX:AGPL-3.0-or-later)授权,全文见 LICENSE。通过网络使用本服务时,可在关于页获取源码:https://github.com/GuilingQiyu/StoreIt。
核心默认配置:
- 端口:59898
- 数据库:
./data/storeit.db(自动创建) - 存储根目录:
./storage/ - 默认管理员:
admin / authorized_users(可通过外部配置覆盖)
- UI 页面:
/、/login、/list(未登录访问云盘页面会由服务端直接重定向到/login) - 认证与会话:
POST /api/login、POST /api/logout、GET /api/user/status。同一 IP 与用户名 15 分钟内连续失败 5 次后暂时拒绝 - 文件:
GET /api/files?path=...、POST /api/upload(multipart)、受保护下载GET /storage/** - 在线预览:
GET /api/preview?path=...。图片(不含 SVG)、视频、音频、PDF 内联;HTML、SVG、XML 以text/plain返回,并附带script-src 'none'。视频支持 HTTP Range - 健康检查:
GET /actuator/health无需登录;其余 Actuator 端点不暴露 - 分享直链:
POST /api/share生成分享,公开下载GET /d/{token}(先确认文件可读,再原子扣减下载次数;文件已删除时不扣次)。GET /api/shares列出本人的链接,DELETE /api/shares/{id}撤销后立即失效 - 用户管理(仅管理员):
GET/POST /api/admin/users、PATCH /api/admin/users/{username}、POST /api/admin/users/{username}/password。用户名只能包含字母、数字、点、下划线和短横线 - 最近访问:
GET /api/files/recent。收藏:GET/POST /api/favorites、DELETE /api/favorites?path=。搜索:GET /api/files/search?q=。移动:POST /api/file/move - 存储用量:
GET /api/storage/usage;普通用户展示个人目录实际占用与配额,管理员展示整盘容量。storage_quota大于 0 时上传会校验配额,超出返回「存储配额不足」;0 表示不限额 - 安全:会话 Cookie 设置
HttpOnly/SameSite=Lax(app.ssl-enabled: true时附加Secure);Content-Security-Policy与X-Content-Type-Options、X-Frame-Options、Referrer-Policy等响应头;Strict-Transport-Security仅在 HTTPS 下下发;路径安全检查,防目录穿越 - 配置:classpath 中的
application.yml会先导入外部./config/application.yml(端口、SSL、数据源、存储目录、app.ssl-enabled),再导入./config/admin.yml(管理员口令;同名项以后者为准)
前置要求:JDK 21、Maven
- 构建:
mvn package(会运行测试,如需更新前端请先在frontend目录执行npm run export) - 运行:
java -jar target/storeit-2.0.0.jar
StoreIt 2.0.0 前端基于 Next.js 14、React 18、TypeScript、Tailwind CSS、shadcn/ui、TanStack Query 与 Zustand 全新重构,支持百 GB 级大文件多并发分片断点续传、可视化系统配置、右键快捷菜单与移动端响应式设计:
- 进入前端目录:
cd frontend - 安装依赖:
npm ci(或npm install) - 开发预览:
npm run dev(内置反向代理,开发时 API 自动代理至后端http://localhost:59898) - 构建并导出静态产物:
npm run export(执行静态导出并将静态资源自动同步到src/main/resources/static/,无缝嵌入单可执行 JAR)
可选:在 src/main/resources/application.yml 调整配置;或通过外部文件覆盖(适用于发布 JAR 部署):
- 复制示例到本地配置目录:
cp config/application.yml.example config/application.ymlcp config/admin.yml.example config/admin.yml
- 按需修改
config/*.yml,然后运行 jar。应用先读./config/application.yml,再读./config/admin.yml。后加载的文件覆盖同名项,因此管理员口令以admin.yml为准。
本项目通过 Spring Boot spring.config.import 支持从外部文件加载管理员用户名/密码,避免在仓库中存放明文:
- 外部文件路径:
./config/admin.yml - 示例内容:
app:
default-admin:
username: admin
password: your_secret_here
application.yml 已配置:
spring:
config:
import:
- optional:file:./config/application.yml
- optional:file:./config/admin.yml
仓库的 .gitignore 已忽略实际的 config/*.yml(保留 *.example),适合直接携带 release JAR 进行外部配置。
安全建议:务必修改默认凭据 内置默认管理员
admin / authorized_users仅为「开箱即用」,严禁在生产/公网环境直接使用。 部署前请通过外部配置覆盖为强口令,应用启动时会自动用新口令重算 BCrypt 哈希并同步到数据库:# config/admin.yml app: default-admin: username: your_admin password: <一段足够长的随机口令>补充加固建议:
- 启用 HTTPS:在
config/application.yml配置server.ssl.*并设app.ssl-enabled: true,会话 Cookie 会自动附加Secure,并下发 HSTS。- 置于反向代理之后:由 Nginx/Caddy 终止 TLS。应用已对同一 IP 与用户名做登录失败限流,代理上仍可再加一层。
- 拒绝内置口令启动:在
config/application.yml设置app.require-custom-admin: true后,若口令仍是admin / authorized_users,进程会拒绝启动。- 设置用户配额:
storage_quota(字节)大于 0 时,上传前会比较个人目录已占用与本次文件大小,超出则拒绝;0 表示不限额。管理员默认配额为 0。
- 页面:
GET /->static/index.html(支持#/files、#/recent、#/favorites、#/shares、#/admin、#/settings、#/about视图路由)GET /about->static/index.html(直接打开「关于」标签页)GET /login->static/login.htmlGET /list-> 重定向至/
- 认证:
POST /api/login(表单:username、password)POST /api/logoutGET /api/user/status(返回logged_in、username、role)
- 文件:
GET /api/files?path=...— 列出目录内容POST /api/upload— 单次上传文件(≤ 50 MB 及 0 字节文件,multipart/form-data,字段名:file,可选 directory)。配额不足时返回 400,error为「存储配额不足」POST /api/upload/init、POST /api/upload/chunk、GET /api/upload/status、POST /api/upload/complete、DELETE /api/upload/{uploadId}— 特大文件(> 50 MB,默认上限 100 GB)5 MB 分片并发上传、断点续传状态同步、合并与取消清理GET /storage/**— 已登录受保护下载(attachment)GET /api/preview?path=...— 已登录预览。图片(不含 SVG)、视频、音频、PDF 为内联真实类型;HTML、SVG、XML 及其他文本为text/plain,CSP 为script-src 'none'。视频支持 RangePOST /api/file/delete、POST /api/file/rename、POST /api/file/move、POST /api/folder/create— 删除 / 重命名 / 移动 / 新建文件夹GET /api/files/recent— 最近修改的文件GET /api/files/search?q=— 按文件名搜索GET/POST /api/favorites、DELETE /api/favorites?path=— 收藏列表、加入、取消GET /api/storage/usage— 存储用量(普通用户=个人占用/配额,管理员=整盘)
- 分享:
POST /api/share— 生成分享链接(请求体:{"filePath":"...","expireHours":720,"maxDownloads":null},expireHours=-1为永久,maxDownloads为空表示不限次数)GET /api/shares— 列出当前用户的分享DELETE /api/shares/{id}— 撤销本人的分享,之后GET /d/{token}立即失效GET /d/{token}— 公开下载(受有效期/下载次数限制)。文件仍可读时才原子扣减次数;文件已删除时返回「文件不存在」且不扣次
- 管理员:
GET /api/admin/users— 用户列表,不含口令哈希POST /api/admin/users— 开户,请求体{"username","password","storageQuota"},口令至少 8 位,配额 0 表示不限额PATCH /api/admin/users/{username}— 修改storageQuota和/或role(USER/ADMIN)。不能取消自己的管理员角色POST /api/admin/users/{username}/password— 重置口令GET /api/admin/config、POST /api/admin/config— 读取与更新外部配置文件(./config/application.yml与./config/admin.yml,支持可视化增量更新与 YAML 原文编辑,自动保留.bak/.bak.1两代备份)- 非管理员调用以上接口返回 403
- SQLite 数据库:
./data/storeit.db - 表:
users、sessions、file_shares(FlywayV1__init.sql),以及V2增加的角色、storage_quota、file_metadata - 每个 SQLite 连接执行
PRAGMA foreign_keys=ON,连接池最多 1 个连接 - 启动时会确保默认管理员存在;若配置中密码变更,会同步更新其哈希
- 支持在
server.ssl.*配置中启用证书(见application.yml注释) - 全局安全响应头通过
SecurityHeadersFilter添加 - 路径安全检查与登录拦截通过
AuthInterceptor、FileService.isSafePath实现
storage/— 文件存储根目录src/main/resources/static/— 静态资源(前端页面与脚本)src/main/resources/static/error/— 403 / 404 错误页src/main/resources/db/migration/— Flyway SQL 脚本config/application.yml— 外部应用配置(不入库,先于管理员配置加载)config/admin.yml— 外部管理员配置(不入库)
