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.
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,...
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