#!/bin/bash # PolyHermes 一体化部署脚本 # 将前后端一起部署到一个 Docker 容器中 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color COMPOSE_FILES=(-f docker-compose.yml) # 打印信息 info() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" } # 从环境变量或 .env 文件读取配置值,避免 source .env 时被特殊字符影响 get_config_value() { local key="$1" local value="${!key}" if [ -n "$value" ]; then echo "$value" return fi if [ -f ".env" ]; then grep "^${key}=" .env 2>/dev/null | cut -d'=' -f2- | sed 's/^["'\'']//;s/["'\'']$//' | tr -d '\r' || true fi } # 根据数据库配置选择 compose 文件 configure_compose_files() { local db_url db_url=$(get_config_value "DB_URL") COMPOSE_FILES=(-f docker-compose.yml) if [[ "$db_url" == *"host.docker.internal"* ]]; then COMPOSE_FILES=(-f docker-compose.host-mysql.yml) info "检测到 DB_URL 指向宿主机 MySQL,将使用 docker-compose.host-mysql.yml" else info "使用默认 docker-compose.yml(包含内置 MySQL 服务)" fi } compose() { docker-compose "${COMPOSE_FILES[@]}" "$@" } # 检查 Docker 环境 check_docker() { if ! command -v docker &> /dev/null; then error "Docker 未安装,请先安装 Docker" exit 1 fi if ! command -v docker-compose &> /dev/null; then error "Docker Compose 未安装,请先安装 Docker Compose" exit 1 fi info "Docker 环境检查通过" } # 生成随机字符串 generate_random_string() { local length=${1:-32} openssl rand -hex $length 2>/dev/null || \ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $length | head -n 1 } # 创建 .env 文件(如果不存在) create_env_file() { if [ ! -f ".env" ]; then warn ".env 文件不存在,创建示例文件..." # 生成随机值 DB_PASSWORD=$(generate_random_string 32) JWT_SECRET=$(generate_random_string 64) ADMIN_RESET_KEY=$(generate_random_string 32) cat > .env </dev/null || echo "dev") DOCKER_VERSION=$(echo "$CURRENT_BRANCH" | tr '/' '-') fi export DOCKER_VERSION info "构建 Docker 镜像(本地构建,版本号: ${DOCKER_VERSION})..." # 创建占位符目录(如果不存在),避免 Dockerfile COPY 失败 # 当 BUILD_IN_DOCKER=true 时,backend/build 可能不存在 mkdir -p backend/build/libs # 设置构建参数(通过环境变量传递给 docker-compose.yml) export VERSION=${DOCKER_VERSION} export GIT_TAG=${DOCKER_VERSION} export GITHUB_REPO_URL=https://github.com/WrBug/PolyHermes compose build fi info "启动服务..." compose up -d info "等待服务启动..." sleep 5 info "检查服务状态..." compose ps info "查看日志: docker-compose ${COMPOSE_FILES[*]} logs -f" info "停止服务: docker-compose ${COMPOSE_FILES[*]} down" } # 主函数 main() { echo "==========================================" echo " PolyHermes 一体化部署脚本" echo "==========================================" echo "" # 解析参数 if [ "$1" = "--use-docker-hub" ] || [ "$1" = "-d" ]; then export USE_DOCKER_HUB=true info "将使用 Docker Hub 镜像(生产环境推荐)" echo "" fi check_docker create_env_file deploy echo "" info "部署完成!" info "访问地址: http://localhost:${SERVER_PORT:-80}" echo "" if [ "$USE_DOCKER_HUB" != "true" ]; then if [ -z "${DOCKER_VERSION}" ] && [ -f ".env" ]; then DOCKER_VERSION=$(grep "^DOCKER_VERSION=" .env 2>/dev/null | cut -d'=' -f2- | sed 's/^["'\'']//;s/["'\'']$//' | tr -d '\r') fi if [ -z "${DOCKER_VERSION}" ]; then CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "dev") DOCKER_VERSION=$(echo "$CURRENT_BRANCH" | tr '/' '-') fi info "提示:本地构建的版本号: ${DOCKER_VERSION}(可在 .env 或环境变量中设置 DOCKER_VERSION)" info "生产环境推荐使用 Docker Hub 镜像:" info " ./deploy.sh --use-docker-hub" info " 或修改 docker-compose.yml 使用 image: wrbug/polyhermes:latest" fi } main "$@"