| #!/usr/bin/env bash |
| set -e |
|
|
| |
| GREEN='\033[0;32m' |
| BLUE='\033[0;34m' |
| YELLOW='\033[1;33m' |
| NC='\033[0m' |
|
|
| |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" |
| DOCKER_DIR="$PROJECT_ROOT/docker" |
|
|
| |
| COMPOSE_CMD="docker compose -p deer-flow-dev -f docker-compose-dev.yaml" |
|
|
| detect_sandbox_mode() { |
| local config_file="$PROJECT_ROOT/config.yaml" |
| local sandbox_use="" |
| local provisioner_url="" |
|
|
| if [ ! -f "$config_file" ]; then |
| echo "local" |
| return |
| fi |
|
|
| sandbox_use=$(awk ' |
| /^[[:space:]]*sandbox:[[:space:]]*$/ { in_sandbox=1; next } |
| in_sandbox && /^[^[:space:]#]/ { in_sandbox=0 } |
| in_sandbox && /^[[:space:]]*use:[[:space:]]*/ { |
| line=$0 |
| sub(/^[[:space:]]*use:[[:space:]]*/, "", line) |
| print line |
| exit |
| } |
| ' "$config_file") |
|
|
| provisioner_url=$(awk ' |
| /^[[:space:]]*sandbox:[[:space:]]*$/ { in_sandbox=1; next } |
| in_sandbox && /^[^[:space:]#]/ { in_sandbox=0 } |
| in_sandbox && /^[[:space:]]*provisioner_url:[[:space:]]*/ { |
| line=$0 |
| sub(/^[[:space:]]*provisioner_url:[[:space:]]*/, "", line) |
| print line |
| exit |
| } |
| ' "$config_file") |
|
|
| if [[ "$sandbox_use" == *"src.sandbox.local:LocalSandboxProvider"* ]]; then |
| echo "local" |
| elif [[ "$sandbox_use" == *"src.community.aio_sandbox:AioSandboxProvider"* ]]; then |
| if [ -n "$provisioner_url" ]; then |
| echo "provisioner" |
| else |
| echo "aio" |
| fi |
| else |
| echo "local" |
| fi |
| } |
|
|
| |
| cleanup() { |
| echo "" |
| echo -e "${YELLOW}Operation interrupted by user${NC}" |
| exit 130 |
| } |
|
|
| |
| trap cleanup INT TERM |
|
|
| |
| init() { |
| echo "==========================================" |
| echo " DeerFlow Init β Pull Sandbox Image" |
| echo "==========================================" |
| echo "" |
|
|
| SANDBOX_IMAGE="enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest" |
|
|
| if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${SANDBOX_IMAGE}$"; then |
| echo -e "${BLUE}Pulling sandbox image: $SANDBOX_IMAGE ...${NC}" |
| docker pull "$SANDBOX_IMAGE" |
| else |
| echo -e "${GREEN}Sandbox image already exists locally: $SANDBOX_IMAGE${NC}" |
| fi |
|
|
| echo "" |
| echo -e "${GREEN}β Sandbox image is ready.${NC}" |
| echo "" |
| echo -e "${YELLOW}Next step: make docker-start${NC}" |
| } |
|
|
| |
| start() { |
| local sandbox_mode |
| local services |
|
|
| echo "==========================================" |
| echo " Starting DeerFlow Docker Development" |
| echo "==========================================" |
| echo "" |
|
|
| sandbox_mode="$(detect_sandbox_mode)" |
|
|
| if [ "$sandbox_mode" = "provisioner" ]; then |
| services="frontend gateway langgraph provisioner nginx" |
| else |
| services="frontend gateway langgraph nginx" |
| fi |
|
|
| echo -e "${BLUE}Detected sandbox mode: $sandbox_mode${NC}" |
| if [ "$sandbox_mode" = "provisioner" ]; then |
| echo -e "${BLUE}Provisioner enabled (Kubernetes mode).${NC}" |
| else |
| echo -e "${BLUE}Provisioner disabled (not required for this sandbox mode).${NC}" |
| fi |
| echo "" |
| |
| |
| if [ -z "$DEER_FLOW_ROOT" ]; then |
| export DEER_FLOW_ROOT="$PROJECT_ROOT" |
| echo -e "${BLUE}Setting DEER_FLOW_ROOT=$DEER_FLOW_ROOT${NC}" |
| echo "" |
| fi |
| |
| echo "Building and starting containers..." |
| cd "$DOCKER_DIR" && $COMPOSE_CMD up --build -d --remove-orphans $services |
| echo "" |
| echo "==========================================" |
| echo " DeerFlow Docker is starting!" |
| echo "==========================================" |
| echo "" |
| echo " π Application: http://localhost:2026" |
| echo " π‘ API Gateway: http://localhost:2026/api/*" |
| echo " π€ LangGraph: http://localhost:2026/api/langgraph/*" |
| echo "" |
| echo " π View logs: make docker-logs" |
| echo " π Stop: make docker-stop" |
| echo "" |
| } |
|
|
| |
| logs() { |
| local service="" |
| |
| case "$1" in |
| --frontend) |
| service="frontend" |
| echo -e "${BLUE}Viewing frontend logs...${NC}" |
| ;; |
| --gateway) |
| service="gateway" |
| echo -e "${BLUE}Viewing gateway logs...${NC}" |
| ;; |
| --nginx) |
| service="nginx" |
| echo -e "${BLUE}Viewing nginx logs...${NC}" |
| ;; |
| --provisioner) |
| service="provisioner" |
| echo -e "${BLUE}Viewing provisioner logs...${NC}" |
| ;; |
| "") |
| echo -e "${BLUE}Viewing all logs...${NC}" |
| ;; |
| *) |
| echo -e "${YELLOW}Unknown option: $1${NC}" |
| echo "Usage: $0 logs [--frontend|--gateway|--nginx|--provisioner]" |
| exit 1 |
| ;; |
| esac |
| |
| cd "$DOCKER_DIR" && $COMPOSE_CMD logs -f $service |
| } |
|
|
| |
| stop() { |
| echo "Stopping Docker development services..." |
| cd "$DOCKER_DIR" && $COMPOSE_CMD down |
| echo -e "${GREEN}β Docker services stopped${NC}" |
| } |
|
|
| |
| restart() { |
| echo "========================================" |
| echo " Restarting DeerFlow Docker Services" |
| echo "========================================" |
| echo "" |
| echo -e "${BLUE}Restarting containers...${NC}" |
| cd "$DOCKER_DIR" && $COMPOSE_CMD restart |
| echo "" |
| echo -e "${GREEN}β Docker services restarted${NC}" |
| echo "" |
| echo " π Application: http://localhost:2026" |
| echo " π View logs: make docker-dev-logs" |
| echo "" |
| } |
|
|
| |
| help() { |
| echo "DeerFlow Docker Management Script" |
| echo "" |
| echo "Usage: $0 <command> [options]" |
| echo "" |
| echo "Commands:" |
| echo " init - Pull the sandbox image (speeds up first Pod startup)" |
| echo " start - Start Docker services (auto-detects sandbox mode from config.yaml)" |
| echo " restart - Restart all running Docker services" |
| echo " logs [option] - View Docker development logs" |
| echo " --frontend View frontend logs only" |
| echo " --gateway View gateway logs only" |
| echo " --nginx View nginx logs only" |
| echo " --provisioner View provisioner logs only" |
| echo " stop - Stop Docker development services" |
| echo " help - Show this help message" |
| echo "" |
| } |
|
|
| main() { |
| |
| case "$1" in |
| init) |
| init |
| ;; |
| start) |
| start |
| ;; |
| restart) |
| restart |
| ;; |
| logs) |
| logs "$2" |
| ;; |
| stop) |
| stop |
| ;; |
| help|--help|-h|"") |
| help |
| ;; |
| *) |
| echo -e "${YELLOW}Unknown command: $1${NC}" |
| echo "" |
| help |
| exit 1 |
| ;; |
| esac |
| } |
|
|
| if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then |
| main "$@" |
| fi |
|
|