0

Chapter 1 — Startup: Từ Cloud VM đến lần Deploy đầu tiên

1. Mục tiêu

Thực hiện deployment một Todo App đơn giản lên AWS EC2 bằng:

GitHub
   ↓
AWS EC2
   ↓
Docker
   ↓
Docker Compose
   ↓
Nginx
   ↓
Internet

Application sử dụng:

  • Node.js
  • MySQL
  • Docker
  • Docker Compose
  • Nginx
  • AWS EC2

2. Architecture

                         Internet
                            │
                            │ HTTP :80
                            ▼
                    ┌───────────────┐
                    │   AWS EC2     │
                    │    Ubuntu     │
                    │               │
                    │    Nginx      │
                    │      │        │
                    │      ▼        │
                    │  Node.js App  │
                    │    :3000      │
                    │      │        │
                    │      ▼        │
                    │    MySQL      │
                    │    :3306      │
                    │               │
                    │ Docker Compose│
                    └───────────────┘

3. Chuẩn bị

Cần có:

□ AWS Account
□ GitHub Account
□ macOS
□ Git
□ SSH
□ Docker

4. Chạy Todo App ở Local

Clone repository:

git clone https://github.com/dockersamples/todo-list-app.git
cd todo-list-app

Kiểm tra:

ls

Chạy:

docker compose up -d --build

Kiểm tra:

docker compose ps

Mở:

http://localhost:3000

Test:

curl http://localhost:3000

5. Tạo EC2

AWS Console:

EC2
→ Instances
→ Launch Instance

Chọn:

Name:
chapter1-ec2

AMI:
Ubuntu Server 24.04 LTS

Instance type:
t3.micro

Key pair:
chapter1-key

Network:

VPC:
Default VPC

Auto-assign Public IP:
Enable

6. Security Group

Inbound rules:

✅ Allow SSH traffic from
✅ Allow HTTP traffic from the internet

Không mở:

3000
3306

7. SSH vào EC2

Download:

chapter1-key.pem

Trên Mac:

chmod 400 ./chapter1-key.pem

SSH:

ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>

8. Update Ubuntu

sudo apt update
sudo apt upgrade -y

9. Cài Git

sudo apt install git -y

Kiểm tra:

git --version

10. Cài Docker, Docker Compose

sudo apt update && \
sudo apt install -y ca-certificates curl && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt update && \
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \
sudo systemctl enable --now docker && \
docker --version && \
docker compose version

11. Kiểm Ubuntu User chạy Docker

# 
sudo usermod -aG docker $USER

Logout:

exit

SSH lại:

ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>

Test:

docker ps

12. Chạy Docker daemon

sudo systemctl start docker

13. Clone Todo App trên EC2

cd ~
git clone https://github.com/dockersamples/todo-list-app.git
cd todo-list-app

14. Deploy lần đầu

docker compose up -d --build

Kiểm tra:

docker compose ps

Test:

curl http://localhost:3000

15. Cài Nginx

sudo apt install nginx -y

Kiểm tra:

sudo systemctl status nginx

16. Cấu hình Nginx

Xóa config mặc định:

sudo rm /etc/nginx/sites-enabled/default

Tạo config:

sudo nano /etc/nginx/sites-available/todo-app

Nội dung:

server {
    listen 80;

    server_name _;

    location / {
        proxy_pass http://127.0.0.1:3000;

        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;
    }
}

17. Enable Nginx

sudo ln -s \
/etc/nginx/sites-available/todo-app \
/etc/nginx/sites-enabled/todo-app

Test:

sudo nginx -t

Restart:

sudo systemctl restart nginx

18. Test từ EC2

curl http://localhost

Todo App phải trả về response.


19. Test từ Internet

Trên Mac:

curl http://<EC2_PUBLIC_IP>

Hoặc mở:

http://<EC2_PUBLIC_IP>

Kết quả:

Internet
   ↓
EC2 :80
   ↓
Nginx
   ↓
Node.js :3000
   ↓
MySQL :3306

20. Deploy lần 2

Sửa application:

cd ~/todo-list-app

Thay đổi code.

Ví dụ:

Todo App

thành:

Todo App - Chapter 1

Commit:

git add .
git commit -m "update todo app"

Push:

git push

21. Manual Deployment

SSH vào EC2:

ssh -i ~/Downloads/chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
cd ~/todo-list-app

Pull:

git pull

Build:

docker compose build

Deploy:

docker compose up -d

Kiểm tra:

docker compose ps

22. Kiểm tra version mới

Mở:

http://<EC2_PUBLIC_IP>

Version mới phải xuất hiện.


23. Deployment Flow

Sau Chapter 1:

Developer
    │
    ▼
  GitHub
    │
    │ SSH
    ▼
 AWS EC2
    │
    ├── git pull
    │
    ├── docker compose build
    │
    └── docker compose up -d

24. Architecture hoàn chỉnh

                    ┌──────────────┐
                    │    GitHub    │
                    └──────┬───────┘
                           │
                        git pull
                           │
                           ▼
                  ┌─────────────────┐
                  │     AWS EC2     │
                  │                 │
                  │     Nginx       │
                  │       │         │
                  │       ▼         │
                  │   Node.js App   │
                  │       │         │
                  │       ▼         │
                  │     MySQL       │
                  │                 │
                  │ Docker Compose  │
                  └─────────────────┘

25. Checklist

□ AWS EC2
□ Ubuntu
□ SSH
□ Git
□ Docker
□ Docker Compose
□ Clone Todo App
□ Deploy Todo App
□ MySQL Container
□ Nginx
□ Reverse Proxy
□ Security Group
□ Public IP
□ Truy cập từ Internet
□ Deploy lần 1
□ Sửa code
□ git push
□ git pull
□ Deploy lần 2
□ Manual Deployment

Chapter 1 kết thúc ở đây.

              CHAPTER 1
                  │
                  ▼
        Manual Deployment
                  │
                  ▼
      "Deploy nhiều lần bắt đầu
           trở thành bottleneck"
                  │
                  ▼
              CHAPTER 2
                  │
                  ▼
              CI / CD

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí