Files
UploaderHui/部署文档.md
2026-04-18 17:41:47 +08:00

640 lines
15 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.
# NAS图片上传系统 - 部署文档
> **适用环境**群晖NAS + 公网服务器frp内网穿透
> **最后更新**2026-04-17
---
## 1. 部署前准备
### 1.1 你需要的东西
| 项目 | 说明 |
|------|------|
| 公网服务器 | 有公网IP的云服务器阿里云/腾讯云等最低配1核1G即可 |
| 群晖NAS | 已开启SSH能通过终端访问 |
| NAS存储路径 | 决定图片存放在哪个共享文件夹下 |
### 1.2 整体部署架构
```
用户手机/电脑
公网服务器(运行 frps
│ 端口7000frp通信、8080对外访问
▼ frp 内网穿透
群晖NAS运行 Flask + frpc
│ 端口5000Flask服务
NAS磁盘存储图片
```
**部署顺序:先配置服务器 → 再配置NAS → 最后验证**
### 1.3 项目文件清单
```
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. 公网服务器部署frps
> 服务器只需要运行 frp 服务端frps不需要安装Python或其他依赖。
### 2.1 购买服务器
| 配置项 | 建议 |
|--------|------|
| 系统 | **Ubuntu 22.04 LTS** 或 Debian 12 |
| 配置 | 1核1G内存就够了frp只做流量转发不吃资源 |
| 带宽 | 1-3Mbps即可传截图够用 |
| 地域 | 选国内(延迟低,速度快) |
### 2.2 SSH登录服务器
```bash
# 服务器购买后会得到公网IP和密码用SSH登录
ssh root@你的公网IP
```
> 首次登录会提示是否信任主机,输入 `yes`,然后输入密码。
### 2.3 下载并配置frps
> **版本说明**截至2026年4月frp最新稳定版为 **v0.68.1**。frp官方只提供GitHub下载没有apt/yum等包管理器安装方式。
**下载方式(任选一种能用的):**
**方式一:国内镜像加速(推荐)**
```bash
mkdir -p /opt/frp && cd /opt/frp
# ghproxy镜像
wget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
```
**方式二Gitee镜像**
```bash
mkdir -p /opt/frp && cd /opt/frp
wget https://gitee.com/mirrors/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
```
**方式三GitHub官方国外服务器或能翻墙**
```bash
mkdir -p /opt/frp && cd /opt/frp
wget https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
```
**方式四:自己电脑下载后传到服务器**
1. 在自己电脑浏览器打开https://github.com/fatedier/frp/releases/tag/v0.68.1
2. 下载 `frp_0.68.1_linux_amd64.tar.gz`
3. 通过群晖Web界面上传到NAS或用SCP传到服务器
```bash
scp frp_0.68.1_linux_amd64.tar.gz root@你的服务器IP:/opt/frp/
```
**方式五用curl代替wget有些服务器wget受限但curl能用**
```bash
mkdir -p /opt/frp && cd /opt/frp
curl -L -o frp.tar.gz https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
tar -xzf frp.tar.gz && mv frp_0.68.1_linux_amd64/* . && rm frp.tar.gz
```
**下载完成后继续:**
```bash
# 解压(如果上面方式五已经解压过就跳过)
tar -xzf frp_0.68.1_linux_amd64.tar.gz
mv frp_0.68.1_linux_amd64/* .
# 创建服务端配置文件
vi frps.toml
```
写入以下内容(**请修改密码**
```toml
# frp 服务端配置
# frp通信端口客户端通过此端口连接
bindPort = 7000
# 认证令牌(请改成你自己的强密码!客户端也要填一样的)
auth.token = "请改成你自己的强密码"
# 管理面板(可选,方便查看运行状态)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "请改成管理面板密码"
```
> ⚠️ **重要**`auth.token` 是frp的认证密码防止别人盗用你的服务器转发流量一定要改成强密码
### 2.4 开放防火墙端口
服务器需要开放以下端口:
| 端口 | 用途 | 在哪里开放 |
|------|------|-----------|
| 7000 | frp通信 | 云服务器安全组 |
| 7500 | frp管理面板可选 | 云服务器安全组 |
| 8080 | 网站对外访问 | 云服务器安全组 |
**操作步骤(以阿里云为例):**
1. 登录阿里云控制台
2. 进入 ECS → 实例 → 安全组
3. 添加入方向规则:
- 端口 7000/TCP授权对象 0.0.0.0/0
- 端口 7500/TCP授权对象 0.0.0.0/0如果需要管理面板
- 端口 8080/TCP授权对象 0.0.0.0/0
> 不同云服务商操作类似,在"安全组"或"防火墙"中添加规则即可。
### 2.5 启动frps
```bash
cd /opt/frp
./frps -c frps.toml
```
看到以下输出说明启动成功:
```
frps started successfully
```
### 2.6 设置frps开机自启
```bash
vi /etc/systemd/system/frps.service
```
写入以下内容(**注意修改路径**
```ini
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
启用并启动:
```bash
systemctl enable frps
systemctl start frps
# 查看运行状态
systemctl status frps
```
### 2.7 验证frps
打开浏览器访问 `http://公网IP:7500`输入管理面板账号密码能看到面板说明frps正常运行。
---
## 3. 群晖NAS上的部署步骤
### 3.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/
```
### 3.2 SSH登录群晖NAS
```bash
ssh your_admin@192.168.1.100
```
> 如果提示"connection refused",需要在群晖控制面板 → 终端机和SNMP → 开启SSH功能
### 3.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班/` 子文件夹中。建议使用群晖已有的共享文件夹路径。
### 3.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
```
### 3.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` 应该能看到上传页面。
### 3.6 验证上传功能
1. 打开 `http://NAS内网IP:5000`
2. 选择训练营和班级
3. 选择几张图片上传
4. 检查 `NAS_DATA_PATH` 目录下是否自动创建了对应的文件夹和图片文件
5. 检查统计.md是否正确生成
---
## 4. 配置frp内网穿透NAS端
> 详细原理请参考 [frp内网穿透_原理与部署指南.md](./frp内网穿透_原理与部署指南.md)
### 4.1 在NAS上安装frpc
```bash
# 下载frp根据NAS架构选择版本需和服务器端一致
# x86架构大多数群晖
mkdir -p /volume1/web/frp
cd /volume1/web/frp
# 以下任选一种参考服务器部署章节的5种下载方式
# 国内镜像(推荐):
wget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
# Gitee镜像
# wget https://gitee.com/mirrors/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
# curl方式
# curl -L -o frp.tar.gz https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
tar -xzf frp_0.68.1_linux_amd64.tar.gz
mv frp_0.68.1_linux_amd64/* .
```
### 4.2 创建frpc配置文件
```bash
vi frpc.toml
```
写入以下内容(**请替换为你自己的信息**
```toml
# frp 客户端配置
# 公网服务器地址改成你的服务器公网IP
serverAddr = "123.45.67.89"
serverPort = 7000
# 认证令牌(必须和服务端一致!)
auth.token = "请改成你自己的强密码"
# 图片上传网站代理
[[proxies]]
name = "nas-uploader"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000
remotePort = 8080
```
**参数说明:**
| 参数 | 含义 | 怎么填 |
|------|------|--------|
| serverAddr | 公网服务器IP | 你的云服务器公网IP |
| serverPort | 服务端通信端口 | 7000和服务端一致 |
| auth.token | 认证密码 | 和服务端填一样的 |
| localPort | NAS上Flask的端口 | 5000 |
| remotePort | 对外开放的端口 | 8080用户通过这个端口访问 |
### 4.3 启动frpc
```bash
cd /volume1/web/frp
./frpc -c frpc.toml
```
看到 `start proxy success` 说明连接成功!
### 4.4 验证公网访问
在手机或电脑上(使用**非内网网络**比如手机4G/5G访问
```
http://公网服务器IP:8080
```
如果能打开上传页面,说明整个链路通了!🎉
---
## 5. 设置开机自启(推荐)
### 5.1 服务器端frps自启
在服务器上第2节已经配置过确认一下
```bash
systemctl status frps
# 如果没运行:
systemctl enable frps && systemctl start frps
```
### 5.2 NAS端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` 替代,或者通过群晖的"任务计划"功能设置开机脚本。
### 5.3 NAS端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
```
### 5.4 使用群晖任务计划(替代方案)
如果systemd不可用可以通过群晖控制面板设置
1. 控制面板 → 任务计划 → 新增 → 触发的任务 → 用户自定义脚本
2. 常规:设置任务名称"启动图片上传服务"
3. 事件:开机
4. 任务设置用户账号选root脚本内容
```bash
#!/bin/bash
# 启动Flask服务
cd /volume1/web/nas-uploader
nohup python3 app.py > /volume1/web/nas-uploader/app.log 2>&1 &
# 启动frpc
cd /volume1/web/frp
nohup ./frpc -c frpc.toml > /volume1/web/frp/frpc.log 2>&1 &
```
---
## 6. 群晖Docker部署可选
如果你的群晖支持DockerContainer Manager套件可以用Docker部署Flask服务
### 6.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"]
```
### 6.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的存储目录挂载到容器内
---
## 7. 常见问题排查
### 7.1 页面打不开(内网)
```
检查步骤:
1. Flask服务是否在运行
→ systemctl status nas-uploader 或 ps aux | grep python
2. 端口是否被占用?
→ netstat -tlnp | grep 5000
3. 防火墙是否放行?
→ 群晖控制面板 → 安全性 → 防火墙 → 编辑规则
```
### 7.2 公网打不开
```
检查步骤:
1. frps是否在运行 → systemctl status frps
2. frpc是否在运行 → ps aux | grep frpc
3. frpc日志有无报错 → cat /volume1/web/frp/frpc.log
4. 公网服务器防火墙是否开放了7000和8080端口
→ 云服务器控制台 → 安全组
5. frp的token是否一致
→ 对比服务器frps.toml和NAS frpc.toml中的auth.token
```
### 7.3 上传失败
```
检查步骤:
1. NAS_DATA_PATH路径是否正确 → ls -la 路径
2. 目录是否有写入权限? → touch 路径/test && rm 路径/test
3. 磁盘空间是否充足? → df -h
4. 查看Flask日志 → cat /volume1/web/nas-uploader/app.log
```
### 7.4 图片上传后找不到文件
```
检查步骤:
1. 确认.env中的NAS_DATA_PATH路径
2. 查看该路径下是否生成了训练营文件夹
3. 文件夹名称格式必须是"训练营N期"
```
### 7.5 服务器frps启动失败
```
检查步骤:
1. 端口7000是否被占用 → netstat -tlnp | grep 7000
2. 配置文件格式是否正确? → cat /opt/frp/frps.toml
3. 查看详细错误 → ./frps -c frps.toml --log_level debug
```
---
## 8. 维护命令速查
### 服务器端
| 操作 | 命令 |
|------|------|
| 启动frps | `systemctl start frps` |
| 停止frps | `systemctl stop frps` |
| 重启frps | `systemctl restart frps` |
| 查看状态 | `systemctl status frps` |
| 查看日志 | `journalctl -u frps -f` |
| 查看管理面板 | 浏览器打开 `http://公网IP:7500` |
### NAS端
| 操作 | 命令 |
|------|------|
| 启动Flask | `systemctl start nas-uploader` |
| 停止Flask | `systemctl stop nas-uploader` |
| 重启Flask | `systemctl restart nas-uploader` |
| 启动frpc | `systemctl start frpc` |
| 停止frpc | `systemctl stop frpc` |
| 查看Flask日志 | `journalctl -u nas-uploader -f` |
| 查看frpc日志 | `journalctl -u frpc -f` |
| 查看存储目录 | `ls -la /volume1/photo/训练营图片` |
| 查看磁盘空间 | `df -h` |
| 手动更新统计 | `python3 -c "from app import update_statistics; update_statistics('训练营13期')"` |
---
## 9. 安全建议
- **当前版本无密码保护**,任何人知道网址都可以上传
- 建议不要将网址公开分享给无关人员
- 后续版本会添加访问密码功能
- 建议定期检查上传的文件,防止滥用
- 如果发现异常可以暂时停止Flask服务`sudo systemctl stop nas-uploader`
- frp的 `auth.token` 一定要用强密码,防止被别人利用