diff --git a/.dockerignore b/.dockerignore index d76ed8d..ae0f909 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,6 +11,8 @@ docker-data dist data qdrant +include +lib *.log __debug_bin* diff --git a/Dockerfile b/Dockerfile index 1584ee0..750eb5d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,6 +29,64 @@ RUN --mount=type=cache,target=/go/pkg/mod \ CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ go build -v -trimpath -ldflags="-s -w" -o /out/agent-desk ./cmd/server +FROM golang:1.26-bookworm AS server-builder-lancedb +WORKDIR /src + +ARG TARGETOS=linux +ARG TARGETARCH +ARG LANCEDB_VERSION=v0.1.2 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends bash build-essential ca-certificates curl git \ + && rm -rf /var/lib/apt/lists/* + +COPY go.mod go.sum ./ +RUN --mount=type=cache,target=/go/pkg/mod \ + go mod download + +COPY . ./ +COPY --from=web-builder /src/web/out ./web/out + +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + set -eux; \ + if [ "$${TARGETOS}" != "linux" ]; then \ + echo "LanceDB Docker image supports TARGETOS=linux only, got $${TARGETOS}" >&2; \ + exit 1; \ + fi; \ + arch="$${TARGETARCH:-$$(go env GOARCH)}"; \ + case "$$arch" in \ + amd64|arm64) ;; \ + *) echo "Unsupported LanceDB Docker architecture: $$arch" >&2; exit 1 ;; \ + esac; \ + curl -sSL https://raw.githubusercontent.com/lancedb/lancedb-go/main/scripts/download-artifacts.sh | bash -s "$${LANCEDB_VERSION}"; \ + CGO_ENABLED=1 GOOS="$${TARGETOS}" GOARCH="$$arch" \ + CGO_CFLAGS="-I/src/include" \ + CGO_LDFLAGS="/src/lib/linux_$$arch/liblancedb_go.a -lm -ldl -lpthread" \ + go build -tags lancedb -v -trimpath -ldflags="-s -w" -o /out/agent-desk ./cmd/server + +FROM debian:bookworm-slim AS app-lancedb +WORKDIR /app + +ENV TZ=Asia/Shanghai + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates tzdata wget \ + && mkdir -p /app/config /app/data/storage /app/data/lancedb \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=server-builder-lancedb /out/agent-desk /app/agent-desk +COPY config/config.example.yaml /app/config/config.example.yaml +COPY config/config.example.yaml /app/config/config.yaml + +EXPOSE 8083 +VOLUME ["/app/data"] + +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ + CMD wget -qO- http://127.0.0.1:8083/ >/dev/null || exit 1 + +CMD ["/app/agent-desk", "-config", "/app/config/config.yaml"] + FROM alpine:3.22 AS app WORKDIR /app diff --git a/Makefile b/Makefile index d95d177..c8cb8fc 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,14 @@ SPA_INDEX := $(WEB_DIR)/out/index.html GO ?= go PNPM ?= pnpm +DOCKER ?= docker GOOS ?= $(shell $(GO) env GOOS) GOARCH ?= $(shell $(GO) env GOARCH) DEV_SERVER_URL ?= http://127.0.0.1:8083 LANCEDB_VERSION ?= v0.1.2 LANCEDB_DOWNLOAD_SCRIPT ?= https://raw.githubusercontent.com/lancedb/lancedb-go/main/scripts/download-artifacts.sh LANCEDB_TEST_PKGS ?= ./internal/ai/rag/vectordb +LANCEDB_DOCKER_IMAGE ?= mlogclub/agent-desk:lancedb UNAME_S := $(shell uname -s) UNAME_M := $(shell uname -m) @@ -60,7 +62,7 @@ LANCEDB_CGO_LDFLAGS := $(LANCEDB_NATIVE_LIB) $(LANCEDB_SYSTEM_LDFLAGS) .PHONY: all help build build-go build-linux release run run-go dev test check clean clean-web \ web-install web-dev web-build-spa ensure-spa build-spa web-build-ssr web-typecheck web-lint \ generator enums migration testdata lancedb-platform-info lancedb-artifacts lancedb-check \ - build-lancedb test-lancedb clean-lancedb-artifacts + build-lancedb test-lancedb clean-lancedb-artifacts docker-build-lancedb all: build @@ -89,6 +91,7 @@ help: @echo " make lancedb-artifacts Download LanceDB native libraries for this platform" @echo " make build-lancedb Build Go binary with LanceDB provider enabled" @echo " make test-lancedb Run LanceDB provider tests with native libraries" + @echo " make docker-build-lancedb Build Docker image with LanceDB provider enabled" build: web-build-spa @$(MAKE) build-go @@ -222,3 +225,10 @@ test-lancedb: lancedb-check clean-lancedb-artifacts: @rm -rf lib include + +docker-build-lancedb: + @$(DOCKER) build \ + --target app-lancedb \ + --build-arg LANCEDB_VERSION=$(LANCEDB_VERSION) \ + -t $(LANCEDB_DOCKER_IMAGE) \ + . diff --git a/docker-compose.lancedb.yml b/docker-compose.lancedb.yml new file mode 100644 index 0000000..61c96ca --- /dev/null +++ b/docker-compose.lancedb.yml @@ -0,0 +1,44 @@ +services: + mysql: + image: mysql:8.4 + restart: unless-stopped + environment: + MYSQL_DATABASE: cs_ai_agent + MYSQL_USER: cs_ai_agent + MYSQL_PASSWORD: cs_ai_agent_password + MYSQL_ROOT_PASSWORD: cs_ai_agent_root_password + TZ: Asia/Shanghai + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + volumes: + - mysql-data:/var/lib/mysql + healthcheck: + test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u\"$${MYSQL_USER}\" -p\"$${MYSQL_PASSWORD}\" --silent"] + interval: 10s + timeout: 5s + retries: 10 + + agent-desk: + build: + context: . + dockerfile: Dockerfile + target: app-lancedb + args: + LANCEDB_VERSION: v0.1.2 + image: mlogclub/agent-desk:lancedb + restart: unless-stopped + depends_on: + mysql: + condition: service_healthy + ports: + - "8083:8083" + volumes: + - agent-desk-data:/app/data + - ./docker/agent-desk-lancedb.yaml:/app/config/config.yaml:ro + environment: + TZ: Asia/Shanghai + +volumes: + mysql-data: + agent-desk-data: diff --git a/docker/agent-desk-lancedb.yaml b/docker/agent-desk-lancedb.yaml new file mode 100644 index 0000000..73c53c7 --- /dev/null +++ b/docker/agent-desk-lancedb.yaml @@ -0,0 +1,65 @@ +server: + port: 8083 + cors: + allowedOrigins: + - http://localhost:8083 + - http://127.0.0.1:8083 + +db: + type: mysql + dsn: cs_ai_agent:cs_ai_agent_password@tcp(mysql:3306)/cs_ai_agent?charset=utf8mb4&parseTime=True&loc=Local + +logger: + level: info + format: text + addSource: false + +auth: + tokenTTLHours: 24 + maxFailedAttempts: 5 + credentialLockMinute: 30 + +storage: + default: local + maxUploadSizeMB: 5 + local: + root: /app/data/storage + baseUrl: /storage + oss: + endpoint: "" + bucket: "" + accessKeyId: "" + accessKeySecret: "" + baseUrl: "" + private: false + signedUrlExpireSeconds: 600 + +vectorDB: + type: lancedb + qdrant: + host: qdrant + grpcPort: 6334 + apiKey: "" + useTls: false + lancedb: + path: /app/data/lancedb + +mcp: + enabled: true + servers: + system: + enabled: true + endpoint: http://127.0.0.1:8083/api/mcp + timeoutMs: 60000 + headers: {} + +wxWork: + enabled: false + +oidc: + enabled: false + +customerSession: + secret: change-me + ttlMinutes: 120 + refreshThresholdMinutes: 30