API 服务端 Dockerfile

FROM maven:3.8.6-eclipse-temurin-8-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY model/pom.xml model/pom.xml
COPY blog/pom.xml blog/pom.xml

RUN mvn dependency:go-offline -B
COPY . .
RUN mvn clean package -DskipTests -P pro

FROM eclipse-temurin:8-jre-alpine
WORKDIR /app
COPY --from=builder /app/blog/target/*.jar app.jar
CMD ["java", "-Xms256m", "-Xmx512m", "-jar", "app.jar"]

管理端 Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/liuyi778/node-20-alpine AS builder
WORKDIR /thrive
COPY package*.json ./
RUN npm config set registry https://registry.npmmirror.com
RUN npm install
COPY . .

ARG VITE_PROJECT_API
ARG VITE_VERSION
ARG VITE_BAIDU_TONGJI_SITE_ID
ARG VITE_BAIDU_TONGJI_SITE_NAME 
ARG VITE_AI_APIPASSWORD
ARG VITE_AI_MODEL
ARG VITE_GAODE_WEB_API

ENV VITE_PROJECT_API=$VITE_PROJECT_API \
    VITE_VERSION=$VITE_VERSION \
    VITE_BAIDU_TONGJI_SITE_ID=$VITE_BAIDU_TONGJI_SITE_ID \
    VITE_BAIDU_TONGJI_SITE_NAME=$VITE_BAIDU_TONGJI_SITE_NAME \
    VITE_AI_APIPASSWORD=$VITE_AI_APIPASSWORD \
    VITE_AI_MODEL=$VITE_AI_MODEL \
    VITE_GAODE_WEB_API=$VITE_GAODE_WEB_API

RUN npm run build

FROM nginx:alpine
COPY --from=builder /thrive/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Web 端 Dockerfile

FROM node:20-alpine
WORKDIR /thrive
RUN npm config set registry https://registry.npmmirror.com
COPY package*.json .
RUN npm install
COPY . .

ARG NEXT_PUBLIC_PROJECT_API
ARG NEXT_PUBLIC_CACHING_TIME
ARG NEXT_PUBLIC_GAODE_KEY_CODE
ARG NEXT_PUBLIC_GAODE_SECURITYJS_CODE

ENV NEXT_PUBLIC_PROJECT_API=$NEXT_PUBLIC_PROJECT_API \
    NEXT_PUBLIC_CACHING_TIME=$NEXT_PUBLIC_CACHING_TIME \
    NEXT_PUBLIC_GAODE_KEY_CODE=$NEXT_PUBLIC_GAODE_KEY_CODE \
    NEXT_PUBLIC_GAODE_SECURITYJS_CODE=$NEXT_PUBLIC_GAODE_SECURITYJS_CODE

RUN npm run build
EXPOSE 9001
CMD ["npm", "start"]

Docker Compose 配置

version: '3.7'

services:
  mysql:
    image: mysql
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
      MYSQL_DATABASE: thrivex_blog
    volumes:
      - ./mysql:/var/lib/mysql
      - ./ThriveX-Server/ThriveX.sql:/docker-entrypoint-initdb.d/init.sql
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_bin
    ports:
      - "3309:3306"
    networks:
      - thrivex_network

  server:
    build:
      context: ./ThriveX-Server
      dockerfile: Dockerfile-maven
    environment:
      DB_DATABASE: thrivex_blog
      DB_HOST: db
      DB_USERNAME: root
      DB_PASSWORD: 123456
      DB_PORT: 3306
    volumes:
      - ./upload:/upload
    ports:
      - "9999:9999"
    healthcheck:
      test: ["CMD", "curl", "-f", "https://localhost:9999"]
      interval: 10s
      timeout: 5s
      retries: 3
    depends_on:
      - mysql

  client:
    build:
      context: ./ThriveX-Blog
      args:
        NEXT_PUBLIC_PROJECT_API: https://d.luoyuanxiang.top:9999/api
        NEXT_PUBLIC_CACHING_TIME: 0
    ports:
      - "9001:9001"
    depends_on:
      server:
        condition: service_healthy

  dashboard:
    build:
      context: ./ThriveX-Admin
      args:
        VITE_PROJECT_API: https://d.luoyuanxiang.top:9999/api
        VITE_VERSION: 2.4.5
    ports:
      - "9000:80"
    depends_on:
      server:
        condition: service_healthy

networks:
  thrivex_network:
    driver: bridge