Spaces:
Runtime error
Runtime error
File size: 4,298 Bytes
7ddf331 5db454d 7ddf331 5db454d 7ddf331 5db454d 7ddf331 5db454d 7ddf331 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #!/bin/bash
# 设置 DNS(在容器启动后执行)
echo "nameserver 8.8.8.8" > /tmp/resolv.conf
echo "nameserver 8.8.4.4" >> /tmp/resolv.conf
cp /tmp/resolv.conf /etc/resolv.conf 2>/dev/null || true
# 日志级别配置(默认 warning,可选 debug/info/warning)
LOG_LEVEL="${LOG_LEVEL:-warning}"
# 创建日志目录(/root/.opencode/logs 由 bucket 挂载)
mkdir -p /root/.opencode/logs
LOG_DIR='/root/.opencode/logs'
LOG_MAX_SIZE=104857600 # 100MB
log() {
local level="$1"
shift
local message="$@"
# 检查日志文件大小,超过 100MB 则重命名
if [ -f "$LOG_DIR/entrypoint.log" ]; then
LOG_SIZE=$(wc -c < "$LOG_DIR/entrypoint.log" 2>/dev/null | awk '{print $1}')
if [ -n "$LOG_SIZE" ] && [ "$LOG_SIZE" -gt "$LOG_MAX_SIZE" ]; then
mv "$LOG_DIR/entrypoint.log" "$LOG_DIR/entrypoint-$(date +%Y-%m-%d).log"
fi
fi
# 根据 LOG_LEVEL 过滤日志
case "$LOG_LEVEL" in
debug)
# debug: 显示所有日志
;;
info)
# info: 只显示 info/warning/error
[ "$level" = "debug" ] && return
;;
warning)
# warning: 只显示 warning/error
[ "$level" = "debug" ] && return
[ "$level" = "info" ] && return
;;
esac
# 额外过滤:控制台输出级别
local show_on_console=false
[ "$level" = "error" ] && show_on_console=true
[ "$level" = "warning" ] && show_on_console=true
# debug 级别也显示到控制台(方便调试)
[ "$LOG_LEVEL" = "debug" ] && [ "$level" = "debug" ] && show_on_console=true
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
if [ "$show_on_console" = true ]; then
echo "[$TIMESTAMP] [$level] $message" | tee -a "$LOG_DIR/entrypoint.log"
else
echo "[$TIMESTAMP] $message" >> "$LOG_DIR/entrypoint.log"
fi
}
OPENCODE_LOG_FILE="${LOG_DIR}/opencode.log"
# 设置 OpenCode 路径(npm 安装后已在 PATH 中)
export PATH="/root/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
# ============================================
# 启动 OpenCode(带 RAM 监控)
# ============================================
RAM_LIMIT_KB=$((14 * 1024 * 1024))
RAM_CHECK_INTERVAL=30
start_opencode() {
log info "=== 启动 OpenCode ==="
log debug "执行命令: opencode serve --port 7860 --hostname 0.0.0.0"
export OPENCODE_SERVER_USERNAME=${OPENCODE_SERVER_USERNAME}
export OPENCODE_SERVER_PASSWORD=${OPENCODE_SERVER_PASSWORD}
opencode serve --port 7860 --hostname 0.0.0.0 > "$OPENCODE_LOG_FILE" 2>&1 &
OPENCODE_PID=$!
log info "=== OpenCode 已启动(PID: $OPENCODE_PID)==="
}
ram_watchdog() {
while true; do
if [ -n "$OPENCODE_PID" ] && kill -0 "$OPENCODE_PID" 2>/dev/null; then
USED_KB=$(ps --no-headers -o rss --ppid "$OPENCODE_PID" 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
SELF_KB=$(ps --no-headers -o rss -p "$OPENCODE_PID" 2>/dev/null | awk '{print $1+0}')
TOTAL_KB=$((USED_KB + SELF_KB))
# debug 模式显示详细 RAM 信息
if [ "$LOG_LEVEL" = "debug" ]; then
USED_MB=$((USED_KB / 1024))
SELF_MB=$((SELF_KB / 1024))
TOTAL_MB=$((TOTAL_KB / 1024))
RAM_PERCENT=$((TOTAL_KB * 100 / RAM_LIMIT_KB))
log debug "RAM: ${TOTAL_MB}MB / 14336MB (${RAM_PERCENT}%)"
fi
if [ "$TOTAL_KB" -ge "$RAM_LIMIT_KB" ]; then
log warning "=== [RAM] 内存超限!杀死 OpenCode(${TOTAL_KB}KB >= ${RAM_LIMIT_KB}KB)==="
kill -9 "$OPENCODE_PID" 2>/dev/null
sleep 3
log warning '=== [RAM] 重启 OpenCode... ==='
start_opencode
fi
else
log warning '=== [RAM] OpenCode 未运行!重启... ==='
start_opencode
fi
sleep "$RAM_CHECK_INTERVAL"
done
}
start_opencode
ram_watchdog &
log info "=== OpenCode 运行中 ==="
# 无限循环:检查 OpenCode 是否运行
while true; do
pgrep -f 'opencode' > /dev/null || { log error '严重错误:OpenCode 进程已退出!容器退出...'; exit 1; }
sleep "$RAM_CHECK_INTERVAL"
done |