diff --git a/VERSION b/VERSION index afed694e..522ab7d4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.65.0 +0.65.1 diff --git a/aiprovider/Dockerfile b/aiprovider/Dockerfile index 6b6f6f69..32c1e95a 100644 --- a/aiprovider/Dockerfile +++ b/aiprovider/Dockerfile @@ -15,12 +15,15 @@ ENV PYTHONUNBUFFERED=1 ENV UV_COMPILE_BYTECODE=1 ENV UV_LINK_MODE=copy +RUN mkdir -p /root/.config/uv + RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ && rm -rf /var/lib/apt/lists/* COPY pyproject.toml uv.lock /app/ RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=secret,id=planet_uv_config,target=/root/.config/uv/uv.toml,required=false \ uv sync --frozen --no-dev COPY aiprovider /app/aiprovider diff --git a/backend/Dockerfile b/backend/Dockerfile index 8546fe7a..b98c7a24 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,3 +1,5 @@ +# syntax=docker/dockerfile:1.7 + ARG PYTHON_IMAGE=python:3.14-slim ARG UV_IMAGE=ghcr.io/astral-sh/uv:latest @@ -14,12 +16,16 @@ ENV UV_COMPILE_BYTECODE=1 ENV UV_LINK_MODE=copy ENV PYTHONPATH=/app/backend +RUN mkdir -p /root/.config/uv + RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ && rm -rf /var/lib/apt/lists/* COPY pyproject.toml uv.lock /app/ -RUN uv sync --frozen --no-dev +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=secret,id=planet_uv_config,target=/root/.config/uv/uv.toml,required=false \ + uv sync --frozen --no-dev COPY backend /app/backend COPY VERSION /app/VERSION diff --git a/docker-compose.local-model.yml b/docker-compose.local-model.yml index 0927245a..2e71368a 100644 --- a/docker-compose.local-model.yml +++ b/docker-compose.local-model.yml @@ -15,12 +15,15 @@ services: retries: 10 aiprovider: + image: ${AI_PROVIDER_IMAGE_NAME:-planet-aiprovider:latest} build: context: . dockerfile: aiprovider/Dockerfile args: PYTHON_IMAGE: ${PYTHON_IMAGE:-python:3.14-slim} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:latest} + secrets: + - planet_uv_config container_name: planet_aiprovider ports: - "8010:8010" @@ -43,3 +46,7 @@ services: volumes: ollama_data: + +secrets: + planet_uv_config: + file: ${PLANET_UV_CONFIG_FILE:-/dev/null} diff --git a/docker-compose.simple.yml b/docker-compose.simple.yml index c8c2e3fd..262c3a94 100644 --- a/docker-compose.simple.yml +++ b/docker-compose.simple.yml @@ -2,12 +2,15 @@ version: '3.8' services: aiprovider: + image: ${AI_PROVIDER_IMAGE_NAME:-planet-aiprovider:latest} build: context: . dockerfile: aiprovider/Dockerfile args: PYTHON_IMAGE: ${PYTHON_IMAGE:-python:3.14-slim} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:latest} + secrets: + - planet_uv_config env_file: - ./aiprovider/.env - ${PLANET_AI_PROVIDER_RUNTIME_ENV_FILE:-./aiprovider/.env} @@ -43,3 +46,7 @@ services: volumes: postgres_data: redis_data: + +secrets: + planet_uv_config: + file: ${PLANET_UV_CONFIG_FILE:-/dev/null} diff --git a/docker-compose.yml b/docker-compose.yml index 3ee9f9eb..2bd8ebb8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,12 +2,15 @@ version: '3.8' services: aiprovider: + image: ${AI_PROVIDER_IMAGE_NAME:-planet-aiprovider:latest} build: context: . dockerfile: aiprovider/Dockerfile args: PYTHON_IMAGE: ${PYTHON_IMAGE:-python:3.14-slim} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:latest} + secrets: + - planet_uv_config env_file: - ./aiprovider/.env - ${PLANET_AI_PROVIDER_RUNTIME_ENV_FILE:-./aiprovider/.env} @@ -53,3 +56,7 @@ services: volumes: postgres_data: redis_data: + +secrets: + planet_uv_config: + file: ${PLANET_UV_CONFIG_FILE:-/dev/null} diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d92e5aa4..c1a9d290 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -8,6 +8,22 @@ This project follows the repository versioning rule: - `improvement` -> `+0.0.1`(bugfix + 小功能混合) - `bugfix` -> `+0.0.1` +## [0.65.1] — 2026-05-22 + +Released: 2026-05-22 + +### Highlights +- 修复 `planet.sh` 与 Docker Compose 对 AI Provider 镜像名不一致导致的重复构建问题。 +- 让本地 `uv` 与 Docker build 统一使用用户机器上的 `uv.toml`,避免把镜像源写入 `uv.lock`。 +- 通过 BuildKit secret 向容器构建传入 uv 配置,保留用户源选择且不把配置写入镜像层。 + +### Added / Fixed / Improved +- `planet.sh` 自动解析 `UV_CONFIG_FILE`、仓库 `uv.toml` 与用户级 `~/.config/uv/uv.toml`,并清理会覆盖配置的 `UV_INDEX_URL` 环境变量。 +- AI Provider 和后端 Dockerfile 在 `uv sync` 阶段挂载 uv 配置 secret,并复用 BuildKit uv cache。 +- Docker Compose 三套配置统一声明 `planet-aiprovider:latest` 镜像名和 `planet_uv_config` build secret。 + +--- + ## [0.65.0] — 2026-05-21 Released: 2026-05-21 diff --git a/docs/version-history.md b/docs/version-history.md index ad91ed82..befecd27 100644 --- a/docs/version-history.md +++ b/docs/version-history.md @@ -16,12 +16,13 @@ ## Current Version - `main` 当前主线历史推导到:`0.16.5` -- `dev` 当前开发分支历史推导到:`0.65.0` +- `dev` 当前开发分支历史推导到:`0.65.1` ## Timeline | Version | Type | Branch | Commit | Summary | | --- | --- | --- | --- | --- | +| `0.65.1` | bugfix | `dev` | `pending` | 统一 `planet.sh` 与 Compose 的 AI Provider 镜像名,并让本地和 Docker build 通过用户级 `uv.toml` 共享 uv 源配置,避免镜像源污染 `uv.lock` | | `0.65.0` | feature | `dev` | `pending` | Admin Next 数据源触发入口收敛为“触发全部/触发已选 N”,队列改为右上角浮层按钮,并强化 `planet.sh destroy` 的 OOBE 数据清理 | | `0.64.0` | feature | `dev` | `pending` | Earth 新增后端状态驱动 OOBE 与 About 配置,Admin Next 数据源页新增采集队列,补齐深色主题滑块和用户/技术文档 | | `0.63.1` | bugfix | `dev` | `pending` | 补上被 `lib/` ignore 规则漏提交的 Admin Next utility module,修复新设备初始化后 AdminNextRoutes 动态导入 500 | diff --git a/frontend/package.json b/frontend/package.json index d34a97b5..d1327f7f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "planet-frontend", - "version": "0.65.0", + "version": "0.65.1", "private": true, "packageManager": "bun@1", "dependencies": { diff --git a/planet.sh b/planet.sh index a9740136..6f7ead51 100755 --- a/planet.sh +++ b/planet.sh @@ -125,9 +125,11 @@ MOTION_AGENT_PID_FILE="$PLANET_STATE_DIR/motion_agent.pid" MOTION_AGENT_LOG_FILE="$PLANET_STATE_DIR/motion_agent.log" AI_PROVIDER_BUILD_STAMP_FILE="$PLANET_CACHE_DIR/aiprovider_build.sha256" AI_PROVIDER_BUILD_LOG_FILE="$PLANET_STATE_DIR/aiprovider_build.log" -AI_PROVIDER_IMAGE_NAME="${AI_PROVIDER_IMAGE_NAME:-planet_aiprovider:latest}" +AI_PROVIDER_IMAGE_NAME="${AI_PROVIDER_IMAGE_NAME:-planet-aiprovider:latest}" AI_PROVIDER_CONTAINER_NAME="${AI_PROVIDER_CONTAINER_NAME:-planet_aiprovider}" PLANET_AI_PROVIDER_RUNTIME_ENV_FILE="${PLANET_AI_PROVIDER_RUNTIME_ENV_FILE:-$PLANET_STATE_DIR/aiprovider_runtime.env}" +PLANET_EMPTY_UV_CONFIG_FILE="$PLANET_STATE_DIR/uv.empty.toml" +PLANET_UV_CONFIG_FILE="${PLANET_UV_CONFIG_FILE:-}" AI_PROVIDER_RECREATE_REQUIRED=0 START_RUN_ACTIVE=0 START_RUN_COMPLETED=0 @@ -171,6 +173,46 @@ ensure_local_runtime_bins_on_path() { ensure_local_runtime_bins_on_path +resolve_uv_config_file() { + local candidate + + if [ -n "${UV_CONFIG_FILE:-}" ] && [ -f "$UV_CONFIG_FILE" ]; then + printf "%s\n" "$UV_CONFIG_FILE" + return 0 + fi + + for candidate in \ + "$SCRIPT_DIR/uv.toml" \ + "${XDG_CONFIG_HOME:-$HOME/.config}/uv/uv.toml" \ + "$HOME/.uv/uv.toml"; do + if [ -f "$candidate" ]; then + printf "%s\n" "$candidate" + return 0 + fi + done + + return 1 +} + +prepare_uv_build_config() { + local uv_config_file + + uv_config_file="$(resolve_uv_config_file || true)" + if [ -n "$uv_config_file" ]; then + PLANET_UV_CONFIG_FILE="$uv_config_file" + else + : > "$PLANET_EMPTY_UV_CONFIG_FILE" + PLANET_UV_CONFIG_FILE="$PLANET_EMPTY_UV_CONFIG_FILE" + fi + + UV_CONFIG_FILE="$PLANET_UV_CONFIG_FILE" + unset UV_DEFAULT_INDEX UV_INDEX_URL UV_EXTRA_INDEX_URL + export UV_CONFIG_FILE + export PLANET_UV_CONFIG_FILE +} + +prepare_uv_build_config + # Shell / Docker helpers is_pid() { [[ "${1:-}" =~ ^[0-9]+$ ]] && [ "$1" -gt 0 ] @@ -1086,6 +1128,10 @@ compute_ai_provider_build_fingerprint() { | xargs -r stat --format="%Y %s %n" 2>/dev/null sha256sum docker-compose.yml docker-compose.simple.yml 2>/dev/null python3 "$SCRIPT_DIR/scripts/compute_aiprovider_dependency_fingerprint.py" 2>/dev/null + if [ -n "${PLANET_UV_CONFIG_FILE:-}" ] && [ -f "$PLANET_UV_CONFIG_FILE" ]; then + printf "uv-config " + sha256sum "$PLANET_UV_CONFIG_FILE" | awk '{print $1}' + fi } ) | sha256sum | awk '{print $1}' } @@ -1166,6 +1212,8 @@ ensure_ai_provider_image_current() { local current_fingerprint="" local previous_fingerprint="" + prepare_uv_build_config + current_fingerprint="$(compute_ai_provider_build_fingerprint)" previous_fingerprint="$(read_ai_provider_build_stamp || true)" diff --git a/pyproject.toml b/pyproject.toml index adcd4e9d..aa4fd5e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "planet" -version = "0.65.0" +version = "0.65.1" description = "智能星球计划 - 态势感知系统" requires-python = ">=3.14" dependencies = [ diff --git a/uv.lock b/uv.lock index 744c031c..f9273057 100644 --- a/uv.lock +++ b/uv.lock @@ -757,7 +757,7 @@ wheels = [ [[package]] name = "planet" -version = "0.65.0" +version = "0.65.1" source = { virtual = "." } dependencies = [ { name = "aiofiles" },