140 lines
4.3 KiB
Bash
140 lines
4.3 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
# ============================================================
|
||
|
|
# PR-Helper 一键部署脚本 (Ubuntu/Debian, 国内镜像加速)
|
||
|
|
# ============================================================
|
||
|
|
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||
|
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||
|
|
error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
cd "$SCRIPT_DIR"
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 1. 检查 Docker 环境
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
check_docker() {
|
||
|
|
if ! command -v docker &>/dev/null; then
|
||
|
|
error "未检测到 Docker,请先安装 Docker"
|
||
|
|
fi
|
||
|
|
if ! docker compose version &>/dev/null && ! docker-compose version &>/dev/null; then
|
||
|
|
error "未检测到 Docker Compose,请先安装 Docker Compose 插件"
|
||
|
|
fi
|
||
|
|
info "Docker 环境检查通过"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 2. 配置 Docker 国内镜像加速
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
setup_docker_mirror() {
|
||
|
|
local daemon_json="/etc/docker/daemon.json"
|
||
|
|
local mirror='{
|
||
|
|
"registry-mirrors": [
|
||
|
|
"https://docker.1ms.run",
|
||
|
|
"https://docker.xuanyuan.me",
|
||
|
|
"https://docker.m.daocloud.io"
|
||
|
|
]
|
||
|
|
}'
|
||
|
|
|
||
|
|
if [ -f "$daemon_json" ]; then
|
||
|
|
if grep -q "registry-mirrors" "$daemon_json"; then
|
||
|
|
warn "Docker 镜像加速已配置,跳过"
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
warn "已存在 daemon.json,备份后追加镜像配置"
|
||
|
|
sudo cp "$daemon_json" "${daemon_json}.bak.$(date +%s)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
info "配置 Docker 国内镜像加速..."
|
||
|
|
echo "$mirror" | sudo tee "$daemon_json" > /dev/null
|
||
|
|
sudo systemctl daemon-reload
|
||
|
|
sudo systemctl restart docker
|
||
|
|
info "Docker 镜像加速配置完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 3. 注入 Go 模块代理到 Dockerfile
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
setup_go_proxy() {
|
||
|
|
local dockerfile="Dockerfile"
|
||
|
|
local proxy_env="GOPROXY=https://goproxy.cn,direct"
|
||
|
|
|
||
|
|
if grep -q "GOPROXY" "$dockerfile"; then
|
||
|
|
warn "Dockerfile 已配置 GOPROXY,跳过"
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
info "注入 Go 模块代理到 Dockerfile..."
|
||
|
|
# 在 builder 阶段的 RUN go mod download 之前注入 ENV
|
||
|
|
sed -i "/^RUN go mod download$/i ENV ${proxy_env}" "$dockerfile"
|
||
|
|
info "Go 模块代理配置完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 4. 配置服务端口
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
setup_port() {
|
||
|
|
local port="${1:-9050}"
|
||
|
|
local compose_file="docker-compose.yml"
|
||
|
|
|
||
|
|
info "配置服务端口为 ${port}..."
|
||
|
|
sed -i "s/- \"8080:8080\"/- \"${port}:8080\"/" "$compose_file"
|
||
|
|
info "端口配置完成: ${port}"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 5. 构建并启动服务
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
build_and_start() {
|
||
|
|
info "构建 Docker 镜像(首次可能需要几分钟)..."
|
||
|
|
docker compose build
|
||
|
|
|
||
|
|
info "启动服务..."
|
||
|
|
docker compose up -d
|
||
|
|
|
||
|
|
info "等待服务启动..."
|
||
|
|
sleep 3
|
||
|
|
|
||
|
|
if docker compose ps | grep -q "running\|Up"; then
|
||
|
|
info "=========================================="
|
||
|
|
info " PR-Helper 部署成功!"
|
||
|
|
info "=========================================="
|
||
|
|
info "访问地址: http://$(hostname -I | awk '{print $1}'):${PORT:-9050}"
|
||
|
|
info "本地访问: http://localhost:${PORT:-9050}"
|
||
|
|
info ""
|
||
|
|
info "常用命令:"
|
||
|
|
info " 查看日志: docker compose logs -f"
|
||
|
|
info " 停止服务: docker compose down"
|
||
|
|
info " 重启服务: docker compose restart"
|
||
|
|
info "=========================================="
|
||
|
|
else
|
||
|
|
error "服务启动失败,请查看日志: docker compose logs"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
# 主流程
|
||
|
|
# ----------------------------------------------------------
|
||
|
|
main() {
|
||
|
|
local port="${1:-9050}"
|
||
|
|
export PORT="$port"
|
||
|
|
|
||
|
|
info "开始部署 PR-Helper..."
|
||
|
|
info "目标端口: ${port}"
|
||
|
|
|
||
|
|
check_docker
|
||
|
|
setup_docker_mirror
|
||
|
|
setup_go_proxy
|
||
|
|
setup_port "$port"
|
||
|
|
build_and_start
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|