first commit

This commit is contained in:
2026-05-10 10:56:52 +08:00
commit 9dec38db60
35 changed files with 8206 additions and 0 deletions
+116
View File
@@ -0,0 +1,116 @@
#!/bin/bash
# chongming 开发环境一键启动脚本 (远程执行版)
# 用法: 上传到虚拟机 /tmp/ 后执行,会自动定位到项目根目录
# 项目路径: ~/workspace/chongming
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "${GREEN}==> 初始化 chongming 开发环境${NC}"
# 1. 定位项目根目录
PROJECT_DIR=~/workspace/chongming
if [ ! -d "$PROJECT_DIR" ]; then
echo -e "${RED}错误:项目目录不存在: $PROJECT_DIR${NC}"
echo -e "${YELLOW}请先在虚拟机中创建项目目录并拉取代码:${NC}"
echo " mkdir -p ~/workspace && cd ~/workspace"
echo " git clone <仓库地址> chongming"
exit 1
fi
cd "$PROJECT_DIR"
echo -e "${GREEN}✔ 切换到项目目录: $(pwd)${NC}"
# 确认 pyproject.toml 存在(防御性检查)
if [ ! -f "pyproject.toml" ]; then
echo -e "${RED}错误:项目目录中未找到 pyproject.toml:$(pwd)${NC}"
exit 1
fi
# 2. 加载 nvm(SSH 非交互式 shell 需要手动加载)
export NVM_DIR="$HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
. "$NVM_DIR/nvm.sh" 2>/dev/null
fi
# 3. 检查 Node.js (版本要求 >=20.19)
if ! command -v node &> /dev/null; then
echo -e "${RED}错误:未找到 node,请安装 Node.js >= 20.19${NC}"
echo "推荐使用 nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"
exit 1
fi
NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
if [ "$NODE_VERSION" -lt 20 ]; then
echo -e "${RED}错误:Node.js 版本过低 (当前 $(node -v)),需要 >=20.19${NC}"
exit 1
fi
echo -e "${GREEN}✔ Node.js $(node -v)${NC}"
# 4. 安装/检查 uv (项目推荐)
# SSH 非交互式 shell 的 PATH 可能不含 ~/.local/bin,手动添加
export PATH="$HOME/.local/bin:$PATH"
if ! command -v uv &> /dev/null; then
echo -e "${YELLOW}未找到 uv,正在自动安装...${NC}"
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
if ! command -v uv &> /dev/null; then
echo -e "${RED}uv 安装失败,请手动安装:https://docs.astral.sh/uv/${NC}"
exit 1
fi
echo -e "${GREEN}uv 安装成功${NC}"
fi
# 5. 安装后端依赖
echo -e "${GREEN}==> 安装后端依赖 (uv sync)${NC}"
cd ~/workspace/chongming
uv sync
# 6. 安装前端依赖
echo -e "${GREEN}==> 安装前端依赖 (npm install)${NC}"
cd ~/workspace/chongming/src/chongming-web
npm install
cd ../..
# 7. 启动后端服务(后台运行,使用 nohup 防止 SSH 断开后被 SIGHUP 杀死)
echo -e "${GREEN}==> 启动后端服务 (uv run serve)${NC}"
mkdir -p ~/workspace/chongming/logs
nohup uv run serve > ~/workspace/chongming/logs/backend.log 2>&1 &
BACKEND_PID=$!
# 等待后端完全启动(健康检查)
echo "等待后端服务就绪(约3秒)..."
sleep 10
# 可选:检查端口8000是否监听
if ! ss -tln | grep -q ':8000'; then
echo -e "${YELLOW}警告:后端可能尚未完全启动,请稍后手动检查${NC}"
fi
# 8. 生成前端 API 客户端(需要后端运行)
echo -e "${GREEN}==> 生成前端 API 客户端 (npm run openapi)${NC}"
cd src/chongming-web
npm run openapi || echo -e "${YELLOW}注意:生成 openapi 失败,请确认后端已运行在 http://localhost:8000${NC}"
cd ../..
# 9. 启动前端开发服务器(后台运行,使用 nohup 防止 SSH 断开后被 SIGHUP 杀死)
echo -e "${GREEN}==> 启动前端开发服务器 (npm run dev)${NC}"
cd src/chongming-web
nohup npm run dev > ~/workspace/chongming/logs/frontend.log 2>&1 &
FRONTEND_PID=$!
cd ../..
echo -e "前端地址: ${GREEN}http://localhost:5173${NC}"
echo -e "后端地址: ${GREEN}http://localhost:8000${NC}"
echo -e "后端日志: ~/workspace/chongming/logs/backend.log"
echo -e "前端日志: ~/workspace/chongming/logs/frontend.log"
echo -e "后端 PID: $BACKEND_PID"
echo -e "前端 PID: $FRONTEND_PID"
# 记录 PID 到文件,方便后续停止服务
echo -e "$BACKEND_PID\n$FRONTEND_PID" > ~/workspace/chongming/.dev_pids
echo -e "${GREEN}✅ 开发环境已全部启动,脚本将退出,服务在后台持续运行${NC}"
echo -e "${YELLOW}要停止服务,请执行: kill \$(cat ~/workspace/chongming/.dev_pids)${NC}"
+189
View File
@@ -0,0 +1,189 @@
#!/bin/bash
#
# deploy_docker.sh - Docker 一键部署脚本
# 适用系统: Ubuntu 20.04 (Focal)
# 功能: 安装 Docker Engine 并配置国内镜像加速器
#
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 检查是否以 root 运行
check_root() {
if [ "$EUID" -ne 0 ]; then
log_warn "未以 root 身份运行,将使用 sudo 提权"
SUDO="sudo"
else
SUDO=""
fi
}
# 步骤1: 清理旧 Docker 仓库配置(避免残余配置干扰)
cleanup_old_repo() {
log_info "步骤1: 清理旧 Docker 仓库配置..."
# 移除所有旧的 docker 源文件
$SUDO rm -f /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker*.list
# 移除旧的 docker gpg 密钥
$SUDO rm -f /usr/share/keyrings/docker-archive-keyring.gpg
$SUDO apt-key del "7EA0A9C3F273FCD8" 2>/dev/null || true
log_info "旧 Docker 仓库配置已清理"
}
# 步骤2: 添加 Docker 官方 GPG 密钥(使用阿里云镜像)
add_gpg_key() {
log_info "步骤2: 添加 Docker GPG 密钥..."
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /tmp/docker.gpg
# 安装到 keyrings 目录(供 signed-by 使用)
$SUDO mkdir -p /usr/share/keyrings
$SUDO gpg --batch --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg /tmp/docker.gpg 2>/dev/null || true
# 用 apt-key 添加(传统方式兼容)
$SUDO apt-key add /tmp/docker.gpg
rm -f /tmp/docker.gpg
log_info "GPG 密钥添加完成"
}
# 步骤3: 添加 Docker APT 源(使用阿里云镜像,带 signed-by 引用)
add_docker_repo() {
log_info "步骤3: 添加 Docker APT 源..."
# 使用 signed-by 添加(指定密钥文件路径,避免 NO_PUBKEY 错误)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | $SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null
log_info "Docker APT 源添加完成"
}
# 步骤4: 更新 apt 并安装依赖(此时 Docker 源已配置好密钥)
install_dependencies() {
log_info "步骤4: 更新 apt 包索引并安装依赖..."
$SUDO apt update -y
$SUDO apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
log_info "依赖安装完成"
}
# 步骤5: 安装 Docker Engine
install_docker() {
log_info "步骤5: 安装 Docker Engine(先装核心组件,再试可选组件)..."
# 核心组件(必须成功)
$SUDO apt install -y docker-ce docker-ce-cli containerd.io || {
log_error "Docker 核心组件安装失败!"
exit 1
}
# 可选组件(失败不影响核心功能)
for pkg in docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras; do
if $SUDO apt install -y "$pkg" 2>/dev/null; then
log_info "✔ $pkg 安装成功"
else
log_warn "$pkg 安装失败(可选组件,可跳过)"
fi
done
log_info "Docker Engine 安装完成"
}
# 步骤6: 配置 Docker 镜像加速器
configure_mirrors() {
log_info "步骤6: 配置 Docker 镜像加速器..."
$SUDO mkdir -p /etc/docker
cat > /tmp/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
$SUDO cp /tmp/daemon.json /etc/docker/daemon.json
rm -f /tmp/daemon.json
log_info "镜像加速器配置完成"
}
# 步骤7: 重启 Docker 服务
restart_docker() {
log_info "步骤7: 重启 Docker 服务..."
$SUDO systemctl restart docker
log_info "Docker 服务已重启"
}
# 步骤8: 验证安装
verify_installation() {
log_info "步骤8: 验证安装..."
# 检查 Docker 版本
if docker --version &>/dev/null; then
log_info "$(docker --version)"
else
log_error "Docker 未正确安装"
exit 1
fi
# 检查 Docker 服务状态
if $SUDO systemctl is-active docker &>/dev/null; then
log_info "Docker 服务运行正常"
else
log_error "Docker 服务未运行"
exit 1
fi
# 检查镜像加速器
if $SUDO docker info 2>/dev/null | grep -q "Registry Mirrors"; then
log_info "镜像加速器配置如下:"
$SUDO docker info 2>/dev/null | grep -A5 "Registry Mirrors"
fi
# 运行 hello-world 测试
log_info "运行 hello-world 测试..."
if $SUDO docker run --rm hello-world &>/dev/null; then
log_info "Docker 安装验证通过!"
else
log_warn "hello-world 测试未通过,请检查网络连接"
fi
}
# 主函数
main() {
echo "=========================================="
echo " Docker 一键部署脚本"
echo " 适用系统: Ubuntu 20.04"
echo "=========================================="
echo ""
check_root
cleanup_old_repo
add_gpg_key
add_docker_repo
install_dependencies
install_docker
configure_mirrors
restart_docker
verify_installation
echo ""
echo "=========================================="
echo -e "${GREEN} Docker 部署完成!${NC}"
echo "=========================================="
echo ""
echo "常用命令:"
echo " docker ps - 查看运行中的容器"
echo " docker images - 查看本地镜像"
echo " docker info - 查看 Docker 信息"
echo " docker run hello-world - 测试 Docker 安装"
echo ""
}
main "$@"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# ============================================
# deploy_git.sh - Git 安装部署脚本
# 适用系统: Ubuntu 20.04
# 功能: 一键安装 Git 并验证
# ============================================
set -e # 遇到错误立即退出
echo "=========================================="
echo " 开始部署 Git ..."
echo "=========================================="
# 步骤 1: 更新软件包列表
echo "[Step 1/4] 更新软件包列表..."
sudo apt update -y
# 步骤 2: 安装 Git
echo "[Step 2/4] 安装 Git..."
sudo apt install -y git
# 步骤 3: 验证安装
echo "[Step 3/4] 验证 Git 安装..."
if command -v git &>/dev/null; then
echo " Git 安装成功!"
git --version
else
echo " Git 安装失败!"
exit 1
fi
# 步骤 4: 配置基本信息(可选)
echo "[Step 4/4] 配置 Git 基本信息(可选)..."
echo " 提示:您可以使用以下命令配置用户名和邮箱:"
echo " git config --global user.name \"Your Name\""
echo " git config --global user.email \"your_email@example.com\""
echo ""
echo "=========================================="
echo " Git 部署完成!"
echo " 版本: $(git --version 2>/dev/null || echo 'unknown')"
echo "=========================================="
+133
View File
@@ -0,0 +1,133 @@
#!/bin/bash
# ==============================================================
# NVM 部署脚本 - 一键安装 nvm + Node.js LTS 稳定版 + 换源加速
# ==============================================================
# 适用系统: Ubuntu 20.04+
# 说明: 使用国内镜像源加速,避免 GitHub raw 下载缓慢
# 安装 Node.js LTS 版(比 latest 更小更快)
#
# 注意:脚本可能通过 sudo 以 root 身份执行,
# 因此需要检测原始用户并切换到该用户安装 nvm,
# 避免 nvm 装到 /root 下导致原用户看不到。
# =============================================================
set -e
echo "========================================"
echo " NVM 部署脚本 - 开始安装..."
echo "========================================"
# ---------- 检测原始用户 ----------
# 如果通过 sudo 运行,SUDO_USER 会保留原用户名
if [ -n "$SUDO_USER" ]; then
REAL_USER="$SUDO_USER"
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
if [ -z "$REAL_HOME" ]; then
REAL_HOME="/home/$REAL_USER"
fi
else
REAL_USER=$(whoami)
REAL_HOME="$HOME"
fi
echo " 检测到实际用户: $REAL_USER"
echo " 用户目录: $REAL_HOME"
echo ""
NVM_VERSION="v0.39.7"
NODE_LTS_VERSION="--lts" # 安装 LTS 最新版(比 install node 的 latest 版更小)
# ---------- 辅助函数:以原始用户身份执行命令 ----------
run_as_user() {
if [ "$(whoami)" != "$REAL_USER" ]; then
sudo -u "$REAL_USER" bash -c "$*"
else
bash -c "$*"
fi
}
# 1. 安装 nvm(使用 gitee 镜像加速)
echo "[1/4] 正在安装 nvm ${NVM_VERSION}..."
# 优先用 gitee 镜像(国内快),失败则回滚到 GitHub 官方
NVM_INSTALL_URL="https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/install.sh"
echo " 下载源: ${NVM_INSTALL_URL}"
# 以原始用户身份下载并执行安装脚本
rm -f /tmp/install_nvm.sh
if timeout 30 curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh 2>/dev/null; then
echo " ✅ 从 Gitee 镜像下载成功"
else
echo " ⚠ Gitee 镜像下载失败,切换到 GitHub 源..."
NVM_INSTALL_URL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh"
curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh
fi
# 以原始用户身份执行安装(不要用 sudo)
chown "$REAL_USER":"$REAL_USER" /tmp/install_nvm.sh 2>/dev/null || true
sudo -u "$REAL_USER" bash /tmp/install_nvm.sh
rm -f /tmp/install_nvm.sh
# 2. 加载 nvm 到当前 shell(以原始用户身份)
echo "[2/4] 正在加载 nvm 环境变量..."
export NVM_DIR="$REAL_HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
\. "$NVM_DIR/nvm.sh"
echo " nvm 已加载"
else
echo " ⚠ nvm.sh 未找到,可能安装过程中出现问题"
ls -la "$NVM_DIR" 2>/dev/null || echo " .nvm 目录不存在"
fi
# 3. 配置淘宝镜像源(加速 Node.js 下载)
echo "[3/4] 正在配置淘宝镜像源..."
echo 'export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node' >> "$REAL_HOME/.bashrc"
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
echo " 镜像源已配置: NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node"
# 4. 安装 Node.js LTS 版
echo "[4/4] 正在安装 Node.js LTS 版本(稳定版)..."
echo " 下载源: ${NVM_NODEJS_ORG_MIRROR}"
# nvm install 必须以原始用户身份执行,否则 $NVM_DIR 不匹配
sudo -u "$REAL_USER" bash -c "
export NVM_DIR='$REAL_HOME/.nvm'
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
export NVM_NODEJS_ORG_MIRROR='$NVM_NODEJS_ORG_MIRROR'
nvm install $NODE_LTS_VERSION
"
# 验证安装结果
echo ""
echo "========================================"
echo " 安装完成!验证信息如下:"
echo "========================================"
# 以原始用户身份验证
sudo -u "$REAL_USER" bash -c "
export NVM_DIR='$REAL_HOME/.nvm'
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
if command -v nvm &> /dev/null; then
echo ' nvm 版本 : \$(nvm --version)'
else
echo ' nvm 版本 : n/a'
fi
if command -v node &> /dev/null; then
echo ' node 版本: \$(node -v)'
else
echo ' node 版本: n/a'
fi
if command -v npm &> /dev/null; then
echo ' npm 版本 : \$(npm -v)'
else
echo ' npm 版本 : n/a'
fi
echo ''
echo ' 当前默认使用的 Node 版本:'
nvm ls 2>/dev/null || echo ' nvm ls 不可用'
"
echo ""
echo "========================================"
echo " 提示:重新登录终端或执行:"
echo " source ~/.bashrc"
echo " 然后: nvm --version"
echo "========================================"
+151
View File
@@ -0,0 +1,151 @@
#!/bin/bash
# =============================================================
# deploy_uv.sh - uv (Python 包管理工具) 一键安装与配置脚本
# =============================================================
# 适用系统: Ubuntu 20.04+
# 功能: 安装 uv、配置国内镜像源加速
# 说明: 先将安装脚本下载到本地再执行,避免管道问题;
# 如果官方源慢,自动切 GitHub Release 镜像。
# =============================================================
set -e
echo "========================================"
echo " 开始部署 uv - Python 包管理工具"
echo "========================================"
# ---------- 1. 安装 uv ----------
install_uv() {
echo "[1/4] 正在安装 uv..."
# 先将安装脚本下载到 /tmp(而非管道直接执行)
echo " 正在下载安装脚本..."
# 尝试从官方源下载(带超时)
if timeout 30 curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv-install.sh 2>/dev/null; then
echo " 下载源: https://astral.sh/uv/install.sh"
else
# 官方源超时,换 GitHub Release(国内 CDN 更快)
echo " 官方源下载超时,尝试 GitHub Release..."
UV_VERSION=$(curl -fsSL https://api.github.com/repos/astral-sh/uv/releases/latest 2>/dev/null | grep '"tag_name"' | cut -d'"' -f4)
if [ -z "$UV_VERSION" ]; then
UV_VERSION="0.6.14" # fallback 固定版本
fi
echo " 正在下载 uv ${UV_VERSION} 预编译包..."
curl -fsSL "https://github.com/astral-sh/uv/releases/download/${UV_VERSION}/uv-${UV_VERSION}-x86_64-unknown-linux-gnu.tar.gz" -o /tmp/uv.tar.gz
# 解压并安装
mkdir -p /tmp/uv-extract
tar xzf /tmp/uv.tar.gz -C /tmp/uv-extract
cp /tmp/uv-extract/uv-${UV_VERSION}-x86_64-unknown-linux-gnu/uv /tmp/uv-install-dir/ 2>/dev/null || true
# 直接复制到 local/bin
mkdir -p "$HOME/.local/bin"
cp /tmp/uv-extract/uv-${UV_VERSION}-x86_64-unknown-linux-gnu/uv "$HOME/.local/bin/uv"
chmod +x "$HOME/.local/bin/uv"
ln -sf "$HOME/.local/bin/uv" "$HOME/.local/bin/uvx" 2>/dev/null || true
rm -rf /tmp/uv.tar.gz /tmp/uv-extract
echo "✅ uv 安装成功(来自 GitHub Release)!"
return 0
fi
# 执行安装脚本
echo " 正在执行安装..."
bash /tmp/uv-install.sh
rm -f /tmp/uv-install.sh
if [ $? -ne 0 ]; then
echo "❌ uv 安装失败,请检查网络连接后重试。"
exit 1
fi
echo "✅ uv 安装成功!"
}
# ---------- 2. 配置环境变量 ----------
setup_env() {
echo "[2/4] 正在配置环境变量..."
# 检测 shell 并添加 uv 到 PATH
SHELL_CONFIG=""
if [ -n "$BASH_VERSION" ]; then
SHELL_CONFIG="$HOME/.bashrc"
elif [ -n "$ZSH_VERSION" ]; then
SHELL_CONFIG="$HOME/.zshrc"
else
SHELL_CONFIG="$HOME/.profile"
fi
# 如果 PATH 中还没有 uv 路径,则添加
if ! echo "$PATH" | grep -q "$HOME/.local/bin"; then
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$SHELL_CONFIG"
echo "已添加到 $SHELL_CONFIG"
else
echo "$HOME/.local/bin 已在 PATH 中"
fi
# 临时生效
export PATH="$HOME/.local/bin:$PATH"
echo "✅ 环境变量配置完成!"
}
# ---------- 3. 创建 uv 配置文件(换源) ----------
config_mirror() {
echo "[3/4] 正在配置国内镜像源(加速下载)..."
CONFIG_DIR="$HOME/.config/uv"
CONFIG_FILE="$CONFIG_DIR/uv.toml"
mkdir -p "$CONFIG_DIR"
cat > "$CONFIG_FILE" << 'EOF'
# uv 全局配置 - 使用国内镜像源加速
# Python 版本下载镜像源(提高 `uv python install` 速度)
python-install-mirror = "https://registry.npmmirror.com/-/binary/python-build-standalone/"
# pip 包下载镜像源(提高 `uv pip install` 速度)
[[index]]
url = "https://mirrors.aliyun.com/pypi/simple/"
default = true
EOF
echo "配置文件已创建: $CONFIG_FILE"
echo "✅ 镜像源配置完成!"
}
# ---------- 4. 验证安装 ----------
verify_install() {
echo "[4/4] 正在验证安装..."
if command -v uv &> /dev/null; then
UV_VER=$(uv --version)
echo "✅ uv 版本: $UV_VER"
else
echo "❌ uv 命令未找到,请重启终端或执行: source ~/.bashrc"
exit 1
fi
if command -v uvx &> /dev/null; then
echo "✅ uvx 已安装(用于运行工具包)"
fi
echo ""
echo "========================================"
echo " 🎉 uv 部署完成!"
echo "========================================"
echo ""
echo "快速上手:"
echo " uv python install 3.12 # 安装 Python 3.12"
echo " uv venv # 创建虚拟环境"
echo " uv pip install requests # 安装包"
echo " uv run main.py # 运行脚本"
echo ""
echo "重启终端或执行: source $SHELL_CONFIG"
}
# ---------- 主流程 ----------
install_uv
setup_env
config_mirror
verify_install