mirror of
https://github.com/whyour/qinglong.git
synced 2026-06-01 11:20:14 +08:00
* 修改获取示例文件 api path * 增加 debian-slim 基础镜像 * 修复 debian apt 命令,支持 qinglong 命令 * 更新 npm 版本 0.7.7 * 更新 npm v0.8.4 * 修复linux依赖检测 (#2082) * 修复拉取私有仓库 * 修复 shell check_server * 修复 qinglong 命令 * 更新 npm 版本 v0.13.2 * 增加 debian 开发版本 * 修改切换 linux 镜像源 * 修复 qinglong 命令 * 移除 qinglong 命令 npm 默认镜像源 * 修复 workflow * 更新 npm 版本 v0.14.5 * 增加 npx 命令 * 更新 workflow action 版本 * 更新 npm 版本 v0.16.0 * 修复 linux 镜像源 * 更新 npm 版本 v0.17.0 * 更新 npm 版本 v0.18.0 * 修改 npm 安装启动命令 * 更新 npm 版本 v0.19.9 * 修复 debian netcat 包名 * 更新 npm 版本 v0.20.4 * 安装 linux 依赖自动识别 alpine 和 debian * 修改 apt 命令 * 更新 npm 版本 v0.21.2 * 修改 ts 文件执行依赖 * npm 启动增加 reload 逻辑 * 更新 npm 版本 v2.17.8 * 修复 qinglong 命令 * 更新 npm 版本 v2.17.9 * 更新 npm 版本 v2.17.10 * 更新 npm 版本 v2.17.11 * 修改 debian 版本为 12 bookworm * 更新 npm 版本 v2.17.12 * 修改本地服务启动提示 * 更新 npm 版本 v2.17.13 * 写入文件增加文件锁 * 修复系统安装依赖提示 * 更新 npm 版本 v2.18.2-6 * 更新 nodejs 版本 * 更新 npm 版本 v2.18.3-3 * 修复 command 变量 * 移除自动清除 deb * 修复 npm 启动脚本 * 修复发布 npm包依赖文件 * 修改 linux 启动文件逻辑 * 更新 npm 版本 v2.19.0-10 * 修复 apt 命令 * 更新 npm 版本 v2.19.1-0 * 更新 npm 版本 v2.19.2-2 * 增加 packageManager * 增加用户 qinglong * 更新 pipeline * 移除 init_nginx * 更新 npm 版本 v2.20.0 * 更新 npm 版本 2.20.1 * 更新 npm 版本 2.20.2 * fix: 修复非 root 用户启动 * chore: 合并 debian 和 alpine 逻辑 --------- Co-authored-by: dream10201 <xiuxiu10201@gmail.com>
147 lines
5.3 KiB
Bash
Executable File
147 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
dir_shell=/ql/shell
|
||
. $dir_shell/share.sh
|
||
|
||
export_ql_envs() {
|
||
export BACK_PORT="${ql_port}"
|
||
export GRPC_PORT="${ql_grpc_port}"
|
||
}
|
||
|
||
log_with_style() {
|
||
local level="$1"
|
||
local message="$2"
|
||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||
printf "\n[%s] [%7s] %s\n" "${timestamp}" "${level}" "${message}"
|
||
}
|
||
|
||
# ============================================
|
||
# 确保当前用户对 /ql 和 /ql/data 目录有写入权限
|
||
# /ql/data 是 Docker Volume 挂载点,权限可能与 /ql 不同,需单独检测
|
||
# ============================================
|
||
ensure_ql_permissions() {
|
||
local current_uid
|
||
local current_gid
|
||
current_uid=$(id -u)
|
||
current_gid=$(id -g)
|
||
|
||
if [ "$current_uid" -eq 0 ]; then
|
||
return 0
|
||
fi
|
||
|
||
# ---- 检查 /ql 目录 ----
|
||
if ! mkdir -p "$QL_DIR/.tmp" 2>/dev/null; then
|
||
if chown -R "$current_uid:$current_gid" "$QL_DIR" 2>/dev/null; then
|
||
log_with_style "INFO" "已修正 /ql 目录权限: UID=$current_uid GID=$current_gid"
|
||
else
|
||
local ql_owner
|
||
ql_owner=$(stat -c '%u' "$QL_DIR" 2>/dev/null || stat -f '%u' "$QL_DIR" 2>/dev/null)
|
||
log_with_style "ERROR" "============================================="
|
||
log_with_style "ERROR" " 权限错误:无法写入 /ql 目录"
|
||
log_with_style "ERROR" " 当前用户 UID: $current_uid"
|
||
log_with_style "ERROR" " /ql 目录所有者 UID: ${ql_owner:-未知}"
|
||
log_with_style "ERROR" ""
|
||
log_with_style "ERROR" " 解决方案:"
|
||
log_with_style "ERROR" " 1. 使用镜像内置用户: docker run --user ${ql_owner:-5432}:${ql_owner:-5432} ..."
|
||
log_with_style "ERROR" " 2. 使用 root 运行: 移除 --user 参数"
|
||
log_with_style "ERROR" " 3. 修正宿主机数据目录: chown -R $current_uid:$current_gid /path/to/ql/data"
|
||
log_with_style "ERROR" "============================================="
|
||
exit 1
|
||
fi
|
||
fi
|
||
rmdir "$QL_DIR/.tmp" 2>/dev/null || true
|
||
|
||
# ---- 检查 /ql/data 目录(Volume 挂载点,不在用户数据卷内创建临时文件) ----
|
||
if [ ! -w "$QL_DIR/data" ] || [ ! -x "$QL_DIR/data" ]; then
|
||
if chown "$current_uid:$current_gid" "$QL_DIR/data" 2>/dev/null; then
|
||
log_with_style "INFO" "已修正 /ql/data 目录权限: UID=$current_uid GID=$current_gid"
|
||
if [ ! -w "$QL_DIR/data" ] || [ ! -x "$QL_DIR/data" ]; then
|
||
log_with_style "ERROR" "修正后仍无法写入 /ql/data,请检查挂载的数据卷权限"
|
||
log_with_style "ERROR" "确保宿主机目录: chown -R $current_uid:$current_gid /your/data"
|
||
exit 1
|
||
fi
|
||
else
|
||
local data_owner
|
||
data_owner=$(stat -c '%u' "$QL_DIR/data" 2>/dev/null || stat -f '%u' "$QL_DIR/data" 2>/dev/null)
|
||
log_with_style "ERROR" "============================================="
|
||
log_with_style "ERROR" " 权限错误:无法写入 /ql/data (Volume 挂载点)"
|
||
log_with_style "ERROR" " 当前用户 UID: $current_uid"
|
||
log_with_style "ERROR" " /ql/data 所有者 UID: ${data_owner:-未知}"
|
||
log_with_style "ERROR" ""
|
||
log_with_style "ERROR" " 请修正宿主机数据目录权限:"
|
||
log_with_style "ERROR" " chown -R $current_uid:$current_gid /your/ql/data"
|
||
log_with_style "ERROR" "============================================="
|
||
exit 1
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# Fix DNS resolution issues in Alpine Linux
|
||
if [ -f /etc/alpine-release ]; then
|
||
if ! grep -q "^options ndots:0" /etc/resolv.conf 2>/dev/null; then
|
||
echo "options ndots:0" >> /etc/resolv.conf
|
||
log_with_style "INFO" "🔧 0. 已配置 DNS 解析优化 (ndots:0)"
|
||
fi
|
||
fi
|
||
|
||
# 确保 /etc/hosts 包含 localhost 解析(应对精简镜像或仅 IPv4/IPv6 环境)
|
||
if ! grep -qE '^127\.0\.0\.1[[:space:]]+.*localhost' /etc/hosts 2>/dev/null; then
|
||
echo "127.0.0.1 localhost" >> /etc/hosts
|
||
log_with_style "INFO" "🔧 0. 已添加 IPv4 localhost 解析"
|
||
fi
|
||
if ! grep -qE '^::1[[:space:]]+.*localhost' /etc/hosts 2>/dev/null; then
|
||
echo "::1 localhost ip6-localhost ip6-loopback" >> /etc/hosts
|
||
log_with_style "INFO" "🔧 0. 已添加 IPv6 localhost 解析"
|
||
fi
|
||
|
||
# 在一切操作之前检查目录权限
|
||
ensure_ql_permissions
|
||
|
||
# Dockerfile 中 HOME=/root,非 root 用户无法写入
|
||
# 将 HOME 修正为临时目录,PM2/npm/pip 等工具的运行时数据无需持久化
|
||
if [ ! -w "$HOME" ]; then
|
||
export HOME="$QL_DIR/.tmp"
|
||
fi
|
||
|
||
log_with_style "INFO" "🚀 1. 检测配置文件..."
|
||
load_ql_envs
|
||
export_ql_envs
|
||
. $dir_shell/env.sh
|
||
import_config "$@"
|
||
fix_config
|
||
|
||
# Try to initialize PM2, but don't fail if it doesn't work
|
||
pm2 l &>/dev/null || log_with_style "WARN" "PM2 初始化可能失败,将在启动时尝试使用备用方案"
|
||
|
||
log_with_style "INFO" "⚙️ 2. 启动 pm2 服务..."
|
||
reload_pm2
|
||
|
||
if [[ $AutoStartBot == true ]]; then
|
||
log_with_style "INFO" "🤖 3. 启动 bot..."
|
||
nohup ql bot >$dir_log/bot.log 2>&1 &
|
||
fi
|
||
|
||
if [[ $EnableExtraShell == true ]]; then
|
||
log_with_style "INFO" "🛠️ 4. 执行自定义脚本..."
|
||
nohup ql extra >$dir_log/extra.log 2>&1 &
|
||
fi
|
||
|
||
log_with_style "SUCCESS" "🎉 容器启动成功!"
|
||
|
||
# 自动检测调度模式:有 crond 二进制 → system 模式,否则 node 模式
|
||
if [ -z "$QL_SCHEDULER" ]; then
|
||
if command -v crond &>/dev/null; then
|
||
export QL_SCHEDULER="system"
|
||
else
|
||
export QL_SCHEDULER="node"
|
||
fi
|
||
fi
|
||
|
||
if [ "$QL_SCHEDULER" = "system" ]; then
|
||
crond -f > /dev/null
|
||
else
|
||
tail -f /dev/null
|
||
fi
|
||
|
||
exec "$@"
|