ข้ามไปยังเนื้อหา
Dee Wan 1.0 ยังอยู่ระหว่างพัฒนาและยังไม่เปิดตัว (pre-MVP) — ดู ขอบเขตผลิตภัณฑ์ 1.0

การติดตั้ง 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 และมันปิดอยู่จนกว่าคุณจะเปิด

หน้าต่างเทอร์มินัล
git clone --recurse-submodules https://github.com/dee-wan-cms/dee-wan.git
cd dee-wan
node scripts/install-dependencies.mjs
node 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

ตัวติดตั้งต้องใช้ 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 prompt
export CLOUDFLARE_ACCOUNT_ID=… # skips the account picker

credential ถูก resolve ตามลำดับนี้: ตัวแปรที่ export ใน shell ของคุณ จากนั้นไฟล์ .env ของ repository จากนั้นค่าใน backend/wrangler.jsonc เมื่อ environment override ค่าที่ ต่างกันใน config ตัวติดตั้งจะบอก

token ถูกตรวจก่อนสร้างสิ่งใด การรันแบบโต้ตอบให้ลองสามครั้ง การรันแบบ ไม่โต้ตอบหยุดที่ความล้มเหลวครั้งแรก ไม่ว่าแบบใด หากตรวจสอบโทเค็นไม่ได้ ระบบจะไม่สร้างทรัพยากร Cloudflare ใด ๆ

secret ของแอปพลิเคชันไม่ถูกเก็บใน wrangler.jsonc เลย ดูSecrets

หน้าต่างเทอร์มินัล
npm run setup

setup พาคุณผ่านการติดตั้งและบันทึกแต่ละคำตอบลงใน backend/wrangler.jsonc ไปพร้อมกัน ดังนั้นการรันครั้งที่สองจะไม่ถามซ้ำ ตามลำดับ มันจะ:

  1. หาหรือสร้าง backend/wrangler.jsonc และ resolve token กับบัญชี หาก token เข้าถึงได้หลายบัญชี มันจะถามว่าจะใช้บัญชีใด
  2. ถามว่าบัญชีใช้ D1 plan ใด (Free 500 MB ต่อฐานข้อมูล Paid 10 GB ต่อฐานข้อมูล)
  3. รัน preflight และแสดงรายงาน หากการตรวจล้มเหลว มันจะหยุดก่อนสร้างสิ่งใด (“Setup stopped before creating any Cloudflare resources. Fix the FAIL rows above.”) หากจะมีทรัพยากร ถูกสร้างหรือแก้ไข มันจะขอให้คุณยืนยัน
  4. ถามว่าการติดตั้งจะอยู่ที่ใด (domain ของคุณเอง หรือที่อยู่ที่ Cloudflare ให้มา) จากนั้นถาม domain, admin subdomain (ค่าเริ่มต้น cms) และ subdomain ของ public content API (ค่าเริ่มต้น content)
  5. ถามว่าจะตั้งค่า DNS หรือไม่ จะตั้งค่า Cloudflare Access หรือไม่ (ค่าเริ่มต้น ไม่) และจะ ติดตั้งกฎจำกัดอัตราบน public API หรือไม่ (ค่าเริ่มต้น ไม่)
  6. ถามชื่อ Pages project และชื่อ Worker
  7. ถาม storage provider ว่าเป็น Cloudflare R2 หรือ Cloudflare Images สำหรับ R2 มันจะสร้าง bucket (ค่าเริ่มต้น dee-wan-cms-images) เปิดการเข้าถึงสาธารณะผ่านที่อยู่ r2.dev ที่จัดการให้ หรือ media domain ที่กำหนดเอง และตรวจว่าไฟล์ที่อัปโหลดถูกให้บริการจริง
  8. ถามว่าจะเปิดการนำเข้าข้อมูลหรือไม่ ซึ่งจะสร้าง R2 bucket ส่วนตัวสำหรับ archive ที่อัปโหลด (ค่าเริ่มต้น ไม่)
  9. สร้างฐานข้อมูล D1 และเสนอให้ apply schema (ค่าเริ่มต้น ใช่) การติดตั้งใหม่ไม่ต้องมี ขั้นตอน migrate แยก
  10. 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 ลงตัวแล้ว และไม่เขียนทับไฟล์ที่มีอยู่
  11. เสนอให้รัน health check
  12. ถามอีเมลของผู้ดูแลคนแรก หากยังไม่ได้ตั้ง 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 -- --json

plan แสดงทุกขั้นตอนที่การติดตั้งจะทำ และสถานะที่แต่ละขั้นตอนเป็นอยู่แล้ว มัน ทำงานจากการตั้งค่าและ ledger บนดิสก์เท่านั้น: ไม่แตะเครือข่าย ไม่สร้างอะไร และ ไม่มีค่าใช้จ่าย --json แสดงแผนที่เครื่องอ่านได้พร้อม planVersion

แต่ละขั้นตอนมีสถานะใดสถานะหนึ่งต่อไปนี้:

เครื่องหมาย สถานะ ความหมาย
✓ done บันทึกว่าเสร็จแล้ว
• to do จะรัน
– not applicable ข้ามสำหรับการตั้งค่านี้ พร้อมเหตุผล
✗ blocked ยังรันไม่ได้ เช่นเพราะไม่พบ Cloudflare API token
? unresolved การรันก่อนหน้าขอสิ่งนี้และไม่เคยบันทึกคำตอบ หรือมันล้มเหลว apply ตรวจบัญชีก่อนทำซ้ำ และปฏิเสธแทนการเดา
↻ re-checked การตรวจที่รันทุกครั้งที่ apply
หน้าต่างเทอร์มินัล
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 และปฏิเสธหาก ไม่มีการระบุเลย

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 หรือ export D1_PLAN
  • บัญชี เมื่อ token เข้าถึงได้หลายบัญชี: ตั้ง account_id ใน config หรือ export CLOUDFLARE_ACCOUNT_ID
  • ผู้ดูแลคนแรก: ตั้ง BOOTSTRAP_ADMIN_EMAIL ใต้ vars การรันแบบไม่มีผู้ดูแลจะไม่ ถามค่านี้ และหากไม่มีก็จะออก claim link ไม่ได้

ตัวอย่าง:

หน้าต่างเทอร์มินัล
npm run install:cms -- apply --account <account-id> --json

ชื่อทรัพยากรเริ่มต้น (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 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_SECRET
  • npm 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 ถูกตั้งด้วย 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 อีกครั้ง:

หน้าต่างเทอร์มินัล
npm run deploy # admin UI, admin Worker, public read Worker and form intake Worker
npm run health

deploy ปฏิเสธที่จะรันหากไม่มี 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 pull
npm run submodules:sync # update packages/ to the new pins
node scripts/install-dependencies.mjs # reinstall root and backend dependencies
node scripts/install-dependencies.mjs frontend # reinstall admin UI dependencies
npm run build:packages && npm run prisma:generate # rebuild the vendored packages and Prisma client
npm run migrate:d1 # apply new migrations to the control database
npm run tenant:upgrade # only if you used npm run provision:site
npm run deploy
npm run health
  • การสร้างใหม่อย่างชัดเจนเตรียมแพ็กเกจและ Prisma client ก่อน migration ส่วน setup, deploy และ migrate:d1 ก็จะสร้างผลลัพธ์ที่ขาดหายหรือล้าสมัยใหม่ โดยเทียบลายนิ้วมือของซอร์สและผลลัพธ์
  • migrate:d1 แสดง config และฐานข้อมูลที่กำลังจะเปลี่ยนก่อนรัน เพิ่ม -- --config <file> สำหรับการติดตั้งที่ไม่ใช่ backend/wrangler.jsonc และส่ง --config เดียวกัน (พร้อม --public-config) ให้ deploy
  • tenant:upgrade พาฐานข้อมูลรายไซต์ที่มีอยู่ไปข้างหน้า รัน npm run tenant:upgrade -- --plan ก่อนเพื่อดูว่าแต่ละไซต์ขาดอะไรโดยไม่เขียนอะไรเลย
  • deploy ปฏิเสธการส่ง admin Worker ขณะที่ฐานข้อมูลควบคุมมี migration ค้างอยู่ หรือ เมื่อมันบอกไม่ได้ ดังนั้นการรันก่อน migrate:d1 จะหยุดแทนที่จะ deploy โค้ดใหม่บน schema เก่า --skip-migration-check override การตรวจนี้ ใช้เฉพาะเมื่อคุณรู้ว่าโค้ดใหม่ ไม่ต้องการ migration ที่ค้างอยู่

ดูMigration ของฐานข้อมูล ว่าคำสั่ง migration ทำอะไรและวิธี กู้คืนจาก migration ที่ล้มเหลว

npm run teardown ลบสิ่งที่ setup สร้างไว้สำหรับการติดตั้งหนึ่งชุด หากไม่มี --apply มันเป็น dry run: แสดงทุกทรัพยากรที่จะลบและทุกทรัพยากรที่จะเก็บไว้ พร้อมเหตุผล และ ไม่เปลี่ยนแปลงอะไร

หน้าต่างเทอร์มินัล
npm run teardown # dry run of the default installation
npm 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
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง