在VPS上部署Java应用程序:CI/CD高级水平

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在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密钥。

博客

书籍推荐