Pular para o conteúdo

Referência de Configuração

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.

Configure o EmDash como uma integração do Astro:

astro.config.mjs
import { defineConfig } from "astro/config";
import emdash, { local, r2, s3 } from "emdash/astro";
import { sqlite, libsql, d1 } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
plugins: [],
}),
],
});

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

// SQLite (Node.js)
database: sqlite({ url: "file:./data.db" });
// PostgreSQL
database: postgres({ connectionString: process.env.DATABASE_URL });
// libSQL
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
});
// Cloudflare D1 (importe de @emdash-cms/cloudflare)
database: d1({ binding: "DB" });

Consulte Opções de Banco de Dados para detalhes.

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

// Local filesystem (development)
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});
// Vinculação R2 (Cloudflare Workers)
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev", // optional
});
// Compatível com S3 (qualquer plataforma)
storage: s3({
endpoint: "https://s3.amazonaws.com",
bucket: "my-bucket",
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: "us-east-1", // optional, default: "auto"
publicUrl: "https://cdn.example.com", // optional
});

Consulte Opções de Armazenamento para detalhes.

Opcional. Array de plugins do EmDash.

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

Opcional. Configuração de autenticação.

auth: {
// Self-signup configuration
selfSignup: {
domains: ["example.com"],
defaultRole: 20, // Contributor
},
// OAuth providers
oauth: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
},
},
// Session configuration
session: {
maxAge: 30 * 24 * 60 * 60, // 30 days
sliding: true, // Reset expiry on activity
},
// OR use Cloudflare Access (exclusive mode)
cloudflareAccess: {
teamDomain: "myteam.cloudflareaccess.com",
audience: "your-app-audience-tag",
autoProvision: true,
defaultRole: 30,
syncRoles: false,
roleMapping: {
"Admins": 50,
"Editors": 40,
},
},
}

Permite que os usuários se registrem automaticamente se o domínio de e-mail for permitido.

OpçãoTipoPadrãoDescrição
domainsstring[][]Domínios de e-mail permitidos
defaultRolenumber20Função para auto-registros
selfSignup: {
domains: ["example.com", "acme.org"],
defaultRole: 20, // Contributor
}

Configura provedores de login OAuth.

oauth: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
},
}

Configuração de sessão.

OpçãoTipoPadrãoDescrição
maxAgenumber2592000 (30d)Tempo de vida da sessão em segundos
slidingbooleantrueRedefinir expiração na atividade

Use o Cloudflare Access como provedor de autenticação em vez de passkeys.

OpçãoTipoPadrãoDescrição
teamDomainstringobrigatórioSeu domínio de equipe do Access
audiencestringobrigatórioTag de Audiência da Aplicação (AUD)
autoProvisionbooleantrueCriar usuários no primeiro login
defaultRolenumber30Função padrão para novos usuários
syncRolesbooleanfalseAtualizar função em cada login
roleMappingobject—Mapear grupos IdP para funções

Opcional. Passe uma origem completa voltada para o navegador (esquema + host + porta opcional, sem caminho) para que o rpId e a origin do WebAuthn correspondam ao que o navegador do usuário envia em clientData.origin.

Por padrão, as passkeys seguem Astro.url / request.url. Atrás de um proxy reverso que termina TLS, o aplicativo frequentemente ainda vê http:// no salto interno, enquanto a aba está em https://, ou o host reconstruído não corresponde ao nome público — o que quebra a verificação da passkey. Defina passkeyPublicOrigin como a origem que os usuários digitam na barra de endereços (por exemplo, https://cms.example.com ou https://cms.example.com:8443).

A integração valida este valor no momento do carregamento: deve ser uma URL válida com protocolo http: ou https: e é normalizada para origin.

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

O Astro só reflete X-Forwarded-* quando o host público é permitido. Configure security.allowedDomains para o nome de host (e esquemas) que seus usuários acessam. Em astro dev, adicione vite.server.allowedHosts correspondentes para que o Vite aceite o cabeçalho Host do proxy.

Prefira corrigir allowedDomains (e cabeçalhos encaminhados) primeiro; use passkeyPublicOrigin quando a URL reconstruída ainda divergir da origem do navegador (típico quando o TLS é terminado na frente e a requisição upstream permanece http://).

Com TLS na frente, vincular o servidor de desenvolvimento ao loopback (astro dev --host 127.0.0.1) geralmente é suficiente: o proxy se conecta localmente enquanto passkeyPublicOrigin corresponde à origem pública HTTPS.

js title="astro.config.mjs (excerpt)"
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",
}),
passkeyPublicOrigin: "https://cms.example.com",
}),
],
});

Importe de emdash/db:

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

Banco de dados SQLite usando better-sqlite3.

OpçãoTipoDescrição
urlstringCaminho do arquivo com prefixo file:
sqlite({ url: "file:./data.db" });

Banco de dados libSQL.

OpçãoTipoDescrição
urlstringURL do banco de dados
authTokenstringToken de autenticação (opcional para arquivos locais)
libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
});

Banco de dados PostgreSQL com pool de conexões.

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)
postgres({ connectionString: process.env.DATABASE_URL });

Banco de dados Cloudflare D1. Importe de @emdash-cms/cloudflare.

OpçãoTipoPadrãoDescrição
bindingstring—Nome da vinculação D1 do wrangler.jsonc
sessionstring"disabled"Modo de replicação de leitura: "disabled", "auto" ou "primary-first"
bookmarkCookiestring"__ec_d1_bookmark"Nome do cookie para marcadores de sessão
// Basic
d1({ binding: "DB" });
// Com réplicas de leitura
d1({ binding: "DB", session: "auto" });

Quando session é "auto" ou "primary-first", o EmDash usa a API de Sessões D1 para direcionar consultas de leitura para réplicas próximas. Usuários autenticados obtêm consistência de leitura de suas próprias escritas baseada em marcadores. Veja Opções de Banco de Dados — Réplicas de Leitura para detalhes.

Importe de emdash/astro:

import emdash, { local, r2, s3 } from "emdash/astro";

Armazenamento no sistema de arquivos local.

OpçãoTipoDescrição
directorystringCaminho do diretório
baseUrlstringURL base para servir arquivos
local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});

Vinculação Cloudflare R2.

OpçãoTipoDescrição
bindingstringNome da vinculação R2
publicUrlstringURL pública opcional
r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});

Armazenamento compatível com S3.

OpçãoTipoDescrição
endpointstringURL do endpoint S3
bucketstringNome do bucket
accessKeyIdstringChave de acesso
secretAccessKeystringChave secreta
regionstringRegião (padrão: "auto")
publicUrlstringURL de CDN opcional
s3({
endpoint: "https://xxx.r2.cloudflarestorage.com",
bucket: "media",
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
publicUrl: "https://cdn.example.com",
});

Configure o carregador do EmDash em src/live.config.ts:

ts title="src/live.config.ts"
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";
export const collections = {
_emdash: defineLiveCollection({
loader: emdashLoader(),
}),
};

A função emdashLoader() aceita configuração opcional:

emdashLoader({
// Currently no options - reserved for future use
});

O EmDash respeita estas variáveis de ambiente:

VariávelDescrição
EMDASH_DATABASE_URLSubstitui a URL do banco de dados
EMDASH_AUTH_SECRETSegredo para autenticação por chave de acesso
EMDASH_PREVIEW_SECRETSegredo para geração de token de pré-visualização
EMDASH_URLURL remota do EmDash para sincronização de esquema

Gere um segredo de autenticação com:

Terminal window
npx emdash auth secret

Configuração opcional no package.json:

json title="package.json"
{
"emdash": {
"label": "Meu modelo de blog",
"description": "Um modelo de blog limpo e minimalista",
"seed": ".emdash/seed.json",
"url": "https://my-site.pages.dev",
"preview": "https://emdash-blog.pages.dev"
}
}
OpçãoDescrição
labelNome do template para exibição
descriptionDescrição do template
seedCaminho para o arquivo JSON de seed
urlURL remota para sincronização de esquema
previewURL do site de demonstração para pré-visualização do template

O EmDash gera tipos em .emdash/types.ts. Adicione ao seu tsconfig.json:

json title="tsconfig.json"
{
"compilerOptions": {
"paths": {
"@emdash-cms/types": ["./.emdash/types.ts"]
}
}
}

Gere tipos com:

Terminal window
npx emdash types