fpm): Xử lý các request PHP, chứa vendor dependencies và source code Laravel.web): Phục vụ nội dung tĩnh từ thư mục public của Laravel và chuyển tiếp (proxy) các request PHP đến service FPM.| Thành phần | Dịch vụ AWS | Mục đích |
|---|---|---|
| Container Images | AWS ECR | Registry Docker image riêng tư |
| Cơ sở dữ liệu | AWS RDS | MySQL được quản lý cho Laravel |
| Cache | ElastiCache | Redis cache cho session, queue, và cache driver |
| Lưu trữ chia sẻ | AWS EFS | Lưu trữ NFS cho uploads WordPress news |
| Dự án | ECR Repository | Nhánh source | Đường dẫn WP News |
|---|---|---|---|
| thscore | sports/thscore-live-prod | thscore-v2.0 | prediction |
| bongdako | sports/bongdako-live-prod | bongdako-live-develop | nhan-dinh-bong-da |
| bongdalu | sports/bongdalu-live-prod | bongdalu-nowgoal | tin-tuc |
| bongdapi | sports/bongdapi-live-prod | bongdapi-live | tin-moi |
Dự Án Sport (ví dụ: thscore)
├─ .gitignore
├─ .gitmodules # Tham chiếu submodule đến source Laravel
├─ README.md # Tài liệu triển khai
├─ build/
│ ├─ Dockerfile-base-live.production # Base image: Cài đặt FPM + Nginx (user, supervisor, php config)
│ ├─ Dockerfile-live.production # Production image: composer install, npm build, multi-stage
│ ├─ Dockerfile-live.development # Development image: build đầy đủ
│ ├─ conf/
│ │ ├─ nginx/
│ │ │ ├─ common/
│ │ │ │ └─ nginx.conf # Cấu hình nginx global
│ │ │ └─ template/
│ │ │ └─ default-live.conf.template.example # Template server block (sử dụng $FPM_HOST)
│ │ ├─ robots.txt.example # Template robots.txt mặc định
│ │ └─ supervisor/
│ │ ├─ common/
│ │ │ ├─ entry_point.sh # Script khởi chạy Supervisor
│ │ │ └─ supervisord.conf # Cấu hình Supervisor global
│ │ └─ php-fpm.conf # Supervisor program: php-fpm
│ ├─ data/
│ │ └─ php/
│ │ ├─ php.ini # Cấu hình PHP tùy chỉnh
│ │ └─ php-fpm.conf.example # Template cấu hình PHP-FPM pool
│ └─ source/ # ⚡ Git submodule — Source code Laravel
│ ├─ .env # Biến môi trường ứng dụng (load khi runtime)
│ ├─ composer.json
│ ├─ package.json
│ └─ ...
├─ docs/
│ ├─ swap-memory/README.md
│ └─ vi-VN/README.md # Tài liệu tiếng Việt (file này)
├─ media/ # Media assets cho tài liệu
├─ .env-live.production # Biến Docker Compose cho production
├─ .env-live.development # Biến Docker Compose cho development
├─ docker-compose-live.yml.production # File Compose cho triển khai production
└─ docker-compose-live.yml.development # File Compose cho triển khai development┌──────────────────────────────────────────────────────────────────────────┐
│ PIPELINE BUILD MULTI-STAGE │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ GIAI ĐOẠN 1 │ │ GIAI ĐOẠN 2 │ │ GIAI ĐOẠN 3 │ │
│ │ vendor │───▶│ node_base │───▶│ build │ │
│ │ │ │ │ │ │ │
│ │ • composer │ │ • Copy từ │ │ • npm run │ │
│ │ install │ │ vendor │ │ build │ │
│ │ • PHP deps │ │ • npm │ │ • Assets │ │
│ │ │ │ install │ │ đã build │ │
│ └─────────────┘ └─────────────┘ └──────┬──────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ │ │
│ ┌─────────────┐ ┌─────────────┐ │ │
│ │ GIAI ĐOẠN 4 │ │ GIAI ĐOẠN 5 │ │ │
│ │ fpm_server │ │ web_server │ │ │
│ │ │ │ │ │ │
│ │ • Toàn bộ │ │ • Nginx │ │ │
│ │ Laravel │ │ • Chỉ thư │ │ │
│ │ • PHP-FPM │ │ mục │ │ │
│ │ • Vendor │ │ public/ │ │ │
│ │ • Supervisor│ │ • Static │ │ │
│ │ │ │ assets │ │ │
│ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │
│ ▼ ▼ │ │
│ ┌─────────────┐ ┌─────────────┐ │ │
│ │ ECR Push │ │ ECR Push │ │ │
│ │ :fpm-latest│ │ :web-latest│ │ │
│ └─────────────┘ └─────────────┘ │ │
└──────────────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────────────────────────┐
│ MÔI TRƯỜNG PRODUCTION AWS │
│ │
│ ┌──────────────────────────────────────┐ ┌──────────────────────────────────────┐ │
│ │ Docker Host │ │ DỊCH VỤ AWS │ │
│ │ │ │ │ │
│ │ ┌────────────────────────────────┐ │ │ ┌──────────────────────────────┐ │ │
│ │ │ web (Nginx Container) │ │ │ │ AWS RDS (MySQL) │ │ │
│ │ │ │ │ │ │ • CSDL Production │ │ │
│ │ │ • Phục vụ static assets │ │ │ │ • Được AWS quản lý │ │ │
│ │ │ • Proxy PHP → FPM:9000 │ │ │ └──────────────────────────────┘ │ │
│ │ │ • Port 80 expose │ │ │ │ │
│ │ │ • Nginx templates │ │ │ ┌──────────────────────────────┐ │ │
│ │ │ • News uploads (RO) ◄─────────┼──┼──┼──│ AWS ElastiCache (Redis) │ │ │
│ │ │ │ │ │ │ • Lưu trữ Session │ │ │
│ │ └───────────┬────────────────────┘ │ │ │ • Cache Driver │ │ │
│ │ │ fastcgi_pass │ │ │ • Queue Connection │ │ │
│ │ ▼ │ │ └──────────────────────────────┘ │ │
│ │ ┌────────────────────────────────┐ │ │ │ │
│ │ │ fpm (PHP-FPM Container) │ │ │ ┌──────────────────────────────┐ │ │
│ │ │ │──┼──┼──▶ AWS ECR │ │ │
│ │ │ • Laravel source + vendor │ │ │ │ • :fpm-latest │ │ │
│ │ │ • PHP-FPM port 9000 │ │ │ │ • :web-latest │ │ │
│ │ │ • Supervisor quản lý │ │ │ │ • :fpm-base-latest │ │ │
│ │ │ • Health check bật │ │ │ │ • :web-base-latest │ │ │
│ │ │ • .env mount (RO) │ │ │ └──────────────────────────────┘ │ │
│ │ │ • News uploads (RW) ◄─────────┼──┼──┼──┐ │ │
│ │ │ │ │ │ │ ┌──────────────────────────────┐ │ │
│ │ └────────────────────────────────┘ │ │ └──│ AWS EFS (NFS) │ │ │
│ │ │ │ │ • :/uploads-wp │ │ │
│ └──────────────────────────────────────┘ │ │ • Lưu trữ media WordPress │ │ │
│ │ │ • Chia sẻ giữa instances │ │ │
│ Networks: prod-network, backend-network │ └──────────────────────────────┘ │ │
│ │ │ │
└────────────────────────────────────────────┴────────────────────────────────────────┘| Công cụ | Phiên bản tối thiểu | Mục đích |
|---|---|---|
| Docker | ≥ 24.0.0 | Build và chạy container |
| Docker Compose | ≥ 2.20.0 | Điều phối nhiều container |
| AWS CLI | ≥ 2.0 | Xác thực và push lên AWS ECR |
| Git | ≥ 2.30 | Quản lý source code & submodules |
sports/thscore-live-prod)ecr:GetAuthorizationToken, ecr:BatchCheckLayerAvailability, ecr:PutImage| Tài nguyên | Tối thiểu | Khuyến nghị |
|---|---|---|
| CPU | 4 Core | 8 Core |
| RAM | 4 GB | 8 GB |
| SWAP | 1 GB | 2 GB |
| Ổ cứng | 40 GB | 65 GB |
| OS | Ubuntu ≥ 22.04 | Ubuntu ≥ 24.04 |
.env-live.production)docker-compose sử dụng để thay thế biến.build/source/.env)⚠️ Quan trọng: File .envtrongbuild/source/.envđược load khi runtime qua volume mount. Nó KHÔNG được nhúng vào Docker image, đảm bảo các thông tin nhạy cảm luôn được bảo mật.
build/conf/nginx/template/default-live.conf.template.example) sử dụng biến môi trường $FPM_HOST để tự động resolve PHP-FPM backend:build/data/php/php.ini):build/data/php/php-fpm.conf):[
{
"Driver": "local",
"Name": "<dự-án>_news_storage-data",
"Options": {
"device": ":/uploads-wp",
"o": "addr=<efs-id>.efs.<region>.amazonaws.com,nfsvers=4.1,rw",
"type": "nfs"
}
}
]| Dự án | Tên Volume | Đường dẫn mount trong Container (FPM — RW, Web — RO) |
|---|---|---|
| thscore | thscore_news_storage-data | /opt/apps/laravel/public/prediction/wp-content/uploads |
| bongdako | bongdako_news_storage-data | /opt/apps/laravel/public/nhan-dinh-bong-da/wp-content/uploads |
| bongdalu | bongdalu_news_storage-data | /opt/apps/laravel/public/news/wp-content/uploads |
| bongdapi | bongdapi_news_storage-data | /opt/apps/laravel/public/tin-moi/wp-content/uploads |
Lưu ý: Container FPM mount volume news ở chế độ read-write (để WordPress upload hình ảnh), trong khi container Web mount ở chế độ read-only (Nginx chỉ phục vụ file tĩnh). Bản thân các file source WordPress được mount từ build/source/public/<đường-dẫn-news>vào cùng thư mục cha.