ตัวอย่างตัวติดตั้งแบบเว็บ
ตัวติดตั้งแบบเว็บคือ wizard สี่ขั้นตอนที่ให้บริการจากเครื่องของคุณเอง มันต้องใช้ Cloudflare OAuth application ที่คุณลงทะเบียนและเป็นเจ้าของเอง Dee Wan 1.0 ไม่ได้มีมาให้ ตัวติดตั้งแบบเว็บจึงไม่ใช่ วิธีติดตั้ง Dee Wan ที่รองรับ ให้ติดตั้งด้วยตัวติดตั้งแบบบรรทัดคำสั่งตาม การติดตั้ง Dee Wan
หากไม่มี OAuth application คุณยังเดินดู wizard ได้ด้วย
npm run install:web:dry-run ซึ่งไม่เปลี่ยนทรัพยากรภายนอก ดู
ดูตัวอย่าง wizard โดยไม่เปลี่ยนทรัพยากร Cloudflare
ต่างจากตัวติดตั้งแบบบรรทัดคำสั่งอย่างไร
หัวข้อที่มีชื่อว่า “ต่างจากตัวติดตั้งแบบบรรทัดคำสั่งอย่างไร”ทั้งสองใช้เอนจินตัวติดตั้ง ไฟล์การตั้งค่า (backend/wrangler.jsonc) และ step ledger เดียวกัน
| ตัวติดตั้งแบบเว็บ | ตัวติดตั้งแบบบรรทัดคำสั่ง | |
|---|---|---|
| เริ่มด้วย | npm run install:web |
npm run setup หรือ npm run install:cms -- <verb> |
| อินเทอร์เฟซ | หน้าเบราว์เซอร์บน 127.0.0.1 ให้บริการจากเครื่องของคุณ |
คำถามใน terminal หรือไม่ถามเลยด้วย --yes |
| Cloudflare credential | การลงชื่อเข้า Cloudflare (OAuth) เก็บในหน่วยความจำตลอด session | API token ที่คุณสร้าง จาก environment, .env หรือคำถาม |
| ต้องมี | Cloudflare OAuth application (DEEWAN_CF_OAUTH_CLIENT_ID) |
Cloudflare API token ที่มีสิทธิ์ตามรายการ |
| กฎจำกัดอัตรา | ไม่ติดตั้ง (การลงชื่อเข้าไม่ขอสิทธิ์ WAF) | ติดตั้งเมื่อ token มี Zone · Zone WAF · Edit |
| การวางแผนและเขียนสคริปต์ | แสดงสิ่งที่จะถูกสร้างก่อนติดตั้ง | plan, ผลลัพธ์ --json และ exit code ที่ตายตัว |
| ทำต่อหลังหยุด | ปุ่ม ดำเนินการต่อ | npm run install:cms -- resume หรือรัน setup อีกครั้ง |
ตัวติดตั้งอ่าน OAuth client id จาก DEEWAN_CF_OAUTH_CLIENT_ID หากไม่มี ขั้นตอน Cloudflare
จะแสดง “ต้องตั้งค่าการเข้าสู่ระบบ Cloudflare” และบอกให้คุณใช้ตัวติดตั้งแบบบรรทัดคำสั่ง
เริ่มใช้งาน
หัวข้อที่มีชื่อว่า “เริ่มใช้งาน”npm run install:webเซิร์ฟเวอร์ฟังบน 127.0.0.1 เท่านั้น ที่ port 8976 เว้นแต่ตั้ง DEEWAN_INSTALL_PORT มัน
แสดงลิงก์หนึ่งลิงก์:
Dee Wan installerOpen this link. It is bound to this session and is not written to disk:
http://127.0.0.1:8976/?t=<session-token>token ในลิงก์ถูกสร้างสำหรับการรันนี้ ทุก request ต้องมีมัน ดังนั้นหน้าอื่นหรือ โปรแกรมอื่นบนเครื่องเดียวกันจึงควบคุมตัวติดตั้งไม่ได้ request ที่ไม่มีมันจะได้ “This installer is bound to one session. Open the link printed in the terminal.” กด Ctrl-C ใน terminal เมื่อ คุณเสร็จแล้ว
Cloudflare ส่งเบราว์เซอร์กลับไปที่ http://127.0.0.1:<port>/oauth/cloudflare หลังลงชื่อเข้า และ
ที่อยู่นั้นต้องตรงกับที่ลงทะเบียนไว้กับ OAuth application ทุกประการ
DEEWAN_CF_OAUTH_REDIRECT override ค่านี้
หน้านี้มีตัวเลือก ภาษา ที่มี English, ไทย, Русский, Español, Français และ Deutsch ภาษาที่คุณใช้ติดตั้งจะกลายเป็นภาษาเริ่มต้นของไซต์แรกด้วย
wizard มีสี่ขั้นตอน: เว็บไซต์, Cloudflare, ผู้ดูแลระบบ และ ติดตั้ง ดำเนินการต่อ บันทึกขั้นตอนปัจจุบันก่อนไปต่อ และ ย้อนกลับ กลับไปยังขั้นตอนก่อนหน้า
ขั้นตอนที่ 1: เว็บไซต์
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 1: เว็บไซต์”
จะติดตั้งไว้ที่ไหน มีสองคำตอบ:
- บนโดเมนของฉันเอง: กรอกใน โดเมนของคุณ เช่น
example.com - บนที่อยู่ที่ Cloudflare จัดให้: เว้น domain ว่างไว้
ไม่มีการถามอื่นที่นี่ ชื่อโครงสร้างพื้นฐานและฟีเจอร์ที่ไม่บังคับมีค่าเริ่มต้นที่ใช้งานได้และ อยู่ในขั้นตอน ติดตั้ง
ขั้นตอนที่ 2: Cloudflare
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 2: Cloudflare”
- ใต้ เชื่อมต่อ Cloudflare เลือก อนุญาต Cloudflare มันจะเปิด Cloudflare ในแท็บใหม่ ลิงก์จะถูกปิดใช้ขณะที่คุณมีการเปลี่ยนแปลงที่ยังไม่บันทึก (“บันทึกการตั้งค่าของคุณก่อนเชื่อมต่อ.”)
- อนุมัติคำขอ จากนั้นแท็บจะแสดง Connected และบอกว่าตัวติดตั้งถือ Cloudflare credential สำหรับ session นี้เท่านั้น ปิดแท็บแล้วกลับไปที่ตัวติดตั้ง ซึ่งการ์ดจะแสดง เชื่อมต่อสำหรับเซสชันนี้เท่านั้น
- เลือกบัญชีใต้ บัญชี Cloudflare ใด แล้วเลือก ใช้บัญชีนี้ หากการลงชื่อเข้า ของคุณเข้าถึงได้เพียงบัญชีเดียว มันจะถูกเลือกให้ ทุกอย่างที่การติดตั้งสร้างจะถูก เรียกเก็บเงินกับบัญชีนี้
- เลือก แพ็กเกจฐานข้อมูล D1: ฟรี หรือ แบบเสียเงิน Cloudflare ไม่ได้เปิดเผยวิธีอ่านว่า บัญชีใช้ plan ใด และสอง plan อนุญาตปริมาณเนื้อหาที่เก็บต่างกัน ดังนั้น ตัวติดตั้งจึงถามแทนการเดา
ขอสิทธิ์อะไรบ้าง แสดง scope ของ Cloudflare ที่การลงชื่อเข้าขอไว้ทุกประการ มันขึ้น กับคำตอบของคุณ:
| เมื่อใด | Scope |
|---|---|
| เสมอ | account-settings.read, d1.write, workers-scripts.write, page.write, workers-r2.write |
| เมื่อใช้ domain ของคุณเอง | zone.read, workers-routes.write |
| เมื่อใช้ domain ของคุณเองและเปิดการตั้งค่า DNS | dns.write |
| เมื่อเปิด Cloudflare Access | access.write, access-acct.read |
ไม่มีการขอ scope ของ WAF เลย ดูการจำกัดผู้เยี่ยมชมในขั้นตอนที่ 4
หากภายหลังคุณเปลี่ยนการตั้งค่าที่ทำให้สิทธิ์ที่ต้องใช้เปลี่ยนไป ตัวติดตั้งจะทิ้ง การอนุญาตเดิมและบอกว่า “บันทึกแล้ว การเปลี่ยนนี้ทำให้สิทธิ์ที่ต้องใช้เปลี่ยนไป กรุณาเชื่อมต่อ Cloudflare อีกครั้ง”
ดำเนินการต่อ จะถูกปฏิเสธจนกว่าจะเชื่อมต่อ Cloudflare และเลือกบัญชีแล้ว
credential ถูกเก็บในหน่วยความจำของตัวติดตั้ง ไม่ได้เขียนลงดิสก์ หากหมดอายุ หน้าจะบอก “การเชื่อมต่อหมดอายุ เชื่อมต่ออีกครั้งเพื่อดำเนินการต่อ” การอนุญาตอีกครั้งไม่มีผลกับสิ่งใด ที่สร้างไปแล้ว
ขั้นตอนที่ 3: ผู้ดูแลระบบ
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 3: ผู้ดูแลระบบ”กรอก อีเมลผู้ดูแลระบบ หนึ่งรายการ ลิงก์ลงชื่อเข้าครั้งแรก (claim link) ผูกกับที่อยู่ นี้ และเฉพาะผู้ที่ใช้ที่อยู่นี้เท่านั้นที่รับสิทธิ์ผู้ดูแลการติดตั้งได้
ขั้นตอนที่ 4: ติดตั้ง
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 4: ติดตั้ง”
ตรวจสอบ แสดงสิ่งที่คุณตัดสินใจ: ที่อยู่, ที่อยู่สำหรับลงชื่อเข้าใช้ตามแผน, ที่อยู่เว็บไซต์ตามแผน, บัญชี Cloudflare แพ็กเกจฐานข้อมูล D1 และผู้ดูแลระบบ ส่วน จะถูกสร้างขึ้น แสดงทุกขั้นตอนที่จะสร้างบางอย่างและยังไม่ได้ทำ
ปรับแต่งโครงสร้างพื้นฐาน เปิดการตั้งค่าที่เหลือ:
| การตั้งค่า | ค่าเริ่มต้น |
|---|---|
| ที่ที่คุณเข้าสู่ระบบ (admin subdomain) | cms |
| ที่ที่เว็บไซต์ของคุณอ่านข้อมูล (subdomain ของ public API) | content |
| ชี้โดเมนของคุณมาที่การติดตั้งนี้ | เปิด ต้องมี domain ของคุณเอง |
| ขอให้เข้าสู่ระบบ Cloudflare ก่อนเข้าหน้าผู้ดูแล (Cloudflare Access) | ปิด ต้องมี domain ของคุณเอง |
| จำกัดความถี่ที่ผู้เข้าชมหนึ่งคนอ่านเนื้อหาของคุณได้ | ปิด ต้องมี domain ของคุณเอง ดูหมายเหตุด้านล่าง |
| ชื่อบริการ (admin Worker) | dee-wan-cms-backend |
| ชื่อโปรเจกต์ (Pages project) | dee-wan-cms |
| ซับโดเมน workers.dev ของคุณ | ว่าง ใช้สำหรับที่อยู่ของ public API เมื่อคุณไม่มี domain |
| จำนวนวินาทีที่เก็บคำตอบของเว็บไซต์ | 0 ซึ่งแสดงเนื้อหาล่าสุดแก่ผู้อ่านทุกคน |
| เตรียมบักเก็ตสำหรับนำเข้าเนื้อหาจากระบบอื่นด้วย | ปิด |
admin และเว็บไซต์ต้องใช้ subdomain ต่างกัน หากคุณเปิด Access ให้สังเกตคำเตือนสองข้อ ที่หน้าแสดง: ทุกคนที่คุณเชิญต้องมีรายการใน Cloudflare Access policy ด้วย และหาก Access application ถูกลบหรือตั้งค่าผิด ทุกคนจะถูกล็อกออก เมื่อเปิด Access ผู้ดูแลเว็บไซต์สามารถจับคู่โดเมนอีเมลหรือกลุ่ม Access กับบทบาทแทนการเชิญทีละคน ผู้ที่ Access อนุญาตด้วยโดเมนหรือกลุ่มนั้นจะได้บัญชีเมื่อเข้าสู่ระบบครั้งแรก ดู ผู้คนและสิทธิ์เข้าถึง
ตัวติดตั้งแบบเว็บไม่ติดตั้งการจำกัดผู้เยี่ยมชม การตั้งค่าถูกบันทึก
(SETUP_PUBLIC_RATE_LIMIT ใน backend/wrangler.jsonc) แต่กฎนี้เป็นกฎจำกัดอัตราของ Cloudflare WAF
และการลงชื่อเข้าของตัวติดตั้งแบบเว็บไม่มีสิทธิ์ WAF การรันจะรายงานว่า
ติดตั้งกฎไม่ได้และทำต่อ กฎจำกัดอัตราการลงชื่อเข้าใช้ก็เป็นเช่นเดียวกัน หากต้องการติดตั้ง
ให้รัน npm run setup ภายหลังด้วย API token ที่มี Zone · Zone WAF · Edit (ดู
Credential) เมื่อติดตั้งกฎแล้ว มันจะจำกัดการอ่านแบบส่วนตัวด้วย รวมถึง
build ของไซต์ที่อ่านจาก IP address เดียว
การตรวจทานยังบอกว่ารายงานข้อผิดพลาดไปที่โปรเจกต์ Sentry ของ Dee Wan เมื่อการติดตั้งมีที่อยู่ของโปรเจกต์นั้น
ไม่ว่าจะรวมอยู่ใน build หรือตั้งเป็น secret DEEWAN_SENTRY_DSN และหากไม่มีที่อยู่ จะไม่มีอะไรถูกส่ง
ใน build นี้ไม่มีที่อยู่ Sentry ของ Dee Wan รวมอยู่ ดังนั้นไม่มีอะไรถูกส่งไปยัง Dee Wan เว้นแต่ตั้ง
DEEWAN_SENTRY_DSN ก่อนตั้งค่านี้ การติดตั้ง → รายงานข้อผิดพลาด จะบอก “บิลด์นี้ไม่มีปลายทางของ Dee Wan ไม่มีการส่งอะไร” รายงานไม่มีเนื้อหา ค่าในฟอร์ม อีเมล หรือ
credential เลย หากต้องการส่งไปยังโปรเจกต์ Sentry ของคุณเอง ให้ตั้ง secret OPERATOR_SENTRY_DSN
secret เป็นของ Worker ตัวเดียว หากต้องการให้ข้อผิดพลาดของ Worker สำหรับอ่านสาธารณะถูกรายงานด้วย
ให้ตั้งที่อยู่ใดที่อยู่หนึ่งที่ใช้บน Worker นั้นด้วย (npx wrangler secret put <NAME> --config wrangler.public.jsonc) ดู
Secrets
หากคุณแก้การตั้งค่าในขั้นตอนนี้ ปุ่มหลักจะกลายเป็น บันทึกการเปลี่ยนแปลง เมื่อทุกอย่าง บันทึกแล้ว ให้เลือก ติดตั้ง
ตัวติดตั้งปฏิเสธการเริ่มรันกับการตั้งค่าที่คุณยังไม่ได้ตรวจทาน หากไฟล์การตั้งค่า เปลี่ยนขณะที่หน้าเปิดอยู่ มันจะบอก “การตั้งค่าเปลี่ยนไประหว่างที่เปิดหน้านี้ ยังไม่มีการเริ่มสิ่งใด ตรวจสอบแล้วลองใหม่”
สิ่งที่ตัวติดตั้งแบบเว็บเขียน
หัวข้อที่มีชื่อว่า “สิ่งที่ตัวติดตั้งแบบเว็บเขียน”การบันทึกแต่ละครั้งเขียนคำตอบของคุณลงใน backend/wrangler.jsonc (หรือไฟล์ที่ระบุด้วย --config)
และเก็บ comment ในไฟล์ไว้ หากไม่มีไฟล์ จะสร้างไฟล์ใหม่ การเลือก
บัญชีจะเขียน account_id ไฟล์นี้อยู่ใน gitignore เพราะมีค่าจริงของคุณ ตัวติดตั้ง
แบบเว็บแก้การตั้งค่า wrangler.toml ไม่ได้ ให้แปลงเป็น wrangler.jsonc หรือใช้
ตัวติดตั้งแบบบรรทัดคำสั่ง
การรันติดตั้งเองคือเอนจินแบบบรรทัดคำสั่ง: หน้าจะเริ่ม install:cms apply (หรือ
resume) ด้วย --yes โดยส่ง Cloudflare credential จากการลงชื่อเข้าของคุณ มันทำทุกอย่าง
ที่ npm run setup ทำเท่าที่สิทธิ์ของการลงชื่อเข้าอนุญาต รวมถึงการเขียน
backend/wrangler.public.jsonc สำหรับ public read Worker และ backend/wrangler.intake.jsonc
สำหรับ form intake Worker
การติดตามการรัน การลองใหม่ และการทำต่อ
หัวข้อที่มีชื่อว่า “การติดตามการรัน การลองใหม่ และการทำต่อ”แผงข้าง wizard แสดง สิ่งที่จะเกิดขึ้น ก่อนรัน ความคืบหน้า ระหว่างรัน และ สิ่งที่ทำเสร็จแล้ว เมื่อเสร็จ รายละเอียดทางเทคนิค แสดง log ของตัวติดตั้ง โดย เอา credential ออกแล้ว
หน้าจะ poll ต่อไปขณะที่การรันดำเนินอยู่ หากคุณ reload มันจะกลับไปที่การรัน หากมันขาด การติดต่อกับตัวติดตั้ง มันจะบอก “ขาดการเชื่อมต่อกับตัวติดตั้ง ระบบอาจยังทำงานอยู่ โปรดโหลดหน้านี้ใหม่”
หากการรันหยุด แผงจะบอกว่าหยุดที่ใด (“หยุดที่: …”) และต้องทำอะไรต่อ:
- หากบางขั้นตอนเสร็จแล้ว: “ความคืบหน้าของคุณถูกบันทึกไว้แล้ว ทำต่อได้เมื่อคุณพร้อม” เลือก ดำเนินการต่อ ขั้นตอนที่เสร็จแล้วจะไม่ถูกทำซ้ำ
- หากไม่มีอะไรถูกสร้าง: “ยังไม่มีสิ่งใดถูกสร้างขึ้น ติดตั้งอีกครั้งได้เมื่อคุณพร้อม” เลือก ติดตั้ง
การรันที่จบโดยยังมีงานเหลือ (exit code 4, incomplete) จะถูกรายงานเป็น “ยังไม่เสร็จ” และ ไม่ใช่ความสำเร็จ ตรวจ log แก้สิ่งที่มันระบุ แล้วทำต่อ
เมื่อเสร็จสิ้น
หัวข้อที่มีชื่อว่า “เมื่อเสร็จสิ้น”
แผงแสดง Worker, ที่อยู่ของ admin และที่อยู่ของ public API ที่ตอบกลับ และ หน้าแสดง สร้างผู้ดูแลระบบ มันเปิด claim link ในแท็บใหม่ ซึ่งคุณเลือก วิธีเข้าสู่ระบบที่ตั้งค่าไว้ ดูClaim การติดตั้ง
claim link ไม่แสดงใน log เลย หน้าเสนอมันผ่านปุ่มนั้น เฉพาะขณะที่ ลิงก์ยังใช้ได้ และเพียงครั้งเดียว หากลิงก์หมดอายุก่อนมีคนใช้ ให้เลือก ดำเนินการต่อ เพื่อออกลิงก์ใหม่ ขณะที่การติดตั้งยังไม่ถูก claim
ดูตัวอย่าง wizard โดยไม่เปลี่ยนทรัพยากร Cloudflare
หัวข้อที่มีชื่อว่า “ดูตัวอย่าง wizard โดยไม่เปลี่ยนทรัพยากร Cloudflare”npm run install:web:dry-runคำสั่งนี้ให้บริการหน้าเดียวกันเพื่อตรวจทาน โดยแทนที่ผลกระทบภายนอกทั้งหมด การตั้งค่าและ
ledger อยู่ในโฟลเดอร์ชั่วคราวที่ถูกลบเมื่อกด Ctrl-C การค้นหาบัญชีและการรันติดตั้ง
เป็นแบบจำลองตามสคริปต์ และไม่มีอะไรไปถึง Cloudflare มันฟังที่ port 8978 เว้นแต่ตั้ง DEEWAN_INSTALL_PORT
การลงชื่อเข้าเสร็จเมื่อคุณเปิดลิงก์ลงชื่อเข้าที่แสดงตอนเริ่ม อย่ากด
อนุญาต Cloudflare ซึ่งจะเปิด Cloudflare ด้วย client id ตัวยึดตำแหน่ง
การแก้ไขปัญหา
หัวข้อที่มีชื่อว่า “การแก้ไขปัญหา”ตัวติดตั้งแบบเว็บบอกว่า port ถูกใช้อยู่ process อื่น ซึ่งมักเป็นตัวติดตั้งตัวที่สอง กำลัง
ฟัง port นั้น ปิดมัน หรือตั้ง DEEWAN_INSTALL_PORT เป็น port ที่ว่าง ไม่มีอะไรถูกสร้าง
ในบัญชีใดเลย ที่อยู่ redirect ที่ลงทะเบียนไว้ของ OAuth application ต้อง
ตรงกับ port ใหม่
หน้าบอกว่า “This installer is bound to one session.” เปิดลิงก์ที่แสดงใน terminal ตรงตัว ตัวติดตั้งที่เริ่มใหม่จะแสดงลิงก์ใหม่
ขั้นตอน Cloudflare บอกว่า “ต้องตั้งค่าการเข้าสู่ระบบ Cloudflare” ไม่ได้ตั้ง DEEWAN_CF_OAUTH_CLIENT_ID
ใช้ตัวติดตั้งแบบบรรทัดคำสั่งกับ API token
ตัวติดตั้งแบบเว็บอ่านหรือแก้การตั้งค่าไม่ได้ มันแก้ได้เฉพาะ wrangler.jsonc แก้
backend/wrangler.jsonc หากรูปแบบผิด หรือแปลง wrangler.toml เป็น wrangler.jsonc แล้ว
reload หน้า
สำหรับปัญหาที่ตัวติดตั้งแบบบรรทัดคำสั่งก็พบเช่นกัน เช่น ตั้ง DOMAIN แต่ไม่มี DOMAIN_MODE หรือขั้นตอนที่ยังดำเนินการไม่เสร็จ ดู การแก้ไขปัญหา
ขั้นตอนถัดไป
หัวข้อที่มีชื่อว่า “ขั้นตอนถัดไป”ติดตั้งด้วยตัวติดตั้งแบบบรรทัดคำสั่ง
ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: fe23db481c422b40e317b92fc98116b4c0c26a87 (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-18T09:22:34.630Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง