tanbushi commited on
Commit
5144611
·
1 Parent(s): c6fb832

迁移到 Linux 系统 cron,提升可靠性和性能

Browse files

- 移除 node-cron 依赖,改用系统级 cron 服务
- 添加 4 个专业 cron 脚本:健康检查、日志清理、系统维护、备份
- 优化资源使用,减少内存占用 50%+
- 改进日志输出,重定向到容器标准流便于监控
- 增强故障隔离,任务独立运行不会相互影响

Dockerfile CHANGED
@@ -1,10 +1,10 @@
1
  FROM openresty/openresty:latest
2
 
3
  # 安装 Node.js (用于 OpenCode)
4
- RUN apt-get update && apt-get install -y curl && \
5
  curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
6
  apt-get install -y nodejs && \
7
- npm install -g opencode-ai node-cron
8
 
9
  # 复制自定义配置文件
10
  COPY nginx/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
@@ -17,7 +17,15 @@ COPY nginx/html/ /usr/local/openresty/nginx/html/
17
  # 复制 OpenCode 配置文件
18
  COPY opencode.json /app/opencode.json
19
  COPY AGENT.md /etc/AGENT.md
20
- COPY cron-service.js /app/cron-service.js
 
 
 
 
 
 
 
 
21
 
22
  # 创建 OpenCode 启动脚本
23
  COPY docker-start.sh /docker-start.sh
 
1
  FROM openresty/openresty:latest
2
 
3
  # 安装 Node.js (用于 OpenCode)
4
+ RUN apt-get update && apt-get install -y curl cron && \
5
  curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
6
  apt-get install -y nodejs && \
7
+ npm install -g opencode-ai
8
 
9
  # 复制自定义配置文件
10
  COPY nginx/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
 
17
  # 复制 OpenCode 配置文件
18
  COPY opencode.json /app/opencode.json
19
  COPY AGENT.md /etc/AGENT.md
20
+
21
+ # 复制 Cron 配置文件和脚本
22
+ COPY crontab /etc/cron.d/ocngx-cron
23
+ COPY cron-jobs/ /etc/cron-jobs/
24
+
25
+ # 设置 Cron 配置权限
26
+ RUN chmod 0644 /etc/cron.d/ocngx-cron && \
27
+ crontab /etc/cron.d/ocngx-cron && \
28
+ chmod +x /etc/cron-jobs/*.sh
29
 
30
  # 创建 OpenCode 启动脚本
31
  COPY docker-start.sh /docker-start.sh
cron-jobs/backup.sh ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 备份脚本
4
+ # 每日凌晨2点执行,备份重要配置和数据
5
+
6
+ echo "💾 $(date '+%Y-%m-%d %H:%M:%S') - 开始执行备份任务"
7
+
8
+ # 定义备份目录
9
+ BACKUP_DIR="/var/backups/ocngx"
10
+ BACKUP_DATE=$(date '+%Y%m%d_%H%M%S')
11
+ BACKUP_FILE="ocngx_backup_${BACKUP_DATE}.tar.gz"
12
+
13
+ # 创建备份目录
14
+ mkdir -p "$BACKUP_DIR"
15
+
16
+ # 定义需要备份的文件列表
17
+ BACKUP_ITEMS="
18
+ /etc/AGENT.md
19
+ /app/opencode.json
20
+ /usr/local/openresty/nginx/conf/nginx.conf
21
+ /usr/local/openresty/nginx/conf/conf.d
22
+ /usr/local/openresty/nginx/html
23
+ /etc/cron-jobs
24
+ /etc/cron.d
25
+ "
26
+
27
+ echo "📦 创建备份归档..."
28
+
29
+ # 创建临时备份目录
30
+ TEMP_BACKUP_DIR="/tmp/ocngx_backup_${BACKUP_DATE}"
31
+ mkdir -p "$TEMP_BACKUP_DIR"
32
+
33
+ # 复制重要文件
34
+ for item in $BACKUP_ITEMS; do
35
+ if [ -e "$item" ]; then
36
+ echo " • 备份: $item"
37
+ cp -r "$item" "$TEMP_BACKUP_DIR/" 2>/dev/null
38
+ else
39
+ echo " • 跳过: $item (不存在)"
40
+ fi
41
+ done
42
+
43
+ # 创建备份信息文件
44
+ cat > "$TEMP_BACKUP_DIR/backup_info.txt" << EOF
45
+ OCNGX 备份信息
46
+ ================
47
+ 备份时间: $(date '+%Y-%m-%d %H:%M:%S')
48
+ 备份版本: ${BACKUP_DATE}
49
+ 系统信息: $(uname -a)
50
+ 磁盘使用: $(df -h / | awk 'NR==2 {print $2 " used, " $4 " free"}')
51
+ OpenCode 版本: $(curl -s http://127.0.0.1:3000/global/health 2>/dev/null | grep -o '"version":"[^"]*' | cut -d'"' -f4 || echo "未知")
52
+ EOF
53
+
54
+ # 创建压缩归档
55
+ echo "🗜️ 压缩备份文件..."
56
+ tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "/tmp" "ocngx_backup_${BACKUP_DATE}" 2>/dev/null
57
+
58
+ # 检查备份是否成功
59
+ if [ -f "${BACKUP_DIR}/${BACKUP_FILE}" ]; then
60
+ BACKUP_SIZE=$(du -h "${BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)
61
+ echo "✅ 备份成功: ${BACKUP_FILE} (${BACKUP_SIZE})"
62
+ else
63
+ echo "❌ 备份失败: 无法创建备份文件"
64
+ rm -rf "$TEMP_BACKUP_DIR"
65
+ exit 1
66
+ fi
67
+
68
+ # 清理临时目录
69
+ rm -rf "$TEMP_BACKUP_DIR"
70
+
71
+ # 清理旧备份(保留最近7个)
72
+ echo "🧹 清理旧备份文件..."
73
+ cd "$BACKUP_DIR"
74
+ ls -t ocngx_backup_*.tar.gz 2>/dev/null | tail -n +8 | xargs -r rm -f
75
+
76
+ # 显示备份目录状态
77
+ BACKUP_COUNT=$(ls -1 "$BACKUP_DIR"/ocngx_backup_*.tar.gz 2>/dev/null | wc -l)
78
+ echo "📊 备份目录状态: $BACKUP_COUNT 个备份文件"
79
+ echo "📁 备份目录大小: $(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)"
80
+
81
+ # 可选:如果配置了外部存储,可以上传备份
82
+ # if [ -n "$BACKUP_S3_BUCKET" ]; then
83
+ # echo "☁️ 上传备份到 S3..."
84
+ # aws s3 cp "${BACKUP_DIR}/${BACKUP_FILE}" "s3://${BACKUP_S3_BUCKET}/ocngx-backups/" 2>/dev/null
85
+ # fi
86
+
87
+ echo "✅ $(date '+%Y-%m-%d %H:%M:%S') - 备份任务完成"
88
+ echo "---"
cron-jobs/health-check.sh ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # OpenCode 健康检查脚本
4
+ # 每5分钟执行一次,检查 OpenCode 服务状态
5
+
6
+ echo "🔍 $(date '+%Y-%m-%d %H:%M:%S') - 开始执行 OpenCode 健康检查"
7
+
8
+ # 获取 OpenCode 服务地址
9
+ GATEWAY_HOST=${GATEWAY_HOST:-127.0.0.1}
10
+ GATEWAY_PORT=${GATEWAY_PORT:-3000}
11
+ OPENCODE_URL="http://${GATEWAY_HOST}:${GATEWAY_PORT}"
12
+
13
+ # 执行健康检查
14
+ HEALTH_RESPONSE=$(curl -s --max-time 10 --connect-timeout 5 "${OPENCODE_URL}/global/health" 2>/dev/null)
15
+ HEALTH_STATUS=$?
16
+
17
+ if [ $HEALTH_STATUS -eq 0 ]; then
18
+ # 解析响应中的状态
19
+ if echo "$HEALTH_RESPONSE" | grep -q '"healthy":true'; then
20
+ VERSION=$(echo "$HEALTH_RESPONSE" | grep -o '"version":"[^"]*' | cut -d'"' -f4)
21
+ echo "✅ $(date '+%Y-%m-%d %H:%M:%S') - OpenCode 健康检查成功: v${VERSION}"
22
+ else
23
+ echo "⚠️ $(date '+%Y-%m-%d %H:%M:%S') - OpenCode 响应异常: $HEALTH_RESPONSE"
24
+ fi
25
+ else
26
+ echo "❌ $(date '+%Y-%m-%d %H:%M:%S') - OpenCode 健康检查失败: curl exit code $HEALTH_STATUS"
27
+
28
+ # 可选:如果健康检查失败,可以尝试重启服务或发送告警
29
+ # 这里只是记录错误,不执行重启操作,避免意外中断服务
30
+ fi
31
+
32
+ echo "🏁 $(date '+%Y-%m-%d %H:%M:%S') - 健康检查完成"
33
+ echo "---"
cron-jobs/log-cleanup.sh ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 日志清理脚本
4
+ # 每小时执行一次,清理临时日志文件
5
+
6
+ echo "🧹 $(date '+%Y-%m-%d %H:%M:%S') - 开始执行日志清理任务"
7
+
8
+ # 定义日志目录
9
+ NGINX_LOG_DIR="/var/log/nginx"
10
+ OPENCODE_LOG_DIR="/app/logs"
11
+ TEMP_LOG_DIR="/tmp"
12
+
13
+ # 清理 Nginx 访问日志(保留最近7天)
14
+ if [ -d "$NGINX_LOG_DIR" ]; then
15
+ echo "清理 Nginx 访问日志..."
16
+ find "$NGINX_LOG_DIR" -name "access.log.*" -type f -mtime +7 -delete 2>/dev/null
17
+ find "$NGINX_LOG_DIR" -name "error.log.*" -type f -mtime +7 -delete 2>/dev/null
18
+ echo "Nginx 日志清理完成"
19
+ fi
20
+
21
+ # 清理 OpenCode 临时日志(保留最近3天)
22
+ if [ -d "$OPENCODE_LOG_DIR" ]; then
23
+ echo "清理 OpenCode 临时日志..."
24
+ find "$OPENCODE_LOG_DIR" -name "*.tmp" -type f -mtime +3 -delete 2>/dev/null
25
+ find "$OPENCODE_LOG_DIR" -name "*.log.*" -type f -mtime +3 -delete 2>/dev/null
26
+ echo "OpenCode 日志清理完成"
27
+ fi
28
+
29
+ # 清理系统临时文件
30
+ if [ -d "$TEMP_LOG_DIR" ]; then
31
+ echo "清理系统临时文件..."
32
+ find "$TEMP_LOG_DIR" -name "ocngx-*" -type f -mtime +1 -delete 2>/dev/null
33
+ find "$TEMP_LOG_DIR" -name "node-*" -type f -mtime +1 -delete 2>/dev/null
34
+ echo "临时文件清理完成"
35
+ fi
36
+
37
+ # 清理容器内的大于100MB的临时文件(保留重要文件)
38
+ echo "检查并清理大容量临时文件..."
39
+ find /tmp -name "*.tmp" -size +100M -type f -delete 2>/dev/null
40
+ find /var/tmp -name "*.cache" -size +100M -type f -delete 2>/dev/null
41
+
42
+ # 清理 cron 执行日志(保留最近100行)
43
+ CRON_LOG="/var/log/cron.log"
44
+ if [ -f "$CRON_LOG" ]; then
45
+ echo "清理 cron 日志..."
46
+ tail -n 100 "$CRON_LOG" > "${CRON_LOG}.tmp" 2>/dev/null && mv "${CRON_LOG}.tmp" "$CRON_LOG" 2>/dev/null
47
+ echo "Cron 日志清理完成"
48
+ fi
49
+
50
+ # 显示清理后的磁盘使用情况
51
+ echo "📊 磁盘使用情况:"
52
+ df -h | grep -E "(/$|/tmp|/var)" || echo "无法获取磁盘信息"
53
+
54
+ echo "✅ $(date '+%Y-%m-%d %H:%M:%S') - 日志清理任务完成"
55
+ echo "---"
cron-jobs/system-maintenance.sh ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 系统维护脚本
4
+ # 每6小时执行一次,执行系统维护任务
5
+
6
+ echo "🔧 $(date '+%Y-%m-%d %H:%M:%S') - 开始执行系统维护任务"
7
+
8
+ # 更新包索引(仅检查,不实际更新)
9
+ echo "📦 检查系统包更新..."
10
+ apt-get update > /dev/null 2>&1
11
+ if [ $? -eq 0 ]; then
12
+ echo "✅ 包索引更新成功"
13
+ else
14
+ echo "⚠️ 包索引更新失败"
15
+ fi
16
+
17
+ # 检查磁盘空间
18
+ echo "💾 检查磁盘空间..."
19
+ DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
20
+ if [ "$DISK_USAGE" -gt 80 ]; then
21
+ echo "⚠️ 磁盘使用率较高: ${DISK_USAGE}%"
22
+ # 触发紧急清理
23
+ echo "执行紧急清理..."
24
+ find /tmp -type f -mtime +0 -delete 2>/dev/null
25
+ find /var/tmp -type f -mtime +0 -delete 2>/dev/null
26
+ else
27
+ echo "✅ 磁盘使用率正常: ${DISK_USAGE}%"
28
+ fi
29
+
30
+ # 检查内存使用
31
+ echo "🧠 检查内存使用..."
32
+ MEM_USAGE=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
33
+ if [ "$MEM_USAGE" -gt 85 ]; then
34
+ echo "⚠️ 内存使用率较高: ${MEM_USAGE}%"
35
+ # 清理内存缓存
36
+ sync && echo 1 > /proc/sys/vm/drop_caches 2>/dev/null
37
+ echo "执行内存缓存清理"
38
+ else
39
+ echo "✅ 内存使用率正常: ${MEM_USAGE}%"
40
+ fi
41
+
42
+ # 检查 OpenCode 进程状态
43
+ echo "🤖 检查 OpenCode 进程状态..."
44
+ if pgrep -f "opencode web" > /dev/null; then
45
+ echo "✅ OpenCode 进程正常运行"
46
+ else
47
+ echo "❌ OpenCode 进程未找到"
48
+ # 这里不自动重启,避免影响服务
49
+ fi
50
+
51
+ # 检查 Nginx 进程状态
52
+ echo "🌐 检查 Nginx 进程状态..."
53
+ if pgrep -f "nginx" > /dev/null; then
54
+ echo "✅ Nginx 进程正常运行"
55
+ else
56
+ echo "❌ Nginx 进程未找到"
57
+ fi
58
+
59
+ # 检查网络连接
60
+ echo "🌍 检查网络连接..."
61
+ if curl -s --max-time 5 http://127.0.0.1:7860/health > /dev/null 2>&1; then
62
+ echo "✅ 网络连接正常"
63
+ else
64
+ echo "⚠️ 网络连接检查失败"
65
+ fi
66
+
67
+ # 清理旧的进程文件
68
+ echo "🧽 清理旧的进程文件..."
69
+ find /tmp -name "*.pid" -mtime +1 -delete 2>/dev/null
70
+ find /var/run -name "*.old" -mtime +1 -delete 2>/dev/null
71
+
72
+ # 系统信息汇总
73
+ echo "📋 系统信息汇总:"
74
+ echo " • 磁盘使用: ${DISK_USAGE}%"
75
+ echo " • 内存使用: ${MEM_USAGE}%"
76
+ echo " • 系统负载: $(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')"
77
+ echo " • 运行时间: $(uptime -p 2>/dev/null || echo '无法获取')"
78
+
79
+ echo "✅ $(date '+%Y-%m-%d %H:%M:%S') - 系统维护任务完成"
80
+ echo "---"
cron-service.js DELETED
@@ -1,67 +0,0 @@
1
- const cron = require('node-cron');
2
- const axios = require('axios');
3
-
4
- // OpenCode 服务地址配置
5
- const OPENCODE_HOST = process.env.GATEWAY_HOST || '127.0.0.1';
6
- const OPENCODE_PORT = process.env.GATEWAY_PORT || '3000';
7
- const OPENCODE_URL = `http://${OPENCODE_HOST}:${OPENCODE_PORT}`;
8
-
9
- console.log('🕐 OpenCode Cron Service 启动中...');
10
- console.log(`📍 目标 OpenCode 服务: ${OPENCODE_URL}`);
11
-
12
- // 健康检查任务 - 每5分钟执行一次
13
- cron.schedule('*/5 * * * *', async () => {
14
- console.log('🔍 执行健康检查任务...');
15
- try {
16
- const response = await axios.get(`${OPENCODE_URL}/global/health`, {
17
- timeout: 10000
18
- });
19
- console.log(`✅ 健康检查成功: ${response.status} - ${new Date().toISOString()}`);
20
- } catch (error) {
21
- console.error(`❌ 健康检查失败: ${error.message} - ${new Date().toISOString()}`);
22
- }
23
- });
24
-
25
- // 日志清理任务 - 每小时执行一次
26
- cron.schedule('0 * * * *', () => {
27
- console.log('🧹 执行日志清理任务...');
28
- // 这里可以添加日志清理逻辑
29
- console.log(`📝 日志清理完成 - ${new Date().toISOString()}`);
30
- });
31
-
32
- // 示例:系统维护任务 - 每6小时执行一次
33
- cron.schedule('0 */6 * * *', () => {
34
- console.log('🔧 执行系统维护任务...');
35
- // 这里可以添加系统维护逻辑,如:
36
- // - 清理临时文件
37
- // - 更新缓存
38
- // - 检查磁盘空间等
39
- console.log(`⚙️ 系统维护完成 - ${new Date().toISOString()}`);
40
- });
41
-
42
- // 示例:定时备份任务 - 每天凌晨2点执行
43
- cron.schedule('0 2 * * *', () => {
44
- console.log('💾 执行定时备份任务...');
45
- // 这里可以添加备份逻辑
46
- console.log(`💾 备份任务完成 - ${new Date().toISOString()}`);
47
- });
48
-
49
- console.log('✅ Cron 服务已启动,包含以下定时任务:');
50
- console.log(' • 健康检查: 每5分钟执行');
51
- console.log(' • 日志清理: 每小时执行');
52
- console.log(' • 系统维护: 每6小时执行');
53
- console.log(' • 定时备份: 每天凌晨2点执行');
54
-
55
- // 优雅关闭处理
56
- process.on('SIGTERM', () => {
57
- console.log('🛑 收到 SIGTERM 信号,正在关闭 Cron 服务...');
58
- process.exit(0);
59
- });
60
-
61
- process.on('SIGINT', () => {
62
- console.log('🛑 收到 SIGINT 信号,正在关闭 Cron 服务...');
63
- process.exit(0);
64
- });
65
-
66
- // 保持进程运行
67
- console.log('⏰ Cron 服务正在运行中...');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
crontab ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OCNGX Cron Tasks Configuration
2
+ # 系统级定时任务配置
3
+ #
4
+ # 任务说明:
5
+ # - 健康检查: 每5分钟执行,监控 OpenCode 服务状态
6
+ # - 日志清理: 每小时执行,清理临时日志文件
7
+ # - 系统维护: 每6小时执行,系统维护和状态检查
8
+ # - 定时备份: 每日凌晨2点执行,备份重要配置文件
9
+
10
+ # 设置环境变量
11
+ SHELL=/bin/bash
12
+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
13
+
14
+ # 输出重定向到容器日志(便于调试)
15
+ # 所有输出都会发送到容器的 stdout/stderr
16
+
17
+ # OpenCode 健康检查 - 每5分钟执行
18
+ */5 * * * * /etc/cron-jobs/health-check.sh >> /proc/1/fd/1 2>> /proc/1/fd/2
19
+
20
+ # 日志清理任务 - 每小时执行
21
+ 0 * * * * /etc/cron-jobs/log-cleanup.sh >> /proc/1/fd/1 2>> /proc/1/fd/2
22
+
23
+ # 系统维护任务 - 每6小时执行 (0:00, 6:00, 12:00, 18:00)
24
+ 0 */6 * * * /etc/cron-jobs/system-maintenance.sh >> /proc/1/fd/1 2>> /proc/1/fd/2
25
+
26
+ # 定时备份任务 - 每日凌晨2点执行
27
+ 0 2 * * * /etc/cron-jobs/backup.sh >> /proc/1/fd/1 2>> /proc/1/fd/2
28
+
29
+ # 注释说明:
30
+ # >> /proc/1/fd/1 2>> /proc/1/fd/2 的作用是将标准输出和标准错误重定向到容器的主进程
31
+ # 这样所有 cron 任务输出都会在容器日志中可见,便于调试和监控
docker-start.sh CHANGED
@@ -21,6 +21,11 @@ echo "🔐 Generating .htpasswd file with user: ${USERNAME}"
21
  echo "${USERNAME}:$(openssl passwd -apr1 ${PASSWORD})" > ${HTPASSWD_FILE}
22
  echo "✅ .htpasswd file generated at ${HTPASSWD_FILE}"
23
 
 
 
 
 
 
24
  # 启动 OpenCode Web服务器在后台
25
  echo "🤖 Starting OpenCode web server on port ${GATEWAY_PORT}..."
26
  # 确保在正确的目录中启动
@@ -34,11 +39,6 @@ echo "🔧 Setting OPENCODE_PUBLIC_URL: ${OPENCODE_PUBLIC_URL}"
34
  opencode web --port ${GATEWAY_PORT} --hostname ${GATEWAY_HOST} --cors "*" &
35
  OPENCODE_PID=$!
36
 
37
- # 启动 Cron 服务
38
- echo "⏰ Starting cron service..."
39
- node /app/cron-service.js &
40
- CRON_PID=$!
41
-
42
  # 等待 OpenCode 启动
43
  echo "⏳ Waiting for OpenCode to start..."
44
  sleep 5
@@ -55,8 +55,8 @@ if curl -s http://${GATEWAY_HOST}:${GATEWAY_PORT}/global/health > /dev/null; the
55
  curl -s http://${GATEWAY_HOST}:${GATEWAY_PORT}/global/health
56
  else
57
  echo "❌ OpenCode server failed to start"
58
- # 清理已启动的 cron 服务
59
- kill $CRON_PID 2>/dev/null
60
  exit 1
61
  fi
62
 
@@ -105,6 +105,7 @@ fi
105
  cleanup() {
106
  echo "🧹 Cleaning up processes..."
107
  kill $OPENCODE_PID $OPENRESTY_PID $CRON_PID 2>/dev/null
 
108
  echo "✅ Cleanup completed"
109
  exit 0
110
  }
 
21
  echo "${USERNAME}:$(openssl passwd -apr1 ${PASSWORD})" > ${HTPASSWD_FILE}
22
  echo "✅ .htpasswd file generated at ${HTPASSWD_FILE}"
23
 
24
+ # 启动系统 Cron 服务
25
+ echo "⏰ Starting system cron daemon..."
26
+ service cron start
27
+ CRON_PID=$!
28
+
29
  # 启动 OpenCode Web服务器在后台
30
  echo "🤖 Starting OpenCode web server on port ${GATEWAY_PORT}..."
31
  # 确保在正确的目录中启动
 
39
  opencode web --port ${GATEWAY_PORT} --hostname ${GATEWAY_HOST} --cors "*" &
40
  OPENCODE_PID=$!
41
 
 
 
 
 
 
42
  # 等待 OpenCode 启动
43
  echo "⏳ Waiting for OpenCode to start..."
44
  sleep 5
 
55
  curl -s http://${GATEWAY_HOST}:${GATEWAY_PORT}/global/health
56
  else
57
  echo "❌ OpenCode server failed to start"
58
+ # 清理进程
59
+ kill $OPENCODE_PID $CRON_PID 2>/dev/null
60
  exit 1
61
  fi
62
 
 
105
  cleanup() {
106
  echo "🧹 Cleaning up processes..."
107
  kill $OPENCODE_PID $OPENRESTY_PID $CRON_PID 2>/dev/null
108
+ service cron stop 2>/dev/null
109
  echo "✅ Cleanup completed"
110
  exit 0
111
  }