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.
- SSH vào VPS của bạn:
ssh youruser@your-vps-ip
- 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):
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).
- Thêm khóa công khai vào
~/.ssh/authorized_keys:
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
- Sao chép khóa riêng cho GitHub Secrets:
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.
- Kiểm tra SSH cục bộ để đảm bảo nó hoạt động:
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:
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:
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ụ.
- Trong
/var/www/your-app, tạo kịch bản:
nano deploy.sh
- Thêm nội dung sau:
#!/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!"
- Làm cho nó có thể thực thi:
chmod +x deploy.sh
- Kiểm tra nó thủ công:
./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.
- Trong kho cục bộ của bạn, tạo thư mục và tệp:
mkdir -p .github/workflows
touch .github/workflows/deploy.yml
- Thêm nội dung sau:
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
- Cam kết và đẩy:
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:
-
Đ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ữ.
-
Thêm các bí mật sau:
DEPLOY_SERVER_KEY: Khóa SSH riêng từ Bước 1 (nội dungid_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
- Thực hiện một thay đổi nhỏ cục bộ (ví dụ, cập nhật một view).
- Cam kết và đẩy lên nhánh
main:
git commit -m "Kiểm tra triển khai"
git push origin main
-
Đi tới tab Actions của kho để theo dõi quy trình làm việc.
-
Kiểm tra
/var/www/your-apptrê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>&1và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-datacó 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-fpmnế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