diff --git a/deploy.sh b/deploy.sh index 6f6f659..a3d573a 100755 --- a/deploy.sh +++ b/deploy.sh @@ -10,6 +10,7 @@ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color +COMPOSE_FILES=(-f docker-compose.yml) # 打印信息 info() { @@ -24,6 +25,40 @@ 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 @@ -148,6 +183,7 @@ check_security_config() { deploy() { # 检查安全配置 check_security_config + configure_compose_files # 检查是否使用 Docker Hub 镜像 USE_DOCKER_HUB="${USE_DOCKER_HUB:-false}" @@ -182,20 +218,20 @@ deploy() { export GIT_TAG=${DOCKER_VERSION} export GITHUB_REPO_URL=https://github.com/WrBug/PolyHermes - docker-compose build + compose build fi info "启动服务..." - docker-compose up -d + compose up -d info "等待服务启动..." sleep 5 info "检查服务状态..." - docker-compose ps + compose ps - info "查看日志: docker-compose logs -f" - info "停止服务: docker-compose down" + info "查看日志: docker-compose ${COMPOSE_FILES[*]} logs -f" + info "停止服务: docker-compose ${COMPOSE_FILES[*]} down" } # 主函数 diff --git a/docker-compose.host-mysql.yml b/docker-compose.host-mysql.yml new file mode 100644 index 0000000..15f4c11 --- /dev/null +++ b/docker-compose.host-mysql.yml @@ -0,0 +1,50 @@ +version: '3.8' + +# 使用宿主机 MySQL 的部署配置。 +# 适用于 DB_URL 指向 host.docker.internal 的场景,不会启动内置 MySQL 容器。 +services: + app: + # 使用 Docker Hub 镜像(推荐生产环境) + # 取消注释下面一行,并注释掉 build 部分,即可使用 Docker Hub 的镜像 + # image: wrbug/polyhermes:latest + build: + context: . + dockerfile: Dockerfile + # 本地构建时可以传递版本号参数(自动使用当前分支名) + args: + VERSION: ${VERSION:-dev} + GIT_TAG: ${GIT_TAG:-${VERSION:-dev}} + GITHUB_REPO_URL: ${GITHUB_REPO_URL:-https://github.com/WrBug/PolyHermes} + container_name: polyhermes + ports: + - "${SERVER_PORT:-80}:80" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + - TZ=${TZ:-Asia/Shanghai} + - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-prod} + - DB_URL=${DB_URL:?DB_URL is required when using host MySQL} + - DB_USERNAME=${DB_USERNAME:-root} + - DB_PASSWORD=${DB_PASSWORD:-} + - SERVER_PORT=8000 + # ⚠️ 安全警告:以下两个环境变量不能使用默认值,否则容器启动会失败 + # 请在 .env 文件中设置,或通过环境变量传入 + # 生成随机密钥:openssl rand -hex 32 (ADMIN_RESET_PASSWORD_KEY) 或 openssl rand -hex 64 (JWT_SECRET) + - JWT_SECRET=${JWT_SECRET:-change-me-in-production} + - ADMIN_RESET_PASSWORD_KEY=${ADMIN_RESET_PASSWORD_KEY:-change-me-in-production} + # 日志级别配置(可选,默认值:root=WARN, app=INFO) + # 可选值:TRACE, DEBUG, INFO, WARN, ERROR, OFF + - LOG_LEVEL_ROOT=${LOG_LEVEL_ROOT:-WARN} + - LOG_LEVEL_APP=${LOG_LEVEL_APP:-INFO} + # 动态更新配置 + - ALLOW_PRERELEASE=${ALLOW_PRERELEASE:-false} + - GITHUB_REPO=${GITHUB_REPO:-WrBug/PolyHermes} + volumes: + - /etc/localtime:/etc/localtime:ro + restart: unless-stopped + networks: + - polyhermes-network + +networks: + polyhermes-network: + driver: bridge