# ================================================================ # URAL AI — Docker Space (worker satellite) # Dùng cho 4 space phụ: garen / yi / aren / quok # ================================================================ FROM python:3.11-slim # ── 1. System deps ────────────────────────────────────────────── # 🆕 FIX (2026-08-09): build build-essential (gcc/g++/make) ĐƯỢC GIỮ LẠI # làm lớp an toàn dự phòng — ban đầu Dockerfile này định dùng pre-built # wheel (--extra-index-url .../whl/cpu) để tránh biên dịch, nhưng THỰC # TẾ ĐÃ FAIL: "CMake Error: Could not find compiler CC: gcc" — vì kho # pre-built wheel của abetlen chỉ hỗ trợ MỘT SỐ version cụ thể của # llama-cpp-python; nếu version pip chọn không có sẵn ở đó, pip ÂM THẦM # bỏ qua extra-index-url và quay về build từ source — mà build từ # source cần gcc/g++, thứ Dockerfile trước đó không cài. Giữ cả 2 lớp: # pre-built wheel (nhanh, ưu tiên) + build-essential (chậm hơn nhưng # LUÔN thành công nếu pre-built không khớp) — build container có thể # lâu hơn vài phút ở lần đầu, nhưng không còn rủi ro fail cứng. RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential cmake \ libopus-dev libopus0 \ ffmpeg \ git curl \ && rm -rf /var/lib/apt/lists/* # ── 2. Workdir ────────────────────────────────────────────────── WORKDIR /app # ── 3. Python deps ────────────────────────────────────────────── # 🆕 FIX (2026-08-09): BỎ cờ --only-binary=llama-cpp-python — cờ này # CẤM pip build từ source, nên nếu pre-built wheel không khớp version, # pip FAIL CỨNG ngay lập tức thay vì tự rơi về build từ source (mâu # thuẫn với build-essential vừa thêm ở bước 1 làm lớp dự phòng). Giữ # --extra-index-url để pip ƯU TIÊN thử pre-built wheel trước (nhanh), # nhưng cho phép tự động build từ source nếu không tìm thấy — đúng # hành vi mặc định của pip khi có --extra-index-url mà không kèm # --only-binary. # # 🐛 FIX (2026-08-11): file thật trong thư mục này tên là # "requirements.txt" / "app.py" (thiếu chữ "r" — lỗi gõ khi # tạo file), KHÔNG PHẢI "requirements.txt" / "app.py" như dòng COPY cũ # yêu cầu. Trước đây Boss phải TỰ ĐỔI TÊN 2 file này bằng tay mỗi lần # upload lên HF Space — bước thủ công đó dễ quên, và khi quên, `docker # build` FAIL NGAY ở bước COPY (file not found) → Space chạy image build # THÀNH CÔNG LẦN GẦN NHẤT trước đó (có thể là code cũ, thiếu route # /api/local-llm hoặc thiếu toàn bộ local-model), không phải code hiện # tại trong repo. Đây CHÍNH LÀ lý do Main Space log thấy request bị # cancel ở tầng timeout mà Aren không có dòng access-log POST # /api/local-llm nào — request có thể đã tới 1 container đang chạy # snapshot cũ không có route đó, hoặc image build đang fail âm thầm. # Sửa thẳng ở đây (COPY/CMD trỏ đúng tên file thật) để KHÔNG CẦN đổi # tên tay nữa — build sẽ luôn dùng đúng code mới nhất trong repo. COPY requirements.txt . RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir \ --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu \ -r requirements.txt # ── 4. Copy source ────────────────────────────────────────────── # 🐛 FIX (2026-08-11): copy đúng tên file thật ("app.py") rồi đặt # lại thành app.py TRONG container (không đổi tên file nguồn trong repo, # tránh phải sửa mọi chỗ khác đang tham chiếu "app.py" — hiện chỉ # còn __pycache__ tham chiếu, nhưng giữ tên nguồn ổn định vẫn an toàn # hơn đổi tên file thật). COPY app.py . COPY yui_local_model_server.py . # ── 5. Port ───────────────────────────────────────────────────── EXPOSE 7860 # ── 6. Khởi động ───────────────────────────────────────────────── # Worker app dùng biến app_fastapi (không có Gradio mount) CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "1", "--timeout-keep-alive", "75"]