# Plan: Java 版本上线 — 精确步骤 ## 服务器拓扑 ``` qcsj88888.com / api.qcsj88888.com (HTTPS, Let's Encrypt) ↓ NPM (nginx-proxy-manager, deploy_app-tier) ├── /api/v1/* → 172.20.205.37:8001 (Python, unhealthy) ← 改成 8081 └── 其余 → 172.20.205.37:5173 (frontend, xjz/frontend:2.5.4) 容器: - backend: xjz/backend:2.4.0-fix, port 8001, unhealthy - frontend: xjz/frontend:2.5.4, port 5173→80 - postgres: postgres:18.3, 127.0.0.1:5432 - redis: redis:8.6.2-alpine, deploy_app-tier 网络 - NPM: deploy_app-tier 网络 网络:payment-platform_app-tier (backend+frontend) + deploy_app-tier (NPM+redis+postgres) 宿主机IP:172.20.205.37 Compose文件:/root/payments/code/payment-platform/docker-compose.yml ``` --- ## Step 1: 创建 application-prod.yml(本地) 新建 `java/src/main/resources/application-prod.yml`,覆盖 dev 的 DB/Redis: ```yaml spring: datasource: druid: url: jdbc:postgresql://172.20.205.37:5432/payment_platform_prod?currentSchema=public username: admin password: 'xjz#123321' data: redis: host: redis port: 6379 database: 0 password: '123456#xjz' logging: level: com.payment.platform: info org.springframework.security: info ``` 注意:Redis host 是 `redis`(容器名),不是宿主机 IP — Java 容器要加入 `deploy_app-tier` 网络才能解析 `redis`。 --- ## Step 2: 推送 + 服务器切分支 本地: ```bash cd D:\project2\payment-platform git add java/src/main/resources/application-prod.yml git commit -m "chore: add application-prod.yml for production deployment" git push origin java ``` 服务器: ```bash cd /root/payments/code/payment-platform git stash # 备份本地改动(如有) git fetch origin git checkout java git pull origin java # 拿到最新 java 分支 ``` --- ## Step 3: 数据库迁移 ```bash cd /root/payments/code/payment-platform/java/sql # 逐个执行增量迁移 for f in 002 003 004 005 006; do docker exec -i postgres psql -U admin -d payment_platform_prod < ${f}_*.sql done ``` --- ## Step 4: 本地构建 → 传服务器 **本地:** ```bash cd D:\project2\payment-platform\java mvn package -DskipTests # 重命名为 app.jar(Dockerfile.runtime 期望此名) cp target/*.jar target/app.jar # 传 JAR + runtime Dockerfile 到服务器 scp target/app.jar root@:/root/payments/code/payment-platform/java/target/app.jar scp Dockerfile.runtime root@:/root/payments/code/payment-platform/java/Dockerfile.runtime ``` **服务器(轻量 docker build,不跑 Maven):** ```bash cd /root/payments/code/payment-platform/java docker build -f Dockerfile -t xjz/java-backend:1.0.0 . ``` --- ## Step 5: 更新 docker-compose.yml 在 `/root/payments/code/payment-platform/docker-compose.yml` 中添加 java-backend 服务(**端口用 8001,平替 Python**): ```yaml java-backend: container_name: java-backend image: xjz/java-backend:1.0.0 restart: always environment: TZ: "Asia/Shanghai" SPRING_PROFILES_ACTIVE: prod JAVA_OPTS: "-Xms256m -Xmx512m" ports: - "8001:8081" # 宿主机 8001 → 容器 8081 networks: - app-tier - deploy_app-tier healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/api/v1/payment/notify/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s ``` --- ## Step 6: 停 Python → 起 Java ```bash cd /root/payments/code/payment-platform # 停掉 Python backend docker stop backend # 起 Java docker compose up -d java-backend # 检查健康状态 docker compose logs java-backend --tail 30 ``` **NPM 路由不用改** — 目标端口 8001 没变。 --- ## Step 7: 验证 ```bash # 健康检查 curl https://qcsj88888.com/api/v1/payment/notify/health # 确认 Java 日志正常 docker logs java-backend --tail 20 ``` 登录 `https://qcsj88888.com`,走一遍核心流程:首页统计、转账记录、消费记录。 --- ## Step 8: 观察 & 清理 Step 6 已经停了 Python,确认 Java 稳定后删掉 Python 容器: ```bash docker rm backend ``` 镜像 `xjz/backend:2.4.0-fix` 保留,不影响回滚。 --- ## 回滚 ```bash docker stop java-backend docker rm java-backend cd /root/payments/code/payment-platform docker compose up -d backend # 重新起 Python ``` NPM 路由没改过,端口也没变,直接起 Python 即可。 数据库迁移是纯加法,不影响 Python 版本。