diff --git a/Dockerfile b/Dockerfile index da78883be..3686880b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,66 @@ -FROM python:3.11-slim +# Stage 1: Build Frontend +FROM node:22-slim AS frontend-builder +WORKDIR /app +COPY frontend/package*.json ./ +RUN npm ci --fetch-timeout=600000 --fetch-retries=5 +COPY frontend ./ +# Pass dummy URL for build if needed +ARG NEXT_PUBLIC_API_URL=http://localhost:8000 +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL +ENV NEXT_TELEMETRY_DISABLED=1 +RUN npm run build +# Stage 2: Final Image (Python + Node.js) +FROM python:3.11-slim WORKDIR /app ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV PYTHONPATH=/app -# Install system dependencies if any are needed for pgvector/psycopg2 +# Install system dependencies & Node.js RUN apt-get update \ - && apt-get install -y --no-install-recommends gcc libpq-dev \ + && apt-get install -y --no-install-recommends gcc libpq-dev curl \ + && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ + && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* +# Install Backend dependencies COPY backend/requirements.txt /app/requirements.txt RUN PIP_ROOT_USER_ACTION=ignore PIP_DISABLE_PIP_VERSION_CHECK=1 \ pip install --no-cache-dir -r requirements.txt +# Copy Backend COPY backend /app/ -# Create a non-root user -RUN adduser --disabled-password --gecos "" appuser +# Copy Frontend runtime artifacts +COPY --from=frontend-builder /app/.next /app/frontend/.next +COPY --from=frontend-builder /app/public /app/frontend/public +COPY --from=frontend-builder /app/node_modules /app/frontend/node_modules +COPY --from=frontend-builder /app/package.json /app/frontend/package.json +COPY --from=frontend-builder /app/next.config.ts /app/frontend/next.config.ts + +# Create a startup script +RUN echo '#!/bin/bash\n\ +echo "Starting Naruon Backend and Frontend..."\n\ +python scripts/bootstrap_db.py\n\ +python scripts/start_backend.py --host 0.0.0.0 --port 8000 &\n\ +BACKEND_PID=$!\n\ +cd frontend && npm run start -- --hostname 0.0.0.0 --port 3000 &\n\ +FRONTEND_PID=$!\n\ +wait -n\n\ +exit $?\n\ +' > /app/start.sh && chmod +x /app/start.sh + +# Create non-root user +RUN useradd -m -s /bin/bash appuser && chown -R appuser:appuser /app USER appuser -EXPOSE 8000 +# Environment variables for Frontend +ENV NEXT_PUBLIC_API_URL=http://localhost:8000 +ENV BACKEND_INTERNAL_URL=http://127.0.0.1:8000 +ENV ALLOW_DOCKER_BACKEND_INTERNAL_URL=1 + +EXPOSE 3000 8000 -CMD ["python", "scripts/start_backend.py", "--host", "0.0.0.0", "--port", "8000"] +CMD ["/app/start.sh"] diff --git a/frontend/src/components/DataLayout.tsx b/frontend/src/components/DataLayout.tsx index 698fbda4b..67b1f47ed 100644 --- a/frontend/src/components/DataLayout.tsx +++ b/frontend/src/components/DataLayout.tsx @@ -400,6 +400,14 @@ export function DataLayout() { style={{ width: `${embeddingStage?.progress_percent ?? 0}%` }} > +
{llmData.summary}
: null} + {llmData ? ( +{llmData.summary}
+오래된 메시지부터 최신 메시지 순서로 보여줍니다. 답장은 선택된 메시지를 기준으로 작성됩니다.
{threadLoading &&대화 흐름을 불러오는 중입니다...
} @@ -440,10 +458,17 @@ export function EmailDetail({ emailId, actionCommand = null }: { emailId: number )}메일과 관계의 흐름을 시각화합니다.