name: Build and Deploy on: push: branches: - main workflow_dispatch: env: REGISTRY: ghcr.io IMAGE_PREFIX: ghcr.io/${{ github.repository }} jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write strategy: fail-fast: false matrix: service: - name: web dockerfile: apps/web/Dockerfile - name: api dockerfile: apps/api/Dockerfile - name: ml dockerfile: apps/ml-service/Dockerfile steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.IMAGE_PREFIX }}/${{ matrix.service.name }} tags: | type=ref,event=branch type=sha - name: Build and push image uses: docker/build-push-action@v5 with: context: . file: ${{ matrix.service.dockerfile }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha,scope=${{ matrix.service.name }} cache-to: type=gha,mode=max,scope=${{ matrix.service.name }} deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' permissions: contents: read packages: read steps: - name: Validate deploy secrets if: ${{ !secrets.VPS_HOST || !secrets.VPS_USER || !secrets.VPS_SSH_KEY }} run: | echo "Missing deploy secrets: VPS_HOST, VPS_USER, VPS_SSH_KEY." >&2 exit 1 - name: Deploy to VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} passphrase: ${{ secrets.VPS_SSH_PASSPHRASE }} port: ${{ secrets.VPS_PORT || 22 }} script: | set -e cd /opt/ZeaVis-Edu git pull origin main cat > .env << 'ENVEOF' GITHUB_REPOSITORY=${{ github.repository }} DATABASE_URL=${{ secrets.DATABASE_URL }} SESSION_SECRET=${{ secrets.SESSION_SECRET }} WEB_APP_URL=https://zeavisedu.asepharyana.tech ML_SERVICE_URL=https://ml.zeavisedu.asepharyana.tech ENVEOF docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} docker network create app-shared-net 2>/dev/null || true docker compose pull docker compose up -d docker compose ps docker compose ps | grep -q "zeavis-web.*Up" || exit 1 docker compose ps | grep -q "zeavis-api.*Up" || exit 1 docker compose ps | grep -q "zeavis-ml.*Up" || exit 1