# NAS图片上传系统 - 部署文档 > **适用环境**:群晖NAS + 公网服务器(frp内网穿透) > **最后更新**:2026-04-17 --- ## 1. 部署前准备 ### 1.1 你需要的东西 | 项目 | 说明 | |------|------| | 公网服务器 | 有公网IP的云服务器(阿里云/腾讯云等),最低配1核1G即可 | | 群晖NAS | 已开启SSH,能通过终端访问 | | NAS存储路径 | 决定图片存放在哪个共享文件夹下 | ### 1.2 整体部署架构 ``` 用户手机/电脑 │ ▼ 公网服务器(运行 frps) │ 端口:7000(frp通信)、8080(对外访问) │ ▼ frp 内网穿透 │ 群晖NAS(运行 Flask + frpc) │ 端口:5000(Flask服务) │ ▼ 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部署(可选) 如果你的群晖支持Docker(Container 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` 一定要用强密码,防止被别人利用