diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..ff64aed --- /dev/null +++ b/deploy.sh @@ -0,0 +1,139 @@ +#!/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 "$@"