EmDash 透過兩個檔案設定:用於整合的 astro.config.mjs 和用於內容集合的 src/live.config.ts。
Astro 整合
在 astro.config.mjs 中將 EmDash 設定為 Astro 整合:
import { defineConfig } from "astro/config";
import emdash, { local, s3 } from "emdash/astro";
import { sqlite, libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
plugins: [],
}),
],
});
整合選項
database
必要。 資料庫配接器設定。選擇一個配接器:
database: sqlite({ url: "file:./data.db" });
database: postgres({ connectionString: process.env.DATABASE_URL });
database: libsql({ url: process.env.LIBSQL_DATABASE_URL, authToken: process.env.LIBSQL_AUTH_TOKEN });
database: d1({ binding: "DB" });
詳見資料庫選項。
storage
必要。 媒體儲存配接器設定:
storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" });
storage: r2({ binding: "MEDIA", publicUrl: "https://pub-xxxx.r2.dev" });
storage: s3()
objectCache
選用。 將內容和設定查詢結果快取在鍵/值儲存中:
import { kvCache } from "@emdash-cms/cloudflare";
objectCache: kvCache({ binding: "CACHE" });
import { memoryCache } from "emdash/astro";
objectCache: memoryCache();
plugins
選用。 EmDash 外掛程式陣列:
import seoPlugin from "@emdash-cms/plugin-seo";
plugins: [seoPlugin()];
fonts
選用。 管理介面字型設定。
預設情況下,EmDash 透過 Astro Font API 載入 Noto Sans。字型在建置時從 Google 下載並自行託管。
要新增額外的書寫系統支援,傳遞腳本名稱:
emdash({
fonts: {
scripts: ["arabic", "japanese"],
},
})
設為 false 以完全停用字型注入並使用系統字型:
emdash({ fonts: false })
auth
選用。 認證配接器。EmDash 內建登入使用通行金鑰;設定 auth 會將其替換為外部供應者:
import { access } from "@emdash-cms/cloudflare";
emdash({
auth: access({
teamDomain: "myteam.cloudflareaccess.com",
audience: "your-app-audience-tag",
roleMapping: { Admins: 50, Editors: 40 },
}),
});
authProviders
選用。 可插拔登入供應者陣列:
import { github } from "emdash/auth/providers/github";
import { google } from "emdash/auth/providers/google";
import { atproto } from "@emdash-cms/auth-atproto";
emdash({
authProviders: [github(), google(), atproto()],
});
內建供應者:
github()— 讀取EMDASH_OAUTH_GITHUB_CLIENT_ID/EMDASH_OAUTH_GITHUB_CLIENT_SECRET。google()— 讀取EMDASH_OAUTH_GOOGLE_CLIENT_ID/EMDASH_OAUTH_GOOGLE_CLIENT_SECRET。atproto()— Atmosphere 帳號登入。無需環境變數。
siteUrl
選用。 網站的公開瀏覽器端來源(方案 + 主機 + 選用連接埠,無路徑)。
在 TLS 終端反向代理 後面,Astro.url 傳回內部位址而非公開位址。設定 siteUrl 一次修復通行金鑰、CSRF、OAuth 重新導向等所有問題。
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" }),
siteUrl: "https://cms.example.com",
});
多來源通行金鑰驗證
透過 allowedOrigins 或 EMDASH_ALLOWED_ORIGINS 環境變數宣告額外接受的來源:
emdash({
siteUrl: "https://example.com",
allowedOrigins: ["https://preview.example.com"],
})
反向代理設定
import { defineConfig } from "astro/config";
import emdash, { local } from "emdash/astro";
import { sqlite } from "emdash/db";
export default defineConfig({
security: {
allowedDomains: [
{ hostname: "cms.example.com", protocol: "https" },
{ hostname: "cms.example.com", protocol: "http" },
],
},
vite: { server: { allowedHosts: ["cms.example.com"] } },
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" }),
siteUrl: "https://cms.example.com",
}),
],
});
trustedProxyHeaders
選用。 在反向代理後面用於用戶端 IP 解析的信任標頭:
emdash({
trustedProxyHeaders: ["x-real-ip"],
});
maxUploadSize
選用。 媒體檔案上傳的最大允許大小(位元組)。預設 52_428_800(50 MB):
emdash({
maxUploadSize: 100 * 1024 * 1024, // 100 MB
});
toolbar
選用。 控制編輯器工具列的交付方式。預設 "server"。
| 值 | 行為 |
|---|---|
"server"(預設) | 工具列被伺服端注入到每個為認證編輯者呈現的 HTML 回應中。 |
"client" | 公開 HTML 對所有訪客相同。小的引導腳本顯示 “Edit” 按鈕。 |
false | 從不呈現工具列或引導腳本。 |
experimental
選用。 行為可能在次要版本中變更的選擇性功能。
experimental.registry
選用。 將管理儀表板的外掛程式瀏覽和安裝流程指向聯邦外掛程式登錄。
emdash({
sandboxRunner: "@emdash-cms/sandbox-cloudflare",
experimental: {
registry: {
aggregatorUrl: "https://registry.emdashcms.com",
acceptLabelers: "did:plc:emdashverification",
policy: {
minimumReleaseAge: "48h",
minimumReleaseAgeExclude: ["did:plc:yourfirstpartydid"],
},
},
},
});
資料庫配接器
import { sqlite, libsql, postgres } from "emdash/db";
sqlite(config)
| 選項 | 型別 | 描述 |
|---|---|---|
url | string | 帶 file: 前綴的檔案路徑 |
libsql(config)
| 選項 | 型別 | 描述 |
|---|---|---|
url | string | 資料庫 URL |
authToken | string | 認證權杖(本地檔案選用) |
postgres(config)
| 選項 | 型別 | 描述 |
|---|---|---|
connectionString | string | PostgreSQL 連線 URL |
host | string | 資料庫主機 |
port | number | 資料庫連接埠 |
database | string | 資料庫名稱 |
user | string | 資料庫使用者 |
password | string | 資料庫密碼 |
ssl | boolean | 啟用 SSL |
pool.min | number | 最小池大小(預設:0) |
pool.max | number | 最大池大小(預設:10) |
d1(config)
Cloudflare D1。從 @emdash-cms/cloudflare 匯入。
| 選項 | 型別 | 預設值 | 描述 |
|---|---|---|---|
binding | string | — | wrangler.jsonc 中的 D1 繫結名稱 |
session | string | "disabled" | 讀取複製模式 |
bookmarkCookie | string | "__em_d1_bookmark" | 工作階段書籤的 Cookie 名稱 |
儲存配接器
import emdash, { local, s3 } from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
local(config)
| 選項 | 型別 | 描述 |
|---|---|---|
directory | string | 目錄路徑 |
baseUrl | string | 檔案服務的基礎 URL |
r2(config)
| 選項 | 型別 | 描述 |
|---|---|---|
binding | string | R2 繫結名稱 |
publicUrl | string | 選用的公開 URL |
s3(config?)
S3 相容儲存。所有欄位選用。
前提: 安裝 @aws-sdk/client-s3 和 @aws-sdk/s3-request-presigner。
| 選項 | 型別 | 描述 |
|---|---|---|
endpoint | string | S3 端點 URL (S3_ENDPOINT) |
bucket | string | 儲存桶名稱 (S3_BUCKET) |
accessKeyId | string | 存取金鑰 (S3_ACCESS_KEY_ID) |
secretAccessKey | string | 秘密金鑰 (S3_SECRET_ACCESS_KEY) |
region | string | 區域,預設 "auto" (S3_REGION) |
publicUrl | string | 選用的 CDN URL (S3_PUBLIC_URL) |
物件快取配接器
kvCache(config)
Cloudflare KV 後端。
kvCache({ binding: "CACHE", defaultTtl: 3600, revalidate: 1000, timeout: 2000, keyPrefix: "em" })
memoryCache(config?)
Node.js 行程內後端。
memoryCache({ defaultTtl: 3600, revalidate: 1000, maxEntries: 1000, keyPrefix: "em" })
即時集合
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";
export const collections = {
_emdash: defineLiveCollection({
loader: emdashLoader(),
}),
};
環境變數
| 變數 | 描述 |
|---|---|
EMDASH_SITE_URL | 公開瀏覽器端來源(回退到 SITE_URL) |
EMDASH_ALLOWED_ORIGINS | 通行金鑰驗證接受的額外來源的逗號分隔清單 |
EMDASH_DATABASE_URL | 覆蓋資料庫 URL |
EMDASH_ENCRYPTION_KEY | 用於加密靜態儲存的外掛程式密鑰的金鑰 |
EMDASH_PREVIEW_SECRET | 預覽 HMAC 密鑰的選用覆蓋 |
EMDASH_IP_SALT | 評論者 IP 雜湊鹽的選用覆蓋 |
EMDASH_AUTH_SECRET | 已棄用。如果設定,用作 IP 鹽來源。 |
EMDASH_TURNSTILE_SECRET_KEY | Cloudflare Turnstile 密鑰 |
EMDASH_URL | 結構同步用的遠端 EmDash URL |
npx emdash secrets generate
package.json 設定
{
"emdash": {
"label": "My Blog Template",
"seed": ".emdash/seed.json",
"url": "https://my-site.pages.dev"
}
}
TypeScript 設定
{
"compilerOptions": {
"paths": {
"@emdash-cms/types": ["./.emdash/types.ts"]
}
}
}
npx emdash types