Tự động Deploy ứng dụng Docker lên VPS Ubuntu, AWS, Vercel hoặc Render
Hướng dẫn tự động deploy ứng dụng Docker lên VPS Ubuntu và cloud providers bằng GitHub Actions: AWS ECS/App Runner/EC2, Vercel, Render, secrets, healthcheck, rollback và zero-downtime strategy.
ShanverseCập nhật 10 phút đọc— lượt xemĐang tải lượt xem
Tag có thể bị ghi đè; digest là identity theo nội dung. Lưu release → Git SHA → digest → thời điểm deploy để audit và rollback.
Phần 1: Deploy tự động lên VPS Ubuntu
Hardening server trước khi nhận deploy
Tạo user deploy, không chạy ứng dụng bằng login root.
Chỉ cho phép SSH key; tắt password login và root login sau khi xác minh access.
Bật firewall, chỉ mở SSH, HTTP và HTTPS cần thiết.
Cài Docker Engine/Compose từ nguồn package chính thức.
Bật cập nhật bảo mật và theo dõi disk/memory.
Không mount Docker socket vào application container.
Dùng token Registry read-only trên host.
Cấu trúc:
.env.runtime chứa runtime configuration/secrets, quyền file giới hạn và không nằm trong Git.
Compose production
Chỉ reverse proxy publish port. Certificate/config Nginx cần được mount và quản lý riêng theo thiết kế HTTPS.
Đăng nhập Registry trên VPS
Dùng token chỉ có quyền pull:
Không truyền token Registry trong mỗi lệnh SSH hoặc commit vào Compose. Credential cần rotation và có owner/expiry.
Deploy script có rollback metadata
/opt/myapp/deploy.sh:
Chỉ cho phép Image reference từ Registry/namespace dự kiến. Không nhận tùy ý string từ người dùng rồi thực thi trong shell.
GitHub Actions deploy qua SSH
GitHub Environment production nên chứa:
VPS_KNOWN_HOSTS phải được lấy từ fingerprint đã xác minh khi provision server, không chạy ssh-keyscan mù quáng trong mỗi deploy.
Build job phải expose digest output. Environment có thể yêu cầu reviewer trước production deploy.
Rollback VPS
Chọn release trước:
Rollback application không tự rollback database. Migration production nên backward-compatible theo mô hình expand/contract và có kế hoạch phục hồi dữ liệu riêng.
Compose có zero downtime không?
Một service một replica được replace có thể có downtime ngắn. Các lựa chọn:
Blue/green với hai project Compose và Nginx đổi upstream.
Chạy nhiều replica sau load balancer có healthcheck.
Dùng ECS/Kubernetes/platform managed rolling deployment.
Không gọi docker compose up -d là zero-downtime nếu chưa đo và thiết kế traffic switching.
Phần 2: AWS
AWS App Runner
Phù hợp một HTTP service từ container Image:
Image thường nằm trong Amazon ECR.
Platform quản lý HTTPS endpoint, scaling, healthcheck và rollout.
Cấu hình service role để App Runner pull private ECR Image.
Runtime secrets lấy từ AWS managed secret/config service theo quyền IAM.
Chọn khi muốn ít vận hành hơn ECS và workload là web service tương đối đơn giản.
AWS ECS Fargate
Phù hợp production cần:
Nhiều service/task.
Application Load Balancer.
Autoscaling và rolling deployment.
Private subnet/security groups.
IAM task role và Secrets Manager/Parameter Store.
CloudWatch logs/metrics.
Luồng:
AWS EC2
EC2 có thể vận hành giống VPS, nhưng nên tận dụng:
IAM role thay static AWS keys.
Systems Manager Session Manager/Run Command thay SSH khi phù hợp.
EBS snapshot, CloudWatch Agent và security groups.
Auto Scaling Group nếu cần thay host tự động.
GitHub Actions xác thực AWS bằng OIDC
Ưu tiên short-lived credentials:
Sau đó dùng AWS credential Action để assume IAM role qua OIDC và ECR login Action để push/pull. Trust policy phải giới hạn:
GitHub organization/repository.
Branch/tag hoặc GitHub Environment.
Audience đúng.
Role permissions chỉ cho ECR/ECS resource cần thiết.
Không lưu long-lived AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY nếu OIDC đáp ứng yêu cầu.
ECS deployment an toàn
Push Image và lấy digest ECR.
Tạo task definition revision tham chiếu Image digest/version.
Cập nhật ECS service.
Chờ service stable và target healthy.
Bật deployment circuit breaker/rollback khi phù hợp.
Ghi task definition revision và digest vào release metadata.
Database migration nên chạy bằng one-off task riêng, không để mọi replica tự chạy migration khi startup.
Phần 3: Vercel
Vercel phù hợp nhất với:
Next.js frontend/full-stack theo runtime Vercel.
Static site.
Serverless/edge functions.
Preview deployment cho Pull Request.
Vercel thường build từ source theo framework, không chạy arbitrary Docker Compose stack như VPS. Kiến trúc phổ biến:
Nếu app chỉ là Next.js, deploy trực tiếp bằng Git integration thường đơn giản hơn việc cố đóng gói Docker. Nếu app cần daemon, worker dài hạn, local filesystem bền vững, privileged operation hoặc nhiều container, chọn runtime khác.
Workflow có thể để Vercel tự tạo Preview/Production deploy từ Git, hoặc gọi Vercel CLI/API với project/environment token. Token phải nằm trong GitHub Environment secret và chỉ production job được đọc. Kiểm tra plan và tính năng hiện tại trước khi phụ thuộc vào một runtime cụ thể.
Phần 4: Render
Render phù hợp khi muốn deploy Dockerfile mà không tự quản lý VM.
Một Blueprint cơ bản render.yaml:
Các bước:
Kết nối Git repository hoặc registry integration được hỗ trợ.
Chọn Docker runtime/Dockerfile.
Cấu hình build context và healthcheck path.
Đặt environment variables/secrets trong dashboard.
Gắn custom domain; platform quản lý TLS.
Chọn persistent disk chỉ khi ứng dụng thực sự cần và hiểu giới hạn scaling.
Theo dõi deploy logs, runtime logs và health status.
sync: false yêu cầu giá trị được nhập ngoài Git. Không commit production secret vào Blueprint.
Với prebuilt Image, kiểm tra khả năng private registry, credential và deploy-by-digest hiện tại của plan/integration. Nếu platform build từ Git, vẫn giữ Dockerfile reproducible và pin dependency/base Image.
Render auto-deploy hay GitHub Actions trigger?
Platform auto-deploy
Ít YAML hơn.
Render nhận commit và tự build/deploy.
Phù hợp team nhỏ.
CI-controlled deploy
GitHub Actions test/scan trước.
Chỉ trigger deploy sau approval.
Dễ dùng chung release digest/metadata.
Tránh để cả auto-deploy và CI deploy cùng bật cho production vì có thể tạo race hoặc deploy hai lần.
Secrets theo từng nền tảng
Không copy một .env.production dùng chung cho mọi nền tảng. Tách credential theo environment, service và quyền.
Healthcheck và verification sau deploy
Deployment chưa thành công chỉ vì command trả exit code 0. Verify:
/version nên trả release identifier không nhạy cảm như Git SHA hoặc Image digest rút gọn.
Theo dõi:
HTTP error rate và p95/p99 latency.
Restart/OOM count.
CPU/memory saturation.
Queue backlog và database pool.
Log error event theo release.
TLS/certificate và disk usage trên VPS.
Deployment strategy
Schema/database phải tương thích khi nhiều version cùng chạy.
Quy trình rollback chuẩn
Phát hiện qua smoke test/SLO/alert.
Dừng rollout hoặc traffic shift.
Deploy lại digest production trước.
Verify health, error rate và latency.
Quyết định xử lý migration/data.
Lưu incident timeline và release metadata.
Không rebuild commit cũ để rollback; dùng digest cũ đã lưu trong Registry.
Những lỗi phổ biến
VPS SSH thành công nhưng app không pull được Image
Host chưa login Registry hoặc token hết hạn/thiếu read permission. Dùng read-only token và kiểm tra docker pull trực tiếp.
Healthcheck nội bộ pass nhưng domain lỗi
Kiểm tra reverse proxy, DNS, firewall, TLS và network mapping. Healthcheck localhost không kiểm tra toàn bộ request path từ Internet.
ECS task liên tục bị thay thế
Container healthcheck hoặc ALB target healthcheck sai path/port/timeout; xem task stopped reason và log trước khi tăng grace period.
Vercel không chạy được worker/container
Workload không phù hợp serverless/frontend runtime. Tách worker/API sang AWS, Render hoặc VPS.
Render deploy hai lần
Cả auto-deploy và GitHub Actions deploy hook cùng hoạt động. Chọn một source of truth.
Rollback app nhưng database lỗi
Migration không backward-compatible. Dùng expand/contract và backup/restore plan.
Checklist production
Image được build/test/scan một lần và lưu digest.
Production deploy theo digest/version bất biến.
GitHub Environment có approval và concurrency lock.
Credential deploy theo least privilege và có rotation.
VPS dùng verified SSH host key, non-root deploy user và firewall.
AWS dùng OIDC thay long-lived keys khi khả thi.
Secrets nằm trong platform secret store, không trong Git/Image.
Healthcheck kiểm tra đúng dependency và request path.
Có smoke test sau deploy.
Có rolling/blue-green/canary strategy phù hợp.
Migration tương thích nhiều version và có recovery plan.
Log, metrics, alert gắn với release identifier.
Rollback dùng digest trước, không rebuild.
Vercel chỉ dùng cho workload phù hợp runtime.
Chỉ có một hệ thống chịu trách nhiệm trigger production deploy.
Hướng dẫn Docker Networks toàn diện: bridge, host, none, overlay, service discovery, port publishing, Compose network segmentation, internal networks, bảo mật và debug kết nối.