many fixes

This commit is contained in:
2026-05-23 18:18:58 +08:00
parent 282085c384
commit f63125e945
19 changed files with 858 additions and 41 deletions
+88 -2
View File
@@ -20,6 +20,9 @@ ENV_KEYS=(
DUCK_API_PID_FILE
DUCK_API_LOG_FILE
DUCK_API_COMMAND
DUCK_QDRANT_MANAGED
DUCK_QDRANT_COMPOSE_FILE
DUCK_QDRANT_SERVICE
)
declare -A ENV_OVERRIDES=()
for key in "${ENV_KEYS[@]}"; do
@@ -43,14 +46,17 @@ API_PID_FILE="${DUCK_API_PID_FILE:-${ROOT_DIR}/data/duck-api.pid}"
API_LOG_FILE="${DUCK_API_LOG_FILE:-${ROOT_DIR}/data/duck-api.log}"
API_URL="http://${DUCK_API_HOST:-127.0.0.1}:${DUCK_API_PORT:-8000}"
LLAMA_SCRIPT="${ROOT_DIR}/scripts/llama/start_mtp_main.sh"
QDRANT_MANAGED="${DUCK_QDRANT_MANAGED:-1}"
QDRANT_COMPOSE_FILE="${DUCK_QDRANT_COMPOSE_FILE:-${ROOT_DIR}/docker-compose.memory.yml}"
QDRANT_SERVICE="${DUCK_QDRANT_SERVICE:-qdrant}"
usage() {
cat <<'EOF'
Usage: scripts/duck-mtp.sh <command>
Commands:
start Start MTP llama-server and DuckLM API in the background
stop Stop DuckLM API and managed MTP llama-server
start Start Qdrant, MTP llama-server, and DuckLM API in the background
stop Stop DuckLM API, managed MTP llama-server, and Qdrant
restart Stop and start the whole local DuckLM stack
status Print process and HTTP health status
Use "status --probe" to include live model/vector checks
@@ -63,11 +69,77 @@ Environment:
DUCK_API_PID_FILE API PID file path
DUCK_API_LOG_FILE API log file path
DUCK_API_COMMAND API command override, default ".venv/bin/python -m duck_core.api"
DUCK_QDRANT_MANAGED Set to 0 to skip Docker Compose Qdrant lifecycle
DUCK_QDRANT_COMPOSE_FILE
Compose file path, default docker-compose.memory.yml
DUCK_QDRANT_SERVICE Compose service name, default qdrant
MTP llama-server environment is handled by scripts/llama/start_mtp_main.sh.
EOF
}
qdrant_enabled() {
[[ "${QDRANT_MANAGED}" != "0" && "${QDRANT_MANAGED,,}" != "false" && "${QDRANT_MANAGED,,}" != "no" ]]
}
docker_compose() {
docker compose -f "${QDRANT_COMPOSE_FILE}" "$@"
}
start_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant management: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Docker not found; cannot start Qdrant" >&2
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant compose file not found: ${QDRANT_COMPOSE_FILE}" >&2
return 1
fi
echo "Starting Qdrant..."
docker_compose up -d "${QDRANT_SERVICE}"
}
stop_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant management: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Docker not found; cannot stop Qdrant" >&2
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant compose file not found: ${QDRANT_COMPOSE_FILE}" >&2
return 1
fi
echo "Stopping Qdrant..."
docker_compose down
}
status_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant status: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Qdrant status: Docker not found"
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant status: compose file not found (${QDRANT_COMPOSE_FILE})"
return 1
fi
echo "Qdrant status:"
docker_compose ps "${QDRANT_SERVICE}"
}
api_is_running() {
[[ -f "${API_PID_FILE}" ]] || return 1
local pid
@@ -157,6 +229,7 @@ stop_api() {
}
start_stack() {
start_qdrant
"${LLAMA_SCRIPT}" start
start_api
echo
@@ -167,6 +240,7 @@ start_stack() {
stop_stack() {
stop_api
"${LLAMA_SCRIPT}" stop
stop_qdrant
}
status_stack() {
@@ -210,6 +284,11 @@ status_stack() {
if [[ "${llama_rc}" != "0" && "${rc}" == "0" ]]; then
rc="${llama_rc}"
fi
local qdrant_rc=0
status_qdrant || qdrant_rc=$?
if [[ "${qdrant_rc}" != "0" && "${rc}" == "0" ]]; then
rc="${qdrant_rc}"
fi
return "${rc}"
}
@@ -296,6 +375,13 @@ logs_stack() {
echo
echo "==> llama-server log: ${DUCK_LLAMA_LOG_FILE:-${ROOT_DIR}/data/llama-mtp.log} <=="
"${LLAMA_SCRIPT}" logs --lines "${lines}"
echo
echo "==> Qdrant log <=="
if qdrant_enabled && command -v docker >/dev/null 2>&1 && [[ -f "${QDRANT_COMPOSE_FILE}" ]]; then
docker_compose logs --tail "${lines}" "${QDRANT_SERVICE}"
else
status_qdrant || true
fi
fi
}
+88 -2
View File
@@ -20,6 +20,9 @@ ENV_KEYS=(
DUCK_API_PID_FILE
DUCK_API_LOG_FILE
DUCK_API_COMMAND
DUCK_QDRANT_MANAGED
DUCK_QDRANT_COMPOSE_FILE
DUCK_QDRANT_SERVICE
)
declare -A ENV_OVERRIDES=()
for key in "${ENV_KEYS[@]}"; do
@@ -43,14 +46,17 @@ API_PID_FILE="${DUCK_API_PID_FILE:-${ROOT_DIR}/data/duck-api.pid}"
API_LOG_FILE="${DUCK_API_LOG_FILE:-${ROOT_DIR}/data/duck-api.log}"
API_URL="http://${DUCK_API_HOST:-127.0.0.1}:${DUCK_API_PORT:-8000}"
LLAMA_SCRIPT="${ROOT_DIR}/scripts/llama/start_main.sh"
QDRANT_MANAGED="${DUCK_QDRANT_MANAGED:-1}"
QDRANT_COMPOSE_FILE="${DUCK_QDRANT_COMPOSE_FILE:-${ROOT_DIR}/docker-compose.memory.yml}"
QDRANT_SERVICE="${DUCK_QDRANT_SERVICE:-qdrant}"
usage() {
cat <<'EOF'
Usage: scripts/duck.sh <command>
Commands:
start Start llama-server and DuckLM API in the background
stop Stop DuckLM API and managed llama-server
start Start Qdrant, llama-server, and DuckLM API in the background
stop Stop DuckLM API, managed llama-server, and Qdrant
restart Stop and start the whole local DuckLM stack
status Print process and HTTP health status
Use "status --probe" to include live model/vector checks
@@ -63,11 +69,77 @@ Environment:
DUCK_API_PID_FILE API PID file path
DUCK_API_LOG_FILE API log file path
DUCK_API_COMMAND API command override, default ".venv/bin/python -m duck_core.api"
DUCK_QDRANT_MANAGED Set to 0 to skip Docker Compose Qdrant lifecycle
DUCK_QDRANT_COMPOSE_FILE
Compose file path, default docker-compose.memory.yml
DUCK_QDRANT_SERVICE Compose service name, default qdrant
llama-server environment is handled by scripts/llama/start_main.sh.
EOF
}
qdrant_enabled() {
[[ "${QDRANT_MANAGED}" != "0" && "${QDRANT_MANAGED,,}" != "false" && "${QDRANT_MANAGED,,}" != "no" ]]
}
docker_compose() {
docker compose -f "${QDRANT_COMPOSE_FILE}" "$@"
}
start_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant management: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Docker not found; cannot start Qdrant" >&2
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant compose file not found: ${QDRANT_COMPOSE_FILE}" >&2
return 1
fi
echo "Starting Qdrant..."
docker_compose up -d "${QDRANT_SERVICE}"
}
stop_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant management: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Docker not found; cannot stop Qdrant" >&2
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant compose file not found: ${QDRANT_COMPOSE_FILE}" >&2
return 1
fi
echo "Stopping Qdrant..."
docker_compose down
}
status_qdrant() {
if ! qdrant_enabled; then
echo "Qdrant status: disabled"
return 0
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Qdrant status: Docker not found"
return 1
fi
if [[ ! -f "${QDRANT_COMPOSE_FILE}" ]]; then
echo "Qdrant status: compose file not found (${QDRANT_COMPOSE_FILE})"
return 1
fi
echo "Qdrant status:"
docker_compose ps "${QDRANT_SERVICE}"
}
api_is_running() {
[[ -f "${API_PID_FILE}" ]] || return 1
local pid
@@ -157,6 +229,7 @@ stop_api() {
}
start_stack() {
start_qdrant
"${LLAMA_SCRIPT}" start
start_api
echo
@@ -167,6 +240,7 @@ start_stack() {
stop_stack() {
stop_api
"${LLAMA_SCRIPT}" stop
stop_qdrant
}
status_stack() {
@@ -210,6 +284,11 @@ status_stack() {
if [[ "${llama_rc}" != "0" && "${rc}" == "0" ]]; then
rc="${llama_rc}"
fi
local qdrant_rc=0
status_qdrant || qdrant_rc=$?
if [[ "${qdrant_rc}" != "0" && "${rc}" == "0" ]]; then
rc="${qdrant_rc}"
fi
return "${rc}"
}
@@ -296,6 +375,13 @@ logs_stack() {
echo
echo "==> llama-server log: ${DUCK_LLAMA_LOG_FILE:-${ROOT_DIR}/data/llama-main.log} <=="
"${LLAMA_SCRIPT}" logs --lines "${lines}"
echo
echo "==> Qdrant log <=="
if qdrant_enabled && command -v docker >/dev/null 2>&1 && [[ -f "${QDRANT_COMPOSE_FILE}" ]]; then
docker_compose logs --tail "${lines}" "${QDRANT_SERVICE}"
else
status_qdrant || true
fi
fi
}