diff --git a/Dockerfile_coolify b/Dockerfile_coolify index b3f0f652..57cee3f5 100644 --- a/Dockerfile_coolify +++ b/Dockerfile_coolify @@ -61,15 +61,31 @@ ENV PORT=80 LEARNHOUSE_PORT=9000 HOSTNAME=0.0.0.0 COPY ./extra/start.sh /app/start.sh RUN chmod +x /app/start.sh -# Add enhanced URL and domain patching +# Add runtime configuration and enhanced patching RUN echo '#!/bin/bash\n\ +echo "Generating runtime configuration..."\n\ +mkdir -p /app/web/public\n\ +cat > /app/web/public/runtime-config.js << EOF\n\ +window.RUNTIME_CONFIG = {\n\ + LEARNHOUSE_API_URL: "${NEXT_PUBLIC_LEARNHOUSE_API_URL:-}",\n\ + LEARNHOUSE_BACKEND_URL: "${NEXT_PUBLIC_LEARNHOUSE_BACKEND_URL:-}",\n\ + LEARNHOUSE_DOMAIN: "${NEXT_PUBLIC_LEARNHOUSE_DOMAIN:-}",\n\ + LEARNHOUSE_DEFAULT_ORG: "${NEXT_PUBLIC_LEARNHOUSE_DEFAULT_ORG:-default}",\n\ + LEARNHOUSE_MULTI_ORG: "${NEXT_PUBLIC_LEARNHOUSE_MULTI_ORG:-false}",\n\ + LEARNHOUSE_TOP_DOMAIN: "${NEXT_PUBLIC_LEARNHOUSE_TOP_DOMAIN:-}"\n\ +}\n\ +EOF\n\ +\n\ +echo "Runtime configuration generated successfully"\n\ +\n\ echo "Enhanced patching of NextAuth cookies and domains..."\n\ find /app/web/.next -type f -name "*.js" -exec sed -i "s/domain:[^,}]*,/domain: undefined,/g" {} \\;\n\ find /app/web/.next -type f -name "*.js" -exec sed -i "s/domain: *process.env.LEARNHOUSE_COOKIE_DOMAIN/domain: undefined/g" {} \\;\n\ find /app/web/.next -type f -name "*.js" -exec sed -i "s/\.domain\s*=\s*[^;]*;/\.domain = undefined;/g" {} \\;\n\ echo "Cookie domain patches complete."\n\ +\n\ echo "Starting application..."\n\ -sh /app/start.sh' > /app/patched-start.sh && chmod +x /app/patched-start.sh +sh /app/start.sh' > /app/runtime-config-start.sh && chmod +x /app/runtime-config-start.sh -# Use the patched start script -CMD ["/app/patched-start.sh"] \ No newline at end of file +# Use the runtime config script +CMD ["/app/runtime-config-start.sh"] \ No newline at end of file diff --git a/Dockerfile_nextjs b/Dockerfile_nextjs new file mode 100644 index 00000000..5a4d7056 --- /dev/null +++ b/Dockerfile_nextjs @@ -0,0 +1,75 @@ +# syntax=docker.io/docker/dockerfile:1 + +FROM node:18-alpine AS base + +# Step 1. Rebuild the source code only when needed +FROM base AS builder + +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +# Omit --production flag for TypeScript devDependencies +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i; \ + # Allow install without lockfile, so example works even without Node.js installed locally + else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \ + fi + +COPY src ./src +COPY public ./public +COPY next.config.js . +COPY tsconfig.json . + +# Environment variables must be present at build time +# https://github.com/vercel/next.js/discussions/14030 +ARG ENV_VARIABLE +ENV ENV_VARIABLE=${ENV_VARIABLE} +ARG NEXT_PUBLIC_ENV_VARIABLE +ENV NEXT_PUBLIC_ENV_VARIABLE=${NEXT_PUBLIC_ENV_VARIABLE} + +# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry +# Uncomment the following line to disable telemetry at build time +# ENV NEXT_TELEMETRY_DISABLED 1 + +# Build Next.js based on the preferred package manager +RUN \ + if [ -f yarn.lock ]; then yarn build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then pnpm build; \ + else npm run build; \ + fi + +# Note: It is not necessary to add an intermediate step that does a full copy of `node_modules` here + +# Step 2. Production image, copy all the files and run next +FROM base AS runner + +WORKDIR /app + +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# Environment variables must be redefined at run time +ARG ENV_VARIABLE +ENV ENV_VARIABLE=${ENV_VARIABLE} +ARG NEXT_PUBLIC_ENV_VARIABLE +ENV NEXT_PUBLIC_ENV_VARIABLE=${NEXT_PUBLIC_ENV_VARIABLE} + +# Uncomment the following line to disable telemetry at run time +# ENV NEXT_TELEMETRY_DISABLED 1 + +# Note: Don't expose ports here, Compose will handle that for us + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/apps/web/pages/_document.js b/apps/web/pages/_document.js new file mode 100644 index 00000000..c3f9ee9b --- /dev/null +++ b/apps/web/pages/_document.js @@ -0,0 +1,16 @@ +import { Html, Head, Main, NextScript } from 'next/document'; + +export default function Document() { + return ( + +
+ {/* Load runtime configuration before any app code */} + + + + +