Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions deploy/Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# syntax=docker/dockerfile:1

FROM --platform=$BUILDPLATFORM oven/bun:1.3.2-slim AS build-base
WORKDIR /app

FROM build-base AS deps
COPY package.json bun.lock ./
# 使用 BuildKit 缓存挂载加速依赖安装
RUN --mount=type=cache,target=/root/.bun/install/cache \
bun install --frozen-lockfile

FROM deps AS build
COPY . .

# 接收构建参数
ARG APP_VERSION=dev

# 设置为环境变量供 Next.js 使用
ENV NEXT_TELEMETRY_DISABLED=1
ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION

# 构建时需要的环境变量 (避免数据库初始化错误)
# 这些是占位符,实际运行时会被真实值覆盖
ENV DSN="postgres://placeholder:placeholder@localhost:5432/placeholder"
ENV REDIS_URL="redis://localhost:6379"

# 使用 BuildKit 缓存加速 Next.js 构建
RUN --mount=type=cache,target=/app/.next/cache \
bun run build

FROM node:22-slim AS runner
ENV NODE_ENV=production
ENV PORT=3000
ENV HOST=0.0.0.0
WORKDIR /app

# 安装 PostgreSQL 18 客户端工具(用于数据库备份/恢复功能)和 curl(用于健康检查)
# 需要使用官方 PostgreSQL APT 仓库以获取最新版本
# 使用 BuildKit 缓存挂载加速 APT 安装
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
apt-get update && \
apt-get install -y gnupg curl ca-certificates && \
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg && \
echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
apt-get update && \
apt-get install -y postgresql-client-18

COPY --from=build --chown=node:node /app/public ./public
COPY --from=build --chown=node:node /app/drizzle ./drizzle
COPY --from=build --chown=node:node /app/messages ./messages
COPY --from=build --chown=node:node /app/.next/standalone ./
# Server Actions live inside .next/server; copy it or Next.js cannot resolve action IDs.
COPY --from=build --chown=node:node /app/.next/server ./.next/server
COPY --from=build --chown=node:node /app/.next/static ./.next/static

USER node
EXPOSE 3000

CMD ["node", "server.js"]
Loading