EQVPS

วิธี deploy สแตก Docker Compose บน VPS

Deploy สแตกหลายคอนเทนเนอร์บน VPS ด้วย Docker Compose: เขียน docker-compose.yml, เก็บ secret ไว้ใน .env, ยกขึ้นแบบรีสตาร์ท-เมื่อรีบูต, และเผยแพร่เฉพาะพอร์ตที่คุณตั้งใจ ตัวอย่างคัดลอก-วางพร้อมเว็บแอป ฐานข้อมูล และ reverse proxy

Docker Compose อธิบายสแตกหลายคอนเทนเนอร์ในไฟล์เดียวและรันด้วยคำสั่งเดียว นี่คือคู่มือ deploy; ก่อนอื่น ติดตั้ง Docker หากยังไม่ได้ทำ สำหรับสแตกเฉพาะเอเจนต์ AI (เอเจนต์ + vector DB + Redis) ดู docker-compose สำหรับเอเจนต์ AI

1. สแตก: แอป + ฐานข้อมูล + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

secret อยู่ใน .env ไม่ใช่ในไฟล์ compose เด็ดขาด:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Caddyfile ขั้นต่ำทำ proxy โดเมนของคุณไปยังแอปและดึง HTTPS มาเอง:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. ยกมันขึ้น

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped ในทุกบริการ + Docker เปิดตอนบูต = สแตกกลับมาเองหลังรีบูต

3. คำสั่งประจำวัน

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

ส่วนที่คนมักทำผิด: พอร์ตที่เปิดเผย

Docker เผยแพร่พอร์ต ผ่าน iptables ดังนั้นคอนเทนเนอร์ที่มี ports: ["5432:5432"] จึงเข้าถึงได้จากอินเทอร์เน็ตแม้อยู่หลังไฟร์วอลล์ UFW ที่คุณคิดว่าปิดแล้ว เผยแพร่ เฉพาะ จุดเข้าสาธารณะ (proxy บน 80/443); เก็บฐานข้อมูลและแคชไว้บนเครือข่าย compose หรือผูกกับ 127.0.0.1 อะไรก็ตามที่ให้บริการทราฟฟิกเว็บต้องมี แพ็กเกจ IP เฉพาะ; จับคู่กับ ไฟร์วอลล์ UFW

สำหรับสแตกทั้งชุดหลัง IP เดียว ดู self-host หลายบริการ root ในราวหนึ่งนาที NVMe ไม่ต้อง KYC จ่ายด้วยคริปโต

คำถามที่พบบ่อย

จะ deploy สแตก Docker Compose บน VPS อย่างไร?

ติดตั้ง Docker พร้อมปลั๊กอิน Compose, เขียน docker-compose.yml ที่อธิบายแต่ละบริการ, เก็บ secret ไว้ใน .env ที่ git ละเว้น, แล้ว docker compose up -d ตั้ง restart: unless-stopped ในแต่ละบริการและเปิด Docker ตอนบูตเพื่อให้สแตกรอดจากการรีบูต ตัวอย่างด้านล่างรันเว็บแอป, Postgres และ reverse proxy Caddy

secret ไปอยู่ที่ไหน — ในไฟล์ compose?

ไม่ ใส่ไว้ในไฟล์ .env (chmod 600, git ละเว้น) และอ้างอิงเป็น ${VAR} ใน compose หรือใช้ Docker secrets อย่า commit รหัสผ่านหรือคีย์ API ลง docker-compose.yml เด็ดขาด — ไฟล์ที่รั่วพร้อมข้อมูลรับรองที่ใช้งานได้คือความผิดพลาดคลาสสิก

สแตกจะกลับมาหลังรีบูตไหม?

เฉพาะเมื่อคุณสั่ง ตั้ง restart: unless-stopped (หรือ always) ในแต่ละบริการและเปิด Docker ตอนบูต (systemctl enable docker) แล้ว docker compose up -d จะรอดจากการรีบูตและรีสตาร์ทคอนเทนเนอร์ที่แครช

พอร์ตไหนถูกเปิดเผย?

เฉพาะที่คุณเผยแพร่ด้วย ports: ผูกบริการภายใน (ฐานข้อมูล, แคช) เข้ากับเครือข่าย compose หรือ 127.0.0.1 และเผยแพร่เฉพาะจุดเข้าสาธารณะ — โดยทั่วไปคือ reverse proxy บน 80/443 Docker เผยแพร่ผ่าน iptables ดังนั้นบรรทัด ports: ที่เผลอใส่จึงเข้าถึงได้จากอินเทอร์เน็ตแม้อยู่หลัง UFW

คุณขอบัตรประชาชนหรือบัตรเครดิตไหม?

ไม่ อีเมลเพื่อสมัคร จ่ายด้วย USDC หรือ USDT — ไม่มีเอกสาร ไม่มีบัตร root ในราวหนึ่งนาที

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง