390 lines
8.5 KiB
Markdown
390 lines
8.5 KiB
Markdown
# NAS图片上传系统 - 部署文档
|
||
|
||
> **适用环境**:群晖NAS + 公网服务器(frp内网穿透)
|
||
> **最后更新**:2026-04-17
|
||
|
||
---
|
||
|
||
## 1. 部署前准备
|
||
|
||
### 1.1 你需要的东西
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| 群晖NAS | 已开启SSH,能通过终端访问 |
|
||
| 公网服务器 | 有公网IP,已安装frps(frp服务端) |
|
||
| NAS存储路径 | 决定图片存放在哪个共享文件夹下 |
|
||
|
||
### 1.2 项目文件清单
|
||
|
||
部署前确认以下文件完整:
|
||
|
||
```
|
||
nas-uploader/
|
||
├── app.py ← Flask后端主程序
|
||
├── config.py ← 配置读取模块
|
||
├── .env.example ← 配置模板(需复制为.env)
|
||
├── requirements.txt ← Python依赖
|
||
├── start.sh ← 启动脚本
|
||
├── static/
|
||
│ ├── css/style.css ← 页面样式
|
||
│ ├── js/app.js ← 前端逻辑
|
||
│ └── img/ ← 图标资源(可选)
|
||
└── templates/
|
||
└── index.html ← 主页面
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 群晖NAS上的部署步骤
|
||
|
||
### 2.1 上传项目文件
|
||
|
||
**方法一:通过群晖网页上传**
|
||
|
||
1. 打开群晖 File Station
|
||
2. 进入你想存放项目的共享文件夹(如 `web`)
|
||
3. 上传整个 `nas-uploader` 文件夹
|
||
|
||
**方法二:通过SSH上传**
|
||
|
||
```bash
|
||
# 在你的电脑上执行(假设NAS内网IP为 192.168.1.100)
|
||
scp -r nas-uploader/ your_admin@192.168.1.100:/volume1/web/
|
||
```
|
||
|
||
### 2.2 SSH登录群晖NAS
|
||
|
||
```bash
|
||
ssh your_admin@192.168.1.100
|
||
```
|
||
|
||
> 如果提示"connection refused",需要在群晖控制面板 → 终端机和SNMP → 开启SSH功能
|
||
|
||
### 2.3 配置环境
|
||
|
||
```bash
|
||
# 进入项目目录(根据你的实际路径调整)
|
||
cd /volume1/web/nas-uploader
|
||
|
||
# 复制配置文件
|
||
cp .env.example .env
|
||
|
||
# 编辑配置文件
|
||
vi .env
|
||
```
|
||
|
||
**必须修改的配置项:**
|
||
|
||
```env
|
||
# 改成你实际的NAS存储路径,例如:
|
||
NAS_DATA_PATH=/volume1/photo/训练营图片
|
||
|
||
# 其他配置一般不需要改
|
||
PORT=5000
|
||
ALLOWED_EXTENSIONS=jpg,jpeg,png,gif,webp
|
||
MAX_FILES_COUNT=100
|
||
MAX_FILE_SIZE_MB=20
|
||
```
|
||
|
||
> 💡 **路径说明**:`NAS_DATA_PATH` 是图片存储的根目录,上传的图片会保存在这个目录下的 `训练营N期/X班/` 子文件夹中。建议使用群晖已有的共享文件夹路径。
|
||
|
||
### 2.4 安装Python依赖
|
||
|
||
群晖NAS自带Python 3,但可能缺少pip。按以下步骤操作:
|
||
|
||
```bash
|
||
# 检查Python版本
|
||
python3 --version
|
||
|
||
# 如果有pip,直接安装
|
||
pip3 install flask python-dotenv
|
||
|
||
# 如果提示权限问题
|
||
pip3 install flask python-dotenv --break-system-packages
|
||
|
||
# 如果没有pip,先安装
|
||
# 群晖DS718+等型号可以直接通过套件中心安装Python3
|
||
```
|
||
|
||
### 2.5 首次启动测试
|
||
|
||
```bash
|
||
cd /volume1/web/nas-uploader
|
||
python3 app.py
|
||
```
|
||
|
||
看到以下输出说明启动成功:
|
||
|
||
```
|
||
服务启动在 http://0.0.0.0:5000
|
||
* Running on http://127.0.0.1:5000
|
||
```
|
||
|
||
此时在浏览器访问 `http://NAS内网IP:5000` 应该能看到上传页面。
|
||
|
||
### 2.6 验证上传功能
|
||
|
||
1. 打开 `http://NAS内网IP:5000`
|
||
2. 选择训练营和班级
|
||
3. 选择几张图片上传
|
||
4. 检查 `NAS_DATA_PATH` 目录下是否自动创建了对应的文件夹和图片文件
|
||
5. 检查统计.md是否正确生成
|
||
|
||
---
|
||
|
||
## 3. 配置frp内网穿透
|
||
|
||
> 详细原理请参考 [frp内网穿透_原理与部署指南.md](./frp内网穿透_原理与部署指南.md)
|
||
|
||
### 3.1 在NAS上配置frpc
|
||
|
||
如果NAS上还没有frpc,先安装:
|
||
|
||
```bash
|
||
# 下载frp(根据NAS架构选择)
|
||
# x86架构(大多数群晖)
|
||
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
|
||
tar -xzf frp_0.61.1_linux_amd64.tar.gz
|
||
cd frp_0.61.1_linux_amd64
|
||
```
|
||
|
||
创建配置文件 `frpc.toml`:
|
||
|
||
```toml
|
||
serverAddr = "你的公网服务器IP"
|
||
serverPort = 7000
|
||
auth.token = "你的frp认证密码"
|
||
|
||
[[proxies]]
|
||
name = "nas-uploader"
|
||
type = "tcp"
|
||
localIP = "127.0.0.1"
|
||
localPort = 5000
|
||
remotePort = 8080
|
||
```
|
||
|
||
启动frpc:
|
||
|
||
```bash
|
||
./frpc -c frpc.toml
|
||
```
|
||
|
||
### 3.2 公网服务器上的frps配置
|
||
|
||
确保公网服务器上的 `frps.toml` 已配置好:
|
||
|
||
```toml
|
||
bindPort = 7000
|
||
auth.token = "你的frp认证密码" # 和frpc保持一致
|
||
```
|
||
|
||
### 3.3 验证公网访问
|
||
|
||
在手机或电脑上(使用非内网网络)访问:
|
||
|
||
```
|
||
http://公网服务器IP:8080
|
||
```
|
||
|
||
如果能打开上传页面,说明穿透配置成功。
|
||
|
||
---
|
||
|
||
## 4. 设置开机自启(推荐)
|
||
|
||
### 4.1 Flask服务自启
|
||
|
||
在NAS上创建systemd服务:
|
||
|
||
```bash
|
||
sudo vi /etc/systemd/system/nas-uploader.service
|
||
```
|
||
|
||
写入以下内容(**注意修改路径**):
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=NAS Image Uploader
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/volume1/web/nas-uploader
|
||
ExecStart=/usr/bin/python3 /volume1/web/nas-uploader/app.py
|
||
Restart=always
|
||
RestartSec=5s
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
启用服务:
|
||
|
||
```bash
|
||
sudo systemctl enable nas-uploader
|
||
sudo systemctl start nas-uploader
|
||
|
||
# 查看状态
|
||
sudo systemctl status nas-uploader
|
||
```
|
||
|
||
> ⚠️ **注意**:部分群晖型号可能不支持systemd,可以用 `supervisor` 替代,或者通过群晖的"任务计划"功能设置开机脚本。
|
||
|
||
### 4.2 frpc自启
|
||
|
||
```bash
|
||
sudo vi /etc/systemd/system/frpc.service
|
||
```
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=frp client
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
ExecStart=/volume1/web/frp/frpc -c /volume1/web/frp/frpc.toml
|
||
Restart=always
|
||
RestartSec=5s
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
```bash
|
||
sudo systemctl enable frpc
|
||
sudo systemctl start frpc
|
||
```
|
||
|
||
### 4.3 使用群晖任务计划(替代方案)
|
||
|
||
如果systemd不可用,可以通过群晖控制面板设置:
|
||
|
||
1. 控制面板 → 任务计划 → 新增 → 触发的任务 → 用户自定义脚本
|
||
2. 常规:设置任务名称"启动图片上传服务"
|
||
3. 事件:开机
|
||
4. 任务设置:用户账号选root,脚本内容:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
cd /volume1/web/nas-uploader
|
||
nohup python3 app.py > /volume1/web/nas-uploader/app.log 2>&1 &
|
||
cd /volume1/web/frp
|
||
nohup ./frpc -c frpc.toml > /volume1/web/frp/frpc.log 2>&1 &
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 群晖Docker部署(可选)
|
||
|
||
如果你的群晖支持Docker(Container Manager套件),可以用Docker部署:
|
||
|
||
### 5.1 创建Dockerfile
|
||
|
||
在项目根目录创建 `Dockerfile`:
|
||
|
||
```dockerfile
|
||
FROM python:3.11-slim
|
||
|
||
WORKDIR /app
|
||
|
||
COPY requirements.txt .
|
||
RUN pip install --no-cache-dir -r requirements.txt
|
||
|
||
COPY . .
|
||
|
||
EXPOSE 5000
|
||
|
||
CMD ["python3", "app.py"]
|
||
```
|
||
|
||
### 5.2 构建和运行
|
||
|
||
```bash
|
||
cd /volume1/web/nas-uploader
|
||
|
||
# 构建镜像
|
||
docker build -t nas-uploader .
|
||
|
||
# 运行容器
|
||
docker run -d \
|
||
--name nas-uploader \
|
||
--restart always \
|
||
-p 5000:5000 \
|
||
-v /volume1/photo/训练营图片:/app/data \
|
||
-e NAS_DATA_PATH=/app/data \
|
||
nas-uploader
|
||
```
|
||
|
||
> `-v` 参数将NAS的存储目录挂载到容器内
|
||
|
||
---
|
||
|
||
## 6. 常见问题排查
|
||
|
||
### 6.1 页面打不开
|
||
|
||
```
|
||
检查步骤:
|
||
1. Flask服务是否在运行?
|
||
→ systemctl status nas-uploader 或 ps aux | grep python
|
||
2. 端口是否被占用?
|
||
→ netstat -tlnp | grep 5000
|
||
3. 防火墙是否放行?
|
||
→ 群晖控制面板 → 安全性 → 防火墙 → 编辑规则
|
||
```
|
||
|
||
### 6.2 公网打不开
|
||
|
||
```
|
||
检查步骤:
|
||
1. frpc是否在运行? → ps aux | grep frpc
|
||
2. frpc日志有无报错? → cat /path/to/frpc.log
|
||
3. 公网服务器防火墙是否开放了8080端口?
|
||
4. frp的token是否一致?
|
||
```
|
||
|
||
### 6.3 上传失败
|
||
|
||
```
|
||
检查步骤:
|
||
1. NAS_DATA_PATH路径是否正确? → ls -la 路径
|
||
2. 目录是否有写入权限? → touch 路径/test && rm 路径/test
|
||
3. 磁盘空间是否充足? → df -h
|
||
4. 查看Flask日志 → cat /path/to/nas-uploader/app.log
|
||
```
|
||
|
||
### 6.4 图片上传后找不到文件
|
||
|
||
```
|
||
检查步骤:
|
||
1. 确认.env中的NAS_DATA_PATH路径
|
||
2. 查看该路径下是否生成了训练营文件夹
|
||
3. 文件夹名称格式必须是"训练营N期"
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 维护命令速查
|
||
|
||
| 操作 | 命令 |
|
||
|------|------|
|
||
| 启动服务 | `cd /volume1/web/nas-uploader && python3 app.py` |
|
||
| 停止服务 | `sudo systemctl stop nas-uploader` |
|
||
| 重启服务 | `sudo systemctl restart nas-uploader` |
|
||
| 查看日志 | `sudo journalctl -u nas-uploader -f` |
|
||
| 查看存储目录 | `ls -la $NAS_DATA_PATH` |
|
||
| 查看磁盘空间 | `df -h` |
|
||
| 手动更新统计 | `python3 -c "from app import update_statistics; update_statistics('训练营13期')"` |
|
||
|
||
---
|
||
|
||
## 8. 安全建议
|
||
|
||
- **当前版本无密码保护**,任何人知道网址都可以上传
|
||
- 建议不要将网址公开分享给无关人员
|
||
- 后续版本会添加访问密码功能
|
||
- 建议定期检查上传的文件,防止滥用
|
||
- 如果发现异常,可以暂时停止Flask服务:`sudo systemctl stop nas-uploader`
|