Skip to content

Commit 0f8efd6

Browse files
committed
feat: 优化 Docker 部署可靠性和一键部署体验
主要改进: • 添加智能启动脚本解决 NAS 部署失败问题 • 优化 Docker Compose 健康检查和启动时序 • 提供一键部署脚本简化部署流程 • 完善部署文档和故障排查指南 • 增强容器依赖管理和重启策略 技术优化: • PostgreSQL 健康检查: start_period 30s + 10次重试 • Aria2 健康检查: start_period 20s + 10次重试 • MyNest 智能启动: start_period 60s + 依赖等待机制 • 添加失败重启策略: 最多5次重试,间隔10秒 • 集成 PostgreSQL 客户端用于服务依赖检测 用户体验: • 一键部署脚本自动创建配置和目录 • 详细的部署状态检查和健康监控 • 完整的故障排查文档和解决方案 • 针对 NAS 环境的特殊优化建议
1 parent 64fa47b commit 0f8efd6

5 files changed

Lines changed: 251 additions & 20 deletions

File tree

Dockerfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,16 @@ COPY --from=frontend-builder /app/dist /usr/share/nginx/html
6868

6969
COPY nginx.conf /etc/nginx/http.d/default.conf
7070
COPY supervisord.conf /etc/supervisord.conf
71+
COPY scripts/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
72+
73+
# 安装 postgresql-client 用于健康检查
74+
RUN apk add --no-cache postgresql-client
75+
76+
# 设置启动脚本权限
77+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
7178

7279
ENV TZ=Asia/Shanghai
7380

7481
EXPOSE 80
7582

76-
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
83+
CMD ["/usr/local/bin/docker-entrypoint.sh"]

README.md

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,44 @@
1919

2020
## 快速部署
2121

22-
### Docker Compose (推荐)
22+
### 🚀 一键部署脚本(推荐)
2323

2424
```bash
25-
# 方式一:直接下载配置文件
25+
# 克隆项目
26+
git clone <repository-url>
27+
cd MyNest
28+
29+
# 运行一键部署脚本
30+
./scripts/deploy.sh
31+
```
32+
33+
部署脚本会自动:
34+
- ✅ 检查 Docker 环境
35+
- ✅ 创建默认配置文件
36+
- ✅ 创建必要目录
37+
- ✅ 启动所有服务
38+
- ✅ 进行健康检查
39+
40+
### Docker Compose (手动部署)
41+
42+
```bash
43+
# 方式二:手动部署
2644
wget https://raw.githubusercontent.com/matrix/mynest/main/docker-compose.yml
2745
wget https://raw.githubusercontent.com/matrix/mynest/main/.env.example -O .env
2846

2947
# 编辑配置(修改密码等)
3048
nano .env
3149

50+
# 创建必要目录
51+
mkdir -p downloads logs
52+
3253
# 启动服务
3354
docker-compose up -d
3455

3556
# 查看日志
3657
docker-compose logs -f mynest
3758
```
3859

39-
### 一键部署脚本
40-
41-
```bash
42-
# 方式二:一键部署脚本
43-
curl -fsSL https://raw.githubusercontent.com/matrix/mynest/main/install.sh | bash
44-
```
45-
4660
### 手动 Docker 运行
4761

4862
```bash
@@ -322,6 +336,54 @@ const PLUGIN_CONFIGS = {
322336
- **插件系统**: 独立进程 + HTTP API
323337
- **部署**: Docker, Docker Compose
324338

339+
## 故障排查
340+
341+
### 🚨 MyNest 部署失败问题
342+
343+
**问题现象**: NAS 上使用 Docker Compose 部署时,MyNest 服务提示部署失败,需要手动点击后才能部署成功。
344+
345+
**原因分析**: 这是典型的服务依赖和启动时序问题:
346+
- PostgreSQL 和 Aria2 服务需要时间完全启动
347+
- MyNest 服务在依赖服务未完全就绪时过早启动导致失败
348+
- Docker Compose 的 `depends_on` 只等待容器启动,不等待服务就绪
349+
350+
**✅ 解决方案**:
351+
352+
1. **使用优化后的配置**(项目已包含):
353+
```bash
354+
# 使用项目自带的 docker-compose.yml
355+
# 已优化健康检查和启动时序
356+
docker-compose up -d
357+
```
358+
359+
2. **关键优化点**:
360+
- **PostgreSQL**: `start_period: 30s` + 10次重试
361+
- **Aria2**: `start_period: 20s` + 10次重试
362+
- **MyNest**: `start_period: 60s` + 智能启动脚本
363+
364+
3. **手动验证**:
365+
```bash
366+
# 检查服务状态
367+
docker-compose ps
368+
369+
# 查看启动日志
370+
docker-compose logs -f mynest
371+
372+
# 等待所有服务变为 healthy 状态
373+
docker-compose ps --filter "status=running"
374+
```
375+
376+
4. **强制重新部署**:
377+
```bash
378+
docker-compose down
379+
docker-compose pull
380+
docker-compose up -d
381+
```
382+
383+
**📋 详细部署指南**: 查看 [DEPLOY.md](DEPLOY.md) 获得完整的部署和故障排查指南。
384+
385+
---
386+
325387
## 常见问题
326388

327389
### Q: Telegram Bot 提示 "file is too big"?
@@ -340,6 +402,12 @@ A: 检查插件日志(Web 界面 → 插件管理 → 查看日志),常见
340402
- 网络连接问题(国内需代理访问 Telegram API)
341403
- 环境变量未正确传递
342404

405+
### Q: 插件重启后停止运行?
406+
A: 这是已知问题,已在最新版本修复:
407+
- 添加了进程等待时间避免时间竞争
408+
- 改进了进程清理逻辑
409+
- 更新到最新版本即可解决
410+
343411
### Q: 支持哪些下载协议?
344412
A: 通过 aria2 支持:
345413
- HTTP/HTTPS

docker-compose.yml

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ services:
1212
volumes:
1313
- postgres_data:/var/lib/postgresql/data
1414
healthcheck:
15-
test: ["CMD-SHELL", "pg_isready -U mynest"]
16-
interval: 10s
17-
timeout: 5s
18-
retries: 5
15+
test: ["CMD-SHELL", "pg_isready -U mynest -d mynest"]
16+
interval: 5s
17+
timeout: 10s
18+
retries: 10
19+
start_period: 30s
1920
networks:
2021
- mynest
2122

@@ -48,9 +49,10 @@ services:
4849
- mynest
4950
healthcheck:
5051
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:6800/jsonrpc"]
51-
interval: 10s
52-
timeout: 5s
53-
retries: 3
52+
interval: 5s
53+
timeout: 10s
54+
retries: 10
55+
start_period: 20s
5456

5557
mynest:
5658
image: ${DOCKER_USERNAME:-sunxiao0721}/mynest:${VERSION:-latest}
@@ -63,6 +65,11 @@ services:
6365
condition: service_healthy
6466
aria2:
6567
condition: service_healthy
68+
deploy:
69+
restart_policy:
70+
condition: on-failure
71+
delay: 10s
72+
max_attempts: 5
6673
# 恢复 supervisord 管理进程
6774
# command: 默认使用 Dockerfile 中的 CMD
6875
environment:
@@ -88,9 +95,10 @@ services:
8895
- mynest
8996
healthcheck:
9097
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"]
91-
interval: 30s
92-
timeout: 10s
93-
retries: 3
98+
interval: 10s
99+
timeout: 15s
100+
retries: 6
101+
start_period: 60s
94102

95103
# telegram-bot 现在作为 mynest 容器内的独立进程运行
96104

scripts/deploy.sh

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#!/bin/bash
2+
3+
echo "🚀 MyNest 一键部署脚本"
4+
echo "========================="
5+
6+
# 检查 Docker 和 Docker Compose
7+
if ! command -v docker &> /dev/null; then
8+
echo "❌ Docker 未安装,请先安装 Docker"
9+
exit 1
10+
fi
11+
12+
if ! command -v docker-compose &> /dev/null; then
13+
echo "❌ Docker Compose 未安装,请先安装 Docker Compose"
14+
exit 1
15+
fi
16+
17+
# 创建必要的目录
18+
echo "📁 创建必要目录..."
19+
mkdir -p downloads logs
20+
21+
# 设置环境变量(如果不存在 .env 文件)
22+
if [ ! -f .env ]; then
23+
echo "⚙️ 创建默认配置文件..."
24+
cat > .env <<EOF
25+
# 数据库密码
26+
POSTGRES_PASSWORD=mynest123
27+
28+
# Aria2 密钥
29+
ARIA2_SECRET=mynest123
30+
31+
# 服务端口
32+
PORT=3001
33+
34+
# 下载目录
35+
DOWNLOAD_DIR=./downloads
36+
37+
# 日志目录
38+
LOG_DIR=./logs
39+
40+
# Docker 镜像配置
41+
DOCKER_USERNAME=sunxiao0721
42+
VERSION=latest
43+
44+
# 代理配置(可选)
45+
# HTTP_PROXY=http://proxy.example.com:8080
46+
# HTTPS_PROXY=http://proxy.example.com:8080
47+
# NO_PROXY=localhost,127.0.0.1
48+
EOF
49+
echo "✅ 已创建默认 .env 配置文件"
50+
echo " 您可以编辑此文件来自定义配置"
51+
fi
52+
53+
# 停止现有服务(如果存在)
54+
echo "🛑 停止现有服务..."
55+
docker-compose down 2>/dev/null || true
56+
57+
# 拉取最新镜像
58+
echo "📦 拉取最新镜像..."
59+
docker-compose pull
60+
61+
# 启动服务
62+
echo "🚀 启动 MyNest 服务..."
63+
echo " 这可能需要几分钟时间,请耐心等待..."
64+
docker-compose up -d
65+
66+
# 显示启动状态
67+
echo ""
68+
echo "⏳ 等待服务启动..."
69+
sleep 10
70+
71+
# 检查服务状态
72+
echo ""
73+
echo "📊 服务状态:"
74+
docker-compose ps
75+
76+
echo ""
77+
echo "🎉 部署完成!"
78+
echo ""
79+
echo "📍 访问地址:"
80+
echo " • MyNest Web界面: http://localhost:$(grep PORT= .env | cut -d'=' -f2 | head -1)"
81+
echo " • Aria2 WebUI: http://localhost:6801 (密钥: $(grep ARIA2_SECRET= .env | cut -d'=' -f2))"
82+
echo ""
83+
echo "📂 重要目录:"
84+
echo " • 下载目录: $(realpath $(grep DOWNLOAD_DIR= .env | cut -d'=' -f2 | head -1))"
85+
echo " • 日志目录: $(realpath $(grep LOG_DIR= .env | cut -d'=' -f2 | head -1))"
86+
echo ""
87+
echo "🔧 管理命令:"
88+
echo " • 查看日志: docker-compose logs -f"
89+
echo " • 重启服务: docker-compose restart"
90+
echo " • 停止服务: docker-compose down"
91+
echo " • 更新服务: $0"
92+
echo ""
93+
94+
# 检查服务健康状态
95+
echo "🏥 正在进行健康检查..."
96+
sleep 30
97+
healthy_services=$(docker-compose ps --filter "status=running" --format "table {{.Service}}\t{{.Status}}" | grep -c "healthy" || echo "0")
98+
if [ "$healthy_services" -gt 0 ]; then
99+
echo "✅ 服务运行正常"
100+
else
101+
echo "⚠️ 服务可能还在启动中,请稍等并查看日志:"
102+
echo " docker-compose logs -f"
103+
fi

scripts/docker-entrypoint.sh

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/bin/bash
2+
set -e
3+
4+
echo "🚀 MyNest Container Starting..."
5+
6+
# 等待数据库服务可用
7+
echo "⏳ 等待数据库服务..."
8+
for i in {1..30}; do
9+
if pg_isready -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" >/dev/null 2>&1; then
10+
echo "✅ 数据库连接成功"
11+
break
12+
fi
13+
if [ $i -eq 30 ]; then
14+
echo "❌ 数据库连接超时,但继续启动"
15+
fi
16+
echo " 尝试 $i/30 - 等待数据库..."
17+
sleep 2
18+
done
19+
20+
# 等待 Aria2 服务可用
21+
echo "⏳ 等待 Aria2 服务..."
22+
for i in {1..20}; do
23+
if wget --quiet --tries=1 --spider "$ARIA2_RPC_URL" >/dev/null 2>&1; then
24+
echo "✅ Aria2 连接成功"
25+
break
26+
fi
27+
if [ $i -eq 20 ]; then
28+
echo "❌ Aria2 连接超时,但继续启动"
29+
fi
30+
echo " 尝试 $i/20 - 等待 Aria2..."
31+
sleep 2
32+
done
33+
34+
# 创建必要的目录
35+
mkdir -p /app/logs
36+
mkdir -p /downloads
37+
38+
# 设置适当的权限
39+
chmod -R 755 /app/logs
40+
chmod -R 755 /downloads
41+
42+
echo "🎯 启动 MyNest 服务..."
43+
44+
# 启动 supervisord
45+
exec /usr/bin/supervisord -c /etc/supervisord.conf

0 commit comments

Comments
 (0)