7 คะแนน โดย GN⁺ 2024-08-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

Dokku คืออะไร?

  • Dokku เป็น Platform as a Service (PaaS) แบบโอเพนซอร์สที่ทำงานบนเซิร์ฟเวอร์เครื่องเดียว
  • คล้าย Heroku แต่ผู้ใช้เป็นเจ้าของเอง
  • เหมาะสำหรับผู้ที่ต้องการแพลตฟอร์มเซิร์ฟเวอร์เลสที่คุ้มค่าและใช้งานง่าย
  • ผู้เขียนรันเซิร์ฟเวอร์ Dokku บน VPS ราคา $7 ต่อเดือนจาก OVHcloud

ความสามารถหลักของ Dokku

  • ใช้งานง่าย (คล้าย Heroku)
  • จัดการใบรับรอง SSL อัตโนมัติผ่าน Let’s Encrypt
  • รองรับ Basic Auth เพื่อป้องกันเว็บไซต์ด้วยรหัสผ่าน
  • ขยายและลดขนาดได้ด้วยคำสั่งเดียว
  • ยืดหยุ่นพอสำหรับแอปพลิเคชันหลากหลายประเภท เช่น Node, Python เป็นต้น
  • ดีพลอยได้ง่ายด้วยคำสั่ง git

ตัวอย่าง Dokku แบบขั้นต่ำ

ดีพลอยแอปพลิเคชันด้วย Docker container

  • วาง Dockerfile ไว้ที่ root ของ git repository
  • ใช้สคริปต์ entrypoint.sh เพื่อรันแอปพลิเคชันทั้งบนเครื่องโลคัลหรือใน Docker container
  • สร้างแอปพลิเคชันบนโฮสต์ Dokku
  • เพิ่ม Dokku host เป็น remote จากเครื่องโลคัลแล้ว push ขึ้นไป
FROM python:3.10
COPY . /app
WORKDIR /app
RUN pip install .
WORKDIR /app/
ENTRYPOINT ["./entrypoint.sh"]
#!/bin/bash
exec uvicorn main:app --port "$PORT" --host 0.0.0.0
dokku apps:create myapp
git remote add dokku dokku@dokku:myapp
git push dokku main

ดีพลอยเว็บไซต์แบบสแตติก

  • ใช้ Dokku เพื่อดีพลอยเว็บไซต์แบบสแตติกจาก GitHub repository แบบ private ได้ง่าย และตั้งรหัสผ่านป้องกันได้
  • ตั้งค่าตัวแปรแวดล้อม NGINX_ROOT เพื่อให้ NGINX ให้บริการเว็บไซต์แบบสแตติก
  • ติดตั้งและตั้งค่าปลั๊กอินสำหรับ basic auth
dokku apps:create mysite
dokku config:set static-site NGINX_ROOT=_site
sudo dokku plugin:install https://github.com/dokku/dokku-http-auth.git
sudo chmod +x /home/dokku
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
git push dokku main
dokku http-auth:enable mysite <username> <password>

SSL / HTTPS

  • สามารถตั้งค่า HTTPS ได้ด้วยปลั๊กอิน Let’s Encrypt
  • หากใช้ Cloudflare การปล่อยให้ Cloudflare จัดการส่วนนี้มักจะง่ายกว่า

การดีพลอยด้วย GitHub Actions

  • สามารถใช้ GitHub Actions เพื่อดีพลอยแอป Dokku แบบอัตโนมัติได้
  • ตัวอย่างเวิร์กโฟลว์ GitHub Action
name: CI
on:
  workflow_dispatch:
  push:
    branches: [main]
jobs:
  deploy-dokku:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Install SSH key
        run: |
          echo "${{ secrets.DOKKU_SSH_PRIVATE_KEY }}" > private_key.pem
          chmod 600 private_key.pem
      - name: Add remote and push
        run: |
          git remote add dokku dokku@rechat.co:llm-eval
          GIT_SSH_COMMAND="ssh -i private_key.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push dokku main -f

เคล็ดลับอื่น ๆ

  • สามารถรันคำสั่งจากระยะไกลได้
  • ล้าง Docker cache
  • รีบิลด์โดยไม่ต้อง push
ssh dokku@rechat.co apps:list
ssh dokku@rechat.co repo:purge-cache llm-eval
ssh dokku@rehcat.co ps:rebuild llm-eval

ทำไมถึงเขียนบทความนี้?

  • ผู้เขียนเขียนไว้เพราะต้องคอยค้นหารายละเอียดทุกครั้งที่ดีพลอยแอปพลิเคชันใหม่
  • หวังว่าจะเป็นประโยชน์กับคนอื่นด้วย

สรุปโดย GN⁺

  • Dokku เป็นแพลตฟอร์ม PaaS แบบโอเพนซอร์สที่คุ้มค่าและใช้งานง่าย
  • มีความสามารถที่ช่วยให้ดีพลอยและจัดการแอปพลิเคชันหลากหลายประเภทได้ง่าย
  • สามารถทำ automated deployment ได้ด้วยเครื่องมืออย่าง GitHub Actions
  • เมื่อใช้งานร่วมกับบริการอย่าง Cloudflare จะยิ่งสะดวกขึ้น
  • โปรเจกต์อื่นที่ให้ความสามารถคล้ายกัน ได้แก่ Heroku, Fly.io เป็นต้น

1 ความคิดเห็น

 
GN⁺ 2024-08-27
ความคิดเห็นบน Hacker News
  • ช่วงนี้กำลังสนุกกับการใช้ Dokploy

    • คล้ายกับ Dokku แต่มีเว็บ UI ที่ดีกว่า
    • ทำให้การดีพลอยโซลูชัน Docker/Compose ง่ายขึ้น และมีฟีเจอร์ LetsEncrypt อัตโนมัติในตัว
    • ตั้งค่าเวิร์กโฟลว์ GitHub Actions เพื่อทำให้การดีพลอยแอปเป็นอัตโนมัติ
    • ยังมีไฟล์ Compose ที่ตั้งค่าไว้ล่วงหน้าสำหรับแอปหลากหลายประเภท
  • หลังจากลองดูโซลูชัน "self-hosted Heroku" หลายตัว ก็เลือก Dokku

    • ต้องพึ่ง "เวทมนตร์" น้อยที่สุด และถึงจะเลิกใช้ก็ถอดออกได้ง่าย
    • นักพัฒนาตอบสนองไวมาก และช่วยทำปลั๊กอินแบบคัสตอมให้
    • ได้บันทึกเรื่องนี้ไว้ในบล็อก
  • เวลาลองใช้ซอฟต์แวร์ใหม่มักเจอปัญหาได้ แต่กับ Dokku ไม่ค่อยเป็นแบบนั้น

    • นอกจากปัญหาเรื่องลำดับอาร์กิวเมนต์ของ CLI บางอย่างแล้ว ก็ทำงานได้ดี
    • ถ้าใช้งานมากขึ้น ก็อยากกำหนดสถาปัตยกรรมทั้งหมดด้วยไฟล์คอนฟิกแบบประกาศ
  • Dokku ทำให้การตั้งค่า HTTPS ง่ายผ่านปลั๊กอิน Let's Encrypt

    • กำลังใช้ TLS ผ่าน Cloudflare
    • ต้องระวังไม่ให้เว็บไซต์ส่วนตัวถูกส่งผ่านแบบ plaintext
  • เคยใช้ Dokku ก่อนจะย้ายไปสร้าง Docker image และดีพลอยด้วย Swarm

    • กลายเป็นแรงจูงใจให้พัฒนา Lunni ซึ่งเป็น PaaS แบบ self-hosted
    • ชอบแนวคิดที่ให้ทุกอย่างรันบนเซิร์ฟเวอร์ที่ตัวเองเป็นเจ้าของ แทน Heroku หรือ AWS
    • ค่าใช้จ่ายรายเดือนที่คาดการณ์ได้ช่วยให้สบายใจขึ้น
  • Coolify กำลังได้รับความนิยมมากขึ้น และทำให้องค์กรทุกขนาดสามารถรันซอฟต์แวร์แบบ self-hosted ได้ฟรีอย่างง่ายดาย

    • Coolify เป็นทางเลือกแบบโอเพนซอร์สและ self-hosted สำหรับ Heroku/Netlify/Vercel
  • Dokku เป็นผลิตภัณฑ์ที่น่าทึ่ง และผู้ก่อตั้งก็ถ่อมตัวและให้ความช่วยเหลือดีมาก

    • อยากให้มีคนช่วยสนับสนุนทางการเงินมากกว่านี้
  • สงสัยว่าสำหรับอินฟราสตรักเจอร์ประเภทนี้ คนใช้ไฟล์/อ็อบเจ็กต์สตอเรจอะไรกัน

    • ถ้าใช้ AWS ค่า egress อาจทำให้เงินที่ประหยัดได้หายไปหมด
  • ประสบการณ์การใช้ Dokku ไม่ค่อยดีนัก

    • เวลา VPS ล่มแล้วรีสตาร์ต แอปไม่กลับมารันอีก
    • สุดท้ายเลยย้ายไปใช้การตั้งค่า k8s แบบโหนดเดียว
  • สามารถใช้ traefik + podman มาตรฐาน + การผสานรวมกับ systemd ได้

    • มีเอกสารและลิงก์ที่เกี่ยวข้องให้