Files
lifeforge/docker/server/Dockerfile
2026-06-25 08:54:15 +08:00

87 lines
2.7 KiB
Docker

# syntax=docker/dockerfile:1
# ============================================
# Builder stage - build core server bundle only
# ============================================
FROM oven/bun:alpine AS builder
RUN apk update && apk add git
WORKDIR /lifeforge
# Copy source
COPY . .
# Install dependencies
RUN --mount=type=cache,target=/root/.bun/install/cache \
bun install --linker isolated
# Build shared package
RUN cd /lifeforge/shared && bun run build
# Build @lifeforge/log package
RUN cd /lifeforge/packages/log && bun run build
# Build lifeforge-server-utils package
RUN cd /lifeforge/packages/server-utils && bun run build
# Build server bundle
RUN cd /lifeforge/apps/api && bun run build
# Create cleaned package.json without workspace deps for production install
RUN bun -e "const pkg = require('./apps/api/package.json'); \
delete pkg.dependencies.shared; \
delete pkg.dependencies['@lifeforge/log']; \
delete pkg.dependencies['@lifeforge/server-utils']; \
delete pkg.devDependencies; \
require('fs').writeFileSync('./apps/api/package.docker.json', JSON.stringify(pkg, null, 2))"
# ============================================
# Production stage - core server only (no modules)
# ============================================
FROM oven/bun:alpine AS production
# Install curl for health check
RUN apk add --no-cache curl
WORKDIR /lifeforge
# Copy bundled server
COPY --from=builder /lifeforge/apps/api/dist ./apps/api/dist
# Copy shared package
COPY --from=builder /lifeforge/shared/dist ./shared/dist
COPY --from=builder /lifeforge/shared/package.json ./shared/package.json
# Copy @lifeforge/log package
COPY --from=builder /lifeforge/packages/log/dist ./packages/log/dist
COPY --from=builder /lifeforge/packages/log/package.json ./packages/log/package.json
# Copy lifeforge-server-utils package (required by module bundles at runtime)
COPY --from=builder /lifeforge/packages/server-utils/dist ./packages/server-utils/dist
COPY --from=builder /lifeforge/packages/server-utils/package.json ./packages/server-utils/package.json
# Install server dependencies
COPY --from=builder /lifeforge/apps/api/package.docker.json ./package.json
RUN bun install --production
# Create apps directory for module mounting
RUN mkdir -p /lifeforge/modules
# Copy entrypoint
COPY docker/server/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && \
sed -i 's/\r$//' /entrypoint.sh
EXPOSE 3636
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD curl -f http://localhost:3636/ || exit 1
# Modules should be mounted to /lifeforge/modules at runtime:
# docker run -v /path/to/modules:/lifeforge/modules lifeforge-server
ENTRYPOINT ["/entrypoint.sh"]