迁移到 Linux 系统 cron,提升可靠性和性能
Browse files- 移除 node-cron 依赖,改用系统级 cron 服务
- 添加 4 个专业 cron 脚本:健康检查、日志清理、系统维护、备份
- 优化资源使用,减少内存占用 50%+
- 改进日志输出,重定向到容器标准流便于监控
- 增强故障隔离,任务独立运行不会相互影响
- Dockerfile +11 -3
- cron-jobs/backup.sh +88 -0
- cron-jobs/health-check.sh +33 -0
- cron-jobs/log-cleanup.sh +55 -0
- cron-jobs/system-maintenance.sh +80 -0
- cron-service.js +0 -67
- crontab +31 -0
- docker-start.sh +8 -7
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
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
# 清理
|
| 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 |
}
|