0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Tự động triển khai Laravel trên VPS với GitHub Actions

Đăng vào 1 tháng trước

• 8 phút đọc

Tự động triển khai Laravel trên VPS với GitHub Actions: Hướng dẫn cho người mới bắt đầu

Chào các bạn lập trình viên! 👋 Tôi là Ojugo Samson, Kỹ sư Phần mềm chính, tôi xây dựng các giải pháp có thể mở rộng với PHP và Laravel. Việc triển khai mã một cách thủ công—đăng nhập vào máy chủ, kéo thay đổi, chạy các lệnh di trú—có thể trở thành một công việc phiền phức, đặc biệt là khi có nhiều bản cập nhật thường xuyên. Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách tự động hóa việc triển khai ứng dụng Laravel của bạn trên một Máy chủ Riêng Ảo (VPS) bằng GitHub Actions. Phương pháp này sử dụng kết nối SSH an toàn để kích hoạt một kịch bản triển khai trên máy chủ của bạn mỗi khi bạn đẩy lên nhánh main.

Hướng dẫn này dành cho người mới, nhưng tôi sẽ giả định rằng bạn đã biết những kiến thức cơ bản về Laravel, Git và SSH. Nếu bạn mới làm quen với VPS, tôi khuyên bạn nên sử dụng các nhà cung cấp như DigitalOcean, Linode hoặc AWS Lightsail. Hãy bắt đầu!

Tại sao nên sử dụng GitHub Actions cho việc triển khai?

  • Tự động hóa: Đẩy lên GitHub và máy chủ của bạn sẽ tự động cập nhật.
  • Bảo mật: Lưu trữ dữ liệu nhạy cảm như khóa SSH trong GitHub Secrets.
  • Tính linh hoạt: Tùy chỉnh quy trình làm việc cho kiểm thử, staging hoặc sản xuất.
  • Tính khả thi: Theo dõi trạng thái triển khai trong tab Actions của GitHub.

Chúng ta sẽ triển khai một ứng dụng Laravel mẫu (như dự án VerifyPlug của tôi), nhưng điều này áp dụng cho bất kỳ kho lưu trữ nào dựa trên Laravel.

Điều kiện cần có

Trước khi bắt đầu:

  • Một kho GitHub với dự án Laravel của bạn (ví dụ, trên nhánh main).
  • Một VPS với Ubuntu (hoặc phân phối Linux tương tự), PHP 8.3+, Composer, Git và các yêu cầu của Laravel đã được cài đặt.
  • Ứng dụng Laravel của bạn được sao chép và chạy trên VPS (ví dụ, trong /var/www/your-app).
  • Nginx hoặc Apache được cấu hình cho trang web của bạn.
  • Supervisor hoặc tương tự cho các worker hàng đợi (nếu sử dụng hàng đợi).

Nếu VPS của bạn chưa được thiết lập, hãy kiểm tra tài liệu triển khai của Laravel để biết các bước thiết lập cơ bản.

Bước 1: Thiết lập khóa SSH cho truy cập an toàn

Để cho phép GitHub Actions kết nối với VPS của bạn một cách an toàn, hãy tạo một cặp khóa SSH trên VPS và thêm khóa công khai vào GitHub Secrets.

  1. SSH vào VPS của bạn:
Copy
   ssh youruser@your-vps-ip
  1. Tạo một cặp khóa SSH (chấp nhận mặc định hoặc thêm một passphrase để tăng cường bảo mật):
Copy
   ssh-keygen -t ed25519 -C "your_email@example.com"

Lệnh này tạo ra ~/.ssh/id_ed25519 (khóa riêng) và ~/.ssh/id_ed25519.pub (khóa công khai).

  1. Thêm khóa công khai vào ~/.ssh/authorized_keys:
Copy
   cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
   chmod 600 ~/.ssh/authorized_keys
  1. Sao chép khóa riêng cho GitHub Secrets:
Copy
   cat ~/.ssh/id_ed25519

Lưu trữ khóa này một cách an toàn—bạn sẽ cần nó ở Bước 4.

  1. Kiểm tra SSH cục bộ để đảm bảo nó hoạt động:
Copy
   ssh -i ~/.ssh/id_ed25519 youruser@your-vps-ip

Bước 2: Sao chép kho của bạn trên VPS (nếu chưa làm)

Đi tới thư mục web của bạn và sao chép kho của bạn:

Copy
sudo mkdir -p /var/www/your-app
sudo chown -R $USER:www-data /var/www/your-app
cd /var/www/your-app
git clone git@github.com:yourusername/your-repo.git .

Thay thế your-app, yourusername, và your-repo bằng thông tin của bạn.

Cài đặt các phụ thuộc và cấu hình:

Copy
composer install --optimize-autoloader --no-dev
cp .env.example .env
php artisan key:generate
php artisan migrate

Đảm bảo rằng tệp .env của bạn đã được thiết lập với thông tin xác thực cơ sở dữ liệu và các cấu hình khác.

Bước 3: Tạo kịch bản triển khai

Chúng ta sẽ tạo một kịch bản deploy.sh trên VPS để xử lý việc kéo mã, cập nhật phụ thuộc và khởi động lại dịch vụ.

  1. Trong /var/www/your-app, tạo kịch bản:
Copy
   nano deploy.sh
  1. Thêm nội dung sau:
Copy
   #!/bin/bash
   set -e

   echo "Triển khai bắt đầu..."

   # Điều hướng đến thư mục dự án
   cd /var/www/your-app

   # Vào chế độ bảo trì (bỏ qua nếu đã tắt)
   (php artisan down --message "Ứng dụng đang được cập nhật. Vui lòng thử lại sau một phút.") || true

   # Kéo mã mới nhất từ nhánh chính
   git fetch origin main
   git reset --hard origin/main

   # Cài đặt các phụ thuộc Composer
   composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader

   # Xóa và tạo lại cache
   php artisan cache:clear
   php artisan config:cache
   php artisan route:cache
   php artisan view:cache

   # Thực hiện di trú cơ sở dữ liệu
   php artisan migrate --force

   # Khởi động lại worker hàng đợi (nếu sử dụng hàng đợi cơ sở dữ liệu)
   php artisan queue:restart

   # Thoát khỏi chế độ bảo trì
   php artisan up

   # Tải lại PHP-FPM để cập nhật opcache (điều chỉnh phiên bản nếu cần)
   echo "" | sudo -S service php8.3-fpm reload

   echo "Triển khai hoàn tất!"
  1. Làm cho nó có thể thực thi:
Copy
   chmod +x deploy.sh
  1. Kiểm tra nó thủ công:
Copy
   ./deploy.sh

Sửa bất kỳ vấn đề nào (ví dụ, quyền cho www-data hoặc phiên bản PHP-FPM).

Kịch bản này xử lý chế độ bảo trì, cập nhật mã, cài đặt phụ thuộc, quản lý cache, thực hiện di trú và khởi động lại dịch vụ.

Bước 4: Thiết lập quy trình làm việc GitHub Actions

Chúng ta sẽ tạo một tệp .github/workflows/deploy.yml trong kho của bạn để tự động hóa việc triển khai.

  1. Trong kho cục bộ của bạn, tạo thư mục và tệp:
Copy
   mkdir -p .github/workflows
   touch .github/workflows/deploy.yml
  1. Thêm nội dung sau:
Copy
   name: Triển khai lên Sản xuất
   on:
     push:
       branches:
         - main

   jobs:
     deploy:
       runs-on: ubuntu-latest
       steps:
         - name: Kiểm tra kho
           uses: actions/checkout@v3

         - name: Thiết lập SSH
           uses: webfactory/ssh-agent@v0.5.4
           with:
             ssh-private-key: ${{ secrets.DEPLOY_SERVER_KEY }}

         - name: Triển khai lên VPS
           uses: appleboy/ssh-action@master
           with:
             host: ${{ secrets.DEPLOY_SERVER_IP }}
             username: ${{ secrets.DEPLOY_SERVER_USER }}
             key: ${{ secrets.DEPLOY_SERVER_KEY }}
             script: |
               cd ${{ secrets.DEPLOY_PATH }}
               ./deploy.sh
  1. Cam kết và đẩy:
Copy
   git add .github/workflows/deploy.yml
   git commit -m "Thêm quy trình làm việc triển khai GitHub Actions"
   git push origin main

Quy trình làm việc này sẽ kích hoạt khi có đẩy lên nhánh main, kiểm tra mã, thiết lập SSH và chạy deploy.sh trên VPS của bạn.

Bước 5: Cấu hình GitHub Secrets

Để lưu trữ an toàn dữ liệu nhạy cảm, hãy thêm các thông tin sau vào phần Cài đặt của kho của bạn > Secrets và biến > Actions > Secrets:

  1. Đi tới kho GitHub của bạn > Cài đặt > Secrets và biến > Actions > Mới bí mật kho lưu trữ.

  2. Thêm các bí mật sau:

    • DEPLOY_SERVER_KEY: Khóa SSH riêng từ Bước 1 (nội dung id_ed25519).
    • DEPLOY_SERVER_IP: Địa chỉ IP của VPS của bạn (ví dụ, 192.168.1.1).
    • DEPLOY_SERVER_USER: Tên người dùng VPS của bạn (ví dụ, youruser).
    • DEPLOY_PATH: Đường dẫn đầy đủ đến ứng dụng của bạn (ví dụ, /var/www/your-app).

Bước 6: Kiểm tra việc triển khai

  1. Thực hiện một thay đổi nhỏ cục bộ (ví dụ, cập nhật một view).
  2. Cam kết và đẩy lên nhánh main:
Copy
   git commit -m "Kiểm tra triển khai"
   git push origin main
  1. Đi tới tab Actions của kho để theo dõi quy trình làm việc.

  2. Kiểm tra /var/www/your-app trên VPS để xác nhận các cập nhật. Gỡ lỗi bằng cách sử dụng nhật ký Actions hoặc bằng cách thêm > deploy.log 2>&1 vào bước kịch bản để xem đầu ra.

Những vấn đề phổ biến

  • Lỗi SSH: Xác minh khóa riêng và thiết lập authorized_keys.
  • Quyền: Đảm bảo www-data có quyền truy cập vào /var/www/your-app.
  • Phiên bản PHP-FPM: Điều chỉnh tên dịch vụ php8.3-fpm nếu bạn sử dụng phiên bản khác.

Thực hành tốt nhất

  • Kiểm tra trước: Sử dụng nhánh staging để kiểm tra việc triển khai.
  • Sao lưu: Chụp ảnh VPS và cơ sở dữ liệu của bạn trước khi thực hiện di trú.
  • Giám sát: Sử dụng các công cụ như Sentry để theo dõi lỗi.
  • Không dừng hoạt động: Đối với sản xuất, hãy khám phá các công cụ như Laravel Forge hoặc Envoyer.
  • Bảo mật: Giới hạn quyền truy cập SSH cho phạm vi IP của trình chạy GitHub Actions của bạn.

Cấu hình này đã giúp các dự án của tôi như VerifyPlug, tiết kiệm hàng giờ công việc thủ công!

Kết luận

Bạn đã tự động hóa việc triển khai ứng dụng Laravel của mình với GitHub Actions! Chỉ cần đẩy lên main, và VPS của bạn sẽ cập nhật một cách liền mạch. Nếu bạn gặp vấn đề, hãy kiểm tra nhật ký Actions hoặc liên hệ với tôi trên LinkedIn.

Chúc bạn lập trình vui vẻ! 🚀

Ojugo Samson

Kỹ sư Phần mềm chính @ Cargoplug | Techstars '24

LinkedIn: samsonojugo

GitHub: quitenoisemaker

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào