Implantar no Node.js

Nesta página

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

  1. Compile o projeto:

    npm run build
  2. 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ávelDescrição
EMDASH_PREVIEW_SECRETSubstituição para o segredo HMAC de visualização gerado automaticamente.
EMDASH_IP_SALTSubstituição para o salt de hash IP do comentarista gerado automaticamente.
EMDASH_AUTH_SECRETOpcional. 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ávelDescriçãoExemplo
DATABASE_PATHCaminho para o banco de dados SQLite/data/emdash.db
HOSTHost do servidor0.0.0.0
PORTPorta do servidor4321
S3_ENDPOINTURL do endpoint S3https://xxx.r2.cloudflarestorage.com
S3_BUCKETNome do bucket S3my-media-bucket
S3_ACCESS_KEY_IDChave de acesso S3AKIA...
S3_SECRET_ACCESS_KEYChave secreta S3...
S3_PUBLIC_URLURL pública para mídiahttps://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.