File size: 4,679 Bytes
3464008
 
 
 
 
 
 
 
 
96b1d0c
3464008
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96b1d0c
65de2c3
3464008
7cd8bd4
3464008
 
 
 
 
 
65de2c3
 
3464008
 
 
 
da6008a
3464008
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c648703
 
 
 
 
3464008
 
 
 
 
 
 
 
c648703
96b1d0c
3464008
 
 
96b1d0c
3464008
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
# =============================================================================
# GenerAI + World Monitor β€” Consolidated single-container image (HF Space)
# =============================================================================
# GenerAI (Python/FastAPI) and World Monitor (Node/nginx/Redis, AGPL-3.0,
# https://github.com/koala73/worldmonitor) run side by side under supervisord.
# nginx on :7860 is the single entrypoint HF Spaces expects:
#   /worldmonitor/*  -> World Monitor's own internal nginx (:8080, unmodified)
#   everything else  -> GenerAI's uvicorn (:8000)
# =============================================================================

# ── Stage 1: World Monitor frontend/API builder ─────────────────────────────
FROM node:24-bookworm-slim AS wm-builder
WORKDIR /wm
COPY worldmonitor/package.json worldmonitor/package-lock.json ./
RUN npm ci --ignore-scripts
COPY worldmonitor/ .
RUN node docker/build-handlers.mjs
RUN npm run build:crawlable-corpus && npm run build:sitemap && npx tsc && npx vite build --base=/worldmonitor/

# ── Stage 2: World Monitor runtime deps (unbundled raw JS handlers) ─────────
FROM node:24-bookworm-slim AS wm-runtime-deps
WORKDIR /wm
COPY worldmonitor/docker/runtime-package.json ./package.json
COPY worldmonitor/docker/runtime-package-lock.json ./package-lock.json
RUN npm ci --omit=dev --omit=optional --ignore-scripts

# ── Stage 3: Redis REST proxy (Upstash-compatible, for World Monitor) ───────
FROM node:24-bookworm-slim AS redisrest-builder
WORKDIR /redisrest
RUN npm init -y && npm install redis@4
COPY worldmonitor/docker/redis-rest-proxy.mjs .

# ── Stage 4: Final image ─────────────────────────────────────────────────────
FROM python:3.11-slim AS final

RUN apt-get update && apt-get install -y --no-install-recommends \
    curl gnupg ca-certificates gettext nginx supervisor redis-server wget \
    build-essential \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
    libdrm2 libdbus-1-3 libxkbcommon0 libxcomposite1 libxdamage1 \
    libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 \
    libcairo2 libatspi2.0-0 libx11-6 libxext6 fonts-liberation \
    && curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && rm -rf /var/lib/apt/lists/*

# ── GenerAI (Python) ──────────────────────────────────────────────────────────
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN python -m playwright install --with-deps chromium
COPY app.py brain.py scraper.py crawler.py auth.py mega_sync.py knowledge_base.py \
     errors.py worldmonitor_client.py logo.png LICENSE ./
RUN mkdir -p /app/database && chmod -R 777 /app

# ── World Monitor (Node) ──────────────────────────────────────────────────────
WORKDIR /wm
COPY --from=wm-builder /wm/src-tauri/sidecar/local-api-server.mjs ./local-api-server.mjs
COPY --from=wm-builder /wm/src-tauri/sidecar/package.json ./package.json
COPY --from=wm-runtime-deps /wm/node_modules ./node_modules
COPY --from=wm-builder /wm/api ./api
COPY --from=wm-builder /wm/data ./data
COPY --from=wm-builder /wm/dist /usr/share/nginx/html

COPY --from=redisrest-builder /redisrest /redisrest

# Full builder tree (incl. complete node_modules) β€” needed to run World
# Monitor's data seed scripts (scripts/seed-*.mjs), which aren't part of the
# slim runtime dependency set used by local-api-server.mjs above.
COPY --from=wm-builder /wm /wm-seed

# ── Supervisord / nginx / entrypoint (combined) ──────────────────────────────
COPY worldmonitor/docker/nginx.conf /etc/nginx/wm-internal.conf.template
COPY docker-combined/nginx-outer.conf.template /etc/nginx/wm-outer.conf.template
COPY docker-combined/supervisord.conf /etc/supervisor/conf.d/combined.conf
COPY docker-combined/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && \
    mkdir -p /tmp/nginx-client-body /tmp/nginx-proxy /tmp/nginx-fastcgi \
             /tmp/nginx-uwsgi /tmp/nginx-scgi /var/log/supervisor && \
    chmod -R 777 /tmp /var/log/supervisor /var/lib/nginx /var/log/nginx /wm /wm-seed

WORKDIR /app
EXPOSE 7860
ENV PYTHONUNBUFFERED=1

CMD ["/entrypoint.sh"]