diff --git a/20260701_front.yaml b/20260701_front.yaml index 20cbeb5..9dba200 100644 --- a/20260701_front.yaml +++ b/20260701_front.yaml @@ -296,10 +296,12 @@ steps: > .deploy_list docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B + + echo ">>>>>> 并行构建服务: $build_list <<<<<<" + docker compose -p "$PROJECT_NAME" build $build_list + for svc in $build_list; do if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then - echo ">>>>>> 构建服务: $svc <<<<<<" - docker compose -p "$PROJECT_NAME" build "$svc" harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}" docker tag "$svc:latest" "$harbor_tag" echo ">>>>>> 推送服务: $svc <<<<<<" @@ -392,9 +394,14 @@ steps: fi for svc in $deploy_list; do - echo ">>>>>> 远程更新服务: $svc <<<<<<" cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production - docker compose -f docker-compose-release.yml pull "$svc" + done + + echo ">>>>>> 远程并行拉取镜像: $deploy_list <<<<<<" + docker compose -f docker-compose-release.yml pull $deploy_list + + for svc in $deploy_list; do + echo ">>>>>> 远程更新服务: $svc <<<<<<" docker compose -f docker-compose-release.yml up -d --force-recreate "$svc" echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<" done @@ -438,6 +445,7 @@ clone: steps: - name: build-and-push-apps image: docker:cli + pull: if-not-exists volumes: - name: docker_sock path: /var/run/docker.sock @@ -449,6 +457,9 @@ steps: DRONE_COMMIT: ${DRONE_COMMIT} DRONE_COMMIT_BEFORE: ${DRONE_COMMIT_BEFORE} DRONE_COMMIT_AFTER: ${DRONE_COMMIT_AFTER} + DRONE_BUILD_EVENT: ${DRONE_BUILD_EVENT} # 引入事件类型判断 + PROJECT_NAME: + from_secret: PROJECT_NAME commands: - | if [ "${DRONE_COMMIT_BEFORE}" = "0000000000000000000000000000000000000000" ]; then @@ -494,10 +505,12 @@ steps: > .deploy_list docker login 127.0.0.1:5000 -u bluetti -p cjJXBbkHlvVWH2B + + echo ">>>>>> 并行构建服务: $build_list <<<<<<" + docker compose -p "$PROJECT_NAME" build $build_list + for svc in $build_list; do if docker compose -p "$PROJECT_NAME" config --services | grep -q "^$svc$"; then - echo ">>>>>> 构建服务: $svc <<<<<<" - docker compose -p "$PROJECT_NAME" build "$svc" harbor_tag="127.0.0.1:5000/bluetti-frontend/$svc:${DRONE_COMMIT:0:10}" docker tag "$svc:latest" "$harbor_tag" echo ">>>>>> 推送服务: $svc <<<<<<" @@ -578,9 +591,14 @@ steps: fi for svc in $deploy_list; do - echo ">>>>>> 远程更新服务: $svc <<<<<<" cp /bluetti/frontend_project/bluetti-shop-configs/"$svc"-production.env apps/$svc/.env.production - docker compose -f docker-compose-prod.yml pull "$svc" + done + + echo ">>>>>> 远程并行拉取镜像: $deploy_list <<<<<<" + docker compose -f docker-compose-prod.yml pull $deploy_list + + for svc in $deploy_list; do + echo ">>>>>> 远程更新服务: $svc <<<<<<" docker compose -f docker-compose-prod.yml up -d --force-recreate "$svc" echo ">>>>>> 部署完成: $svc 版本号: $COMMIT_SHA, 环境: $BUILD_ENV <<<<<<" done diff --git a/bluetti-tools/Dockerfile b/bluetti-tools/Dockerfile new file mode 100644 index 0000000..0e2cb14 --- /dev/null +++ b/bluetti-tools/Dockerfile @@ -0,0 +1,69 @@ +# Monorepo: pnpm + Turbo,仅构建 apps/web +FROM node:20-bookworm-slim AS builder + +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update \ + && apt-get install -y --no-install-recommends openssl ca-certificates + +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@9.15.9 --activate +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ +COPY apps/web/package.json ./apps/web/ +COPY packages/ui/package.json ./packages/ui/ +COPY packages/shopify-admin/package.json ./packages/shopify-admin/ + +RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \ + pnpm config set store-dir /pnpm/store \ + && pnpm install --frozen-lockfile + +COPY apps/web ./apps/web +COPY packages ./packages + +ENV TURBO_TELEMETRY_DISABLED=1 +RUN --mount=type=cache,id=turbo-cache,target=/app/node_modules/.cache/turbo \ + pnpm turbo build --filter=web + +# 产出仅含 web 生产依赖的独立部署目录(比 runner 内 monorepo install 更小) +RUN pnpm --filter=web deploy --prod /app/deploy + +# prisma CLI 为 devDep:用 web 包内已安装的 prisma 在 deploy 目录 generate +RUN --mount=type=cache,id=prisma-cache,target=/root/.cache/prisma \ + pnpm --filter=web exec prisma generate --schema=/app/deploy/prisma/schema.prisma + +# 运行时不需要源码与构建配置 +RUN rm -rf /app/deploy/app /app/deploy/.turbo /app/deploy/.react-router /app/deploy/components /app/deploy/hooks /app/deploy/lib \ + /app/deploy/vite.config.ts /app/deploy/tsconfig.json /app/deploy/components.json /app/deploy/react-router.config.ts \ + /app/deploy/Dockerfile /app/deploy/.dockerignore + +# 运行镜像:deploy 产物 + 全局 prisma CLI(migrate deploy) +FROM node:20-bookworm-slim AS runner + +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update \ + && apt-get install -y --no-install-recommends openssl ca-certificates + +RUN --mount=type=cache,id=npm-cache,target=/root/.npm \ + npm install -g prisma@6.19.0 + +WORKDIR /app +ENV NODE_ENV=production +ENV HOST=0.0.0.0 +ENV PORT=3000 + +COPY --from=builder /app/deploy ./ + +COPY docker/docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +EXPOSE 3000 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \ + CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 3000)).then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))" + +ENTRYPOINT ["/docker-entrypoint.sh"] \ No newline at end of file diff --git a/bluetti-tools/docker-compose.yml b/bluetti-tools/docker-compose.yml new file mode 100644 index 0000000..66a9730 --- /dev/null +++ b/bluetti-tools/docker-compose.yml @@ -0,0 +1,32 @@ +# 博客图片资源 Web(React Router + Prisma SQLite) +# +# 使用: +# 1. 复制 apps/web/.env.example 为 apps/web/.env,填写 SHOPIFY_*、SESSION_SECRET 等 +# 2. docker compose up -d --build +# 3. 浏览器访问 http://localhost:30001 ,无用户时打开 /setup +# 说明:compose 会注入 DATABASE_URL=file:/data/prod.db(覆盖 .env 里本地 SQLite 路径) +# +# 数据库文件持久化在卷 prisma-data 中;更换主机或备份请挂载/拷贝该卷。 + +services: + web: + image: bluetti-tools-web:latest + ports: + - "30001:3000" + env_file: + - apps/web/.env + environment: + # 覆盖 .env 中的本地路径,使用容器内持久化卷 + DATABASE_URL: file:/data/prod.db + HOST: 0.0.0.0 + PORT: "3000" + # 生产必须设置(与 apps/web/.env 中一致);未设置会导致登录时报错 + # SESSION_SECRET: 请用 openssl rand -hex 32 生成后写入 apps/web/.env 或此处 + # 公网访问时请改为实际 HTTPS 地址(OAuth 回调、邮件链接) + # SHOPIFY_APP_URL: https://your-domain.com + volumes: + - /bluetti/frontend_project/bluetti-tools-configs/data:/data + restart: unless-stopped + +# volumes: + # prisma-data: \ No newline at end of file diff --git a/bluetti-tools/drone.yaml b/bluetti-tools/drone.yaml new file mode 100644 index 0000000..21243c2 --- /dev/null +++ b/bluetti-tools/drone.yaml @@ -0,0 +1,35 @@ +kind: pipeline +type: docker +name: deploy-bluetti-web + +steps: + # 步骤 1: 挂载宿主机 Docker 和配置目录,直接构建并启动 + - name: build-and-deploy + image: docker:24.0.7 # 或者使用 docker:dind + volumes: + - name: docker_sock + path: /var/run/docker.sock # 联动宿主机 Docker + - name: configs_dir + path: /bluetti/frontend_project/bluetti-tools-configs # 映射宿主机配置目录 + commands: + - | + export DOCKER_BUILDKIT=1 + cp /bluetti/frontend_project/bluetti-tools-configs/tools.production.env apps/web/.env + docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t bluetti-tools-web:latest -f Dockerfile . + docker compose down --remove-orphans + docker compose up -d + echo ">>>>>> 部署成功! <<<<<<" + +volumes: + - name: docker_sock + host: + path: /var/run/docker.sock + - name: configs_dir + host: + path: /bluetti/frontend_project/bluetti-tools-configs # 宿主机存放所有 .env 的绝对路径 + +trigger: + branch: + - main + event: + - push \ No newline at end of file