154 lines
4.2 KiB
Bash
Executable File
154 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# WordCloud — Ubuntu 一键安装 / 启动脚本
|
|
# 用法:
|
|
# chmod +x install-ubuntu.sh
|
|
# ./install-ubuntu.sh
|
|
#
|
|
# 可选环境变量:
|
|
# SKIP_DOCKER_INSTALL=1 跳过 Docker 安装检测
|
|
# NO_BUILD=1 不强制 --build(沿用已有镜像)
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
cd "$ROOT_DIR"
|
|
|
|
log() { echo "[INFO] $*"; }
|
|
ok() { echo "[OK] $*"; }
|
|
warn() { echo "[WARN] $*"; }
|
|
err() { echo "[ERROR] $*" >&2; }
|
|
|
|
need_cmd() {
|
|
command -v "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
compose() {
|
|
if docker compose version >/dev/null 2>&1; then
|
|
docker compose "$@"
|
|
elif need_cmd docker-compose; then
|
|
docker-compose "$@"
|
|
else
|
|
err "未找到 docker compose / docker-compose"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_root_for_docker_install() {
|
|
if [[ "${EUID}" -ne 0 ]]; then
|
|
if need_cmd sudo; then
|
|
SUDO="sudo"
|
|
else
|
|
err "需要 root 权限安装 Docker,请用 root 运行或安装 sudo"
|
|
exit 1
|
|
fi
|
|
else
|
|
SUDO=""
|
|
fi
|
|
}
|
|
|
|
install_docker_ubuntu() {
|
|
require_root_for_docker_install
|
|
log "检测到未安装 Docker,开始在 Ubuntu 上安装..."
|
|
|
|
$SUDO apt-get update -y
|
|
$SUDO apt-get install -y ca-certificates curl gnupg lsb-release
|
|
|
|
if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then
|
|
$SUDO install -m 0755 -d /etc/apt/keyrings
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | $SUDO gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
$SUDO chmod a+r /etc/apt/keyrings/docker.gpg
|
|
fi
|
|
|
|
local codename
|
|
codename="$(. /etc/os-release && echo "${VERSION_CODENAME:-$UBUNTU_CODENAME}")"
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${codename} stable" \
|
|
| $SUDO tee /etc/apt/sources.list.d/docker.list >/dev/null
|
|
|
|
$SUDO apt-get update -y
|
|
$SUDO apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
|
|
$SUDO systemctl enable --now docker
|
|
ok "Docker 安装完成"
|
|
}
|
|
|
|
ensure_docker() {
|
|
if need_cmd docker && docker info >/dev/null 2>&1; then
|
|
ok "Docker 可用"
|
|
return
|
|
fi
|
|
|
|
if [[ "${SKIP_DOCKER_INSTALL:-0}" == "1" ]]; then
|
|
err "Docker 不可用,且设置了 SKIP_DOCKER_INSTALL=1"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f /etc/os-release ]]; then
|
|
# shellcheck disable=SC1091
|
|
. /etc/os-release
|
|
if [[ "${ID:-}" == "ubuntu" || "${ID_LIKE:-}" == *"ubuntu"* || "${ID_LIKE:-}" == *"debian"* ]]; then
|
|
install_docker_ubuntu
|
|
else
|
|
err "当前系统不是 Ubuntu/Debian,请先手动安装 Docker 后再运行本脚本"
|
|
exit 1
|
|
fi
|
|
else
|
|
err "无法识别操作系统,请先手动安装 Docker"
|
|
exit 1
|
|
fi
|
|
|
|
if ! docker info >/dev/null 2>&1; then
|
|
warn "当前用户可能无 Docker 权限,尝试使用 sudo..."
|
|
if need_cmd sudo && sudo docker info >/dev/null 2>&1; then
|
|
DOCKER_PREFIX="sudo"
|
|
else
|
|
err "Docker 已安装但当前用户无权限。请执行: sudo usermod -aG docker \$USER 后重新登录"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
DOCKER_PREFIX=""
|
|
run_compose() {
|
|
if [[ -n "${DOCKER_PREFIX}" ]]; then
|
|
$DOCKER_PREFIX docker compose "$@" 2>/dev/null || $DOCKER_PREFIX docker-compose "$@"
|
|
else
|
|
compose "$@"
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
echo "========================================="
|
|
echo " WordCloud Ubuntu 一键部署"
|
|
echo " 目录: $ROOT_DIR"
|
|
echo "========================================="
|
|
|
|
if [[ ! -f "$ROOT_DIR/docker-compose.yml" ]]; then
|
|
err "未找到 docker-compose.yml,请在 release 包根目录执行本脚本"
|
|
exit 1
|
|
fi
|
|
|
|
ensure_docker
|
|
|
|
log "构建并启动服务(首次会编译 C++ 扩展与前端,可能需要几分钟)..."
|
|
if [[ "${NO_BUILD:-0}" == "1" ]]; then
|
|
run_compose up -d
|
|
else
|
|
run_compose up -d --build
|
|
fi
|
|
|
|
ok "服务已启动"
|
|
echo ""
|
|
echo "访问地址:"
|
|
echo " 前端: http://<服务器IP>:3000"
|
|
echo " 后端文档: http://<服务器IP>:8000/docs"
|
|
echo " 健康检查: http://<服务器IP>:8000/api/health"
|
|
echo ""
|
|
echo "常用命令:"
|
|
echo " make logs # 查看日志"
|
|
echo " make down # 停止服务"
|
|
echo " make restart # 重启服务"
|
|
echo " ./install-ubuntu.sh # 再次执行可重建并启动"
|
|
}
|
|
|
|
main "$@"
|