Merge branch 'main' of https://gitea.zkzdht.com/Ascend/htknow
Some checks failed
CI / Frontend (Vite) (push) Successful in 1m26s
CI / Docker Release Tar (push) Has been skipped
CI / Backend (Rust) (push) Failing after 9m7s

This commit is contained in:
Defeng 2026-07-24 16:21:40 +08:00
commit fefc5cf80a
3 changed files with 4333 additions and 4184 deletions

10
Dockerfile.rust-builder Normal file
View File

@ -0,0 +1,10 @@
# Pinned to Debian Bookworm so the compiled binary is compatible with the
# Debian Bookworm runtime image used by Dockerfile (GLIBC 2.36).
FROM rust:1-bookworm
ENV DEBIAN_FRONTEND=noninteractive
# lance-* generates protobuf bindings during compilation.
RUN apt-get update \
&& apt-get install -y --no-install-recommends protobuf-compiler libprotobuf-dev \
&& rm -rf /var/lib/apt/lists/*

158
build-docker.sh Normal file → Executable file
View File

@ -1,62 +1,114 @@
#!/bin/bash #!/usr/bin/env bash
# Build HTKnow on a server without installing Node.js or Rust on the host.
#
# Examples:
# ./build-docker.sh
# ./build-docker.sh --tag gwknow:v0.0.2
# ./build-docker.sh --skip-frontend --tag gwknow:v0.0.3
# IMAGE_TAG=v0.0.3 ./build-docker.sh
set -e set -Eeuo pipefail
# Parse command line arguments ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_MODE="release" cd "$ROOT_DIR"
PROFILING_FLAG=""
CUSTOM_IMAGE_TAG="${IMAGE_TAG:-}" NODE_IMAGE="${NODE_IMAGE:-docker.1ms.run/node:22}"
if [ "${1:-}" = "debug" ] || [ "${1:-}" = "--debug" ]; then RUST_BUILDER_IMAGE="${RUST_BUILDER_IMAGE:-htknow-rust-builder:bookworm}"
BUILD_MODE="debug" SKIP_FRONTEND=false
PROFILING_FLAG="--features profiling" REBUILD_BUILDER=false
IMAGE_TAG="${IMAGE_TAG:-}"
usage() {
cat <<'EOF'
Usage: ./build-docker.sh [options]
Options:
--tag IMAGE Target image tag, for example gwknow:v0.0.2.
--skip-frontend Do not rebuild frontend/dist (safe for Rust-only changes).
--rebuild-builder Rebuild the cached Rust + protoc builder image.
-h, --help Show this help.
Environment overrides:
IMAGE_TAG, NODE_IMAGE, RUST_BUILDER_IMAGE
If --tag and IMAGE_TAG are omitted, a new gwknow:YYYYmmdd-HHMMSS tag is used.
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--tag)
[[ $# -ge 2 ]] || { echo "--tag requires an image tag" >&2; exit 2; }
IMAGE_TAG="$2"
shift 2
;;
--skip-frontend|--backend-only)
SKIP_FRONTEND=true
shift
;;
--rebuild-builder)
REBUILD_BUILDER=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1" >&2
usage >&2
exit 2
;;
esac
done
command -v docker >/dev/null || { echo "docker is not installed or is not in PATH" >&2; exit 1; }
docker info >/dev/null 2>&1 || { echo "Docker daemon is unavailable" >&2; exit 1; }
if [[ -z "$IMAGE_TAG" ]]; then
IMAGE_TAG="gwknow:$(date +%Y%m%d-%H%M%S)"
elif [[ "$IMAGE_TAG" != *:* ]]; then
IMAGE_TAG="gwknow:${IMAGE_TAG}"
fi fi
# Build frontend HOST_UID="$(id -u)"
cd frontend HOST_GID="$(id -g)"
npm install mkdir -p .cargo-cache .npm-cache
npm run build
cd ..
if [ "$BUILD_MODE" = "debug" ]; then if [[ "$REBUILD_BUILDER" == true ]] || ! docker image inspect "$RUST_BUILDER_IMAGE" >/dev/null 2>&1; then
echo "Building htknow for debug with profiling..." echo "==> Building Rust builder image: $RUST_BUILDER_IMAGE"
cargo build ${PROFILING_FLAG} docker build -t "$RUST_BUILDER_IMAGE" -f Dockerfile.rust-builder .
if [ -n "$CUSTOM_IMAGE_TAG" ]; then fi
IMAGE_TAG="${CUSTOM_IMAGE_TAG}-debug"
else if [[ "$SKIP_FRONTEND" == false ]]; then
IMAGE_TAG="$(date +%Y%m%d%H%M)-debug" echo "==> Building frontend with $NODE_IMAGE"
fi docker run --rm \
DOCKERFILE="Dockerfile.debug" --user "${HOST_UID}:${HOST_GID}" \
echo "Using Dockerfile.debug with jemalloc profiling tools" -e HOME=/tmp \
-e npm_config_cache=/npm-cache \
-v "$ROOT_DIR":/app \
-v "$ROOT_DIR/.npm-cache":/npm-cache \
-w /app/frontend \
"$NODE_IMAGE" \
sh -c 'npm ci && npm run build'
else else
echo "Building htknow for release (profiling disabled)..." echo "==> Skipping frontend build (--skip-frontend)"
cargo build --release
if [ -n "$CUSTOM_IMAGE_TAG" ]; then
IMAGE_TAG="${CUSTOM_IMAGE_TAG}"
else
IMAGE_TAG="$(date +%Y%m%d%H%M)"
fi
DOCKERFILE="Dockerfile"
fi fi
# Build Docker image echo "==> Building Rust release binary with $RUST_BUILDER_IMAGE"
echo "Building Docker image with ${DOCKERFILE}..." docker run --rm \
docker build -f "${DOCKERFILE}" -t "htknow:${IMAGE_TAG}" -t htknow:latest . --user "${HOST_UID}:${HOST_GID}" \
-e HOME=/tmp \
-e CARGO_HOME=/cargo-cache \
-v "$ROOT_DIR":/app \
-v "$ROOT_DIR/.cargo-cache":/cargo-cache \
-w /app \
"$RUST_BUILDER_IMAGE" \
bash -c 'cargo build --locked --release'
echo "Build complete!" echo "==> Building runtime image: $IMAGE_TAG"
echo "" docker build -f Dockerfile -t "$IMAGE_TAG" .
echo "Image tag: htknow:${IMAGE_TAG}"
echo "Latest tag: htknow:latest" echo
echo "BUILT_IMAGE=htknow:${IMAGE_TAG}" echo "Build complete: $IMAGE_TAG"
echo "BUILT_LATEST_IMAGE=htknow:latest" echo "To deploy, update the compose image tag and recreate only the intended service."
echo "Build mode: ${BUILD_MODE}"
echo ""
echo "To run the container:"
echo " docker-compose up -d"
echo ""
echo "Or manually:"
echo " docker run -d -p 8080:8080 -v \$(pwd)/data:/app/data --name htknow htknow:${IMAGE_TAG}"
echo ""
echo "Usage:"
echo " ./build-docker.sh # Build in release mode (default)"
echo " ./build-docker.sh debug # Build in debug mode"
echo " IMAGE_TAG=v1.2.3 ./build-docker.sh # Use custom image tag"

File diff suppressed because it is too large Load Diff