From 0d9ae59e195e9944b91180957ddadddc0e4789b3 Mon Sep 17 00:00:00 2001 From: chenpei Date: Sun, 24 Aug 2025 11:21:48 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B3=20=E6=B7=BB=E5=8A=A0Git=E4=BB=93?= =?UTF-8?q?=E5=BA=93Docker=E6=9E=84=E5=BB=BA=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ 新增功能: - 新增 Dockerfile.git 支持从Git仓库构建 - 新增 docker-compose.git.yml 配置文件 - 新增 build-from-git.sh 一键部署脚本 - 更新 docker-entrypoint.sh 适配新构建方式 - 更新 README.md 添加Git构建说明 🔧 配置更新: - 支持从 https://git.1080p.hk/chenpei/jmalcloud 自动构建 - 优化构建流程和容器启动脚本 - 添加完整的Docker健康检查 📖 文档更新: - 添加Git仓库构建部署文档 - 提供一键部署解决方案 --- Dockerfile.git | 70 +++++++++++++++++++++++++++++++++ README.md | 16 ++++++++ build-from-git.sh | 72 ++++++++++++++++++++++++++++++++++ docker-compose.git.yml | 87 ++++++++++++++++++++++++++++++++++++++++++ docker-entrypoint.sh | 4 +- 5 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 Dockerfile.git create mode 100755 build-from-git.sh create mode 100644 docker-compose.git.yml diff --git a/Dockerfile.git b/Dockerfile.git new file mode 100644 index 0000000..10fdea3 --- /dev/null +++ b/Dockerfile.git @@ -0,0 +1,70 @@ +# 基于OpenJDK 21和FFmpeg的基础镜像 +FROM ghcr.io/jamebal/jdk21_ffmpeg:latest + +# Git 仓库配置(可以通过构建参数覆盖) +ARG GIT_REPO=https://git.1080p.hk/chenpei/jmalcloud.git +ARG GIT_USERNAME=chenpei +ARG GIT_PASSWORD=jsjj654321 + +# 环境变量设置 +ENV MONGODB_URI "mongodb://mongo:27017/jmalcloud" +ENV RUN_ENVIRONMENT prod +ENV JVM_OPTS "" +ENV LOG_LEVEL warn + +# 精确搜索相关配置 +ENV EXACT_SEARCH false +ENV NGRAM_MAX_CONTENT_LENGTH_MB "5" +ENV NGRAM_MIN_SIZE "2" +ENV NGRAM_MAX_SIZE "6" + +# 文件监控和路径配置 +ENV FILE_MONITOR true +ENV MONITOR_IGNORE_FILE_PREFIX ".DS_Store,._" +ENV FILE_ROOT_DIR /jmalcloud/files +ENV TESS4J_DATA_PATH /jmalcloud/tess4j/datapath + +# 多平台支持 +ARG TARGETPLATFORM +ENV PLATFORM=$TARGETPLATFORM +ENV DOCKER_DEFAULT_PLATFORM=linux/amd64,linux/arm64 + +# 安装必需软件 +RUN apt-get update && \ + apt-get install -y \ + git \ + gosu \ + maven \ + curl && \ + rm -rf /var/lib/apt/lists/* + +# 设置工作目录 +WORKDIR /build + +# 禁用SSL验证并克隆代码 +RUN git config --global http.sslverify false && \ + git clone https://${GIT_USERNAME}:${GIT_PASSWORD}@git.1080p.hk/chenpei/jmalcloud.git . && \ + rm -rf .git + +# 构建项目并移动JAR文件 +RUN mvn clean package -DskipTests && \ + find target -name "clouddisk-*.jar" -exec mv {} /usr/local/clouddisk.jar \; && \ + rm -rf /build + +# 复制启动脚本 +COPY docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +# 创建卷 +VOLUME /jmalcloud/ + +# 暴露端口 +EXPOSE 8088 +EXPOSE 8089 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \ + CMD curl -f http://localhost:8088/public/health > /dev/null || exit 1 + +# 启动脚本 +ENTRYPOINT ["/docker-entrypoint.sh"] diff --git a/README.md b/README.md index ff02508..6a69b2c 100644 --- a/README.md +++ b/README.md @@ -106,11 +106,27 @@ java -jar target/clouddisk-*.jar ``` ### Docker 部署 + +#### 🎯 方案1:从Git仓库构建部署(推荐) +```bash +# 一键构建和部署 +./build-from-git.sh + +# 或手动操作 +docker-compose -f docker-compose.git.yml up -d --build +``` + +#### 🎯 方案2:使用预构建镜像 ```bash # 使用提供的 docker-compose.yml docker-compose up -d ``` +### 🔗 Git仓库信息 +- **仓库地址**:https://git.1080p.hk/chenpei/jmalcloud +- **自动构建**:支持从Git仓库直接构建Docker镜像 +- **持续集成**:修改代码后重新构建即可更新 + ## 📝 变更日志 ### v2.15.0-public-space diff --git a/build-from-git.sh b/build-from-git.sh new file mode 100755 index 0000000..1349ea6 --- /dev/null +++ b/build-from-git.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# JmalCloud Git构建和部署脚本 +set -e + +echo "🚀 JmalCloud Git构建和部署脚本" +echo "==================================" + +# 检查Docker是否已安装 +if ! command -v docker &> /dev/null; then + echo "❌ 错误:Docker未安装,请先安装Docker" + exit 1 +fi + +if ! command -v docker-compose &> /dev/null; then + echo "❌ 错误:Docker Compose未安装,请先安装Docker Compose" + exit 1 +fi + +# 创建必要的目录 +echo "📁 创建数据目录..." +mkdir -p docker/jmalcloud/files +mkdir -p docker/jmalcloud/mongodb/data/db +mkdir -p docker/jmalcloud/mongodb/backup + +# 设置目录权限 +chmod -R 755 docker/jmalcloud/ + +# 停止现有容器(如果存在) +echo "🛑 停止现有容器..." +docker-compose -f docker-compose.git.yml down || echo "未发现正在运行的容器" + +# 清理旧镜像(可选) +read -p "🗑️ 是否清理旧的构建镜像?(y/N): " cleanup +if [[ $cleanup =~ ^[Yy]$ ]]; then + echo "清理旧镜像..." + docker image rm jmalcloud:git-latest || echo "未发现旧镜像" + docker system prune -f +fi + +# 构建并启动服务 +echo "🔨 开始构建和启动服务..." +docker-compose -f docker-compose.git.yml up -d --build + +# 等待服务启动 +echo "⏳ 等待服务启动..." +sleep 10 + +# 检查服务状态 +echo "🔍 检查服务状态..." +docker-compose -f docker-compose.git.yml ps + +# 显示日志 +echo "📋 显示服务日志(按 Ctrl+C 退出)..." +echo "==================================" +echo "✅ 服务已启动!" +echo "🌐 前端访问地址: http://localhost:7070" +echo "🔌 后端API地址: http://localhost:7072" +echo "📄 OnlyOffice: http://localhost:7071" +echo "" +echo "🔧 管理命令:" +echo " 查看日志: docker-compose -f docker-compose.git.yml logs -f" +echo " 停止服务: docker-compose -f docker-compose.git.yml down" +echo " 重启服务: docker-compose -f docker-compose.git.yml restart" +echo "" + +# 询问是否查看日志 +read -p "🔍 是否查看实时日志?(y/N): " viewlogs +if [[ $viewlogs =~ ^[Yy]$ ]]; then + docker-compose -f docker-compose.git.yml logs -f +fi + +echo "🎉 部署完成!" diff --git a/docker-compose.git.yml b/docker-compose.git.yml new file mode 100644 index 0000000..8834e2d --- /dev/null +++ b/docker-compose.git.yml @@ -0,0 +1,87 @@ +version: '3.8' + +services: + mongo: + container_name: jmalcloud_mongodb + image: mongo:7.0 + environment: + TZ: "Asia/Shanghai" + volumes: + - ./docker/jmalcloud/mongodb/data/db:/data/db + - ./docker/jmalcloud/mongodb/backup:/dump + restart: unless-stopped + healthcheck: + test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] + interval: 10s + timeout: 5s + retries: 3 + command: --wiredTigerCacheSizeGB 0.5 + + jmalcloud: + container_name: jmalcloud_server_git + build: + context: . + dockerfile: Dockerfile.git + args: + GIT_REPO: https://git.1080p.hk/chenpei/jmalcloud.git + GIT_USERNAME: chenpei + GIT_PASSWORD: jsjj654321 + TARGETPLATFORM: linux/amd64 + image: jmalcloud:git-latest + environment: + MONGODB_URI: "mongodb://mongo:27017/jmalcloud" + TZ: "Asia/Shanghai" + JVM_OPTS: "-Xms512m -Xmx4g" + RUN_ENVIRONMENT: "prod" + LOG_LEVEL: "warn" + EXACT_SEARCH: "false" + FILE_MONITOR: "true" + FILE_ROOT_DIR: "/jmalcloud/files" + TESS4J_DATA_PATH: "/jmalcloud/tess4j/datapath" + MONITOR_IGNORE_FILE_PREFIX: ".DS_Store,._" + NGRAM_MAX_CONTENT_LENGTH_MB: "5" + NGRAM_MIN_SIZE: "2" + NGRAM_MAX_SIZE: "6" + # 如果为空系统会自动生成 + ENCRYPTION_SECRET_KEY: "" + ENCRYPTION_SALT: "" + PUID: 0 + PGID: 0 + volumes: + - ./docker/jmalcloud/files:/jmalcloud/files/ + restart: unless-stopped + ports: + - "7072:8088" + - "7073:8089" + depends_on: + mongo: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8088/public/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + + nginx: + container_name: jmalcloud_nginx + image: jmal/jmalcloud-nginx:latest + ports: + - "7070:80" + - "7071:8089" + environment: + TZ: "Asia/Shanghai" + restart: unless-stopped + depends_on: + - jmalcloud + links: + - jmalcloud + - office + + office: # Optional + container_name: jmalcloud_office + image: onlyoffice/documentserver:9.0 + environment: + TZ: "Asia/Shanghai" + JWT_SECRET: "my_secret" + restart: unless-stopped diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 9dd3d59..c7aeea1 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -13,7 +13,7 @@ chown -R ${USER_UID}:${USER_GID} /jmalcloud/models chown -R ${USER_UID}:${USER_GID} /jmalcloud/tess4j chown ${USER_UID}:${USER_GID} /jmalcloud/ip2region.xdb chown -R ${USER_UID}:${USER_GID} /usr/local/mxcad -chown ${USER_UID}:${USER_GID} /usr/local/clouddisk-${VERSION}.jar +chown ${USER_UID}:${USER_GID} /usr/local/clouddisk.jar chown -R ${USER_UID}:${USER_GID} /usr/local/clouddisk-lib chown -R ${USER_UID}:${USER_GID} log @@ -21,7 +21,7 @@ exec gosu ${USER_UID}:${USER_GID} java ${JVM_OPTS} \ -Duser.timezone=${TZ} \ -Dfile.encoding=UTF-8 \ -Dloader.path=/usr/local/clouddisk-lib \ - -jar /usr/local/clouddisk-${VERSION}.jar \ + -jar /usr/local/clouddisk.jar \ --spring.profiles.active=${RUN_ENVIRONMENT} \ --spring.data.mongodb.uri=${MONGODB_URI} \ --tess4j.data-path=${TESS4J_DATA_PATH} \