1. k8s/awoooi-dev/: 新建 dev namespace (01-05 配置)
- Namespace + ResourceQuota (cpu 2/4, mem 4Gi/8Gi)
- ConfigMap: ENVIRONMENT=dev, LOG_LEVEL=DEBUG, SHADOW_MODE=false
- Deployment: 1 replica, NodePort 32344, image dev-latest
- RBAC: awoooi-executor-dev ServiceAccount
2. .gitea/workflows/cd-dev.yaml: dev branch CD pipeline
- 觸發: dev branch push
- Build: --no-cache (防 cache poisoning)
- Tag: dev-{sha} / dev-latest
- Deploy: awoooi-dev namespace, health check 32344
- Telegram: [DEV] 前綴通知
3. apps/api/Dockerfile: ARG CACHE_BUST=none (防 BuildKit cache 毒化)
- deps 層 (pip install) 仍可 cache
- src/ 和 models.json 層每次重建
4. .gitea/workflows/cd.yaml: 正式環境 API build 加入 CACHE_BUST=git_sha
- 確保 models.json 等配置變更正確進入 image
5. apps/api/src/services/nvidia_provider.py: timeout 不計入 circuit breaker
- TimeoutException → 只 log,不 record_failure()
- 只有硬性錯誤 (auth/rate limit/exception) 才斷路
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
61 lines
2.0 KiB
Docker
61 lines
2.0 KiB
Docker
# AWOOOI API - Production Dockerfile
|
||
# Phase 6.4i: 支援 monorepo 本地 packages (lewooogo-brain, lewooogo-data)
|
||
#
|
||
# 使用方式 (從 monorepo 根目錄):
|
||
# docker build -f apps/api/Dockerfile -t awoooi-api:v1.0.0 .
|
||
#
|
||
# 注意: 必須從 monorepo 根目錄執行,否則無法存取 packages/
|
||
|
||
FROM python:3.11-slim AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
# Install uv (固定版本,禁止 :latest)
|
||
COPY --from=ghcr.io/astral-sh/uv:0.6.9 /uv /bin/uv
|
||
|
||
# Phase 6.4i: 複製本地 packages 到 Docker context
|
||
# 順序重要: 先複製 packages,再複製 api (利用 Docker layer cache)
|
||
COPY packages/lewooogo-data/ /packages/lewooogo-data/
|
||
COPY packages/lewooogo-brain/ /packages/lewooogo-brain/
|
||
|
||
# 複製 API 依賴文件 (pyproject.toml 需要 README.md)
|
||
COPY apps/api/pyproject.toml apps/api/README.md ./
|
||
|
||
# 複製 src 目錄 (hatchling build 需要)
|
||
COPY apps/api/src/ ./src/
|
||
|
||
# 安裝本地 packages 與 API 依賴 (合併 RUN 減少 layer)
|
||
# 注意: `uv pip install .` 從 pyproject.toml 安裝依賴
|
||
RUN uv pip install --system --no-cache /packages/lewooogo-data && \
|
||
uv pip install --system --no-cache /packages/lewooogo-brain && \
|
||
uv pip install --system --no-cache .
|
||
|
||
# Production stage
|
||
FROM python:3.11-slim
|
||
|
||
WORKDIR /app
|
||
|
||
# Copy installed packages from builder
|
||
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||
COPY --from=builder /usr/local/bin /usr/local/bin
|
||
|
||
# 2026-04-01 ogt: CACHE_BUST 強制失效 src/ 和 models.json 層
|
||
# deps 層 (pip install) 仍可 cache;代碼/配置變更必須重建
|
||
ARG CACHE_BUST=none
|
||
COPY apps/api/src/ ./src/
|
||
COPY apps/api/models.json ./models.json
|
||
|
||
# Create non-root user
|
||
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
|
||
USER appuser
|
||
|
||
# Expose port
|
||
EXPOSE 8000
|
||
|
||
# Health check (使用正確的 API 路徑)
|
||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||
CMD python -c "import httpx; httpx.get('http://localhost:8000/api/v1/health', timeout=5)" || exit 1
|
||
|
||
# Run application
|
||
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]
|