設定參考

本頁內容

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",
});

多來源通行金鑰驗證

透過 allowedOriginsEMDASH_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)

選項型別描述
urlstringfile: 前綴的檔案路徑

libsql(config)

選項型別描述
urlstring資料庫 URL
authTokenstring認證權杖(本地檔案選用)

postgres(config)

選項型別描述
connectionStringstringPostgreSQL 連線 URL
hoststring資料庫主機
portnumber資料庫連接埠
databasestring資料庫名稱
userstring資料庫使用者
passwordstring資料庫密碼
sslboolean啟用 SSL
pool.minnumber最小池大小(預設:0)
pool.maxnumber最大池大小(預設:10)

d1(config)

Cloudflare D1。從 @emdash-cms/cloudflare 匯入。

選項型別預設值描述
bindingstringwrangler.jsonc 中的 D1 繫結名稱
sessionstring"disabled"讀取複製模式
bookmarkCookiestring"__em_d1_bookmark"工作階段書籤的 Cookie 名稱

儲存配接器

import emdash, { local, s3 } from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";

local(config)

選項型別描述
directorystring目錄路徑
baseUrlstring檔案服務的基礎 URL

r2(config)

選項型別描述
bindingstringR2 繫結名稱
publicUrlstring選用的公開 URL

s3(config?)

S3 相容儲存。所有欄位選用。

前提: 安裝 @aws-sdk/client-s3@aws-sdk/s3-request-presigner

選項型別描述
endpointstringS3 端點 URL (S3_ENDPOINT)
bucketstring儲存桶名稱 (S3_BUCKET)
accessKeyIdstring存取金鑰 (S3_ACCESS_KEY_ID)
secretAccessKeystring秘密金鑰 (S3_SECRET_ACCESS_KEY)
regionstring區域,預設 "auto" (S3_REGION)
publicUrlstring選用的 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_KEYCloudflare 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