200 lines
8.3 KiB
Makefile
200 lines
8.3 KiB
Makefile
# 织忆 MemoryWeave — Makefile
|
||
# Go daemon (zhiyid) + Rust sidecar (zhiyi-consolidate)
|
||
|
||
.PHONY: all build test bench eval deploy clean
|
||
|
||
# ─── 变量 ────────────────────────────────────────────
|
||
GO_CMD := go
|
||
RUST_CMD := cargo
|
||
GO_DIR := go
|
||
RUST_DIR := rust
|
||
BINARY_GO := $(GO_DIR)/cmd/zhiyid/zhiyid
|
||
BINARY_RUST := $(RUST_DIR)/target/release/zhiyi-consolidate
|
||
|
||
# ─── 构建 ────────────────────────────────────────────
|
||
|
||
all: build-go build-rust
|
||
|
||
build-go:
|
||
cd $(GO_DIR) && CGO_ENABLED=1 $(GO_CMD) build -o cmd/zhiyid/zhiyid ./cmd/zhiyid
|
||
|
||
build-rust:
|
||
cd $(RUST_DIR) && $(RUST_CMD) build --release
|
||
|
||
build: build-go ## 只构建 Go (Rust 需单独 build-rust)
|
||
|
||
# ─── Obsidian 插件 ────────────────────────────────────
|
||
OBSIDIAN_PLUGIN := plugins/obsidian
|
||
OBSIDIAN_DEST := $(HOME)/.obsidian/plugins/zhiyi-memory
|
||
|
||
build-obsidian:
|
||
cd $(OBSIDIAN_PLUGIN) && node esbuild.config.mjs
|
||
|
||
install-obsidian: build-obsidian
|
||
cp $(OBSIDIAN_PLUGIN)/main.js $(OBSIDIAN_DEST)/
|
||
cp $(OBSIDIAN_PLUGIN)/manifest.json $(OBSIDIAN_DEST)/
|
||
cp $(OBSIDIAN_PLUGIN)/styles.css $(OBSIDIAN_DEST)/
|
||
|
||
# ─── 增强 CLI ─────────────────────────────────────────────
|
||
build-cli:
|
||
cd $(GO_DIR) && $(GO_CMD) build -o $(HOME)/.local/bin/zhiyi-cli ./cmd/zhiyi-cli
|
||
|
||
# ─── Web UI ─────────────────────────────────────────────
|
||
build-web:
|
||
@echo "Web UI 使用静态 HTML(无需构建)"
|
||
@echo " - 前端入口: web-ui/index.html"
|
||
@echo " - 访问地址: http://localhost:7821/"
|
||
@echo " - API 地址: http://localhost:7821/api/v1/"
|
||
|
||
VERSION := $(shell cat VERSION)
|
||
REGISTRY ?= localhost:5000
|
||
|
||
# ─── 版本信息 ──────────────────────────────────────────
|
||
version:
|
||
@echo "$(VERSION)"
|
||
|
||
# ─── 一键安装所有 ───────────────────────────────────────
|
||
install-all: build-go build-cli install-obsidian
|
||
@echo "版本: $(VERSION)"
|
||
@echo "二进制: $(HOME)/.local/bin/zhiyid"
|
||
@echo "全部安装完成(重启服务: systemctl --user restart zhiyid)"
|
||
|
||
# ─── 镜像构建 & 推送 ─────────────────────────────────────
|
||
docker-build:
|
||
docker build -t zhiyid:$(VERSION) -t zhiyid:latest .
|
||
|
||
docker-tag:
|
||
docker tag zhiyid:$(VERSION) $(REGISTRY)/zhiyid:$(VERSION)
|
||
docker tag zhiyid:$(VERSION) $(REGISTRY)/zhiyid:latest
|
||
|
||
docker-push: docker-build docker-tag
|
||
docker push $(REGISTRY)/zhiyid:$(VERSION)
|
||
docker push $(REGISTRY)/zhiyid:latest
|
||
|
||
# ─── 一键部署(Docker Compose)────────────────────────────
|
||
deploy-compose: docker-build
|
||
docker compose up -d --remove-orphans
|
||
@echo "部署完成: curl http://localhost:7821/health"</
|
||
|
||
# ─── 测试 ────────────────────────────────────────────
|
||
|
||
test:
|
||
cd $(GO_DIR) && $(GO_CMD) test ./... -v -count=1
|
||
|
||
test-go: test
|
||
|
||
test-rust:
|
||
cd $(RUST_DIR) && $(RUST_CMD) test
|
||
|
||
# ─── 性能基准 ────────────────────────────────────────
|
||
|
||
bench:
|
||
cd $(GO_DIR) && $(GO_CMD) test ./internal/storage -bench=. -benchmem -count=3
|
||
|
||
# ─── 评估 ────────────────────────────────────────────
|
||
|
||
eval:
|
||
@echo "=== 织忆评估链路 ==="
|
||
@curl -s -X POST http://localhost:7821/api/v1/eval/generate \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: $$API_KEY" \
|
||
-d '{"namespace":"shared","count":12}' | jq '.count'
|
||
@echo "---"
|
||
@curl -s -X POST http://localhost:7821/api/v1/eval/run \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: $$API_KEY" \
|
||
-d '{"queries":[]}' | jq '{recall_at_5,precision_at_5,mean_reciprocal_rank}'
|
||
|
||
# ─── CI/CD 自动评估 ──────────────────────────────────
|
||
|
||
ci-eval:
|
||
@echo "--- CI/CD 自动评估 ---"
|
||
@TIMESTAMP=$$(date -Iseconds); \
|
||
RESULT=$$(curl -s -X POST http://localhost:7821/api/v1/eval/run \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: $$API_KEY" \
|
||
-d '{"queries":[]}'); \
|
||
RECALL=$$(echo $$RESULT | jq -r '.recall_at_5 // 0'); \
|
||
echo "$$TIMESTAMP | recall@5=$$RECALL"; \
|
||
PREV=$$(curl -s http://localhost:7821/api/v1/eval/history \
|
||
-H "X-API-Key: $$API_KEY" | jq -r '.trend // "first_run"'); \
|
||
echo "Trend: $$PREV"; \
|
||
if [ "$$PREV" = "degrading" ]; then \
|
||
echo "⚠️ ALERT: Eval degradation detected!"; \
|
||
exit 1; \
|
||
fi
|
||
|
||
# ─── 部署 ────────────────────────────────────────────
|
||
|
||
deploy: build-go
|
||
sudo cp $(BINARY_GO) /usr/local/bin/zhiyid
|
||
sudo cp deploy/zhiyid.service /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl restart zhiyid
|
||
|
||
deploy-rust: build-rust
|
||
sudo cp $(BINARY_RUST) /usr/local/bin/zhiyi-consolidate
|
||
sudo cp deploy/zhiyi-consolidate.service /etc/systemd/system/
|
||
sudo cp deploy/zhiyi-consolidate.timer /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now zhiyi-consolidate.timer
|
||
|
||
deploy-nginx:
|
||
sudo cp deploy/nginx-zhiyi.conf /etc/nginx/sites-enabled/zhiyi.conf
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
|
||
deploy-prometheus:
|
||
sudo cp deploy/prometheus-alerts.yml /etc/prometheus/rules/zhiyi.yml
|
||
sudo systemctl reload prometheus
|
||
|
||
# ─── 健康检查 ────────────────────────────────────────
|
||
|
||
health:
|
||
@curl -sf http://localhost:7821/health > /dev/null && echo "✅ zhiyid: OK" || echo "❌ zhiyid: DOWN"
|
||
@curl -sf http://localhost:8000/v1/embeddings -H "Content-Type: application/json" -d '{"input":["test"]}' > /dev/null 2>&1 && echo "✅ BGE-M3 ONNX: OK" || echo "⚠️ BGE-M3 ONNX: NOT REACHABLE"
|
||
@redis-cli PING > /dev/null 2>&1 && echo "✅ Redis: OK" || echo "⚠️ Redis: NOT REACHABLE"
|
||
@curl -sf http://localhost:7821/api/v1/stats -H "X-API-Key: $$API_KEY" | jq '{total_memories,total_episodes}'
|
||
|
||
# ─── 清理 ────────────────────────────────────────────
|
||
|
||
clean:
|
||
cd $(GO_DIR) && $(GO_CMD) clean
|
||
cd $(RUST_DIR) && $(RUST_CMD) clean
|
||
|
||
# ─── 迁移 ────────────────────────────────────────────
|
||
|
||
migrate:
|
||
cd $(GO_DIR) && $(GO_CMD) run ../scripts/migrate_faiss_to_lance.go \
|
||
--faiss-path ~/projects/zhiyi/memory_faiss.index \
|
||
--metadata-path ~/projects/zhiyi/memory_metadata.json \
|
||
--target sqlite \
|
||
--db-path /var/lib/memoryweave/memoryweave.db
|
||
|
||
migrate-dry-run:
|
||
cd $(GO_DIR) && $(GO_CMD) run ../scripts/migrate_faiss_to_lance.go \
|
||
--faiss-path ~/projects/zhiyi/memory_faiss.index \
|
||
--metadata-path ~/projects/zhiyi/memory_metadata.json \
|
||
--dry-run
|
||
|
||
# ─── 帮助 ────────────────────────────────────────────
|
||
|
||
help:
|
||
@echo "织忆 MemoryWeave — Build & Deploy"
|
||
@echo ""
|
||
@echo "Usage:"
|
||
@echo " make build 构建 Go daemon"
|
||
@echo " make build-rust 构建 Rust sidecar"
|
||
@echo " make build-cli 构建 CLI 工具"
|
||
@echo " make version 显示版本"
|
||
@echo " make install-all 一键安装全部(构建+CLI+Obsidian插件)"
|
||
@echo " make docker-build 构建 Docker 镜像"
|
||
@echo " make docker-push 推送 Docker 镜像"
|
||
@echo " make deploy-compose 一键 Docker Compose 部署"
|
||
@echo " make test 运行测试"
|
||
@echo " make bench 性能基准"
|
||
@echo " make eval 运行评估"
|
||
@echo " make ci-eval CI/CD 自动评估 (含退化检测)"
|
||
@echo " make health 健康检查"
|
||
@echo " make deploy 部署 Go daemon(systemd 全局)"
|
||
@echo " make clean 清理"
|