From 2eb2209e4098ee1b14f2e0bc6c1fd537126ac313 Mon Sep 17 00:00:00 2001 From: "a.tolmachev" Date: Sun, 3 May 2026 21:36:14 +0000 Subject: [PATCH] deploy: add optional valkey community profile --- TASKS.md | 2 +- deploy/community/.env.example | 3 +++ deploy/community/docker-compose.yml | 23 +++++++++++++++++++++++ docs/community-release-checklist.md | 3 +++ docs/deployment.md | 22 +++++++++++++++++++++- 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/TASKS.md b/TASKS.md index 6195403..eb7253d 100644 --- a/TASKS.md +++ b/TASKS.md @@ -50,8 +50,8 @@ Progress: - product/docs/runtime plan already define cache layer as optional and edition-aware - public cache contracts and runtime cache config now exist in `crank-core` / `crank-runtime` - Community fallback in-memory implementations now exist for response cache, rate-limit state, replay guard, and coordination state + - Community deployment manifest now includes optional `valkey` profile and cache env wiring without making cache mandatory - pending: - - optional `Valkey` in Community manifests - external cache backend for managed / enterprise contours ## Planned diff --git a/deploy/community/.env.example b/deploy/community/.env.example index afe4348..bbb7d95 100644 --- a/deploy/community/.env.example +++ b/deploy/community/.env.example @@ -24,6 +24,9 @@ CRANK_RUNTIME_MAX_CONCURRENT_UNARY=64 CRANK_RUNTIME_MAX_CONCURRENT_WINDOW=16 CRANK_RUNTIME_MAX_CONCURRENT_SESSIONS=16 CRANK_RUNTIME_MAX_CONCURRENT_JOBS=16 +CRANK_CACHE_BACKEND=memory +CRANK_CACHE_URL= +CRANK_CACHE_DEFAULT_TTL_MS= CRANK_LOG_LEVEL=info CRANK_MASTER_KEY=change-me-master-key CRANK_SESSION_SECRET=change-me-session-secret diff --git a/deploy/community/docker-compose.yml b/deploy/community/docker-compose.yml index fdaab1c..7ace112 100644 --- a/deploy/community/docker-compose.yml +++ b/deploy/community/docker-compose.yml @@ -16,6 +16,22 @@ services: timeout: 5s retries: 5 + valkey: + image: valkey/valkey:8-alpine + restart: unless-stopped + profiles: + - cache + command: ["valkey-server", "--save", "", "--appendonly", "no"] + volumes: + - valkey_data:/data + ports: + - "127.0.0.1:6379:6379" + healthcheck: + test: ["CMD", "valkey-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + admin-api: image: ${CRANK_ADMIN_API_IMAGE:-crank/admin-api:dev} build: @@ -30,6 +46,9 @@ services: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-crank} CRANK_STORAGE_ROOT: ${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} CRANK_ADMIN_BIND: ${CRANK_ADMIN_BIND:-0.0.0.0:3001} + CRANK_CACHE_BACKEND: ${CRANK_CACHE_BACKEND:-memory} + CRANK_CACHE_URL: ${CRANK_CACHE_URL:-} + CRANK_CACHE_DEFAULT_TTL_MS: ${CRANK_CACHE_DEFAULT_TTL_MS:-} CRANK_LOG_LEVEL: ${CRANK_LOG_LEVEL:-info} CRANK_MASTER_KEY: ${CRANK_MASTER_KEY} CRANK_BASE_URL: ${CRANK_BASE_URL:-http://localhost:3000} @@ -68,6 +87,9 @@ services: CRANK_STORAGE_ROOT: ${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} CRANK_MCP_BIND: ${CRANK_MCP_BIND:-0.0.0.0:3002} CRANK_MCP_REFRESH_MS: ${CRANK_MCP_REFRESH_MS:-5000} + CRANK_CACHE_BACKEND: ${CRANK_CACHE_BACKEND:-memory} + CRANK_CACHE_URL: ${CRANK_CACHE_URL:-} + CRANK_CACHE_DEFAULT_TTL_MS: ${CRANK_CACHE_DEFAULT_TTL_MS:-} CRANK_LOG_LEVEL: ${CRANK_LOG_LEVEL:-info} CRANK_MASTER_KEY: ${CRANK_MASTER_KEY} CRANK_BASE_URL: ${CRANK_BASE_URL:-http://localhost:3000} @@ -101,3 +123,4 @@ services: volumes: postgres_data: artifact_storage: + valkey_data: diff --git a/docs/community-release-checklist.md b/docs/community-release-checklist.md index 8081ef7..4627eb9 100644 --- a/docs/community-release-checklist.md +++ b/docs/community-release-checklist.md @@ -38,6 +38,7 @@ Community release должен поставлять: - `admin-api` - `mcp-server` - `postgres` как runtime dependency в compose-манифесте +- optional `valkey` profile как рекомендованный, но не обязательный cache layer - healthchecks - базовый self-hosted deployment path - capability-gated UI, который не притворяется коммерческой редакцией @@ -60,6 +61,7 @@ Community release должен поставлять: 1. `CI` зеленый. 2. Community deployment manifest валиден: - `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example config -q` + - `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example --profile cache config -q` 3. Docker image build проходит для: - `admin-api` - `mcp-server` @@ -101,6 +103,7 @@ Community release должен поставлять: - UI не показывает рабочими premium-only сценарии; - `admin-api` и `mcp-server` enforce capability limits на сервере; - public deployment path воспроизводим на чистом хосте; +- базовый запуск и запуск с profile `cache` оба валидны; - staging smoke записан в regression notes. ## 8. Связанные документы diff --git a/docs/deployment.md b/docs/deployment.md index 81f51eb..4bd6041 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -56,6 +56,7 @@ - `admin-api` - `mcp-server` - `postgres` +- optional `valkey` через compose profile `cache` Persistent data: @@ -172,7 +173,23 @@ services: - публиковать `ui`, `admin-api` и `mcp-server` на loopback по умолчанию; - позволять переопределить publish bind одним env для случаев, когда reverse proxy вынесен на отдельный хост; - не публиковать внутренние сервисы наружу без необходимости; -- содержать healthchecks. +- содержать healthchecks; +- поддерживать optional cache profile без превращения `Valkey` в обязательную runtime dependency. + +Для Community optional cache layer включается отдельно: + +- profile: `cache` +- service: `valkey` +- базовый запуск без profile должен оставаться полностью рабочим + +Пример: + +```bash +docker compose \ + -f deploy/community/docker-compose.yml \ + --env-file deploy/community/.env.example \ + --profile cache up -d +``` ## 10. Healthchecks @@ -250,6 +267,9 @@ Workflow доставляет именно `deploy/community/docker-compose.yml` - `CRANK_LOG_LEVEL` - `CRANK_MASTER_KEY` - `CRANK_BASE_URL` +- `CRANK_CACHE_BACKEND` +- `CRANK_CACHE_URL` +- `CRANK_CACHE_DEFAULT_TTL_MS` - `CRANK_SESSION_SECRET` - `CRANK_PASSWORD_PEPPER` - `CRANK_SESSION_TTL_HOURS`