Xây Dựng Quy Trình CMS Dựa Trên Git cho Laravel
Pattern CMS truyền thống bao gồm database, admin panel, WYSIWYG editor, và xác thực người dùng. Nó nặng nề.
Với blog của developer, pattern Git-based CMS là vượt trội.
- Soạn thảo: Viết cục bộ trong VS Code (hoặc Obsidian/Notion).
- Version control: Git xử lý lịch sử, diff, và backup.
- Xuất bản:
git push origin main. - Deployment: Webhook tự động pull các thay đổi.
Đây là cách thiết lập cho ứng dụng Laravel.
1. Repository Nội Dung
Bạn có hai lựa chọn:
- Monorepo: Giữ nội dung trong thư mục
content/của Laravel (Đơn giản hơn, blog này sử dụng cách này). - Content Repo: Một repo riêng chỉ cho file Markdown (Tốt hơn cho việc phân tách concerns).
Nếu bạn sử dụng repo riêng, bạn có thể thêm nó như Git Submodule hoặc clone trong quá trình deployment.
2. Script Deployment
Bạn không cần CI/CD phức tạp cho blog cá nhân. Một script Laravel Envoy đơn giản hoặc bash script hoạt động rất tốt.
Đây là chiến lược bash đơn giản nhưng robust (deploy.sh):
#!/bin/bash
set -e
echo "🚀 Bắt đầu deployment..."
# 1. Pull code mới nhất
git pull origin main
# 2. Cài đặt dependencies (nếu composer.lock thay đổi)
composer install --no-dev --optimize-autoloader
# 3. Build assets (nếu có thiết kế)
npm run build
# 4. Clear và Cache Config
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 5. Clear Application Cache (Quan trọng cho blog file-based)
php artisan cache:clear
echo "✅ Deployment hoàn tất!"
3. Tự Động Hóa với Webhook
Để biến "Git Push = Publish", bạn cần một webhook listener.
GitHub Actions (Push-Model)
Tạo file workflow .github/workflows/deploy.yml:
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to VPS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/my-blog
./deploy.sh
Webhook Route (Pull-Model)
Hoặc, tạo một route ẩn trong Laravel mà GitHub gọi.
// routes/api.php
Route::post('/deploy-webhook', function (Request $request) {
$signature = $request->header('X-Hub-Signature-256');
// Logic xác minh signature ở đây...
// Kích hoạt process deployment (ví dụ: dispatch một Job)
\App\Jobs\DeploySite::dispatch();
return response()->json(['status' => 'deploying']);
});
Lưu ý bảo mật: Luôn xác minh webhook signature secret của GitHub!
4. Xử Lý Cache Invalidation
Vì blog của chúng ta sử dụng file-based caching (parse Markdown tốn kém), cache phải được xóa khi nội dung cập nhật.
Trong setup đơn giản hơn của chúng ta, php artisan cache:clear trong deployment script là cách tiếp cận "búa tạ" hoạt động tốt cho blog nhỏ.
Với site lớn hơn, bạn có thể muốn chỉ xóa các key cụ thể. Bạn có thể lắng nghe thay đổi file nếu sử dụng daemon, nhưng đó là over-engineering.
5. Quy Trình Viết Bài
Quy trình cá nhân của tôi như sau:
- Tạo branch
post/new-feature. - Viết
content/posts/YYYY-MM-DD-feature.md. - Đặt
draft: truetrong frontmatter khi đang làm việc. - Chạy
php artisan serveđể xem preview cục bộ. - Commit và Push.
- Merge vào
mainkhi sẵn sàng go live.
Ưu Điểm
- Không Admin Panel: Ít code để bảo trì, attack surface nhỏ hơn.
- Viết Offline: Viết trên máy bay, commit sau.
- Ownership: Nội dung của bạn ở dạng flat file, có thể đọc được sau 50 năm.
- Tốc độ: Không có database query để render bài viết (nếu cache đúng cách).
Kiến trúc này mang "Developer Experience" đến với blogging.