summaryrefslogtreecommitdiff
path: root/Dockerfile
diff options
context:
space:
mode:
authoryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-19 15:18:55 +0900
committeryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-19 15:18:55 +0900
commit30f24e137ee2d1acec11a0da61e134f512ee02dd (patch)
tree28bd91bde3ad883f9f8fa543fca4b25ed50d05e9 /Dockerfile
parentda4934ae84f8a81fe3f4f8b392a4a3dc3d566f30 (diff)
Initial implementation of microblog
Markdown-based personal microblog with REST API. XSS protection via sanitize-html on server-side markdown rendering. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'Dockerfile')
-rw-r--r--Dockerfile28
1 files changed, 28 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..a8e0833
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,28 @@
+# syntax=docker/dockerfile:1
+
+FROM node:20-alpine AS deps
+WORKDIR /app
+COPY package.json package-lock.json ./
+RUN --mount=type=cache,target=/root/.npm \
+ npm ci
+
+FROM node:20-alpine AS build
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN npm run build
+
+FROM node:20-alpine AS prod-deps
+WORKDIR /app
+COPY package.json package-lock.json ./
+RUN --mount=type=cache,target=/root/.npm \
+ npm ci --omit=dev
+
+FROM node:20-alpine AS app
+WORKDIR /app
+COPY package.json ./
+COPY --from=prod-deps /app/node_modules ./node_modules
+COPY --from=build /app/build ./build
+RUN mkdir -p /app/data
+EXPOSE 3000
+CMD ["npm", "start"]