File size: 3,082 Bytes
0c0d5e5
 
7ce37bf
0c0d5e5
 
 
 
 
 
 
 
7ce37bf
0c0d5e5
 
 
 
7e4b3da
b563962
0c0d5e5
116ec26
b563962
 
 
 
4680b44
b563962
7ce37bf
b563962
7ce37bf
b563962
6aed364
b563962
7ce37bf
0c0d5e5
 
 
4680b44
 
0c0d5e5
 
 
 
 
 
 
4680b44
0c0d5e5
 
 
4680b44
0c0d5e5
 
 
a4bef0b
496ca32
443bf8a
 
 
4680b44
 
0c0d5e5
a4bef0b
 
0c0d5e5
496ca32
0404cc9
 
 
a4bef0b
443bf8a
 
0404cc9
443bf8a
 
0404cc9
 
 
 
 
 
 
a4bef0b
 
7ce37bf
 
 
6aed364
7ce37bf
6aed364
7ce37bf
0404cc9
 
a4bef0b
443bf8a
 
 
 
0404cc9
a4bef0b
0c0d5e5
0404cc9
 
c7a62ec
0404cc9
a4bef0b
443bf8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Base stage with shared configuration
FROM node:20.11-alpine3.19 AS base

# Configure build environment
ENV NODE_OPTIONS="--max_old_space_size=2048" \
    NEXT_TELEMETRY_DISABLED=1 \
    NODE_ENV=production \
    PYTHONDONTWRITEBYTECODE=1 \
    POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_CREATE=false \
    POETRY_CACHE_DIR=/cache/poetry

# Web builder stage
FROM base AS web-builder

WORKDIR /app/web

# Copy package files first
COPY web/package.json web/yarn.lock ./

# Install build dependencies globally first
RUN npm install -g code-inspector-plugin autoprefixer postcss tailwindcss

# Install project dependencies
RUN yarn install --frozen-lockfile --network-timeout 300000 && \
    yarn add --dev @types/node @types/react code-inspector-plugin autoprefixer postcss tailwindcss

# Copy source files
COPY web/ .

# Build the application with standalone output
RUN NODE_PATH=/usr/local/lib/node_modules yarn build

# Python builder stage
FROM python:3.10-slim-bookworm AS python-builder

# Install build dependencies in a single layer
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app/api

# Install and configure poetry
RUN pip install --no-cache-dir poetry

# Copy Python files and install dependencies
COPY api/pyproject.toml api/poetry.lock ./
RUN poetry config virtualenvs.create false && \
    poetry install --no-dev --no-interaction --no-ansi

# Final stage
FROM python:3.10-slim-bookworm

# Set up a new user named "user" with user ID 1000 (required by Hugging Face)
RUN useradd -m -u 1000 user

# Install runtime dependencies in a single layer
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    nodejs \
    npm \
    && rm -rf /var/lib/apt/lists/*

# Create app directory structure
WORKDIR /app
RUN mkdir -p api web && chown -R user:user /app

# Copy Python environment and set permissions
COPY --from=python-builder --chown=user /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --chown=user api/ /app/api/

# Copy web build artifacts with correct permissions
COPY --from=web-builder --chown=user /app/web/.next /app/web/.next
COPY --from=web-builder --chown=user /app/web/public /app/web/public
COPY --from=web-builder --chown=user /app/web/node_modules /app/web/node_modules
COPY --from=web-builder --chown=user /app/web/package.json /app/web/package.json

# Install gunicorn
RUN pip install --no-cache-dir gunicorn gevent

# Set environment variables
ENV FLASK_APP=app.py \
    EDITION=SELF_HOSTED \
    DEPLOY_ENV=PRODUCTION \
    CONSOLE_API_URL=http://127.0.0.1:7860 \
    CONSOLE_WEB_URL=http://127.0.0.1:3000 \
    SERVICE_API_URL=http://127.0.0.1:7860 \
    APP_WEB_URL=http://127.0.0.1:3000 \
    NODE_ENV=production \
    HOME=/app

# Switch to the non-root user
USER user

# Expose port 7860 as required by Hugging Face Spaces
EXPOSE 7860 3000

# Setup entrypoint
COPY --chown=user docker/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh

WORKDIR /app

CMD ["./entrypoint.sh"]