การติดตั้ง Dee Wan
คู่มือนี้ติดตั้ง Dee Wan CMS ลงในบัญชี Cloudflare ของคุณเอง installation (การติดตั้งหนึ่งชุด) ประกอบด้วย admin Worker, public read Worker, admin UI บน Cloudflare Pages, ฐานข้อมูล D1 ควบคุมหนึ่งชุด, ที่เก็บ media และ credential ที่อยู่เบื้องหลังสิ่งเหล่านี้ มันถูกสร้างครั้งเดียว มี claim link หนึ่งลิงก์ และให้บริการได้หลาย ไซต์ (ดูคำศัพท์ของผลิตภัณฑ์)
หากต้องการลองดูก่อนโดยไม่มีบัญชี Cloudflare ให้ใช้ การทดลองบน local แทน: มันรันผลิตภัณฑ์ทั้งหมด กับฐานข้อมูล local บนเครื่องของคุณ
คุณติดตั้งด้วยตัวติดตั้งแบบบรรทัดคำสั่ง: npm run setup สำหรับการรันแบบโต้ตอบ และ
npm run install:cms -- <verb> สำหรับการรันที่วางแผนได้ ทำต่อได้ และเขียนสคริปต์ได้ มันต้องใช้ Cloudflare
API token มันเก็บคำตอบของคุณไว้ใน backend/wrangler.jsonc และความคืบหน้าไว้ใน step ledger และ
รันรายการขั้นตอนเดียวกับที่ npm run plan แสดง
ยังมีตัวติดตั้งแบบเบราว์เซอร์ด้วย แต่ต้องใช้ Cloudflare OAuth application ที่คุณลงทะเบียนเอง และไม่ใช่ เส้นทางการติดตั้งที่รองรับ ดูตัวอย่างตัวติดตั้งแบบเว็บ
Dee Wan 1.0 อยู่ในสถานะ pre-release การติดตั้งบน Cloudflare จริงเป็นหนึ่งในเกต acceptance ที่ ยังเปิดอยู่ ดูขอบเขตผลิตภัณฑ์ 1.0 ว่าอะไรครอบคลุมและอะไร ไม่ครอบคลุม
ข้อมูลยืนยันตัวตน GitHub ขึ้นอยู่กับขั้นตอน ต้องตั้งค่า GitHub App ของแอดมินแยกจาก device flow ของ CLI ลิงก์ App แบบไม่บังคับในตัวติดตั้งไม่ได้ตั้งค่า Worker ให้ ใช้ตารางการยืนยันตัวตน แล้วทำตามขั้นตอนจากไซต์แรกสู่การเผยแพร่
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”สิ่งที่คุณต้องมี
หัวข้อที่มีชื่อว่า “สิ่งที่คุณต้องมี”- บัญชี Cloudflare ที่มี Workers, D1, Pages และ R2 หรือ Cloudflare Images
- Node 22 (22.14 ขึ้นไป) หรือ Node 24 (24.10 ขึ้นไป) repository มี
.nvmrc(24.18.1) มาให้ ดังนั้นnvm useจะเลือกเวอร์ชันที่ถูกต้อง - npm ตรงตามที่
package.jsonประกาศ (11.16.0) ซึ่งเป็น npm ที่มากับ Node ตาม.nvmrc - Git สำหรับ clone repository พร้อม submodule
- domain ของคุณเอง (ไม่บังคับ) หากจะใช้ domain นั้นต้องเป็น zone ในบัญชี Cloudflare เดียวกัน
หากไม่มี การติดตั้งจะใช้ที่อยู่ที่ Cloudflare ให้มา (
pages.devและworkers.dev) - คีย์ผู้ให้บริการ AI หากต้องการใช้ฟีเจอร์ AI (ไม่บังคับ) ค่าเริ่มต้นคือ DeepInfra และตั้งค่าผู้ให้บริการที่เข้ากันได้กับ OpenAI หลังติดตั้งได้
ไม่จำเป็นต้องมี Cloudflare Access (Zero Trust) ตัวติดตั้งเสนอมันเป็นขอบเขตป้องกันเพิ่มเติม ด้านหน้า admin และมันปิดอยู่จนกว่าคุณจะเปิด
รับโค้ดและติดตั้ง dependency
หัวข้อที่มีชื่อว่า “รับโค้ดและติดตั้ง dependency”git clone --recurse-submodules https://github.com/dee-wan-cms/dee-wan.gitcd dee-wannode scripts/install-dependencies.mjsnode scripts/install-dependencies.mjs frontendคำสั่งแรกติดตั้ง dependency ของ root และ backend คำสั่งที่สองติดตั้งของ admin UI
ซึ่งตัวติดตั้ง build และ deploy ติดตั้งด้วย node scripts/install-dependencies.mjs เสมอ
อย่าใช้ npm install หรือ npm ci เปล่า ๆ มันปฏิเสธ npm เวอร์ชันอื่น ติดตั้ง dependency tree
ที่ล็อกไว้โดยปิด install script แล้ว rebuild เฉพาะ package ที่ script
ได้รับอนุมัติ
clone ใหม่ไม่ต้อง build ด้วยมือ: setup, deploy และ migrate:d1 build package และ
Prisma client ให้หากยังไม่มี
อะไรถูกสร้างขึ้นบ้าง
หัวข้อที่มีชื่อว่า “อะไรถูกสร้างขึ้นบ้าง”นี่คือขั้นตอนที่ตัวติดตั้งรัน ตามลำดับ npm run plan แสดงรายการเดียวกันสำหรับการตั้งค่า
ของคุณ พร้อมสถานะของแต่ละขั้นตอน
| ขั้นตอน | สร้างหรือทำอะไร |
|---|---|
| Check Node and Wrangler | ตรวจเท่านั้น |
| Resolve the Cloudflare API token | ตรวจเท่านั้น |
| Choose the Cloudflare account | ตรวจเท่านั้น |
| Preflight — token scopes, plan, existing resources | ตรวจเท่านั้น หยุดการรันก่อนสร้างสิ่งใดหากการตรวจล้มเหลว |
| Create the control D1 database | ฐานข้อมูล D1 (ชื่อเริ่มต้น dee-wan-cms-db) |
| Apply migrations to D1 | schema และ role กับ workflow ที่ seed ไว้ |
| Provision the private import archive bucket | R2 bucket ส่วนตัวสำหรับ archive ที่นำเข้า เฉพาะเมื่อคุณเลือก |
| Connect the initial site to its hostname | hostname สาธารณะสำหรับไซต์แรก |
| Build the admin UI | build เท่านั้น |
| Deploy the admin UI to Pages | Pages project (ชื่อเริ่มต้น dee-wan-cms) |
| Deploy the admin Worker | Worker (ชื่อเริ่มต้น dee-wan-cms-backend) |
| Generate and store the session signing secret | Worker secret |
| Provision media storage | R2 media bucket หรือ binding ของ Cloudflare Images |
| Deploy the public API | public read Worker (ตั้งชื่อตาม admin Worker โดยต่อท้ายด้วย -public) และ hostname ของมัน |
| Deploy the website form intake | form intake Worker (ตั้งชื่อตาม admin Worker โดยต่อท้ายด้วย -intake) ข้ามเมื่อ DEPLOY_FORM_INTAKE เป็น false และฟอร์มของเว็บไซต์จะไม่รับการส่ง |
| Generate and store the site-token signing key | Worker secret บน admin และ public Worker |
| Attach the Worker routes | Worker route สองรายการบน zone ของคุณ: <admin host>/api/* และ <admin host>/.well-known/oauth-* เฉพาะเมื่อใช้ domain ของคุณเอง การ teardown จะลบเฉพาะเมื่อยังชี้มาที่ Worker นี้ |
| Point DNS at the deployment | DNS record ใต้ domain ของคุณ เฉพาะเมื่อใช้ domain ของคุณเองและเปิดการตั้งค่า DNS |
| Put Cloudflare Access in front of the admin | Access application และ policy เฉพาะเมื่อคุณเปิด Access |
| Check the deployment answers | ตรวจเท่านั้น |
| Mint the first administrator’s claim link | ลิงก์ใช้ครั้งเดียว แสดงครั้งเดียว |
ทรัพยากรอย่าง Worker, Pages project, ฐานข้อมูล D1 และ R2 bucket เป็นทรัพยากร Cloudflare ที่มีค่าใช้จ่ายในบัญชีที่คุณเลือก
เมื่อใช้ domain ของคุณเอง admin UI ให้บริการที่ cms.<your-domain> และ public API ที่
content.<your-domain> โดยค่าเริ่มต้น หากไม่มี admin UI ให้บริการที่
<pages-project>.pages.dev และ public API ที่
<admin-worker>-public.<your-workers.dev-subdomain>.workers.dev
ตัวติดตั้งแบบบรรทัดคำสั่ง
หัวข้อที่มีชื่อว่า “ตัวติดตั้งแบบบรรทัดคำสั่ง”Credential
หัวข้อที่มีชื่อว่า “Credential”ตัวติดตั้งต้องใช้ Cloudflare API token npm run setup จะถามหาหากยังไม่ได้ตั้งไว้ แสดง
สิทธิ์ที่ต้องใช้พร้อมเหตุผลของแต่ละสิทธิ์ และให้ลิงก์ไปยังตัวแก้ไข token ของ Cloudflare ที่เลือก
สิทธิ์เหล่านั้นไว้แล้ว ให้รวมทุกบัญชีและทุก zone
| สิทธิ์ | ต้องใช้สำหรับ | เหตุผล |
|---|---|---|
| Account · Account Settings · Read | ทุกการติดตั้ง | อ่านชื่อและการตั้งค่าของบัญชี |
| Account · D1 · Edit | ทุกการติดตั้ง | สร้างฐานข้อมูลและ apply migration |
| Account · Workers Scripts · Edit | ทุกการติดตั้ง | deploy admin Worker, public-read Worker และ form-intake Worker รวมทั้ง secret และ custom domain ของมัน |
| Account · Cloudflare Pages · Edit | เว้นแต่ปิดการ deploy admin UI | สร้างและ deploy project ของ admin UI |
| Account · Workers R2 Storage · Edit | media ใน R2 หรือ import bucket | สร้าง media bucket และ import bucket |
| Zone · Zone · Read | domain ของคุณเอง | หา zone ที่ domain ของคุณอยู่ |
| Zone · Workers Routes · Edit | domain ของคุณเอง | route hostname ของ admin และของไซต์ไปยัง Worker |
| Zone · DNS · Edit | domain ของคุณเองพร้อมเปิดการตั้งค่า DNS | ชี้ hostname ของ admin ไปยัง deployment |
| Zone · Zone WAF · Edit | domain ของคุณเอง (ไม่บังคับ) | ติดตั้งกฎจำกัดอัตราการลงชื่อเข้าใช้ และกฎของ public API ที่เลือกใช้ได้ หากไม่มี ทั้งสองจะถูกข้ามพร้อมคำเตือน ตัวจำกัดการลงชื่อเข้าใช้ของ Worker เองยังมีผล |
| Account · Access: Apps and Policies · Edit | เฉพาะ Cloudflare Access | สร้าง Access application และ policy หน้า admin |
| Account · Access: Organizations, Identity Providers, and Groups · Read | เฉพาะ Cloudflare Access | อ่าน team domain ของ Access ของคุณ |
npm run setup และ npm run doctor แสดงรายการนี้ตามตัวเลือกที่มีอยู่แล้วใน config ของคุณ แถวของ
Access จะถูกขอก็ต่อเมื่อคุณเปิด Access แล้วเท่านั้น ตัวเลือกอื่นที่คุณยังไม่ได้เลือกจะถูกขอและระบุ
เงื่อนไขของมันไว้ และตัวเลือกที่คุณปิดไว้จะไม่ถูกขอ ลิงก์ token ที่กรอก
ไว้ล่วงหน้าเลือกแถวเดียวกัน ยกเว้น Zone · Zone WAF · Edit ซึ่งรายการที่แสดงจะบอกให้คุณเพิ่มเอง
การตรวจสอบ token ไม่ต้องใช้สิทธิ์เพิ่ม
หากคุณใช้ Cloudflare Images setup แนะนำให้ใช้ token แยกที่มีเพียงสิทธิ์ Cloudflare Images:
Edit
หากต้องการข้ามการถาม ให้ตั้ง token และบัญชีใน environment:
export CLOUDFLARE_API_TOKEN=… # skips the token promptexport CLOUDFLARE_ACCOUNT_ID=… # skips the account pickercredential ถูก resolve ตามลำดับนี้: ตัวแปรที่ export ใน shell ของคุณ จากนั้นไฟล์ .env
ของ repository จากนั้นค่าใน backend/wrangler.jsonc เมื่อ environment override ค่าที่
ต่างกันใน config ตัวติดตั้งจะบอก
token ถูกตรวจก่อนสร้างสิ่งใด การรันแบบโต้ตอบให้ลองสามครั้ง การรันแบบ ไม่โต้ตอบหยุดที่ความล้มเหลวครั้งแรก ไม่ว่าแบบใด หากตรวจสอบโทเค็นไม่ได้ ระบบจะไม่สร้างทรัพยากร Cloudflare ใด ๆ
secret ของแอปพลิเคชันไม่ถูกเก็บใน wrangler.jsonc เลย ดูSecrets
การติดตั้งแบบโต้ตอบ: npm run setup
หัวข้อที่มีชื่อว่า “การติดตั้งแบบโต้ตอบ: npm run setup”npm run setupsetup พาคุณผ่านการติดตั้งและบันทึกแต่ละคำตอบลงใน backend/wrangler.jsonc ไปพร้อมกัน
ดังนั้นการรันครั้งที่สองจะไม่ถามซ้ำ ตามลำดับ มันจะ:
- หาหรือสร้าง
backend/wrangler.jsoncและ resolve token กับบัญชี หาก token เข้าถึงได้หลายบัญชี มันจะถามว่าจะใช้บัญชีใด - ถามว่าบัญชีใช้ D1 plan ใด (Free 500 MB ต่อฐานข้อมูล Paid 10 GB ต่อฐานข้อมูล)
- รัน preflight และแสดงรายงาน หากการตรวจล้มเหลว มันจะหยุดก่อนสร้างสิ่งใด (“Setup stopped before creating any Cloudflare resources. Fix the FAIL rows above.”) หากจะมีทรัพยากร ถูกสร้างหรือแก้ไข มันจะขอให้คุณยืนยัน
- ถามว่าการติดตั้งจะอยู่ที่ใด (domain ของคุณเอง หรือที่อยู่ที่ Cloudflare ให้มา)
จากนั้นถาม domain, admin subdomain (ค่าเริ่มต้น
cms) และ subdomain ของ public content API (ค่าเริ่มต้นcontent) - ถามว่าจะตั้งค่า DNS หรือไม่ จะตั้งค่า Cloudflare Access หรือไม่ (ค่าเริ่มต้น ไม่) และจะ ติดตั้งกฎจำกัดอัตราบน public API หรือไม่ (ค่าเริ่มต้น ไม่)
- ถามชื่อ Pages project และชื่อ Worker
- ถาม storage provider ว่าเป็น Cloudflare R2 หรือ Cloudflare Images สำหรับ R2 มันจะสร้าง
bucket (ค่าเริ่มต้น
dee-wan-cms-images) เปิดการเข้าถึงสาธารณะผ่านที่อยู่r2.devที่จัดการให้ หรือ media domain ที่กำหนดเอง และตรวจว่าไฟล์ที่อัปโหลดถูกให้บริการจริง - ถามว่าจะเปิดการนำเข้าข้อมูลหรือไม่ ซึ่งจะสร้าง R2 bucket ส่วนตัวสำหรับ archive ที่อัปโหลด (ค่าเริ่มต้น ไม่)
- สร้างฐานข้อมูล D1 และเสนอให้ apply schema (ค่าเริ่มต้น ใช่) การติดตั้งใหม่ไม่ต้องมี ขั้นตอน migrate แยก
- build และ deploy admin UI, admin Worker, public read Worker และ form intake Worker เก็บ
Worker secret และแนบ route, DNS record และ Access application ที่คุณเลือก มันเขียน
backend/wrangler.public.jsoncและbackend/wrangler.intake.jsoncเมื่อบัญชี zone และ database id ลงตัวแล้ว และไม่เขียนทับไฟล์ที่มีอยู่ - เสนอให้รัน health check
- ถามอีเมลของผู้ดูแลคนแรก หากยังไม่ได้ตั้ง
BOOTSTRAP_ADMIN_EMAILและ แสดง claim link
มันจบด้วย “Setup complete!” สรุปการตั้งค่า และขั้นตอนถัดไป หากส่วนที่จำเป็น ขาดหายไป มันจะจบด้วย “Setup did not complete” และระบุสิ่งที่ขาดแทน
setup ยังรับ --access / --no-access และ --public-rate-limit /
--no-public-rate-limit เพื่อตอบคำถามเหล่านั้นบน command line เช่น
npm run setup -- --no-access
วางแผนก่อน: npm run plan
หัวข้อที่มีชื่อว่า “วางแผนก่อน: npm run plan”npm run plannpm run plan -- --jsonplan แสดงทุกขั้นตอนที่การติดตั้งจะทำ และสถานะที่แต่ละขั้นตอนเป็นอยู่แล้ว มัน
ทำงานจากการตั้งค่าและ ledger บนดิสก์เท่านั้น: ไม่แตะเครือข่าย ไม่สร้างอะไร และ
ไม่มีค่าใช้จ่าย --json แสดงแผนที่เครื่องอ่านได้พร้อม planVersion
แต่ละขั้นตอนมีสถานะใดสถานะหนึ่งต่อไปนี้:
| เครื่องหมาย | สถานะ | ความหมาย |
|---|---|---|
✓ |
done | บันทึกว่าเสร็จแล้ว |
• |
to do | จะรัน |
– |
not applicable | ข้ามสำหรับการตั้งค่านี้ พร้อมเหตุผล |
✗ |
blocked | ยังรันไม่ได้ เช่นเพราะไม่พบ Cloudflare API token |
? |
unresolved | การรันก่อนหน้าขอสิ่งนี้และไม่เคยบันทึกคำตอบ หรือมันล้มเหลว apply ตรวจบัญชีก่อนทำซ้ำ และปฏิเสธแทนการเดา |
↻ |
re-checked | การตรวจที่รันทุกครั้งที่ apply |
verb ของตัวติดตั้ง: npm run install:cms
หัวข้อที่มีชื่อว่า “verb ของตัวติดตั้ง: npm run install:cms”npm run install:cms -- <verb> [options]| Verb | ทำอะไร | เปลี่ยนบัญชีหรือไม่ |
|---|---|---|
plan |
บอกว่าการติดตั้งจะทำอะไร เหมือนกับ npm run plan |
ไม่ |
apply |
รันการติดตั้ง | ใช่ สร้างทรัพยากรที่มีค่าใช้จ่าย |
resume |
ทำการติดตั้งที่หยุดกลางทางต่อ ปฏิเสธหากยังไม่มีขั้นตอนใดเสร็จ | ใช่ สร้างทรัพยากรที่มีค่าใช้จ่าย |
doctor |
การตรวจ preflight ไม่เปลี่ยนอะไร | ไม่ |
verify |
ขับ deployment แบบ end to end อย่าชี้มันไปที่ production ที่นั่นให้เพิ่ม --read-only |
สร้างไซต์ model และเนื้อหา เว้นแต่ใช้ --read-only |
teardown |
ลบสิ่งที่การติดตั้งสร้างไว้ เป็น dry run เว้นแต่ส่ง --apply |
เฉพาะเมื่อใช้ --apply |
manifest |
แสดงบันทึกของการติดตั้งที่ปกปิดข้อมูลแล้ว (บัญชี ชื่อทรัพยากร ประวัติขั้นตอน) สำหรับส่งมอบ ไม่มี credential อยู่ในนั้นเลย | ไม่ |
apply และ resume รันเอนจินเดียวกับ npm run setup step ledger คือสิ่งที่ทำให้
การรันครั้งที่สองทำต่อแทนการทำซ้ำ: แต่ละขั้นตอนที่เสร็จจะถูกบันทึกในไฟล์ ledger ที่
root ของ repository หนึ่งไฟล์ต่อหนึ่งบัญชี Cloudflare (.dee-wan-cms-install.<account>.json) ไฟล์
ledger ที่อ่านได้ไม่ครบจะหยุดการรันแทนที่จะถูกละเลย
ตัวเลือก:
| ตัวเลือก | ความหมาย |
|---|---|
--config <file> |
การติดตั้งที่จะดำเนินการ ค่าเริ่มต้น wrangler.jsonc ชื่อเปล่า ๆ จะค้นหาใน backend/ |
--account <id> |
บัญชี Cloudflare เป้าหมายแบบระบุชัด ทุกขั้นตอนที่ verb รันจะถูก pin ไว้กับบัญชีนี้ |
--json |
ผลลัพธ์ที่เครื่องอ่านได้ มีผลเท่ากับ --yes |
--yes, -y |
ไม่ถามเลย ล้มเหลวแทนการถาม |
verify ยังส่งต่อ --read-only, --public, --admin, --email, --model และ
--disposable และ teardown ส่งต่อ --apply และ --yes ตัวเลือกอื่นใด ตัวเลือกที่ใส่ซ้ำ
หรือตัวเลือกที่มีค่าว่าง (เช่น --account= จากตัวแปร shell ที่ไม่ได้ตั้ง) จะถูก
ปฏิเสธ ไม่ถูกละเลย
apply, resume, teardown และ verify (เว้นแต่ใช้ --read-only) ต้องมีบัญชี มันจะใช้
จาก --account จากนั้น CLOUDFLARE_ACCOUNT_ID จากนั้น account_id ใน config และปฏิเสธหาก
ไม่มีการระบุเลย
Exit code
หัวข้อที่มีชื่อว่า “Exit code”install:cms จบด้วยรหัสที่ตายตัว เพื่อให้สคริปต์แยกกรณีตามผลลัพธ์ได้:
| รหัส | ชื่อ | ความหมาย | ต้องทำอะไร |
|---|---|---|---|
| 0 | ok | การติดตั้งเสร็จสมบูรณ์ | ไม่ต้องทำอะไร |
| 1 | usage | command line ผิด หรือ resume ไม่พบสิ่งที่จะทำต่อ |
แก้คำสั่ง |
| 2 | blocked | ขาดสิ่งที่คุณเท่านั้นที่ให้ได้ เช่น token หรือบัญชี | ให้สิ่งนั้น แล้วรันอีกครั้ง |
| 3 | failed | การรันพัง | อ่านผลลัพธ์และแก้สาเหตุก่อนทำซ้ำ |
| 4 | incomplete | การรันไม่พัง แต่ยังมีงานเหลือ | ลองใหม่ได้อย่างปลอดภัยตามเดิม ปกติด้วย resume |
| 5 | unresolved | ขั้นตอนหนึ่งเริ่มไปแล้วและไม่ทราบผลลัพธ์ | ดูบัญชีก่อนทำซ้ำสิ่งใด |
plan ใช้รหัสเดียวกันเพื่ออธิบายสถานะปัจจุบัน: 2 เมื่อมีขั้นตอนที่ blocked, 5 เมื่อมีขั้นตอน
unresolved, 4 เมื่อยังมีงานเหลือ และ 0 เมื่อทุกอย่างเสร็จ
การรันแบบไม่มีผู้ดูแล
หัวข้อที่มีชื่อว่า “การรันแบบไม่มีผู้ดูแล”เมื่อใช้ --yes, --json, DEEWAN_YES=1 หรือ CI=true ทุกคำถามจะใช้ค่าเริ่มต้น คำถาม
ที่ไม่มีค่าเริ่มต้นที่ปลอดภัยจะเป็นข้อผิดพลาดที่ระบุการตั้งค่าที่ต้องเพิ่ม แทนการเดา:
- การติดตั้งอยู่ที่ใด: ตั้ง
"DOMAIN_MODE": "custom"พร้อม"DOMAIN"หรือ"DOMAIN_MODE": "cloudflare"ใต้varsในbackend/wrangler.jsonc - D1 plan: ตั้ง
"D1_PLAN": "free"หรือ"paid"ใต้varsหรือ exportD1_PLAN - บัญชี เมื่อ token เข้าถึงได้หลายบัญชี: ตั้ง
account_idใน config หรือ exportCLOUDFLARE_ACCOUNT_ID - ผู้ดูแลคนแรก: ตั้ง
BOOTSTRAP_ADMIN_EMAILใต้varsการรันแบบไม่มีผู้ดูแลจะไม่ ถามค่านี้ และหากไม่มีก็จะออก claim link ไม่ได้
ตัวอย่าง:
npm run install:cms -- apply --account <account-id> --jsonการใช้บัญชี Cloudflare ร่วมกัน
หัวข้อที่มีชื่อว่า “การใช้บัญชี Cloudflare ร่วมกัน”ชื่อทรัพยากรเริ่มต้น (dee-wan-cms-backend, dee-wan-cms-db และอื่น ๆ) ตายตัว ดังนั้นการติดตั้ง
สองชุดในบัญชี Cloudflare เดียวจะชนกัน ตั้ง DEEWAN_RESOURCE_PREFIX เพื่อแยก namespace ให้ทุก
ทรัพยากรที่การรันจัดเตรียม:
DEEWAN_RESOURCE_PREFIX=test-a1b2 npm run setup # creates test-a1b2-dee-wan-cms-db, …prefix ต้องเป็นตัวอักษรพิมพ์เล็ก ตัวเลข และขีด ขึ้นต้นด้วยตัวอักษรหรือตัวเลข และยาว ไม่เกิน 24 ตัวอักษร
ตั้งค่านี้สำหรับการติดตั้งใหม่ ไม่ใช่การติดตั้งที่มีอยู่ Wrangler หาฐานข้อมูล D1 จากชื่อใน
backend/wrangler.jsonc ดังนั้น prefix จะใช้ได้ก็ต่อเมื่อ setup เขียนชื่อที่มี prefix ลงใน
ไฟล์นั้นแล้ว ดูการรันตัวติดตั้งกับบัญชีที่ใช้ร่วมกัน
teardown ไม่ได้ตัดสินจากชื่อ มันลบเฉพาะสิ่งที่ install record ระบุว่าการติดตั้งนี้สร้างขึ้น ดูเริ่มใหม่หรือรื้อถอน
หลังติดตั้ง
หัวข้อที่มีชื่อว่า “หลังติดตั้ง”Claim การติดตั้ง
หัวข้อที่มีชื่อว่า “Claim การติดตั้ง”ไม่มีใครมีบัญชีจนกว่าการติดตั้งจะถูก claim npm run setup แสดง claim link ใช้ครั้งเดียว
หนึ่งครั้ง พร้อมที่อยู่อีเมลที่ผูกไว้และเวลาหมดอายุ ลิงก์หมดอายุหลัง 15 นาที
เก็บเพียง hash จึงแสดงซ้ำไม่ได้
เปิดลิงก์และสร้างผู้ดูแลคนแรกตามที่อธิบายใน สร้างและเปลี่ยนผู้ดูแลระบบคนแรก
หากลิงก์หมดอายุก่อนมีคนใช้ ให้รันตัวติดตั้งอีกครั้ง (npm run setup หรือ
npm run install:cms -- resume) claim link ที่หมดอายุนับว่ายังไม่เสร็จ ดังนั้นการรันจะออกลิงก์ใหม่
ตราบที่การติดตั้งยังไม่ถูก claim npm run claim:link ก็ใช้แทนลิงก์ได้เช่นกัน ดู
สร้างและเปลี่ยนผู้ดูแลระบบคนแรก
ตรวจว่ามันทำงาน
หัวข้อที่มีชื่อว่า “ตรวจว่ามันทำงาน”npm run healthรันการตรวจหลัง deploy กับที่อยู่ที่ deploy แล้ว เมื่อเปิด Access มัน ยังตรวจขอบเขตป้องกันด้วย โดยใช้ service token ในCF_ACCESS_CLIENT_IDและCF_ACCESS_CLIENT_SECRETnpm run verify -- --read-only --public <public-api-url>ตรวจ deployment โดยไม่เขียน อะไรเลย เพิ่ม--model <slug>เพื่ออ่าน model ที่เผยแพร่แล้วหนึ่งตัวnpm run verify -- --admin <url> --public <url> --email <address> --disposableพร้อมVERIFY_PASSWORDใน environment จะสร้างไซต์ model และเนื้อหา ใช้เฉพาะบน deployment แบบใช้แล้วทิ้ง: admin API ปิดใช้งานไซต์ได้แต่ลบไม่ได้npm run doctorคือ preflight แบบ read-only ที่ระบุสิ่งที่ขาดและวิธีแก้npm run planควรรายงานว่าไม่มีอะไรเหลือให้ทำ
เพิ่ม secret สำหรับฟีเจอร์ที่ไม่บังคับ
หัวข้อที่มีชื่อว่า “เพิ่ม secret สำหรับฟีเจอร์ที่ไม่บังคับ”secret ถูกตั้งด้วย wrangler secret put จากไดเรกทอรี backend/ ไม่ใช่ในไฟล์ ตัวอย่าง
ฟีเจอร์ AI ต้องมี DeepInfra key:
npx wrangler secret put DEEPINFRA_API_KEYหากใช้ผู้ให้บริการที่เข้ากันได้กับ OpenAI ให้ตั้งตัวแปร Worker AI_PROVIDER="openai-compatible", AI_BASE_URL และ AI_TEXT_MODEL แล้วเพิ่ม AI_API_KEY ด้วย wrangler secret put ตัวแปร AI_VISION_MODEL และ AI_IMAGE_MODEL เปิดการอ่านและสร้างภาพตามลำดับ รายการโมเดลที่การติดตั้งอนุญาตใช้ AI_TEXT_MODELS, AI_VISION_MODELS และ AI_IMAGE_MODELS ดู ผู้ให้บริการ AI
ดูSecrets สำหรับทุก secret และการตั้งค่าที่ไม่บังคับ: อีเมล, GitHub App สำหรับ การส่งมอบผ่าน repository, การ purge cache, ขีดจำกัดของ AI และการรายงานข้อผิดพลาด

การอัปโหลดสื่อขนาดใหญ่: แอดมินสตรีมเอกสาร เสียง วิดีโอ และไฟล์อื่นได้สูงสุด 100 MB ซึ่งเป็นขีดจำกัด
ขนาด request body ของแพ็กเกจ Free และ Pro ของ Cloudflare แพ็กเกจ Business รับได้ 200 MB และ Enterprise
ได้ถึง 5 GB (Workers limits อ่านเมื่อ
2026-10-12) ตั้งค่านี้เฉพาะเมื่อแพ็กเกจของคุณรับได้มากกว่า: "MEDIA_REQUEST_BODY_LIMIT_BYTES": "200000000"
ใต้ vars ค่าที่เกิน 5 GB จะถูกจำกัดไว้ที่ 5 GB หน้า การตั้งค่า → เว็บไซต์ → ไฟล์สื่อ และหน้าต่างอัปโหลด
แสดงขีดจำกัดที่ใช้อยู่ รูปภาพและเส้นทางที่อ่านทั้งไฟล์ (API จัดการ ปลั๊กอิน และรูปแบบนำเข้าเก่าที่อ่านเข้าหน่วยความจำ) ยังจำกัดที่ 32 MiB การถ่ายโอนไซต์และประวัติแบบแบ่งส่วนรองรับไฟล์ขนาดใหญ่ที่ไซต์รับได้ ดู นำเข้าและย้ายข้อมูล
Deploy การเปลี่ยนแปลง
หัวข้อที่มีชื่อว่า “Deploy การเปลี่ยนแปลง”ตัวติดตั้ง deploy ทุกอย่างครั้งเดียว หลังจากคุณเปลี่ยนโค้ดหรือการตั้งค่า ให้ deploy อีกครั้ง:
npm run deploy # admin UI, admin Worker, public read Worker and form intake Workernpm run healthdeploy ปฏิเสธที่จะรันหากไม่มี backend/wrangler.public.jsonc การติดตั้งที่ตั้งใจ
ไม่ให้บริการเนื้อหาสาธารณะ deploy ด้วย npm run deploy -- --admin-only ดู
Deploy
deploy ยัง deploy backend/wrangler.intake.jsonc ด้วยเมื่อมีไฟล์นี้ ถ้าไม่มี หรือใช้
--no-form-intake จะไม่ deploy intake Worker และแจ้งว่าฟอร์มของเว็บไซต์จะไม่รับการส่ง เมื่อใช้ admin
config ที่ไม่ใช่ค่าเริ่มต้น ให้ระบุ intake config ด้วย --intake-config <file>
ฟอร์มของเว็บไซต์ส่งข้อมูลไปที่ /v1/interactions/form.submit บน host ของไซต์เอง route
<host>/v1/interactions/* ส่งข้อมูลเหล่านั้นไปยัง intake Worker และเจาะจงกว่า route ของ public API
<host>/v1/* managed delivery แนบ route นี้ให้ทุก host ของไซต์เมื่อ deployment service รันโดยตั้ง
MANAGED_RENDER_INTAKE_WORKER_SCRIPT เป็นชื่อของ intake Worker สำหรับ host ของไซต์อื่น ให้เพิ่ม route
นี้ให้ intake Worker เอง npm run provision:site ผูก database ของแต่ละไซต์กับ intake Worker ด้วยเมื่อมี
backend/wrangler.intake.jsonc
การอัปเกรด
หัวข้อที่มีชื่อว่า “การอัปเกรด”Dee Wan ยังไม่เคยรีลีส คำสั่ง migration ไม่อัปเกรดฐานข้อมูลที่สร้างจากสคีมาพื้นฐานของรุ่นพัฒนาเก่า กรณีนี้ให้ทำตามก่อนรีลีสแรก การสร้างฐานข้อมูลในเครื่องใหม่จะลบข้อมูลเดิม
หลังรีลีสแรก ให้ใช้ขั้นตอนต่อไปนี้จากรากของรีโพซิทอรีเพื่ออัปเกรดระหว่างรีลีส:
git pullnpm run submodules:sync # update packages/ to the new pinsnode scripts/install-dependencies.mjs # reinstall root and backend dependenciesnode scripts/install-dependencies.mjs frontend # reinstall admin UI dependenciesnpm run build:packages && npm run prisma:generate # rebuild the vendored packages and Prisma clientnpm run migrate:d1 # apply new migrations to the control databasenpm run tenant:upgrade # only if you used npm run provision:sitenpm run deploynpm run health- การสร้างใหม่อย่างชัดเจนเตรียมแพ็กเกจและ Prisma client ก่อน migration ส่วน
setup,deployและmigrate:d1ก็จะสร้างผลลัพธ์ที่ขาดหายหรือล้าสมัยใหม่ โดยเทียบลายนิ้วมือของซอร์สและผลลัพธ์ migrate:d1แสดง config และฐานข้อมูลที่กำลังจะเปลี่ยนก่อนรัน เพิ่ม-- --config <file>สำหรับการติดตั้งที่ไม่ใช่backend/wrangler.jsoncและส่ง--configเดียวกัน (พร้อม--public-config) ให้deploytenant:upgradeพาฐานข้อมูลรายไซต์ที่มีอยู่ไปข้างหน้า รันnpm run tenant:upgrade -- --planก่อนเพื่อดูว่าแต่ละไซต์ขาดอะไรโดยไม่เขียนอะไรเลยdeployปฏิเสธการส่ง admin Worker ขณะที่ฐานข้อมูลควบคุมมี migration ค้างอยู่ หรือ เมื่อมันบอกไม่ได้ ดังนั้นการรันก่อนmigrate:d1จะหยุดแทนที่จะ deploy โค้ดใหม่บน schema เก่า--skip-migration-checkoverride การตรวจนี้ ใช้เฉพาะเมื่อคุณรู้ว่าโค้ดใหม่ ไม่ต้องการ migration ที่ค้างอยู่
ดูMigration ของฐานข้อมูล ว่าคำสั่ง migration ทำอะไรและวิธี กู้คืนจาก migration ที่ล้มเหลว
เริ่มใหม่หรือรื้อถอน
หัวข้อที่มีชื่อว่า “เริ่มใหม่หรือรื้อถอน”npm run teardown ลบสิ่งที่ setup สร้างไว้สำหรับการติดตั้งหนึ่งชุด หากไม่มี --apply มันเป็น dry
run: แสดงทุกทรัพยากรที่จะลบและทุกทรัพยากรที่จะเก็บไว้ พร้อมเหตุผล และ
ไม่เปลี่ยนแปลงอะไร
npm run teardown # dry run of the default installationnpm run teardown -- --apply # delete itการติดตั้งชุดไหน
หัวข้อที่มีชื่อว่า “การติดตั้งชุดไหน”หากไม่มีตัวเลือก teardown ทำงานกับการติดตั้งเริ่มต้น: backend/wrangler.jsonc พร้อม
backend/wrangler.public.jsonc และ backend/wrangler.intake.jsonc สำหรับการติดตั้งอื่น ให้ระบุ
ไฟล์ config ของมัน:
npm run teardown -- --config <admin config> --public-config <public config> --intake-config <intake config>config คู่กันที่คุณไม่ได้ระบุจะถือว่าไม่มี teardown ไม่เคยยืมไฟล์คู่กันของการติดตั้ง เริ่มต้นมาใช้
สิ่งที่มันลบ
หัวข้อที่มีชื่อว่า “สิ่งที่มันลบ”- admin Worker, public-read Worker และ form-intake Worker พร้อม route และ custom domain ของมัน
- Pages project
- ฐานข้อมูล D1
- R2 bucket แต่ละ bucket ถูกล้างให้ว่างแล้วจึงลบ
- Access application
- DNS record และกฎจำกัดอัตราที่ setup สร้าง
- managed renderer ที่บันทึกไว้สำหรับไซต์ที่เลือก
สิ่งที่มันเก็บไว้
หัวข้อที่มีชื่อว่า “สิ่งที่มันเก็บไว้”setup เขียน install record คือ .dee-wan-cms-install.<account>.json ที่ root ของ repository มันคือ
ไฟล์เดียวกับ step ledger teardown ลบเฉพาะทรัพยากรที่ record ระบุว่าการติดตั้งนี้สร้างขึ้น
และยังตรงกับตัวตนที่บันทึกไว้ของมัน มันแสดงรายการและเก็บไว้:
- ทรัพยากรที่ setup พบว่ามีอยู่แล้วและนำมาใช้ รวมถึง R2 bucket
- ทรัพยากรที่เปลี่ยนไปหลังจาก setup บันทึกไว้
- ทรัพยากรที่ setup ยังไม่ได้ยืนยันว่าสร้างแล้ว เช่น หลังการรันที่ถูกขัดจังหวะ การรัน setup อีกครั้ง จะยืนยันทรัพยากรเหล่านั้น
- ทรัพยากรที่มันอ่านไม่ได้ teardown จะไม่ลบอะไรจนกว่าทรัพยากรเหล่านั้นจะตอบกลับ
- ฐานข้อมูล D1 และ R2 bucket ตราบที่ยังมี Worker ใดของการติดตั้งนี้ deploy อยู่
teardown ไม่เคยลบไฟล์ config บน local ของคุณ
เมื่อใช้ --apply คุณเลือกว่าจะ export แต่ละฐานข้อมูล D1 เป็นไฟล์ .sql บน local ก่อนหรือไม่ จากนั้น
teardown จะแสดงชื่อบัญชี Cloudflare และถามว่าใช่หรือไม่ คำตอบเริ่มต้นคือไม่
แบบไม่มีผู้ดูแล ให้ส่ง --yes พร้อม --export-dir <directory> หรือ --skip-export หากไม่มี
--yes การรันแบบไม่มีผู้ดูแลจะตอบว่าไม่และไม่ลบอะไรเลย
teardown ลบตามลำดับนี้: route, custom domain, DNS record และ Access application ก่อน จากนั้น Worker และ Pages project แล้วจึง R2 bucket และฐานข้อมูล D1 มันยืนยัน การลบแต่ละรายการด้วยการอ่านทรัพยากรนั้นกลับมา
หากมีสิ่งใดล้มเหลว install record จะยังอยู่ และ teardown แสดงรายการสิ่งที่เหลือ แก้สาเหตุแล้วรัน อีกครั้ง record จะถูกลบก็ต่อเมื่อทุกสิ่งที่มันระบุหายไปแล้วเท่านั้น
install record ที่เขียนโดยตัวติดตั้งเวอร์ชันเก่าจะถูกปฏิเสธพร้อมข้อความ ให้ย้ายไฟล์นั้น ออกไปก่อนรัน teardown
npm run install:cms -- teardown รัน script เดียวกันสำหรับ config และบัญชีที่เลือก มัน
ส่งต่อ --apply, --yes, --public-config, --intake-config, --export-dir และ
--skip-export
การแก้ไขปัญหา
หัวข้อที่มีชื่อว่า “การแก้ไขปัญหา”เริ่มด้วย npm run doctor และ npm run plan doctor ระบุสิ่งที่ขาดและวิธีแก้
plan แสดงว่าขั้นตอนใด done, เหลือ, blocked หรือ unresolved โดยไม่แตะเครือข่าย
การ build admin UI ล้มเหลวเพราะหา package หรือ vite ไม่พบ dependency ของ admin UI
ยังไม่ได้ติดตั้ง รัน node scripts/install-dependencies.mjs frontend
ตัวติดตั้งบอกว่าตั้ง DOMAIN แล้วแต่ไม่มี DOMAIN_MODE โดเมนที่ไม่มีโหมดจะถูกปฏิเสธ
ไม่ถูกถือเป็นโดเมนของคุณเอง ใต้ vars ใน backend/wrangler.jsonc ให้ตั้ง
"DOMAIN_MODE": "custom" เพื่อใช้โดเมนนั้น หรือตั้ง "DOMAIN_MODE": "cloudflare" แล้วลบ
DOMAIN จากนั้นรันใหม่ ยังไม่มีอะไรถูกสร้าง
การรันหยุดกลางทาง ทำต่อด้วย npm run install:cms -- resume ขั้นตอนที่เสร็จแล้ว
จะไม่ถูกทำซ้ำ resume ปฏิเสธเมื่อยังไม่มีอะไรเสร็จ
ในกรณีนั้นให้ใช้ apply
Exit code 4 (incomplete) การรันไม่พังและลองใหม่ตามเดิมได้อย่างปลอดภัย อ่าน ผลลัพธ์ว่าอะไรเหลือ ซึ่งปกติเป็นสิ่งที่ต้องแก้ที่ Cloudflare แล้วทำต่อ
Exit code 3 (failed) อ่านผลลัพธ์ แก้สาเหตุ แล้วรันอีกครั้ง
Exit code 5 หรือขั้นตอนที่มีเครื่องหมาย ? (unresolved) การรันก่อนหน้าขอบางอย่างจาก Cloudflare
และไม่เคยบันทึกคำตอบ หรือมันล้มเหลว ตัวติดตั้งตรวจบัญชีก่อนทำขั้นตอนนั้น
ซ้ำ และปฏิเสธหากบอกไม่ได้ ดูทรัพยากรที่ระบุในบัญชี Cloudflare ของคุณ แก้ไข
แล้วรันอีกครั้ง
Preflight ล้มเหลว setup หยุดก่อนสร้างสิ่งใด แก้แถวที่มีเครื่องหมาย FAIL ในรายงาน
แล้วรันอีกครั้ง
ตรวจสอบ token ไม่ได้ ตรวจสิทธิ์ วันหมดอายุ และว่ามันครอบคลุม บัญชี ไม่มีอะไรถูกสร้างจนกว่ามันจะผ่านการตรวจสอบ
“the API token lacks Zone → WAF → Edit” กฎจำกัดอัตราถูกข้าม การติดตั้งดำเนินต่อ
โดยไม่มีกฎนั้น เพิ่มสิทธิ์แล้วรัน setup อีกครั้งหากคุณต้องการกฎนั้น
การรันแบบไม่มีผู้ดูแลหยุดเพราะขาดคำตอบ ข้อความจะระบุการตั้งค่าที่ต้องเพิ่มลงใน
backend/wrangler.jsonc (หรือตัวแปร environment ที่ต้อง export) เพิ่มแล้วรันอีกครั้ง ดู
การรันแบบไม่มีผู้ดูแล
“Setup did not complete: this deployment has no way in.” ออก claim link ไม่ได้ หรือ
session signing secret ไม่ได้ถูกติดตั้ง ตั้ง BOOTSTRAP_ADMIN_EMAIL ใต้ vars ใน
backend/wrangler.jsonc (หนึ่งที่อยู่พอดี) แก้สาเหตุใด ๆ ที่ผลลัพธ์ระบุ แล้วรัน setup
อีกครั้ง
deploy ปฏิเสธเพราะมี migration ค้างอยู่ apply ด้วย npm run migrate:d1 แล้ว deploy
อีกครั้ง ดูการอัปเกรด
claim link หมดอายุ รันตัวติดตั้งอีกครั้งเพื่อออกลิงก์ใหม่ ดู Claim การติดตั้ง
ขั้นตอนถัดไป
หัวข้อที่มีชื่อว่า “ขั้นตอนถัดไป”เปิดลิงก์ claim แล้ว ตั้งค่าผู้ดูแลคนแรก
ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: e207e63239a627fbd2ae9c414ef7c6eb19fcfe5a (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-21T09:28:24.214Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง