Files
wordcloud/install-ubuntu.sh
T

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 "$@"