java-deployment.md 4.5 KB

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:

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: 推送 + 服务器切分支

本地:

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

服务器:

cd /root/payments/code/payment-platform
git stash                        # 备份本地改动(如有)
git fetch origin
git checkout java
git pull origin java             # 拿到最新 java 分支

Step 3: 数据库迁移

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: 本地构建 → 传服务器

本地:

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@<server>:/root/payments/code/payment-platform/java/target/app.jar
scp Dockerfile.runtime root@<server>:/root/payments/code/payment-platform/java/Dockerfile.runtime

服务器(轻量 docker build,不跑 Maven):

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):

  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

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: 验证

# 健康检查
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 容器:

docker rm backend

镜像 xjz/backend:2.4.0-fix 保留,不影响回滚。


回滚

docker stop java-backend
docker rm java-backend
cd /root/payments/code/payment-platform
docker compose up -d backend    # 重新起 Python

NPM 路由没改过,端口也没变,直接起 Python 即可。

数据库迁移是纯加法,不影响 Python 版本。