mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-18 11:59:26 +00:00
128 lines
No EOL
4.3 KiB
Text
128 lines
No EOL
4.3 KiB
Text
# Base image
|
|
FROM python:3.12.3-slim-bookworm as base
|
|
|
|
# Install Nginx, curl, and build-essential
|
|
RUN apt update && apt install -y nginx curl build-essential \
|
|
&& apt-get clean \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& rm /etc/nginx/sites-enabled/default
|
|
|
|
# Install Node tools
|
|
RUN curl -fsSL https://deb.nodesource.com/setup_21.x | bash - \
|
|
&& apt-get install -y nodejs \
|
|
&& npm install -g corepack pm2
|
|
|
|
# Frontend Build
|
|
FROM base AS builder
|
|
|
|
WORKDIR /app/web
|
|
|
|
# Install dependencies based on the preferred package manager
|
|
COPY ./apps/web/package.json ./apps/web/pnpm-lock.yaml* ./apps/web/.npmrc* ./
|
|
# Omit --production flag for TypeScript devDependencies
|
|
RUN \
|
|
if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
|
|
elif [ -f package-lock.json ]; then npm ci; \
|
|
else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && npm install; \
|
|
fi
|
|
|
|
COPY ./apps/web/app ./app
|
|
COPY ./apps/web/components ./components
|
|
COPY ./apps/web/hooks ./hooks
|
|
COPY ./apps/web/lib ./lib
|
|
COPY ./apps/web/pages ./pages
|
|
COPY ./apps/web/public ./public
|
|
COPY ./apps/web/services ./services
|
|
COPY ./apps/web/styles ./styles
|
|
COPY ./apps/web/types ./types
|
|
COPY ./apps/web/utils ./utils
|
|
COPY ./apps/web/next.config.js .
|
|
COPY ./apps/web/tsconfig.json .
|
|
COPY ./apps/web/tailwind.config.js .
|
|
COPY ./apps/web/postcss.config.js .
|
|
COPY ./apps/web/components.json .
|
|
COPY ./apps/web/middleware.ts .
|
|
COPY ./apps/web/instrumentation.ts .
|
|
|
|
# Remove any environment files that might interfere
|
|
RUN rm -f .env*
|
|
|
|
# Environment variables must be present at build time
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_API_URL
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_DOMAIN
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN
|
|
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_API_URL=${NEXT_PUBLIC_LEARNHOUSE_API_URL}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL=${NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_DOMAIN=${NEXT_PUBLIC_LEARNHOUSE_DOMAIN}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG=${NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG=${NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN=${NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN}
|
|
|
|
# Next.js collects completely anonymous telemetry data about general usage
|
|
# Disable telemetry at build time
|
|
ENV NEXT_TELEMETRY_DISABLED 1
|
|
|
|
# Build Next.js based on the preferred package manager
|
|
RUN \
|
|
if [ -f pnpm-lock.yaml ]; then pnpm build; \
|
|
elif [ -f package-lock.json ]; then npm run build; \
|
|
else npm run build; \
|
|
fi
|
|
|
|
# Final image
|
|
FROM base AS runner
|
|
RUN addgroup --system --gid 1001 system \
|
|
&& adduser --system --uid 1001 app \
|
|
&& mkdir .next \
|
|
&& chown app:system .next
|
|
|
|
COPY --from=builder /app/web/public ./app/web/public
|
|
|
|
# Automatically leverage output traces to reduce image size
|
|
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
|
COPY --from=builder --chown=app:system /app/web/.next/standalone ./app/web/
|
|
COPY --from=builder --chown=app:system /app/web/.next/static ./app/web/.next/static
|
|
|
|
# Environment variables must be redefined at run time
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_API_URL
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_DOMAIN
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG
|
|
ARG NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN
|
|
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_API_URL=${NEXT_PUBLIC_LEARNHOUSE_API_URL}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL=${NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_DOMAIN=${NEXT_PUBLIC_LEARNHOUSE_DOMAIN}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG=${NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG=${NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG}
|
|
ENV NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN=${NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN}
|
|
|
|
# Backend Build
|
|
WORKDIR /app/api
|
|
COPY ./apps/api/uv.lock ./
|
|
COPY ./apps/api/pyproject.toml ./
|
|
|
|
# Install dependencies with uv (fallback to pip if needed)
|
|
RUN pip install --upgrade pip && \
|
|
pip install uv && \
|
|
(uv sync --system || pip install -e .) && \
|
|
pip install uvicorn
|
|
|
|
COPY ./apps/api ./
|
|
|
|
# Run the backend
|
|
WORKDIR /app
|
|
COPY ./extra/nginx.conf /etc/nginx/conf.d/default.conf
|
|
ENV PORT=80 LEARNHOUSE_PORT=9000 HOSTNAME=0.0.0.0
|
|
COPY ./extra/start.sh /app/start.sh
|
|
|
|
# Make the start script executable
|
|
RUN chmod +x /app/start.sh
|
|
|
|
# Use the start script
|
|
CMD ["sh", "/app/start.sh"] |