feat: WWJCloud 企业级全栈框架 v0.3.5 完整更新
🚀 核心更新: - ✅ 完善 NestJS 企业级架构设计 - ✅ 优化配置中心和基础设施层 - ✅ 增强第三方服务集成能力 - ✅ 完善多租户架构支持 - 🎯 对标 Java Spring Boot 和 PHP ThinkPHP 📦 新增文件: - wwjcloud-nest 完整框架结构 - Docker 容器化配置 - 管理后台界面 - 数据库迁移脚本 🔑 Key: ebb38b43ec39f355f071294fd1cf9c42
This commit is contained in:
25
docker/Dockerfile
Normal file
25
docker/Dockerfile
Normal file
@@ -0,0 +1,25 @@
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
|
||||
# Install dependencies
|
||||
COPY package*.json ./
|
||||
RUN npm ci --omit=dev
|
||||
|
||||
# Copy source
|
||||
COPY . .
|
||||
|
||||
# Build (if needed)
|
||||
RUN npm run build || true
|
||||
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
COPY --from=builder /app /app
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["node", "dist/main.js"]
|
||||
|
||||
|
||||
106
docker/auto-test.sh
Executable file
106
docker/auto-test.sh
Executable file
@@ -0,0 +1,106 @@
|
||||
#!/bin/bash
|
||||
|
||||
# WWJCloud Docker 自动测试脚本
|
||||
# ========================================
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 日志函数
|
||||
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||||
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
||||
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
# 测试计数器
|
||||
TESTS_PASSED=0
|
||||
TESTS_FAILED=0
|
||||
TOTAL_TESTS=0
|
||||
|
||||
# 测试函数
|
||||
run_test() {
|
||||
local test_name="$1"
|
||||
local test_command="$2"
|
||||
|
||||
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
||||
log_info "测试 $TOTAL_TESTS: $test_name"
|
||||
|
||||
if eval "$test_command" >/dev/null 2>&1; then
|
||||
log_success "✅ $test_name - 通过"
|
||||
TESTS_PASSED=$((TESTS_PASSED + 1))
|
||||
return 0
|
||||
else
|
||||
log_error "❌ $test_name - 失败"
|
||||
TESTS_FAILED=$((TESTS_FAILED + 1))
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 主测试函数
|
||||
main() {
|
||||
echo "🚀 WWJCloud Docker 自动测试开始..."
|
||||
echo "========================================"
|
||||
|
||||
# 1. 检查容器状态
|
||||
log_info "检查容器运行状态..."
|
||||
run_test "MySQL 容器运行" "docker ps | grep wwjcloud-mysql | grep Up"
|
||||
run_test "Redis 容器运行" "docker ps | grep wwjcloud-redis | grep Up"
|
||||
|
||||
# 2. 等待服务就绪
|
||||
log_info "等待服务完全启动..."
|
||||
sleep 10
|
||||
|
||||
# 3. 测试 MySQL 连接
|
||||
log_info "测试 MySQL 数据库连接..."
|
||||
run_test "MySQL Root 用户连接" "docker exec wwjcloud-mysql mysql -u root -pwwjcloud -e 'SELECT 1;'"
|
||||
run_test "MySQL wwjcloud 用户连接" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'SELECT 1;'"
|
||||
run_test "MySQL 数据库存在" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; SHOW TABLES;'"
|
||||
|
||||
# 4. 测试 Redis 连接
|
||||
log_info "测试 Redis 缓存连接..."
|
||||
run_test "Redis 连接测试" "docker exec wwjcloud-redis redis-cli -a redis123456 ping"
|
||||
run_test "Redis 读写测试" "docker exec wwjcloud-redis redis-cli -a redis123456 set test_key 'test_value' && docker exec wwjcloud-redis redis-cli -a redis123456 get test_key"
|
||||
|
||||
# 5. 测试网络连通性
|
||||
log_info "测试网络连通性..."
|
||||
run_test "MySQL 端口访问" "nc -z localhost 3306"
|
||||
run_test "Redis 端口访问" "nc -z localhost 6379"
|
||||
|
||||
# 6. 测试健康检查
|
||||
log_info "测试服务健康状态..."
|
||||
run_test "MySQL 健康检查" "docker exec wwjcloud-mysql mysqladmin ping -h localhost -u root -pwwjcloud"
|
||||
run_test "Redis 健康检查" "docker exec wwjcloud-redis redis-cli -a redis123456 ping"
|
||||
|
||||
# 7. 测试数据持久化
|
||||
log_info "测试数据持久化..."
|
||||
run_test "MySQL 数据写入" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY, name VARCHAR(50));'"
|
||||
run_test "MySQL 数据读取" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; INSERT INTO test_table VALUES (2, \"test2\") ON DUPLICATE KEY UPDATE name=\"test2\"; SELECT * FROM test_table;'"
|
||||
|
||||
# 输出测试结果
|
||||
echo ""
|
||||
echo "========================================"
|
||||
echo "📊 测试结果汇总"
|
||||
echo "========================================"
|
||||
echo "总测试数: $TOTAL_TESTS"
|
||||
echo "通过: $TESTS_PASSED"
|
||||
echo "失败: $TESTS_FAILED"
|
||||
|
||||
if [ $TESTS_FAILED -eq 0 ]; then
|
||||
log_success "🎉 所有测试通过!WWJCloud Docker 环境运行正常"
|
||||
echo ""
|
||||
echo "🌐 访问信息:"
|
||||
echo "MySQL: localhost:3306 (用户: wwjcloud, 密码: wwjcloud, 数据库: wwjcloud)"
|
||||
echo "Redis: localhost:6379 (密码: redis123456)"
|
||||
exit 0
|
||||
else
|
||||
log_error "❌ 有 $TESTS_FAILED 个测试失败,请检查服务状态"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 运行主函数
|
||||
main "$@"
|
||||
@@ -9,22 +9,22 @@ services:
|
||||
container_name: wwjcloud-mysql
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root123456
|
||||
MYSQL_ROOT_PASSWORD: wwjcloud
|
||||
MYSQL_DATABASE: wwjcloud
|
||||
MYSQL_USER: wwjcloud
|
||||
MYSQL_PASSWORD: wwjcloud123
|
||||
MYSQL_PASSWORD: wwjcloud
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
- ./sql:/docker-entrypoint-initdb.d
|
||||
- wwjcloud_mysql_data:/var/lib/mysql
|
||||
- ../../sql:/docker-entrypoint-initdb.d
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --default-authentication-plugin=mysql_native_password
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123456"]
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pwwjcloud"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@@ -41,7 +41,7 @@ services:
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
- wwjcloud_redis_data:/data
|
||||
command: redis-server --appendonly yes --requirepass redis123456
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "-a", "redis123456", "ping"]
|
||||
@@ -56,8 +56,8 @@ services:
|
||||
# ========================================
|
||||
nestjs-backend:
|
||||
build:
|
||||
context: ./wwjcloud-nest
|
||||
dockerfile: Dockerfile
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: wwjcloud-nestjs
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
@@ -77,7 +77,7 @@ services:
|
||||
DB_HOST: mysql
|
||||
DB_PORT: 3306
|
||||
DB_USERNAME: wwjcloud
|
||||
DB_PASSWORD: wwjcloud123
|
||||
DB_PASSWORD: wwjcloud
|
||||
DB_DATABASE: wwjcloud
|
||||
DB_SYNC: false
|
||||
DB_LOGGING: false
|
||||
@@ -145,7 +145,7 @@ services:
|
||||
# ========================================
|
||||
admin-frontend:
|
||||
build:
|
||||
context: ./wwjcloud-nest/admin
|
||||
context: ../admin
|
||||
dockerfile: Dockerfile
|
||||
container_name: wwjcloud-admin
|
||||
restart: unless-stopped
|
||||
@@ -166,9 +166,9 @@ services:
|
||||
# 数据卷
|
||||
# ========================================
|
||||
volumes:
|
||||
mysql_data:
|
||||
wwjcloud_mysql_data:
|
||||
driver: local
|
||||
redis_data:
|
||||
wwjcloud_redis_data:
|
||||
driver: local
|
||||
|
||||
# ========================================
|
||||
|
||||
@@ -40,6 +40,18 @@ record_info() {
|
||||
echo -e "${BLUE}ℹ️ 信息: $1${NC}"
|
||||
}
|
||||
|
||||
############################################################
|
||||
# 使用脚本所在目录的 docker-compose.yml
|
||||
############################################################
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
export COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
|
||||
record_info "使用的 Compose 文件: $COMPOSE_FILE"
|
||||
|
||||
# 清理旧容器与孤儿,确保干净环境
|
||||
record_info "清理旧容器与孤儿..."
|
||||
docker-compose down -v --remove-orphans >/dev/null 2>&1 || true
|
||||
record_success "环境清理完成"
|
||||
|
||||
echo "📋 测试阶段1: 环境准备"
|
||||
echo "=================================================="
|
||||
|
||||
@@ -68,7 +80,7 @@ echo "=================================================="
|
||||
|
||||
# 测试迁移工具
|
||||
record_info "测试迁移工具..."
|
||||
cd tools
|
||||
cd "$SCRIPT_DIR/../../tools"
|
||||
|
||||
# 测试PHP文件发现工具
|
||||
if node -e "const PHPFileDiscovery = require('./php-file-discovery.js'); const discovery = new PHPFileDiscovery(); discovery.run(); console.log('PHP文件发现工具测试通过');" 2>/dev/null; then
|
||||
@@ -112,7 +124,7 @@ else
|
||||
record_error "迁移协调器失败"
|
||||
fi
|
||||
|
||||
cd ..
|
||||
cd "$SCRIPT_DIR/../.."
|
||||
|
||||
echo ""
|
||||
echo "📋 测试阶段3: 构建Docker镜像"
|
||||
|
||||
68
docker/start-all.sh
Normal file
68
docker/start-all.sh
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Resolve compose file
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
|
||||
|
||||
echo "📦 Using compose file: $COMPOSE_FILE"
|
||||
export COMPOSE_FILE="$COMPOSE_FILE"
|
||||
|
||||
echo "🧹 Cleaning up any existing stack (containers, orphans)..."
|
||||
docker-compose down -v --remove-orphans || true
|
||||
|
||||
# Remove any leftover containers with conflicting names
|
||||
echo "🧹 Removing leftover named containers if exist..."
|
||||
docker rm -f wwjcloud-redis >/dev/null 2>&1 || true
|
||||
docker rm -f wwjcloud-mysql >/dev/null 2>&1 || true
|
||||
docker rm -f wwjcloud-nestjs >/dev/null 2>&1 || true
|
||||
|
||||
if [ "$SKIP_BUILD" = "1" ]; then
|
||||
echo "⏭️ Skipping image builds (using local images). Set SKIP_BUILD=0 to force build."
|
||||
else
|
||||
echo "🚀 Building images (backend, admin)..."
|
||||
docker-compose build nestjs-backend admin-frontend
|
||||
fi
|
||||
|
||||
echo "🧩 Starting MySQL and Redis..."
|
||||
docker-compose up -d mysql redis
|
||||
|
||||
echo "⏳ Waiting for DB services to be ready..."
|
||||
sleep 20
|
||||
|
||||
echo "🚀 Starting backend..."
|
||||
if [ "$SKIP_BUILD" = "1" ]; then
|
||||
docker-compose up -d --no-build nestjs-backend
|
||||
else
|
||||
docker-compose up -d nestjs-backend
|
||||
fi
|
||||
|
||||
echo "⏳ Waiting for backend health..."
|
||||
ATTEMPTS=0
|
||||
until curl -sf http://localhost:3000/health > /dev/null 2>&1 || [ $ATTEMPTS -ge 15 ]; do
|
||||
ATTEMPTS=$((ATTEMPTS+1))
|
||||
sleep 4
|
||||
done
|
||||
|
||||
echo "🚀 Starting admin frontend..."
|
||||
if [ "$SKIP_BUILD" = "1" ]; then
|
||||
docker-compose up -d --no-build admin-frontend
|
||||
else
|
||||
docker-compose up -d admin-frontend
|
||||
fi
|
||||
|
||||
echo "⏳ Waiting for admin to be ready..."
|
||||
sleep 15
|
||||
|
||||
echo "✅ Services are up."
|
||||
echo "🌐 Admin: http://localhost"
|
||||
echo "🔧 API: http://localhost:3000"
|
||||
|
||||
echo "📊 Status:"
|
||||
docker-compose ps
|
||||
|
||||
echo "📦 Docker containers:"
|
||||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "╔════════════════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ 🚀 启动开发环境(MySQL + Redis + 本地服务) ║"
|
||||
echo "║ 🚀 启动开发环境(MySQL + Redis) ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
COMPOSE_DEV="$SCRIPT_DIR/docker-compose.dev.yml"
|
||||
export COMPOSE_FILE="$COMPOSE_DEV"
|
||||
|
||||
# 步骤1: 启动MySQL和Redis
|
||||
echo "📦 步骤1: 启动MySQL和Redis容器..."
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
docker-compose up -d
|
||||
|
||||
# 等待服务就绪
|
||||
echo "⏳ 等待MySQL和Redis就绪..."
|
||||
@@ -16,7 +20,7 @@ sleep 10
|
||||
# 检查服务状态
|
||||
echo ""
|
||||
echo "📊 服务状态:"
|
||||
docker-compose -f docker-compose.dev.yml ps
|
||||
docker-compose ps
|
||||
|
||||
echo ""
|
||||
echo "✅ MySQL和Redis已启动!"
|
||||
@@ -26,6 +30,6 @@ echo " MySQL: localhost:3306"
|
||||
echo " Redis: localhost:6379"
|
||||
echo ""
|
||||
echo "📋 下一步:"
|
||||
echo " 1. 启动NestJS: cd wwjcloud-nest && npm run start:dev"
|
||||
echo " 2. 启动Admin: cd wwjcloud-nest/admin && npm run dev"
|
||||
echo " 1. 启动NestJS: cd $SCRIPT_DIR/.. && npm run start:dev"
|
||||
echo " 2. 启动Admin: cd $SCRIPT_DIR/../admin && npm run dev"
|
||||
echo ""
|
||||
|
||||
@@ -5,6 +5,10 @@ echo "║ 🚀 启动生产环境(完整Docker部署)
|
||||
echo "╚════════════════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
COMPOSE_FILE_PATH="$SCRIPT_DIR/docker-compose.yml"
|
||||
export COMPOSE_FILE="$COMPOSE_FILE_PATH"
|
||||
|
||||
# 步骤1: 构建并启动所有服务
|
||||
echo "📦 步骤1: 构建并启动所有服务..."
|
||||
docker-compose up -d --build
|
||||
|
||||
Reference in New Issue
Block a user