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

การขยายแบ็กเอนด์

ไม่จำเป็นต้องแยกออกเพื่อปรับแต่งรีโพซิทอรีที่สร้างให้ ส่วนขยาย owned/shared ใช้ได้ขณะรีโพซิทอรียังเชื่อมต่อกับ Dee Wan แยกออกเมื่อต้องการหยุดการสร้างใหม่ที่ Dee Wan จัดการเท่านั้น แบ็กเอนด์อิสระ: ภาพรวม อธิบายแบ็กเอนด์ที่สร้าง และ รายละเอียดการทำงาน แสดงแพ็กเกจที่ใช้

  1. สร้างโครงการในเครื่องด้วย npm run backend:generate หรือ npm run backend:deliver การตั้งค่า → ซอร์สโค้ดและการเผยแพร่ คอมไพล์ซอร์สไม่ได้ (source_build_runtime_unavailable)
  2. Clone รีโพซิทอรีของเจ้าของ
  3. แก้ส่วน owned/shared เริ่มที่ src/owned/backend.ts สำหรับปรับ API
  4. รันการตรวจของ artifact แล้ว commit และ push การแก้ไข
  5. ดีพลอย commit นั้นอย่างเจาะจงผ่าน deploy-from-repository.yml
  6. ต่อมาสั่งสร้างใหม่จาก Dee Wan งาน owned/shared ถูกเก็บไว้ ถ้าแก้ generated file ระบบจะปฏิเสธ
  7. แยกออกเฉพาะเมื่อเจ้าของต้องการหยุดการสร้างใหม่ที่ระบบจัดการ

ตารางการยืนยันตัวตน 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

src/owned/backend.ts สร้างเฉพาะเมื่อไม่มี การสร้างใหม่ไม่เขียนทับ registry เดิม npm run customization:check สร้าง registry ที่หายไปกลับมาโดยไม่มีการปรับแต่งใด ๆ และตรวจรายการ operation ที่สร้างไว้ App ที่สร้าง import ไฟล์นี้ ไม่ได้เลือกพฤติกรรมด้วยลำดับลงทะเบียน route

ตัวอย่างด้านล่างสมมติว่าโมเดลที่สร้างชื่อ Article ใช้ ID และฟิลด์ Prisma จริงจาก src/backend-customization.ts แต่ละตัวอย่างเป็น registry ทางเลือกที่ครบ หากใช้หลายอย่างให้รวมรายการใน defineBackend() เดียว

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 ให้เรียกครั้งเดียวถ้าไม่ได้ตั้งใจทำซ้ำ

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 หรือสร้างระบบ

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 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 ที่ประกาศไว้

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 ไม่มี

เก็บ 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

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.mjs
GENERATION_SOURCE_VERSION=<version> npm run regenerate
npm run migrate:emit
npm run typecheck
node scripts/install-dependencies.mjs apps/site
npm run --prefix apps/site check
npm run --prefix apps/site build
npm run build
npm run files:manifest

Commit/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
Google 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
คอมมิตสำหรับอัปเกรด: ระบุไม่ได้: มีการแก้ไขที่ยังไม่คอมมิต. บันทึกการเปลี่ยนแปลง