Referência de Configuração

Nesta página

O EmDash é configurado através de dois arquivos: astro.config.mjs para a integração e src/live.config.ts para as coleções de conteúdo.

Integração Astro

Configure o EmDash como uma integração Astro em astro.config.mjs:

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: [],
		}),
	],
});

Opções de integração

database

Obrigatório. Configuração do adaptador de banco de dados:

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

Obrigatório. Configuração do adaptador de armazenamento de mídia:

storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" });
storage: r2({ binding: "MEDIA", publicUrl: "https://pub-xxxx.r2.dev" });
storage: s3()

objectCache

Opcional. Armazena em cache os resultados de consultas de conteúdo e configuração em um armazenamento chave/valor:

import { kvCache } from "@emdash-cms/cloudflare";
objectCache: kvCache({ binding: "CACHE" });

import { memoryCache } from "emdash/astro";
objectCache: memoryCache();

plugins

Opcional. Array de plugins EmDash:

import seoPlugin from "@emdash-cms/plugin-seo";
plugins: [seoPlugin()];

fonts

Opcional. Configuração de fontes da interface de administração.

Por padrão, o EmDash carrega Noto Sans via a API de Fontes do Astro. As fontes são baixadas do Google no momento da compilação e auto-hospedadas.

Para adicionar suporte a sistemas de escrita adicionais, passe nomes de scripts:

emdash({
  fonts: {
    scripts: ["arabic", "japanese"],
  },
})

Defina como false para desabilitar completamente a injeção de fontes:

emdash({ fonts: false })

auth

Opcional. Um adaptador de autenticação. O login integrado do EmDash usa passkeys; configurar auth os substitui por um provedor externo:

import { access } from "@emdash-cms/cloudflare";

emdash({
	auth: access({
		teamDomain: "myteam.cloudflareaccess.com",
		audience: "your-app-audience-tag",
		roleMapping: { Admins: 50, Editors: 40 },
	}),
});

authProviders

Opcional. Um array de provedores de login conectáveis:

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

Provedores integrados:

  • github() — lê EMDASH_OAUTH_GITHUB_CLIENT_ID / EMDASH_OAUTH_GITHUB_CLIENT_SECRET.
  • google() — lê EMDASH_OAUTH_GOOGLE_CLIENT_ID / EMDASH_OAUTH_GOOGLE_CLIENT_SECRET.
  • atproto() — Login de conta Atmosphere. Sem variáveis de ambiente necessárias.

siteUrl

Opcional. A origem pública orientada ao navegador para o site (esquema + host + porta opcional, sem caminho).

Atrás de um proxy reverso que termina TLS, Astro.url retorna o endereço interno em vez do público. Defina siteUrl para corrigir passkeys, CSRF, redirects OAuth e todos os outros recursos dependentes de origem de uma vez.

emdash({
	database: sqlite({ url: "file:./data.db" }),
	storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file" }),
	siteUrl: "https://cms.example.com",
});

Verificação de passkey multi-origem

Declare origens adicionais aceitas via allowedOrigins ou a variável de ambiente EMDASH_ALLOWED_ORIGINS:

emdash({
	siteUrl: "https://example.com",
	allowedOrigins: ["https://preview.example.com"],
})

Configuração de proxy reverso

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

Opcional. Headers para confiar na resolução de IP do cliente atrás de um proxy reverso:

emdash({
	trustedProxyHeaders: ["x-real-ip"],
});

maxUploadSize

Opcional. Tamanho máximo permitido para upload de arquivos de mídia em bytes. Padrão 52_428_800 (50 MB):

emdash({
	maxUploadSize: 100 * 1024 * 1024, // 100 MB
});

toolbar

Opcional. Controla como a barra de ferramentas do editor é entregue. Padrão "server".

ValorComportamento
"server" (padrão)A barra de ferramentas é injetada do lado do servidor em cada resposta HTML para um editor autenticado.
"client"O HTML público é idêntico para cada visitante. Um pequeno script bootstrap mostra uma pílula “Edit”.
falseNunca renderizar a barra de ferramentas.

experimental

Opcional. Recursos opt-in cujo comportamento pode mudar em uma versão menor.

experimental.registry

Opcional. Aponta os fluxos de navegação e instalação de plugins do dashboard admin para um registro de plugins federado.

emdash({
	sandboxRunner: "@emdash-cms/sandbox-cloudflare",
	experimental: {
		registry: {
			aggregatorUrl: "https://registry.emdashcms.com",
			acceptLabelers: "did:plc:emdashverification",
			policy: {
				minimumReleaseAge: "48h",
				minimumReleaseAgeExclude: ["did:plc:yourfirstpartydid"],
			},
		},
	},
});

Adaptadores de banco de dados

import { sqlite, libsql, postgres } from "emdash/db";

sqlite(config)

OpçãoTipoDescrição
urlstringCaminho do arquivo com prefixo file:

libsql(config)

OpçãoTipoDescrição
urlstringURL do banco de dados
authTokenstringToken de auth (opcional para arquivos locais)

postgres(config)

OpçãoTipoDescrição
connectionStringstringURL de conexão PostgreSQL
hoststringHost do banco de dados
portnumberPorta do banco de dados
databasestringNome do banco de dados
userstringUsuário do banco de dados
passwordstringSenha do banco de dados
sslbooleanHabilitar SSL
pool.minnumberTamanho mínimo do pool (padrão: 0)
pool.maxnumberTamanho máximo do pool (padrão: 10)

d1(config)

Cloudflare D1. Importar de @emdash-cms/cloudflare.

OpçãoTipoPadrãoDescrição
bindingstringNome do binding D1 de wrangler.jsonc
sessionstring"disabled"Modo de replicação de leitura
bookmarkCookiestring"__em_d1_bookmark"Nome do cookie para bookmarks de sessão

Adaptadores de armazenamento

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

local(config)

OpçãoTipoDescrição
directorystringCaminho do diretório
baseUrlstringURL base para servir arquivos

r2(config)

OpçãoTipoDescrição
bindingstringNome do binding R2
publicUrlstringURL pública opcional

s3(config?)

Armazenamento compatível com S3. Todos os campos são opcionais.

Pré-requisito: instale @aws-sdk/client-s3 e @aws-sdk/s3-request-presigner.

OpçãoTipoDescrição
endpointstringURL do endpoint S3 (S3_ENDPOINT)
bucketstringNome do bucket (S3_BUCKET)
accessKeyIdstringChave de acesso (S3_ACCESS_KEY_ID)
secretAccessKeystringChave secreta (S3_SECRET_ACCESS_KEY)
regionstringRegião, padrão "auto" (S3_REGION)
publicUrlstringURL CDN opcional (S3_PUBLIC_URL)

Adaptadores de object cache

kvCache(config)

Backend Cloudflare KV.

kvCache({ binding: "CACHE", defaultTtl: 3600, revalidate: 1000, timeout: 2000, keyPrefix: "em" })

memoryCache(config?)

Backend em processo para Node.js.

memoryCache({ defaultTtl: 3600, revalidate: 1000, maxEntries: 1000, keyPrefix: "em" })

Coleções em tempo real

import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";

export const collections = {
	_emdash: defineLiveCollection({
		loader: emdashLoader(),
	}),
};

Variáveis de ambiente

VariávelDescrição
EMDASH_SITE_URLOrigem pública orientada ao navegador
EMDASH_ALLOWED_ORIGINSOrigens adicionais aceitas pela verificação de passkey
EMDASH_DATABASE_URLSubstituir URL do banco de dados
EMDASH_ENCRYPTION_KEYChave para criptografar segredos de plugins em repouso
EMDASH_PREVIEW_SECRETSubstituição opcional para o segredo HMAC de preview
EMDASH_IP_SALTSubstituição opcional para o salt do hash IP do comentarista
EMDASH_AUTH_SECRETLegado. Usado como fonte de salt IP se definido.
EMDASH_TURNSTILE_SECRET_KEYChave secreta do Cloudflare Turnstile
EMDASH_URLURL remota do EmDash para sincronização de schema
npx emdash secrets generate

Configuração do package.json

{
	"emdash": {
		"label": "My Blog Template",
		"seed": ".emdash/seed.json",
		"url": "https://my-site.pages.dev"
	}
}

Configuração TypeScript

{
	"compilerOptions": {
		"paths": {
			"@emdash-cms/types": ["./.emdash/types.ts"]
		}
	}
}
npx emdash types