#!/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 "$@"