From 5c5d44f7a02ad77e4bd97c57cf5122694758f951 Mon Sep 17 00:00:00 2001 From: Nelson <1475262689@qq.com> Date: Sat, 18 Apr 2026 17:41:47 +0800 Subject: [PATCH] =?UTF-8?q?docker=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nas-uploader/Dockerfile | 12 ++ nas-uploader/docker-compose.yml | 15 ++ 部署文档.md | 368 +++++++++++++++++++++++++++----- 3 files changed, 336 insertions(+), 59 deletions(-) create mode 100644 nas-uploader/Dockerfile create mode 100644 nas-uploader/docker-compose.yml diff --git a/nas-uploader/Dockerfile b/nas-uploader/Dockerfile new file mode 100644 index 0000000..0d03d40 --- /dev/null +++ b/nas-uploader/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.11-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 5001 + +CMD ["python3", "app.py"] diff --git a/nas-uploader/docker-compose.yml b/nas-uploader/docker-compose.yml new file mode 100644 index 0000000..266c378 --- /dev/null +++ b/nas-uploader/docker-compose.yml @@ -0,0 +1,15 @@ +services: + nas-uploader: + build: . + container_name: nas-uploader + restart: always + ports: + - "5001:5001" + volumes: + - ${NAS_DATA_PATH:-/volume1/photo/训练营图片}:/app/data + environment: + - NAS_DATA_PATH=/app/data + - PORT=5001 + - ALLOWED_EXTENSIONS=jpg,jpeg,png,gif,webp + - MAX_FILES_COUNT=100 + - MAX_FILE_SIZE_MB=20 diff --git a/部署文档.md b/部署文档.md index 43e5a12..658f803 100644 --- a/部署文档.md +++ b/部署文档.md @@ -11,13 +11,31 @@ | 项目 | 说明 | |------|------| +| 公网服务器 | 有公网IP的云服务器(阿里云/腾讯云等),最低配1核1G即可 | | 群晖NAS | 已开启SSH,能通过终端访问 | -| 公网服务器 | 有公网IP,已安装frps(frp服务端) | | NAS存储路径 | 决定图片存放在哪个共享文件夹下 | -### 1.2 项目文件清单 +### 1.2 整体部署架构 -部署前确认以下文件完整: +``` +用户手机/电脑 + │ + ▼ +公网服务器(运行 frps) + │ 端口:7000(frp通信)、8080(对外访问) + │ + ▼ frp 内网穿透 + │ +群晖NAS(运行 Flask + frpc) + │ 端口:5000(Flask服务) + │ + ▼ +NAS磁盘存储图片 +``` + +**部署顺序:先配置服务器 → 再配置NAS → 最后验证** + +### 1.3 项目文件清单 ``` nas-uploader/ @@ -36,9 +54,175 @@ nas-uploader/ --- -## 2. 群晖NAS上的部署步骤 +## 2. 公网服务器部署(frps) -### 2.1 上传项目文件 +> 服务器只需要运行 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 上传项目文件 **方法一:通过群晖网页上传** @@ -53,7 +237,7 @@ nas-uploader/ scp -r nas-uploader/ your_admin@192.168.1.100:/volume1/web/ ``` -### 2.2 SSH登录群晖NAS +### 3.2 SSH登录群晖NAS ```bash ssh your_admin@192.168.1.100 @@ -61,7 +245,7 @@ ssh your_admin@192.168.1.100 > 如果提示"connection refused",需要在群晖控制面板 → 终端机和SNMP → 开启SSH功能 -### 2.3 配置环境 +### 3.3 配置环境 ```bash # 进入项目目录(根据你的实际路径调整) @@ -89,7 +273,7 @@ MAX_FILE_SIZE_MB=20 > 💡 **路径说明**:`NAS_DATA_PATH` 是图片存储的根目录,上传的图片会保存在这个目录下的 `训练营N期/X班/` 子文件夹中。建议使用群晖已有的共享文件夹路径。 -### 2.4 安装Python依赖 +### 3.4 安装Python依赖 群晖NAS自带Python 3,但可能缺少pip。按以下步骤操作: @@ -107,7 +291,7 @@ pip3 install flask python-dotenv --break-system-packages # 群晖DS718+等型号可以直接通过套件中心安装Python3 ``` -### 2.5 首次启动测试 +### 3.5 首次启动测试 ```bash cd /volume1/web/nas-uploader @@ -123,7 +307,7 @@ python3 app.py 此时在浏览器访问 `http://NAS内网IP:5000` 应该能看到上传页面。 -### 2.6 验证上传功能 +### 3.6 验证上传功能 1. 打开 `http://NAS内网IP:5000` 2. 选择训练营和班级 @@ -133,29 +317,49 @@ python3 app.py --- -## 3. 配置frp内网穿透 +## 4. 配置frp内网穿透(NAS端) > 详细原理请参考 [frp内网穿透_原理与部署指南.md](./frp内网穿透_原理与部署指南.md) -### 3.1 在NAS上配置frpc - -如果NAS上还没有frpc,先安装: +### 4.1 在NAS上安装frpc ```bash -# 下载frp(根据NAS架构选择) +# 下载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 +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/* . ``` -创建配置文件 `frpc.toml`: +### 4.2 创建frpc配置文件 + +```bash +vi frpc.toml +``` + +写入以下内容(**请替换为你自己的信息**): ```toml -serverAddr = "你的公网服务器IP" -serverPort = 7000 -auth.token = "你的frp认证密码" +# frp 客户端配置 +# 公网服务器地址(改成你的服务器公网IP) +serverAddr = "123.45.67.89" +serverPort = 7000 + +# 认证令牌(必须和服务端一致!) +auth.token = "请改成你自己的强密码" + +# 图片上传网站代理 [[proxies]] name = "nas-uploader" type = "tcp" @@ -164,36 +368,50 @@ localPort = 5000 remotePort = 8080 ``` -启动frpc: +**参数说明:** + +| 参数 | 含义 | 怎么填 | +|------|------|--------| +| 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 ``` -### 3.2 公网服务器上的frps配置 +看到 `start proxy success` 说明连接成功! -确保公网服务器上的 `frps.toml` 已配置好: +### 4.4 验证公网访问 -```toml -bindPort = 7000 -auth.token = "你的frp认证密码" # 和frpc保持一致 -``` - -### 3.3 验证公网访问 - -在手机或电脑上(使用非内网网络)访问: +在手机或电脑上(使用**非内网网络**,比如手机4G/5G)访问: ``` http://公网服务器IP:8080 ``` -如果能打开上传页面,说明穿透配置成功。 +如果能打开上传页面,说明整个链路通了!🎉 --- -## 4. 设置开机自启(推荐) +## 5. 设置开机自启(推荐) -### 4.1 Flask服务自启 +### 5.1 服务器端:frps自启 + +在服务器上(第2节已经配置过,确认一下): + +```bash +systemctl status frps +# 如果没运行: +systemctl enable frps && systemctl start frps +``` + +### 5.2 NAS端:Flask服务自启 在NAS上创建systemd服务: @@ -231,7 +449,7 @@ sudo systemctl status nas-uploader > ⚠️ **注意**:部分群晖型号可能不支持systemd,可以用 `supervisor` 替代,或者通过群晖的"任务计划"功能设置开机脚本。 -### 4.2 frpc自启 +### 5.3 NAS端:frpc自启 ```bash sudo vi /etc/systemd/system/frpc.service @@ -257,7 +475,7 @@ sudo systemctl enable frpc sudo systemctl start frpc ``` -### 4.3 使用群晖任务计划(替代方案) +### 5.4 使用群晖任务计划(替代方案) 如果systemd不可用,可以通过群晖控制面板设置: @@ -268,19 +486,22 @@ sudo systemctl start frpc ```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 & ``` --- -## 5. 群晖Docker部署(可选) +## 6. 群晖Docker部署(可选) -如果你的群晖支持Docker(Container Manager套件),可以用Docker部署: +如果你的群晖支持Docker(Container Manager套件),可以用Docker部署Flask服务: -### 5.1 创建Dockerfile +### 6.1 创建Dockerfile 在项目根目录创建 `Dockerfile`: @@ -299,7 +520,7 @@ EXPOSE 5000 CMD ["python3", "app.py"] ``` -### 5.2 构建和运行 +### 6.2 构建和运行 ```bash cd /volume1/web/nas-uploader @@ -321,9 +542,9 @@ docker run -d \ --- -## 6. 常见问题排查 +## 7. 常见问题排查 -### 6.1 页面打不开 +### 7.1 页面打不开(内网) ``` 检查步骤: @@ -335,27 +556,30 @@ docker run -d \ → 群晖控制面板 → 安全性 → 防火墙 → 编辑规则 ``` -### 6.2 公网打不开 +### 7.2 公网打不开 ``` 检查步骤: -1. frpc是否在运行? → ps aux | grep frpc -2. frpc日志有无报错? → cat /path/to/frpc.log -3. 公网服务器防火墙是否开放了8080端口? -4. frp的token是否一致? +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 ``` -### 6.3 上传失败 +### 7.3 上传失败 ``` 检查步骤: 1. NAS_DATA_PATH路径是否正确? → ls -la 路径 2. 目录是否有写入权限? → touch 路径/test && rm 路径/test 3. 磁盘空间是否充足? → df -h -4. 查看Flask日志 → cat /path/to/nas-uploader/app.log +4. 查看Flask日志 → cat /volume1/web/nas-uploader/app.log ``` -### 6.4 图片上传后找不到文件 +### 7.4 图片上传后找不到文件 ``` 检查步骤: @@ -364,26 +588,52 @@ docker run -d \ 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 +``` + --- -## 7. 维护命令速查 +## 8. 维护命令速查 + +### 服务器端 | 操作 | 命令 | |------|------| -| 启动服务 | `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` | +| 启动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期')"` | --- -## 8. 安全建议 +## 9. 安全建议 - **当前版本无密码保护**,任何人知道网址都可以上传 - 建议不要将网址公开分享给无关人员 - 后续版本会添加访问密码功能 - 建议定期检查上传的文件,防止滥用 - 如果发现异常,可以暂时停止Flask服务:`sudo systemctl stop nas-uploader` +- frp的 `auth.token` 一定要用强密码,防止被别人利用