diff --git a/Makefile b/Makefile index cbb93dac4..b48fde9b9 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ KB_DEPLOY_NAME := coze-loop KB_CHART_PATH :=./release/deployment/helm-chart/charts KB_UMBRELLA_PATH :=./release/deployment/helm-chart/umbrella +DOCKER_COMPOSE_DIR := ./release/deployment/docker-compose #demo-mini: # kubectl -n ingress-nginx patch svc ingress-nginx-controller -p '{"spec":{"type":"LoadBalancer"}}' service/ingress-nginx-controller patched \ # kubectl -n ingress-nginx get svc ingress-nginx-controller -w # 夯住 @@ -89,6 +90,116 @@ kb-up-%: kb-clean: helm list -n $(KB_NAMESPACE) -q | xargs -r -n1 helm uninstall -n $(KB_NAMESPACE) +compose%: + @case "$*" in \ + -up) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + up ;; \ + -down) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down ;; \ + -down-v) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down -v ;; \ + -up-dev) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + up --build ;; \ + -down-dev) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down ;; \ + -down-v-dev) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down -v ;; \ + -up-debug) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + up --build ;; \ + -down-debug) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down ;; \ + -down-v-debug) \ + docker compose \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \ + -f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \ + --env-file $(DOCKER_COMPOSE_DIR)/.env \ + --profile "*" \ + down -v ;; \ + -help|*) \ + echo "Usage:"; \ + echo " make compose-up # up base"; \ + echo " make compose-down # down base"; \ + echo " make compose-down-v # down base + volumes"; \ + echo " make compose-up-dev # up base + dev (build)"; \ + echo " make compose-down-dev # down base + dev"; \ + echo " make compose-down-v-dev # down base + dev + volumes"; \ + echo " make compose-up-debug # up base + debug (build)"; \ + echo " make compose-down-debug # down base + debug"; \ + echo " make compose-down-v-debug # down base + debug + volumes"; \ + echo; \ + echo "Notes:"; \ + echo " - '--profile \"*\"' is only meaningful for 'up'; it's not required for 'down'."; \ + echo " - When you used multiple -f files for 'up', run 'down' with the same -f set."; \ + exit 1 ;; \ + esac + +debug: + docker compose \ + -f ./release/deployment/docker-compose/docker-compose.yml \ + -f ./release/deployment/docker-compose/debug/docker-compose.yml \ + --env-file ./release/deployment/docker-compose/.env \ + --profile "*" \ + up --build + +debug-app: + docker compose \ + -f ./release/deployment/docker-compose/docker-compose.yml \ + -f ./release/deployment/docker-compose/debug/remote/docker-compose.yml \ + --env-file ./release/deployment/docker-compose/.env \ + --profile "app" \ + up + +debug-compose: + docker compose \ + -f ./release/deployment/docker-compose/docker-compose.yml \ + -f ./release/deployment/docker-compose/debug/remote/docker-compose.yml \ + --profile "*" \ + config + +debug-down-v: + docker compose \ + -f ./release/deployment/docker-compose/docker-compose.yml \ + -f ./release/deployment/docker-compose/debug/docker-compose.yml \ + --profile "*" \ + down -v + up: docker compose -f ./release/deployment/docker-compose/docker-compose.yml --env-file ./release/deployment/docker-compose/.env --profile "*" up @@ -162,79 +273,3 @@ clean-all: @echo "Pruning builder and system..." @docker builder prune -a -f @docker system prune -a --volumes -f - -build_server: - @echo "Building image..." - @bash $(BUILD_SERVER_SCRIPT) - -sync_db: - @echo "Syncing database..." - @docker compose -f $(COMPOSE_FILE) --env-file $(ENV_FILE) --profile mysql-setup up -d - -dump_db: dump_sql_schema - @echo "Dumping database..." - @bash $(DUMP_DB_SCRIPT) - -sql_init: - @echo "Init sql data..." - @docker compose -f $(COMPOSE_FILE) --env-file $(ENV_FILE) --profile mysql-setup up -d - -middleware: - @echo "Start middleware docker environment for opencoze app" - @docker compose -f $(COMPOSE_FILE) --env-file $(ENV_FILE) --profile middleware up -d --wait - - -web: - @echo "Start web server in docker" - @docker compose -f $(COMPOSE_FILE) --env-file $(ENV_FILE) --profile '*' up -d --wait - -#down: -# @echo "Stop all docker containers" -# @docker compose -f $(COMPOSE_FILE) --profile '*' down - -clean: down - @echo "Remove docker containers and volumes data" - @rm -rf ./docker/data - -python: - @echo "Setting up Python..." - @bash $(SETUP_PYTHON_SCRIPT) - -dump_sql_schema: - @echo "Dumping mysql schema to $(MYSQL_SCHEMA)..." - @. $(ENV_FILE); \ - { echo "SET NAMES utf8mb4;\nCREATE DATABASE IF NOT EXISTS opencoze COLLATE utf8mb4_unicode_ci;"; atlas schema inspect -u $$ATLAS_URL --format "{{ sql . }}" --exclude "atlas_schema_revisions,table_*" | sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g'; } > $(MYSQL_SCHEMA) - @sed -I '' -E 's/(\))[[:space:]]+CHARSET utf8mb4/\1 ENGINE=InnoDB CHARSET utf8mb4/' $(MYSQL_SCHEMA) - @echo "Dumping mysql schema to helm/charts/opencoze/files/mysql ..." - @cp $(MYSQL_SCHEMA) ./helm/charts/opencoze/files/mysql/ - @cp $(MYSQL_INIT_SQL) ./helm/charts/opencoze/files/mysql/ - -atlas-hash: - @echo "Rehash atlas migration files..." - @(cd ./docker/atlas && atlas migrate hash) - -setup_es_index: - @echo "Setting up Elasticsearch index..." - @bash $(ES_SETUP_SCRIPT) --index-dir $(ES_INDEX_SCHEMA) --docker-host false - -help: - @echo "Usage: make [target]" - @echo "" - @echo "Targets:" - @echo " debug - Start the debug environment." - @echo " env - Setup env file." - @echo " fe - Build the frontend." - @echo " server - Build and run the server binary." - @echo " build_server - Build the server binary." - @echo " sync_db - Sync opencoze_latest_schema.hcl to the database." - @echo " dump_db - Dump the database to opencoze_latest_schema.hcl and migrations files." - @echo " sql_init - Init sql data..." - @echo " dump_sql_schema - Dump the database schema to sql file." - @echo " middleware - Setup middlewares docker environment, but exclude the server app." - @echo " web - Setup web docker environment, include middlewares docker." - @echo " down - Stop the docker containers." - @echo " clean - Stop the docker containers and clean volumes." - @echo " python - Setup python environment." - @echo " atlas-hash - Rehash atlas migration files." - @echo " setup_es_index - Setup elasticsearch index." - @echo " help - Show this help message." diff --git a/release/deployment/docker-compose/.env b/release/deployment/docker-compose/.env index e63af422f..42a17ea2b 100644 --- a/release/deployment/docker-compose/.env +++ b/release/deployment/docker-compose/.env @@ -3,6 +3,7 @@ COZE_LOOP_APP_IMAGE_REGISTRY=compose-cn-beijing.cr.volces.com COZE_LOOP_APP_IMAGE_REPOSITORY=coze COZE_LOOP_APP_IMAGE_NAME=coze-loop COZE_LOOP_APP_IMAGE_TAG=latest +COZE_LOOP_APP_DEBUG_PORT=40000 # redis COZE_LOOP_REDIS_IMAGE_REGISTRY=docker.io diff --git a/release/deployment/docker-compose/docker-compose-debug.yml b/release/deployment/docker-compose/docker-compose-debug.yml new file mode 100644 index 000000000..5730fefca --- /dev/null +++ b/release/deployment/docker-compose/docker-compose-debug.yml @@ -0,0 +1,50 @@ +services: + app: + build: + context: ../../.. + dockerfile: ./release/image/debug.Dockerfile + image: "coze/coze-loop:debug" + ports: + - "${COZE_LOOP_APP_DEBUG_PORT}:40000" + entrypoint: + - sh + - -c + - | + exec 2>&1 + set -e + + print_banner() { + msg="$$1" + side=30 + content=" $$msg " + content_len=$${#content} + line_len=$$((side * 2 + content_len)) + + line=$$(printf '*%.0s' $$(seq 1 "$$line_len")) + side_eq=$$(printf '*%.0s' $$(seq 1 "$$side")) + + printf "%s\n%s%s%s\n%s\n" "$$line" "$$side_eq" "$$content" "$$side_eq" "$$line" + } + + print_banner "Starting..." + + export ROCKETMQ_GO_LOG_LEVEL=error + + ( + while true; do + if sh /coze-loop/bootstrap/healthcheck.sh; then + print_banner "Completed!" + break + else + sleep 1 + fi + done + )& + + exec dlv \ + exec /coze-loop/bin/main \ + --headless \ + --listen=:40000 \ + --api-version=2 \ + --accept-multiclient \ + --log \ No newline at end of file diff --git a/release/deployment/docker-compose/docker-compose-dev.yml b/release/deployment/docker-compose/docker-compose-dev.yml new file mode 100644 index 000000000..b096015e4 --- /dev/null +++ b/release/deployment/docker-compose/docker-compose-dev.yml @@ -0,0 +1,7 @@ +services: + + app: + build: + context: ../../.. + dockerfile: ./release/image/Dockerfile + image: "coze/coze-loop:dev" \ No newline at end of file diff --git a/release/deployment/docker-compose/docker-compose.yml b/release/deployment/docker-compose/docker-compose.yml index a70a543ed..535565b61 100644 --- a/release/deployment/docker-compose/docker-compose.yml +++ b/release/deployment/docker-compose/docker-compose.yml @@ -10,7 +10,7 @@ services: volumes: - nginx_data:/coze-loop/resources - ./bootstrap/app:/coze-loop/bootstrap - - ./bootstrap/app/model_config.yaml:/coze-loop/conf/model_config.yaml + - ./model_config.yaml:/coze-loop/conf/model_config.yaml depends_on: redis: condition: service_healthy diff --git a/release/deployment/docker-compose/bootstrap/app/model_config.yaml b/release/deployment/docker-compose/model_config.yaml similarity index 100% rename from release/deployment/docker-compose/bootstrap/app/model_config.yaml rename to release/deployment/docker-compose/model_config.yaml diff --git a/release/image/debug.Dockerfile b/release/image/debug.Dockerfile new file mode 100644 index 000000000..c37039e42 --- /dev/null +++ b/release/image/debug.Dockerfile @@ -0,0 +1,28 @@ +# golang极简镜像,编译拿到服务端产物 +FROM golang:1.24-alpine AS backend_builder + +# 1. 安装git(用于下载go mod依赖) +RUN apk add --no-cache git + +# 2. 安装dlv(用于调试) +RUN go install "github.com/go-delve/delve/cmd/dlv@v1.25.1" + +WORKDIR /coze-loop + +# 2. 下载并缓存go mod依赖 +COPY ./backend/go.mod ./backend/go.sum /coze-loop/src/backend/ +RUN go mod download -C ./src/backend -x + +# 3. 编译服务端 +COPY ./backend/ /coze-loop/src/backend/ +RUN mkdir -p ./bin && \ + go -C /coze-loop/src/backend build -gcflags="all=-N -l" -buildvcs=false -o /coze-loop/bin/main "./cmd" + +# 最终镜像(coze-loop),极简镜像 +FROM compose-cn-beijing.cr.volces.com/coze/coze-loop:latest + +WORKDIR /coze-loop + +# 抽产物 +COPY --from=backend_builder /coze-loop/bin/main /coze-loop/bin/main +COPY --from=backend_builder /go/bin/dlv /usr/local/bin/dlv \ No newline at end of file