From bc0d1e08767d50b52f436fd37ac7608694763a9a Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 19 Feb 2026 17:13:09 -0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20deploy.sh=20?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E7=AE=A1=E7=90=86=E8=84=9A=E6=9C=AC=E4=BD=93?= =?UTF-8?q?=E7=B3=BB=20=E2=80=94=20=E5=90=8E=E7=AB=AF=E4=B8=BB=E6=8E=A7+12?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=8B=AC=E7=AB=8B+=E5=8C=BA=E5=9D=97?= =?UTF-8?q?=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 参照 rwadurian 项目模式,为全栈系统创建统一的 deploy.sh 管理体系: - backend/deploy.sh: 主控脚本 (up/down/restart/build/build-no-cache/health/infra-*/单服务操作) - 12个服务独立 deploy.sh (build/rebuild/start/stop/restart/logs/health/shell/test) - blockchain/deploy.sh: 节点+生态+合约+浏览器+监控全覆盖 - 更新 09-编译部署指南.md 新增第9章 deploy.sh 使用文档 Co-Authored-By: Claude Opus 4.6 --- backend/deploy.sh | 711 ++++++++++++++++++ backend/services/admin-service/deploy.sh | 126 ++++ backend/services/ai-service/deploy.sh | 126 ++++ backend/services/auth-service/deploy.sh | 126 ++++ backend/services/chain-indexer/deploy.sh | 126 ++++ backend/services/clearing-service/deploy.sh | 126 ++++ backend/services/compliance-service/deploy.sh | 126 ++++ backend/services/issuer-service/deploy.sh | 126 ++++ .../services/notification-service/deploy.sh | 126 ++++ backend/services/telemetry-service/deploy.sh | 126 ++++ backend/services/trading-service/deploy.sh | 126 ++++ backend/services/translate-service/deploy.sh | 126 ++++ backend/services/user-service/deploy.sh | 126 ++++ blockchain/deploy.sh | 520 +++++++++++++ docs/guides/09-编译部署指南.md | 147 +++- 15 files changed, 2882 insertions(+), 8 deletions(-) create mode 100644 backend/deploy.sh create mode 100644 backend/services/admin-service/deploy.sh create mode 100644 backend/services/ai-service/deploy.sh create mode 100644 backend/services/auth-service/deploy.sh create mode 100644 backend/services/chain-indexer/deploy.sh create mode 100644 backend/services/clearing-service/deploy.sh create mode 100644 backend/services/compliance-service/deploy.sh create mode 100644 backend/services/issuer-service/deploy.sh create mode 100644 backend/services/notification-service/deploy.sh create mode 100644 backend/services/telemetry-service/deploy.sh create mode 100644 backend/services/trading-service/deploy.sh create mode 100644 backend/services/translate-service/deploy.sh create mode 100644 backend/services/user-service/deploy.sh create mode 100644 blockchain/deploy.sh diff --git a/backend/deploy.sh b/backend/deploy.sh new file mode 100644 index 0000000..a1612e4 --- /dev/null +++ b/backend/deploy.sh @@ -0,0 +1,711 @@ +#!/bin/bash +# +# Genex Backend Services - 部署管理脚本 +# ========================================= +# +# 用法: +# ./deploy.sh install # 首次初始化 (生成密钥、创建 .env) +# ./deploy.sh up # 启动全部服务 +# ./deploy.sh down # 停止全部服务 +# ./deploy.sh restart # 重启全部服务 +# ./deploy.sh build # 增量编译全部镜像 +# ./deploy.sh build-no-cache # 全新编译全部镜像 (无缓存) +# ./deploy.sh status # 查看服务状态 +# ./deploy.sh health # 健康检查 +# ./deploy.sh logs [svc] # 查看日志 (可指定服务) +# ./deploy.sh migrate # 运行数据库迁移 +# +# 基础设施: +# ./deploy.sh infra-up # 仅启动基础设施 (PG, Redis, Kafka, MinIO, Kong) +# ./deploy.sh infra-down # 停止基础设施 +# ./deploy.sh infra-restart # 重启基础设施 +# ./deploy.sh infra-status # 基础设施状态 +# ./deploy.sh infra-logs # 基础设施日志 +# ./deploy.sh infra-clean # 清理基础设施 (删除数据!) +# ./deploy.sh infra-reset # 重置基础设施 (clean + 重新启动) +# +# 单服务操作: +# ./deploy.sh start-svc # 启动指定服务 +# ./deploy.sh stop-svc # 停止指定服务 +# ./deploy.sh restart-svc # 重启指定服务 +# ./deploy.sh rebuild-svc # 增量编译并重启指定服务 +# ./deploy.sh rebuild-svc --no-cache # 全新编译并重启指定服务 +# ./deploy.sh logs-svc # 查看指定服务日志 +# + +set -e + +# =========================================================================== +# 配置 +# =========================================================================== +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="$SCRIPT_DIR/.env" +COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } +log_step() { echo -e "${CYAN}[STEP]${NC} $1"; } + +# 基础设施服务列表 +INFRA_SERVICES="postgres redis kafka minio minio-init kafka-connect kong" + +# 应用服务列表 (NestJS) +NESTJS_SERVICES="auth-service user-service issuer-service clearing-service compliance-service ai-service notification-service telemetry-service admin-service" + +# 应用服务列表 (Go) +GO_SERVICES="trading-service translate-service chain-indexer" + +# 全部应用服务 +APP_SERVICES="$NESTJS_SERVICES $GO_SERVICES" + +# =========================================================================== +# 工具函数 +# =========================================================================== + +generate_random_password() { + openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32 +} + +generate_hex_key() { + openssl rand -hex 32 +} + +check_docker() { + if ! command -v docker &> /dev/null; then + log_error "Docker 未安装,请先安装 Docker" + exit 1 + fi + if ! docker compose version &> /dev/null; then + log_error "Docker Compose 未安装,请先安装 Docker Compose" + exit 1 + fi + log_info "Docker: $(docker --version | head -1)" + log_info "Compose: $(docker compose version --short)" +} + +check_env() { + if [ ! -f "$ENV_FILE" ]; then + log_error "环境文件不存在。请先运行: ./deploy.sh install" + exit 1 + fi +} + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +# =========================================================================== +# install — 首次初始化 +# =========================================================================== + +install() { + log_step "初始化 Genex Backend Services..." + check_docker + + if [ ! -f "$ENV_FILE" ]; then + log_step "生成安全配置..." + + DB_PASSWORD=$(generate_random_password) + JWT_ACCESS=$(generate_random_password) + JWT_REFRESH=$(generate_random_password) + MINIO_SECRET=$(generate_random_password) + + cat > "$ENV_FILE" << EOF +# ============================================================================= +# Genex Backend - 生产环境配置 +# ============================================================================= +# 生成时间: $(date) +# 警告: 请妥善保管此文件!不要提交到版本控制! +# ============================================================================= + +# 数据库 +DB_HOST=postgres +DB_PORT=5432 +DB_USERNAME=genex +DB_PASSWORD=${DB_PASSWORD} +DB_NAME=genex + +# Redis +REDIS_HOST=redis +REDIS_PORT=6379 + +# Kafka +KAFKA_BROKERS=kafka:9092 + +# JWT +JWT_ACCESS_SECRET=${JWT_ACCESS} +JWT_ACCESS_EXPIRY=15m +JWT_REFRESH_SECRET=${JWT_REFRESH} +JWT_REFRESH_EXPIRY=7d + +# Kong +KONG_ADMIN_URL=http://kong:8001 +KONG_PROXY_PORT=8080 + +# MinIO +MINIO_ENDPOINT=minio +MINIO_PORT=9000 +MINIO_ACCESS_KEY=genex-admin +MINIO_SECRET_KEY=${MINIO_SECRET} + +# AI +AI_SERVICE_URL=http://ai-agent-cluster:3006 +AI_SERVICE_API_KEY=your-ai-service-api-key +AI_SERVICE_TIMEOUT=30000 + +# 区块链 +CHAIN_RPC_URL=http://localhost:26657 +EOF + + chmod 600 "$ENV_FILE" + log_success "环境文件已创建: $ENV_FILE" + log_success "密钥已自动生成" + else + log_info "环境文件已存在: $ENV_FILE" + fi + + log_success "初始化完成!" + echo "" + log_info "下一步:" + log_info " 1. 检查并编辑 .env" + log_info " 2. ./deploy.sh build" + log_info " 3. ./deploy.sh up" +} + +# =========================================================================== +# Docker Compose 全局操作 +# =========================================================================== + +up() { + check_env + log_step "启动 Genex Backend Services..." + + # 先启动基础设施 + log_info "启动基础设施..." + compose up -d postgres redis kafka minio + + log_info "等待基础设施就绪..." + sleep 8 + + # 启动 MinIO 初始化 + Kafka Connect + Kong + log_info "启动 MinIO 初始化 / Kafka Connect / Kong..." + compose up -d minio-init kafka-connect kong + + sleep 5 + + # 启动全部应用服务 + log_info "启动应用服务..." + compose up -d + + log_success "全部服务已启动!" + echo "" + log_info "查看状态: ./deploy.sh status" + log_info "查看日志: ./deploy.sh logs" +} + +down() { + log_step "停止 Genex Backend Services..." + compose down + log_success "全部服务已停止" +} + +restart() { + log_step "重启 Genex Backend Services..." + down + sleep 3 + up +} + +build() { + check_env + log_step "增量编译全部 Docker 镜像..." + compose build --parallel + log_success "全部镜像编译完成" +} + +build_no_cache() { + check_env + log_step "全新编译全部 Docker 镜像 (无缓存)..." + compose build --no-cache --parallel + log_success "全部镜像编译完成 (无缓存)" +} + +# =========================================================================== +# 状态与健康检查 +# =========================================================================== + +status() { + echo "" + echo "============================================" + echo " Genex Backend Services 状态" + echo "============================================" + echo "" + compose ps + echo "" + health +} + +health() { + echo "============================================" + echo " 健康检查" + echo "============================================" + echo "" + + # NestJS 服务 + local nestjs_checks=( + "auth-service:3010:/api/v1/health" + "user-service:3001:/api/v1/health" + "issuer-service:3002:/api/v1/health" + "clearing-service:3004:/api/v1/health" + "compliance-service:3005:/api/v1/health" + "ai-service:3006:/api/v1/health" + "notification-service:3008:/api/v1/health" + "telemetry-service:3011:/api/v1/health" + "admin-service:3012:/api/v1/health" + ) + + echo "NestJS 服务:" + for svc in "${nestjs_checks[@]}"; do + name="${svc%%:*}" + rest="${svc#*:}" + port="${rest%%:*}" + endpoint="${rest#*:}" + if curl -sf "http://localhost:${port}${endpoint}" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} $name (:$port)" + else + echo -e " ${RED}[FAIL]${NC} $name (:$port)" + fi + done + + echo "" + + # Go 服务 + local go_checks=( + "trading-service:3003:/health" + "translate-service:3007:/health" + "chain-indexer:3009:/health" + ) + + echo "Go 服务:" + for svc in "${go_checks[@]}"; do + name="${svc%%:*}" + rest="${svc#*:}" + port="${rest%%:*}" + endpoint="${rest#*:}" + if curl -sf "http://localhost:${port}${endpoint}" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} $name (:$port)" + else + echo -e " ${RED}[FAIL]${NC} $name (:$port)" + fi + done + + echo "" + echo "基础设施:" + + if docker exec genex-postgres pg_isready -U genex &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} PostgreSQL (:5432)" + else + echo -e " ${RED}[FAIL]${NC} PostgreSQL (:5432)" + fi + + if docker exec genex-redis redis-cli ping &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} Redis (:6379)" + else + echo -e " ${RED}[FAIL]${NC} Redis (:6379)" + fi + + if docker exec genex-kafka kafka-broker-api-versions --bootstrap-server localhost:9092 &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} Kafka (:9092)" + else + echo -e " ${RED}[FAIL]${NC} Kafka (:9092)" + fi + + if curl -sf "http://localhost:9000/minio/health/live" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} MinIO (:9000)" + else + echo -e " ${RED}[FAIL]${NC} MinIO (:9000)" + fi + + if curl -sf "http://localhost:8083/" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} Kafka Connect (:8083)" + else + echo -e " ${RED}[FAIL]${NC} Kafka Connect (:8083)" + fi + + local kong_status + kong_status=$(curl -so /dev/null -w "%{http_code}" "http://localhost:8080/" 2>/dev/null || echo "000") + if [ "$kong_status" != "000" ]; then + echo -e " ${GREEN}[OK]${NC} Kong Gateway (:8080)" + else + echo -e " ${RED}[FAIL]${NC} Kong Gateway (:8080)" + fi + + echo "" +} + +logs() { + local service="$1" + if [ -n "$service" ]; then + compose logs -f "$service" + else + compose logs -f + fi +} + +# =========================================================================== +# 数据库迁移 +# =========================================================================== + +migrate() { + log_step "运行数据库迁移..." + + if [ -d "$SCRIPT_DIR/migrations" ]; then + local DB_URL="${DATABASE_URL:-postgresql://genex:genex_dev_password@localhost:5432/genex}" + for f in "$SCRIPT_DIR"/migrations/*.sql; do + if [ -f "$f" ]; then + log_info "执行: $(basename "$f")" + psql "$DB_URL" -f "$f" 2>/dev/null || log_warn "跳过: $(basename "$f")" + fi + done + log_success "迁移完成" + else + log_warn "未找到 migrations 目录" + fi +} + +# =========================================================================== +# 基础设施操作 +# =========================================================================== + +infra_up() { + log_step "启动基础设施..." + compose up -d postgres redis kafka minio minio-init kafka-connect kong + log_success "基础设施已启动" +} + +infra_down() { + log_step "停止基础设施..." + compose stop postgres redis kafka minio kafka-connect kong + log_success "基础设施已停止" +} + +infra_restart() { + log_step "重启基础设施..." + infra_down + sleep 3 + infra_up +} + +infra_status() { + echo "" + echo "============================================" + echo " 基础设施状态" + echo "============================================" + echo "" + compose ps postgres redis kafka minio kafka-connect kong + echo "" + + echo "健康检查:" + if docker exec genex-postgres pg_isready -U genex &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} PostgreSQL (:5432)" + else + echo -e " ${RED}[FAIL]${NC} PostgreSQL (:5432)" + fi + + if docker exec genex-redis redis-cli ping &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} Redis (:6379)" + else + echo -e " ${RED}[FAIL]${NC} Redis (:6379)" + fi + + if docker exec genex-kafka kafka-broker-api-versions --bootstrap-server localhost:9092 &>/dev/null; then + echo -e " ${GREEN}[OK]${NC} Kafka (:9092)" + else + echo -e " ${RED}[FAIL]${NC} Kafka (:9092)" + fi + + if curl -sf "http://localhost:9000/minio/health/live" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} MinIO (:9000)" + else + echo -e " ${RED}[FAIL]${NC} MinIO (:9000)" + fi + + if curl -sf "http://localhost:8083/" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} Kafka Connect (:8083)" + else + echo -e " ${RED}[FAIL]${NC} Kafka Connect (:8083)" + fi + + local kong_status + kong_status=$(curl -so /dev/null -w "%{http_code}" "http://localhost:8080/" 2>/dev/null || echo "000") + if [ "$kong_status" != "000" ]; then + echo -e " ${GREEN}[OK]${NC} Kong Gateway (:8080)" + else + echo -e " ${RED}[FAIL]${NC} Kong Gateway (:8080)" + fi + echo "" +} + +infra_logs() { + compose logs -f postgres redis kafka minio kafka-connect kong +} + +infra_clean() { + log_warn "这将删除基础设施容器和所有数据 (PostgreSQL, Redis, Kafka, MinIO)!" + read -p "确认操作? (y/N): " confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + log_step "停止基础设施..." + compose stop postgres redis kafka minio kafka-connect kong + log_step "移除容器..." + compose rm -f postgres redis kafka minio kafka-connect kong + log_step "移除数据卷..." + docker volume rm -f backend_postgres_data backend_redis_data backend_kafka_data backend_minio_data 2>/dev/null || true + log_success "基础设施清理完成" + else + log_info "已取消" + fi +} + +infra_reset() { + log_warn "这将重置全部基础设施 (清理 + 重新启动)!" + log_warn "所有数据库将被删除并重建!" + read -p "确认操作? (y/N): " confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + compose stop postgres redis kafka minio kafka-connect kong + compose rm -f postgres redis kafka minio kafka-connect kong + docker volume rm -f backend_postgres_data backend_redis_data backend_kafka_data backend_minio_data 2>/dev/null || true + sleep 3 + infra_up + log_info "等待基础设施就绪..." + sleep 10 + log_success "基础设施重置完成!" + echo "" + log_info "下一步:" + log_info " 1. 重启应用服务: ./deploy.sh restart" + log_info " 2. 或全新编译: ./deploy.sh build && ./deploy.sh up" + else + log_info "已取消" + fi +} + +# =========================================================================== +# 单服务操作 +# =========================================================================== + +start_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名。可用: $APP_SERVICES" + exit 1 + fi + log_info "启动 $service..." + compose up -d "$service" + log_success "$service 已启动" +} + +stop_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名。可用: $APP_SERVICES" + exit 1 + fi + log_info "停止 $service..." + compose stop "$service" + log_success "$service 已停止" +} + +restart_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名。可用: $APP_SERVICES" + exit 1 + fi + log_info "重启 $service..." + compose stop "$service" + compose up -d "$service" + log_success "$service 已重启" +} + +rebuild_svc() { + local service="$1" + local flag="$2" + if [ -z "$service" ]; then + log_error "请指定服务名。可用: $APP_SERVICES" + exit 1 + fi + + log_info "编译 $service..." + if [ "$flag" = "--no-cache" ]; then + log_info "全新编译 (无缓存)..." + compose build --no-cache "$service" + else + compose build "$service" + fi + compose up -d "$service" + log_success "$service 编译并重启完成" +} + +logs_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名" + exit 1 + fi + compose logs -f "$service" +} + +# =========================================================================== +# 清理 +# =========================================================================== + +clean() { + log_warn "这将移除全部容器、数据卷和镜像!" + read -p "确认操作? (y/N): " confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + log_step "清理全部资源..." + compose down -v --rmi all + log_success "清理完成" + else + log_info "已取消" + fi +} + +# =========================================================================== +# 主入口 +# =========================================================================== + +case "${1:-}" in + install) + install + ;; + up|start) + up + ;; + down|stop) + down + ;; + restart) + restart + ;; + build) + build + ;; + build-no-cache) + build_no_cache + ;; + status|ps) + status + ;; + health) + health + ;; + logs) + logs "$2" + ;; + migrate) + migrate + ;; + clean) + clean + ;; + # 单服务操作 + start-svc) + start_svc "$2" + ;; + stop-svc) + stop_svc "$2" + ;; + restart-svc) + restart_svc "$2" + ;; + rebuild-svc) + rebuild_svc "$2" "$3" + ;; + logs-svc) + logs_svc "$2" + ;; + # 基础设施操作 + infra-up) + infra_up + ;; + infra-down) + infra_down + ;; + infra-restart) + infra_restart + ;; + infra-status) + infra_status + ;; + infra-logs) + infra_logs + ;; + infra-clean) + infra_clean + ;; + infra-reset) + infra_reset + ;; + *) + echo "Genex Backend Services 部署管理脚本" + echo "" + echo "用法: $0 <命令> [参数]" + echo "" + echo "全局命令:" + echo " install 首次初始化 (生成密钥、创建 .env)" + echo " up/start 启动全部服务" + echo " down/stop 停止全部服务" + echo " restart 重启全部服务" + echo " build 增量编译全部镜像" + echo " build-no-cache 全新编译全部镜像 (无缓存)" + echo " status/ps 查看服务状态 + 健康检查" + echo " health 仅健康检查" + echo " logs [svc] 查看日志 (可指定服务)" + echo " migrate 运行数据库迁移" + echo " clean 移除全部容器、卷和镜像" + echo "" + echo "单服务命令:" + echo " start-svc 启动指定服务" + echo " stop-svc 停止指定服务" + echo " restart-svc 重启指定服务" + echo " rebuild-svc 增量编译并重启" + echo " rebuild-svc --no-cache 全新编译并重启" + echo " logs-svc 查看指定服务日志" + echo "" + echo "基础设施命令:" + echo " infra-up 启动基础设施 (PG, Redis, Kafka, MinIO, Kong)" + echo " infra-down 停止基础设施" + echo " infra-restart 重启基础设施" + echo " infra-status 基础设施状态 + 健康检查" + echo " infra-logs 基础设施日志" + echo " infra-clean 清理基础设施容器和数据卷 (删除数据!)" + echo " infra-reset 重置基础设施 (clean + 重新启动)" + echo "" + echo "服务列表:" + echo " NestJS: auth-service, user-service, issuer-service, clearing-service," + echo " compliance-service, ai-service, notification-service," + echo " telemetry-service, admin-service" + echo " Go: trading-service, translate-service, chain-indexer" + echo "" + echo "示例:" + echo " $0 install # 首次初始化" + echo " $0 build # 增量编译全部" + echo " $0 up # 启动全部" + echo " $0 rebuild-svc auth-service # 增量编译 auth" + echo " $0 rebuild-svc trading-service --no-cache # 全新编译 trading" + echo " $0 logs user-service # 查看 user 日志" + echo " $0 infra-status # 检查基础设施" + echo "" + exit 1 + ;; +esac diff --git a/backend/services/admin-service/deploy.sh b/backend/services/admin-service/deploy.sh new file mode 100644 index 0000000..c1d280f --- /dev/null +++ b/backend/services/admin-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Admin Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="admin-service" +CONTAINER_NAME="genex-admin-service" +IMAGE_NAME="backend-admin-service" +PORT=3012 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/ai-service/deploy.sh b/backend/services/ai-service/deploy.sh new file mode 100644 index 0000000..bab6fd6 --- /dev/null +++ b/backend/services/ai-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# AI Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="ai-service" +CONTAINER_NAME="genex-ai-service" +IMAGE_NAME="backend-ai-service" +PORT=3006 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/auth-service/deploy.sh b/backend/services/auth-service/deploy.sh new file mode 100644 index 0000000..9e6a252 --- /dev/null +++ b/backend/services/auth-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Auth Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="auth-service" +CONTAINER_NAME="genex-auth-service" +IMAGE_NAME="backend-auth-service" +PORT=3010 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/chain-indexer/deploy.sh b/backend/services/chain-indexer/deploy.sh new file mode 100644 index 0000000..5cce25c --- /dev/null +++ b/backend/services/chain-indexer/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Chain Indexer - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="chain-indexer" +CONTAINER_NAME="genex-chain-indexer" +IMAGE_NAME="backend-chain-indexer" +PORT=3009 +HEALTH_ENDPOINT="/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + go test ./... -v + ;; + *) + echo "Chain Indexer 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行 Go 测试" + exit 1 + ;; +esac diff --git a/backend/services/clearing-service/deploy.sh b/backend/services/clearing-service/deploy.sh new file mode 100644 index 0000000..17023ec --- /dev/null +++ b/backend/services/clearing-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Clearing Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="clearing-service" +CONTAINER_NAME="genex-clearing-service" +IMAGE_NAME="backend-clearing-service" +PORT=3004 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/compliance-service/deploy.sh b/backend/services/compliance-service/deploy.sh new file mode 100644 index 0000000..d57c3c2 --- /dev/null +++ b/backend/services/compliance-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Compliance Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="compliance-service" +CONTAINER_NAME="genex-compliance-service" +IMAGE_NAME="backend-compliance-service" +PORT=3005 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/issuer-service/deploy.sh b/backend/services/issuer-service/deploy.sh new file mode 100644 index 0000000..c244f57 --- /dev/null +++ b/backend/services/issuer-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Issuer Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="issuer-service" +CONTAINER_NAME="genex-issuer-service" +IMAGE_NAME="backend-issuer-service" +PORT=3002 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/notification-service/deploy.sh b/backend/services/notification-service/deploy.sh new file mode 100644 index 0000000..3f6cc8f --- /dev/null +++ b/backend/services/notification-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Notification Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="notification-service" +CONTAINER_NAME="genex-notification-service" +IMAGE_NAME="backend-notification-service" +PORT=3008 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/telemetry-service/deploy.sh b/backend/services/telemetry-service/deploy.sh new file mode 100644 index 0000000..eb72bff --- /dev/null +++ b/backend/services/telemetry-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Telemetry Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="telemetry-service" +CONTAINER_NAME="genex-telemetry-service" +IMAGE_NAME="backend-telemetry-service" +PORT=3011 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/backend/services/trading-service/deploy.sh b/backend/services/trading-service/deploy.sh new file mode 100644 index 0000000..6024a52 --- /dev/null +++ b/backend/services/trading-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Trading Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="trading-service" +CONTAINER_NAME="genex-trading-service" +IMAGE_NAME="backend-trading-service" +PORT=3003 +HEALTH_ENDPOINT="/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + go test ./... -v + ;; + *) + echo "Trading Service 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行 Go 测试" + exit 1 + ;; +esac diff --git a/backend/services/translate-service/deploy.sh b/backend/services/translate-service/deploy.sh new file mode 100644 index 0000000..8d417d0 --- /dev/null +++ b/backend/services/translate-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# Translate Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="translate-service" +CONTAINER_NAME="genex-translate-service" +IMAGE_NAME="backend-translate-service" +PORT=3007 +HEALTH_ENDPOINT="/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + go test ./... -v + ;; + *) + echo "Translate Service 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行 Go 测试" + exit 1 + ;; +esac diff --git a/backend/services/user-service/deploy.sh b/backend/services/user-service/deploy.sh new file mode 100644 index 0000000..6a0952f --- /dev/null +++ b/backend/services/user-service/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash +# ============================================================================= +# User Service - 独立部署脚本 +# ============================================================================= + +set -e + +SERVICE_NAME="user-service" +CONTAINER_NAME="genex-user-service" +IMAGE_NAME="backend-user-service" +PORT=3001 +HEALTH_ENDPOINT="/api/v1/health" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKEND_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +COMPOSE_FILE="$BACKEND_DIR/docker-compose.yml" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +case "$1" in + build) + log_info "增量编译 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译完成" + ;; + build-no-cache) + log_info "全新编译 $SERVICE_NAME (无缓存)..." + compose build --no-cache "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译完成" + ;; + start) + log_info "启动 $SERVICE_NAME..." + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已启动" + ;; + stop) + log_info "停止 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + log_success "$SERVICE_NAME 已停止" + ;; + restart) + log_info "重启 $SERVICE_NAME..." + compose stop "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 已重启" + ;; + rebuild) + log_info "增量编译并重启 $SERVICE_NAME..." + compose build "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 编译并重启完成" + ;; + rebuild-no-cache) + log_info "全新编译并重启 $SERVICE_NAME..." + compose build --no-cache "$SERVICE_NAME" + compose up -d "$SERVICE_NAME" + log_success "$SERVICE_NAME 全新编译并重启完成" + ;; + logs) + docker logs -f "$CONTAINER_NAME" + ;; + logs-tail) + docker logs --tail 100 "$CONTAINER_NAME" + ;; + status) + if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + log_success "$SERVICE_NAME 运行中" + docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}" + else + log_warn "$SERVICE_NAME 未运行" + fi + ;; + health) + log_info "检查 $SERVICE_NAME 健康状态..." + if curl -sf "http://localhost:$PORT$HEALTH_ENDPOINT" > /dev/null 2>&1; then + log_success "$SERVICE_NAME 健康" + else + log_error "$SERVICE_NAME 健康检查失败" + exit 1 + fi + ;; + shell) + log_info "进入 $SERVICE_NAME 容器..." + docker exec -it "$CONTAINER_NAME" sh + ;; + test) + log_info "运行 $SERVICE_NAME 测试..." + cd "$SCRIPT_DIR" + npm test + ;; + *) + echo "$SERVICE_NAME 独立部署脚本" + echo "" + echo "用法: $0 <命令>" + echo "" + echo "命令:" + echo " build 增量编译 Docker 镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " start 启动服务" + echo " stop 停止服务" + echo " restart 重启服务" + echo " rebuild 增量编译并重启" + echo " rebuild-no-cache 全新编译并重启" + echo " logs 实时跟踪日志" + echo " logs-tail 查看最近 100 行日志" + echo " status 查看服务状态" + echo " health 健康检查" + echo " shell 进入容器 Shell" + echo " test 运行本地测试" + exit 1 + ;; +esac diff --git a/blockchain/deploy.sh b/blockchain/deploy.sh new file mode 100644 index 0000000..9e784d4 --- /dev/null +++ b/blockchain/deploy.sh @@ -0,0 +1,520 @@ +#!/bin/bash +# +# Genex Blockchain — 部署管理脚本 +# ========================================= +# +# 用法: +# ./deploy.sh up # 启动全部验证节点 (3创世+2机构+1监管) +# ./deploy.sh down # 停止全部节点 +# ./deploy.sh restart # 重启全部节点 +# ./deploy.sh build # 增量编译节点镜像 +# ./deploy.sh build-no-cache # 全新编译节点镜像 (无缓存) +# ./deploy.sh status # 查看节点状态 +# ./deploy.sh health # 健康检查 +# ./deploy.sh logs [node] # 查看日志 +# +# 单节点模式: +# ./deploy.sh dev # 仅启动 node-1 (开发模式) +# +# 生态服务: +# ./deploy.sh eco-up # 启动生态服务 (Enterprise API, Gas Relayer, Faucet, Bridge, Archive) +# ./deploy.sh eco-down # 停止生态服务 +# ./deploy.sh eco-status # 生态服务状态 +# ./deploy.sh eco-logs [svc] # 生态服务日志 +# ./deploy.sh eco-build # 增量编译生态服务 +# ./deploy.sh eco-build-no-cache # 全新编译生态服务 +# +# 智能合约: +# ./deploy.sh deploy-contracts # 部署智能合约 +# ./deploy.sh test-contracts # 运行合约测试 +# +# 区块浏览器: +# ./deploy.sh explorer-up # 启动 Blockscout +# ./deploy.sh explorer-down # 停止 Blockscout +# ./deploy.sh explorer-logs # 浏览器日志 +# +# 监控: +# ./deploy.sh monitor-up # 启动 Prometheus + Grafana +# ./deploy.sh monitor-down # 停止监控 +# ./deploy.sh monitor-logs # 监控日志 +# +# 单服务操作: +# ./deploy.sh start-svc # 启动指定服务 +# ./deploy.sh stop-svc # 停止指定服务 +# ./deploy.sh restart-svc # 重启指定服务 +# ./deploy.sh rebuild-svc # 增量编译并重启 +# ./deploy.sh rebuild-svc --no-cache # 全新编译并重启 +# + +set -e + +# =========================================================================== +# 配置 +# =========================================================================== +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" +EXPLORER_COMPOSE="$SCRIPT_DIR/docker-compose.explorer.yml" +MONITOR_COMPOSE="$SCRIPT_DIR/chain-monitor/docker-compose.monitor.yml" + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } +log_step() { echo -e "${CYAN}[STEP]${NC} $1"; } + +# 节点列表 +GENESIS_NODES="genex-node-1 genex-node-2 genex-node-3" +INST_NODES="genex-inst-1 genex-inst-2" +REGULATORY_NODES="genex-regulatory" +ALL_NODES="$GENESIS_NODES $INST_NODES $REGULATORY_NODES" + +# 生态服务列表 +ECO_SERVICES="enterprise-api gas-relayer faucet bridge-monitor genex-archive" + +compose() { + docker compose -f "$COMPOSE_FILE" "$@" +} + +# =========================================================================== +# 节点操作 +# =========================================================================== + +up() { + log_step "启动 Genex Blockchain 全部节点..." + compose up -d + log_success "全部节点已启动 (3创世 + 2机构 + 1监管)" + echo "" + log_info "主节点 RPC: http://localhost:26657" + log_info "EVM JSON-RPC: http://localhost:8545" + log_info "Cosmos REST: http://localhost:1317" +} + +down() { + log_step "停止全部节点..." + compose down + log_success "全部节点已停止" +} + +restart() { + log_step "重启全部节点..." + down + sleep 3 + up +} + +dev() { + log_step "启动单节点开发模式 (genex-node-1)..." + compose up -d genex-node-1 + log_success "开发节点已启动" + echo "" + log_info "CometBFT RPC: http://localhost:26657" + log_info "EVM JSON-RPC: http://localhost:8545" + log_info "EVM WS: ws://localhost:8546" + log_info "Cosmos REST: http://localhost:1317" + log_info "gRPC: localhost:9090" +} + +build() { + log_step "增量编译节点镜像..." + compose build + log_success "节点镜像编译完成" +} + +build_no_cache() { + log_step "全新编译节点镜像 (无缓存)..." + compose build --no-cache + log_success "节点镜像全新编译完成" +} + +status() { + echo "" + echo "============================================" + echo " Genex Blockchain 节点状态" + echo "============================================" + echo "" + compose ps + echo "" + health +} + +health() { + echo "============================================" + echo " 健康检查" + echo "============================================" + echo "" + + # 主节点检查 + local nodes=( + "genex-node-1:26657" + "genex-node-2:26667" + "genex-node-3:26677" + "genex-inst-1:26687" + "genex-inst-2:26697" + "genex-regulatory:26707" + ) + + echo "验证节点:" + for node in "${nodes[@]}"; do + name="${node%%:*}" + port="${node#*:}" + if curl -sf "http://localhost:${port}/status" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} $name (:$port)" + else + echo -e " ${RED}[FAIL]${NC} $name (:$port)" + fi + done + + echo "" + echo "EVM RPC:" + local evm_nodes=( + "genex-node-1:8545" + "genex-node-2:8555" + "genex-node-3:8565" + ) + for node in "${evm_nodes[@]}"; do + name="${node%%:*}" + port="${node#*:}" + if curl -sf -X POST "http://localhost:${port}" \ + -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} $name EVM (:$port)" + else + echo -e " ${RED}[FAIL]${NC} $name EVM (:$port)" + fi + done + + echo "" +} + +logs() { + local target="$1" + if [ -n "$target" ]; then + compose logs -f "$target" + else + compose logs -f + fi +} + +# =========================================================================== +# 生态服务操作 +# =========================================================================== + +eco_up() { + log_step "启动生态服务..." + compose --profile ecosystem up -d + log_success "生态服务已启动" + echo "" + log_info "Enterprise API: http://localhost:3020" + log_info "Gas Relayer: http://localhost:3022" + log_info "Faucet: http://localhost:3023" + log_info "Bridge Monitor: http://localhost:3024" +} + +eco_down() { + log_step "停止生态服务..." + compose --profile ecosystem stop enterprise-api gas-relayer faucet bridge-monitor genex-archive + log_success "生态服务已停止" +} + +eco_status() { + echo "" + echo "============================================" + echo " 生态服务状态" + echo "============================================" + echo "" + compose --profile ecosystem ps enterprise-api gas-relayer faucet bridge-monitor genex-archive + + echo "" + echo "健康检查:" + local eco_checks=( + "enterprise-api:3020:/health" + "gas-relayer:3022:/health" + "faucet:3023:/health" + "bridge-monitor:3024:/health" + ) + for svc in "${eco_checks[@]}"; do + name="${svc%%:*}" + rest="${svc#*:}" + port="${rest%%:*}" + endpoint="${rest#*:}" + if curl -sf "http://localhost:${port}${endpoint}" > /dev/null 2>&1; then + echo -e " ${GREEN}[OK]${NC} $name (:$port)" + else + echo -e " ${RED}[FAIL]${NC} $name (:$port)" + fi + done + echo "" +} + +eco_logs() { + local service="$1" + if [ -n "$service" ]; then + compose logs -f "$service" + else + compose --profile ecosystem logs -f enterprise-api gas-relayer faucet bridge-monitor genex-archive + fi +} + +eco_build() { + log_step "增量编译生态服务..." + compose --profile ecosystem build + log_success "生态服务编译完成" +} + +eco_build_no_cache() { + log_step "全新编译生态服务 (无缓存)..." + compose --profile ecosystem build --no-cache + log_success "生态服务全新编译完成" +} + +# =========================================================================== +# 智能合约 +# =========================================================================== + +deploy_contracts() { + log_step "部署智能合约..." + compose --profile deploy run --rm contract-deployer + log_success "合约部署完成" +} + +test_contracts() { + log_step "运行智能合约测试..." + cd "$SCRIPT_DIR/genex-contracts" + forge test -vvv --gas-report + log_success "合约测试完成" +} + +# =========================================================================== +# 区块浏览器 +# =========================================================================== + +explorer_up() { + log_step "启动 Blockscout 区块浏览器..." + docker compose -f "$COMPOSE_FILE" -f "$EXPLORER_COMPOSE" up -d + log_success "Blockscout 已启动" + log_info "访问: http://localhost:4000" +} + +explorer_down() { + log_step "停止 Blockscout..." + docker compose -f "$COMPOSE_FILE" -f "$EXPLORER_COMPOSE" down + log_success "Blockscout 已停止" +} + +explorer_logs() { + docker compose -f "$COMPOSE_FILE" -f "$EXPLORER_COMPOSE" logs -f +} + +# =========================================================================== +# 链监控 +# =========================================================================== + +monitor_up() { + log_step "启动链监控 (Prometheus + Grafana + AlertManager)..." + docker compose -f "$MONITOR_COMPOSE" up -d + log_success "监控栈已启动" + echo "" + log_info "Prometheus: http://localhost:9090" + log_info "Grafana: http://localhost:3030 (密码: genex_admin_2024)" + log_info "AlertManager: http://localhost:9093" +} + +monitor_down() { + log_step "停止链监控..." + docker compose -f "$MONITOR_COMPOSE" down + log_success "监控栈已停止" +} + +monitor_logs() { + docker compose -f "$MONITOR_COMPOSE" logs -f +} + +# =========================================================================== +# 单服务操作 +# =========================================================================== + +start_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名" + exit 1 + fi + log_info "启动 $service..." + compose up -d "$service" + log_success "$service 已启动" +} + +stop_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名" + exit 1 + fi + log_info "停止 $service..." + compose stop "$service" + log_success "$service 已停止" +} + +restart_svc() { + local service="$1" + if [ -z "$service" ]; then + log_error "请指定服务名" + exit 1 + fi + log_info "重启 $service..." + compose stop "$service" + compose up -d "$service" + log_success "$service 已重启" +} + +rebuild_svc() { + local service="$1" + local flag="$2" + if [ -z "$service" ]; then + log_error "请指定服务名" + exit 1 + fi + log_info "编译 $service..." + if [ "$flag" = "--no-cache" ]; then + compose build --no-cache "$service" + else + compose build "$service" + fi + compose up -d "$service" + log_success "$service 编译并重启完成" +} + +# =========================================================================== +# 清理 +# =========================================================================== + +clean() { + log_warn "这将删除全部区块链节点容器、数据卷和镜像!" + log_warn "所有链上数据将丢失!" + read -p "确认操作? (y/N): " confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + log_step "清理全部区块链资源..." + compose --profile ecosystem --profile deploy down -v --rmi all + log_success "清理完成" + else + log_info "已取消" + fi +} + +# =========================================================================== +# 主入口 +# =========================================================================== + +case "${1:-}" in + # 全局 + up|start) up ;; + down|stop) down ;; + restart) restart ;; + dev) dev ;; + build) build ;; + build-no-cache) build_no_cache ;; + status|ps) status ;; + health) health ;; + logs) logs "$2" ;; + clean) clean ;; + + # 生态服务 + eco-up) eco_up ;; + eco-down) eco_down ;; + eco-status) eco_status ;; + eco-logs) eco_logs "$2" ;; + eco-build) eco_build ;; + eco-build-no-cache) eco_build_no_cache ;; + + # 智能合约 + deploy-contracts) deploy_contracts ;; + test-contracts) test_contracts ;; + + # 区块浏览器 + explorer-up) explorer_up ;; + explorer-down) explorer_down ;; + explorer-logs) explorer_logs ;; + + # 链监控 + monitor-up) monitor_up ;; + monitor-down) monitor_down ;; + monitor-logs) monitor_logs ;; + + # 单服务操作 + start-svc) start_svc "$2" ;; + stop-svc) stop_svc "$2" ;; + restart-svc) restart_svc "$2" ;; + rebuild-svc) rebuild_svc "$2" "$3" ;; + + *) + echo "Genex Blockchain 部署管理脚本" + echo "" + echo "用法: $0 <命令> [参数]" + echo "" + echo "节点命令:" + echo " up/start 启动全部节点 (3创世+2机构+1监管)" + echo " down/stop 停止全部节点" + echo " restart 重启全部节点" + echo " dev 单节点开发模式 (仅 node-1)" + echo " build 增量编译节点镜像" + echo " build-no-cache 全新编译 (无缓存)" + echo " status/ps 节点状态 + 健康检查" + echo " health 仅健康检查" + echo " logs [node] 查看日志" + echo " clean 清理全部 (删除链数据!)" + echo "" + echo "生态服务命令:" + echo " eco-up 启动 (Enterprise API, Gas Relayer, Faucet, Bridge, Archive)" + echo " eco-down 停止" + echo " eco-status 状态 + 健康检查" + echo " eco-logs [svc] 日志" + echo " eco-build 增量编译" + echo " eco-build-no-cache 全新编译 (无缓存)" + echo "" + echo "智能合约命令:" + echo " deploy-contracts 部署合约到链上" + echo " test-contracts 运行 Foundry 测试 (forge test)" + echo "" + echo "区块浏览器命令:" + echo " explorer-up 启动 Blockscout (:4000)" + echo " explorer-down 停止 Blockscout" + echo " explorer-logs Blockscout 日志" + echo "" + echo "链监控命令:" + echo " monitor-up 启动 Prometheus(:9090) + Grafana(:3030) + AlertManager(:9093)" + echo " monitor-down 停止监控" + echo " monitor-logs 监控日志" + echo "" + echo "单服务命令:" + echo " start-svc 启动指定服务" + echo " stop-svc 停止指定服务" + echo " restart-svc 重启指定服务" + echo " rebuild-svc 增量编译并重启" + echo " rebuild-svc --no-cache 全新编译并重启" + echo "" + echo "节点列表:" + echo " genex-node-1, genex-node-2, genex-node-3" + echo " genex-inst-1, genex-inst-2, genex-regulatory" + echo "" + echo "生态服务列表:" + echo " enterprise-api, gas-relayer, faucet, bridge-monitor, genex-archive" + echo "" + echo "示例:" + echo " $0 dev # 单节点开发" + echo " $0 up # 全网启动" + echo " $0 deploy-contracts # 部署合约" + echo " $0 eco-up # 启动生态" + echo " $0 explorer-up # 启动浏览器" + echo " $0 rebuild-svc genex-node-1 --no-cache # 全新编译 node-1" + echo "" + exit 1 + ;; +esac diff --git a/docs/guides/09-编译部署指南.md b/docs/guides/09-编译部署指南.md index b4fd45a..f992e8d 100644 --- a/docs/guides/09-编译部署指南.md +++ b/docs/guides/09-编译部署指南.md @@ -38,6 +38,11 @@ - [6.2 健康检查](#62-健康检查) - [7. 端口总览](#7-端口总览) - [8. CI/CD 管线](#8-cicd-管线) +- [9. deploy.sh 部署管理脚本](#9-deploysh-部署管理脚本) + - [9.1 后端主控脚本](#91-后端主控脚本--backenddeploysh) + - [9.2 各服务独立脚本](#92-各服务独立脚本--backendservicesnamedeploysh) + - [9.3 区块链脚本](#93-区块链脚本--blockchaindeploysh) + - [9.4 编译策略说明](#94-编译策略说明) --- @@ -574,21 +579,147 @@ CHAINALYSIS_API_KEY=mock-key --- +## 9. deploy.sh 部署管理脚本 + +每个模块都配备了 `deploy.sh` 脚本,提供统一的服务管理接口(启动、停止、重启、编译、健康检查等),所有服务在总 `docker-compose.yml` + `.env` 下有序工作。 + +### 9.1 后端主控脚本 — `backend/deploy.sh` + +```bash +# 首次初始化(自动生成安全密钥 + .env) +./deploy.sh install + +# 全局操作 +./deploy.sh up # 启动全部 (基础设施 + 12个微服务) +./deploy.sh down # 停止全部 +./deploy.sh restart # 重启全部 +./deploy.sh build # 增量编译全部镜像 +./deploy.sh build-no-cache # 全新编译 (无缓存) +./deploy.sh status # 状态 + 健康检查 +./deploy.sh health # 仅健康检查 +./deploy.sh logs [svc] # 日志 (可指定服务) +./deploy.sh migrate # 数据库迁移 + +# 基础设施单独控制 +./deploy.sh infra-up # 仅启动 PG/Redis/Kafka/MinIO/Kong +./deploy.sh infra-down +./deploy.sh infra-restart +./deploy.sh infra-status +./deploy.sh infra-logs +./deploy.sh infra-clean # 清理 (删除数据!) +./deploy.sh infra-reset # 重置 (clean + 重启) + +# 单服务操作 +./deploy.sh start-svc auth-service +./deploy.sh stop-svc auth-service +./deploy.sh restart-svc auth-service +./deploy.sh rebuild-svc auth-service # 增量编译并重启 +./deploy.sh rebuild-svc auth-service --no-cache # 全新编译并重启 +./deploy.sh logs-svc auth-service +``` + +### 9.2 各服务独立脚本 — `backend/services//deploy.sh` + +每个微服务目录下都有独立的 `deploy.sh`,支持以下命令: + +```bash +cd backend/services/auth-service/ +./deploy.sh build # 增量编译 +./deploy.sh build-no-cache # 全新编译 (无缓存) +./deploy.sh start # 启动 +./deploy.sh stop # 停止 +./deploy.sh restart # 重启 +./deploy.sh rebuild # 增量编译并重启 +./deploy.sh rebuild-no-cache # 全新编译并重启 +./deploy.sh logs # 实时日志 +./deploy.sh logs-tail # 最近 100 行 +./deploy.sh status # 运行状态 +./deploy.sh health # 健康检查 +./deploy.sh shell # 进入容器 +./deploy.sh test # 运行测试 (NestJS: npm test / Go: go test) +``` + +| 服务 | 路径 | 端口 | 类型 | +|------|------|------|------| +| auth-service | `backend/services/auth-service/deploy.sh` | 3010 | NestJS | +| user-service | `backend/services/user-service/deploy.sh` | 3001 | NestJS | +| issuer-service | `backend/services/issuer-service/deploy.sh` | 3002 | NestJS | +| trading-service | `backend/services/trading-service/deploy.sh` | 3003 | Go | +| clearing-service | `backend/services/clearing-service/deploy.sh` | 3004 | NestJS | +| compliance-service | `backend/services/compliance-service/deploy.sh` | 3005 | NestJS | +| ai-service | `backend/services/ai-service/deploy.sh` | 3006 | NestJS | +| translate-service | `backend/services/translate-service/deploy.sh` | 3007 | Go | +| notification-service | `backend/services/notification-service/deploy.sh` | 3008 | NestJS | +| chain-indexer | `backend/services/chain-indexer/deploy.sh` | 3009 | Go | +| telemetry-service | `backend/services/telemetry-service/deploy.sh` | 3011 | NestJS | +| admin-service | `backend/services/admin-service/deploy.sh` | 3012 | NestJS | + +### 9.3 区块链脚本 — `blockchain/deploy.sh` + +```bash +# 节点管理 +./deploy.sh up # 启动全部节点 (3创世+2机构+1监管) +./deploy.sh down # 停止 +./deploy.sh restart # 重启 +./deploy.sh dev # 单节点开发模式 (仅 node-1) +./deploy.sh build # 增量编译 +./deploy.sh build-no-cache # 全新编译 +./deploy.sh status # 状态 + 健康 +./deploy.sh health # 健康检查 + +# 生态服务 +./deploy.sh eco-up # Enterprise API / Gas Relayer / Faucet / Bridge / Archive +./deploy.sh eco-down +./deploy.sh eco-status +./deploy.sh eco-build +./deploy.sh eco-build-no-cache + +# 智能合约 +./deploy.sh deploy-contracts # 部署合约 +./deploy.sh test-contracts # Foundry 测试 + +# 区块浏览器 +./deploy.sh explorer-up # 启动 Blockscout (:4000) +./deploy.sh explorer-down + +# 链监控 +./deploy.sh monitor-up # Prometheus(:9090) + Grafana(:3030) +./deploy.sh monitor-down + +# 单服务 +./deploy.sh rebuild-svc genex-node-1 --no-cache +``` + +### 9.4 编译策略说明 + +| 命令 | 策略 | 场景 | +|------|------|------| +| `build` | 增量编译 | 日常开发,利用 Docker 层缓存,速度快 | +| `build-no-cache` | 全新编译 | 依赖变更、Dockerfile 修改后,跳过所有缓存 | +| `rebuild` | 增量编译 + 自动重启 | 修改代码后快速更新 | +| `rebuild-no-cache` | 全新编译 + 自动重启 | 确保干净环境 | + +--- + ## 附录:快速参考 ```bash -# === 全栈本地启动(最简路径) === -cd backend && docker compose up -d # 后端全部 -cd blockchain && docker compose up -d # 区块链全部 -cd frontend/admin-web && docker compose up -d # 管理后台 +# === 全栈本地启动(deploy.sh 方式,推荐) === +cd backend && ./deploy.sh install && ./deploy.sh build && ./deploy.sh up +cd blockchain && ./deploy.sh build && ./deploy.sh up +cd frontend/admin-web && docker compose up -d # === 验证 === -curl http://localhost:8080/api/v1/auth/health # Kong → Auth 健康 -curl http://localhost:26657/status # 区块链节点状态 +cd backend && ./deploy.sh health +cd blockchain && ./deploy.sh health curl http://localhost:3000 # 管理后台页面 +# === 单服务热更新 === +cd backend && ./deploy.sh rebuild-svc auth-service # 增量 +cd backend && ./deploy.sh rebuild-svc trading-service --no-cache # 全新 + # === 停止 === -cd backend && docker compose down -cd blockchain && docker compose down +cd backend && ./deploy.sh down +cd blockchain && ./deploy.sh down cd frontend/admin-web && docker compose down ```