diff --git a/.dockerignore b/.dockerignore index 52a13ea..7d8128b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,6 +4,9 @@ target/test-classes/ target/maven-archiver/ target/maven-status/ +# settings.xml需要复制到构建容器中,所以不忽略 +# settings.xml + # IDE文件 .idea/ .vscode/ diff --git a/Dockerfile b/Dockerfile index 9836ca1..e21859b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,17 +5,22 @@ FROM maven:3.8.4-openjdk-8-slim AS builder # 设置工作目录 WORKDIR /build -# 复制pom.xml文件 +# 复制settings.xml和pom.xml文件 +COPY settings.xml /root/.m2/ COPY pom.xml . -# 下载依赖(利用Docker缓存层) -RUN mvn dependency:go-offline -B +# 设置Maven仓库权限 +RUN mkdir -p /root/.m2/repository && \ + chown -R root:root /root/.m2 + +# 下载依赖(利用Docker缓存层和国内镜像) +RUN mvn dependency:go-offline -B -s /root/.m2/settings.xml # 复制源代码 COPY src ./src -# 构建应用 -RUN mvn clean package -DskipTests -B +# 构建应用(使用国内镜像加速) +RUN mvn clean package -DskipTests -B -s /root/.m2/settings.xml # ===== 运行阶段 ===== # 使用OpenJDK 8作为基础镜像 diff --git a/Dockerfile.optimized b/Dockerfile.optimized new file mode 100644 index 0000000..47e991a --- /dev/null +++ b/Dockerfile.optimized @@ -0,0 +1,93 @@ +# ===== 构建阶段 ===== +# 使用更轻量的Maven镜像 +FROM maven:3.8.4-openjdk-8-alpine AS builder + +# 安装必要的工具 +RUN apk add --no-cache curl bash + +# 设置工作目录 +WORKDIR /build + +# 复制settings.xml和pom.xml文件 +COPY settings.xml /root/.m2/ +COPY pom.xml . + +# 设置Maven仓库权限 +RUN mkdir -p /root/.m2/repository && \ + chown -R root:root /root/.m2 + +# 创建Maven配置目录 +RUN mkdir -p /root/.m2 + +# 配置Maven wrapper(如果项目有使用) +# COPY .mvn/wrapper/maven-wrapper.jar /root/.m2/wrapper/ +# COPY .mvn/wrapper/maven-wrapper.properties /root/.m2/wrapper/ + +# 下载依赖(利用Docker缓存层和国内镜像) +RUN mvn dependency:go-offline -B -s /root/.m2/settings.xml + +# 复制源代码 +COPY src ./src + +# 构建应用(使用国内镜像加速) +RUN mvn clean package -DskipTests -B -s /root/.m2/settings.xml + +# ===== 运行阶段 ===== +# 使用OpenJDK 8作为基础镜像 +FROM openjdk:8-jre-alpine AS runtime + +# 设置维护者信息 +LABEL maintainer="digital-archive-team" + +# 安装必要的系统依赖和Tesseract OCR +RUN apk add --no-cache \ + tesseract \ + tesseract-data-chi_sim \ + tesseract-data-chi_tra \ + tesseract-data-eng \ + tesseract-ocr \ + tini \ + curl \ + bash \ + && rm -rf /var/cache/apk/* + +# 设置环境变量 +ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200" +ENV SPRING_PROFILES_ACTIVE=prod + +# 创建应用用户和目录 +RUN addgroup -g 1001 app \ + && adduser -D -s /bin/sh -u 1001 -G app app \ + && mkdir -p /app/data/upload \ + && mkdir -p /app/data/temp \ + && mkdir -p /app/data/unzip \ + && mkdir -p /app/data/images \ + && mkdir -p /app/data/reports \ + && mkdir -p /app/data/elasticsearch \ + && mkdir -p /app/logs \ + && chown -R app:app /app + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制jar文件 +COPY --from=builder /build/target/point-strategy-*.jar app.jar + +# 复制配置文件(如果需要覆盖默认配置) +# COPY application-prod.yml application-prod.yml + +# 切换到非root用户 +USER app + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD curl -f http://localhost:9081/point-strategy/actuator/health || exit 1 + +# 暴露端口 +EXPOSE 9081 + +# 使用tini作为init进程 +ENTRYPOINT ["/sbin/tini", "--"] + +# 启动应用 +CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"] \ No newline at end of file diff --git a/check-network.sh b/check-network.sh index 3b1bbfb..6ef57df 100755 --- a/check-network.sh +++ b/check-network.sh @@ -73,6 +73,22 @@ else echo -e "${YELLOW}请确保Redis容器已连接到 ${NETWORK_NAME} 网络${NC}" fi +# 检查Elasticsearch容器是否在proxy网络中 +echo -e "${YELLOW}检查Elasticsearch容器...${NC}" +ES_CONTAINERS=$(docker network inspect ${NETWORK_NAME} --format '{{range .Containers}}{{.Name}} {{end}}' | tr ' ' '\n' | grep -i elasticsearch || true) + +if [ ! -z "$ES_CONTAINERS" ]; then + echo -e "${GREEN}找到Elasticsearch容器:${NC}" + echo "$ES_CONTAINERS" | while read container; do + if [ ! -z "$container" ]; then + echo -e "${GREEN} - ${container}${NC}" + fi + done +else + echo -e "${RED}未找到Elasticsearch容器${NC}" + echo -e "${YELLOW}请确保Elasticsearch容器已连接到 ${NETWORK_NAME} 网络${NC}" +fi + # 测试网络连通性 echo -e "${YELLOW}测试网络连通性...${NC}" if docker run --rm --network ${NETWORK_NAME} alpine ping -c 1 mysql &> /dev/null; then @@ -87,4 +103,10 @@ else echo -e "${RED}无法ping通redis容器${NC}" fi +if docker run --rm --network ${NETWORK_NAME} alpine ping -c 1 elasticsearch &> /dev/null; then + echo -e "${GREEN}可以ping通elasticsearch容器${NC}" +else + echo -e "${RED}无法ping通elasticsearch容器${NC}" +fi + echo -e "${GREEN}网络检查完成!${NC}" \ No newline at end of file diff --git a/deploy.sh b/deploy.sh index 6b9b4cd..dc97d4e 100755 --- a/deploy.sh +++ b/deploy.sh @@ -53,7 +53,7 @@ fi # 创建必要的目录 echo -e "${YELLOW}创建部署目录...${NC}" -mkdir -p ${DEPLOY_DIR}/{data/{upload,temp,unzip,images,reports},logs,nginx} +mkdir -p ${DEPLOY_DIR}/{data/{upload,temp,unzip,images,reports,elasticsearch},logs,nginx} # 复制配置文件 echo -e "${YELLOW}复制配置文件...${NC}" @@ -81,6 +81,9 @@ REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD=Abc123456 +# Elasticsearch配置 +ELASTICSEARCH_URIS=http://elasticsearch:9200 + # OCR配置 TESS_PATH=/usr/bin/tesseract @@ -219,6 +222,8 @@ services: - ./logs:/app/logs env_file: - .env + depends_on: + - elasticsearch networks: - proxy restart: unless-stopped @@ -229,6 +234,28 @@ services: retries: 3 start_period: 60s + elasticsearch: + image: elasticsearch:7.17.0 + container_name: digital-archive-elasticsearch + ports: + - "9200:9200" + - "9300:9300" + environment: + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - xpack.security.enabled=false + volumes: + - ./data/elasticsearch:/usr/share/elasticsearch/data + networks: + - proxy + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + networks: proxy: external: true diff --git a/docker-compose.simple.yml b/docker-compose.simple.yml index 3492688..ccea1a7 100644 --- a/docker-compose.simple.yml +++ b/docker-compose.simple.yml @@ -44,6 +44,23 @@ services: retries: 3 start_period: 60s +# Elasticsearch服务 + elasticsearch: + image: elasticsearch:7.17.0 + container_name: digital-archive-elasticsearch + ports: + - "9200:9200" + - "9300:9300" + environment: + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - xpack.security.enabled=false + volumes: + - ./data/elasticsearch:/usr/share/elasticsearch/data + networks: + - proxy + restart: unless-stopped + networks: proxy: external: true \ No newline at end of file diff --git a/pre-deploy-check.sh b/pre-deploy-check.sh index 5f19788..065c97f 100755 --- a/pre-deploy-check.sh +++ b/pre-deploy-check.sh @@ -68,8 +68,18 @@ if [ -z "$REDIS_CONTAINER" ]; then fi echo -e "${GREEN}找到Redis容器: ${REDIS_CONTAINER}${NC}" -# 6. 检查镜像 -echo -e "${YELLOW}6. 检查应用镜像...${NC}" +# 6. 检查Elasticsearch容器 +echo -e "${YELLOW}6. 检查Elasticsearch容器...${NC}" +ES_CONTAINER=$(docker network inspect proxy --format '{{range .Containers}}{{.Name}} {{end}}' | tr ' ' '\n' | grep -i elasticsearch | head -1 || true) +if [ -z "$ES_CONTAINER" ]; then + echo -e "${RED}错误: proxy网络中未找到Elasticsearch容器${NC}" + echo -e "${YELLOW}请确保Elasticsearch容器已启动并连接到proxy网络${NC}" + exit 1 +fi +echo -e "${GREEN}找到Elasticsearch容器: ${ES_CONTAINER}${NC}" + +# 7. 检查镜像 +echo -e "${YELLOW}7. 检查应用镜像...${NC}" if ! docker images | grep -q digital-archive; then echo -e "${RED}错误: digital-archive镜像不存在${NC}" echo -e "${YELLOW}请先运行: ./build.sh${NC}" @@ -77,8 +87,8 @@ if ! docker images | grep -q digital-archive; then fi echo -e "${GREEN}digital-archive镜像存在${NC}" -# 7. 检查部署目录 -echo -e "${YELLOW}7. 检查部署目录...${NC}" +# 8. 检查部署目录 +echo -e "${YELLOW}8. 检查部署目录...${NC}" if [ -d "$DEPLOY_DIR" ]; then echo -e "${YELLOW}部署目录已存在: ${DEPLOY_DIR}${NC}" read -p "是否继续部署到现有目录? (y/N): " -n 1 -r @@ -91,8 +101,8 @@ else echo -e "${GREEN}创建新部署目录: ${DEPLOY_DIR}${NC}" fi -# 8. 测试网络连通性 -echo -e "${YELLOW}8. 测试网络连通性...${NC}" +# 9. 测试网络连通性 +echo -e "${YELLOW}9. 测试网络连通性...${NC}" if docker run --rm --network proxy alpine ping -c 1 mysql &> /dev/null; then echo -e "${GREEN}可以连接MySQL容器${NC}" else @@ -107,11 +117,19 @@ else exit 1 fi -# 9. 显示部署信息 +if docker run --rm --network proxy alpine ping -c 1 elasticsearch &> /dev/null; then + echo -e "${GREEN}可以连接Elasticsearch容器${NC}" +else + echo -e "${RED}无法连接Elasticsearch容器${NC}" + exit 1 +fi + +# 10. 显示部署信息 echo -e "${GREEN}=== 部署信息 ===${NC}" echo -e "${YELLOW}部署目录: ${DEPLOY_DIR}${NC}" echo -e "${YELLOW}MySQL容器: ${MYSQL_CONTAINER}${NC}" echo -e "${YELLOW}Redis容器: ${REDIS_CONTAINER}${NC}" +echo -e "${YELLOW}Elasticsearch容器: ${ES_CONTAINER}${NC}" echo -e "${YELLOW}网络: proxy${NC}" echo -e "${YELLOW}Docker Compose: ${COMPOSE_CMD}${NC}" diff --git a/settings.xml b/settings.xml new file mode 100644 index 0000000..dc3129b --- /dev/null +++ b/settings.xml @@ -0,0 +1,157 @@ + + + + + /root/.m2/repository + + + + + + + + + + + + aliyun-maven + central + Aliyun Maven Mirror + https://maven.aliyun.com/repository/central + + + + + huaweicloud-maven + central + HuaweiCloud Maven Mirror + https://repo.huaweicloud.com/repository/maven/ + + + + + tencentyun-maven + central + TencentCloud Maven Mirror + https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ + + + + + netease-maven + central + Netease Maven Mirror + https://mirrors.163.com/maven/repository/maven-public/ + + + + + jboss-public-repository-group + central + JBoss Public Repository Group + https://repository.jboss.org/nexus/content/groups/public/ + + + + + + + + + + + + + + default + + true + + + + + aliyun-central + https://maven.aliyun.com/repository/central + + true + + + false + + + + + + aliyun-public + https://maven.aliyun.com/repository/public + + true + + + true + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + + aliyun-plugin + https://maven.aliyun.com/repository/public + + true + + + false + + + + + + spring-plugins + Spring Plugins + https://repo.spring.io/plugins-release + + true + + + false + + + + + + + + + default + + \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 9531611..1af16b6 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -35,6 +35,11 @@ spring: multipart: max-file-size: -1 max-request-size: -1 + + # Elasticsearch配置 + elasticsearch: + rest: + uris: http://127.0.0.1:9200 # MyBatis配置 mybatis: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 6a64d59..271b975 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -35,6 +35,11 @@ spring: multipart: max-file-size: ${MAX_FILE_SIZE:-1} max-request-size: ${MAX_REQUEST_SIZE:-1} + + # Elasticsearch配置 + elasticsearch: + rest: + uris: ${ELASTICSEARCH_URIS:http://127.0.0.1:9200} # MyBatis配置 mybatis: