O EmDash funciona em qualquer plataforma de hospedagem Node.js 22+. Este guia usa SQLite com armazenamento local ou compatível com S3; libSQL e PostgreSQL funcionam da mesma forma no Node.js — consulte Opções de banco de dados.
Pré-requisitos
- Node.js v22.12.0 ou superior
- Um provedor de hospedagem Node.js ou VPS
Configuração
Configure o EmDash para implantação no Node.js:
import { defineConfig } from "astro/config";
import node from "@astrojs/node";
import emdash, { local, s3 } from "emdash/astro";
import { sqlite } from "emdash/db";
export default defineConfig({
output: "server",
adapter: node({ mode: "standalone" }),
integrations: [
emdash({
database: sqlite({ url: "file:./data/emdash.db" }),
storage: local({
directory: "./data/uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});
Compilar e executar
-
Compile o projeto:
npm run build -
Inicie o servidor:
node ./dist/server/entry.mjs
O servidor é executado em http://localhost:4321 por padrão. As migrações são aplicadas na primeira solicitação. Se o banco de dados estiver vazio e a configuração não tiver sido concluída, seu arquivo seed (ou o padrão integrado se você não tiver um) também será aplicado nessa primeira solicitação.
Armazenamento de produção
Para produção, use armazenamento compatível com S3 em vez do sistema de arquivos local:
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` }),
storage: s3({
endpoint: process.env.S3_ENDPOINT,
bucket: process.env.S3_BUCKET,
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
publicUrl: process.env.S3_PUBLIC_URL, // Optional CDN URL
}),
}),
],
});
Docker
Adicione um .dockerignore para manter o contexto de build pequeno:
node_modules
dist
.git
Crie um Dockerfile:
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
RUN mkdir -p data
ENV HOST=0.0.0.0
ENV PORT=4321
EXPOSE 4321
CMD ["node", "./dist/server/entry.mjs"]
O arquivo seed é lido no momento da compilação e incorporado ao bundle, portanto não precisa ser copiado para a imagem de tempo de execução. As migrações são executadas na primeira solicitação após uma implantação; o seed aplica-se apenas quando o banco de dados não tem coleções e a configuração não foi concluída — os dados existentes nunca são substituídos.
Compile a imagem e execute o container:
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
Um arquivo Docker Compose gerencia o mesmo container com um volume nomeado:
services:
emdash:
build: .
ports:
- "4321:4321"
volumes:
- emdash-data:/app/data
restart: unless-stopped
volumes:
emdash-data:
Inicie a pilha em segundo plano:
docker compose up -d
Variáveis de ambiente
Recomendado: chave de criptografia
EMDASH_ENCRYPTION_KEY é a chave para criptografar segredos de plugins em
repouso. A chave é validada na inicialização; a criptografia de segredos de plugins a usa
uma vez habilitada. Defina-a em cada implantação para que os segredos sejam protegidos
sem uma alteração de configuração posterior.
Gere uma chave e adicione o resultado ao seu ambiente:
npx emdash secrets generate # add the result to your environment
A chave é fornecida por você e nunca armazenada no banco de dados; apenas o texto cifrado é armazenado. Faça backup em um local durável (um gerenciador de senhas, KMS ou o armazenamento de segredos da sua equipe) — perdê-la significa perder cada segredo criptografado com ela.
Opcional: substituições de valor estável
O EmDash gera automaticamente o segredo HMAC de visualização e o salt de hash IP do comentarista e os persiste no banco de dados no primeiro uso. As variáveis de ambiente abaixo os fixam em um valor que você controla — útil quando um processo separado precisa compartilhar um segredo com seu site principal.
| Variável | Descrição |
|---|---|
EMDASH_PREVIEW_SECRET | Substituição para o segredo HMAC de visualização gerado automaticamente. |
EMDASH_IP_SALT | Substituição para o salt de hash IP do comentarista gerado automaticamente. |
EMDASH_AUTH_SECRET | Opcional. Se definido, usado como fonte de salt IP (a menos que EMDASH_IP_SALT também esteja definido, que tem precedência), mantendo os hashes IP do comentarista estáveis para instalações que já dependem dele. Deixe indefinido para uma nova implantação. |
Banco de dados e armazenamento
| Variável | Descrição | Exemplo |
|---|---|---|
DATABASE_PATH | Caminho para o banco de dados SQLite | /data/emdash.db |
HOST | Host do servidor | 0.0.0.0 |
PORT | Porta do servidor | 4321 |
S3_ENDPOINT | URL do endpoint S3 | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | Nome do bucket S3 | my-media-bucket |
S3_ACCESS_KEY_ID | Chave de acesso S3 | AKIA... |
S3_SECRET_ACCESS_KEY | Chave secreta S3 | ... |
S3_PUBLIC_URL | URL pública para mídia | https://cdn.example.com |
Armazenamento persistente
O SQLite requer armazenamento em disco persistente. Certifique-se de que sua plataforma de hospedagem forneça:
- Um volume montado ou disco persistente
- Acesso de gravação ao diretório do banco de dados
- Mecanismos de backup para o arquivo do banco de dados
Verificações de integridade
Adicione um endpoint de verificação de integridade para balanceadores de carga:
export const GET = () => {
return new Response("OK", { status: 200 });
};
Configure sua plataforma para verificar /health para sondagens de atividade.