# NAS-File-Search
**Repository Path**: SpringShaw/NAS-File-Search
## Basic Information
- **Project Name**: NAS-File-Search
- **Description**: 面向 NAS 的文件检索工具,支持按文件名与文档内容快速搜索,帮助在局域网存储中定位目标文件。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-23
- **Last Updated**: 2026-06-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🔍 NAS-File-Search
[English](./README.en.md) | **简体中文**
一个跑在 Docker 里的 **NAS 全局文件搜索工具**,支持文件名模糊搜索、文本文件全文内容搜索、多目录配置与排除过滤,自带 Apple 风格 Web 界面,**自动生成图片缩略图**,桌面和手机浏览器都能用。内置可选 API Key 认证、IP 速率限制与路径越界防护,公网部署也安心。
## 界面预览
| 主界面 | 设置 |
|:--:|:--:|
|
|
|
## 功能特性
### 🔎 文件搜索
- 基于 SQLite 的文件名 / 路径模糊匹配,毫秒级响应
- 基于 Whoosh 的全文内容搜索,覆盖 40+ 种文本文件(代码、配置、文档等)
- 搜索结果高亮匹配片段,分页加载
- LIKE 通配符已转义,搜索 `%` `_` 等字符不会误匹配
### 📁 多目录管理
- Web 界面添加 / 删除搜索目录,支持排除子目录(如 `.git`、`node_modules`)
- 按文件大小过滤(最小 / 最大)
- 删除目录时自动清理对应缩略图缓存
### 🗂️ 8 大文件分类
- 图片 / 视频 / 文档 / 日志 / 脚本 / 压缩包 / 音频 / 其他,一键筛选
- 自动统计各分类文件数与占用空间
- 分类筛选不影响后端搜索契约
### 🖼️ 图片缩略图
- 自动生成并缓存图片缩略图预览
- 懒加载,滚动到可视区才请求
- 防解压炸弹(限制最大像素数),仅允许图片扩展名
- 路径强制限定在挂载目录子树内,杜绝任意文件读取
### 📊 索引进度
- 实时显示重建索引进度与当前正在处理的文件
- 大量文件也能看清进度
- 后台线程构建,不阻塞搜索
### 🌐 中英文界面
- 根据浏览器语言自动选择中文或英文界面
- 中文浏览器默认显示中文,其他语言浏览器默认显示英文
- 顶部一键切换语言,选择记忆在浏览器本地
### 🔒 安全防护
- 可选 API Key 认证(环境变量配置,留空则不启用)
- 基于 IP 的速率限制,防止滥用与资源耗尽
- 路径越界防护与 XSS 消毒,公网部署也安全
## 快速开始
### Docker Compose(推荐)
```bash
git clone https://github.com/SpringShaw/NAS-File-Search.git
cd NAS-File-Search
docker compose up -d --build
```
访问 `http://localhost:8083`。
> 首次启动后在 Web 界面的「设置」中添加要搜索的宿主机目录(如 `/mnt/nas/photos`),再点「重建索引」。
### 本地开发
```bash
# 前端
cd frontend
npm install
npm run dev # 开发服务器,默认 5173
# 后端
cd backend
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8083
```
### 裸机部署(无 Docker)
不想用 Docker 时,可直接在宿主机运行。一键脚本:
```bash
./run.sh
```
脚本会自动构建前端、安装后端依赖,并以**裸机模式**启动(`NAS_HOST_PREFIX` 置空,直接使用真实绝对路径,无需 `/nas/host` 前缀)。
手动运行等价于:
```bash
# 1. 构建前端(产物输出到 backend/static)
cd frontend && npm install && npm run build && cd ..
# 2. 安装后端依赖(建议用虚拟环境)
cd backend && pip install -r requirements.txt
# 3. 以裸机模式启动:前缀置空,直接使用真实路径
NAS_HOST_PREFIX="" DATA_DIR="$(pwd)/../data" uvicorn app.main:app --host 0.0.0.0 --port 8083
```
启动后访问 `http://localhost:8083`,在「设置」中添加要搜索的真实目录(如 `/mnt/nas/photos`,**裸机模式直接填真实路径**,无需加前缀)。
> 让服务常驻后台可用 `systemd` / `nohup` / `supervisor` 等托管 `uvicorn` 进程。
## 配置说明
| 环境变量 | 默认值 | 说明 |
|---------|--------|------|
| HOST | 0.0.0.0 | 监听地址 |
| PORT | 8083 | 监听端口 |
| DATA_DIR | /app/data | 数据存储目录(数据库、索引、缩略图) |
| API_KEY | (空) | API Key 认证,留空不启用;公网部署建议设置长随机串 |
| RATE_LIMIT | 120 | 每个 IP 在 RATE_WINDOW 秒内最大请求数,0 禁用 |
| RATE_WINDOW | 60 | 速率限制窗口(秒) |
| NAS_HOST_PREFIX | /nas/host | 宿主机路径前缀。Docker 默认 `/nas/host`;**裸机部署设为空** 直接用真实路径 |
Docker 部署时,宿主机根目录 `/` 以只读方式挂载到容器 `/nas/host`,Web 界面中添加目录时使用宿主机原始路径即可,程序自动转换。如需收窄挂载范围,可把 `/:/nas/host:ro` 改为挂载具体子目录。
## 技术栈
| 层 | 技术 |
|---|------|
| 后端 | Python 3.11 + FastAPI |
| 搜索 | SQLite(文件名) + Whoosh(全文) |
| 前端 | Vue 3 + Vite + TailwindCSS |
| 部署 | Docker / Docker Compose(`python:3.11-slim` 基础镜像) |
## API 接口
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/search?q=&type=&page=&size= | 搜索文件 |
| GET | /api/stats | 索引统计信息 |
| GET | /api/dirs | 获取目录列表 |
| POST | /api/dirs | 添加搜索目录 |
| DELETE | /api/dirs/{id} | 删除目录 |
| POST | /api/index/rebuild | 触发索引重建 |
| GET | /api/index/status | 索引进度 |
| GET | /api/thumbnail?path= | 获取图片缩略图 |
| GET | /api/file-types | 获取文件分类配置 |
## 项目结构
```
NAS-File-Search/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI 入口 & API 路由
│ │ ├── config.py # 环境变量 & 文件分类配置
│ │ ├── models.py # SQLite 数据库模型
│ │ ├── indexer.py # 文件索引 & 缩略图生成
│ │ ├── search.py # Whoosh 全文搜索
│ │ └── security.py # API Key 认证 & 速率限制
│ ├── static/ # 前端构建产物(vite build 输出)
│ └── requirements.txt # Python 依赖
├── frontend/
│ ├── src/
│ │ ├── App.vue # 主页面组件
│ │ ├── components/ # SearchBar / SearchResults / SettingsPanel / TypeFilter / IndexStatus
│ │ ├── services/api.js # 后端 API 封装
│ │ └── i18n.js # 中英文双语模块
│ ├── index.html # Vite 入口 HTML
│ ├── package.json
│ ├── tailwind.config.js # TailwindCSS 配置
│ └── vite.config.js
├── docker-compose.yml # Docker Compose 部署配置
├── Dockerfile # Docker 镜像构建
├── deploy.sh # 前端构建 + Docker 部署脚本
├── run.sh # 裸机部署一键脚本
├── .gitignore
├── LICENSE # MIT
└── README.md / README.en.md # 中英文文档
```
## 特点
- 🐳 Docker 一键部署,宿主机目录只读挂载,零侵入
- 🎨 Apple 风格简洁界面,响应式适配桌面与移动端
- 🔒 数据完全留在本地,索引内容不上传任何服务器
- 🌐 中英文双语,自动识别浏览器语言
## License
[MIT](./LICENSE)