การขยายแบ็กเอนด์
ไม่จำเป็นต้องแยกออกเพื่อปรับแต่งรีโพซิทอรีที่สร้างให้ ส่วนขยาย owned/shared ใช้ได้ขณะรีโพซิทอรียังเชื่อมต่อกับ Dee Wan แยกออกเมื่อต้องการหยุดการสร้างใหม่ที่ Dee Wan จัดการเท่านั้น แบ็กเอนด์อิสระ: ภาพรวม อธิบายแบ็กเอนด์ที่สร้าง และ รายละเอียดการทำงาน แสดงแพ็กเกจที่ใช้
ขั้นตอนขณะยังเชื่อมต่อ
หัวข้อที่มีชื่อว่า “ขั้นตอนขณะยังเชื่อมต่อ”- สร้างโครงการในเครื่องด้วย
npm run backend:generateหรือnpm run backend:deliverการตั้งค่า → ซอร์สโค้ดและการเผยแพร่ คอมไพล์ซอร์สไม่ได้ (source_build_runtime_unavailable) - Clone รีโพซิทอรีของเจ้าของ
- แก้ส่วน owned/shared เริ่มที่
src/owned/backend.tsสำหรับปรับ API - รันการตรวจของ artifact แล้ว commit และ push การแก้ไข
- ดีพลอย commit นั้นอย่างเจาะจงผ่าน
deploy-from-repository.yml - ต่อมาสั่งสร้างใหม่จาก Dee Wan งาน owned/shared ถูกเก็บไว้ ถ้าแก้ generated file ระบบจะปฏิเสธ
- แยกออกเฉพาะเมื่อเจ้าของต้องการหยุดการสร้างใหม่ที่ระบบจัดการ
ตารางการยืนยันตัวตน GitHub อธิบายสิทธิ์ที่ใช้ส่งมอบ คู่มือการแยกออก อธิบายการตรวจความเป็นอิสระ การปรับแต่งไม่จำเป็นต้องแยกออก
แก้อะไรได้บ้างขณะยังเชื่อมต่อ?
หัวข้อที่มีชื่อว่า “แก้อะไรได้บ้างขณะยังเชื่อมต่อ?”| สิ่งที่เปลี่ยน | ที่อยู่ | ผลของการสร้างใหม่ |
|---|---|---|
| เปิด/ปิด generated operation, hook, override ที่คงสัญญาเดิม | src/owned/backend.ts |
เก็บไว้ ID ที่ถูกลบ การตั้งค่าขัดกัน และชุด operation ของกลุ่มที่เปลี่ยนไปทำให้การตรวจหรือบิลด์ไม่ผ่าน Generated security อยู่นอก owned policy |
| Declarative API route | Registry เดียวกันด้วย route() |
เก็บไว้ ปฏิเสธพาธชนกันหลัง normalize Schema ที่ถูกต้องเข้า OpenAPI และตรวจขาเข้า/ออก |
| ทางเลือก raw Hono | src/owned/routes.ts |
เก็บไว้และ mount สุดท้าย แทน generated path ไม่ได้ รวม operation ที่ปิด ไม่มีการรับประกันการตรวจ path ชนกัน หรือ OpenAPI สำหรับ raw route |
| Business logic ที่ใช้ซ้ำ | ไฟล์อื่นใต้ src/owned/ |
เก็บทุกไบต์ ให้ import จาก registry หรือ raw route |
| ตารางและ migration ของตัวเอง | SQL/runner ใต้ src/owned/ และ workflow ของตัวเอง |
ซอร์สและตาราง/แถวที่ไม่เกี่ยวข้องอยู่ต่อ ต้องรัน migration อย่างชัดเจน ไม่เพิ่มอัตโนมัติใน generated Prisma schema หรือ migration runner อย่าแก้ generated table |
| dependency และผู้กำหนดเวอร์ชัน | package.json ใน root และ apps/site |
Merge แบบเพิ่มรักษาค่าเดิมและเพิ่ม dependency/override ที่จำเป็นซึ่งขาดอยู่ เวอร์ชันที่เลือกยังต้องตรงกับสัญญาการบิลด์/runtime |
| Wrangler binding และ secret | wrangler.jsonc แบบ shared ของ root/site, workflow และพื้นที่ secret ของคุณ |
รักษาซอร์ส shared Binding ในเครื่องที่เพิ่มไม่ถูกจัดเตรียมหรือคัดลอกไป wrangler.deploy.jsonc อัตโนมัติ ไฟล์ build/deploy ที่สร้างยังเป็น generated ห้าม commit secret |
| CI workflow ของตัวเอง | .github/workflows/<your-name>.yml |
เก็บไว้ ยกเว้นชื่อ workflow ที่สร้างให้สองชื่อ |
| Astro head/body และ layout slot | apps/site/src/owned/Head.astro, BodyEnd.astro, slots/ |
เก็บไว้ Generated layout import ไปใช้ |
| Section wrapper/override | apps/site/src/owned/sections/ |
เก็บไว้ สัญญา section ที่สร้างยังตรวจ type กับโค้ดของคุณ |
| Integration และ island | apps/site/src/owned/config.mjs, owned component, dependency เว็บไซต์ |
เก็บไว้ เพิ่ม integration พร้อมแพ็กเกจ แล้วตรวจ/บิลด์ Astro |
| หน้าของตัวเอง | apps/site/src/pages/owned/ |
เก็บไว้และให้บริการใต้ /owned/ หน้า/redirect ที่สร้างไม่สามารถใช้ namespace นี้ |
| ไฟล์และแถวเนื้อหาที่สร้าง | Schema, client/route/security ที่สร้าง, snapshot, ข้อมูลหน้าและตารางเนื้อหาที่สร้าง | อย่าแก้ขณะเชื่อมต่อ การตรวจ fingerprint, digest และชุดแถวจะปฏิเสธความเปลี่ยนแปลง ให้แก้โมเดล/เนื้อหาใน CMS หรือใช้ส่วน owned |
ระบบรักษา README.md, .nvmrc, .npmrc, .gitignore และไฟล์ Wrangler shared ที่มีอยู่ deploy-from-repository.yml เป็น generated และในอาร์ติแฟกต์ทั้งไซต์ยังมี dee-wan-build.yml ด้วย (อาร์ติแฟกต์ --model ไม่มีบิลด์ไซต์ที่ CMS จัดการ) ส่วน workflow อื่นของคุณเป็น shared ประวัติ SQL migration เดิมถูกเก็บไว้ อย่าเขียนทับ migration ที่ใช้แล้ว
ตัวอย่างพาธแต่ละโซน
หัวข้อที่มีชื่อว่า “ตัวอย่างพาธแต่ละโซน”| พาธ | โซน |
|---|---|
prisma/schema.prisma |
generated |
graduation.manifest.json |
generated |
src/app.ts |
generated |
src/worker.ts |
generated |
src/security.ts |
generated |
src/owned/backend.ts |
owned |
src/owned/routes.ts |
owned |
src/backend-customization.ts |
generated |
.dee-wan-customization.json |
generated |
src/serve-cli.ts |
generated |
migrations/0002_graduation_ledger.sql |
generated |
scripts/regenerate.mjs |
generated |
scripts/emit-migration.mjs |
generated |
scripts/file-manifest.mjs |
generated |
scripts/portable-client.mjs |
generated |
scripts/configure-deployment.mjs |
generated |
tsconfig.json |
generated |
wrangler.example.jsonc |
generated |
wrangler.build.jsonc |
generated |
scripts/load-snapshot.mjs |
generated |
data/published-snapshot.json |
generated |
.github/workflows/dee-wan-build.yml |
generated |
.github/workflows/deploy-from-repository.yml |
generated |
.github/workflows/anything-else.yml |
shared |
package.json |
shared |
package-lock.json |
shared |
.npmrc |
shared |
.nvmrc |
shared |
wrangler.jsonc |
shared |
.gitignore |
shared |
README.md |
shared |
apps/site/src/owned/config.mjs |
owned |
apps/site/src/pages/owned/thanks.astro |
owned |
apps/site/package.json |
shared |
apps/site/package-lock.json |
shared |
apps/site/.npmrc |
shared |
apps/site/wrangler.jsonc |
shared |
apps/site/src/lib/pages.json |
generated |
Registry operation แบบมีชนิดข้อมูล
หัวข้อที่มีชื่อว่า “Registry operation แบบมีชนิดข้อมูล”src/owned/backend.ts สร้างเฉพาะเมื่อไม่มี การสร้างใหม่ไม่เขียนทับ registry เดิม npm run customization:check สร้าง registry ที่หายไปกลับมาโดยไม่มีการปรับแต่งใด ๆ และตรวจรายการ operation ที่สร้างไว้ App ที่สร้าง import ไฟล์นี้ ไม่ได้เลือกพฤติกรรมด้วยลำดับลงทะเบียน route
ตัวอย่างด้านล่างสมมติว่าโมเดลที่สร้างชื่อ Article ใช้ ID และฟิลด์ Prisma จริงจาก src/backend-customization.ts แต่ละตัวอย่างเป็น registry ทางเลือกที่ครบ หากใช้หลายอย่างให้รวมรายการใน defineBackend() เดียว
Request hook หนึ่งรายการ
หัวข้อที่มีชื่อว่า “Request hook หนึ่งรายการ”import { defineBackend } from '../backend-customization'
export default defineBackend({ operations: { 'Article.findMany': { before: [(c) => { c.header('x-content-policy', 'owned') }], }, },})before และ after เป็น hook ของการประมวลผล request ไม่ใช่ Prisma lifecycle, transaction, finally หรือ callback หลัง commit การคืน response ที่จบคำขอหรือ throw error หยุดขั้นตอนที่เหลือ ไม่รับประกันว่า after จะทำงานหลังเกิดข้อผิดพลาด และไม่ใช่หลักฐานว่า transaction commit แล้ว
ครอบการทำงานที่สร้างให้
หัวข้อที่มีชื่อว่า “ครอบการทำงานที่สร้างให้”import { defineBackend } from '../backend-customization'
export default defineBackend({ operations: { 'Article.findMany': { override: async ({ input, args, context, prisma, core }) => { void input void args void context void prisma return [...await core()].reverse() }, }, },})input และ args หมายถึง argument Prisma ที่ parse แล้วชุดเดียวกัน context เป็น principal ที่ตรวจแล้ว prisma เปิดเฉพาะ delegate ของ operation เป้าหมายที่มี guard ไม่มี raw SQL, raw client หรือโมเดล/operation อื่น การอ่านแบบแบ่งหน้าเปิด findMany และ count ที่มี guard core() รันโค้ดที่สร้างด้วย request/guard state เดิม ไม่ใช่ขอบเขต transaction หรือ retry ให้เรียกครั้งเดียวถ้าไม่ได้ตั้งใจทำซ้ำ
แทนที่หนึ่ง operation
หัวข้อที่มีชื่อว่า “แทนที่หนึ่ง operation”import { defineBackend } from '../backend-customization'
export default defineBackend({ operations: { 'Article.findMany': { override: async () => [], }, },})override นี้คืนอาร์เรย์ว่างตามสัญญารายการเดิมและไม่เรียก core() ยังต้องยืนยันตัวตน มีสิทธิ์ และ resolve guard การคืน envelope, สัญญาสถานะ หรือพาธต่างออกไปต้องสร้าง declarative route ใหม่ Type มาจาก argument/result ของ Prisma ที่สร้าง การเปลี่ยนหรือลบโมเดล/operation จะทำให้พบการอ้างอิงที่ล้าสมัยในขั้น typecheck หรือสร้างระบบ
ปิด operation
หัวข้อที่มีชื่อว่า “ปิด operation”import { defineBackend } from '../backend-customization'
export default defineBackend({ operations: { 'Article.delete': { enabled: false } },})enabled: true คง operation ที่สร้างไว้ ไม่เปิด route ที่ไม่มี generated security พาธที่ปิดยังสงวนอยู่ อาร์เรย์ declaration สำหรับ ID เดียวรวม hook ได้ แต่หลาย override, ค่า enable ขัดกัน หรือ disable พร้อม override จะถูกปฏิเสธ
กลุ่มอ่านและเขียน
หัวข้อที่มีชื่อว่า “กลุ่มอ่านและเขียน”import { defineBackend } from '../backend-customization'
export default defineBackend({ groups: [ { name: 'content-reads', select: 'reads', accepted: ['Article.findMany', 'Article.findManyPaginated', 'Article.findUnique'], before: [(c) => { c.header('x-content-read', 'owned') }], }, { name: 'content-writes', select: 'writes', accepted: ['Article.create', 'Article.update', 'Article.delete'], after: [(c) => { c.header('x-content-write', 'owned') }], }, ],})ตัวอย่างสมมติว่า Article เป็นโมเดลเดียวและไม่มีตารางแปล/เชื่อม select: ['Article.findMany', 'Article.findUnique'] เลือก ID อย่างชัดเจน selector แบบ reads/writes ครอบคลุม operation ทั้งหมดในรายการที่สร้าง รวมโมเดลอ่านอย่างเดียว ชื่อกลุ่มต้องไม่ซ้ำ และ hook ทำงานตามลำดับประกาศกลุ่ม
accepted ตรึงชุด ID ที่แน่นอน customization:check บันทึก ID ที่ขยายแล้วใน .dee-wan-customization.json การเพิ่ม/ลบโมเดลหรือ operation ถูกปฏิเสธถ้าชุดเปลี่ยน ตรวจรายการที่เสนอใน error แก้ accepted ของกลุ่มนั้นใน owned registry แล้วสร้างใหม่/ตรวจอีกครั้ง อย่าแก้ generated state หรือใช้ filter จากรายการปัจจุบันคำนวณชุด ID ที่ยอมรับ เพราะจะยอมรับการเปลี่ยนในอนาคตโดยเงียบ
กลุ่มระบุ overrides: { 'Article.findMany': async ({ core }) => core() } แบบมี type สำหรับ ID ในชุดที่ยอมรับได้ Override ที่สองจากอีกกลุ่มหรือการตั้งค่า operation จะถูกปฏิเสธ ลำดับประกาศไม่ได้เลือกผู้ชนะ
Variant เดิมและลำดับ
หัวข้อที่มีชื่อว่า “Variant เดิมและลำดับ”Variant hook ใช้ operations['Article.findMany'].variants.reader.before/after หรือ variant editor ที่สร้าง โดยรวมกับกลไก variant เดิมของ generator Variant ที่ไม่รู้จักและการพยายามกำหนด shape หรือ security ระดับ router ใน owned config จะถูกปฏิเสธ ไม่มีกลไกเลือก variant อีกชุด
ลำดับคือ ยืนยันตัวตน/สิทธิ์ของแพลตฟอร์ม, resolve guard, group before, operation before, variant before, generated/override handler, variant after, operation after, group after และการปกป้อง response/error ชั้นนอก Response/error ที่จบคำขอรักษาพฤติกรรม short-circuit ของ upstream Hook ต้องรักษารูปแบบ request/result ที่ประกาศไว้
เพิ่ม declarative route
หัวข้อที่มีชื่อว่า “เพิ่ม declarative route”import { defineBackend, route } from '../backend-customization'
export default defineBackend({ routes: [route({ method: 'POST', path: '/echo', access: { mode: 'service', operation: 'create' }, request: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'], additionalProperties: false, }, response: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'], additionalProperties: false, }, handler: async ({ input }) => ({ text: input.text }), })],})พาธอ้างอิงจาก /api รองรับ GET, POST, PUT, PATCH และ DELETE กำหนด access.operation เป็น read/create/update/delete และ access.model ถ้าต้องการขอบเขตโมเดลที่สร้าง หากไม่ระบุโมเดล read token ต้องมี scope * Handler ได้ input ที่ตรวจและมี type, principal ที่ยืนยันแล้ว และ path parameter โดยไม่มี raw client
ประกาศ custom route แต่ละรายการด้วย route() ระบบปฏิเสธ descriptor ที่คัดลอกหรือประกอบเองขณะสร้าง Schema ของ request/response ถูกเก็บไว้เมื่อประกาศ การแก้ไขภายหลังจึงเปลี่ยน validation หรือ OpenAPI ไม่ได้
Schema รองรับ string/enum, number ที่เป็นค่าจำกัด ไม่ใช่อนันต์, integer ที่ปลอดภัย, boolean, null, array และ object แบบปิดที่ระบุฟิลด์บังคับ Keyword ที่ไม่รองรับถูกปฏิเสธ ไม่ได้แสดงเป็นกฎ OpenAPI ที่ดูเหมือนถูกบังคับ GET query property ต้องเป็น string ส่วน method อื่น parse JSON body Input ผิดตอบ 400 และผลลัพธ์ผิด schema ตอบ 500
Method และพาธที่ normalize แล้วซ้ำกันระหว่าง generated/declarative route ถูกปฏิเสธ แม้ generated operation ปิดอยู่ Slash ซ้ำ/ท้ายถูก normalize ส่วน wildcard, encoded path, query/fragment และ traversal ไม่รองรับ ชื่อ parameter ต่างกันแต่แทนพาธเดียวกันและ static/parameter ทับกันก็ถูกปฏิเสธ การชน generated route ต้องทำผ่าน operation override เท่านั้น Schema declarative ที่ถูกต้องอยู่ใน /api/openapi.json ที่ต้องยืนยันตัวตน ส่วน raw Hono ไม่มี
ทางเลือก raw Hono
หัวข้อที่มีชื่อว่า “ทางเลือก raw Hono”เก็บ integration แบบ imperative ใน src/owned/routes.ts ซึ่ง mount หลัง generated/declarative route และพาธที่สงวน Raw route ได้การยืนยันตัวตนและปกป้อง error ชั้นนอก แต่ไม่มีการรับประกันการตรวจ path ชนกัน แบบ declarative การตรวจ schema request/result อัตโนมัติ หรือ OpenAPI ที่สร้างให้
Mount เพื่อความเข้ากันได้ยังตีความ scope โมเดลจาก prefix พาธ Raw path ที่ไม่ตรงโมเดลต้องมี wildcard read scope ใช้ .guard(shape, variant) อย่างชัดเจนกับ Prisma query การมี extended client ไม่ได้ปกป้องการเรียกใด ๆ อัตโนมัติ ใช้ metadata แบบ declarative เมื่อพาธไม่ได้แทน generated model
ทุกคำขอต้องยืนยันตัวตนก่อน รวมของคุณด้วย
หัวข้อที่มีชื่อว่า “ทุกคำขอต้องยืนยันตัวตนก่อน รวมของคุณด้วย”นโยบายกำหนดว่า route ยอมรับ anonymous, session หรือ service caller โมเดลที่ไม่ตั้งค่าใช้ service Read token เก็บเป็นแฮชและ model scope ใน ACCESS_CONFIG route ที่ไม่มีโมเดลและ /api/openapi.json ต้องมี wildcard scope Service write ที่ไม่มี writer authenticator ตอบ 503 writes_unavailable ขาดข้อมูลรับรองตอบ 401 และสิทธิ์ถูกปฏิเสธตอบ 403 Better Auth แบบเลือกเปิดให้ session ทั้งในเครื่องและ Worker runtime ในเครื่องและ Worker รับ service bearer API_BEARER_TOKEN ตัวเดียวกัน
การ normalize/redact error อยู่ภายนอก override และ hook รูปแบบ response ใหม่ต้องใช้ route ใหม่ การอนุญาตเพิ่มเติมอยู่ใน business logic และเอาการตรวจแพลตฟอร์มออกไม่ได้
เพิ่มส่วนขยายเว็บไซต์
หัวข้อที่มีชื่อว่า “เพิ่มส่วนขยายเว็บไซต์”แก้ apps/site/src/owned/Head.astro:
<meta name="color-scheme" content="light dark" />เพิ่มหน้าใหม่ที่ apps/site/src/pages/owned/thanks.astro สำหรับ island ให้เพิ่ม integration/dependency ของ framework และตั้งค่า apps/site/src/owned/config.mjs Generated Astro config จะ import ส่วน owned นี้ Head.astro, BodyEnd.astro, layout slot และ section wrapper/override เป็นจุดขยายแยกกัน ส่วน preview bridge ยังเป็นตัวเลือกใน extensions.ts
Dependencies, migration และการสร้างใหม่
หัวข้อที่มีชื่อว่า “Dependencies, migration และการสร้างใหม่”Package manifest ทั้งสองรักษาค่า dependency/override เดิมและเพิ่มรายการจำเป็นที่ขาด Root ยังเพิ่มชื่อ script ที่ไม่มี โดยคำสั่งเดิมยังเป็นของคุณ Generated build/deploy workflow รันการตรวจ customization โดยตรง แม้ยังเก็บคำสั่ง typecheck เดิมของเจ้าของไว้ การเลือก package manager และ lifecycle script ยังเป็นของคุณ เวอร์ชันที่ไม่เข้ากันจะไม่ผ่าน check/build เวอร์ชันที่ตรึงไว้ใน root บันทึกชุดเครื่องมือที่ใช้สร้าง ส่วนช่วงเวอร์ชันเว็บไซต์ถูกตรึงด้วย lockfile ของเว็บไซต์ Manifest อ่านไม่ได้จะปฏิเสธบิลด์ ใช้ตัวติดตั้งที่ตรวจสอบแล้วหลังแก้ไข
เก็บ business logic, SQL และ migration runner ของคุณใต้ src/owned/ รัน migration ของแอปผ่าน workflow ของคุณ Generated Prisma model อธิบายเฉพาะเนื้อหา CMS การเพิ่มตารางแอปไม่ได้เพิ่ม generated model หรือ endpoint อัตโนมัติ รักษาลำดับ migration และแผนย้อนกลับของคุณ
การสร้างใหม่เทียบ fingerprint ของ generated file เก็บ owned/shared file เพิ่ม migration ที่ต้องใช้ และรีเฟรชเนื้อหาที่สร้าง การแก้ generated file และ snapshot ถูกปฏิเสธ เมื่อโหลด snapshot ที่เปลี่ยนไป มันจะแทนที่แถวของทุกตารางเนื้อหาที่สร้าง: แถวที่ไม่มีใน snapshot จะถูกลบ ไม่ว่าใครเป็นผู้เขียน ตารางของคุณเองไม่อยู่ใน snapshot และแถวของมันยังอยู่
npm run regenerate ต้องใช้นิยามของไซต์ใน definitions.json และ GENERATION_SOURCE_VERSION CI ที่ระบบจัดการได้เวอร์ชันจาก CMS และดึงนิยามมาเอง การสร้างใหม่ในเครื่อง แสดงวิธีได้มาทั้งสองอย่าง เมื่อมีครบแล้ว:
node scripts/install-dependencies.mjsGENERATION_SOURCE_VERSION=<version> npm run regeneratenpm run migrate:emitnpm run typechecknode scripts/install-dependencies.mjs apps/sitenpm run --prefix apps/site checknpm run --prefix apps/site buildnpm run buildnpm run files:manifestCommit/push รีโพซิทอรีที่ตรวจแล้ว และรัน deploy-from-repository.yml สำหรับ git_sha ที่แน่นอน ตั้ง CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, API_BEARER_TOKEN และ PUBLIC_HOSTNAME ตาม ทรัพยากรและการตั้งค่า Cloudflare การสร้างใหม่ที่ระบบจัดการเรียก workflow เดียวกันหลัง commit การอัปเดต
สำหรับเซิร์ฟเวอร์ในเครื่องใช้ db:init, build:serve และ serve:local พร้อม access config ในเครื่องและ writer bearer ตาม README ที่สร้างให้ npm run dev รัน Wrangler ในเครื่อง ก่อนดีพลอยให้พิสูจน์การปฏิเสธเมื่อไม่ยืนยันตัวตน การอ่าน/เขียนที่อนุญาต การปฏิเสธจาก guard ผล override และการปิดบังรายละเอียด error Commit โค้ดเก่าไม่ใช่ข้อมูลสำรองฐานข้อมูล การย้อนกลับต้องคำนึงถึง migration และสื่อที่เข้ากันได้ด้วย
การยืนยันตัวตนและสิทธิ์ของอาร์ติแฟกต์แบบเลือกเปิด
หัวข้อที่มีชื่อว่า “การยืนยันตัวตนและสิทธิ์ของอาร์ติแฟกต์แบบเลือกเปิด”ที่ การตั้งค่า → ซอร์สโค้ดและการเผยแพร่ → ตัวเลือกสำหรับนักพัฒนา → แบ็กเอนด์ที่สร้างขึ้น เปิด Better Auth ครั้งเดียวสำหรับทั้งแบ็กเอนด์ แล้วเลือก รหัสผ่าน, ลิงก์เข้าสู่ระบบ (Resend), Google หรือ GitHub ค่าเริ่มต้นคือปิด จึงไม่สร้าง dependency, runtime, route, ตาราง, migration, การตั้งค่าผู้ให้บริการ หรือ secret ของ Better Auth บัญชี CMS, session, invitation, password hash และข้อมูลรับรองผู้ให้บริการไม่ถูกย้าย โมเดลแอปชื่อ User แยกจากตารางตัวตนของอาร์ติแฟกต์
| โหมดสิทธิ์ | ผู้เรียกที่ยอมรับ |
|---|---|
public |
anonymous principal ที่มีชนิดชัดเจน ไม่ต้องมีข้อมูลรับรอง |
session |
session ปัจจุบันจาก Better Auth ของอาร์ติแฟกต์นี้ |
service |
API_BEARER_TOKEN หรือ scoped token ที่อ่านโมเดลนั้นได้ |
session_or_service |
session ของอาร์ติแฟกต์หรือ service authentication |
โมเดลที่ไม่มีการตั้งค่าใช้ service อย่างชัดเจน operation ที่ไม่มี override สืบทอดค่าของโมเดล ใช้ ID ตรงตัว เช่น User.findMany, User.findManyPaginated, User.findUnique, User.create, User.update, User.delete โมเดลหรือ operation ที่ถูกลบหรือเปลี่ยนชื่อทำให้ validation ปฏิเสธ และชนิดที่สร้างปฏิเสธ ID เก่าด้วย การเปิดปิด operation ยังอยู่ใน owned registry นโยบายสิทธิ์ไม่เปิด operation ที่ปิดไว้ แต่ละนโยบายต้องการ session โดยไม่ผูกกับวิธีเข้าสู่ระบบ
ตรวจ authentication และ permission ก่อน hooks และ overrides เสมอ Guards ขอบเขตความเป็นเจ้าของเดิม และการป้องกันข้อผิดพลาดยังบังคับใช้ Public create ปฏิเสธฟิลด์ระบบ เจ้าของ tenant บทบาท administrator รหัสผ่าน verification และลิงก์ผู้ให้บริการ รวมถึงข้อมูลซ้อน มันสร้างข้อมูลแอป ส่วน signup ต้องผ่าน route ของ Better Auth เท่านั้น Raw route ใช้ service Declarative route ต้องระบุ access.mode และ access.operation โดย model scope เป็นตัวเลือก OpenAPI แสดงโหมดแต่ละ operation
| รากติดตั้งเสริม | แพ็กเกจ | บล็อก | เวอร์ชันตรงตัว |
|---|---|---|---|
root เฉพาะเมื่อเปิด |
better-auth |
dependencies |
1.6.25 |
เมื่อเปิดจะสร้าง src/better-auth.ts การตรวจผู้ให้บริการ กฎจำกัดการเข้าใช้งานและ lockout เดิม และ migration แยกสำหรับตารางโครงสร้างพื้นฐาน _artifact_auth_* ตารางเหล่านี้ไม่มี CRUD endpoint ทั้ง Node/SQLite และ Worker/D1 ใช้วิธีที่เลือก ขอบเขตรหัสผ่าน ตัวตน OAuth ที่ตรวจแล้ว token แบบแฮช การเพิกถอน session ผ่านฐานข้อมูล อายุสูงสุดเจ็ดวัน และการตรวจ origin สำหรับการเปลี่ยนข้อมูลเหมือนกัน ไม่เก็บ access/refresh/ID token ของผู้ให้บริการ และไม่เปิดเผยรายละเอียดข้อผิดพลาดภายใน
รัน npm run auth:init เพื่อสร้าง secret สุ่มใหม่ใน .dev.vars ที่ถูก ignore โดยคง secret เดิมของอาร์ติแฟกต์ Node โหลดด้วย node --env-file=.dev.vars src/serve.local.mjs และ Wrangler โหลดโดยตรง ใช้ db:init ก่อน กำหนด ARTIFACT_ORIGIN เป็น origin ของ API เช่น http://127.0.0.1:8787 ในเครื่อง origin ระยะไกลต้องเป็น HTTPS การ deploy ใช้ hostname เป้าหมายที่ตรวจแล้ว ไม่ใช้ origin ของ CMS
| วิธีที่เลือก | runtime value ที่ต้องมี | callback เป้าหมาย |
|---|---|---|
| รหัสผ่าน | BETTER_AUTH_SECRET |
route รหัสผ่านภายใต้ /api/auth |
| ลิงก์เข้าสู่ระบบ (Resend) | BETTER_AUTH_SECRET, RESEND_API_KEY, MAIL_FROM |
<ARTIFACT_ORIGIN>/api/auth/magic-link/verify |
BETTER_AUTH_SECRET, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET |
<ARTIFACT_ORIGIN>/api/auth/callback/google |
|
| GitHub | BETTER_AUTH_SECRET, GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET |
<ARTIFACT_ORIGIN>/api/auth/callback/github |
ลงทะเบียน callback ใน OAuth application ของผู้รับอาร์ติแฟกต์ Resend ต้องมีโดเมนผู้ส่งที่ยืนยันแล้ว ต้องมีข้อมูลรับรองเฉพาะวิธีที่เลือก preflight จะหยุดก่อน deploy หากขาดค่าเหล่านี้ Actions secret ใช้ชื่อ runtime พร้อมคำนำหน้า ARTIFACT_ ซึ่งหลีกเลี่ยงคำนำหน้า GITHUB_ ที่ GitHub สงวนไว้ด้วย การส่งมอบสร้าง secret อาร์ติแฟกต์ใหม่แล้วเข้ารหัสด้วย public key ของเป้าหมาย หากชื่อ secret นั้นมีอยู่ที่ปลายทางแล้ว ระบบจะเก็บค่าเดิมไว้โดยไม่เปลี่ยนค่า npm run backend:deliver อ่านข้อมูลผู้ให้บริการจาก environment ARTIFACT_* เท่านั้น Secret ไม่เข้าซอร์ส manifest generation input digest vars ที่ commit log หรือ deployment ledger
Regeneration รักษา owned/shared file การเปิด auth ใน shared package เดิมหรือเปลี่ยนวิธีต้องสร้างใหม่เพื่ออัปเดต dependency และ binding ของ workflow ผู้เรียก การปิด auth ใน destination เดิมถูกปฏิเสธ ให้ใช้ปลายทางใหม่และเก็บตัวตนกับประวัติ migration เดิม การเปลี่ยนเฉพาะสิทธิ์มีผลต่อ generation-source และ manifest digest
verify:deployment เคารพนโยบาย public อ่านแบบ anonymous, service ใช้ bearer, session-only ต้องมี session ปัจจุบันของเป้าหมายใน ARTIFACT_VERIFY_SESSION_COOKIE หากไม่มีจะตอบ verify_session_required ไม่รายงานว่าการตรวจที่ไม่ได้ทำผ่านแล้ว ในการ deploy ครั้งแรกให้สร้างฐานเป้าหมาย สมัครผ่าน auth route แล้วตรวจซ้ำด้วย session นั้น อย่าเก็บ session อายุสั้นในซอร์สหรือหลักฐาน การยอมรับผ่านเบราว์เซอร์และ deployment จริงยังเป็นคนละขั้นตอน
ขั้นตอนถัดไป
หัวข้อที่มีชื่อว่า “ขั้นตอนถัดไป”กำหนดคำขอที่ route ของคุณรับได้ใน รูปแบบคำขอและ guard
ยังไม่เปิดตัว (pre-MVP) และยังไม่มีเวอร์ชันเสถียร
คอมมิตซอร์สโค้ด: e207e63239a627fbd2ae9c414ef7c6eb19fcfe5a (มีการแก้ไขที่ยังไม่คอมมิต)
วันที่สร้างเอกสาร (UTC): 2026-10-21T09:28:24.214Z
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง