sync: 鍚屾灞€鍩熺綉鏈€鏂颁唬鐮?(source master @ b69568e4)
This commit is contained in:
1 parent
4f7f07504a
commit
8bc8b0e082
1651 files changed
+278599
-11416
No files matched your search
@@ -7,6 +7,8 @@ IMAGE_TAG="${IMAGE_TAG:-deerflow-backend-offline:20260505}"
|
||||
CONTAINER_NAME="${CONTAINER_NAME:-deerflow-backend}"
|
||||
HOST_PORT="${HOST_PORT:-2026}"
|
||||
IMAGE_TAR="${IMAGE_TAR:-${SCRIPT_DIR}/deerflow-backend-offline-image-20260505.tar}"
|
||||
EXTENSIONS_CONFIG_TEMPLATE="${SCRIPT_DIR}/extensions_config.json"
|
||||
RUNTIME_EXTENSIONS_CONFIG="${SCRIPT_DIR}/data/config/extensions_config.json"
|
||||
# Default timezone for the container. The offline image is built from a base
|
||||
# layer that ships with UTC, which made scheduled tasks fire at the wrong wall
|
||||
# clock and made log timestamps confusing for ops. ``Asia/Shanghai`` keeps the
|
||||
@@ -36,7 +38,17 @@ require_env_key() {
|
||||
grep -Eq "^[[:space:]]*${key}=" "${SCRIPT_DIR}/.env" || die "required .env key not found: ${key}"
|
||||
}
|
||||
|
||||
require_cmd docker
|
||||
read_optional_env_value() {
|
||||
local key="$1"
|
||||
awk -v key="${key}" '
|
||||
$0 ~ "^[[:space:]]*" key "[[:space:]]*=" {
|
||||
value = $0
|
||||
sub("^[[:space:]]*" key "[[:space:]]*=[[:space:]]*", "", value)
|
||||
sub(/\r$/, "", value)
|
||||
}
|
||||
END { if (value != "") print value }
|
||||
' "${SCRIPT_DIR}/.env"
|
||||
}
|
||||
|
||||
if [ ! -f "${SCRIPT_DIR}/.env" ]; then
|
||||
if [ -f "${SCRIPT_DIR}/.env.example" ]; then
|
||||
@@ -60,7 +72,7 @@ require_env_key "AUTH_JWT_SECRET"
|
||||
require_env_key "SCHEDULED_TASKS_ENABLED"
|
||||
require_env_key "ELEMENT_ENABLED"
|
||||
require_file "${SCRIPT_DIR}/config.yaml"
|
||||
require_file "${SCRIPT_DIR}/extensions_config.json"
|
||||
require_file "${EXTENSIONS_CONFIG_TEMPLATE}"
|
||||
require_file "${SCRIPT_DIR}/backend/pyproject.toml"
|
||||
require_file "${SCRIPT_DIR}/backend/app/gateway/app.py"
|
||||
require_file "${SCRIPT_DIR}/backend/packages/harness/deerflow/runtime/scheduler/element.py"
|
||||
@@ -68,7 +80,41 @@ require_dir "${SCRIPT_DIR}/skills"
|
||||
require_dir "${SCRIPT_DIR}/wheelhouse"
|
||||
# Knowledge base directory, mounted into the container at /mnt/knowledge_base.
|
||||
require_dir "${SCRIPT_DIR}/backend/knowledge/knowledge_base"
|
||||
mkdir -p "${SCRIPT_DIR}/data"
|
||||
|
||||
# The Gateway's live RunManager and MemoryStreamBridge are process-local. A
|
||||
# reconnect through Location/Last-Event-ID is a new HTTP request and uvicorn may
|
||||
# dispatch it to a different worker, which has neither the live run nor its
|
||||
# buffered events. Keep this launcher single-process until a shared stream
|
||||
# bridge and live-run registry are implemented.
|
||||
env_gateway_workers="$(read_optional_env_value GATEWAY_WORKERS)"
|
||||
GATEWAY_WORKERS="${GATEWAY_WORKERS:-${env_gateway_workers:-1}}"
|
||||
case "${GATEWAY_WORKERS}" in
|
||||
''|*[!0-9]*) die "GATEWAY_WORKERS must be a positive integer (got: ${GATEWAY_WORKERS})" ;;
|
||||
esac
|
||||
[ "${GATEWAY_WORKERS}" -ge 1 ] || die "GATEWAY_WORKERS must be at least 1"
|
||||
|
||||
env_allow_unsafe_multiworker="$(read_optional_env_value DEERFLOW_ALLOW_UNSAFE_MULTIWORKER)"
|
||||
ALLOW_UNSAFE_MULTIWORKER="${DEERFLOW_ALLOW_UNSAFE_MULTIWORKER:-${env_allow_unsafe_multiworker:-0}}"
|
||||
if [ "${GATEWAY_WORKERS}" -gt 1 ]; then
|
||||
if [ "${ALLOW_UNSAFE_MULTIWORKER}" != "1" ]; then
|
||||
die "GATEWAY_WORKERS=${GATEWAY_WORKERS} is unsafe with the process-local MemoryStreamBridge/RunManager: SSE Location/join reconnects can land on another worker and lose the live stream. Use GATEWAY_WORKERS=1. Set DEERFLOW_ALLOW_UNSAFE_MULTIWORKER=1 only to acknowledge and accept this failure mode."
|
||||
fi
|
||||
echo "WARNING: UNSAFE multi-worker Gateway override enabled (GATEWAY_WORKERS=${GATEWAY_WORKERS})." >&2
|
||||
echo "WARNING: SSE Location/join reconnects can lose live streams across workers." >&2
|
||||
else
|
||||
echo "Gateway workers: 1 (required by process-local live run/stream state)"
|
||||
fi
|
||||
|
||||
require_cmd docker
|
||||
|
||||
mkdir -p "$(dirname "${RUNTIME_EXTENSIONS_CONFIG}")"
|
||||
if [ -e "${RUNTIME_EXTENSIONS_CONFIG}" ] && [ ! -f "${RUNTIME_EXTENSIONS_CONFIG}" ]; then
|
||||
die "runtime extensions config is not a regular file: ${RUNTIME_EXTENSIONS_CONFIG}"
|
||||
fi
|
||||
if [ ! -e "${RUNTIME_EXTENSIONS_CONFIG}" ]; then
|
||||
cp -a "${EXTENSIONS_CONFIG_TEMPLATE}" "${RUNTIME_EXTENSIONS_CONFIG}"
|
||||
echo "Initialized writable extensions config at ${RUNTIME_EXTENSIONS_CONFIG}"
|
||||
fi
|
||||
|
||||
if ! docker image inspect "${IMAGE_TAG}" >/dev/null 2>&1; then
|
||||
require_file "${IMAGE_TAR}"
|
||||
@@ -87,11 +133,12 @@ docker run -d \
|
||||
--restart unless-stopped \
|
||||
-p "${HOST_PORT}:8001" \
|
||||
--env-file "${SCRIPT_DIR}/.env" \
|
||||
-e GATEWAY_WORKERS="${GATEWAY_WORKERS}" \
|
||||
-e TZ="${CONTAINER_TZ}" \
|
||||
-e DEER_FLOW_PROJECT_ROOT=/app \
|
||||
-e DEER_FLOW_HOME=/app/backend/.deer-flow \
|
||||
-e DEER_FLOW_CONFIG_PATH=/app/config.yaml \
|
||||
-e DEER_FLOW_EXTENSIONS_CONFIG_PATH=/app/extensions_config.json \
|
||||
-e DEER_FLOW_EXTENSIONS_CONFIG_PATH=/app/backend/.deer-flow/config/extensions_config.json \
|
||||
-e DEER_FLOW_SKILLS_PATH=/app/skills \
|
||||
-e UV_LINK_MODE=copy \
|
||||
-v "${SCRIPT_DIR}/backend/app:/app/backend/app" \
|
||||
@@ -102,11 +149,10 @@ docker run -d \
|
||||
-v "${SCRIPT_DIR}/backend/langgraph.json:/app/backend/langgraph.json:ro" \
|
||||
-v "${SCRIPT_DIR}/config.yaml:/app/config.yaml:ro" \
|
||||
-v "${SCRIPT_DIR}/skill_evolution.json:/app/skill_evolution.json:rw" \
|
||||
-v "${SCRIPT_DIR}/extensions_config.json:/app/extensions_config.json:rw" \
|
||||
-v "${SCRIPT_DIR}/skills:/app/skills:rw" \
|
||||
-v "${SCRIPT_DIR}/wheelhouse:/app/wheelhouse:ro" \
|
||||
-v "${SCRIPT_DIR}/backend/knowledge/knowledge_base:/mnt/knowledge_base:ro" \
|
||||
-v "${SCRIPT_DIR}/data:/app/backend/.deer-flow" \
|
||||
-v "${SCRIPT_DIR}/data:/app/backend/.deer-flow:rw" \
|
||||
"${IMAGE_TAG}" \
|
||||
sh -c 'cd backend
|
||||
# Apply timezone inside the container. ``TZ`` alone is enough for Python /
|
||||
@@ -134,7 +180,7 @@ if [ "${PG_CHECKPOINTER_INSTALL_DEPS:-1}" != "0" ]; then
|
||||
uv pip install --python "${PYTHON_BIN}" --no-deps --no-index --find-links /app/wheelhouse ${PG_CHECKPOINTER_PIP_PACKAGES:-langgraph-checkpoint-postgres==3.0.5 psycopg==3.3.3 psycopg-binary==3.3.3 psycopg-pool==3.3.0 orjson==3.11.9 tzdata==2026.2}
|
||||
}
|
||||
fi
|
||||
PYTHONPATH=. uv run --no-sync python -m uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --workers ${GATEWAY_WORKERS:-8}'
|
||||
PYTHONPATH=. uv run --no-sync python -m uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --workers "${GATEWAY_WORKERS:-1}"'
|
||||
|
||||
echo
|
||||
echo "Backend started."
|
||||
|
||||
Reference in new issue
Block a user