-
-
Notifications
You must be signed in to change notification settings - Fork 232
Expand file tree
/
Copy pathDockerfile
More file actions
144 lines (119 loc) · 5.1 KB
/
Dockerfile
File metadata and controls
144 lines (119 loc) · 5.1 KB
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# syntax=docker/dockerfile:1.6
# ============================================================================
# BUILD STAGE
# ============================================================================
FROM node:22-slim AS builder
ENV DEBIAN_FRONTEND=noninteractive
ENV NODE_ENV=production
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
python3 python3-minimal libpython3.11-minimal \
python3-pip \
build-essential pkg-config \
libgtk-3-0 libgtk-3-common \
libdbus-glib-1-2 libxt6 libx11-xcb1 libasound2 \
curl && \
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
WORKDIR /app
# Install Python dependencies with pip cache
RUN --mount=type=cache,target=/root/.cache/pip \
pip3 install --no-cache-dir --break-system-packages playwright python-jobspy
# Install Firefox for Python Playwright with cache
RUN --mount=type=cache,target=/root/.cache/pip \
python3 -m playwright install firefox
# Copy package files for dependency installation
COPY package*.json ./
COPY docs-site/package*.json ./docs-site/
COPY shared/package*.json ./shared/
COPY orchestrator/package*.json ./orchestrator/
COPY extractors/adzuna/package*.json ./extractors/adzuna/
COPY extractors/hiringcafe/package*.json ./extractors/hiringcafe/
COPY extractors/gradcracker/package*.json ./extractors/gradcracker/
COPY extractors/startupjobs/package*.json ./extractors/startupjobs/
COPY extractors/ukvisajobs/package*.json ./extractors/ukvisajobs/
# Install Node dependencies with npm cache (dev deps needed for build)
RUN --mount=type=cache,target=/root/.npm \
npm install --workspaces --include-workspace-root --include=dev \
--no-audit --no-fund --progress=false
# Fetch Camoufox binaries - do this before copying source code to cache the download
# Even if source changes, this layer remains cached.
RUN npx camoufox-js fetch
# Copy source code
WORKDIR /app
COPY shared ./shared
COPY docs-site ./docs-site
COPY orchestrator ./orchestrator
COPY visa-sponsor-providers ./visa-sponsor-providers
COPY extractors/adzuna ./extractors/adzuna
COPY extractors/hiringcafe ./extractors/hiringcafe
COPY extractors/gradcracker ./extractors/gradcracker
COPY extractors/jobspy ./extractors/jobspy
COPY extractors/startupjobs ./extractors/startupjobs
COPY extractors/ukvisajobs ./extractors/ukvisajobs
# Build documentation site bundle
WORKDIR /app/docs-site
RUN npm run build
# Build client bundle
WORKDIR /app/orchestrator
RUN npm run build:client
# ============================================================================
# PRODUCTION STAGE
# ============================================================================
FROM node:22-slim AS production
ENV DEBIAN_FRONTEND=noninteractive
ENV NODE_ENV=production
ENV PORT=3001
ENV PYTHON_PATH=/usr/bin/python3
ENV DATA_DIR=/app/data
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
# Install only runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
python3 python3-minimal libpython3.11-minimal \
python3-pip \
libgtk-3-0 libgtk-3-common \
libdbus-glib-1-2 libxt6 libx11-xcb1 libasound2 \
curl && \
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
WORKDIR /app
# Copy Python dependencies from builder
COPY --from=builder /usr/local/lib/python3.11/dist-packages /usr/local/lib/python3.11/dist-packages
COPY --from=builder /ms-playwright /ms-playwright
# Copy package files
COPY package*.json ./
COPY docs-site/package*.json ./docs-site/
COPY shared/package*.json ./shared/
COPY orchestrator/package*.json ./orchestrator/
COPY extractors/adzuna/package*.json ./extractors/adzuna/
COPY extractors/hiringcafe/package*.json ./extractors/hiringcafe/
COPY extractors/gradcracker/package*.json ./extractors/gradcracker/
COPY extractors/startupjobs/package*.json ./extractors/startupjobs/
COPY extractors/ukvisajobs/package*.json ./extractors/ukvisajobs/
# Install production Node dependencies only
RUN --mount=type=cache,target=/root/.npm \
npm install --workspaces --include-workspace-root --omit=dev \
--no-audit --no-fund --progress=false
# Copy built assets and source code from builder
COPY --from=builder /app/orchestrator/dist ./orchestrator/dist
COPY --from=builder /app/docs-site/build ./orchestrator/dist/docs
COPY shared ./shared
COPY orchestrator ./orchestrator
COPY visa-sponsor-providers ./visa-sponsor-providers
COPY extractors/adzuna ./extractors/adzuna
COPY extractors/hiringcafe ./extractors/hiringcafe
COPY extractors/gradcracker ./extractors/gradcracker
COPY extractors/jobspy ./extractors/jobspy
COPY extractors/startupjobs ./extractors/startupjobs
COPY extractors/ukvisajobs ./extractors/ukvisajobs
# Reuse Camoufox binaries from builder instead of fetching again
COPY --from=builder /root/.cache/camoufox /root/.cache/camoufox
WORKDIR /app
# Create data directory
RUN mkdir -p /app/data/pdfs
EXPOSE 3001
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3001/health || exit 1
WORKDIR /app/orchestrator
CMD ["sh", "-c", "npx tsx src/server/db/migrate.ts && npm run start"]