EmDash는 Node.js 22 이상을 지원하는 모든 호스팅 플랫폼에서 실행됩니다. 이 가이드는 SQLite와 로컬 또는 S3 호환 스토리지를 사용해 일반적인 제공업체에 배포하는 방법을 다룹니다.
사전 요구 사항
- Node.js v22.12.0 이상
- Node.js 호스팅 제공업체 또는 VPS
구성
Node.js 배포를 위해 EmDash를 구성합니다.
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",
}),
}),
],
});
빌드 및 실행
- 프로젝트를 빌드합니다.
npm run build
-
데이터베이스를 초기화합니다.
npx emdash init --database ./data/emdash.db -
서버를 시작합니다.
node ./dist/server/entry.mjs
기본적으로 서버는 http://localhost:4321에서 실행됩니다.
프로덕션 스토리지
프로덕션에서는 로컬 파일 시스템 대신 S3 호환 스토리지를 사용하세요.
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
빌드 컨텍스트를 작게 유지하기 위해 .dockerignore를 추가합니다.
node_modules
dist
.git
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 ./
COPY --from=builder /app/seed ./seed
COPY --from=builder /app/astro.config.mjs ./
RUN mkdir -p data
ENV HOST=0.0.0.0
ENV PORT=4321
EXPOSE 4321
CMD ["sh", "-c", "npx emdash init && node ./dist/server/entry.mjs"]
빌드 및 실행:
docker build -t my-emdash-site .
docker run -p 4321:4321 -v emdash-data:/app/data my-emdash-site
또는 Docker Compose를 사용합니다.
services:
emdash:
build: .
ports:
- "4321:4321"
volumes:
- emdash-data:/app/data
restart: unless-stopped
volumes:
emdash-data:
docker compose up -d
환경 변수
프로덕션 필수
| 변수 | 설명 |
|---|---|
EMDASH_AUTH_SECRET | 세션 쿠키와 인증 토큰에 서명합니다. npx emdash auth secret으로 생성합니다. |
EMDASH_PREVIEW_SECRET | 초안 콘텐츠 미리보기 URL에 서명합니다. npx emdash auth secret으로 생성합니다. |
데이터베이스 및 스토리지
| 변수 | 설명 | 예시 |
|---|---|---|
EMDASH_SITE_URL | 브라우저 대상 공개 오리진 (미설정 시 SITE_URL로 대체) | https://example.com |
DATABASE_PATH | SQLite 데이터베이스 경로 | /data/emdash.db |
HOST | 서버 호스트 | 0.0.0.0 |
PORT | 서버 포트 | 4321 |
S3_ENDPOINT | S3 엔드포인트 URL | https://xxx.r2.cloudflarestorage.com |
S3_BUCKET | S3 버킷 이름 | my-media-bucket |
S3_ACCESS_KEY_ID | S3 액세스 키 | AKIA... |
S3_SECRET_ACCESS_KEY | S3 시크릿 키 | ... |
S3_PUBLIC_URL | 미디어 공개 URL | https://cdn.example.com |
영구 스토리지
SQLite에는 영구 디스크 스토리지가 필요합니다. 호스팅 플랫폼에서 다음을 제공하는지 확인하세요.
- 마운트된 볼륨 또는 영구 디스크
- 데이터베이스 디렉터리에 대한 쓰기 권한
- 데이터베이스 파일 백업 메커니즘
헬스 체크
로드 밸런서용 헬스 체크 엔드포인트를 추가합니다.
export const GET = () => {
return new Response("OK", { status: 200 });
};
라이브니스 프로브에서 /health를 확인하도록 플랫폼을 구성합니다.