在VPS上部署Java应用程序:CI/CD、Docker和SSL高级水平
在本文中,我们将探讨在VPS(虚拟专用服务器)上部署Java应用程序的高级过程。我们不会停留在诸如安装JDK或启动JAR文件等基本步骤上。相反,我们将重点放在配置CI/CD流水线、使用Docker进行容器化、使用Nginx作为反向代理、自动获取SSL证书,以及应用程序的监控和容错上。
假设您已经拥有一个运行Ubuntu 22.04 LTS的VPS、一个基本域名,并且熟悉Linux命令行。所有代码示例均使用Java 17+和Spring Boot编写,但这些原则适用于任何Java框架。
1. 使用Docker对Java应用程序进行容器化
高级部署的第一步是将应用程序打包到Docker容器中。这确保了环境可重现性并简化了部署。
在项目根目录创建Dockerfile:
# 使用多阶段构建以减小最终镜像大小FROM maven:3.9.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn clean package -DskipTests
FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]用于与数据库一起运行的docker-compose.yml文件:
version: '3.8'services: app: build: . ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb - SPRING_DATASOURCE_USERNAME=user - SPRING_DATASOURCE_PASSWORD=pass depends_on: - db restart: unless-stopped
db: image: postgres:15-alpine environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: pass volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped
volumes: pgdata:使用命令docker compose build构建镜像后,您将获得一个准备部署的容器。
2. 配置CI/CD流水线(GitHub Actions)
自动化部署是高级水平的关键要素。我们使用GitHub Actions来构建、测试并将镜像发送到服务器。
创建文件.github/workflows/deploy.yml:
name: Deploy Java App to VPS
on: push: branches: [ main ]
jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'
- name: Build with Maven run: mvn clean package
- name: Build Docker image run: docker build -t myapp:latest .
- name: Save Docker image to tar run: docker save myapp:latest | gzip > myapp.tar.gz
- name: Copy image to VPS via SCP uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} source: "myapp.tar.gz" target: "/opt/app/"
- name: Deploy on VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | cd /opt/app docker load < myapp.tar.gz docker compose down docker compose up -d rm myapp.tar.gz不要忘记在设置中添加VPS_HOST、VPS_USER、VPS_SSH_KEY密钥。