Hướng dẫn

Triển khai web app lên VPS với Docker Compose + HTTPS

Mục tiêu

Đưa một web app nhỏ lên VPS của bạn với Docker Compose, HTTPS tự động qua Caddy, và đường rollback.

Điều kiện

  • VPS đã cài Docker + Docker Compose
  • Domain trỏ về IP VPS (bản ghi A)
  • Source code app + Dockerfile

Các bước

  1. Đưa code app lên VPS: clone repo vào /srv/myapp (hoặc copy file), gồm cả Dockerfile. Đảm bảo cổng 80/443 đã mở trên VPS (firewall + security group của cloud).
    git clone <your-repo-url> /srv/myapp && cd /srv/myapp

    Nếu copy file bằng tay thay vì clone, tạo thư mục trước: mkdir -p /srv/myapp, rồi copy code + Dockerfile vào đó.

  2. Trong /srv/myapp, tạo compose.yml:
    services:
      web:
        build: .
        restart: unless-stopped
        env_file: .env
        expose: ["3000"]
      caddy:
        image: caddy:2
        restart: unless-stopped
        ports: ["80:80", "443:443"]
        volumes:
          - ./Caddyfile:/etc/caddy/Caddyfile
          - caddy_data:/data
    volumes:
      caddy_data:
  3. Caddyfile (thay app.example.com bằng domain của bạn):
    app.example.com {
      reverse_proxy web:3000
    }
  4. Tạo .env trên VPS với giá trị thật — không bao giờ commit nó. Dùng placeholder trong mọi tin nhắn / log bạn chia sẻ.
  5. Triển khai:
    docker compose up -d --build
    docker compose logs -f --tail=100

Kiểm chứng

  • https://your-domain (thay app.example.com bằng domain của bạn) tải được với chứng chỉ hợp lệ (Caddy tự cấp).
  • docker compose ps hiện cả 2 service đang chạy.
  • Rollback: downtime ngắn trong lúc container restart — chạy vào giờ ít traffic nếu có thể. Các bước: checkout commit trước đó, rồi docker compose down && docker compose up -d --build.

Sửa lỗi

  • HTTPS không cấp: bản ghi A phải trỏ về IP VPS; cổng 80/443 phải mở.
  • App crash: xem docker compose logs web và audit env bằng env-doctor.
  • Trùng cổng: có thứ khác đang chiếm 80/443 — dừng nó hoặc dời Caddy.

Cập nhật lần cuối: 2026-10-16. Sửa trên GitHub · Báo lỗi

← Hướng dẫn trước · Hướng dẫn tiếp →

Vẫn kẹt? Nhờ hỗ trợ triển khai →