From b49e20d0109927d763211c1778b729eb4c4a9d53 Mon Sep 17 00:00:00 2001 From: tim Date: Tue, 30 Sep 2025 21:33:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=90=8D=E3=80=81=E5=8F=98=E9=87=8F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/deploy_staging.sh | 57 ++++++++++++++++++++++++++++++++++++++ docker/docker-compose.yaml | 35 ++++++++++++++--------- 2 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 deploy/deploy_staging.sh diff --git a/deploy/deploy_staging.sh b/deploy/deploy_staging.sh new file mode 100644 index 000000000..f2d623259 --- /dev/null +++ b/deploy/deploy_staging.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 可用法: +# ./deploy-staging.sh +# ./deploy-staging.sh feature/docker +deploy_branch="${1:-feature/docker}" + +repo_dir="/opt/openisle/OpenIsle-staging" +compose_file="${repo_dir}/docker/docker-compose.yaml" +# 使用仓库根目录的 .env(CI 预先写好),也可以改成绝对路径 +env_file="${repo_dir}/.env" +project="openisle_staging" + +echo "👉 Enter repo..." +cd "$repo_dir" + +echo "👉 Syncing code & switching to branch: $deploy_branch" +git fetch --all --prune +git checkout -B "$deploy_branch" "origin/$deploy_branch" +git reset --hard "origin/$deploy_branch" + +echo "👉 Ensuring env file: $env_file" +if [ ! -f "$env_file" ]; then + echo "❌ ${env_file} not found. Create it based on .env.example (with staging domains)." + exit 1 +fi + +export COMPOSE_PROJECT_NAME="$project" +# 供 compose 内各 service 的 env_file 使用 +export ENV_FILE="$env_file" + +echo "👉 Validate compose..." +docker compose -f "$compose_file" --env-file "$env_file" config >/dev/null + +echo "👉 Pull base images (for image-based services)..." +docker compose -f "$compose_file" --env-file "$env_file" pull --ignore-pull-failures + +echo "👉 Build images (staging)..." +# 前端 + OpenSearch 都是自建镜像;--pull 更新其基础镜像 +docker compose -f "$compose_file" --env-file "$env_file" \ + build --pull \ + --build-arg NUXT_ENV=staging \ + frontend_service opensearch + +echo "👉 Recreate & start all target services (no dev profile)..." +docker compose -f "$compose_file" --env-file "$env_file" \ + up -d --force-recreate --remove-orphans \ + mysql redis rabbitmq opensearch dashboards websocket-service springboot frontend_service + +echo "👉 Current status:" +docker compose -f "$compose_file" --env-file "$env_file" ps + +echo "👉 Pruning dangling images..." +docker image prune -f + +echo "✅ Staging stack deployed at $(date)" \ No newline at end of file diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 78318a754..ade5aeaaf 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -2,7 +2,7 @@ services: # MySQL service mysql: image: mysql:8.0 - container_name: openisle-mysql + container_name: ${COMPOSE_PROJECT_NAME}-openisle-mysql restart: always env_file: - ${ENV_FILE:-../.env} @@ -32,7 +32,7 @@ services: build: context: . dockerfile: opensearch.Dockerfile - container_name: opensearch + container_name: ${COMPOSE_PROJECT_NAME}-opensearch environment: - cluster.name=os-single - node.name=os-node-1 @@ -45,8 +45,8 @@ services: memlock: { soft: -1, hard: -1 } nofile: { soft: 65536, hard: 65536 } volumes: - - ./data:/usr/share/opensearch/data - - ./snapshots:/snapshots + - ${OPENSEARCH_DATA_DIR:-./data}:/usr/share/opensearch/data + - ${OPENSEARCH_SNAPSHOT_DIR:-./snapshots}:/snapshots ports: - "${OPENSEARCH_PORT:-9200}:9200" - "${OPENSEARCH_METRICS_PORT:-9600}:9600" @@ -64,7 +64,7 @@ services: dashboards: image: opensearchproject/opensearch-dashboards:3.0.0 - container_name: os-dashboards + container_name: ${COMPOSE_PROJECT_NAME}-os-dashboards environment: OPENSEARCH_HOSTS: '["http://opensearch:9200"]' DISABLE_SECURITY_DASHBOARDS_PLUGIN: "true" @@ -78,7 +78,7 @@ services: rabbitmq: image: rabbitmq:3.13-management - container_name: openisle-rabbitmq + container_name: ${COMPOSE_PROJECT_NAME}-openisle-rabbitmq restart: unless-stopped environment: RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST:-/}" @@ -101,7 +101,7 @@ services: redis: image: redis:7 - container_name: openisle-redis + container_name: ${COMPOSE_PROJECT_NAME}-openisle-redis restart: unless-stopped env_file: - ${ENV_FILE:-../.env} @@ -115,7 +115,7 @@ services: # Java spring boot service (开发便捷镜像,后续可换成打包镜像) springboot: image: maven:3.9-eclipse-temurin-17 - container_name: openisle-springboot + container_name: ${COMPOSE_PROJECT_NAME}-openisle-springboot working_dir: /app env_file: - ${ENV_FILE:-../.env} @@ -156,7 +156,7 @@ services: websocket-service: image: maven:3.9-eclipse-temurin-17 - container_name: openisle-websocket + container_name: ${COMPOSE_PROJECT_NAME}-openisle-websocket working_dir: /app env_file: - ${ENV_FILE:-../.env} @@ -187,7 +187,7 @@ services: frontend_dev: image: node:20 - container_name: openisle-frontend-dev + container_name: ${COMPOSE_PROJECT_NAME}-openisle-frontend-dev working_dir: /app env_file: - ${ENV_FILE:-../.env} @@ -213,7 +213,7 @@ services: dockerfile: docker/frontend-service.Dockerfile args: NUXT_ENV: ${NUXT_ENV:-staging} - container_name: openisle-frontend + container_name: ${COMPOSE_PROJECT_NAME}-openisle-frontend env_file: - ${ENV_FILE:-../.env} ports: @@ -227,7 +227,7 @@ services: loopback_8080: image: alpine/socat - container_name: loopback-8080 + container_name: ${COMPOSE_PROJECT_NAME}-loopback-8080 # 监听“frontend_dev 容器自身的” 127.0.0.1:8080 → 转发到 springboot:8080 command: - -d @@ -249,7 +249,7 @@ services: loopback_8082: image: alpine/socat - container_name: loopback-8082 + container_name: ${COMPOSE_PROJECT_NAME}-loopback-8082 # 监听 127.0.0.1:8082 → 转发到 websocket-service:8082(WS 纯 TCP 可直接过) command: - -d @@ -271,14 +271,23 @@ services: networks: openisle-network: + name: "${COMPOSE_PROJECT_NAME}_net" driver: bridge volumes: mysql-data: + name: "${COMPOSE_PROJECT_NAME}_mysql-data" maven-repo: + name: "${COMPOSE_PROJECT_NAME}_maven-repo" redis-data: + name: "${COMPOSE_PROJECT_NAME}_redis-data" rabbitmq-data: + name: "${COMPOSE_PROJECT_NAME}_rabbitmq-data" websocket-maven-repo: + name: "${COMPOSE_PROJECT_NAME}_websocket-maven-repo" frontend-node-modules: + name: "${COMPOSE_PROJECT_NAME}_frontend-node-modules" frontend-service-node-modules: + name: "${COMPOSE_PROJECT_NAME}_frontend-service-node-modules" frontend-static: + name: "${COMPOSE_PROJECT_NAME}_frontend-static"