Deploy Laravel Project lên VPS với Github Actions


Hướng dẫn tự động deploy project Laravel lên VPS với Github Actions

Bài viết này không đề cập đến khái niệm CI/CD. Chỉ đơn giản các step setup để deploy dự án Laravel lên VPS với Github Actions.

Bước 1: Setup file .env cho production

Copy file .env.example để chuẩn bị cho môi trường production. Ex: file .env.prod

Các giá trị secret như password database không để trong file. Sẽ config add giá trị secret vào file .env khi chạy job trên workflows

Cài đặt các giá trị secret trên github secrets trong repository. Cài đặt ở phần ** Settings > secrets and variables > actions > Mục secrets**

Các giá trị cần cài đặt secret có thể như: APP_KEY, DB_USERNAME, DB_PASSWORD,...

Bước 2: Tạo file config jobs github actions

Trong source, tạo file config đuôi yml cho github actions với đường dẫn ./githubs/workflows/deploy.yml

Ở đây chỉ tạo file build.yml để config đơn giản cho việc deploy, không đề cập đến các setup workflows khác. Các khái niệm khác sẽ ở bài viết khác.

Nội dung file config:

name: Deploy

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
      - uses: actions/checkout@v3
      - name: Copy .env
        run: |
          cp .env.prod .env
          sed -i "s|{APP_KEY}|$APP_KEY|g" .env
          sed -i "s|{DB_USERNAME}|$DB_USERNAME|g" .env
          sed -i "s|{DB_PASSWORD}|$DB_PASSWORD|g" .env
        env:
          APP_KEY: ${{ secrets.APP_KEY }}
          DB_USERNAME: ${{ secrets.DB_USERNAME }}
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

      - name: Install composer Dependencies
        run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

      - uses: actions/upload-artifact@v4
        with:
          name: build-artifact
          include-hidden-files: true
          path: |
            ${{ github.workspace }}
            !${{ github.workspace }}/.env

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: build-artifact
          path: ${{ github.workspace }}
      - name: Copy .env
        run: |
          cp .env.prod .env
          sed -i "s|{APP_KEY}|$APP_KEY|g" .env
          sed -i "s|{DB_USERNAME}|$DB_USERNAME|g" .env
          sed -i "s|{DB_PASSWORD}|$DB_PASSWORD|g" .env
        env:
          APP_KEY: ${{ secrets.APP_KEY }}
          DB_USERNAME: ${{ secrets.DB_USERNAME }}
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
      - name: Set up SSH private key
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        run: |
          mkdir -p ~/.ssh
          touch ~/.ssh/id_rsa
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
      - name: Configure SSH
        run: |
          touch ~/.ssh/config
          echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh/config
          touch ~/.ssh/known_hosts
          echo "$SSH_HOST $SSH_KEY" > ~/.ssh/known_hosts
        env:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_KEY: ${{ secrets.SSH_KEY }}
      - name: Copy build to VPS
        if: ${{ success() }}
        run: |
          rsync -avz --progress --delete -e "ssh -i ~/.ssh/id_rsa" ${{ github.workspace }}  ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:/var/www/html/it-backend/
      - name: Deploy to Server
        if: ${{ success() }}
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          port: 22
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            rm -rf /var/www/html/it-backend/src
            mv /var/www/html/it-backend/it-backend /var/www/html/it-backend/src
            cd /var/www/html/it-backend/src
            php8.3 artisan migrate --force
            php8.3 artisan optimize:clear
            php8.3 artisan optimize
            chown -R www-data:www-data /var/www/html/it-backend/src

Nội dung trên nhìn thì chắc đa số ai cũng hiểu. Xin phép không giải thích thêm..

Push lên nhánh main và check thành quả ở mục Tab Actions trên repository, nếu có lỗi thì fix..

© nvnhan0810 it-blogs - 2025