#!/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. 生成 .env 配置文件 # ---------------------------------------------------------- setup_env() { local port="${1:-9050}" if [ -f ".env" ]; then warn ".env 文件已存在,跳过生成" # 确保端口是最新的 if grep -q "^PORT=" .env; then sed -i "s/^PORT=.*/PORT=${port}/" .env else echo "PORT=${port}" >> .env fi return fi info "生成 .env 配置文件..." # 生成随机 MySQL 密码 local mysql_password mysql_password=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 20) cat > .env </dev/null; then info "MySQL 就绪" break fi retries=$((retries - 1)) sleep 2 done if [ $retries -eq 0 ]; then warn "MySQL 启动超时,继续等待应用自行重连..." sleep 10 fi 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}" info "本地访问: http://localhost:${port}" info "" info "数据库配置: .env" 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}" info "开始部署 PR-Helper..." info "目标端口: ${port}" check_docker setup_docker_mirror setup_go_proxy setup_env "$port" build_and_start "$port" } main "$@"