tva
← บทความเชิงลึก

ติดตั้งและดูแล Windmill เองในปี 2026: Worker, PostgreSQL, การแยกระบบ และการอัปเกรดอย่างปลอดภัย

บทความต่อยอดที่เน้นการใช้งานจริง โดยนำแนวทางจากผู้พัฒนามาใช้กำหนดมาตรการควบคุมการดำเนินงาน การตัดสินใจย้ายระบบ และเกณฑ์ตรวจรับการปล่อยระบบที่ตรวจสอบได้

สิ่งที่เปลี่ยนไปในปี 2026

เรากลับมาทบทวนหัวข้อนี้เพราะขอบเขตการดำเนินงานเปลี่ยนไป หลักการที่ใช้ได้ในระยะยาวยังมีประโยชน์ แต่เวอร์ชันปัจจุบันทำให้ทางลัดเดิมบางอย่างไม่ครบถ้วนหรือไม่ปลอดภัย บทความนี้เริ่มจากเอกสารของผู้พัฒนาที่มีอยู่ ณ วันที่ 14 กรกฎาคม 2026 แยกข้อเท็จจริงออกจากการตัดสินใจเฉพาะระบบ และถือว่าการเปลี่ยนค่ากำหนดทุกครั้งเป็นการเปลี่ยนระบบใช้งานจริงที่ต้องควบคุม

แหล่งข้อมูลปฐมภูมิปัจจุบัน

แนวทางใช้บทความฉบับปรับปรุง

อ่านแหล่งข้อมูลก่อน บันทึกเวอร์ชันที่นำขึ้นใช้งานจริง และกำหนดผลลัพธ์ที่สังเกตได้ก่อนเปลี่ยนค่าใด ๆ ทดสอบการเปลี่ยนแปลงที่เล็กที่สุดและย้อนกลับได้ในสภาพแวดล้อมที่เป็นตัวแทนของระบบจริง คำสั่งที่ทำงานสำเร็จไม่ใช่เกณฑ์ตรวจรับ เกณฑ์คือสถานะบริการ ความสมบูรณ์ของข้อมูล เวลาหน่วง ขอบเขตความปลอดภัย และเวลาในการย้อนกลับ ลำดับการวินิจฉัยจากคู่มือเดิมที่ยังใช้ได้จะคงไว้เป็นพื้นฐานด้านการดำเนินงาน แต่ตัวอย่างที่ขึ้นกับเวอร์ชันต้องตรวจเทียบกับเอกสารปัจจุบันเสมอ

ก่อนปล่อยระบบ ให้บันทึกความต่างของค่ากำหนด เตรียมข้อมูลสำรองหรือ snapshot ที่ทดสอบกู้คืนมาแล้วอย่างน้อยหนึ่งครั้ง และระบุคำสั่งย้อนกลับการเปลี่ยนแปลง มอบหมายคนหนึ่งให้เฝ้าติดตามช่วงแรกที่ใช้งานจริง และอีกคนให้อนุมัติการยกระดับปัญหาเมื่อค่าชี้วัดเปลี่ยนไปในทิศทางที่ไม่เป็นไปตามคาด การแจ้งเตือนควรอธิบายความเสี่ยงที่ผู้ใช้รับรู้ ไม่ใช่เพียงชื่อส่วนประกอบที่ส่งสัญญาณ ระหว่างช่วงตรวจผล ให้เปรียบเทียบอัตราข้อผิดพลาด จำนวนงานในคิว การใช้ทรัพยากรจนเต็ม เวลาหน่วงในการประมวลผล และความครบถ้วนของข้อมูลกับค่าอ้างอิงตั้งต้นที่ตกลงกัน ตรวจทั้งค่าเฉลี่ยและค่าที่ปลายการกระจาย เพราะค่าเฉลี่ยที่คงที่อาจซ่อนความล้มเหลวที่กระทบงานส่วนน้อยแต่สำคัญ ปิดรายการเปลี่ยนแปลงได้ต่อเมื่องานที่ล่าช้า การลองใหม่ งานตามกำหนดเวลา และการส่งออกไปยังระบบปลายทางเสร็จครบ บันทึกทุกขั้นตอนที่ทำด้วยมือระหว่างกู้คืน หากมีขั้นตอนช่วยกู้ระบบที่ไม่อยู่ในเอกสาร แสดงว่าคู่มือปฏิบัติงานยังไม่สมบูรณ์ วินัยในการปล่อยระบบนี้สร้างหลักฐานที่นำกลับมาใช้ในการอัปเกรดครั้งถัดไปได้ แทนที่จะให้ทีมต้องค้นหาความสัมพันธ์ระหว่างส่วนต่าง ๆ ใหม่ทุกครั้ง

พื้นฐานการดำเนินงาน

แพลตฟอร์มอัตโนมัติสำหรับเวิร์กโฟลว์เป็นสิ่งจำเป็นสำหรับทีมพัฒนาสมัยใหม่ แต่โซลูชันคลาวด์อย่าง Windmill Cloud อาจมีราคาแพงขึ้นเมื่อการใช้งานเติบโต เราจะแสดงวิธีตั้งค่าอินสแตนซ์ Windmill ของคุณเองบน Ubuntu ด้วย Docker Compose และการเชื่อมต่อกับ Traefik โดยเอาชนะปัญหาการยืนยันตัวตน PostgreSQL ที่สำคัญซึ่งอาจทำให้การติดตั้งของคุณล้มเหลว

สิ่งที่คุณจะสร้าง

เมื่อทำตามคู่มือนี้ครบ คุณจะมี:

  • การติดตั้ง Windmill ที่ทำงานได้อย่างสมบูรณ์พร้อม HTTPS
  • ใบรับรอง SSL อัตโนมัติผ่าน Let’s Encrypt ผ่าน Traefik
  • ฐานข้อมูล PostgreSQL สำหรับสภาพแวดล้อมใช้งานจริงพร้อมการยืนยันตัวตนที่เหมาะสม
  • การกำหนดค่า worker ให้ใช้ทรัพยากรอย่างมีประสิทธิภาพ
  • เชื่อมต่อกับโครงสร้างพื้นฐาน Docker ที่มีอยู่
  • การตั้งค่าสำหรับสภาพแวดล้อมใช้งานจริงสำหรับระบบอัตโนมัติเวิร์กโฟลว์ระดับมืออาชีพ

ค่าใช้จ่ายรายเดือน: เริ่มต้นที่ €5.99 ไม่รวม VAT รวมที่อยู่ IPv4 หลักหนึ่งที่อยู่ (Hetzner CX23, RAM 4GB ณ เดือนตุลาคม 2026) + ค่าโดเมน – โครงสร้างพื้นฐานเดียวกันที่สามารถรองรับเครื่องมืออัตโนมัติหลายตัว

ข้อกำหนดเบื้องต้น

  • เซิร์ฟเวอร์ Ubuntu 24.04 LTS ที่ติดตั้ง Docker และ Docker Compose แล้ว
  • การตั้งค่า Traefik reverse proxy ที่มีอยู่ (ดูคู่มือการตั้งค่า n8n ของเราสำหรับการกำหนดค่า Traefik)
  • ชื่อโดเมนที่ชี้ไปยัง IP เซิร์ฟเวอร์ของคุณ
  • แนะนำ RAM อย่างน้อย 4GB และ 2 vCPUs
  • การเข้าถึง SSH และความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง

ทำความเข้าใจ Windmill

Windmill เป็นเอนจินเวิร์กโฟลว์โอเพนซอร์สที่มีความสามารถดังนี้:

  • ตัวแก้ไขเวิร์กโฟลว์แบบภาพ พร้อมรองรับ TypeScript/Python/Go
  • การกำหนดเวลารันงาน และการจัดการการรัน
  • ความสามารถในการเชื่อมต่อผ่าน API
  • ฟีเจอร์การทำงานร่วมกันเป็นทีม
  • ติดตั้งและดูแลเองได้ โดยมีจำนวนการรันไม่จำกัดใน Community Edition ที่ใช้งานฟรี

ต่างจากแนวทางแบบโหนดของ n8n ตรงที่ Windmill เน้นเวิร์กโฟลว์ที่ใช้โค้ดเป็นหลักด้วยสภาพแวดล้อมการพัฒนาที่ทรงพลัง

ขั้นตอนที่ 1: การเตรียมเซิร์ฟเวอร์และโครงสร้างไดเรกทอรี

ก่อนอื่น มาเตรียมสภาพแวดล้อมเซิร์ฟเวอร์ของเรา เราจะใช้หลักการตั้งชื่อตามอาหารสำหรับอินสแตนซ์ Windmill เพื่อหลีกเลี่ยงความขัดแย้ง:

# Create Windmill directory (first instance: "pizza")
mkdir -p /opt/windmill-pizza
cd /opt/windmill-pizza

# Create required subdirectories
mkdir -p postgres-data windmill-data lsp-cache

# Verify directory structure
ls -la

หลักการตั้งชื่อ: ใช้ชื่ออาหารง่าย ๆ สำหรับอินสแตนซ์ Windmill หลายตัว:

  • อินสแตนซ์แรก: pizza
  • อินสแตนซ์เพิ่มเติม: pasta, salad, soup, burger ฯลฯ
  • ช่วยหลีกเลี่ยงความขัดแย้งและทำให้การจัดการง่ายขึ้น

ขั้นตอนที่ 2: การกำหนดค่าสภาพแวดล้อม

สร้างไฟล์สภาพแวดล้อมที่ปลอดภัยด้วยข้อมูลรับรองที่เหมาะสม:

# Generate a secure hex password (no special characters!)
SECURE_PASSWORD=$(openssl rand -hex 16)

# Create environment file
cat > /opt/windmill-pizza/.env << EOF
# Windmill Image Version (pin a release; change it deliberately when you update)
WM_IMAGE=ghcr.io/windmill-labs/windmill:1.767.0

# Database Configuration - SECURE PASSWORDS
DATABASE_URL=postgresql://postgres:${SECURE_PASSWORD}@windmill-db:5432/windmill_pizza?sslmode=disable
POSTGRES_PASSWORD=${SECURE_PASSWORD}
POSTGRES_DB=windmill_pizza
POSTGRES_USER=postgres

# Windmill Configuration
BASE_URL=https://windmill.yourdomain.com
RUST_LOG=info

# Worker Configuration
WORKER_GROUP=default
KEEP_JOB_DIR=false

# Instance Identifier
INSTANCE_NAME=pizza
EOF

# The file holds the database password: make it readable by its owner only
chmod 600 /opt/windmill-pizza/.env

สำคัญ: แทนที่ windmill.yourdomain.com ด้วยโดเมนจริงของคุณ!

ขั้นตอนที่ 3: การกำหนดค่า Docker Compose

สร้างการกำหนดค่า Docker Compose หลัก:

cat > /opt/windmill-pizza/docker-compose.yml << 'EOF'
services:
  # PostgreSQL Database for Windmill
  windmill-db:
    image: postgres:16
    container_name: windmill-pizza-db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    networks:
      - proxy
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Windmill Server
  windmill-server:
    image: ${WM_IMAGE}
    container_name: windmill-pizza-server
    restart: unless-stopped
    environment:
      - DATABASE_URL=${DATABASE_URL}
      - BASE_URL=${BASE_URL}
      - RUST_LOG=${RUST_LOG}
      - MODE=server
    networks:
      - proxy
    depends_on:
      windmill-db:
        condition: service_healthy
    volumes:
      - ./windmill-data:/tmp/windmill
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.windmill-pizza.rule=Host(`windmill.yourdomain.com`)"
      - "traefik.http.routers.windmill-pizza.entrypoints=https"
      - "traefik.http.routers.windmill-pizza.tls.certresolver=letsencrypt"
      - "traefik.http.services.windmill-pizza.loadbalancer.server.port=8000"

  # Windmill Worker
  windmill-worker:
    image: ${WM_IMAGE}
    container_name: windmill-pizza-worker
    restart: unless-stopped
    environment:
      - DATABASE_URL=${DATABASE_URL}
      - BASE_URL=${BASE_URL}
      - RUST_LOG=${RUST_LOG}
      - MODE=worker
      - WORKER_GROUP=${WORKER_GROUP}
      - KEEP_JOB_DIR=${KEEP_JOB_DIR}
    networks:
      - proxy
    depends_on:
      windmill-db:
        condition: service_healthy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./windmill-data:/tmp/windmill
      - worker_dependency_cache:/tmp/windmill/cache
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G

networks:
  proxy:
    external: true

volumes:
  worker_dependency_cache:
    driver: local
EOF

สำคัญ: อัปเดตโดเมนใน label ของ Traefik ให้ตรงกับการตั้งค่าของคุณ!

ขั้นตอนที่ 4: ปัญหารหัสผ่าน PostgreSQL (ปัญหาสำคัญ)

นี่คือจุดที่การติดตั้ง Windmill ส่วนใหญ่ล้มเหลว และต้องใช้การแก้ไขปัญหาอย่างมากเพื่อระบุสาเหตุหลัก:

ปัญหา: อักขระพิเศษในรหัสผ่าน

เมื่อใช้ openssl rand -base64 32 เพื่อสร้างรหัสผ่าน ผลลัพธ์อาจมีอักขระ +, / และ = ภายใน DATABASE_URL ต้องเข้ารหัสอักขระเหล่านี้แบบเปอร์เซ็นต์ หากไม่เข้ารหัส อาจทำให้การแยกวิเคราะห์ URL ผิดพลาดและแสดงอาการเป็นการยืนยันตัวตน PostgreSQL ล้มเหลว การใช้รหัสผ่านฐานสิบหกช่วยให้ไม่ต้องทำขั้นตอนการเข้ารหัสนี้เลย

ตัวอย่างรหัสผ่านที่มีปัญหา:

# Unless percent-encoded, the "/" in this password breaks DATABASE_URL:
PASSWORD="305t6m9KrChkvbyN/FLEYQ6pqAGlApn9rbJPH3D5y9g="

วิธีแก้: รหัสผ่านที่ใช้อักขระฐานสิบหกเท่านั้น

ใช้รหัสผ่านที่ประกอบด้วยอักขระฐานสิบหกเท่านั้น จึงไม่มีอักขระพิเศษ:

# This WORKS reliably:
PASSWORD=$(openssl rand -hex 16)
# Example result: 5781b14ec0ec1bc184653ffa5e379411

ปัญหาการกำหนดค่า PostgreSQL เพิ่มเติม

  • การกำหนดค่าผู้ใช้: ใช้ผู้ใช้ระดับ superuser ชื่อ postgres ตามตัวอย่างการกำหนดค่าของ Windmill ผู้ใช้ที่กำหนดเองจะใช้งานได้ก็ต่อเมื่อได้รับบทบาท windmill_admin และ windmill_user ที่กระบวนการย้ายโครงสร้างฐานข้อมูลของ Windmill ต้องใช้แล้วเท่านั้น (ดูเอกสารการติดตั้งและดูแลระบบเองของ Windmill)
  • การเก็บข้อมูลถาวรในวอลุ่ม: PostgreSQL จะไม่สนใจตัวแปรสภาพแวดล้อม POSTGRES_PASSWORD เมื่อวอลุ่มข้อมูลที่มีอยู่มีข้อมูลรับรองที่แตกต่างกัน
  • รูปแบบ URL: ใส่ ?sslmode=disable ใน URL ฐานข้อมูลเมื่อเข้าถึงฐานข้อมูลได้เฉพาะผ่านเครือข่าย Docker ภายใน ตามตัวอย่างการกำหนดค่าของ Windmill สำหรับฐานข้อมูลที่เข้าถึงผ่านเครือข่ายอื่น ให้ใช้โหมด SSL เช่น require

ขั้นตอนที่ 5: การติดตั้งและเริ่มต้น

มาติดตั้ง Windmill ด้วยการกำหนดค่าที่แก้ไขแล้วของเรา:

cd /opt/windmill-pizza

# Verify configuration syntax
docker compose config --quiet

# Pull images
docker compose pull

# Start services
docker compose up -d

# Check status
docker compose ps

คุณควรเห็นผลลัพธ์เช่น:

NAME                    STATUS                    PORTS
windmill-pizza-db       Up (healthy)              5432/tcp
windmill-pizza-server   Up                        8000/tcp
windmill-pizza-worker   Up                        8000/tcp

ขั้นตอนที่ 6: การแก้ไขปัญหาที่พบบ่อย

ปัญหา 1: การยืนยันตัวตน PostgreSQL ล้มเหลว

อาการ:

windmill-pizza-server | Error: password authentication failed for user "postgres"

วิธีแก้ไข: การรีเซ็ตฐานข้อมูลจะลบข้อมูล Windmill ทั้งหมด ให้ทำเฉพาะในการติดตั้งใหม่หรือหลังจากสำรองข้อมูลและตรวจสอบข้อมูลสำรองแล้วเท่านั้น

# WARNING: this deletes all Windmill data (fresh install or verified backup only)
cd /opt/windmill-pizza

# Stop containers
docker compose down --volumes

# Remove old data
rm -rf /opt/windmill-pizza/postgres-data/*

# Regenerate hex password and write it to both variables
NEW_PASSWORD=$(openssl rand -hex 16)
sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$NEW_PASSWORD/" .env
sed -i "s|^DATABASE_URL=postgresql://postgres:[^@]*@|DATABASE_URL=postgresql://postgres:$NEW_PASSWORD@|" .env

# Restart
docker compose up -d

ปัญหา 2: คอนเทนเนอร์ไม่เริ่มทำงาน

อาการ:

  • คอนเทนเนอร์หยุดทำงานทันที
  • ข้อผิดพลาดการจัดสรรทรัพยากร

วิธีแก้ไข:

# Check container logs
docker logs windmill-pizza-server
docker logs windmill-pizza-db

# Check system resources
docker stats
free -h

ปัญหา 3: ปัญหาใบรับรอง SSL

อาการ:

  • HTTPS ไม่ทำงาน
  • ข้อผิดพลาดใบรับรอง

วิธีแก้ไข:

# Check Traefik logs
docker logs traefik

# Verify DNS resolution
nslookup windmill.yourdomain.com

# Restart Traefik if needed
docker restart traefik

ขั้นตอนที่ 7: การเข้าถึงและการตั้งค่าเบื้องต้น

เมื่อการติดตั้งเสร็จสมบูรณ์:

  • เข้าถึง Windmill: https://windmill.yourdomain.com
  • ข้อมูลรับรองค่าเริ่มต้น:

อีเมล: [email protected]

  • รหัสผ่าน: changeme
  • ดำเนินการตั้งค่าให้เสร็จ:

เปลี่ยนรหัสผ่านผู้ดูแลระบบ

  • กำหนดค่า URL หลัก
  • ตั้งค่าบัญชีผู้ใช้

ขั้นตอนที่ 8: การเพิ่มประสิทธิภาพทรัพยากร

การจัดสรรหน่วยความจำ (สำหรับเซิร์ฟเวอร์ 8GB)

การกำหนดค่าของเราจัดสรรทรัพยากรอย่างมีประสิทธิภาพ:

  • Windmill Server: ~800MB
  • Windmill Worker: 2GB (จำกัด)
  • PostgreSQL: ~500MB
  • สำรองสำหรับระบบ: ~4.7GB

การจัดสรร CPU (สำหรับเซิร์ฟเวอร์ 4 vCPU)

  • Worker: 1 vCPU (จำกัด)
  • บริการอื่น ๆ: 3 vCPUs (ใช้ร่วมกัน)

หลักการขยายขนาด: 1 worker ต่อ vCPU โดยมี RAM 1-2GB ต่อ worker

ขั้นตอนที่ 9: การเตรียมความพร้อมสำหรับการใช้งานจริง

สร้างสคริปต์สำรองข้อมูล

cat > /opt/windmill-pizza/backup.sh << 'EOF'
#!/bin/bash
set -euo pipefail
umask 077

# docker compose needs the project directory, also when run from cron
cd /opt/windmill-pizza

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE=/opt/backups/windmill_pizza_${DATE}.sql
mkdir -p /opt/backups

if ! docker compose exec -T windmill-db pg_dump -U postgres windmill_pizza > "$BACKUP_FILE" || [ ! -s "$BACKUP_FILE" ]; then
  rm -f "$BACKUP_FILE"
  echo "Backup FAILED" >&2
  exit 1
fi
echo "Backup created: $BACKUP_FILE"
EOF

chmod +x /opt/windmill-pizza/backup.sh

ตั้งค่าการเฝ้าติดตาม

cd /opt/windmill-pizza

# Monitor container health
docker compose ps

# Check resource usage
docker stats

# Monitor logs
docker compose logs -f windmill-server

กำหนดค่าการอัปเดตอัตโนมัติ

cat > /opt/windmill-pizza/update.sh << 'EOF'
#!/bin/bash
set -euo pipefail
cd /opt/windmill-pizza

# Back up first; stop here if the backup fails
./backup.sh

# Pull and start the images set in .env (raise WM_IMAGE there to update Windmill)
docker compose pull
docker compose up -d
EOF

chmod +x /opt/windmill-pizza/update.sh

ขั้นตอนที่ 10: การกำหนดค่าขั้นสูง

การเชื่อมต่อกับ SMTP ที่มีอยู่

หากคุณมี mailserver (เช่นจากการตั้งค่า n8n ของเรา) เชื่อมต่อเข้ากับ Windmill:

# Add to docker-compose.yml environment for windmill-server:
- SMTP_HOST=mailserver
- SMTP_PORT=25
- [email protected]
# Only if your mail server requires authentication:
# - SMTP_USERNAME=...
# - SMTP_PASSWORD=...

Windmill หลายอินสแตนซ์

สำหรับทีมที่ต้องการสภาพแวดล้อมที่แยกจากกัน:

# Create second instance from the configuration files only (not the data)
mkdir -p /opt/windmill-pasta/{postgres-data,windmill-data,lsp-cache}
cp /opt/windmill-pizza/{.env,docker-compose.yml,backup.sh,update.sh} /opt/windmill-pasta/
chmod 600 /opt/windmill-pasta/.env
cd /opt/windmill-pasta

# Update names, paths and domain
sed -i 's/pizza/pasta/g' .env docker-compose.yml backup.sh update.sh
sed -i 's/windmill.yourdomain.com/pasta.yourdomain.com/g' .env docker-compose.yml

# Generate new password and write it to both variables
NEW_PASSWORD=$(openssl rand -hex 16)
sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$NEW_PASSWORD/" .env
sed -i "s|^DATABASE_URL=postgresql://postgres:[^@]*@|DATABASE_URL=postgresql://postgres:$NEW_PASSWORD@|" .env

# Start the new instance
docker compose up -d

ข้อพิจารณาด้านความปลอดภัย

การแยกเครือข่าย

  • PostgreSQL เข้าถึงได้เฉพาะจากคอนเทนเนอร์บนเครือข่าย Docker เดียวกัน หากใช้เครือข่ายนั้นร่วมกับ reverse proxy และบริการอื่น ให้ใช้เครือข่ายภายในแยกต่างหากเพื่อแยกระบบอย่างเข้มงวดยิ่งขึ้น
  • ไม่มีการเปิดพอร์ตฐานข้อมูลภายนอก
  • การยุติ HTTPS ที่ระดับ Traefik

ขีดจำกัดทรัพยากร

  • คอนเทนเนอร์ worker มีขีดจำกัด CPU และหน่วยความจำ
  • ขีดจำกัดทรัพยากรช่วยลดผลกระทบจากงานที่ทำงานจนควบคุมไม่ได้และความพยายามใช้ทรัพยากรจนหมด
  • กำหนดค่าได้ตามความจุของเซิร์ฟเวอร์

ความปลอดภัย SSL

  • ใบรับรอง Let’s Encrypt อัตโนมัติ
  • การเปลี่ยนเส้นทางจาก HTTP ไปยัง HTTPS
  • การกำหนดค่า TLS สมัยใหม่

การเฝ้าติดตามและบำรุงรักษา

การตรวจสอบสถานะระบบรายสัปดาห์

cd /opt/windmill-pizza

# Container status
docker compose ps

# Resource usage
docker stats --no-stream

# Log analysis
docker compose logs | grep -i error

การบำรุงรักษารายเดือน

# Back up and update containers (update.sh runs backup.sh first)
cd /opt/windmill-pizza
./update.sh

# Clean unused images, containers and networks
docker system prune -f

รายละเอียดค่าใช้จ่ายและการเปรียบเทียบ

ค่าใช้จ่ายรายเดือน

การตั้งค่าที่ติดตั้งและดูแลเอง:

  • Hetzner CX23 (RAM 4GB): €5.99/เดือน ไม่รวม VAT รวมที่อยู่ IPv4 หลักหนึ่งที่อยู่ (ณ เดือนตุลาคม 2026)
  • ค่าโดเมน: ~€1/เดือน
  • รวม: ประมาณ €7/เดือน ไม่รวม VAT

การเปรียบเทียบกับ Windmill Cloud:

  • Cloud: $20/เดือนต่อสิทธิ์ใช้งานสำหรับนักพัฒนา และ $10/เดือนต่อผู้ปฏิบัติงาน (ณ เดือนตุลาคม 2026)
  • ประหยัด: มากกว่า $250 ต่อปี เมื่อนักพัฒนาตั้งแต่สองคนขึ้นไปต้องการสิทธิ์ใช้งาน

ประโยชน์ด้านประสิทธิภาพ

ข้อได้เปรียบของการติดตั้งและดูแลระบบเอง:

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

เอกสารอ้างอิงการแก้ไขปัญหา

การวินิจฉัยอย่างรวดเร็ว

cd /opt/windmill-pizza

# Container health
docker compose ps | grep -E "(healthy|Up)"

# Network connectivity
docker network inspect proxy

# Database connection
docker compose exec windmill-db psql -U postgres -d windmill_pizza -c "SELECT version();"

# Log analysis
docker compose logs --tail 50 windmill-server | grep -E "(ERROR|WARN)"

รูปแบบข้อผิดพลาดที่พบบ่อย

  • “password authentication failed” → ใช้รหัสผ่านฐานสิบหก ล้างวอลุ่มเฉพาะหลังจากสำรองข้อมูลแล้วหรือในการติดตั้งใหม่เท่านั้น
  • “connection refused” → ตรวจสอบการกำหนดค่าเครือข่าย
  • “certificate errors” → ตรวจสอบ DNS และการตั้งค่า Traefik
  • “out of memory” → ปรับขีดจำกัดทรัพยากร worker

การขยายโครงสร้างพื้นฐาน Windmill

การขยายแนวนอน

สำหรับสภาพแวดล้อมที่มีปริมาณงานสูง:

# Add additional workers (under services: in docker-compose.yml)
windmill-worker-2:
  image: ${WM_IMAGE}
  container_name: windmill-pizza-worker-2
  restart: unless-stopped
  environment:
    - DATABASE_URL=${DATABASE_URL}
    - MODE=worker
    - WORKER_GROUP=heavy
  networks:
    - proxy
  depends_on:
    windmill-db:
      condition: service_healthy
  deploy:
    resources:
      limits:
        cpus: '2'
        memory: 4G

การขยายแนวตั้ง

อัปเกรดทรัพยากรเซิร์ฟเวอร์ (ราคา Hetzner ไม่รวม VAT รวมที่อยู่ IPv4 หลักหนึ่งที่อยู่ ณ เดือนตุลาคม 2026):

  • CX33 (RAM 8GB): €8.99/เดือนสำหรับภาระงานหนัก
  • CX43 (RAM 16GB): €16.49/เดือนสำหรับการใช้งานระดับองค์กร

การเชื่อมต่อกับโครงสร้างพื้นฐานที่มีอยู่

การทำงานร่วมกับ n8n

หากคุณรัน n8n อยู่แล้ว (จากคู่มือก่อนหน้าของเรา):

  • Windmill จัดการเวิร์กโฟลว์ที่ใช้โค้ดเป็นหลัก
  • n8n จัดการระบบอัตโนมัติแบบภาพที่ไม่ซับซ้อน
  • ทั้งสองใช้ Traefik proxy ร่วมกัน
  • ฐานข้อมูลที่แยกจากกันป้องกันความขัดแย้ง

บริการที่แชร์กัน

ใช้ประโยชน์จากโครงสร้างพื้นฐานที่มีอยู่:

  • Traefik: จัดการ SSL สำหรับทุกบริการ
  • Mailserver: SMTP ที่ใช้ร่วมกันสำหรับการแจ้งเตือน
  • การเฝ้าติดตาม: บันทึกและตัวชี้วัดแบบรวมศูนย์
  • การสำรองข้อมูล: กลยุทธ์การสำรองข้อมูลแบบรวมศูนย์

สรุป

การติดตั้งและดูแล Windmill เองให้ระบบอัตโนมัติเวิร์กโฟลว์ระดับองค์กรในราคาเพียงเศษเสี้ยวของต้นทุนการโฮสต์บนคลาวด์ กุญแจสู่ความสำเร็จคือการทำความเข้าใจวิธีส่งต่อและจัดเก็บข้อมูลรับรอง PostgreSQL อย่างถาวร และการใช้รหัสผ่านฐานสิบหกเท่านั้นเพื่อหลีกเลี่ยงปัญหาการเข้ารหัส URL ที่อาจทำให้การติดตั้งล้มเหลว

ประโยชน์หลักของการตั้งค่านี้

  • คุ้มค่า: ประหยัดเงินหลายร้อยต่อปีเทียบกับโซลูชันคลาวด์
  • พร้อมใช้งานจริง: จัดการภาระงานระดับองค์กรอย่างน่าเชื่อถือ
  • ปลอดภัย: HTTPS ไม่มีการเปิดพอร์ตฐานข้อมูลให้เข้าถึงจากภายนอก และมีขีดจำกัดทรัพยากร
  • ขยายขนาดได้: เพิ่ม worker และทรัพยากรได้ง่ายตามต้องการ
  • เป็นส่วนตัว: โค้ดและข้อมูลของคุณยังอยู่บนโครงสร้างพื้นฐานของคุณ เว้นแต่เวิร์กโฟลว์ของคุณจะส่งไปยังบริการภายนอก

การกำหนดค่านี้ได้รับการทดสอบในสภาพแวดล้อมใช้งานจริงและให้ความน่าเชื่อถือที่จำเป็นสำหรับระบบอัตโนมัติเวิร์กโฟลว์ที่สำคัญทางธุรกิจ ขั้นตอนการแก้ไขปัญหาจัดการปัญหาจริงที่พบระหว่างการปรับใช้ โดยเฉพาะปัญหาการยืนยันตัวตน PostgreSQL ที่ส่งผลกระทบต่อระบบที่ติดตั้งและดูแลเองจำนวนมาก

สำหรับข้อกำหนดเวิร์กโฟลว์ที่ซับซ้อนหรือการปรับใช้ระดับองค์กร พิจารณาปรึกษาผู้เชี่ยวชาญเพื่อเพิ่มประสิทธิภาพกรณีการใช้งานเฉพาะของคุณและรับประกันการจัดสรรทรัพยากรที่เหมาะสมที่สุด

ขั้นตอนถัดไป

  • สำรวจเทคนิคการแก้ไขปัญหา webhook ที่ใช้ได้กับ Windmill
  • ทบทวนการเพิ่มประสิทธิภาพ เพย์โหลด สำหรับการจัดการชุดข้อมูลขนาดใหญ่
  • พิจารณาการเชื่อมต่อกับระบบ n8n ที่มีอยู่

เกี่ยวกับ tva

tva ดูแลโครงสร้างพื้นฐานของระบบฐานข้อมูล สภาพแวดล้อมคลาวด์ และห่วงโซ่อุปทานทั่วโลกอย่างครบวงจร แนวทางที่เป็นระบบของเราผสานมาตรการรักษาความปลอดภัยที่เข้มงวดกับการเพิ่มประสิทธิภาพ ขณะที่บริการให้คำปรึกษาเชิงกลยุทธ์ช่วยประสานขีดความสามารถด้านดิจิทัลและสินทรัพย์ทางกายภาพอย่างแม่นยำ โดยรักษามาตรฐานสูงสุดด้านการดำเนินงานและการปฏิบัติตามกฎระเบียบตลอดทุกโครงการ

เยี่ยมชม tva.sg สำหรับข้อมูลเพิ่มเติมเกี่ยวกับบริการของเราและคู่มือการทำงานอัตโนมัติเพิ่มเติม

จากการตั้งค่าสู่การตัดสินใจด้านการดำเนินงาน

คำถามในทางปฏิบัติไม่ใช่เพียงว่าจะกำหนดค่าแพลตฟอร์มได้หรือไม่ แต่ทีมต้องอธิบายความรับผิดชอบ ตรวจจับค่ากำหนดที่เปลี่ยนไปจากที่ตั้งใจ กู้คืนระบบโดยไม่ต้องแก้ปัญหาเฉพาะหน้า และแสดงว่าการเปลี่ยนแปลงช่วยให้ผลลัพธ์ดีขึ้นตามเป้าหมายได้ เราจึงกำหนดผู้รับผิดชอบ ค่าอ้างอิงตั้งต้น ขั้นตอนย้อนกลับ และช่วงตรวจผลควบคู่กับค่ากำหนด เพื่อเปลี่ยนการแก้ปัญหาครั้งเดียวให้เป็นขีดความสามารถในการดำเนินงาน บันทึกระบบใช้งานจริงควรระบุเหตุผล หลักฐานที่ตรวจสอบ ขอบเขตที่แน่นอน และผู้มีอำนาจหยุดหรือย้อนกลับการเปลี่ยนแปลง หลังปล่อยระบบให้เปรียบเทียบค่าชี้วัดที่ตกลงกันกับค่าอ้างอิงตั้งต้นและเก็บผลไว้กับบันทึกการเปลี่ยนแปลง หากไม่เกิดผลดีตามคาด การย้อนกลับเป็นผลลัพธ์ที่ยอมรับได้ ไม่ใช่ความล้มเหลว วินัยนี้สำคัญกว่าค่ากำหนดใดค่าหนึ่ง บันทึกเดียวกันยังช่วยให้ผู้ดูแลคนถัดไปมีจุดเริ่มต้นที่เชื่อถือได้ และใช้ข้อมูลวัดผลตัดสินใจปรับปรุงครั้งต่อไปแทนการคาดเดา

บทความที่เกี่ยวข้อง

บทความที่เกี่ยวข้อง