FROM oven/bun:1.4.2-alpine AS frontend-deps
RUN apk upgrade --no-cache && apk add --no-cache libc6-compat
WORKDIR /app
COPY apps/web/package.json apps/web/bun.lock* ./
RUN bun install --frozen-lockfile
FROM oven/bun:1.4.2-alpine AS frontend-builder
WORKDIR /app
COPY --from=frontend-deps /app/node_modules ./node_modules
COPY apps/web .
ENV NEXT_TELEMETRY_DISABLED=1
RUN rm -f .env*
ARG LEARNHOUSE_PUBLIC=false
RUN if [ "$LEARNHOUSE_PUBLIC" = "true" ] || { [ -L /app/ee ] && [ ! -e /app/ee ]; }; then rm -rf /app/ee; fi
RUN bun run build
FROM oven/bun:1.4.2-alpine AS frontend-runner
WORKDIR /app
RUN apk upgrade --no-cache && apk add --no-cache curl
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs
COPY --from=frontend-builder /app/public ./public
RUN mkdir .next && chown nextjs:nodejs .next
COPY --from=frontend-builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=frontend-builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --chown=nextjs:nodejs apps/web/server-wrapper.js ./
RUN chmod +x server-wrapper.js
FROM oven/bun:1.4.2-alpine AS collab-builder
WORKDIR /app
COPY apps/collab/package.json apps/collab/bun.lock* ./
RUN bun install --frozen-lockfile
COPY apps/collab/tsconfig.json ./
COPY apps/collab/src/ ./src/
RUN bun run build
FROM python:3.14.7-alpine3.24 AS runner
RUN apk upgrade --no-cache \
&& apk add --no-cache nginx curl netcat-openbsd ca-certificates bash nodejs npm libstdc++ \
&& npm install -g pm2 \
&& rm -rf /root/.npm \
&& mkdir -p /run/nginx
RUN python -m pip uninstall --yes pip \
&& rm -rf /usr/local/lib/python3.14/ensurepip
COPY --from=frontend-deps /usr/local/bin/bun /usr/local/bin/bun
COPY --from=ghcr.io/astral-sh/uv:0.10.7 /uv /uvx /bin/
COPY --from=frontend-runner /app /app/web
WORKDIR /app/api
COPY ./apps/api/uv.lock ./apps/api/pyproject.toml ./
RUN uv sync --frozen --no-dev --no-install-project --no-cache
COPY ./apps/api ./
ARG LEARNHOUSE_PUBLIC=false
RUN if [ "$LEARNHOUSE_PUBLIC" = "true" ]; then rm -rf /app/api/ee; fi
WORKDIR /app/collab
COPY --from=collab-builder /app/dist ./dist
COPY apps/collab/package.json apps/collab/bun.lock* ./
RUN bun install --frozen-lockfile --production
WORKDIR /app
COPY ./docker/nginx.conf /etc/nginx/http.d/default.conf
COPY ./apps/api/docker-entrypoint.sh /app/api/docker-entrypoint.sh
COPY ./docker/start.sh /app/start.sh
RUN chmod +x /app/api/docker-entrypoint.sh /app/start.sh
ENV PORT=8000 LEARNHOUSE_PORT=9000 COLLAB_PORT=4000 HOSTNAME=0.0.0.0 LEARNHOUSE_OSS=true NEXT_PUBLIC_LEARNHOUSE_OSS=true PYTHONDONTWRITEBYTECODE=1
EXPOSE 80 9000 4000
CMD ["sh", "/app/start.sh"]