[Java Backend Zero to Hello] BÀI 7.7: TRIỂN KHAI LÊN CLOUD
📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 7: Testing & DevOps Cơ Bản | Bài 77/86
BÀI 7.7: TRIỂN KHAI LÊN CLOUD
Mục tiêu
- Triển khai ứng dụng lên cloud
- Sử dụng các platform phổ biến
- Cấu hình production environment
1. CÁC PLATFORM PHỔ BIẾN
| Platform | Đặc điểm | Phù hợp |
|---|---|---|
| AWS | Đầy đủ tính năng nhất | Enterprise |
| Google Cloud | ML/AI mạnh | Data, ML |
| Azure | Tích hợp Microsoft | .NET, Windows |
| Railway | Đơn giản, nhanh | Side project |
| Render | Free tier tốt | Startup |
| Heroku | Dễ dùng | Prototype |
| DigitalOcean | Giá rẻ | SMB |
2. RAILWAY
2.1 Triển khai
- Tạo tài khoản Railway
- New Project → Deploy from GitHub
- Chọn repo
- Thêm biến môi trường
- Deploy
2.2 Cấu hình
# railway.toml hoặc Procfile
web: java -jar target/myapp-1.0.jar
2.3 Biến môi trường
SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:postgresql://...
SPRING_DATASOURCE_USERNAME=...
SPRING_DATASOURCE_PASSWORD=...
3. RENDER
3.1 Triển khai
- Tạo tài khoản Render
- New → Web Service
- Connect GitHub repo
- Cấu hình:
- Environment: Docker
- Region: Singapore
- Branch: main
3.2 Dockerfile
FROM eclipse-temurin:17-jre-jammy
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
4. AWS EC2
4.1 Khởi tạo EC2
- EC2 → Launch Instance
- Chọn Amazon Linux 2
- Chọn instance type (t2.micro free tier)
- Cấu hình Security Group (mở port 22, 80, 443, 8080)
- Tạo key pair
4.2 Cài đặt môi trường
# SSH vào server
ssh -i key.pem ec2-user@<public-ip>
# Cài Java
sudo yum install java-17-amazon-corretto
# Cài Docker
sudo yum install docker
sudo service docker start
sudo usermod -a -G docker ec2-user
4.3 Deploy
# Copy JAR
scp -i key.pem target/myapp.jar ec2-user@<ip>:~/
# Chạy
java -jar myapp.jar
4.4 Với Docker
# Pull image
docker pull username/myapp:latest
# Run
docker run -d -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://... \
username/myapp:latest
5. AWS ECS (CONTAINER SERVICE)
5.1 Kiến trúc
ECR (Image Registry) → ECS Cluster → Task Definition → Service
5.2 Push image lên ECR
aws ecr get-login-password --region ap-southeast-1 | \
docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com
docker tag myapp:latest <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com/myapp:latest
docker push <account-id>.dkr.ecr.ap-southeast-1.amazonaws.com/myapp:latest
5.3 Task Definition
{
"family": "myapp",
"containerDefinitions": [
{
"name": "myapp",
"image": "<ecr-uri>/myapp:latest",
"portMappings": [
{
"containerPort": 8080,
"hostPort": 8080
}
],
"environment": [
{
"name": "SPRING_PROFILES_ACTIVE",
"value": "prod"
}
]
}
]
}
6. DATABASE TRÊN CLOUD
6.1 AWS RDS
- Tạo RDS instance (PostgreSQL/MySQL)
- Cấu hình Security Group
- Lấy endpoint, username, password
6.2 Connection
spring:
datasource:
url: jdbc:postgresql://myapp.xxxx.rds.amazonaws.com:5432/mydb
username: admin
password: ${DB_PASSWORD}
7. HTTPS VỚI NGINX + LET'S ENCRYPT
7.1 Cài đặt
sudo yum install nginx certbot python-certbot-nginx
7.2 Cấu hình Nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7.3 SSL
sudo certbot --nginx -d example.com
8. ENVIRONMENT VARIABLES
8.1 Best practices
# application-prod.yml
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: validate # Không auto-update ở production
8.2 Không commit secrets
.env
application-local.yml
9. MONITORING
9.1 Health check
management:
endpoints:
web:
exposure:
include: health
endpoint:
health:
probes:
enabled: true
livenessstate:
enabled: true
readinessstate:
enabled: true
9.2 Logging
- Tập trung log qua CloudWatch, ELK
- Set retention policy
10. CHECKLIST TRIỂN KHAI
- [ ] HTTPS được cấu hình
- [ ] Database có backup tự động
- [ ] Environment variables được bảo mật
- [ ] Health check endpoint hoạt động
- [ ] Logging được cấu hình
- [ ] Monitoring và alerting
- [ ] Auto-scaling (nếu cần)
- [ ] CI/CD pipeline
- [ ] Domain trỏ về server
- [ ] Firewall rules
11. BÀI TẬP THỰC HÀNH
Bài 1: Railway
Deploy Spring Boot app lên Railway.
Bài 2: AWS EC2
Triển khai lên EC2 với Docker.
Bài 3: HTTPS
Cấu hình HTTPS với Let's Encrypt.
12. TÓM TẮT
| Platform | Độ phức tạp | Chi phí |
|---|---|---|
| Railway | Thấp | Free tier |
| Render | Thấp | Free tier |
| Heroku | Thấp | Trả phí |
| AWS EC2 | Trung bình | Free tier 1 năm |
| AWS ECS | Cao | Theo usage |
| Kubernetes | Rất cao | Theo usage |
Hoàn thành Phase 7! Tiếp tục với Phase 8: Project thực tế cuối khóa
🧭 Điều Hướng Series
⬅️ Bài trước: BÀI 7.6: CI/CD VỚI GITHUB ACTIONS
📋 Lộ trình tổng quan: Xem Toàn Bộ Series
➡️ Bài tiếp theo: PHASE 8: PROJECT THỰC TẾ CUỐI KHÓA - Tổng Quan & Mục Tiêu
All rights reserved