整理仓库:扩展 gitignore、归档文档、清理冗余 Dockerfile
- .gitignore 新增忽略 .idea/、videos/、*.tar.gz、*.csproj.user、db 运行时文件 - 根目录 15 个中文运维 md 归档到 docs/ - 删除无部署脚本引用的 Dockerfile 与 Dockerfile-arm(保留 Dockerfile.prod) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+17
-1
@@ -1,7 +1,23 @@
|
|||||||
|
# 构建产物
|
||||||
obj
|
obj
|
||||||
bin
|
bin
|
||||||
.vs
|
|
||||||
logs
|
logs
|
||||||
upload
|
upload
|
||||||
data1
|
data1
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vs
|
||||||
|
.idea/
|
||||||
|
*.csproj.user
|
||||||
|
|
||||||
|
# 抖音视频下载目录(本地数据,禁止入库)
|
||||||
|
videos/
|
||||||
|
|
||||||
|
# 构建打包产物
|
||||||
|
*.tar.gz
|
||||||
|
|
||||||
|
# SQLite 数据库及日志(仅忽略实例数据,不忽略迁移脚本)
|
||||||
/db/*.sqlite
|
/db/*.sqlite
|
||||||
|
/db/*.db-journal
|
||||||
|
/db/*.db-wal
|
||||||
|
/db/*.db-shm
|
||||||
|
|||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
|
|
||||||
WORKDIR /app
|
|
||||||
EXPOSE 10101
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
ENV ASPNETCORE_URLS http://*:10101
|
|
||||||
ENTRYPOINT ["dotnet", "dy.net.dll"]
|
|
||||||
ENV TZ=Asia/Shanghai
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8 AS base
|
|
||||||
WORKDIR /app
|
|
||||||
EXPOSE 10101
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
ENV ASPNETCORE_URLS http://*:10101
|
|
||||||
ENTRYPOINT ["dotnet", "dy.net.dll"]
|
|
||||||
ENV TZ=Asia/Shanghai
|
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
# Docker 构建 403 Forbidden 错误解决方案
|
||||||
|
|
||||||
|
## 当前问题
|
||||||
|
|
||||||
|
**错误信息**:
|
||||||
|
```
|
||||||
|
403 Forbidden from https://dockerhub.azk8s.cn/v2/library/node/manifests/18-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因**:
|
||||||
|
- 某些镜像加速器返回 403,可能是需要认证或已限制访问
|
||||||
|
- 网络环境可能有限制
|
||||||
|
|
||||||
|
## 🚀 解决方案(按推荐顺序)
|
||||||
|
|
||||||
|
### 方案一:移除有问题的镜像源,只保留阿里云(最简单)
|
||||||
|
|
||||||
|
**已更新配置**:只保留阿里云镜像源
|
||||||
|
|
||||||
|
**操作步骤**:
|
||||||
|
1. **重启 Docker Desktop**(必须)
|
||||||
|
- 完全退出 Docker Desktop
|
||||||
|
- 重新启动
|
||||||
|
|
||||||
|
2. **尝试构建**
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案二:手动拉取镜像(推荐)
|
||||||
|
|
||||||
|
如果构建时拉取失败,可以尝试手动拉取:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 尝试手动拉取 node 镜像(会使用配置的镜像源)
|
||||||
|
docker pull node:18-alpine
|
||||||
|
|
||||||
|
# 如果成功,再拉取其他镜像
|
||||||
|
docker pull mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
docker pull mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
|
||||||
|
# 然后再构建(此时会使用本地已拉取的镜像)
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案三:使用阿里云专属加速器(最稳定)
|
||||||
|
|
||||||
|
如果你有阿里云账号:
|
||||||
|
|
||||||
|
1. **登录阿里云容器镜像服务**
|
||||||
|
- 访问:https://cr.console.aliyun.com/
|
||||||
|
- 登录你的阿里云账号
|
||||||
|
|
||||||
|
2. **获取专属加速地址**
|
||||||
|
- 进入 "镜像加速器" 页面
|
||||||
|
- 复制你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
|
||||||
|
|
||||||
|
3. **更新 Docker 配置**
|
||||||
|
```bash
|
||||||
|
cat > ~/.docker/daemon.json << EOF
|
||||||
|
{
|
||||||
|
"builder": {
|
||||||
|
"gc": {
|
||||||
|
"defaultKeepStorage": "20GB",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"experimental": false,
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://你的专属地址.mirror.aliyuncs.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **重启 Docker Desktop**
|
||||||
|
|
||||||
|
5. **重新构建**
|
||||||
|
|
||||||
|
### 方案四:配置 Docker Desktop 代理(如果有代理)
|
||||||
|
|
||||||
|
如果你有可用的 HTTP/HTTPS 代理:
|
||||||
|
|
||||||
|
1. **打开 Docker Desktop 设置**
|
||||||
|
- 点击状态栏 Docker 图标 → Settings
|
||||||
|
|
||||||
|
2. **配置代理**
|
||||||
|
- 进入 "Resources" → "Proxies"
|
||||||
|
- 启用 "Manual proxy configuration"
|
||||||
|
- 填写代理地址和端口(例如:`127.0.0.1:7890`)
|
||||||
|
- 点击 "Apply & Restart"
|
||||||
|
|
||||||
|
3. **移除镜像加速器配置**(使用代理时不需要)
|
||||||
|
```bash
|
||||||
|
cat > ~/.docker/daemon.json << EOF
|
||||||
|
{
|
||||||
|
"builder": {
|
||||||
|
"gc": {
|
||||||
|
"defaultKeepStorage": "20GB",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"experimental": false
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **重启 Docker Desktop**
|
||||||
|
|
||||||
|
5. **重新构建**
|
||||||
|
|
||||||
|
### 方案五:使用 VPN 或科学上网工具
|
||||||
|
|
||||||
|
如果你有 VPN 或科学上网工具:
|
||||||
|
|
||||||
|
1. **启动 VPN/科学上网工具**
|
||||||
|
2. **配置系统代理**(如果工具支持)
|
||||||
|
3. **在 Docker Desktop 中配置代理**(参考方案四)
|
||||||
|
4. **重新构建**
|
||||||
|
|
||||||
|
### 方案六:跳过前端构建,只构建后端(临时方案)
|
||||||
|
|
||||||
|
如果前端构建一直失败,可以临时跳过前端构建:
|
||||||
|
|
||||||
|
1. **修改 Dockerfile.prod**,注释掉前端构建部分
|
||||||
|
2. **只构建后端**
|
||||||
|
3. **前端可以单独部署或后续再处理**
|
||||||
|
|
||||||
|
**注意**:这不是推荐方案,因为前端需要包含在镜像中。
|
||||||
|
|
||||||
|
### 方案七:在飞牛 NAS 上直接构建
|
||||||
|
|
||||||
|
如果本地构建一直失败,可以考虑:
|
||||||
|
|
||||||
|
1. **将项目文件上传到飞牛 NAS**
|
||||||
|
2. **通过 SSH 连接到飞牛 NAS**
|
||||||
|
3. **在 NAS 上直接构建**(NAS 的网络环境可能不同)
|
||||||
|
|
||||||
|
## 🔍 诊断命令
|
||||||
|
|
||||||
|
运行以下命令帮助诊断:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 检查当前镜像源配置
|
||||||
|
docker info | grep -A 10 "Registry Mirrors"
|
||||||
|
|
||||||
|
# 2. 测试拉取镜像
|
||||||
|
docker pull node:18-alpine
|
||||||
|
|
||||||
|
# 3. 查看 Docker 日志(如果有错误)
|
||||||
|
docker system events
|
||||||
|
|
||||||
|
# 4. 检查网络连接
|
||||||
|
curl -I https://registry.cn-hangzhou.aliyuncs.com/v2/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 当前配置
|
||||||
|
|
||||||
|
已更新 `~/.docker/daemon.json`,只保留阿里云镜像源:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://registry.cn-hangzhou.aliyuncs.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**重要**:需要重启 Docker Desktop 才能生效!
|
||||||
|
|
||||||
|
## 🎯 推荐操作顺序
|
||||||
|
|
||||||
|
1. ✅ **先试方案一**:重启 Docker Desktop,使用更新后的配置
|
||||||
|
2. 如果还不行,**试方案二**:手动拉取镜像
|
||||||
|
3. 如果还不行,**试方案三**:配置阿里云专属加速器
|
||||||
|
4. 如果还不行,**试方案四**:配置代理(如果有)
|
||||||
|
5. 最后考虑**方案七**:在 NAS 上构建
|
||||||
|
|
||||||
@@ -0,0 +1,394 @@
|
|||||||
|
# Mac M1 芯片环境安装指南
|
||||||
|
|
||||||
|
本文档详细说明如何在 Mac M1 芯片上安装构建 dysync.net 项目所需的环境。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 需要安装的工具
|
||||||
|
|
||||||
|
1. **Docker Desktop** - 用于构建和运行 Docker 镜像
|
||||||
|
2. **.NET 6.0 SDK** - 用于构建后端项目
|
||||||
|
3. **Node.js 和 pnpm** - 用于构建前端项目
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐳 1. 安装 Docker Desktop
|
||||||
|
|
||||||
|
### 方法一:使用 Homebrew(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 安装 Homebrew(如果还没有)
|
||||||
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
|
||||||
|
# 2. 使用 Homebrew 安装 Docker Desktop
|
||||||
|
brew install --cask docker
|
||||||
|
|
||||||
|
# 3. 启动 Docker Desktop
|
||||||
|
open -a Docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法二:直接下载安装
|
||||||
|
|
||||||
|
1. **访问 Docker 官网**
|
||||||
|
- 打开浏览器访问:https://www.docker.com/products/docker-desktop
|
||||||
|
- 或直接下载:https://desktop.docker.com/mac/main/arm64/Docker.dmg
|
||||||
|
|
||||||
|
2. **安装 Docker Desktop**
|
||||||
|
- 下载完成后,双击 `Docker.dmg` 文件
|
||||||
|
- 将 Docker 图标拖拽到 Applications 文件夹
|
||||||
|
- 在 Applications 中找到 Docker,双击启动
|
||||||
|
|
||||||
|
3. **首次启动配置**
|
||||||
|
- 首次启动需要输入管理员密码
|
||||||
|
- 等待 Docker 启动完成(状态栏会显示 Docker 图标)
|
||||||
|
- 点击状态栏的 Docker 图标,选择 "Settings" → "General",确保 "Use Rosetta for x86/amd64 emulation on Apple Silicon" 已勾选(如果需要运行 x86 镜像)
|
||||||
|
|
||||||
|
### 验证安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Docker 版本
|
||||||
|
docker --version
|
||||||
|
|
||||||
|
# 检查 Docker 是否运行
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# 如果显示容器列表(可能为空),说明安装成功
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出**:
|
||||||
|
```
|
||||||
|
Docker version 24.0.x, build xxxxx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💻 2. 安装 .NET 6.0 SDK
|
||||||
|
|
||||||
|
### 方法一:使用 Homebrew(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 添加 .NET 的 Homebrew tap
|
||||||
|
brew tap isen-ng/dotnet-sdk-versions
|
||||||
|
|
||||||
|
# 2. 安装 .NET 6.0 SDK
|
||||||
|
brew install --cask dotnet-sdk6-0-400
|
||||||
|
|
||||||
|
# 3. 验证安装
|
||||||
|
dotnet --version
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出**:`6.0.xxx`(版本号)
|
||||||
|
|
||||||
|
### 方法二:直接下载安装
|
||||||
|
|
||||||
|
1. **下载 .NET 6.0 SDK**
|
||||||
|
- 访问:https://dotnet.microsoft.com/download/dotnet/6.0
|
||||||
|
- 选择 "macOS" → "Arm64" → 下载安装包
|
||||||
|
|
||||||
|
2. **安装**
|
||||||
|
- 双击下载的 `.pkg` 文件
|
||||||
|
- 按照安装向导完成安装
|
||||||
|
|
||||||
|
3. **验证安装**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 .NET 版本
|
||||||
|
dotnet --version
|
||||||
|
|
||||||
|
# 检查已安装的 SDK
|
||||||
|
dotnet --list-sdks
|
||||||
|
|
||||||
|
# 应该看到类似输出:
|
||||||
|
# 6.0.xxx [/usr/local/share/dotnet/sdk]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 如果遇到问题
|
||||||
|
|
||||||
|
**问题:命令未找到**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 PATH 环境变量
|
||||||
|
echo $PATH
|
||||||
|
|
||||||
|
# 如果 /usr/local/share/dotnet 不在 PATH 中,添加到 ~/.zshrc
|
||||||
|
echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.zshrc
|
||||||
|
source ~/.zshrc
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:M1 芯片兼容性**
|
||||||
|
|
||||||
|
.NET 6.0 SDK 原生支持 Apple Silicon(M1/M2),无需特殊配置。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 3. 安装 Node.js 和 pnpm
|
||||||
|
|
||||||
|
### 安装 Node.js
|
||||||
|
|
||||||
|
#### 方法一:使用 Homebrew(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装 Node.js(会自动安装 npm)
|
||||||
|
brew install node
|
||||||
|
|
||||||
|
# 验证安装
|
||||||
|
node --version
|
||||||
|
npm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出**:
|
||||||
|
```
|
||||||
|
v18.x.x 或更高版本
|
||||||
|
9.x.x 或更高版本
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法二:使用 nvm(Node Version Manager,推荐用于多版本管理)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 安装 nvm
|
||||||
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
|
||||||
|
|
||||||
|
# 2. 重新加载 shell 配置
|
||||||
|
source ~/.zshrc
|
||||||
|
|
||||||
|
# 3. 安装 Node.js LTS 版本
|
||||||
|
nvm install --lts
|
||||||
|
|
||||||
|
# 4. 使用最新 LTS 版本
|
||||||
|
nvm use --lts
|
||||||
|
|
||||||
|
# 5. 验证安装
|
||||||
|
node --version
|
||||||
|
npm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法三:直接下载安装
|
||||||
|
|
||||||
|
1. **访问 Node.js 官网**
|
||||||
|
- 访问:https://nodejs.org/
|
||||||
|
- 下载 macOS Installer(.pkg)文件
|
||||||
|
- 选择 LTS 版本(推荐)
|
||||||
|
|
||||||
|
2. **安装**
|
||||||
|
- 双击下载的 `.pkg` 文件
|
||||||
|
- 按照安装向导完成安装
|
||||||
|
|
||||||
|
3. **验证安装**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node --version
|
||||||
|
npm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### 安装 pnpm
|
||||||
|
|
||||||
|
#### 方法一:使用 npm(推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用 npm 全局安装 pnpm
|
||||||
|
npm install -g pnpm
|
||||||
|
|
||||||
|
# 验证安装
|
||||||
|
pnpm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出**:`8.x.x` 或更高版本
|
||||||
|
|
||||||
|
#### 方法二:使用 Homebrew
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install pnpm
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法三:使用独立安装脚本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://get.pnpm.io/install.sh | sh -
|
||||||
|
```
|
||||||
|
|
||||||
|
安装完成后,重新加载 shell:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source ~/.zshrc
|
||||||
|
pnpm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 完整验证
|
||||||
|
|
||||||
|
运行以下命令,确认所有工具都已正确安装:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Docker
|
||||||
|
echo "=== Docker ==="
|
||||||
|
docker --version
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# 检查 .NET SDK
|
||||||
|
echo "=== .NET SDK ==="
|
||||||
|
dotnet --version
|
||||||
|
dotnet --list-sdks
|
||||||
|
|
||||||
|
# 检查 Node.js
|
||||||
|
echo "=== Node.js ==="
|
||||||
|
node --version
|
||||||
|
npm --version
|
||||||
|
|
||||||
|
# 检查 pnpm
|
||||||
|
echo "=== pnpm ==="
|
||||||
|
pnpm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出示例**:
|
||||||
|
```
|
||||||
|
=== Docker ===
|
||||||
|
Docker version 24.0.6, build ed223bc
|
||||||
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||||
|
|
||||||
|
=== .NET SDK ===
|
||||||
|
6.0.425
|
||||||
|
6.0.425 [/usr/local/share/dotnet/sdk]
|
||||||
|
|
||||||
|
=== Node.js ===
|
||||||
|
v18.17.0
|
||||||
|
9.6.7
|
||||||
|
|
||||||
|
=== pnpm ===
|
||||||
|
8.15.0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 测试构建环境
|
||||||
|
|
||||||
|
安装完成后,可以测试构建环境是否正常工作:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入项目目录
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 测试 Docker 构建(可选,会花费一些时间)
|
||||||
|
# docker build -f Dockerfile.prod -t dysync.net:test .
|
||||||
|
|
||||||
|
# 测试 .NET 项目构建
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
dotnet restore
|
||||||
|
dotnet build
|
||||||
|
|
||||||
|
# 测试前端构建
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net/app
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 常见问题
|
||||||
|
|
||||||
|
### 问题 1:Docker Desktop 无法启动
|
||||||
|
|
||||||
|
**症状**:点击 Docker Desktop 后没有反应或报错
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
1. 检查系统要求:macOS 11.0 或更高版本
|
||||||
|
2. 重启 Mac
|
||||||
|
3. 检查是否有其他虚拟化软件冲突(如 VirtualBox)
|
||||||
|
4. 重新安装 Docker Desktop
|
||||||
|
|
||||||
|
### 问题 2:.NET SDK 命令未找到
|
||||||
|
|
||||||
|
**症状**:执行 `dotnet --version` 提示命令未找到
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 .NET 安装位置
|
||||||
|
ls -la /usr/local/share/dotnet
|
||||||
|
|
||||||
|
# 如果不存在,检查其他可能的位置
|
||||||
|
which dotnet
|
||||||
|
|
||||||
|
# 添加到 PATH(如果使用 zsh)
|
||||||
|
echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.zshrc
|
||||||
|
source ~/.zshrc
|
||||||
|
|
||||||
|
# 如果使用 bash
|
||||||
|
echo 'export PATH="/usr/local/share/dotnet:$PATH"' >> ~/.bash_profile
|
||||||
|
source ~/.bash_profile
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 3:pnpm 安装失败
|
||||||
|
|
||||||
|
**症状**:`npm install -g pnpm` 失败,提示权限错误
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 方法 1:使用 sudo(不推荐)
|
||||||
|
sudo npm install -g pnpm
|
||||||
|
|
||||||
|
# 方法 2:配置 npm 使用其他目录(推荐)
|
||||||
|
mkdir ~/.npm-global
|
||||||
|
npm config set prefix '~/.npm-global'
|
||||||
|
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
|
||||||
|
source ~/.zshrc
|
||||||
|
npm install -g pnpm
|
||||||
|
|
||||||
|
# 方法 3:使用 Homebrew
|
||||||
|
brew install pnpm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 4:M1 芯片兼容性问题
|
||||||
|
|
||||||
|
**症状**:某些工具在 M1 上运行异常
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
- **Docker Desktop**:确保使用 Apple Silicon 版本(arm64)
|
||||||
|
- **.NET SDK**:.NET 6.0 原生支持 M1,无需特殊配置
|
||||||
|
- **Node.js**:使用 nvm 安装时,会自动选择 arm64 版本
|
||||||
|
|
||||||
|
### 问题 5:Homebrew 安装慢或失败
|
||||||
|
|
||||||
|
**症状**:`brew install` 下载很慢或失败
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用国内镜像源(清华大学镜像)
|
||||||
|
# 替换 Homebrew 源
|
||||||
|
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
|
||||||
|
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
|
||||||
|
|
||||||
|
# 或使用中科大镜像
|
||||||
|
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
|
||||||
|
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 参考资源
|
||||||
|
|
||||||
|
- **Docker Desktop for Mac**:https://docs.docker.com/desktop/install/mac-install/
|
||||||
|
- **.NET 6.0 下载**:https://dotnet.microsoft.com/download/dotnet/6.0
|
||||||
|
- **Node.js 下载**:https://nodejs.org/
|
||||||
|
- **pnpm 文档**:https://pnpm.io/installation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 下一步
|
||||||
|
|
||||||
|
安装完成后,可以开始构建项目:
|
||||||
|
|
||||||
|
1. **查看构建指南**:[飞牛NAS详细部署方案.md](./飞牛NAS详细部署方案.md)
|
||||||
|
2. **开始构建镜像**:
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**:2024-11-22
|
||||||
|
**适用系统**:macOS(Apple Silicon M1/M2)
|
||||||
|
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
# 下载配置功能说明
|
||||||
|
|
||||||
|
## 📋 功能概述
|
||||||
|
|
||||||
|
为了避免自动下载占用过多存储空间,系统现在支持可配置的下载策略。**默认情况下,系统不会自动下载视频**,只会同步视频信息到数据库。
|
||||||
|
|
||||||
|
## 🎯 功能特点
|
||||||
|
|
||||||
|
1. **默认不下载**:未配置的用户不会自动下载视频,避免占用存储空间
|
||||||
|
2. **按时间范围配置**:可以设置只下载指定天数内的视频(例如:只下载最近30天)
|
||||||
|
3. **按作者配置**:支持作者白名单和黑名单
|
||||||
|
4. **按类型配置**:可以分别控制是否下载"喜欢的视频"和"收藏的视频"
|
||||||
|
|
||||||
|
## ⚙️ 配置选项
|
||||||
|
|
||||||
|
### 1. 启用自动下载
|
||||||
|
|
||||||
|
- **开关**:启用/禁用自动下载功能
|
||||||
|
- **默认值**:关闭(`false`)
|
||||||
|
- **说明**:关闭后,系统只同步视频信息到数据库,不会下载视频文件
|
||||||
|
|
||||||
|
### 2. 下载时间范围
|
||||||
|
|
||||||
|
- **类型**:数字(天数)
|
||||||
|
- **默认值**:0(不限制)
|
||||||
|
- **说明**:
|
||||||
|
- `0`:不限制时间,下载所有符合条件的视频
|
||||||
|
- `30`:只下载最近30天的视频
|
||||||
|
- `90`:只下载最近90天的视频
|
||||||
|
- 最大支持 3650 天(10年)
|
||||||
|
|
||||||
|
### 3. 下载类型
|
||||||
|
|
||||||
|
- **下载喜欢的视频**:是否下载"喜欢的视频"(`ViedoType = "1"`)
|
||||||
|
- **下载收藏的视频**:是否下载"收藏的视频"(`ViedoType = "2"`)
|
||||||
|
- **默认值**:都关闭(`false`)
|
||||||
|
|
||||||
|
### 4. 作者白名单
|
||||||
|
|
||||||
|
- **类型**:多行文本(每行一个作者)
|
||||||
|
- **格式**:每行一个作者名称或作者ID
|
||||||
|
- **说明**:
|
||||||
|
- 配置后,**只有**白名单中的作者视频才会被下载
|
||||||
|
- 留空则不限制
|
||||||
|
- 支持作者名称或作者ID(`AuthorId`)
|
||||||
|
- 示例:
|
||||||
|
```
|
||||||
|
作者1
|
||||||
|
作者2
|
||||||
|
MS4wLjABAAAA...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 作者黑名单
|
||||||
|
|
||||||
|
- **类型**:多行文本(每行一个作者)
|
||||||
|
- **格式**:每行一个作者名称或作者ID
|
||||||
|
- **说明**:
|
||||||
|
- 配置后,黑名单中的作者视频**不会**被下载
|
||||||
|
- 留空则不限制
|
||||||
|
- 支持作者名称或作者ID(`AuthorId`)
|
||||||
|
- 示例:
|
||||||
|
```
|
||||||
|
作者1
|
||||||
|
作者2
|
||||||
|
MS4wLjABAAAA...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 判断逻辑
|
||||||
|
|
||||||
|
系统按照以下顺序判断是否应该下载视频:
|
||||||
|
|
||||||
|
1. **检查是否启用自动下载**
|
||||||
|
- 如果未启用,直接跳过下载
|
||||||
|
|
||||||
|
2. **检查视频类型**
|
||||||
|
- 如果视频类型为"喜欢"(`ViedoType = "1"`),检查 `DownloadFavorite` 是否为 `true`
|
||||||
|
- 如果视频类型为"收藏"(`ViedoType = "2"`),检查 `DownloadCollect` 是否为 `true`
|
||||||
|
- 如果对应类型未启用,跳过下载
|
||||||
|
|
||||||
|
3. **检查时间范围**
|
||||||
|
- 如果配置了 `DownloadDaysRange > 0`,检查视频创建时间是否在范围内
|
||||||
|
- 超出时间范围的视频跳过下载
|
||||||
|
|
||||||
|
4. **检查作者白名单**
|
||||||
|
- 如果配置了白名单,检查作者是否在白名单中
|
||||||
|
- 不在白名单中的视频跳过下载
|
||||||
|
|
||||||
|
5. **检查作者黑名单**
|
||||||
|
- 如果配置了黑名单,检查作者是否在黑名单中
|
||||||
|
- 在黑名单中的视频跳过下载
|
||||||
|
|
||||||
|
6. **所有检查通过,开始下载**
|
||||||
|
|
||||||
|
## 📝 配置示例
|
||||||
|
|
||||||
|
### 示例 1:只下载最近30天的喜欢视频
|
||||||
|
|
||||||
|
```
|
||||||
|
启用自动下载:✅ 开启
|
||||||
|
下载时间范围:30 天
|
||||||
|
下载喜欢的视频:✅ 开启
|
||||||
|
下载收藏的视频:❌ 关闭
|
||||||
|
作者白名单:(留空)
|
||||||
|
作者黑名单:(留空)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 2:只下载指定作者的视频
|
||||||
|
|
||||||
|
```
|
||||||
|
启用自动下载:✅ 开启
|
||||||
|
下载时间范围:0(不限制)
|
||||||
|
下载喜欢的视频:✅ 开启
|
||||||
|
下载收藏的视频:✅ 开启
|
||||||
|
作者白名单:
|
||||||
|
作者1
|
||||||
|
作者2
|
||||||
|
MS4wLjABAAAA...
|
||||||
|
作者黑名单:(留空)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 3:排除某些作者,下载其他所有视频
|
||||||
|
|
||||||
|
```
|
||||||
|
启用自动下载:✅ 开启
|
||||||
|
下载时间范围:0(不限制)
|
||||||
|
下载喜欢的视频:✅ 开启
|
||||||
|
下载收藏的视频:✅ 开启
|
||||||
|
作者白名单:(留空)
|
||||||
|
作者黑名单:
|
||||||
|
不想下载的作者1
|
||||||
|
不想下载的作者2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 4:不自动下载(默认)
|
||||||
|
|
||||||
|
```
|
||||||
|
启用自动下载:❌ 关闭
|
||||||
|
(其他选项无效)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 使用方法
|
||||||
|
|
||||||
|
1. **登录系统**,进入"设置"页面
|
||||||
|
2. **点击"修改配置"**按钮
|
||||||
|
3. **配置下载选项**:
|
||||||
|
- 开启"启用自动下载"
|
||||||
|
- 根据需要设置时间范围、类型、作者白名单/黑名单
|
||||||
|
4. **点击"确认"**保存配置
|
||||||
|
5. **系统会在下次同步时应用新配置**
|
||||||
|
|
||||||
|
## 📊 数据库变更
|
||||||
|
|
||||||
|
### AppConfig 表新增字段
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 以下字段已添加到 dy_app_config 表
|
||||||
|
EnableAutoDownload BOOLEAN DEFAULT 0 -- 是否启用自动下载
|
||||||
|
DownloadDaysRange INTEGER DEFAULT 0 -- 下载时间范围(天数)
|
||||||
|
AuthorWhitelist TEXT -- 作者白名单(JSON数组)
|
||||||
|
AuthorBlacklist TEXT -- 作者黑名单(JSON数组)
|
||||||
|
DownloadFavorite BOOLEAN DEFAULT 0 -- 是否下载喜欢的视频
|
||||||
|
DownloadCollect BOOLEAN DEFAULT 0 -- 是否下载收藏的视频
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 技术实现
|
||||||
|
|
||||||
|
### 后端变更
|
||||||
|
|
||||||
|
1. **模型扩展**:`AppConfig` 模型新增下载配置字段
|
||||||
|
2. **服务新增**:`DownloadConfigService` 服务实现下载判断逻辑
|
||||||
|
3. **Job 修改**:
|
||||||
|
- `DouYinFavoritSyncJob`:在下载前检查配置
|
||||||
|
- `DouYinCollectSyncJob`:在下载前检查配置
|
||||||
|
4. **服务更新**:`CommonService` 支持保存和读取下载配置
|
||||||
|
|
||||||
|
### 前端变更
|
||||||
|
|
||||||
|
1. **配置页面**:`AppSet.vue` 新增下载配置界面
|
||||||
|
2. **表单字段**:添加下载相关的表单字段
|
||||||
|
3. **数据处理**:处理作者白名单/黑名单的 JSON 转换
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
|
1. **默认行为**:未配置的用户默认不会下载视频,只会同步视频信息
|
||||||
|
2. **配置优先级**:白名单和黑名单同时配置时,黑名单优先级更高
|
||||||
|
3. **时间计算**:时间范围基于视频的创建时间(`CreateTime`),不是同步时间
|
||||||
|
4. **作者匹配**:支持按作者名称或作者ID匹配,不区分大小写
|
||||||
|
5. **配置生效**:配置修改后,会在下次同步任务执行时生效
|
||||||
|
|
||||||
|
## 🐛 故障排查
|
||||||
|
|
||||||
|
### 问题:配置了但视频仍然不下载
|
||||||
|
|
||||||
|
**检查项**:
|
||||||
|
1. 确认"启用自动下载"已开启
|
||||||
|
2. 确认对应的视频类型(喜欢/收藏)已开启
|
||||||
|
3. 检查时间范围是否合理(视频是否在范围内)
|
||||||
|
4. 检查作者是否在白名单中(如果配置了白名单)
|
||||||
|
5. 检查作者是否在黑名单中(如果配置了黑名单)
|
||||||
|
|
||||||
|
### 问题:配置了白名单但所有视频都不下载
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- 作者名称或ID不匹配
|
||||||
|
- 白名单格式错误(应该是每行一个)
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
- 检查作者名称是否完全匹配(包括空格、特殊字符)
|
||||||
|
- 尝试使用作者ID而不是名称
|
||||||
|
- 查看日志中的"不符合下载配置"提示
|
||||||
|
|
||||||
|
### 问题:配置了时间范围但旧视频仍然下载
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- 时间范围配置未生效
|
||||||
|
- 视频创建时间解析错误
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
- 确认配置已保存
|
||||||
|
- 检查日志中的时间判断逻辑
|
||||||
|
- 重启服务后重试
|
||||||
|
|
||||||
|
## 📚 相关文件
|
||||||
|
|
||||||
|
- **后端模型**:`model/AppConfig.cs`
|
||||||
|
- **下载服务**:`service/DownloadConfigService.cs`
|
||||||
|
- **配置服务**:`service/CommonService.cs`
|
||||||
|
- **喜欢视频Job**:`job/DouYinFavoritSyncJob.cs`
|
||||||
|
- **收藏视频Job**:`job/DouYinCollectSyncJob.cs`
|
||||||
|
- **前端配置页**:`app/src/pages/set/AppSet.vue`
|
||||||
|
- **API控制器**:`Controllers/ConfigController.cs`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**:2024-11-24
|
||||||
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# 安装 .NET 6.0 Runtime
|
||||||
|
|
||||||
|
## 问题说明
|
||||||
|
当前系统安装了 .NET SDK 10.0,但项目需要 .NET 6.0 Runtime 才能运行。
|
||||||
|
|
||||||
|
## 解决方案
|
||||||
|
|
||||||
|
### 方法一:下载官方安装包(推荐)
|
||||||
|
|
||||||
|
1. **访问下载页面**:
|
||||||
|
https://dotnet.microsoft.com/download/dotnet/6.0
|
||||||
|
|
||||||
|
2. **下载 macOS x64 Runtime**:
|
||||||
|
- 找到 "Run apps - Runtime" 部分
|
||||||
|
- 下载 "6.0.x" 版本的 macOS x64 安装包(.pkg 文件)
|
||||||
|
|
||||||
|
3. **安装**:
|
||||||
|
- 双击下载的 .pkg 文件
|
||||||
|
- 按照安装向导完成安装
|
||||||
|
|
||||||
|
4. **验证安装**:
|
||||||
|
```bash
|
||||||
|
export PATH="/usr/local/share/dotnet/x64:$PATH"
|
||||||
|
dotnet --list-runtimes
|
||||||
|
```
|
||||||
|
应该能看到 `Microsoft.NETCore.App 6.0.x`
|
||||||
|
|
||||||
|
### 方法二:使用命令行安装(需要管理员权限)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载安装脚本
|
||||||
|
curl -sSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
|
||||||
|
|
||||||
|
# 安装 .NET 6.0 Runtime(需要 sudo)
|
||||||
|
sudo bash dotnet-install.sh --runtime dotnet --version 6.0.0 --install-dir /usr/local/share/dotnet/x64
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法三:使用 Homebrew(如果可用)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 注意:Homebrew 可能没有单独的 runtime,需要安装完整的 SDK
|
||||||
|
brew install --cask dotnet-sdk6-0-400
|
||||||
|
```
|
||||||
|
|
||||||
|
## 安装完成后
|
||||||
|
|
||||||
|
重新启动后端服务:
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
export PATH="/usr/local/share/dotnet/x64:$PATH"
|
||||||
|
dotnet run
|
||||||
|
```
|
||||||
|
|
||||||
|
## 快速链接
|
||||||
|
|
||||||
|
- **直接下载链接(macOS x64)**:
|
||||||
|
https://download.visualstudio.microsoft.com/download/pr/8c0b5b0e-5c5e-4c5e-8c0b-5b0e5c5e4c5e/8c0b5b0e5c5e4c5e8c0b5b0e5c5e4c5e/dotnet-runtime-6.0.0-osx-x64.pkg
|
||||||
|
|
||||||
+153
@@ -0,0 +1,153 @@
|
|||||||
|
# 数据库检查说明
|
||||||
|
|
||||||
|
由于终端命令执行环境问题,我为您提供以下检查方法:
|
||||||
|
|
||||||
|
## 🔍 检查方法
|
||||||
|
|
||||||
|
### 方法一:通过前端页面检查(推荐)
|
||||||
|
|
||||||
|
1. **访问前端页面**: `http://localhost:8001`
|
||||||
|
2. **登录系统**: 用户名 `douyin` / 密码 `douyin2025`
|
||||||
|
3. **查看数据看板**: 点击「数据看板」查看视频统计
|
||||||
|
- 视频总数
|
||||||
|
- 作者数量
|
||||||
|
- 分类数量
|
||||||
|
- 存储空间统计
|
||||||
|
4. **查看同步记录**: 点击「同步记录」查看视频列表
|
||||||
|
- 查看是否有视频记录
|
||||||
|
- 检查视频是否有 `videoSavePath` 字段
|
||||||
|
|
||||||
|
### 方法二:通过 Swagger API 检查
|
||||||
|
|
||||||
|
1. **访问 Swagger**: `http://localhost:10101/swagger`
|
||||||
|
2. **测试统计接口**:
|
||||||
|
- 找到 `GET /api/video/statics`
|
||||||
|
- 点击 "Try it out" → "Execute"
|
||||||
|
- 查看返回的视频统计数据
|
||||||
|
3. **测试分页查询接口**:
|
||||||
|
- 找到 `POST /api/video/paged`
|
||||||
|
- 点击 "Try it out"
|
||||||
|
- 输入参数: `{"pageIndex":1,"pageSize":10}`
|
||||||
|
- 点击 "Execute"
|
||||||
|
- 查看返回的视频列表
|
||||||
|
|
||||||
|
### 方法三:手动执行 SQL 查询
|
||||||
|
|
||||||
|
在终端中执行以下命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 1. 查看视频总数
|
||||||
|
sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video;"
|
||||||
|
|
||||||
|
# 2. 查看有保存路径的视频数量
|
||||||
|
sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video WHERE videoSavePath IS NOT NULL AND videoSavePath != '';"
|
||||||
|
|
||||||
|
# 3. 查看 Cookie 配置
|
||||||
|
sqlite3 -header -column db/dy.sqlite "SELECT id, userName, savePath, favSavePath, uperSavePath FROM dy_user_cookies;"
|
||||||
|
|
||||||
|
# 4. 查看视频记录示例
|
||||||
|
sqlite3 -header -column db/dy.sqlite "SELECT id, videoTitle, author, videoSavePath, fileSize FROM dy_collect_video LIMIT 5;"
|
||||||
|
|
||||||
|
# 5. 检查视频文件是否存在(示例)
|
||||||
|
sqlite3 db/dy.sqlite "SELECT videoSavePath FROM dy_collect_video WHERE videoSavePath IS NOT NULL LIMIT 1;" | xargs -I {} test -f {} && echo "文件存在" || echo "文件不存在"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 检查清单
|
||||||
|
|
||||||
|
### ✅ Cookie 配置检查
|
||||||
|
|
||||||
|
- [ ] Cookie 是否已配置?
|
||||||
|
- [ ] `savePath`(收藏视频路径)是否已设置?
|
||||||
|
- [ ] `favSavePath`(喜欢视频路径)是否已设置?
|
||||||
|
- [ ] `uperSavePath`(博主视频路径)是否已设置?
|
||||||
|
- [ ] Cookie 内容是否有效(长度 > 1000)?
|
||||||
|
|
||||||
|
### ✅ 视频数据检查
|
||||||
|
|
||||||
|
- [ ] 数据库中是否有视频记录?
|
||||||
|
- [ ] 视频记录是否有 `videoSavePath` 字段?
|
||||||
|
- [ ] 视频文件是否实际存在于文件系统中?
|
||||||
|
- [ ] 视频文件大小是否正常?
|
||||||
|
|
||||||
|
### ✅ 同步任务检查
|
||||||
|
|
||||||
|
- [ ] 定时任务是否已启动?
|
||||||
|
- [ ] 最近是否有同步日志?
|
||||||
|
- [ ] 同步是否成功完成?
|
||||||
|
|
||||||
|
## 🐛 常见问题
|
||||||
|
|
||||||
|
### 1. 数据库中没有视频记录
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- Cookie 未配置或无效
|
||||||
|
- 保存路径未配置
|
||||||
|
- 同步任务未执行
|
||||||
|
- 同步任务执行失败
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
1. 检查「抖音授权」页面,确保 Cookie 和路径已配置
|
||||||
|
2. 点击「立即重新同步」手动触发同步
|
||||||
|
3. 查看系统日志了解同步失败原因
|
||||||
|
|
||||||
|
### 2. 有记录但没有 videoSavePath
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- 视频下载失败
|
||||||
|
- 保存路径配置错误
|
||||||
|
- 文件系统权限问题
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
1. 检查保存路径配置是否正确
|
||||||
|
2. 检查文件系统权限
|
||||||
|
3. 查看日志了解下载失败原因
|
||||||
|
|
||||||
|
### 3. 有 videoSavePath 但文件不存在
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- 文件被删除
|
||||||
|
- 路径配置错误
|
||||||
|
- 文件系统路径映射问题
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
1. 检查文件路径是否正确
|
||||||
|
2. 检查文件是否被删除
|
||||||
|
3. 重新同步视频
|
||||||
|
|
||||||
|
## 📝 下一步操作
|
||||||
|
|
||||||
|
1. **如果数据库为空**:
|
||||||
|
- 配置 Cookie 和保存路径
|
||||||
|
- 手动触发同步任务
|
||||||
|
- 等待同步完成
|
||||||
|
|
||||||
|
2. **如果有数据但无 videoSavePath**:
|
||||||
|
- 检查保存路径配置
|
||||||
|
- 重新同步视频
|
||||||
|
|
||||||
|
3. **如果有 videoSavePath 但文件不存在**:
|
||||||
|
- 检查文件路径
|
||||||
|
- 重新同步视频
|
||||||
|
|
||||||
|
4. **如果一切正常**:
|
||||||
|
- 测试视频预览功能
|
||||||
|
- 点击「预览」按钮查看视频
|
||||||
|
|
||||||
|
## 🔧 手动触发同步
|
||||||
|
|
||||||
|
在前端页面:
|
||||||
|
1. 进入「同步记录」页面
|
||||||
|
2. 点击「立即重新同步」按钮
|
||||||
|
3. 等待同步完成(查看日志)
|
||||||
|
|
||||||
|
或通过 API:
|
||||||
|
```bash
|
||||||
|
curl http://localhost:10101/api/config/ExecuteJobNow
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**提示**: 如果遇到问题,请查看 `logs/` 目录下的日志文件了解详细信息。
|
||||||
|
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
# 数据看板不更新问题排查
|
||||||
|
|
||||||
|
## 🔍 问题现象
|
||||||
|
|
||||||
|
视频已经下载了,但是数据看板中的数据没有更新。
|
||||||
|
|
||||||
|
## 📋 可能的原因
|
||||||
|
|
||||||
|
### 1. 数据库记录未保存
|
||||||
|
- 视频文件下载成功,但数据库记录保存失败
|
||||||
|
- 检查日志中是否有 "批量保存视频到数据库失败" 的错误
|
||||||
|
|
||||||
|
### 2. 前端缓存问题
|
||||||
|
- 浏览器缓存了旧的统计数据
|
||||||
|
- 前端组件没有刷新数据
|
||||||
|
|
||||||
|
### 3. 数据库查询问题
|
||||||
|
- 统计查询没有正确读取数据
|
||||||
|
|
||||||
|
## 🔧 排查步骤
|
||||||
|
|
||||||
|
### 步骤1:检查数据库中的记录
|
||||||
|
|
||||||
|
**方法一:通过前端页面**
|
||||||
|
1. 访问 `http://localhost:8001`
|
||||||
|
2. 进入「同步记录」页面
|
||||||
|
3. 查看是否有视频记录显示
|
||||||
|
4. 检查视频记录是否有 `videoSavePath` 字段
|
||||||
|
|
||||||
|
**方法二:通过 Swagger API**
|
||||||
|
1. 访问 `http://localhost:10101/swagger`
|
||||||
|
2. 找到 `POST /api/video/paged`
|
||||||
|
3. 输入参数:`{"pageIndex":1,"pageSize":10}`
|
||||||
|
4. 执行查询,查看返回的数据
|
||||||
|
|
||||||
|
**方法三:直接查询数据库**
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
sqlite3 db/dy.sqlite "SELECT COUNT(*) FROM dy_collect_video;"
|
||||||
|
sqlite3 db/dy.sqlite "SELECT id, videoTitle, videoSavePath FROM dy_collect_video LIMIT 5;"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤2:检查日志
|
||||||
|
|
||||||
|
查看最新的日志文件,搜索关键词:
|
||||||
|
- "批量保存视频到数据库失败"
|
||||||
|
- "本次共同步成功"
|
||||||
|
- "下载成功"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看最新日志
|
||||||
|
tail -100 logs/log-debug-20251120.txt | grep -E "(下载成功|批量保存|同步成功)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤3:检查前端数据刷新
|
||||||
|
|
||||||
|
1. **清除浏览器缓存**
|
||||||
|
- 按 `F12` 打开开发者工具
|
||||||
|
- 右键点击刷新按钮
|
||||||
|
- 选择「清空缓存并硬性重新加载」
|
||||||
|
|
||||||
|
2. **手动刷新数据看板**
|
||||||
|
- 进入「数据看板」页面
|
||||||
|
- 按 `F5` 刷新页面
|
||||||
|
- 或关闭页面重新打开
|
||||||
|
|
||||||
|
3. **检查网络请求**
|
||||||
|
- 按 `F12` 打开开发者工具
|
||||||
|
- 切换到「Network」标签
|
||||||
|
- 刷新「数据看板」页面
|
||||||
|
- 查看 `/api/video/statics` 请求的响应数据
|
||||||
|
|
||||||
|
## 🛠️ 解决方案
|
||||||
|
|
||||||
|
### 方案1:强制刷新前端数据
|
||||||
|
|
||||||
|
在前端代码中添加自动刷新功能,修改 `statics.vue`:
|
||||||
|
|
||||||
|
```vue
|
||||||
|
// 在 onMounted 中添加定时刷新
|
||||||
|
onMounted(() => {
|
||||||
|
loadDashboardData();
|
||||||
|
// 每30秒自动刷新一次
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
loadDashboardData();
|
||||||
|
}, 30000);
|
||||||
|
onUnmounted(() => {
|
||||||
|
clearInterval(timer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案2:检查数据库保存逻辑
|
||||||
|
|
||||||
|
如果日志显示 "批量保存视频到数据库失败",需要检查:
|
||||||
|
1. 数据库连接是否正常
|
||||||
|
2. 视频记录是否有重复(AwemeId 冲突)
|
||||||
|
3. 字段是否有空值或格式错误
|
||||||
|
|
||||||
|
### 方案3:手动触发数据刷新
|
||||||
|
|
||||||
|
在前端「数据看板」页面添加刷新按钮:
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<a-button @click="loadDashboardData" type="primary">刷新数据</a-button>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 快速检查清单
|
||||||
|
|
||||||
|
- [ ] 数据库中是否有视频记录?
|
||||||
|
- [ ] 视频记录是否有 `videoSavePath` 字段?
|
||||||
|
- [ ] 视频文件是否实际存在?
|
||||||
|
- [ ] 日志中是否有保存失败的错误?
|
||||||
|
- [ ] 前端是否缓存了旧数据?
|
||||||
|
- [ ] API 返回的数据是否正确?
|
||||||
|
|
||||||
|
## 🎯 立即操作
|
||||||
|
|
||||||
|
1. **刷新浏览器页面**(清除缓存)
|
||||||
|
2. **检查「同步记录」页面**,看是否有视频记录
|
||||||
|
3. **查看浏览器控制台**(F12),检查是否有错误
|
||||||
|
4. **查看网络请求**,确认 API 返回的数据
|
||||||
|
|
||||||
|
如果「同步记录」页面有数据,但「数据看板」没有更新,那就是前端缓存问题,需要强制刷新。
|
||||||
|
|
||||||
|
如果「同步记录」页面也没有数据,那就是数据库保存问题,需要检查日志。
|
||||||
|
|
||||||
+224
@@ -0,0 +1,224 @@
|
|||||||
|
# dysync.net 本地启动指南
|
||||||
|
|
||||||
|
## 📋 前置要求
|
||||||
|
|
||||||
|
### 1. 安装 .NET 6.0 SDK
|
||||||
|
|
||||||
|
**macOS 安装方式:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 方式一:使用 Homebrew(推荐)
|
||||||
|
brew install --cask dotnet-sdk
|
||||||
|
|
||||||
|
# 方式二:手动下载安装
|
||||||
|
# 访问 https://dotnet.microsoft.com/download/dotnet/6.0
|
||||||
|
# 下载 macOS 版本的 .NET 6.0 SDK 并安装
|
||||||
|
```
|
||||||
|
|
||||||
|
**验证安装:**
|
||||||
|
```bash
|
||||||
|
dotnet --version
|
||||||
|
# 应该显示类似:6.0.xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 安装 Node.js(已安装 ✅)
|
||||||
|
|
||||||
|
您已安装 Node.js v24.1.0,满足要求。
|
||||||
|
|
||||||
|
**推荐使用 pnpm(项目使用 pnpm-lock.yaml):**
|
||||||
|
```bash
|
||||||
|
npm install -g pnpm
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 启动步骤
|
||||||
|
|
||||||
|
### 第一步:安装前端依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd app
|
||||||
|
pnpm install
|
||||||
|
# 或者使用 yarn
|
||||||
|
# yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第二步:启动后端服务
|
||||||
|
|
||||||
|
**打开第一个终端窗口:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 回到项目根目录
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 还原 NuGet 包(首次运行)
|
||||||
|
dotnet restore
|
||||||
|
|
||||||
|
# 启动后端服务(开发模式)
|
||||||
|
dotnet run
|
||||||
|
|
||||||
|
# 或者指定端口(如果需要)
|
||||||
|
dotnet run --urls "http://localhost:10101"
|
||||||
|
```
|
||||||
|
|
||||||
|
**后端启动成功后:**
|
||||||
|
- ✅ 后端 API 运行在:`http://localhost:10101`
|
||||||
|
- ✅ Swagger 文档:`http://localhost:10101/swagger`
|
||||||
|
- ✅ 数据库会自动创建在:`db/dy.sqlite`
|
||||||
|
- ✅ 日志文件会生成在:`logs/` 目录
|
||||||
|
|
||||||
|
### 第三步:启动前端开发服务器
|
||||||
|
|
||||||
|
**打开第二个终端窗口:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd app
|
||||||
|
|
||||||
|
# 启动前端开发服务器
|
||||||
|
pnpm dev
|
||||||
|
# 或者
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
**前端启动成功后:**
|
||||||
|
- ✅ 前端运行在:`http://localhost:8001`
|
||||||
|
- ✅ 会自动代理 `/api` 请求到后端 `http://localhost:10101`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 首次登录
|
||||||
|
|
||||||
|
1. 访问:`http://localhost:8001`
|
||||||
|
2. 默认账号:`douyin`
|
||||||
|
3. 默认密码:`douyin2025`
|
||||||
|
|
||||||
|
> ⚠️ **安全提示**:登录后请立即修改密码!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 目录结构说明
|
||||||
|
|
||||||
|
```
|
||||||
|
dysync.net/
|
||||||
|
├── db/ # SQLite 数据库目录(自动创建)
|
||||||
|
│ └── dy.sqlite # 数据库文件
|
||||||
|
├── logs/ # 日志文件目录(自动创建)
|
||||||
|
│ ├── log-debug-*.txt # 调试日志
|
||||||
|
│ └── log-error-*.txt # 错误日志
|
||||||
|
├── app/ # 前端项目
|
||||||
|
│ ├── dist/ # 前端构建产物(生产环境)
|
||||||
|
│ └── src/ # 前端源码
|
||||||
|
└── appsettings.json # 后端配置文件
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ 配置说明
|
||||||
|
|
||||||
|
### 后端配置 (`appsettings.json`)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dbconn": "", // SQLite 无需配置,自动创建
|
||||||
|
"dbtype": "Sqlite" // 数据库类型
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 前端配置 (`app/.env.development`)
|
||||||
|
|
||||||
|
```env
|
||||||
|
VITE_API_URL=http://localhost:10101
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 常见问题排查
|
||||||
|
|
||||||
|
### 1. 后端启动失败
|
||||||
|
|
||||||
|
**问题:端口被占用**
|
||||||
|
```bash
|
||||||
|
# macOS 查看端口占用
|
||||||
|
lsof -i :10101
|
||||||
|
|
||||||
|
# 杀死占用进程
|
||||||
|
kill -9 <PID>
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:数据库权限错误**
|
||||||
|
```bash
|
||||||
|
# 确保 db 目录有写权限
|
||||||
|
chmod 755 db
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 前端启动失败
|
||||||
|
|
||||||
|
**问题:依赖安装失败**
|
||||||
|
```bash
|
||||||
|
# 清除缓存重新安装
|
||||||
|
rm -rf node_modules pnpm-lock.yaml
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:API 请求失败(404)**
|
||||||
|
- 检查后端是否已启动
|
||||||
|
- 检查 `.env.development` 中的 `VITE_API_URL` 是否正确
|
||||||
|
- 检查浏览器控制台是否有 CORS 错误
|
||||||
|
|
||||||
|
### 3. 数据库相关
|
||||||
|
|
||||||
|
**数据库位置:**
|
||||||
|
- 开发环境:`项目根目录/db/dy.sqlite`
|
||||||
|
- 数据库会在首次启动时自动创建
|
||||||
|
|
||||||
|
**重置数据库:**
|
||||||
|
```bash
|
||||||
|
# 删除数据库文件(会丢失所有数据)
|
||||||
|
rm -rf db/dy.sqlite
|
||||||
|
|
||||||
|
# 重新启动后端,会自动创建新数据库
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 开发模式说明
|
||||||
|
|
||||||
|
### 开发环境特性
|
||||||
|
|
||||||
|
1. **热重载**:前端代码修改后自动刷新
|
||||||
|
2. **Swagger 文档**:`http://localhost:10101/swagger`
|
||||||
|
3. **详细日志**:所有日志输出到 `logs/` 目录
|
||||||
|
4. **数据库自动迁移**:模型变更后自动更新表结构
|
||||||
|
|
||||||
|
### 生产环境构建
|
||||||
|
|
||||||
|
**前端构建:**
|
||||||
|
```bash
|
||||||
|
cd app
|
||||||
|
pnpm build
|
||||||
|
# 构建产物在 app/dist/ 目录
|
||||||
|
```
|
||||||
|
|
||||||
|
**后端发布:**
|
||||||
|
```bash
|
||||||
|
dotnet publish -c Release -o ./publish
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 下一步操作
|
||||||
|
|
||||||
|
1. ✅ 启动后端和前端服务
|
||||||
|
2. 🔐 使用默认账号登录
|
||||||
|
3. 🍪 在「抖音授权」页面配置 Cookie 和 sec_user_id
|
||||||
|
4. ⚙️ 在「系统配置」页面设置同步参数
|
||||||
|
5. 🎬 开始同步视频!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 提示
|
||||||
|
|
||||||
|
- **开发时建议**:保持两个终端窗口同时运行(后端 + 前端)
|
||||||
|
- **调试技巧**:查看 `logs/` 目录下的日志文件排查问题
|
||||||
|
- **API 测试**:使用 Swagger 文档测试接口功能
|
||||||
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# Docker 构建问题排查
|
||||||
|
|
||||||
|
## 问题:网络超时无法拉取镜像
|
||||||
|
|
||||||
|
### 解决方案
|
||||||
|
|
||||||
|
1. **已配置镜像加速器** ✅
|
||||||
|
- 已添加国内镜像源到 `~/.docker/daemon.json`
|
||||||
|
- 镜像源包括:中科大、网易、百度云
|
||||||
|
|
||||||
|
2. **重启 Docker Desktop**
|
||||||
|
- 点击状态栏的 Docker 图标
|
||||||
|
- 选择 "Quit Docker Desktop"
|
||||||
|
- 重新启动 Docker Desktop
|
||||||
|
- 等待 Docker 完全启动(状态栏图标不再闪烁)
|
||||||
|
|
||||||
|
3. **验证镜像加速器是否生效**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker info | grep -A 10 "Registry Mirrors"
|
||||||
|
```
|
||||||
|
|
||||||
|
应该看到配置的镜像源列表。
|
||||||
|
|
||||||
|
4. **重新构建镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 如果仍然失败
|
||||||
|
|
||||||
|
**方案 A:使用代理(如果有)**
|
||||||
|
|
||||||
|
在 Docker Desktop 中配置代理:
|
||||||
|
- Settings → Resources → Proxies
|
||||||
|
- 配置 HTTP/HTTPS 代理
|
||||||
|
|
||||||
|
**方案 B:手动拉取镜像**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 手动拉取所需的基础镜像
|
||||||
|
docker pull node:18-alpine
|
||||||
|
docker pull mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
docker pull mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
|
||||||
|
# 然后再构建
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
**方案 C:使用阿里云镜像(推荐)**
|
||||||
|
|
||||||
|
如果你有阿里云账号,可以配置阿里云容器镜像服务的加速器:
|
||||||
|
|
||||||
|
1. 登录阿里云容器镜像服务:https://cr.console.aliyun.com/
|
||||||
|
2. 获取你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
|
||||||
|
3. 更新 `~/.docker/daemon.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://你的专属地址.mirror.aliyuncs.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 重启 Docker Desktop
|
||||||
|
|
||||||
|
### 检查网络连接
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试 Docker Hub 连接
|
||||||
|
curl -I https://registry-1.docker.io/v2/
|
||||||
|
|
||||||
|
# 测试镜像源连接
|
||||||
|
curl -I https://docker.mirrors.ustc.edu.cn/v2/
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
# Docker 构建网络问题解决方案
|
||||||
|
|
||||||
|
## 问题分析
|
||||||
|
|
||||||
|
**错误信息**:
|
||||||
|
```
|
||||||
|
dial tcp: lookup docker.mirrors.ustc.edu.cn: no such host
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因**:
|
||||||
|
- DNS 无法解析中科大镜像源地址
|
||||||
|
- Docker Desktop 仍在使用旧的镜像源配置
|
||||||
|
- 网络环境可能有限制
|
||||||
|
|
||||||
|
## 解决方案
|
||||||
|
|
||||||
|
### 方案一:重启 Docker Desktop(推荐先试这个)
|
||||||
|
|
||||||
|
1. **完全退出 Docker Desktop**
|
||||||
|
- 点击状态栏 Docker 图标
|
||||||
|
- 选择 "Quit Docker Desktop"
|
||||||
|
- 等待完全退出
|
||||||
|
|
||||||
|
2. **重新启动 Docker Desktop**
|
||||||
|
- 从 Applications 启动 Docker Desktop
|
||||||
|
- 等待完全启动(状态栏图标不再闪烁)
|
||||||
|
|
||||||
|
3. **验证新配置是否生效**
|
||||||
|
```bash
|
||||||
|
docker info | grep -A 10 "Registry Mirrors"
|
||||||
|
```
|
||||||
|
应该看到新的镜像源(阿里云、七牛云等)
|
||||||
|
|
||||||
|
4. **重新构建**
|
||||||
|
```bash
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案二:配置 Docker Desktop 代理(如果有代理)
|
||||||
|
|
||||||
|
如果你有可用的 HTTP/HTTPS 代理:
|
||||||
|
|
||||||
|
1. **打开 Docker Desktop 设置**
|
||||||
|
- 点击状态栏 Docker 图标 → Settings
|
||||||
|
|
||||||
|
2. **配置代理**
|
||||||
|
- 进入 "Resources" → "Proxies"
|
||||||
|
- 启用 "Manual proxy configuration"
|
||||||
|
- 填写代理地址和端口
|
||||||
|
- 点击 "Apply & Restart"
|
||||||
|
|
||||||
|
3. **重新构建**
|
||||||
|
|
||||||
|
### 方案三:使用阿里云容器镜像服务(推荐)
|
||||||
|
|
||||||
|
如果你有阿里云账号:
|
||||||
|
|
||||||
|
1. **登录阿里云容器镜像服务**
|
||||||
|
- 访问:https://cr.console.aliyun.com/
|
||||||
|
- 登录你的阿里云账号
|
||||||
|
|
||||||
|
2. **获取专属加速地址**
|
||||||
|
- 进入 "镜像加速器" 页面
|
||||||
|
- 复制你的专属加速地址(格式:`https://xxxxx.mirror.aliyuncs.com`)
|
||||||
|
|
||||||
|
3. **更新 Docker 配置**
|
||||||
|
```bash
|
||||||
|
cat > ~/.docker/daemon.json << EOF
|
||||||
|
{
|
||||||
|
"builder": {
|
||||||
|
"gc": {
|
||||||
|
"defaultKeepStorage": "20GB",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"experimental": false,
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://你的专属地址.mirror.aliyuncs.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **重启 Docker Desktop**
|
||||||
|
|
||||||
|
5. **重新构建**
|
||||||
|
|
||||||
|
### 方案四:手动拉取镜像后构建
|
||||||
|
|
||||||
|
如果镜像加速器配置正确,可以尝试手动拉取:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 手动拉取所需的基础镜像
|
||||||
|
docker pull node:18-alpine
|
||||||
|
docker pull mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
docker pull mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
|
||||||
|
# 如果拉取成功,再构建
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案五:使用 VPN 或科学上网工具
|
||||||
|
|
||||||
|
如果你有 VPN 或科学上网工具:
|
||||||
|
|
||||||
|
1. **启动 VPN/科学上网工具**
|
||||||
|
2. **配置系统代理**
|
||||||
|
3. **在 Docker Desktop 中配置代理**(参考方案二)
|
||||||
|
4. **重新构建**
|
||||||
|
|
||||||
|
### 方案六:修改 DNS 设置
|
||||||
|
|
||||||
|
如果 DNS 解析有问题,可以尝试:
|
||||||
|
|
||||||
|
1. **修改系统 DNS**
|
||||||
|
- 系统设置 → 网络 → 高级 → DNS
|
||||||
|
- 添加 DNS 服务器:`223.5.5.5`(阿里云)、`114.114.114.114`(114 DNS)
|
||||||
|
|
||||||
|
2. **刷新 DNS 缓存**
|
||||||
|
```bash
|
||||||
|
sudo dscacheutil -flushcache
|
||||||
|
sudo killall -HUP mDNSResponder
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **重启 Docker Desktop**
|
||||||
|
|
||||||
|
## 当前配置状态
|
||||||
|
|
||||||
|
已更新的镜像源配置(`~/.docker/daemon.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://registry.cn-hangzhou.aliyuncs.com",
|
||||||
|
"https://dockerhub.azk8s.cn",
|
||||||
|
"https://reg-mirror.qiniu.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**:需要重启 Docker Desktop 才能生效!
|
||||||
|
|
||||||
|
## 推荐操作顺序
|
||||||
|
|
||||||
|
1. ✅ **先试方案一**:重启 Docker Desktop
|
||||||
|
2. 如果还不行,**试方案三**:配置阿里云专属加速器
|
||||||
|
3. 如果还不行,**试方案二**:配置代理
|
||||||
|
4. 最后考虑**方案五**:使用 VPN
|
||||||
|
|
||||||
|
## 验证步骤
|
||||||
|
|
||||||
|
每次尝试后,运行以下命令验证:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 检查镜像源配置
|
||||||
|
docker info | grep -A 10 "Registry Mirrors"
|
||||||
|
|
||||||
|
# 2. 测试拉取镜像
|
||||||
|
docker pull node:18-alpine
|
||||||
|
|
||||||
|
# 3. 如果拉取成功,开始构建
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
# 视频预览功能测试指南
|
||||||
|
|
||||||
|
## ✅ 功能已实现
|
||||||
|
|
||||||
|
- ✅ 后端视频流接口(支持 Range 请求)
|
||||||
|
- ✅ 后端 Cookie 认证支持
|
||||||
|
- ✅ 前端视频播放器组件
|
||||||
|
- ✅ 表格预览按钮
|
||||||
|
|
||||||
|
## 🧪 测试步骤
|
||||||
|
|
||||||
|
### 步骤1:确保已登录
|
||||||
|
|
||||||
|
1. 访问 `http://localhost:8001`
|
||||||
|
2. 如果未登录,使用以下账号登录:
|
||||||
|
- 用户名:`douyin`
|
||||||
|
- 密码:`douyin2025`
|
||||||
|
|
||||||
|
### 步骤2:进入同步记录页面
|
||||||
|
|
||||||
|
1. 点击左侧菜单「同步记录」
|
||||||
|
2. 或直接访问:`http://localhost:8001/workplace`
|
||||||
|
|
||||||
|
### 步骤3:查找有视频的记录
|
||||||
|
|
||||||
|
在视频列表中:
|
||||||
|
- 找到有 `videoSavePath` 字段的记录
|
||||||
|
- 「预览」按钮应该是可点击的(不是灰色)
|
||||||
|
- 如果按钮是灰色的,说明该记录没有视频文件
|
||||||
|
|
||||||
|
### 步骤4:点击预览按钮
|
||||||
|
|
||||||
|
1. 点击视频行右侧「操作」列的「预览」按钮
|
||||||
|
2. 视频播放器模态框应该会打开
|
||||||
|
|
||||||
|
### 步骤5:测试播放功能
|
||||||
|
|
||||||
|
在视频播放器中测试:
|
||||||
|
- ✅ **播放/暂停**:点击播放按钮
|
||||||
|
- ✅ **音量控制**:调整音量滑块
|
||||||
|
- ✅ **进度条拖拽**:拖动进度条到任意位置(测试 Range 请求)
|
||||||
|
- ✅ **全屏播放**:点击全屏按钮
|
||||||
|
- ✅ **视频信息显示**:检查作者、分类、分辨率、文件大小是否正确显示
|
||||||
|
|
||||||
|
## 🔍 验证检查清单
|
||||||
|
|
||||||
|
### 前端检查
|
||||||
|
|
||||||
|
- [ ] 「预览」按钮可见且可点击
|
||||||
|
- [ ] 点击后模态框正常打开
|
||||||
|
- [ ] 视频信息正确显示
|
||||||
|
- [ ] 视频可以正常播放
|
||||||
|
- [ ] 进度条可以拖拽(Range 请求)
|
||||||
|
- [ ] 全屏功能正常
|
||||||
|
|
||||||
|
### 后端检查
|
||||||
|
|
||||||
|
- [ ] 视频流接口返回 200 状态码
|
||||||
|
- [ ] 支持 Range 请求(206 状态码)
|
||||||
|
- [ ] Cookie 认证正常工作
|
||||||
|
- [ ] 视频文件可以正常读取
|
||||||
|
|
||||||
|
## 🐛 常见问题排查
|
||||||
|
|
||||||
|
### 问题1:预览按钮是灰色的
|
||||||
|
|
||||||
|
**原因**:该视频记录没有 `videoSavePath` 字段
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
- 检查数据库中该视频是否有 `videoSavePath`
|
||||||
|
- 确认视频文件是否已下载
|
||||||
|
|
||||||
|
### 问题2:点击预览后没有反应
|
||||||
|
|
||||||
|
**检查**:
|
||||||
|
1. 打开浏览器控制台(F12)
|
||||||
|
2. 查看 Console 标签是否有错误
|
||||||
|
3. 查看 Network 标签,检查 `/api/video/stream/{id}` 请求
|
||||||
|
4. 查看请求状态码:
|
||||||
|
- `200`:成功
|
||||||
|
- `401`:未授权(需要重新登录)
|
||||||
|
- `404`:视频不存在
|
||||||
|
- `500`:服务器错误
|
||||||
|
|
||||||
|
### 问题3:视频无法播放
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
1. **401 未授权**:
|
||||||
|
- 检查是否已登录
|
||||||
|
- 检查 Cookie 中是否有 token
|
||||||
|
- 重新登录
|
||||||
|
|
||||||
|
2. **404 视频不存在**:
|
||||||
|
- 检查视频文件是否实际存在
|
||||||
|
- 检查 `videoSavePath` 路径是否正确
|
||||||
|
|
||||||
|
3. **视频格式不支持**:
|
||||||
|
- 检查浏览器是否支持该视频格式
|
||||||
|
- 尝试使用其他浏览器
|
||||||
|
|
||||||
|
4. **网络问题**:
|
||||||
|
- 检查后端服务是否正常运行
|
||||||
|
- 检查网络连接
|
||||||
|
|
||||||
|
### 问题4:视频加载很慢
|
||||||
|
|
||||||
|
**原因**:大文件需要时间加载
|
||||||
|
|
||||||
|
**解决方法**:
|
||||||
|
- 等待加载完成
|
||||||
|
- 检查网络速度
|
||||||
|
- 查看浏览器 Network 标签,确认下载速度
|
||||||
|
|
||||||
|
### 问题5:Range 请求不工作(无法拖拽)
|
||||||
|
|
||||||
|
**检查**:
|
||||||
|
1. 打开浏览器 Network 标签
|
||||||
|
2. 拖动视频进度条
|
||||||
|
3. 查看是否有新的请求,状态码应该是 `206`
|
||||||
|
4. 检查响应头是否有 `Content-Range` 字段
|
||||||
|
|
||||||
|
## 🔧 调试技巧
|
||||||
|
|
||||||
|
### 1. 浏览器控制台调试
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 在浏览器控制台执行,检查 token
|
||||||
|
document.cookie
|
||||||
|
|
||||||
|
// 检查视频 URL
|
||||||
|
// 打开视频播放器后,在控制台执行:
|
||||||
|
document.querySelector('video').src
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 网络请求检查
|
||||||
|
|
||||||
|
1. 按 `F12` 打开开发者工具
|
||||||
|
2. 切换到「Network」标签
|
||||||
|
3. 点击「预览」按钮
|
||||||
|
4. 查看 `/api/video/stream/{id}` 请求:
|
||||||
|
- **Request Headers**:检查是否有 Cookie
|
||||||
|
- **Response Headers**:检查 `Accept-Ranges: bytes`
|
||||||
|
- **Status Code**:应该是 200 或 206
|
||||||
|
|
||||||
|
### 3. 后端日志检查
|
||||||
|
|
||||||
|
查看后端日志文件:
|
||||||
|
```bash
|
||||||
|
tail -f logs/log-debug-20251120.txt | grep -E "(video|stream|401|404)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 测试记录模板
|
||||||
|
|
||||||
|
```
|
||||||
|
测试日期:____
|
||||||
|
测试浏览器:____
|
||||||
|
测试视频ID:____
|
||||||
|
测试结果:
|
||||||
|
- [ ] 预览按钮可见
|
||||||
|
- [ ] 模态框正常打开
|
||||||
|
- [ ] 视频信息显示正确
|
||||||
|
- [ ] 视频可以播放
|
||||||
|
- [ ] 进度条可以拖拽
|
||||||
|
- [ ] 全屏功能正常
|
||||||
|
- [ ] Range 请求正常(206状态码)
|
||||||
|
|
||||||
|
问题记录:
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 快速测试命令
|
||||||
|
|
||||||
|
### 测试 API(需要先登录获取 token)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 登录获取 token(通过浏览器登录后,从 Cookie 中获取)
|
||||||
|
# 2. 测试视频流接口
|
||||||
|
curl -H "Cookie: Authorization=Bearer YOUR_TOKEN" \
|
||||||
|
http://localhost:10101/api/video/stream/VIDEO_ID \
|
||||||
|
--output test_video.mp4
|
||||||
|
|
||||||
|
# 3. 测试 Range 请求
|
||||||
|
curl -H "Cookie: Authorization=Bearer YOUR_TOKEN" \
|
||||||
|
-H "Range: bytes=0-1023" \
|
||||||
|
http://localhost:10101/api/video/stream/VIDEO_ID \
|
||||||
|
-v
|
||||||
|
```
|
||||||
|
|
||||||
|
## ✅ 预期结果
|
||||||
|
|
||||||
|
1. **点击预览按钮** → 模态框打开
|
||||||
|
2. **视频加载** → 显示加载动画,然后显示视频
|
||||||
|
3. **点击播放** → 视频开始播放
|
||||||
|
4. **拖动进度条** → 视频跳转到对应位置(Range 请求)
|
||||||
|
5. **全屏播放** → 视频全屏显示
|
||||||
|
6. **关闭模态框** → 视频停止播放,模态框关闭
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**提示**:如果遇到问题,请按照上述排查步骤逐一检查,并查看浏览器控制台和网络请求的详细信息。
|
||||||
|
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
# 视频预览功能实现说明
|
||||||
|
|
||||||
|
## 📋 功能概述
|
||||||
|
|
||||||
|
已成功实现内置视频预览功能,用户可以在同步记录页面直接预览已下载的视频,无需下载到本地。
|
||||||
|
|
||||||
|
## ✨ 实现的功能
|
||||||
|
|
||||||
|
### 1. 后端 API 接口
|
||||||
|
|
||||||
|
#### 视频流接口
|
||||||
|
- **路径**: `GET /api/video/stream/{id}`
|
||||||
|
- **功能**: 提供视频文件流式传输,支持 HTTP Range 请求
|
||||||
|
- **特性**:
|
||||||
|
- ✅ 支持视频拖拽播放(Range 请求)
|
||||||
|
- ✅ 流式传输,不占用大量内存
|
||||||
|
- ✅ 自动识别视频格式(MP4、WebM、MOV 等)
|
||||||
|
- ✅ JWT 认证保护
|
||||||
|
|
||||||
|
#### 视频封面接口
|
||||||
|
- **路径**: `GET /api/video/cover/{id}`
|
||||||
|
- **功能**: 获取视频封面图片
|
||||||
|
- **特性**:
|
||||||
|
- ✅ 优先使用本地保存的封面
|
||||||
|
- ✅ 支持 JPG 格式
|
||||||
|
|
||||||
|
### 2. 前端组件
|
||||||
|
|
||||||
|
#### VideoPlayer 组件
|
||||||
|
- **位置**: `app/src/components/video/VideoPlayer.vue`
|
||||||
|
- **功能**: 视频播放器模态框组件
|
||||||
|
- **特性**:
|
||||||
|
- ✅ 使用 HTML5 `<video>` 标签
|
||||||
|
- ✅ 支持播放控制(播放/暂停/音量/全屏)
|
||||||
|
- ✅ 显示视频信息(作者、分类、分辨率、文件大小)
|
||||||
|
- ✅ 加载状态提示
|
||||||
|
- ✅ 错误处理和提示
|
||||||
|
- ✅ 响应式设计
|
||||||
|
|
||||||
|
#### 表格预览功能
|
||||||
|
- **位置**: `app/src/pages/workplace/RecordTable.vue`
|
||||||
|
- **功能**: 在视频列表表格中添加预览按钮
|
||||||
|
- **特性**:
|
||||||
|
- ✅ 操作列显示预览按钮
|
||||||
|
- ✅ 自动禁用无视频文件的记录
|
||||||
|
- ✅ 点击预览打开播放器模态框
|
||||||
|
|
||||||
|
## 🚀 使用方法
|
||||||
|
|
||||||
|
### 1. 预览视频
|
||||||
|
|
||||||
|
1. 进入「同步记录」页面
|
||||||
|
2. 在视频列表中找到要预览的视频
|
||||||
|
3. 点击「预览」按钮
|
||||||
|
4. 视频播放器会在模态框中打开
|
||||||
|
5. 可以播放、暂停、调整音量、全屏等操作
|
||||||
|
|
||||||
|
### 2. API 调用示例
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 获取视频流
|
||||||
|
const videoUrl = `/api/video/stream/${videoId}`;
|
||||||
|
|
||||||
|
// 在 video 标签中使用
|
||||||
|
<video :src="videoUrl" controls />
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 技术实现细节
|
||||||
|
|
||||||
|
### 后端实现
|
||||||
|
|
||||||
|
1. **视频流传输**
|
||||||
|
- 使用 `FileStream` 读取视频文件
|
||||||
|
- 启用 `enableRangeProcessing: true` 支持 Range 请求
|
||||||
|
- 自动设置 `Accept-Ranges: bytes` 响应头
|
||||||
|
- 根据文件扩展名设置正确的 Content-Type
|
||||||
|
|
||||||
|
2. **错误处理**
|
||||||
|
- 检查视频是否存在
|
||||||
|
- 检查文件是否存在
|
||||||
|
- 记录错误日志
|
||||||
|
|
||||||
|
### 前端实现
|
||||||
|
|
||||||
|
1. **视频播放器**
|
||||||
|
- 使用 Vue 3 Composition API
|
||||||
|
- 响应式设计,适配不同屏幕尺寸
|
||||||
|
- 加载状态和错误处理
|
||||||
|
- 文件大小格式化显示
|
||||||
|
|
||||||
|
2. **表格集成**
|
||||||
|
- 使用 Ant Design Vue 表格组件
|
||||||
|
- 自定义操作列模板
|
||||||
|
- 组件引用和方法调用
|
||||||
|
|
||||||
|
## 📁 文件结构
|
||||||
|
|
||||||
|
```
|
||||||
|
dysync.net/
|
||||||
|
├── Controllers/
|
||||||
|
│ └── VideoController.cs # 视频流和封面接口
|
||||||
|
├── service/
|
||||||
|
│ └── DyCollectVideoService.cs # 添加 GetByIdAsync 方法
|
||||||
|
├── app/src/
|
||||||
|
│ ├── components/
|
||||||
|
│ │ └── video/
|
||||||
|
│ │ └── VideoPlayer.vue # 视频播放器组件
|
||||||
|
│ └── pages/
|
||||||
|
│ └── workplace/
|
||||||
|
│ └── RecordTable.vue # 添加预览功能
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 优化建议
|
||||||
|
|
||||||
|
### 1. 性能优化
|
||||||
|
|
||||||
|
- ✅ **已实现**: Range 请求支持(视频拖拽播放)
|
||||||
|
- ✅ **已实现**: 流式传输(不占用大量内存)
|
||||||
|
- 💡 **建议**: 添加视频缓存策略(ETag、Last-Modified)
|
||||||
|
- 💡 **建议**: 添加 CDN 支持(如果视频文件很大)
|
||||||
|
|
||||||
|
### 2. 功能增强
|
||||||
|
|
||||||
|
- 💡 **建议**: 添加视频缩略图预览(鼠标悬停显示)
|
||||||
|
- 💡 **建议**: 添加播放历史记录
|
||||||
|
- 💡 **建议**: 添加播放速度控制
|
||||||
|
- 💡 **建议**: 添加字幕支持(如果有)
|
||||||
|
|
||||||
|
### 3. 用户体验
|
||||||
|
|
||||||
|
- 💡 **建议**: 添加视频卡片视图(网格布局)
|
||||||
|
- 💡 **建议**: 添加视频搜索和筛选
|
||||||
|
- 💡 **建议**: 添加视频收藏功能
|
||||||
|
- 💡 **建议**: 添加视频分享功能
|
||||||
|
|
||||||
|
### 4. 安全性
|
||||||
|
|
||||||
|
- ✅ **已实现**: JWT 认证保护
|
||||||
|
- 💡 **建议**: 添加视频访问权限控制
|
||||||
|
- 💡 **建议**: 添加视频水印(可选)
|
||||||
|
|
||||||
|
## 🐛 已知问题
|
||||||
|
|
||||||
|
1. **大文件加载**: 对于非常大的视频文件,首次加载可能需要一些时间
|
||||||
|
- **解决方案**: 已实现 Range 请求,支持分段加载
|
||||||
|
|
||||||
|
2. **浏览器兼容性**: 某些旧版浏览器可能不支持 HTML5 视频
|
||||||
|
- **解决方案**: 显示友好的错误提示
|
||||||
|
|
||||||
|
## 📝 后续优化方向
|
||||||
|
|
||||||
|
### 短期优化(1-2周)
|
||||||
|
|
||||||
|
1. 添加视频缩略图预览
|
||||||
|
2. 优化加载性能(添加加载进度条)
|
||||||
|
3. 添加视频播放历史记录
|
||||||
|
|
||||||
|
### 中期优化(1-2月)
|
||||||
|
|
||||||
|
1. 实现视频卡片视图
|
||||||
|
2. 添加视频搜索和高级筛选
|
||||||
|
3. 添加播放列表功能
|
||||||
|
|
||||||
|
### 长期优化(3-6月)
|
||||||
|
|
||||||
|
1. 视频转码和压缩
|
||||||
|
2. 多分辨率支持
|
||||||
|
3. 视频分析和统计
|
||||||
|
|
||||||
|
## 🔍 测试建议
|
||||||
|
|
||||||
|
1. **功能测试**
|
||||||
|
- 测试不同格式的视频(MP4、WebM、MOV)
|
||||||
|
- 测试不同大小的视频文件
|
||||||
|
- 测试 Range 请求(拖拽播放)
|
||||||
|
|
||||||
|
2. **性能测试**
|
||||||
|
- 测试大文件加载性能
|
||||||
|
- 测试并发播放性能
|
||||||
|
- 测试内存占用
|
||||||
|
|
||||||
|
3. **兼容性测试**
|
||||||
|
- 测试不同浏览器(Chrome、Firefox、Safari、Edge)
|
||||||
|
- 测试移动端浏览器
|
||||||
|
- 测试不同网络环境
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- [HTML5 Video API](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/video)
|
||||||
|
- [HTTP Range Requests](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests)
|
||||||
|
- [ASP.NET Core File Streaming](https://docs.microsoft.com/aspnet/core/mvc/models/file-uploads)
|
||||||
|
|
||||||
|
## ✅ 完成清单
|
||||||
|
|
||||||
|
- [x] 后端视频流接口
|
||||||
|
- [x] 后端视频封面接口
|
||||||
|
- [x] 前端视频播放器组件
|
||||||
|
- [x] 表格预览按钮
|
||||||
|
- [x] Range 请求支持
|
||||||
|
- [x] 错误处理
|
||||||
|
- [x] 加载状态提示
|
||||||
|
- [ ] 视频缩略图预览(可选)
|
||||||
|
- [ ] 视频卡片视图(可选)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**: 2024-11-19
|
||||||
|
**版本**: v1.0
|
||||||
|
|
||||||
+381
@@ -0,0 +1,381 @@
|
|||||||
|
# dysync.net 部署指南
|
||||||
|
|
||||||
|
本文档详细说明如何将修改后的项目部署到生产环境。
|
||||||
|
|
||||||
|
## 📋 目录
|
||||||
|
|
||||||
|
1. [准备工作](#准备工作)
|
||||||
|
2. [构建 Docker 镜像](#构建-docker-镜像)
|
||||||
|
3. [推送到镜像仓库](#推送到镜像仓库)
|
||||||
|
4. [使用 Docker Compose 部署](#使用-docker-compose-部署)
|
||||||
|
5. [验证部署](#验证部署)
|
||||||
|
6. [常见问题](#常见问题)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 准备工作
|
||||||
|
|
||||||
|
### 1. 环境要求
|
||||||
|
|
||||||
|
- **Docker**:版本 20.10+
|
||||||
|
- **Docker Compose**:版本 1.29+(或 Docker Compose V2)
|
||||||
|
- **.NET SDK 6.0**:用于构建项目(本地开发环境)
|
||||||
|
- **Node.js 18+**:用于构建前端(本地开发环境)
|
||||||
|
- **阿里云容器镜像服务账号**:用于推送镜像(或其他镜像仓库)
|
||||||
|
|
||||||
|
### 2. 创建必要的目录
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在项目根目录创建以下目录(如果不存在)
|
||||||
|
mkdir -p db collect favorite uper logs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 配置镜像仓库(阿里云)
|
||||||
|
|
||||||
|
1. 登录 [阿里云容器镜像服务](https://cr.console.aliyun.com/)
|
||||||
|
2. 创建命名空间(如:`jianzhichu`)
|
||||||
|
3. 创建镜像仓库(如:`dysync.net`)
|
||||||
|
4. 获取登录凭证
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ 构建 Docker 镜像
|
||||||
|
|
||||||
|
### 方式一:使用多阶段构建(推荐)
|
||||||
|
|
||||||
|
项目已提供优化的 `Dockerfile.prod`,包含前端和后端的完整构建:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在项目根目录执行
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二:手动构建前端后构建镜像
|
||||||
|
|
||||||
|
如果多阶段构建遇到问题,可以手动构建前端:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 构建前端
|
||||||
|
cd app
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# 2. 确保 app/dist 目录存在且包含构建产物
|
||||||
|
|
||||||
|
# 3. 使用原始 Dockerfile 构建
|
||||||
|
docker build -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 构建 ARM 架构镜像(适用于 Apple Silicon、树莓派等)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用 Dockerfile-arm(如果存在)
|
||||||
|
docker build -f Dockerfile-arm -t dysync.net:arm-latest .
|
||||||
|
|
||||||
|
# 或者使用 buildx 构建多架构镜像
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64 -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📤 推送到镜像仓库
|
||||||
|
|
||||||
|
### 1. 登录阿里云容器镜像服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 替换为你的实际信息
|
||||||
|
docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
|
||||||
|
# 输入密码(在阿里云控制台获取)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 标记镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 标记镜像(替换为你的实际仓库地址)
|
||||||
|
docker tag dysync.net:latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 如果构建了 ARM 版本
|
||||||
|
docker tag dysync.net:arm-latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 推送镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 推送 AMD64 版本
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 推送 ARM 版本(如果构建了)
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 使用 Docker Compose 部署
|
||||||
|
|
||||||
|
### 1. 准备 docker-compose.yml
|
||||||
|
|
||||||
|
项目根目录已包含 `docker-compose.yml` 文件,根据实际情况修改路径:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
dysync:
|
||||||
|
image: registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
container_name: dysync
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "10101:10101"
|
||||||
|
volumes:
|
||||||
|
- ./db:/app/db # 数据库目录
|
||||||
|
- ./collect:/app/collect # 收藏视频目录
|
||||||
|
- ./favorite:/app/favorite # 喜欢视频目录
|
||||||
|
- ./uper:/app/uper # 博主视频目录(可选)
|
||||||
|
- ./logs:/app/logs # 日志目录(可选)
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
dns:
|
||||||
|
- 8.8.8.8
|
||||||
|
- 114.114.114.114
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 修改路径映射
|
||||||
|
|
||||||
|
**重要**:根据你的实际存储路径修改 `volumes` 部分:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
# Linux/Unix 路径示例
|
||||||
|
- /volume1/docker/dysync/db:/app/db
|
||||||
|
- /volume2/media/dysync/collect:/app/collect
|
||||||
|
- /volume2/media/dysync/favorite:/app/favorite
|
||||||
|
|
||||||
|
# Windows 路径示例(使用正斜杠)
|
||||||
|
- D:/dysync/db:/app/db
|
||||||
|
- D:/dysync/collect:/app/collect
|
||||||
|
- D:/dysync/favorite:/app/favorite
|
||||||
|
|
||||||
|
# macOS 路径示例
|
||||||
|
- ~/dysync/db:/app/db
|
||||||
|
- ~/dysync/collect:/app/collect
|
||||||
|
- ~/dysync/favorite:/app/favorite
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 启动服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动服务(后台运行)
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# 查看服务状态
|
||||||
|
docker-compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 停止服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止服务
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# 停止并删除数据卷(谨慎使用,会删除数据)
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 验证部署
|
||||||
|
|
||||||
|
### 1. 检查容器状态
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps | grep dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
应该看到容器正在运行。
|
||||||
|
|
||||||
|
### 2. 检查日志
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker logs dysync
|
||||||
|
# 或
|
||||||
|
docker-compose logs -f dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
应该看到类似输出:
|
||||||
|
```
|
||||||
|
dy.net service started successfully
|
||||||
|
Now listening on: http://[::]:10101
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 访问应用
|
||||||
|
|
||||||
|
打开浏览器访问:
|
||||||
|
- **前端界面**:`http://你的服务器IP:10101`
|
||||||
|
- **Swagger API**:`http://你的服务器IP:10101/swagger`(如果启用)
|
||||||
|
|
||||||
|
### 4. 测试功能
|
||||||
|
|
||||||
|
1. 使用默认账号登录:`douyin` / `douyin2025`
|
||||||
|
2. 配置抖音 Cookie 和路径
|
||||||
|
3. 测试视频同步功能
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 更新部署
|
||||||
|
|
||||||
|
### 更新镜像并重启
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 拉取最新镜像
|
||||||
|
docker-compose pull
|
||||||
|
|
||||||
|
# 2. 重启服务(会使用新镜像)
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 3. 查看更新后的日志
|
||||||
|
docker-compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 重新构建并部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 构建新镜像
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 2. 标记并推送
|
||||||
|
docker tag dysync.net:latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 3. 在服务器上拉取并重启
|
||||||
|
docker-compose pull
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 常见问题
|
||||||
|
|
||||||
|
### 1. 镜像构建失败
|
||||||
|
|
||||||
|
**问题:前端构建失败**
|
||||||
|
```bash
|
||||||
|
# 检查 Node.js 版本
|
||||||
|
node --version # 应该是 18+
|
||||||
|
|
||||||
|
# 清除缓存重新构建
|
||||||
|
cd app
|
||||||
|
rm -rf node_modules dist
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:后端构建失败**
|
||||||
|
```bash
|
||||||
|
# 检查 .NET SDK 版本
|
||||||
|
dotnet --version # 应该是 6.0.x
|
||||||
|
|
||||||
|
# 清除构建缓存
|
||||||
|
dotnet clean
|
||||||
|
dotnet restore
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 容器启动失败
|
||||||
|
|
||||||
|
**问题:端口被占用**
|
||||||
|
```bash
|
||||||
|
# 检查端口占用
|
||||||
|
lsof -i :10101 # Linux/macOS
|
||||||
|
netstat -ano | findstr :10101 # Windows
|
||||||
|
|
||||||
|
# 修改 docker-compose.yml 中的端口映射
|
||||||
|
ports:
|
||||||
|
- "10102:10101" # 使用其他端口
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:权限错误**
|
||||||
|
```bash
|
||||||
|
# 确保目录有写权限
|
||||||
|
chmod -R 755 db collect favorite uper logs
|
||||||
|
|
||||||
|
# 或者使用 sudo(不推荐)
|
||||||
|
sudo docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 数据丢失问题
|
||||||
|
|
||||||
|
**问题:容器删除后数据丢失**
|
||||||
|
- 确保 `volumes` 配置正确
|
||||||
|
- 使用绝对路径而不是相对路径
|
||||||
|
- 定期备份 `db` 目录
|
||||||
|
|
||||||
|
### 4. 网络问题
|
||||||
|
|
||||||
|
**问题:无法访问外网**
|
||||||
|
- 检查 DNS 配置
|
||||||
|
- 检查防火墙设置
|
||||||
|
- 使用 `network_mode: bridge` 或 `host`
|
||||||
|
|
||||||
|
### 5. 镜像拉取失败
|
||||||
|
|
||||||
|
**问题:认证失败**
|
||||||
|
```bash
|
||||||
|
# 重新登录
|
||||||
|
docker logout registry.cn-hangzhou.aliyuncs.com
|
||||||
|
docker login registry.cn-hangzhou.aliyuncs.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:网络超时**
|
||||||
|
```bash
|
||||||
|
# 使用国内镜像加速器
|
||||||
|
# 在 /etc/docker/daemon.json 添加:
|
||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://docker.mirrors.ustc.edu.cn",
|
||||||
|
"https://hub-mirror.c.163.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 部署检查清单
|
||||||
|
|
||||||
|
- [ ] Docker 和 Docker Compose 已安装
|
||||||
|
- [ ] 创建了必要的目录(db, collect, favorite 等)
|
||||||
|
- [ ] 修改了 docker-compose.yml 中的路径映射
|
||||||
|
- [ ] 构建了 Docker 镜像(或使用现有镜像)
|
||||||
|
- [ ] 推送到镜像仓库(或使用本地镜像)
|
||||||
|
- [ ] 启动了 Docker Compose 服务
|
||||||
|
- [ ] 验证了容器正常运行
|
||||||
|
- [ ] 能够访问前端界面
|
||||||
|
- [ ] 能够登录系统
|
||||||
|
- [ ] 配置了抖音 Cookie 和路径
|
||||||
|
- [ ] 测试了视频同步功能
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 安全建议
|
||||||
|
|
||||||
|
1. **修改默认密码**:首次登录后立即修改默认密码
|
||||||
|
2. **使用 HTTPS**:生产环境建议配置反向代理(Nginx)并启用 HTTPS
|
||||||
|
3. **防火墙配置**:只开放必要的端口(10101)
|
||||||
|
4. **定期备份**:定期备份 `db` 目录和重要数据
|
||||||
|
5. **更新镜像**:定期更新镜像以获取安全补丁
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- [本地启动指南](./本地启动指南.md)
|
||||||
|
- [视频预览功能说明](./视频预览功能说明.md)
|
||||||
|
- [README.md](./README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**:2024-11-22
|
||||||
|
**版本**:v1.0
|
||||||
|
|
||||||
@@ -0,0 +1,368 @@
|
|||||||
|
# 镜像构建和推送指南
|
||||||
|
|
||||||
|
本文档说明如何构建 Docker 镜像并推送到阿里云容器镜像服务,以便在飞牛 NAS 上使用。
|
||||||
|
|
||||||
|
## 📋 目录
|
||||||
|
|
||||||
|
1. [前提条件](#前提条件)
|
||||||
|
2. [方式一:使用现有镜像(最简单)](#方式一使用现有镜像最简单)
|
||||||
|
3. [方式二:构建并推送镜像](#方式二构建并推送镜像)
|
||||||
|
4. [方式三:本地构建直接使用](#方式三本地构建直接使用)
|
||||||
|
5. [常见问题](#常见问题)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 前提条件
|
||||||
|
|
||||||
|
### 1. 阿里云容器镜像服务账号
|
||||||
|
|
||||||
|
- 注册 [阿里云账号](https://www.aliyun.com/)
|
||||||
|
- 开通 [容器镜像服务](https://cr.console.aliyun.com/)
|
||||||
|
- 创建命名空间(如:`jianzhichu`)
|
||||||
|
- 创建镜像仓库(如:`dysync.net`)
|
||||||
|
|
||||||
|
### 2. 获取登录凭证
|
||||||
|
|
||||||
|
1. 登录阿里云容器镜像服务控制台
|
||||||
|
2. 进入「访问凭证」
|
||||||
|
3. 设置固定密码或临时密码
|
||||||
|
4. 记录用户名和密码
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 方式一:使用现有镜像(最简单)
|
||||||
|
|
||||||
|
**如果镜像仓库中已经有镜像,直接拉取即可,无需上传!**
|
||||||
|
|
||||||
|
### 检查镜像是否存在
|
||||||
|
|
||||||
|
1. 访问:`https://cr.console.aliyun.com/`
|
||||||
|
2. 进入你的命名空间
|
||||||
|
3. 查看是否有 `dysync.net` 仓库
|
||||||
|
4. 查看是否有 `latest` 标签的镜像
|
||||||
|
|
||||||
|
### 如果镜像存在
|
||||||
|
|
||||||
|
直接在飞牛 NAS 上拉取:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**无需任何上传操作!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ 方式二:构建并推送镜像
|
||||||
|
|
||||||
|
**如果你修改了代码,或者镜像不存在,需要自己构建并推送。**
|
||||||
|
|
||||||
|
### 步骤 1:在本地构建镜像
|
||||||
|
|
||||||
|
#### 1.1 准备构建环境
|
||||||
|
|
||||||
|
确保本地已安装:
|
||||||
|
- Docker Desktop(Mac/Windows)或 Docker Engine(Linux)
|
||||||
|
- .NET SDK 6.0(可选,如果使用 Dockerfile.prod)
|
||||||
|
- Node.js 18+(可选,如果使用 Dockerfile.prod)
|
||||||
|
|
||||||
|
#### 1.2 构建镜像
|
||||||
|
|
||||||
|
**使用多阶段构建(推荐):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在项目根目录
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
**或使用原始 Dockerfile(需要先构建前端):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 先构建前端
|
||||||
|
cd app
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# 2. 构建镜像
|
||||||
|
docker build -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 1.3 验证镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看镜像
|
||||||
|
docker images | grep dysync
|
||||||
|
|
||||||
|
# 测试运行(可选)
|
||||||
|
docker run -d -p 10101:10101 --name dysync-test dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:登录阿里云镜像仓库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 登录(替换为你的实际信息)
|
||||||
|
docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
|
||||||
|
|
||||||
|
# 输入密码(在阿里云控制台获取)
|
||||||
|
```
|
||||||
|
|
||||||
|
**获取登录信息:**
|
||||||
|
1. 登录阿里云容器镜像服务控制台
|
||||||
|
2. 点击右上角「访问凭证」
|
||||||
|
3. 设置固定密码或使用临时密码
|
||||||
|
|
||||||
|
### 步骤 3:标记镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 标记镜像(替换为你的实际仓库地址)
|
||||||
|
docker tag dysync.net:latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 如果构建了 ARM 版本
|
||||||
|
docker tag dysync.net:arm-latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4:推送镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 推送 AMD64 版本
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 推送 ARM 版本(如果构建了)
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 5:在飞牛 NAS 上拉取
|
||||||
|
|
||||||
|
推送成功后,在飞牛 NAS 上拉取:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💻 方式三:本地构建直接使用
|
||||||
|
|
||||||
|
**如果你不想推送到远程仓库,可以在飞牛 NAS 上直接构建。**
|
||||||
|
|
||||||
|
### 步骤 1:上传项目文件
|
||||||
|
|
||||||
|
1. 将整个项目文件夹上传到飞牛 NAS
|
||||||
|
2. 建议放在:`/volume1/dysync/source/`
|
||||||
|
|
||||||
|
### 步骤 2:SSH 连接到飞牛 NAS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh admin@你的飞牛NAS IP
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:构建镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入项目目录
|
||||||
|
cd /volume1/dysync/source
|
||||||
|
|
||||||
|
# 构建镜像(使用多阶段构建)
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 或使用原始 Dockerfile(需要先构建前端)
|
||||||
|
cd app
|
||||||
|
pnpm install # 或 npm install
|
||||||
|
pnpm build # 或 npm run build
|
||||||
|
cd ..
|
||||||
|
docker build -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4:使用本地镜像
|
||||||
|
|
||||||
|
修改 `docker-compose.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
dysync:
|
||||||
|
image: dysync.net:latest # 使用本地镜像
|
||||||
|
# ... 其他配置
|
||||||
|
```
|
||||||
|
|
||||||
|
或直接在 Docker 界面中选择本地镜像。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 完整流程示例
|
||||||
|
|
||||||
|
### 场景:首次部署,镜像不存在
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 在本地电脑构建镜像
|
||||||
|
cd /path/to/dysync.net
|
||||||
|
docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 2. 登录阿里云
|
||||||
|
docker login registry.cn-hangzhou.aliyuncs.com
|
||||||
|
|
||||||
|
# 3. 标记镜像
|
||||||
|
docker tag dysync.net:latest registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 4. 推送镜像
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 5. 在飞牛 NAS 上拉取
|
||||||
|
ssh admin@飞牛NAS IP
|
||||||
|
docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 6. 使用 docker-compose 部署
|
||||||
|
cd /volume1/dysync
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 场景:使用现有镜像(最简单)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 直接在飞牛 NAS 上拉取
|
||||||
|
docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 使用 docker-compose 部署
|
||||||
|
cd /volume1/dysync
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 常见问题
|
||||||
|
|
||||||
|
### 1. 镜像拉取失败
|
||||||
|
|
||||||
|
**问题:镜像不存在**
|
||||||
|
|
||||||
|
```
|
||||||
|
Error response from daemon: pull access denied
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
- 检查镜像地址是否正确
|
||||||
|
- 确认镜像是否已推送到仓库
|
||||||
|
- 如果镜像不存在,需要先构建并推送(方式二)
|
||||||
|
|
||||||
|
**问题:认证失败**
|
||||||
|
|
||||||
|
```
|
||||||
|
Error response from daemon: unauthorized
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
```bash
|
||||||
|
# 重新登录
|
||||||
|
docker logout registry.cn-hangzhou.aliyuncs.com
|
||||||
|
docker login registry.cn-hangzhou.aliyuncs.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 镜像推送失败
|
||||||
|
|
||||||
|
**问题:权限不足**
|
||||||
|
|
||||||
|
```
|
||||||
|
denied: requested access to the resource is denied
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
- 检查命名空间和仓库名称是否正确
|
||||||
|
- 确认账号有推送权限
|
||||||
|
- 检查是否已正确登录
|
||||||
|
|
||||||
|
**问题:网络超时**
|
||||||
|
|
||||||
|
```
|
||||||
|
net/http: TLS handshake timeout
|
||||||
|
```
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
- 检查网络连接
|
||||||
|
- 使用镜像加速器
|
||||||
|
- 重试推送
|
||||||
|
|
||||||
|
### 3. 构建失败
|
||||||
|
|
||||||
|
**问题:前端构建失败**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 清除缓存重新构建
|
||||||
|
cd app
|
||||||
|
rm -rf node_modules dist
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题:后端构建失败**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 清除构建缓存
|
||||||
|
dotnet clean
|
||||||
|
dotnet restore
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 快速参考
|
||||||
|
|
||||||
|
### 检查镜像是否存在
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看本地镜像
|
||||||
|
docker images | grep dysync
|
||||||
|
|
||||||
|
# 尝试拉取(如果失败说明不存在)
|
||||||
|
docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 完整构建和推送命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 一键构建和推送脚本
|
||||||
|
#!/bin/bash
|
||||||
|
IMAGE_NAME="dysync.net:latest"
|
||||||
|
REGISTRY="registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest"
|
||||||
|
|
||||||
|
# 构建
|
||||||
|
docker build -f Dockerfile.prod -t $IMAGE_NAME .
|
||||||
|
|
||||||
|
# 登录(需要手动输入密码)
|
||||||
|
docker login registry.cn-hangzhou.aliyuncs.com
|
||||||
|
|
||||||
|
# 标记
|
||||||
|
docker tag $IMAGE_NAME $REGISTRY
|
||||||
|
|
||||||
|
# 推送
|
||||||
|
docker push $REGISTRY
|
||||||
|
|
||||||
|
echo "镜像推送完成: $REGISTRY"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 推荐方案
|
||||||
|
|
||||||
|
### 方案 A:使用现有镜像(推荐新手)
|
||||||
|
|
||||||
|
- ✅ 最简单,无需构建
|
||||||
|
- ✅ 直接拉取即可使用
|
||||||
|
- ❌ 无法自定义代码
|
||||||
|
|
||||||
|
### 方案 B:构建并推送(推荐开发者)
|
||||||
|
|
||||||
|
- ✅ 可以自定义代码
|
||||||
|
- ✅ 一次推送,多处使用
|
||||||
|
- ❌ 需要构建和推送步骤
|
||||||
|
|
||||||
|
### 方案 C:本地构建(推荐私有部署)
|
||||||
|
|
||||||
|
- ✅ 完全私有,不依赖外部服务
|
||||||
|
- ✅ 适合内网环境
|
||||||
|
- ❌ 需要在每台设备上构建
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**:2024-11-22
|
||||||
|
**版本**:v1.0
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,770 @@
|
|||||||
|
# 飞牛 NAS 部署完整指南
|
||||||
|
|
||||||
|
本文档提供在飞牛 NAS 上部署 dysync.net 项目的完整步骤,包括环境准备、文件上传、镜像构建、容器部署和故障排查。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 目录
|
||||||
|
|
||||||
|
1. [环境准备](#环境准备)
|
||||||
|
2. [上传项目文件到 NAS](#上传项目文件到-nas)
|
||||||
|
3. [在 NAS 上构建 Docker 镜像](#在-nas-上构建-docker-镜像)
|
||||||
|
4. [配置和部署容器](#配置和部署容器)
|
||||||
|
5. [验证服务](#验证服务)
|
||||||
|
6. [常用管理命令](#常用管理命令)
|
||||||
|
7. [故障排查](#故障排查)
|
||||||
|
8. [更新部署](#更新部署)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 环境准备
|
||||||
|
|
||||||
|
### 本地电脑(Mac)
|
||||||
|
|
||||||
|
1. **SSH 客户端**(macOS 自带,无需安装)
|
||||||
|
2. **项目文件**:确保项目代码已准备好
|
||||||
|
|
||||||
|
### 飞牛 NAS 环境
|
||||||
|
|
||||||
|
- Docker 已安装并运行
|
||||||
|
- SSH 服务已启用
|
||||||
|
- 有足够的磁盘空间(建议至少 10GB)
|
||||||
|
- 已创建项目目录:`/vol2/1000/docker/dysync`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📤 上传项目文件到 NAS
|
||||||
|
|
||||||
|
### 步骤 1:压缩项目文件
|
||||||
|
|
||||||
|
在本地电脑上执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 进入项目根目录
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 2. 压缩项目文件(排除不必要的文件)
|
||||||
|
# 注意:将压缩文件输出到父目录,避免包含压缩文件本身
|
||||||
|
tar -czf ../dysync.net.tar.gz \
|
||||||
|
--exclude='.git' \
|
||||||
|
--exclude='node_modules' \
|
||||||
|
--exclude='app/node_modules' \
|
||||||
|
--exclude='bin' \
|
||||||
|
--exclude='obj' \
|
||||||
|
--exclude='.vs' \
|
||||||
|
--exclude='.idea' \
|
||||||
|
--exclude='videos' \
|
||||||
|
--exclude='*.md' \
|
||||||
|
--exclude='docs' \
|
||||||
|
--exclude='*.tar.gz' \
|
||||||
|
.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:上传到 NAS
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 上传到 NAS(替换为你的 NAS IP 和用户名)
|
||||||
|
scp ../dysync.net.tar.gz 你的用户名@NAS_IP:/vol2/1000/docker/dysync/
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
scp ../dysync.net.tar.gz adminym@192.168.1.99:/vol2/1000/docker/dysync/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:在 NAS 上解压文件
|
||||||
|
|
||||||
|
SSH 连接到 NAS 后执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 进入目录
|
||||||
|
cd /vol2/1000/docker/dysync
|
||||||
|
|
||||||
|
# 2. 创建项目文件夹并解压
|
||||||
|
mkdir -p dysync.net
|
||||||
|
tar -xzf dysync.net.tar.gz -C dysync.net/
|
||||||
|
|
||||||
|
# 3. 验证文件已解压
|
||||||
|
ls -la dysync.net/
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**:解压时可能会看到很多 `tar: Ignoring unknown extended header keyword` 警告,这是正常的,不影响文件解压。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐳 在 NAS 上构建 Docker 镜像
|
||||||
|
|
||||||
|
### 步骤 1:配置 Docker 镜像加速器(可选)
|
||||||
|
|
||||||
|
飞牛 NAS 自带镜像源,通常无需配置。如果遇到网络问题,可以配置:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建 Docker 配置目录
|
||||||
|
sudo mkdir -p /etc/docker
|
||||||
|
|
||||||
|
# 创建镜像加速器配置
|
||||||
|
sudo tee /etc/docker/daemon.json << 'EOF'
|
||||||
|
{
|
||||||
|
"registry-mirrors": [
|
||||||
|
"https://docker.mirrors.ustc.edu.cn",
|
||||||
|
"https://hub-mirror.c.163.com",
|
||||||
|
"https://registry.cn-hangzhou.aliyuncs.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 重启 Docker 服务
|
||||||
|
sudo systemctl restart docker
|
||||||
|
sleep 5
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:手动拉取基础镜像(推荐)
|
||||||
|
|
||||||
|
避免构建时网络问题,先手动拉取:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 拉取所需的基础镜像
|
||||||
|
sudo docker pull node:18-alpine
|
||||||
|
sudo docker pull mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
sudo docker pull mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
|
||||||
|
# 验证镜像已拉取
|
||||||
|
sudo docker images | grep -E "node|dotnet"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:检查并修复 Dockerfile
|
||||||
|
|
||||||
|
确保 Dockerfile.prod 配置正确:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 检查 Dockerfile.prod 是否存在
|
||||||
|
ls -la Dockerfile.prod
|
||||||
|
|
||||||
|
# 检查关键配置
|
||||||
|
cat Dockerfile.prod | grep -E "dotnet restore|dotnet publish"
|
||||||
|
```
|
||||||
|
|
||||||
|
**重要修复**:如果 Dockerfile 中缺少项目文件指定,需要修复:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 修复 dotnet restore 命令
|
||||||
|
sudo sed -i 's/RUN dotnet restore/RUN dotnet restore dy.net.csproj/' Dockerfile.prod
|
||||||
|
|
||||||
|
# 修复 dotnet publish 命令
|
||||||
|
sudo sed -i 's/RUN dotnet publish -c Release -o \/app\/publish/RUN dotnet publish dy.net.csproj -c Release -o \/app\/publish/' Dockerfile.prod
|
||||||
|
```
|
||||||
|
|
||||||
|
**配置 npm/pnpm 镜像源**:编辑 Dockerfile.prod,确保包含国内镜像源配置:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano Dockerfile.prod
|
||||||
|
```
|
||||||
|
|
||||||
|
找到前端构建部分(约第 10-18 行),确保格式如下:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# 配置 npm 和 pnpm 使用国内镜像源
|
||||||
|
RUN npm config set registry https://registry.npmmirror.com && \
|
||||||
|
npm install -g pnpm && \
|
||||||
|
pnpm config set registry https://registry.npmmirror.com && \
|
||||||
|
if [ -f pnpm-lock.yaml ]; then \
|
||||||
|
pnpm install --frozen-lockfile; \
|
||||||
|
else \
|
||||||
|
npm install; \
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**添加删除 macOS 资源分叉文件的步骤**:在 Dockerfile.prod 的 `COPY . .` 之后添加:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano Dockerfile.prod
|
||||||
|
```
|
||||||
|
|
||||||
|
在 `COPY . .` 之后添加:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# 复制所有文件
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# 删除 macOS 资源分叉文件(._* 文件)
|
||||||
|
RUN find . -name "._*" -type f -delete
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4:更新 .dockerignore
|
||||||
|
|
||||||
|
确保排除 macOS 资源分叉文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 添加排除规则
|
||||||
|
echo "._*" >> .dockerignore
|
||||||
|
|
||||||
|
# 验证
|
||||||
|
tail -5 .dockerignore
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 5:构建 Docker 镜像
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 确保在项目目录
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 构建镜像(这可能需要 10-30 分钟)
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 验证镜像构建成功
|
||||||
|
sudo docker images | grep dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
**构建成功标志**:
|
||||||
|
```
|
||||||
|
Successfully built abc123def456
|
||||||
|
Successfully tagged dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ 配置和部署容器
|
||||||
|
|
||||||
|
### 步骤 1:配置 docker-compose 文件
|
||||||
|
|
||||||
|
确保 docker-compose.feiniu.vol2.yml 文件存在且配置正确:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 查看配置文件
|
||||||
|
cat docker-compose.feiniu.vol2.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
配置文件应该类似这样:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
dysync:
|
||||||
|
image: dysync.net:latest
|
||||||
|
container_name: dysync
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "10101:10101"
|
||||||
|
volumes:
|
||||||
|
# 数据库目录(必须配置,防止数据丢失)
|
||||||
|
- /vol2/1000/docker/dysync/db:/app/db
|
||||||
|
# 收藏视频目录
|
||||||
|
- /vol2/1000/docker/dysync/collect:/app/collect
|
||||||
|
# 喜欢视频目录
|
||||||
|
- /vol2/1000/docker/dysync/favorite:/app/favorite
|
||||||
|
# 博主视频目录(可选)
|
||||||
|
- /vol2/1000/docker/dysync/uper:/app/uper
|
||||||
|
# 日志目录(可选,方便查看日志)
|
||||||
|
- /vol2/1000/docker/dysync/logs:/app/logs
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
# 配置DNS服务器(解决域名解析失败导致的无法访问外网)
|
||||||
|
dns:
|
||||||
|
- 8.8.8.8 # Google DNS
|
||||||
|
- 114.114.114.114 # 国内DNS
|
||||||
|
- 223.5.5.5 # 阿里DNS
|
||||||
|
# 网络模式
|
||||||
|
network_mode: bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:创建数据目录
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建必要的数据目录
|
||||||
|
sudo mkdir -p /vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}
|
||||||
|
|
||||||
|
# 设置目录权限(确保容器可以读写)
|
||||||
|
sudo chmod -R 755 /vol2/1000/docker/dysync
|
||||||
|
|
||||||
|
# 验证目录创建成功
|
||||||
|
ls -la /vol2/1000/docker/dysync/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:启动容器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 确保在项目目录
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 使用 docker compose 启动容器(推荐)
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 如果上面的命令不存在,尝试:
|
||||||
|
sudo docker-compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**启动成功标志**:
|
||||||
|
```
|
||||||
|
[+] Running 1/1
|
||||||
|
✔ Container dysync Started
|
||||||
|
```
|
||||||
|
|
||||||
|
如果 docker-compose 命令都不存在,可以直接运行容器:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo docker run -d \
|
||||||
|
--name dysync \
|
||||||
|
-p 10101:10101 \
|
||||||
|
-v /vol2/1000/docker/dysync/db:/app/db \
|
||||||
|
-v /vol2/1000/docker/dysync/collect:/app/collect \
|
||||||
|
-v /vol2/1000/docker/dysync/favorite:/app/favorite \
|
||||||
|
-v /vol2/1000/docker/dysync/uper:/app/uper \
|
||||||
|
-v /vol2/1000/docker/dysync/logs:/app/logs \
|
||||||
|
--restart always \
|
||||||
|
--dns 8.8.8.8 \
|
||||||
|
--dns 114.114.114.114 \
|
||||||
|
--dns 223.5.5.5 \
|
||||||
|
-e TZ=Asia/Shanghai \
|
||||||
|
-e ASPNETCORE_ENVIRONMENT=Production \
|
||||||
|
dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 验证服务
|
||||||
|
|
||||||
|
### 步骤 1:检查容器状态
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看容器是否运行
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
|
||||||
|
# 查看容器详细信息
|
||||||
|
sudo docker ps -a | grep dysync
|
||||||
|
|
||||||
|
# 查看容器日志(检查服务是否正常启动)
|
||||||
|
sudo docker logs dysync
|
||||||
|
|
||||||
|
# 如果日志很多,只看最后50行
|
||||||
|
sudo docker logs --tail 50 dysync
|
||||||
|
|
||||||
|
# 实时查看日志(按 Ctrl+C 退出)
|
||||||
|
sudo docker logs -f dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:测试服务访问
|
||||||
|
|
||||||
|
**在本地电脑上测试**(不是 NAS):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试服务是否可访问(替换为你的 NAS IP)
|
||||||
|
curl http://你的NAS_IP:10101
|
||||||
|
|
||||||
|
# 或者在浏览器中访问
|
||||||
|
# http://你的NAS_IP:10101
|
||||||
|
```
|
||||||
|
|
||||||
|
**成功标志**:
|
||||||
|
- 容器状态显示 `Up` 或 `running`
|
||||||
|
- 日志中看到类似 `Now listening on: http://[::]:10101` 的信息
|
||||||
|
- 浏览器可以访问服务页面
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ 常用管理命令
|
||||||
|
|
||||||
|
### 容器管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止容器
|
||||||
|
sudo docker stop dysync
|
||||||
|
|
||||||
|
# 启动容器
|
||||||
|
sudo docker start dysync
|
||||||
|
|
||||||
|
# 重启容器
|
||||||
|
sudo docker restart dysync
|
||||||
|
|
||||||
|
# 删除容器(需要先停止)
|
||||||
|
sudo docker stop dysync
|
||||||
|
sudo docker rm dysync
|
||||||
|
|
||||||
|
# 查看容器资源使用情况
|
||||||
|
sudo docker stats dysync
|
||||||
|
|
||||||
|
# 进入容器内部(调试用)
|
||||||
|
sudo docker exec -it dysync /bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
### 日志管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看日志
|
||||||
|
sudo docker logs dysync
|
||||||
|
|
||||||
|
# 查看最后 N 行日志
|
||||||
|
sudo docker logs --tail 100 dysync
|
||||||
|
|
||||||
|
# 实时查看日志
|
||||||
|
sudo docker logs -f dysync
|
||||||
|
|
||||||
|
# 查看日志并包含时间戳
|
||||||
|
sudo docker logs -t dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用 docker-compose 管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动服务
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 停止服务
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
|
||||||
|
# 重启服务
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml restart
|
||||||
|
|
||||||
|
# 查看服务状态
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml ps
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 镜像管理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看所有镜像
|
||||||
|
sudo docker images
|
||||||
|
|
||||||
|
# 删除镜像
|
||||||
|
sudo docker rmi dysync.net:latest
|
||||||
|
|
||||||
|
# 重新构建镜像(更新代码后)
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 故障排查
|
||||||
|
|
||||||
|
### 问题 1:容器无法启动
|
||||||
|
|
||||||
|
**检查步骤**:
|
||||||
|
```bash
|
||||||
|
# 1. 查看容器状态
|
||||||
|
sudo docker ps -a | grep dysync
|
||||||
|
|
||||||
|
# 2. 查看详细日志
|
||||||
|
sudo docker logs dysync
|
||||||
|
|
||||||
|
# 3. 检查端口是否被占用
|
||||||
|
sudo netstat -tulpn | grep 10101
|
||||||
|
|
||||||
|
# 4. 检查目录权限
|
||||||
|
ls -la /vol2/1000/docker/dysync/
|
||||||
|
```
|
||||||
|
|
||||||
|
**常见原因**:
|
||||||
|
- 端口被占用:修改 `docker-compose.feiniu.vol2.yml` 中的端口映射
|
||||||
|
- 目录权限不足:执行 `sudo chmod -R 755 /vol2/1000/docker/dysync`
|
||||||
|
- 镜像不存在:重新构建镜像
|
||||||
|
|
||||||
|
### 问题 2:服务无法访问
|
||||||
|
|
||||||
|
**检查步骤**:
|
||||||
|
```bash
|
||||||
|
# 1. 检查容器是否运行
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
|
||||||
|
# 2. 检查端口映射
|
||||||
|
sudo docker port dysync
|
||||||
|
|
||||||
|
# 3. 检查防火墙设置(在 NAS 管理界面)
|
||||||
|
# 4. 检查网络连接
|
||||||
|
ping 你的NAS_IP
|
||||||
|
```
|
||||||
|
|
||||||
|
**常见原因**:
|
||||||
|
- 防火墙阻止:在 NAS 管理界面开放 10101 端口
|
||||||
|
- 容器未启动:执行 `sudo docker start dysync`
|
||||||
|
- 网络问题:检查 NAS 网络配置
|
||||||
|
|
||||||
|
### 问题 3:构建镜像失败
|
||||||
|
|
||||||
|
#### 3.1 网络超时问题
|
||||||
|
|
||||||
|
**症状**:构建时出现 `ERR_SOCKET_TIMEOUT` 或 `ECONNRESET` 错误
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
1. 确保 Dockerfile.prod 中配置了 npm/pnpm 镜像源
|
||||||
|
2. 手动拉取基础镜像后再构建
|
||||||
|
3. 配置 Docker 镜像加速器
|
||||||
|
|
||||||
|
#### 3.2 macOS 资源分叉文件问题
|
||||||
|
|
||||||
|
**症状**:构建时出现 `CS2015: '._xxx.cs' is a binary file instead of a text file` 错误
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
1. 在 `.dockerignore` 中添加 `._*`
|
||||||
|
2. 在 Dockerfile.prod 中添加删除步骤:`RUN find . -name "._*" -type f -delete`
|
||||||
|
|
||||||
|
#### 3.3 dotnet 命令缺少项目文件
|
||||||
|
|
||||||
|
**症状**:构建时出现 `MSB1011: Specify which project or solution file to use` 错误
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
```bash
|
||||||
|
# 修复 Dockerfile.prod
|
||||||
|
sudo sed -i 's/RUN dotnet restore/RUN dotnet restore dy.net.csproj/' Dockerfile.prod
|
||||||
|
sudo sed -i 's/RUN dotnet publish -c Release -o \/app\/publish/RUN dotnet publish dy.net.csproj -c Release -o \/app\/publish/' Dockerfile.prod
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 4:数据丢失
|
||||||
|
|
||||||
|
**预防措施**:
|
||||||
|
- 确保所有数据目录都正确挂载到宿主机
|
||||||
|
- 定期备份 `/vol2/1000/docker/dysync/db` 目录
|
||||||
|
- 使用 `--restart always` 确保容器自动重启
|
||||||
|
|
||||||
|
**恢复数据**:
|
||||||
|
```bash
|
||||||
|
# 检查数据目录
|
||||||
|
ls -la /vol2/1000/docker/dysync/db/
|
||||||
|
|
||||||
|
# 如果有备份,恢复备份
|
||||||
|
# cp -r /backup/db/* /vol2/1000/docker/dysync/db/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 更新部署
|
||||||
|
|
||||||
|
当本地项目修改后,需要重新部署到 NAS。以下是完整的更新流程:
|
||||||
|
|
||||||
|
### 方法一:重新构建镜像(推荐,适合代码修改)
|
||||||
|
|
||||||
|
#### 步骤 1:在本地压缩并上传新版本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 在本地电脑上,进入项目根目录
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 2. 压缩项目文件(排除不必要的文件)
|
||||||
|
tar -czf ../dysync.net.tar.gz \
|
||||||
|
--exclude='.git' \
|
||||||
|
--exclude='node_modules' \
|
||||||
|
--exclude='app/node_modules' \
|
||||||
|
--exclude='bin' \
|
||||||
|
--exclude='obj' \
|
||||||
|
--exclude='.vs' \
|
||||||
|
--exclude='.idea' \
|
||||||
|
--exclude='videos' \
|
||||||
|
--exclude='*.md' \
|
||||||
|
--exclude='docs' \
|
||||||
|
--exclude='*.tar.gz' \
|
||||||
|
.
|
||||||
|
|
||||||
|
# 3. 上传到 NAS(替换为你的实际信息)
|
||||||
|
scp ../dysync.net.tar.gz 你的用户名@NAS_IP:/vol2/1000/docker/dysync/
|
||||||
|
# 示例:scp ../dysync.net.tar.gz adminym@192.168.1.99:/vol2/1000/docker/dysync/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 步骤 2:在 NAS 上更新文件并重新部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. SSH 连接到 NAS
|
||||||
|
ssh 你的用户名@NAS_IP
|
||||||
|
# 示例:ssh adminym@192.168.1.99
|
||||||
|
|
||||||
|
# 2. 进入项目目录
|
||||||
|
cd /vol2/1000/docker/dysync
|
||||||
|
|
||||||
|
# 3. 备份旧版本(可选,建议)
|
||||||
|
mv dysync.net dysync.net.backup.$(date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
# 4. 创建新的项目目录并解压
|
||||||
|
mkdir -p dysync.net
|
||||||
|
tar -xzf dysync.net.tar.gz -C dysync.net/
|
||||||
|
|
||||||
|
# 5. 停止并删除旧容器
|
||||||
|
cd dysync.net
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
# 或者如果容器名称是 dysync:
|
||||||
|
# sudo docker stop dysync && sudo docker rm dysync
|
||||||
|
|
||||||
|
# 6. 删除旧镜像(可选,释放空间)
|
||||||
|
sudo docker rmi dysync.net:latest
|
||||||
|
|
||||||
|
# 7. 重新构建镜像
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 8. 启动新容器
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 9. 验证服务
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
sudo docker logs --tail 50 dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 一键更新脚本(可选)
|
||||||
|
|
||||||
|
你也可以创建一个更新脚本 `update.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# 更新部署脚本
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "开始更新部署..."
|
||||||
|
|
||||||
|
# 1. 停止并删除旧容器
|
||||||
|
echo "停止旧容器..."
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down || true
|
||||||
|
|
||||||
|
# 2. 删除旧镜像(可选)
|
||||||
|
read -p "是否删除旧镜像以释放空间?(y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
sudo docker rmi dysync.net:latest || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. 重新构建镜像
|
||||||
|
echo "构建新镜像..."
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 4. 启动新容器
|
||||||
|
echo "启动新容器..."
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 5. 查看日志
|
||||||
|
echo "查看容器日志..."
|
||||||
|
sleep 3
|
||||||
|
sudo docker logs --tail 50 dysync
|
||||||
|
|
||||||
|
echo "更新完成!"
|
||||||
|
```
|
||||||
|
|
||||||
|
使用方法:
|
||||||
|
```bash
|
||||||
|
chmod +x update.sh
|
||||||
|
./update.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法二:推送到镜像仓库后拉取(适合频繁更新)
|
||||||
|
|
||||||
|
如果你有镜像仓库访问权限,可以使用这种方式:
|
||||||
|
|
||||||
|
#### 步骤 1:在本地构建并推送
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 在本地电脑上,进入项目根目录
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
|
||||||
|
# 2. 构建镜像并打标签
|
||||||
|
docker build -f Dockerfile.prod -t registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest .
|
||||||
|
|
||||||
|
# 3. 登录镜像仓库(如果还没登录)
|
||||||
|
docker login registry.cn-hangzhou.aliyuncs.com
|
||||||
|
|
||||||
|
# 4. 推送镜像
|
||||||
|
docker push registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 步骤 2:在 NAS 上拉取并更新
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. SSH 连接到 NAS
|
||||||
|
ssh 你的用户名@NAS_IP
|
||||||
|
|
||||||
|
# 2. 停止旧容器
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
|
||||||
|
# 3. 拉取新镜像
|
||||||
|
sudo docker pull registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
|
||||||
|
|
||||||
|
# 4. 更新 docker-compose.feiniu.vol2.yml 中的镜像地址(如果还没更新)
|
||||||
|
sudo sed -i 's|image: dysync.net:latest|image: registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest|g' docker-compose.feiniu.vol2.yml
|
||||||
|
|
||||||
|
# 5. 启动新容器
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 6. 验证服务
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
sudo docker logs --tail 50 dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法三:仅更新代码文件(快速更新,不重新构建镜像)
|
||||||
|
|
||||||
|
如果只是修改了配置文件或少量代码,可以只更新文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 在本地压缩修改的文件
|
||||||
|
tar -czf ../update.tar.gz 修改的文件或目录
|
||||||
|
|
||||||
|
# 2. 上传到 NAS
|
||||||
|
scp ../update.tar.gz 你的用户名@NAS_IP:/vol2/1000/docker/dysync/
|
||||||
|
|
||||||
|
# 3. SSH 连接到 NAS
|
||||||
|
ssh 你的用户名@NAS_IP
|
||||||
|
|
||||||
|
# 4. 进入容器并更新文件
|
||||||
|
cd /vol2/1000/docker/dysync
|
||||||
|
tar -xzf update.tar.gz -C dysync.net/
|
||||||
|
|
||||||
|
# 5. 重启容器使更改生效
|
||||||
|
sudo docker restart dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**:这种方法只适用于不需要重新编译的更改(如配置文件)。对于代码修改,建议使用方法一重新构建镜像。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 快速参考
|
||||||
|
|
||||||
|
### 完整部署命令(一键执行脚本)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# 快速部署脚本
|
||||||
|
|
||||||
|
# 1. 进入项目目录
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
|
||||||
|
# 2. 构建镜像
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 3. 创建数据目录
|
||||||
|
sudo mkdir -p /vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}
|
||||||
|
sudo chmod -R 755 /vol2/1000/docker/dysync
|
||||||
|
|
||||||
|
# 4. 启动容器
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 5. 查看日志
|
||||||
|
sudo docker logs -f dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 关键路径和端口
|
||||||
|
|
||||||
|
- **项目路径**:`/vol2/1000/docker/dysync`
|
||||||
|
- **数据目录**:`/vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}`
|
||||||
|
- **服务端口**:`10101`
|
||||||
|
- **访问地址**:`http://你的NAS_IP:10101`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- [本地启动指南](./本地启动指南.md)
|
||||||
|
- [网络问题解决方案](./网络问题解决方案.md)
|
||||||
|
- [构建问题排查](./构建问题排查.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**:2024-12-17
|
||||||
|
**适用系统**:飞牛 NAS(Linux x86_64)
|
||||||
|
**Docker 版本**:28.5.2
|
||||||
|
**项目路径**:`/vol2/1000/docker/dysync`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,251 @@
|
|||||||
|
# 飞牛 NAS 部署总结
|
||||||
|
|
||||||
|
## ✅ 部署成功总结
|
||||||
|
|
||||||
|
本次部署成功将 dysync.net 项目部署到飞牛 NAS,以下是完整的部署过程和关键要点。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 部署流程概览
|
||||||
|
|
||||||
|
### 1. 环境准备 ✅
|
||||||
|
- **NAS 路径**:`/vol2/1000/docker/dysync`
|
||||||
|
- **NAS IP**:`192.168.1.99`
|
||||||
|
- **SSH 用户**:`adminym`
|
||||||
|
- **Docker**:已安装并运行
|
||||||
|
|
||||||
|
### 2. 文件上传 ✅
|
||||||
|
- 使用 `tar` 压缩项目文件(排除不必要的文件)
|
||||||
|
- 通过 `scp` 上传到 NAS
|
||||||
|
- 在 NAS 上解压到 `dysync.net` 目录
|
||||||
|
|
||||||
|
### 3. Docker 镜像构建 ✅
|
||||||
|
- **基础镜像**:`node:18-alpine`、`.NET SDK 6.0`、`.NET ASP.NET 6.0`
|
||||||
|
- **构建时间**:约 50 秒(使用缓存)
|
||||||
|
- **镜像大小**:268MB
|
||||||
|
- **镜像名称**:`dysync.net:latest`
|
||||||
|
|
||||||
|
### 4. 容器部署 ✅
|
||||||
|
- **容器名称**:`dysync`
|
||||||
|
- **端口映射**:`10101:10101`
|
||||||
|
- **数据目录挂载**:`db`、`collect`、`favorite`、`uper`、`logs`
|
||||||
|
- **状态**:运行中
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 关键配置和修复
|
||||||
|
|
||||||
|
### 1. Dockerfile 修复
|
||||||
|
|
||||||
|
#### 问题:dotnet 命令缺少项目文件
|
||||||
|
**修复**:
|
||||||
|
```dockerfile
|
||||||
|
RUN dotnet restore dy.net.csproj
|
||||||
|
RUN dotnet publish dy.net.csproj -c Release -o /app/publish
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 问题:npm/pnpm 网络超时
|
||||||
|
**修复**:添加国内镜像源配置
|
||||||
|
```dockerfile
|
||||||
|
RUN npm config set registry https://registry.npmmirror.com && \
|
||||||
|
npm install -g pnpm && \
|
||||||
|
pnpm config set registry https://registry.npmmirror.com && \
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 问题:macOS 资源分叉文件导致编译错误
|
||||||
|
**修复**:
|
||||||
|
1. 在 `.dockerignore` 中添加 `._*`
|
||||||
|
2. 在 Dockerfile 中添加删除步骤:
|
||||||
|
```dockerfile
|
||||||
|
RUN find . -name "._*" -type f -delete
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. docker-compose 配置
|
||||||
|
|
||||||
|
**文件**:`docker-compose.feiniu.vol2.yml`
|
||||||
|
|
||||||
|
**关键配置**:
|
||||||
|
- 镜像:`dysync.net:latest`(本地构建)
|
||||||
|
- 数据目录:`/vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}`
|
||||||
|
- DNS 配置:`8.8.8.8`、`114.114.114.114`、`223.5.5.5`
|
||||||
|
- 环境变量:`TZ=Asia/Shanghai`、`ASPNETCORE_ENVIRONMENT=Production`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 部署命令总结
|
||||||
|
|
||||||
|
### 完整部署流程
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 本地压缩项目
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
tar -czf ../dysync.net.tar.gz \
|
||||||
|
--exclude='.git' --exclude='node_modules' --exclude='app/node_modules' \
|
||||||
|
--exclude='bin' --exclude='obj' --exclude='.vs' --exclude='.idea' \
|
||||||
|
--exclude='videos' --exclude='*.md' --exclude='docs' --exclude='*.tar.gz' .
|
||||||
|
|
||||||
|
# 2. 上传到 NAS
|
||||||
|
scp ../dysync.net.tar.gz adminym@192.168.1.99:/vol2/1000/docker/dysync/
|
||||||
|
|
||||||
|
# 3. SSH 连接到 NAS
|
||||||
|
ssh adminym@192.168.1.99
|
||||||
|
|
||||||
|
# 4. 解压文件
|
||||||
|
cd /vol2/1000/docker/dysync
|
||||||
|
mkdir -p dysync.net
|
||||||
|
tar -xzf dysync.net.tar.gz -C dysync.net/
|
||||||
|
|
||||||
|
# 5. 拉取基础镜像
|
||||||
|
sudo docker pull node:18-alpine
|
||||||
|
sudo docker pull mcr.microsoft.com/dotnet/sdk:6.0
|
||||||
|
sudo docker pull mcr.microsoft.com/dotnet/aspnet:6.0
|
||||||
|
|
||||||
|
# 6. 修复 Dockerfile(如需要)
|
||||||
|
cd dysync.net
|
||||||
|
sudo sed -i 's/RUN dotnet restore/RUN dotnet restore dy.net.csproj/' Dockerfile.prod
|
||||||
|
sudo sed -i 's/RUN dotnet publish -c Release -o \/app\/publish/RUN dotnet publish dy.net.csproj -c Release -o \/app\/publish/' Dockerfile.prod
|
||||||
|
echo "._*" >> .dockerignore
|
||||||
|
|
||||||
|
# 7. 构建镜像
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
|
||||||
|
# 8. 创建数据目录
|
||||||
|
sudo mkdir -p /vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}
|
||||||
|
sudo chmod -R 755 /vol2/1000/docker/dysync
|
||||||
|
|
||||||
|
# 9. 启动容器
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 10. 验证服务
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
sudo docker logs dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 关键路径和端口
|
||||||
|
|
||||||
|
| 项目 | 值 |
|
||||||
|
|------|-----|
|
||||||
|
| **项目路径** | `/vol2/1000/docker/dysync` |
|
||||||
|
| **数据目录** | `/vol2/1000/docker/dysync/{db,collect,favorite,uper,logs}` |
|
||||||
|
| **服务端口** | `10101` |
|
||||||
|
| **访问地址** | `http://192.168.1.99:10101` |
|
||||||
|
| **容器名称** | `dysync` |
|
||||||
|
| **镜像名称** | `dysync.net:latest` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ 常用管理命令
|
||||||
|
|
||||||
|
### 查看服务状态
|
||||||
|
```bash
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
sudo docker logs dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 重启服务
|
||||||
|
```bash
|
||||||
|
sudo docker restart dysync
|
||||||
|
# 或
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml restart
|
||||||
|
```
|
||||||
|
|
||||||
|
### 停止服务
|
||||||
|
```bash
|
||||||
|
sudo docker stop dysync
|
||||||
|
# 或
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更新部署(本地修改后)
|
||||||
|
|
||||||
|
#### 完整更新流程
|
||||||
|
|
||||||
|
**本地操作**:
|
||||||
|
```bash
|
||||||
|
# 1. 压缩项目
|
||||||
|
cd /Users/gaotu/WebstormProjects/dysync.net
|
||||||
|
tar -czf ../dysync.net.tar.gz \
|
||||||
|
--exclude='.git' --exclude='node_modules' --exclude='app/node_modules' \
|
||||||
|
--exclude='bin' --exclude='obj' --exclude='.vs' --exclude='.idea' \
|
||||||
|
--exclude='videos' --exclude='*.md' --exclude='docs' --exclude='*.tar.gz' .
|
||||||
|
|
||||||
|
# 2. 上传到 NAS
|
||||||
|
scp ../dysync.net.tar.gz adminym@192.168.1.99:/vol2/1000/docker/dysync/
|
||||||
|
```
|
||||||
|
|
||||||
|
**NAS 操作**:
|
||||||
|
```bash
|
||||||
|
# 1. SSH 连接
|
||||||
|
ssh adminym@192.168.1.99
|
||||||
|
|
||||||
|
# 2. 更新文件
|
||||||
|
cd /vol2/1000/docker/dysync
|
||||||
|
mv dysync.net dysync.net.backup.$(date +%Y%m%d_%H%M%S)
|
||||||
|
mkdir -p dysync.net
|
||||||
|
tar -xzf dysync.net.tar.gz -C dysync.net/
|
||||||
|
|
||||||
|
# 3. 重新部署
|
||||||
|
cd dysync.net
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
|
||||||
|
# 4. 验证
|
||||||
|
sudo docker ps | grep dysync
|
||||||
|
sudo docker logs --tail 50 dysync
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 快速更新(如果文件已在 NAS)
|
||||||
|
```bash
|
||||||
|
cd /vol2/1000/docker/dysync/dysync.net
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml down
|
||||||
|
sudo docker build -f Dockerfile.prod -t dysync.net:latest .
|
||||||
|
sudo docker compose -f docker-compose.feiniu.vol2.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 常见问题和解决方案
|
||||||
|
|
||||||
|
### 1. 网络超时问题
|
||||||
|
- **原因**:npm/pnpm 从官方源下载包超时
|
||||||
|
- **解决**:在 Dockerfile 中配置国内镜像源
|
||||||
|
|
||||||
|
### 2. macOS 资源分叉文件问题
|
||||||
|
- **原因**:macOS 创建的 `._*` 文件被包含在构建中
|
||||||
|
- **解决**:在 `.dockerignore` 中排除,并在 Dockerfile 中删除
|
||||||
|
|
||||||
|
### 3. dotnet 命令缺少项目文件
|
||||||
|
- **原因**:Dockerfile 中 `dotnet restore` 和 `dotnet publish` 未指定项目文件
|
||||||
|
- **解决**:添加项目文件参数 `dy.net.csproj`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- **[飞牛NAS部署完整指南.md](./飞牛NAS部署完整指南.md)** - 最新、最完整的部署文档
|
||||||
|
- [本地启动指南](./本地启动指南.md) - 本地开发环境配置
|
||||||
|
- [网络问题解决方案](./网络问题解决方案.md) - 网络相关问题
|
||||||
|
- [构建问题排查](./构建问题排查.md) - 构建相关问题
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✨ 部署成功标志
|
||||||
|
|
||||||
|
- ✅ 镜像构建成功:`dysync.net:latest` (268MB)
|
||||||
|
- ✅ 容器运行正常:`dysync` 容器状态为 `Up`
|
||||||
|
- ✅ 服务可访问:`http://192.168.1.99:10101` 可正常访问
|
||||||
|
- ✅ 日志正常:容器日志显示服务已启动并监听端口
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**部署日期**:2024-12-17
|
||||||
|
**部署人员**:adminym
|
||||||
|
**NAS 系统**:飞牛 NAS
|
||||||
|
**Docker 版本**:28.5.2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user