Files

150 lines
5.2 KiB
Bash
Raw Permalink Normal View History

2026-05-11 10:41:36 +08:00
#!/usr/bin/env bash
# 部署环境体检脚本 - 判断阶段 0-1 是否已完成
#
# 用法:bash check-prereqs.sh
#
# 退出码:0 = 全部 OK;1 = 有必须修复的项目(MISS)
# 不开启 set -e:需要继续检查所有项目
B='\033[34m'; G='\033[32m'; Y='\033[33m'; R='\033[31m'; N='\033[0m'
OK_COUNT=0
WARN_COUNT=0
MISS_COUNT=0
FIX_CMDS=()
ok() { echo -e "${G}[OK]${N} $1"; OK_COUNT=$((OK_COUNT+1)); }
warn() { echo -e "${Y}[WARN]${N} $1"; WARN_COUNT=$((WARN_COUNT+1)); [ -n "${2:-}" ] && { echo " 修复: $2"; FIX_CMDS+=("$2"); }; }
miss() { echo -e "${R}[MISS]${N} $1"; MISS_COUNT=$((MISS_COUNT+1)); [ -n "${2:-}" ] && { echo " 修复: $2"; FIX_CMDS+=("$2"); }; }
echo -e "${B}=== datahub 部署环境体检 ===${N}"
echo "用户: $USER ($(id -u))"
echo "主机: $(hostname)"
echo "OS: $(. /etc/os-release 2>/dev/null && echo "$PRETTY_NAME" || echo unknown)"
echo
# ---------- 1. 必需的可执行程序 ----------
# podman + 版本
if command -v podman >/dev/null 2>&1; then
VER=$(podman --version | awk '{print $3}')
MAJOR=$(echo "$VER" | cut -d. -f1)
MINOR=$(echo "$VER" | cut -d. -f2)
if [[ "$MAJOR" =~ ^[0-9]+$ ]] && { (( MAJOR > 4 )) || { (( MAJOR == 4 )) && (( MINOR >= 4 )); }; }; then
ok "podman v$VER (≥ 4.4 支持 Quadlet)"
else
miss "podman v$VER 版本过旧(需 ≥ 4.4" "升级 podman 到 4.4+Ubuntu 22.04 用 22.10 PPA,或装 podman-stable"
fi
else
miss "podman 未安装" "sudo apt install -y podman"
fi
# systemctl
command -v systemctl >/dev/null 2>&1 \
&& ok "systemctl 可用" \
|| miss "systemctl 不可用(非 systemd 系统?)"
# systemctl --user 是否可用(rootless 关键)
if systemctl --user list-units >/dev/null 2>&1; then
ok "systemctl --user 可用(rootless 必需)"
else
miss "systemctl --user 不可用" "确保用 SSH 直连登录(非 sudo su 切来),并且 XDG_RUNTIME_DIR=/run/user/\$(id -u) 已设置"
fi
# uidmap
command -v newuidmap >/dev/null 2>&1 \
&& ok "uidmap (newuidmap) 已安装" \
|| miss "uidmap 未安装(rootless 必需)" "sudo apt install -y uidmap"
# slirp4netns
command -v slirp4netns >/dev/null 2>&1 \
&& ok "slirp4netns 已安装" \
|| miss "slirp4netns 未安装" "sudo apt install -y slirp4netns"
# fuse-overlayfs(推荐)
command -v fuse-overlayfs >/dev/null 2>&1 \
&& ok "fuse-overlayfs 已安装(rootless 存储驱动推荐)" \
|| warn "fuse-overlayfs 未安装(不影响功能,但 rootless 性能更好)" "sudo apt install -y fuse-overlayfs"
# git
command -v git >/dev/null 2>&1 \
&& ok "git $(git --version | awk '{print $3}')" \
|| miss "git 未安装" "sudo apt install -y git"
# ---------- 2. rootless 用户配置 ----------
# subuid
if grep -q "^${USER}:" /etc/subuid 2>/dev/null; then
ok "/etc/subuid: $(grep "^${USER}:" /etc/subuid)"
else
miss "/etc/subuid 缺少 $USER 映射" "sudo usermod --add-subuids 100000-165535 $USER"
fi
# subgid
if grep -q "^${USER}:" /etc/subgid 2>/dev/null; then
ok "/etc/subgid: $(grep "^${USER}:" /etc/subgid)"
else
miss "/etc/subgid 缺少 $USER 映射" "sudo usermod --add-subgids 100000-165535 $USER"
fi
# lingering
if loginctl show-user "$USER" 2>/dev/null | grep -q "Linger=yes"; then
ok "lingering 已启用(登出 / 重启后服务依然运行)"
else
warn "lingering 未启用(用户登出后服务停 + 开机不自启)" "sudo loginctl enable-linger $USER"
fi
# ---------- 3. 数据目录可达性 ----------
if [ -d /var/container/data/datahub ]; then
if [ -w /var/container/data/datahub ]; then
ok "/var/container/data/datahub 已存在且可写"
else
warn "/var/container/data/datahub 存在但当前用户不可写" "sudo chown $USER:$USER /var/container/data/datahub"
fi
else
if sudo -n true 2>/dev/null; then
ok "/var/container/data/datahub 不存在(setup-data-dirs.sh 会创建,sudo 免密可用)"
else
warn "/var/container/data/datahub 不存在(setup-data-dirs.sh 将提示输入 sudo 密码)"
fi
fi
# ---------- 4. 网络端口(仅提示) ----------
for port in 8080 9501; do
if ss -ltn 2>/dev/null | awk '{print $4}' | grep -qE ":${port}\$"; then
warn "端口 $port 已被占用" "lsof -i :$port 查看占用进程"
fi
done
# ---------- 汇总 ----------
echo
echo "────────────────────────────────────"
echo -e "结果: ${G}${OK_COUNT} OK${N} / ${Y}${WARN_COUNT} WARN${N} / ${R}${MISS_COUNT} MISS${N}"
echo
if (( MISS_COUNT > 0 )); then
echo -e "${R}存在必须修复的项目${N},请按上面的'修复:'命令处理后重新运行本脚本。"
if (( ${#FIX_CMDS[@]} > 0 )); then
echo
echo -e "${B}--- 一键复制修复命令 ---${N}"
# 去重
printf '%s\n' "${FIX_CMDS[@]}" | awk '!seen[$0]++'
echo -e "${B}--- end ---${N}"
fi
exit 1
fi
if (( WARN_COUNT > 0 )); then
echo -e "${Y}有警告项${N}(不阻止部署,建议处理)"
echo "可执行 install.sh,但部分功能可能受限(例如 lingering 未启用 → 不自启)"
exit 0
fi
echo -e "${G}环境已就绪,可以执行:${N}"
echo -e " ${B}bash deploy/podman/scripts/install.sh${N}"
exit 0