Files
PR-Helper/deploy.sh
T
wonder 95519963c3 fix: update deploy.sh to generate .env with MySQL configuration
- Generate .env with random MySQL password on first deploy
- Update PORT in .env instead of modifying docker-compose.yml directly
- Wait for MySQL container healthcheck before checking app status
- Skip .env generation if file already exists
2026-06-20 22:52:27 +08:00

192 lines
5.4 KiB
Bash
Executable File

#!/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 <<EOF
# Server
PORT=${port}
GIN_MODE=release
SESSION_SECRET=
# Data directory
DATA_DIR=data
# MySQL
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=${mysql_password}
MYSQL_DATABASE=pr_helper
EOF
info ".env 文件已生成"
info "MySQL 密码: ${mysql_password}"
warn "请妥善保管 .env 文件中的数据库密码!"
}
# ----------------------------------------------------------
# 5. 构建并启动服务
# ----------------------------------------------------------
build_and_start() {
local port="${1:-9050}"
info "构建 Docker 镜像(首次可能需要几分钟)..."
docker compose build
info "启动服务..."
docker compose up -d
info "等待 MySQL 就绪..."
local retries=30
while [ $retries -gt 0 ]; do
if docker compose exec -T mysql mysqladmin ping -h localhost --silent 2>/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 "$@"