commit to ljwx-health
This commit is contained in:
+18
-15
@@ -1,8 +1,8 @@
|
||||
# LJWX Docker Compose 环境变量配置示例
|
||||
# 复制此文件为 .env 并根据实际情况修改
|
||||
# LJWX 环境配置示例
|
||||
# 复制此文件为 .env 并修改相应的配置
|
||||
|
||||
# ============================================
|
||||
# MySQL 数据库配置
|
||||
# 数据库配置
|
||||
# ============================================
|
||||
MYSQL_ROOT_PASSWORD=root123456
|
||||
MYSQL_DATABASE=ljwx
|
||||
@@ -10,29 +10,32 @@ MYSQL_USER=ljwx
|
||||
MYSQL_PASSWORD=ljwx123456
|
||||
|
||||
# ============================================
|
||||
# Redis 缓存配置
|
||||
# Redis 配置
|
||||
# ============================================
|
||||
REDIS_PASSWORD=redis123456
|
||||
|
||||
# ============================================
|
||||
# 应用配置
|
||||
# ============================================
|
||||
# Spring Boot 配置
|
||||
# 开发环境: development, 生产环境: production
|
||||
NODE_ENV=development
|
||||
SPRING_PROFILES_ACTIVE=prod
|
||||
|
||||
# Node.js 配置
|
||||
NODE_ENV=development
|
||||
VITE_USER_NODE_ENV=development
|
||||
# ============================================
|
||||
# 监控配置
|
||||
# ============================================
|
||||
# Grafana 管理员密码
|
||||
GF_SECURITY_ADMIN_PASSWORD=admin123
|
||||
|
||||
# ============================================
|
||||
# 监控系统配置(使用默认值)
|
||||
# 网络配置
|
||||
# ============================================
|
||||
# Grafana 管理员密码(在 docker-compose.yml 中配置)
|
||||
# GF_SECURITY_ADMIN_PASSWORD=admin123
|
||||
# 如需限制只允许本地访问,可以指定绑定地址
|
||||
# BIND_ADDRESS=127.0.0.1
|
||||
# 默认绑定所有网络接口(支持远程访问)
|
||||
BIND_ADDRESS=0.0.0.0
|
||||
|
||||
# ============================================
|
||||
# 使用说明
|
||||
# 时区配置
|
||||
# ============================================
|
||||
# 1. 将此文件复制为 .env: cp .env.example .env
|
||||
# 2. 根据实际情况修改密码等配置
|
||||
# 3. 运行: docker-compose up -d
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
@@ -0,0 +1,305 @@
|
||||
# LJWX 远程访问指南
|
||||
|
||||
## 快速启动
|
||||
|
||||
### 1. 启动所有服务(开发环境)
|
||||
```bash
|
||||
./start-services.sh start
|
||||
# 或简单执行
|
||||
./start-services.sh
|
||||
```
|
||||
|
||||
### 2. 启动生产环境
|
||||
```bash
|
||||
./start-services.sh start-prod
|
||||
```
|
||||
|
||||
### 3. 仅启动基础设施(MySQL + Redis)
|
||||
```bash
|
||||
./start-services.sh start-minimal
|
||||
```
|
||||
|
||||
### 4. 启动 Jenkins CI/CD
|
||||
```bash
|
||||
./start-services.sh start-jenkins
|
||||
```
|
||||
|
||||
## 服务访问地址
|
||||
|
||||
### 📱 业务应用
|
||||
| 服务 | 本地访问 | 远程访问 | 说明 |
|
||||
|------|---------|---------|------|
|
||||
| 后端 API | http://localhost:9998 | http://192.168.1.83:9998 | Spring Boot 后端服务 |
|
||||
| 管理界面 | http://localhost:5173 | http://192.168.1.83:5173 | Vue 3 管理后台 |
|
||||
| 大屏服务 | http://localhost:5001 | http://192.168.1.83:5001 | 数据可视化大屏 |
|
||||
|
||||
### 🔧 基础设施
|
||||
| 服务 | 本地访问 | 远程访问 | 凭据 |
|
||||
|------|---------|---------|------|
|
||||
| MySQL | localhost:3306 | 192.168.1.83:3306 | root/root123456 |
|
||||
| Redis | localhost:6379 | 192.168.1.83:6379 | password: redis123456 |
|
||||
|
||||
### 📊 监控系统
|
||||
| 服务 | 本地访问 | 远程访问 | 凭据 |
|
||||
|------|---------|---------|------|
|
||||
| Grafana | http://localhost:3001 | http://192.168.1.83:3001 | admin/admin123 |
|
||||
| Prometheus | http://localhost:9091 | http://192.168.1.83:9091 | - |
|
||||
| Alertmanager | http://localhost:9094 | http://192.168.1.83:9094 | - |
|
||||
| Loki | http://localhost:3100 | http://192.168.1.83:3100 | - |
|
||||
|
||||
### 🚀 CI/CD
|
||||
| 服务 | 本地访问 | 远程访问 | 凭据 |
|
||||
|------|---------|---------|------|
|
||||
| Jenkins | http://localhost:38080 | http://192.168.1.83:38080 | admin/admin123 |
|
||||
| Gitea | http://localhost:3000 | http://192.168.1.83:3000 | - |
|
||||
| Registry | http://localhost:15000 | http://192.168.1.83:15000 | - |
|
||||
|
||||
## 常用命令
|
||||
|
||||
### 服务管理
|
||||
```bash
|
||||
# 查看服务状态
|
||||
./start-services.sh status
|
||||
|
||||
# 停止所有服务
|
||||
./start-services.sh stop
|
||||
|
||||
# 重启服务
|
||||
./start-services.sh restart
|
||||
|
||||
# 查看服务日志
|
||||
./start-services.sh logs ljwx-boot
|
||||
./start-services.sh logs ljwx-admin
|
||||
./start-services.sh logs ljwx-bigscreen
|
||||
```
|
||||
|
||||
### 健康检查
|
||||
```bash
|
||||
# 执行健康检查
|
||||
./start-services.sh health
|
||||
|
||||
# 检查防火墙状态
|
||||
./start-services.sh firewall
|
||||
|
||||
# 显示访问地址
|
||||
./start-services.sh access
|
||||
```
|
||||
|
||||
### 快速访问
|
||||
```bash
|
||||
# 打开管理界面
|
||||
./start-services.sh open admin
|
||||
|
||||
# 打开大屏
|
||||
./start-services.sh open bigscreen
|
||||
|
||||
# 打开监控面板
|
||||
./start-services.sh open grafana
|
||||
|
||||
# 打开 Jenkins
|
||||
./start-services.sh open jenkins
|
||||
```
|
||||
|
||||
## 远程访问配置
|
||||
|
||||
### macOS 防火墙设置
|
||||
|
||||
1. **打开系统偏好设置**
|
||||
```
|
||||
系统偏好设置 -> 安全性与隐私 -> 防火墙
|
||||
```
|
||||
|
||||
2. **防火墙选项**
|
||||
- 点击"防火墙选项"
|
||||
- 确保 "Docker" 或 "com.docker.backend" 被允许接受传入连接
|
||||
- 如果没有,点击"+"添加 Docker
|
||||
|
||||
3. **验证防火墙状态**
|
||||
```bash
|
||||
./start-services.sh firewall
|
||||
```
|
||||
|
||||
### Docker 端口绑定说明
|
||||
|
||||
所有服务默认已绑定到 `0.0.0.0`,这意味着:
|
||||
- ✅ 可以从局域网内任何设备访问
|
||||
- ✅ 可以通过本机IP地址访问
|
||||
- ✅ 支持多网卡环境
|
||||
|
||||
端口绑定格式:
|
||||
```yaml
|
||||
ports:
|
||||
- "9998:9998" # 等同于 0.0.0.0:9998:9998
|
||||
```
|
||||
|
||||
### 局域网访问测试
|
||||
|
||||
从局域网内其他设备测试:
|
||||
|
||||
```bash
|
||||
# 测试后端API
|
||||
curl http://192.168.1.83:9998/actuator/health
|
||||
|
||||
# 测试前端(浏览器)
|
||||
# 打开: http://192.168.1.83:5173
|
||||
|
||||
# 测试MySQL连接
|
||||
mysql -h 192.168.1.83 -P 3306 -u root -p
|
||||
```
|
||||
|
||||
### 外网访问(可选)
|
||||
|
||||
如需从公网访问,需要配置路由器端口转发:
|
||||
|
||||
1. 登录路由器管理界面
|
||||
2. 找到"端口转发"或"虚拟服务器"设置
|
||||
3. 添加端口映射规则:
|
||||
```
|
||||
外部端口 -> 内部IP(192.168.1.83):内部端口
|
||||
```
|
||||
4. 使用公网IP或DDNS域名访问
|
||||
|
||||
⚠️ **安全警告**:
|
||||
- 不建议直接暴露数据库端口到公网
|
||||
- 使用 VPN 或 SSH 隧道更安全
|
||||
- 配置强密码和访问控制
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: 远程无法访问服务
|
||||
```bash
|
||||
# 1. 检查服务是否启动
|
||||
./start-services.sh status
|
||||
|
||||
# 2. 检查端口监听
|
||||
netstat -an | grep LISTEN | grep 9998
|
||||
|
||||
# 3. 检查防火墙
|
||||
./start-services.sh firewall
|
||||
|
||||
# 4. 检查本机IP
|
||||
ifconfig | grep "inet " | grep -v 127.0.0.1
|
||||
```
|
||||
|
||||
### Q2: Docker 服务无法启动
|
||||
```bash
|
||||
# 查看详细日志
|
||||
./start-services.sh logs [service-name]
|
||||
|
||||
# 重启Docker Desktop
|
||||
# 或者重启服务
|
||||
./start-services.sh restart
|
||||
```
|
||||
|
||||
### Q3: 端口冲突
|
||||
```bash
|
||||
# 查看端口占用
|
||||
lsof -i :9998
|
||||
|
||||
# 修改 docker-compose.yml 中的端口映射
|
||||
# 例如: "9999:9998" 将外部端口改为9999
|
||||
```
|
||||
|
||||
### Q4: 健康检查失败
|
||||
```bash
|
||||
# 执行完整健康检查
|
||||
./start-services.sh health
|
||||
|
||||
# 查看具体服务日志
|
||||
docker logs ljwx-boot
|
||||
docker logs ljwx-mysql
|
||||
docker logs ljwx-redis
|
||||
```
|
||||
|
||||
## 安全建议
|
||||
|
||||
### 生产环境部署
|
||||
1. ✅ 修改所有默认密码
|
||||
2. ✅ 配置 SSL/TLS 证书
|
||||
3. ✅ 使用反向代理(Nginx/Traefik)
|
||||
4. ✅ 启用访问日志和审计
|
||||
5. ✅ 配置防火墙规则
|
||||
6. ✅ 定期备份数据
|
||||
|
||||
### 密码修改
|
||||
编辑 `.env` 文件或 docker-compose.yml:
|
||||
```env
|
||||
MYSQL_ROOT_PASSWORD=your_secure_password
|
||||
MYSQL_PASSWORD=your_secure_password
|
||||
REDIS_PASSWORD=your_secure_password
|
||||
```
|
||||
|
||||
### 网络隔离
|
||||
```yaml
|
||||
# docker-compose.yml 中使用内部网络
|
||||
networks:
|
||||
ljwx-network:
|
||||
driver: bridge
|
||||
internal: false # 改为 true 可禁止外部访问
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 资源限制
|
||||
在 docker-compose.yml 中添加:
|
||||
```yaml
|
||||
services:
|
||||
ljwx-boot:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '2'
|
||||
memory: 2G
|
||||
reservations:
|
||||
cpus: '1'
|
||||
memory: 1G
|
||||
```
|
||||
|
||||
### 日志管理
|
||||
```yaml
|
||||
services:
|
||||
ljwx-boot:
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
||||
## 监控和运维
|
||||
|
||||
### 查看实时资源使用
|
||||
```bash
|
||||
docker stats
|
||||
|
||||
# 查看特定服务
|
||||
docker stats ljwx-boot ljwx-mysql ljwx-redis
|
||||
```
|
||||
|
||||
### 数据备份
|
||||
```bash
|
||||
# MySQL 备份
|
||||
docker exec ljwx-mysql mysqldump -u root -p ljwx > backup.sql
|
||||
|
||||
# Redis 备份
|
||||
docker exec ljwx-redis redis-cli -a redis123456 SAVE
|
||||
docker cp ljwx-redis:/data/dump.rdb ./backup/
|
||||
```
|
||||
|
||||
### 日志查看
|
||||
```bash
|
||||
# 实时日志
|
||||
docker logs -f ljwx-boot
|
||||
|
||||
# 最近100行
|
||||
docker logs --tail 100 ljwx-boot
|
||||
|
||||
# 带时间戳
|
||||
docker logs -t ljwx-boot
|
||||
```
|
||||
|
||||
## 技术支持
|
||||
|
||||
- 📚 完整文档:[CLAUDE.md](./CLAUDE.md)
|
||||
- 🔧 Jenkins管理:[jenkins-manager.sh](./jenkins-manager.sh)
|
||||
- 🚀 快速启动:`./start-services.sh help`
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Executable
+129
@@ -0,0 +1,129 @@
|
||||
#!/bin/bash
|
||||
# 构建多平台基础镜像 - 简化版本
|
||||
# 分别为每个平台构建,然后创建 manifest list
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
REGISTRY="localhost:15000"
|
||||
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||
VERSION="1.0.0"
|
||||
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo -e "${BLUE}🏗️ 构建基础镜像 (多平台) - v2${NC}"
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo ""
|
||||
|
||||
# ==== Java Maven 基础镜像 ====
|
||||
echo -e "${BLUE}📦 构建 Java Maven 基础镜像...${NC}"
|
||||
|
||||
# AMD64
|
||||
echo -e "${YELLOW}构建 linux/amd64...${NC}"
|
||||
docker buildx build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64 \
|
||||
-f Dockerfile.java-maven-base \
|
||||
--load \
|
||||
.
|
||||
|
||||
# ARM64
|
||||
echo -e "${YELLOW}构建 linux/arm64...${NC}"
|
||||
docker buildx build \
|
||||
--platform linux/arm64 \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64 \
|
||||
-f Dockerfile.java-maven-base \
|
||||
--load \
|
||||
.
|
||||
|
||||
# 推送单独的架构镜像
|
||||
echo -e "${YELLOW}推送架构特定镜像到 Registry...${NC}"
|
||||
docker push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64
|
||||
docker push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64
|
||||
|
||||
# 创建并推送 manifest list
|
||||
echo -e "${YELLOW}创建并推送 manifest list...${NC}"
|
||||
docker manifest create $REGISTRY/ljwx/java-maven-base:21-jdk-alpine \
|
||||
--amend $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64 \
|
||||
--amend $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
|
||||
# 创建 latest 标签
|
||||
docker manifest create $REGISTRY/ljwx/java-maven-base:latest \
|
||||
--amend $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64 \
|
||||
--amend $REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/java-maven-base:latest
|
||||
|
||||
echo -e "${GREEN}✅ Java Maven 基础镜像完成${NC}"
|
||||
echo ""
|
||||
|
||||
# ==== Python 基础镜像 ====
|
||||
echo -e "${BLUE}📦 构建 Python 基础镜像...${NC}"
|
||||
|
||||
# AMD64
|
||||
echo -e "${YELLOW}构建 linux/amd64...${NC}"
|
||||
docker buildx build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/python-base:3.12-slim-amd64 \
|
||||
-f Dockerfile.python-base \
|
||||
--load \
|
||||
.
|
||||
|
||||
# ARM64
|
||||
echo -e "${YELLOW}构建 linux/arm64...${NC}"
|
||||
docker buildx build \
|
||||
--platform linux/arm64 \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/python-base:3.12-slim-arm64 \
|
||||
-f Dockerfile.python-base \
|
||||
--load \
|
||||
.
|
||||
|
||||
# 推送单独的架构镜像
|
||||
echo -e "${YELLOW}推送架构特定镜像到 Registry...${NC}"
|
||||
docker push $REGISTRY/ljwx/python-base:3.12-slim-amd64
|
||||
docker push $REGISTRY/ljwx/python-base:3.12-slim-arm64
|
||||
|
||||
# 创建并推送 manifest list
|
||||
echo -e "${YELLOW}创建并推送 manifest list...${NC}"
|
||||
docker manifest create $REGISTRY/ljwx/python-base:3.12-slim \
|
||||
--amend $REGISTRY/ljwx/python-base:3.12-slim-amd64 \
|
||||
--amend $REGISTRY/ljwx/python-base:3.12-slim-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/python-base:3.12-slim
|
||||
|
||||
# 创建 latest 标签
|
||||
docker manifest create $REGISTRY/ljwx/python-base:latest \
|
||||
--amend $REGISTRY/ljwx/python-base:3.12-slim-amd64 \
|
||||
--amend $REGISTRY/ljwx/python-base:3.12-slim-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/python-base:latest
|
||||
|
||||
echo -e "${GREEN}✅ Python 基础镜像完成${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo -e "${GREEN}🎉 所有基础镜像构建完成!${NC}"
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo ""
|
||||
echo "基础镜像列表 (多平台: linux/amd64, linux/arm64):"
|
||||
echo " - $REGISTRY/ljwx/java-maven-base:21-jdk-alpine"
|
||||
echo " - $REGISTRY/ljwx/python-base:3.12-slim"
|
||||
echo ""
|
||||
echo "验证多平台支持:"
|
||||
echo " docker manifest inspect $REGISTRY/ljwx/java-maven-base:21-jdk-alpine"
|
||||
echo " docker manifest inspect $REGISTRY/ljwx/python-base:3.12-slim"
|
||||
echo ""
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
# 构建所有基础镜像 - 只需运行一次,以后复用
|
||||
# 支持多平台构建 (linux/amd64, linux/arm64)
|
||||
|
||||
set -e
|
||||
|
||||
@@ -9,63 +10,106 @@ BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
REGISTRY="${PRIVATE_REGISTRY:-localhost:15000}"
|
||||
REGISTRY="${PRIVATE_REGISTRY:-127.0.0.1:15000}"
|
||||
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||
VERSION="1.0.0"
|
||||
PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}"
|
||||
BUILDER_NAME="multiarch-builder"
|
||||
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo -e "${BLUE}🏗️ 构建基础镜像${NC}"
|
||||
echo -e "${BLUE}🏗️ 构建基础镜像 (多平台)${NC}"
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo -e "${YELLOW}📊 目标平台: $PLATFORMS${NC}"
|
||||
echo -e "${YELLOW}📊 Registry: $REGISTRY${NC}"
|
||||
echo ""
|
||||
|
||||
# 初始化多架构构建器(支持insecure registry)
|
||||
echo -e "${BLUE}🔧 初始化多架构构建器...${NC}"
|
||||
if docker buildx inspect $BUILDER_NAME >/dev/null 2>&1; then
|
||||
echo -e "${YELLOW}移除现有构建器...${NC}"
|
||||
docker buildx rm $BUILDER_NAME
|
||||
fi
|
||||
|
||||
# 获取 buildkitd 配置文件的绝对路径
|
||||
BUILDKITD_CONFIG="$(cd "$(dirname "$0")" && pwd)/buildkitd.toml"
|
||||
echo -e "${YELLOW}使用 buildkitd 配置: $BUILDKITD_CONFIG${NC}"
|
||||
|
||||
docker buildx create \
|
||||
--name $BUILDER_NAME \
|
||||
--driver docker-container \
|
||||
--buildkitd-flags '--allow-insecure-entitlement network.host' \
|
||||
--config "$BUILDKITD_CONFIG" \
|
||||
--use
|
||||
|
||||
docker buildx inspect --bootstrap
|
||||
echo -e "${GREEN}✅ 构建器就绪${NC}"
|
||||
echo ""
|
||||
|
||||
# Java Maven 基础镜像
|
||||
echo -e "${BLUE}📦 构建 Java Maven 基础镜像...${NC}"
|
||||
docker build \
|
||||
echo -e "${BLUE}📦 构建 Java Maven 基础镜像 (多平台)...${NC}"
|
||||
echo -e "${YELLOW}步骤 1/2: 构建镜像...${NC}"
|
||||
|
||||
# 先构建到本地缓存(输出为 OCI 镜像)
|
||||
docker buildx build \
|
||||
--platform $PLATFORMS \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/java-maven-base:21-jdk-alpine \
|
||||
-t $REGISTRY/ljwx/java-maven-base:latest \
|
||||
-t ljwx/java-maven-base:21-jdk-alpine \
|
||||
-t ljwx/java-maven-base:latest \
|
||||
-f Dockerfile.java-maven-base \
|
||||
--output type=oci,dest=/tmp/java-maven-base.tar \
|
||||
.
|
||||
|
||||
echo -e "${GREEN}✅ Java Maven 基础镜像构建完成${NC}"
|
||||
echo -e "${YELLOW}步骤 2/2: 推送到 Registry...${NC}"
|
||||
# 加载并重新标记
|
||||
docker load -i /tmp/java-maven-base.tar
|
||||
docker tag ljwx/java-maven-base:21-jdk-alpine $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
docker tag ljwx/java-maven-base:latest $REGISTRY/ljwx/java-maven-base:latest
|
||||
docker push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
docker push $REGISTRY/ljwx/java-maven-base:latest
|
||||
|
||||
echo -e "${GREEN}✅ Java Maven 基础镜像构建并推送完成${NC}"
|
||||
echo ""
|
||||
|
||||
# Python 基础镜像
|
||||
echo -e "${BLUE}📦 构建 Python 基础镜像...${NC}"
|
||||
docker build \
|
||||
echo -e "${BLUE}📦 构建 Python 基础镜像 (多平台)...${NC}"
|
||||
echo -e "${YELLOW}步骤 1/2: 构建镜像...${NC}"
|
||||
|
||||
docker buildx build \
|
||||
--platform $PLATFORMS \
|
||||
--build-arg BUILD_DATE="$BUILD_DATE" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
-t $REGISTRY/ljwx/python-base:3.12-slim \
|
||||
-t $REGISTRY/ljwx/python-base:latest \
|
||||
-t ljwx/python-base:3.12-slim \
|
||||
-t ljwx/python-base:latest \
|
||||
-f Dockerfile.python-base \
|
||||
--output type=oci,dest=/tmp/python-base.tar \
|
||||
.
|
||||
|
||||
echo -e "${GREEN}✅ Python 基础镜像构建完成${NC}"
|
||||
echo ""
|
||||
|
||||
# 推送到本地 Registry
|
||||
echo -e "${BLUE}🚀 推送基础镜像到本地 Registry...${NC}"
|
||||
|
||||
docker push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
docker push $REGISTRY/ljwx/java-maven-base:latest
|
||||
echo -e "${GREEN}✅ Java Maven 基础镜像已推送${NC}"
|
||||
|
||||
echo -e "${YELLOW}步骤 2/2: 推送到 Registry...${NC}"
|
||||
docker load -i /tmp/python-base.tar
|
||||
docker tag ljwx/python-base:3.12-slim $REGISTRY/ljwx/python-base:3.12-slim
|
||||
docker tag ljwx/python-base:latest $REGISTRY/ljwx/python-base:latest
|
||||
docker push $REGISTRY/ljwx/python-base:3.12-slim
|
||||
docker push $REGISTRY/ljwx/python-base:latest
|
||||
echo -e "${GREEN}✅ Python 基础镜像已推送${NC}"
|
||||
|
||||
echo -e "${GREEN}✅ Python 基础镜像构建并推送完成${NC}"
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo -e "${GREEN}🎉 所有基础镜像构建完成!${NC}"
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo ""
|
||||
echo "基础镜像列表:"
|
||||
echo "基础镜像列表 (多平台: $PLATFORMS):"
|
||||
echo " - $REGISTRY/ljwx/java-maven-base:21-jdk-alpine"
|
||||
echo " - $REGISTRY/ljwx/python-base:3.12-slim"
|
||||
echo ""
|
||||
echo "这些镜像会被业务镜像复用,大幅加速构建速度"
|
||||
echo ""
|
||||
echo "查看镜像:"
|
||||
echo "验证多平台支持:"
|
||||
echo " docker buildx imagetools inspect $REGISTRY/ljwx/java-maven-base:21-jdk-alpine"
|
||||
echo " docker buildx imagetools inspect $REGISTRY/ljwx/python-base:3.12-slim"
|
||||
echo ""
|
||||
echo "查看本地镜像:"
|
||||
echo " docker images | grep ljwx.*base"
|
||||
echo ""
|
||||
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
# 直接使用 buildx 构建并推送多平台基础镜像
|
||||
set -e
|
||||
|
||||
REGISTRY="localhost:15000"
|
||||
PLATFORMS="linux/amd64,linux/arm64"
|
||||
|
||||
echo "🏗️ 构建多平台基础镜像"
|
||||
echo "📊 平台: $PLATFORMS"
|
||||
echo ""
|
||||
|
||||
# 初始化 buildx
|
||||
if ! docker buildx inspect default >/dev/null 2>&1; then
|
||||
docker buildx use default
|
||||
fi
|
||||
|
||||
# Java Maven 基础镜像
|
||||
echo "📦 构建 Java Maven 基础镜像..."
|
||||
docker buildx build \
|
||||
--platform $PLATFORMS \
|
||||
--build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
|
||||
--build-arg VERSION="1.0.0" \
|
||||
-t $REGISTRY/ljwx/java-maven-base:21-jdk-alpine \
|
||||
-t $REGISTRY/ljwx/java-maven-base:latest \
|
||||
-f Dockerfile.java-maven-base \
|
||||
--push \
|
||||
.
|
||||
|
||||
echo "✅ Java Maven 基础镜像完成"
|
||||
echo ""
|
||||
|
||||
# 验证
|
||||
echo "🔍 验证多平台支持..."
|
||||
docker buildx imagetools inspect $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
|
||||
echo ""
|
||||
echo "🎉 完成!"
|
||||
@@ -0,0 +1,7 @@
|
||||
[registry."127.0.0.1:15000"]
|
||||
http = true
|
||||
insecure = true
|
||||
|
||||
[registry."localhost:15000"]
|
||||
http = true
|
||||
insecure = true
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
REGISTRY="localhost:15000"
|
||||
|
||||
echo "🔨 创建多平台 manifest lists..."
|
||||
|
||||
# Java Maven Base
|
||||
echo "📦 创建 Java Maven Base manifest..."
|
||||
docker manifest rm $REGISTRY/ljwx/java-maven-base:21-jdk-alpine 2>/dev/null || true
|
||||
docker manifest create $REGISTRY/ljwx/java-maven-base:21-jdk-alpine \
|
||||
$REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64 \
|
||||
$REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/java-maven-base:21-jdk-alpine
|
||||
|
||||
docker manifest rm $REGISTRY/ljwx/java-maven-base:latest 2>/dev/null || true
|
||||
docker manifest create $REGISTRY/ljwx/java-maven-base:latest \
|
||||
$REGISTRY/ljwx/java-maven-base:21-jdk-alpine-amd64 \
|
||||
$REGISTRY/ljwx/java-maven-base:21-jdk-alpine-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/java-maven-base:latest
|
||||
|
||||
echo "✅ Java Maven Base manifest 创建完成"
|
||||
|
||||
# Python Base
|
||||
echo "📦 创建 Python Base manifest..."
|
||||
docker manifest rm $REGISTRY/ljwx/python-base:3.12-slim 2>/dev/null || true
|
||||
docker manifest create $REGISTRY/ljwx/python-base:3.12-slim \
|
||||
$REGISTRY/ljwx/python-base:3.12-slim-amd64 \
|
||||
$REGISTRY/ljwx/python-base:3.12-slim-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/python-base:3.12-slim
|
||||
|
||||
docker manifest rm $REGISTRY/ljwx/python-base:latest 2>/dev/null || true
|
||||
docker manifest create $REGISTRY/ljwx/python-base:latest \
|
||||
$REGISTRY/ljwx/python-base:3.12-slim-amd64 \
|
||||
$REGISTRY/ljwx/python-base:3.12-slim-arm64
|
||||
|
||||
docker manifest push $REGISTRY/ljwx/python-base:latest
|
||||
|
||||
echo "✅ Python Base manifest 创建完成"
|
||||
|
||||
echo ""
|
||||
echo "🎉 所有 manifest lists 创建完成!"
|
||||
echo ""
|
||||
echo "验证:"
|
||||
echo " docker manifest inspect $REGISTRY/ljwx/java-maven-base:21-jdk-alpine"
|
||||
echo " docker manifest inspect $REGISTRY/ljwx/python-base:3.12-slim"
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,24 +0,0 @@
|
||||
import concurrent.futures
|
||||
|
||||
# 并行查询昨天数据 - 确保结果不为None
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
|
||||
yesterday_futures = {
|
||||
# 'health_count': executor.submit(query_yesterday_health), # 临时注释
|
||||
'alert_count': executor.submit(query_yesterday_alerts),
|
||||
'active_devices': executor.submit(query_yesterday_active_devices)
|
||||
}
|
||||
|
||||
yesterday_results = {}
|
||||
for key, future in yesterday_futures.items():
|
||||
try:
|
||||
result = future.result(timeout=2)
|
||||
yesterday_results[key] = result if result is not None else 0
|
||||
except:
|
||||
yesterday_results[key] = 0
|
||||
|
||||
yesterday_stats = {
|
||||
'healthData': yesterday_results['health_count'],
|
||||
'pendingAlerts': yesterday_results['alert_count'],
|
||||
'activeDevices': yesterday_results['active_devices'],
|
||||
'unreadMessages': results['message_count'] # 消息数据用今天的作为基准
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
python3.13
|
||||
BIN
Binary file not shown.
@@ -1 +0,0 @@
|
||||
python3.13
|
||||
BIN
Binary file not shown.
@@ -1 +0,0 @@
|
||||
/opt/homebrew/opt/[email protected]/bin/python3.13
|
||||
BIN
Binary file not shown.
@@ -6591,40 +6591,43 @@
|
||||
|
||||
function updateHealthDisplay(data) {
|
||||
healthData = data;
|
||||
|
||||
|
||||
console.log('🔄 更新健康数据显示:', data);
|
||||
|
||||
|
||||
// 更新心率 - 使用增强的3D图表
|
||||
updateGaugeValue(chartInstances.heartRateGauge, data.heartRate, 180);
|
||||
document.getElementById('heartRateValue').textContent = data.heartRate;
|
||||
updateHealthStatus('heartRate', data.heartRate, 60, 100);
|
||||
updateHealthCardStatus('heartRateCard', data.heartRate, 60, 100, 120);
|
||||
|
||||
|
||||
// 更新血氧 - 使用增强的3D图表
|
||||
updateGaugeValue(chartInstances.bloodOxygenGauge, data.bloodOxygen, 100);
|
||||
document.getElementById('bloodOxygenValue').textContent = data.bloodOxygen;
|
||||
updateHealthStatus('bloodOxygen', data.bloodOxygen, 95, 100);
|
||||
updateHealthCardStatus('bloodOxygenCard', data.bloodOxygen, 95, 100, 90);
|
||||
|
||||
|
||||
// 更新体温 - 使用增强的3D图表和医疗级温度范围
|
||||
const tempValue = parseFloat(data.temperature);
|
||||
updateGaugeValue(chartInstances.temperatureGauge, tempValue, 40);
|
||||
document.getElementById('temperatureValue').textContent = data.temperature;
|
||||
updateHealthStatus('temperature', tempValue, 36.1, 37.3);
|
||||
updateHealthCardStatus('temperatureCard', tempValue, 36.1, 37.3, 38.0);
|
||||
|
||||
|
||||
// 更新其他生命体征指标
|
||||
updateVitalSigns(data);
|
||||
|
||||
|
||||
// 更新健康统计和趋势分析
|
||||
updateHealthStatistics(data);
|
||||
|
||||
|
||||
// 更新健康综合评分
|
||||
updateHealthScore(data);
|
||||
|
||||
|
||||
// 更新波形图表数据
|
||||
updateWaveChart(data);
|
||||
|
||||
|
||||
// 🎯 同步更新实时生命体征图表,确保数值一致
|
||||
updateVitalSignsChart(data);
|
||||
|
||||
console.log('✅ 健康数据显示更新完成');
|
||||
}
|
||||
|
||||
@@ -9908,12 +9911,16 @@
|
||||
console.log('ℹ️ deviceSn为空,使用Mock健康数据');
|
||||
const mockData = generateMockHealthData();
|
||||
updateHealthDisplay(mockData);
|
||||
// 🎯 同步更新波形图,确保数值一致
|
||||
updateVitalSignsChart(mockData);
|
||||
return;
|
||||
}
|
||||
|
||||
// 🎯 先显示mock数据,确保页面有内容
|
||||
const mockData = generateMockHealthData();
|
||||
updateHealthDisplay(mockData);
|
||||
// 🎯 同步更新波形图,使用相同的mock数据,确保数值一致
|
||||
updateVitalSignsChart(mockData);
|
||||
|
||||
// 尝试获取真实数据
|
||||
fetch(`/api/health_data/latest?deviceSn=${deviceSn}`, {
|
||||
@@ -9925,10 +9932,10 @@
|
||||
if (result.success && result.data) {
|
||||
console.log('✅ 最新健康数据获取成功,使用真实数据:', result.data);
|
||||
|
||||
// 更新实时心率、血氧、体温显示
|
||||
// 更新实时心率、血氧、体温显示(仪表盘)
|
||||
updateRealTimeVitalSigns(result.data);
|
||||
|
||||
// 更新生命体征图表
|
||||
// 🎯 同步更新波形图,确保使用相同的数据源
|
||||
updateVitalSignsChart(result.data);
|
||||
|
||||
} else {
|
||||
@@ -10029,11 +10036,15 @@
|
||||
|
||||
// 在初始化后增强图表
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// 🎯 立即应用图表效果,移除延迟以加快页面加载
|
||||
setTimeout(() => {
|
||||
applyProfessionalTrendEffects();
|
||||
// 启动实时数据刷新
|
||||
}, 500); // 减少延迟到500ms
|
||||
|
||||
// 🎯 延迟启动API数据刷新,优先显示Mock数据
|
||||
setTimeout(() => {
|
||||
startRealTimeDataRefresh();
|
||||
}, 2000); // 等待图表初始化完成后再增强
|
||||
}, 5000); // 5秒后再启动API请求,让Mock数据先显示
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
@@ -27,7 +27,7 @@ APP_PORT = int(os.getenv('APP_PORT', 5225))
|
||||
DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
|
||||
|
||||
# UI定制化配置 - 客户可通过环境变量或配置文件定制
|
||||
BIGSCREEN_TITLE = os.getenv('BIGSCREEN_TITLE', '智能穿戴演示大屏') # 大屏标题
|
||||
BIGSCREEN_TITLE = os.getenv('BIGSCREEN_TITLE', '灵境万象AI智能穿戴平台') # 大屏标题
|
||||
COMPANY_NAME = os.getenv('COMPANY_NAME', '智能科技有限公司') # 公司名称
|
||||
COMPANY_LOGO_URL = os.getenv('COMPANY_LOGO_URL', '/static/images/logo.png') # 公司Logo路径
|
||||
THEME_COLOR = os.getenv('THEME_COLOR', '#1890ff') # 主题色
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
celery>=5.3.0
|
||||
redis>=4.5.0
|
||||
flower>=2.0.0 # Celery监控工具
|
||||
flower>=2.0.0 # Celery监控工具
|
||||
requests==2.31.0
|
||||
psutil==5.9.8 # 系统监控
|
||||
pymysql==1.1.0 # MySQL连接
|
||||
cryptography>=3.4.8 # MySQL认证支持
|
||||
prometheus-client==0.20.0 # Prometheus指标客户端
|
||||
schedule>=1.2.0 # 定时任务调度器
|
||||
numpy>=1.24.0 # 数值计算,用于基线统计
|
||||
numpy>=1.24.0 # 数值计算,用于基线统计
|
||||
python-dotenv>=1.0.0 # 环境变量管理
|
||||
@@ -1,13 +1,16 @@
|
||||
# ============================================
|
||||
# 优化的多阶段构建 Dockerfile
|
||||
# 优化的多阶段构建 Dockerfile - 多平台支持
|
||||
# 核心优化:
|
||||
# 1. 使用预构建的 Maven 基础镜像(避免每次 apk add maven)
|
||||
# 2. pom.xml 单独复制,利用 Maven 依赖缓存层
|
||||
# 3. BuildKit cache mount 缓存 ~/.m2(避免重复下载依赖)
|
||||
# 4. 分层构建:依赖层 + 代码层分离
|
||||
# 5. 多平台支持:linux/amd64, linux/arm64
|
||||
# ============================================
|
||||
|
||||
# ====== 构建阶段 ======
|
||||
# Docker buildx 会自动选择与目标平台匹配的基础镜像架构
|
||||
# 基础镜像已支持 linux/amd64 和 linux/arm64
|
||||
FROM localhost:15000/ljwx/java-maven-base:21-jdk-alpine AS builder
|
||||
|
||||
LABEL maintainer="[email protected]"
|
||||
|
||||
Executable
+429
@@ -0,0 +1,429 @@
|
||||
#!/bin/bash
|
||||
# LJWX 服务启动和管理脚本(支持远程访问)
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
G='\033[0;32m'
|
||||
Y='\033[1;33m'
|
||||
R='\033[0;31m'
|
||||
B='\033[0;34m'
|
||||
C='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
log() { echo -e "${G}[INFO]${NC} $1"; }
|
||||
warn() { echo -e "${Y}[WARN]${NC} $1"; }
|
||||
error() { echo -e "${R}[ERROR]${NC} $1"; }
|
||||
info() { echo -e "${B}[INFO]${NC} $1"; }
|
||||
highlight() { echo -e "${C}$1${NC}"; }
|
||||
|
||||
# 获取本机IP地址
|
||||
get_local_ip() {
|
||||
# 优先获取局域网IP
|
||||
local ip=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | grep "192.168" | head -n 1 | awk '{print $2}')
|
||||
if [[ -z "$ip" ]]; then
|
||||
ip="localhost"
|
||||
fi
|
||||
echo "$ip"
|
||||
}
|
||||
|
||||
LOCAL_IP=$(get_local_ip)
|
||||
BASE_DIR="/Users/brunogao/work/codes/shenye/release"
|
||||
|
||||
# 显示访问地址
|
||||
show_access_info() {
|
||||
echo ""
|
||||
highlight "============================================"
|
||||
highlight " LJWX 服务访问地址"
|
||||
highlight "============================================"
|
||||
echo ""
|
||||
|
||||
info "📱 业务应用:"
|
||||
echo " 后端 API: http://${LOCAL_IP}:9998"
|
||||
echo " 管理界面: http://${LOCAL_IP}:5173"
|
||||
echo " 大屏服务: http://${LOCAL_IP}:5001"
|
||||
echo ""
|
||||
|
||||
info "🔧 基础设施:"
|
||||
echo " MySQL: ${LOCAL_IP}:3306"
|
||||
echo " Redis: ${LOCAL_IP}:6379"
|
||||
echo ""
|
||||
|
||||
info "📊 监控系统:"
|
||||
echo " Grafana: http://${LOCAL_IP}:3001 (admin/admin123)"
|
||||
echo " Prometheus: http://${LOCAL_IP}:9091"
|
||||
echo " Alertmanager: http://${LOCAL_IP}:9094"
|
||||
echo " Loki: http://${LOCAL_IP}:3100"
|
||||
echo ""
|
||||
|
||||
info "🚀 CI/CD (如果已启动):"
|
||||
echo " Jenkins: http://${LOCAL_IP}:38080"
|
||||
echo " Gitea: http://${LOCAL_IP}:3000"
|
||||
echo " Registry: http://${LOCAL_IP}:15000"
|
||||
echo ""
|
||||
|
||||
highlight "============================================"
|
||||
echo ""
|
||||
warn "远程访问提示:"
|
||||
echo " 1. 确保防火墙允许相应端口访问"
|
||||
echo " 2. 在其他设备上使用 ${LOCAL_IP} 替代 localhost"
|
||||
echo " 3. 如需查看防火墙状态,运行: $0 firewall"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 启动开发环境
|
||||
start_dev() {
|
||||
log "启动开发环境(包含所有服务和监控)..."
|
||||
|
||||
cd "$BASE_DIR"
|
||||
docker-compose up -d
|
||||
|
||||
log "等待服务启动..."
|
||||
sleep 10
|
||||
|
||||
show_status
|
||||
show_access_info
|
||||
}
|
||||
|
||||
# 启动生产环境
|
||||
start_prod() {
|
||||
log "启动生产环境(使用本地Registry镜像)..."
|
||||
|
||||
cd "$BASE_DIR"
|
||||
|
||||
# 检查镜像是否存在
|
||||
if ! docker images | grep -q "localhost:15000/ljwx/ljwx-boot:2.0.3"; then
|
||||
warn "未找到生产镜像,请先运行 ./build-and-push.sh 构建镜像"
|
||||
echo -n "是否继续启动?(y/N): "
|
||||
read -r confirm
|
||||
if [[ $confirm != "y" && $confirm != "Y" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
|
||||
log "等待服务启动..."
|
||||
sleep 10
|
||||
|
||||
show_status_prod
|
||||
show_access_info_prod
|
||||
}
|
||||
|
||||
# 启动最小环境(仅基础设施)
|
||||
start_minimal() {
|
||||
log "启动最小环境(MySQL + Redis)..."
|
||||
|
||||
cd "$BASE_DIR"
|
||||
docker-compose up -d ljwx-mysql ljwx-redis
|
||||
|
||||
log "等待服务启动..."
|
||||
sleep 5
|
||||
|
||||
show_status
|
||||
info "基础设施已启动"
|
||||
echo " MySQL: ${LOCAL_IP}:3306"
|
||||
echo " Redis: ${LOCAL_IP}:6379"
|
||||
}
|
||||
|
||||
# 启动Jenkins CI/CD
|
||||
start_jenkins() {
|
||||
log "启动Jenkins CI/CD环境..."
|
||||
|
||||
# 创建网络
|
||||
docker network create cicd-network 2>/dev/null || true
|
||||
|
||||
cd "$BASE_DIR"
|
||||
docker-compose -f docker/compose/jenkins-simple.yml up -d
|
||||
|
||||
log "等待Jenkins启动..."
|
||||
for i in {1..30}; do
|
||||
if curl -sf "http://localhost:38080" &>/dev/null; then
|
||||
log "✅ Jenkins启动成功!"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
echo -n "."
|
||||
done
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
info "Jenkins访问地址:"
|
||||
echo " 本地: http://localhost:38080"
|
||||
echo " 远程: http://${LOCAL_IP}:38080"
|
||||
echo " 用户: admin / admin123"
|
||||
}
|
||||
|
||||
# 显示状态
|
||||
show_status() {
|
||||
echo ""
|
||||
highlight "==================== 服务状态 ===================="
|
||||
cd "$BASE_DIR"
|
||||
docker-compose ps
|
||||
echo ""
|
||||
}
|
||||
|
||||
show_status_prod() {
|
||||
echo ""
|
||||
highlight "==================== 服务状态(生产环境)===================="
|
||||
cd "$BASE_DIR"
|
||||
docker-compose -f docker-compose.prod.yml ps
|
||||
echo ""
|
||||
}
|
||||
|
||||
show_access_info_prod() {
|
||||
echo ""
|
||||
highlight "============================================"
|
||||
highlight " 生产环境访问地址"
|
||||
highlight "============================================"
|
||||
echo ""
|
||||
|
||||
info "📱 业务应用:"
|
||||
echo " 后端 API: http://${LOCAL_IP}:9998"
|
||||
echo " 管理界面: http://${LOCAL_IP}:8080"
|
||||
echo " 大屏服务: http://${LOCAL_IP}:8000"
|
||||
echo ""
|
||||
|
||||
info "🔧 基础设施:"
|
||||
echo " MySQL: ${LOCAL_IP}:3307 (root/123456)"
|
||||
echo " Redis: ${LOCAL_IP}:6379"
|
||||
echo ""
|
||||
|
||||
highlight "============================================"
|
||||
}
|
||||
|
||||
# 停止服务
|
||||
stop_services() {
|
||||
log "停止所有服务..."
|
||||
|
||||
cd "$BASE_DIR"
|
||||
|
||||
# 停止主服务
|
||||
if [[ -f docker-compose.yml ]]; then
|
||||
docker-compose down
|
||||
fi
|
||||
|
||||
# 停止生产环境
|
||||
if [[ -f docker-compose.prod.yml ]]; then
|
||||
docker-compose -f docker-compose.prod.yml down
|
||||
fi
|
||||
|
||||
# 停止Jenkins
|
||||
if [[ -f docker/compose/jenkins-simple.yml ]]; then
|
||||
docker-compose -f docker/compose/jenkins-simple.yml down
|
||||
fi
|
||||
|
||||
log "✅ 所有服务已停止"
|
||||
}
|
||||
|
||||
# 重启服务
|
||||
restart_services() {
|
||||
log "重启服务..."
|
||||
stop_services
|
||||
sleep 2
|
||||
start_dev
|
||||
}
|
||||
|
||||
# 查看日志
|
||||
show_logs() {
|
||||
local service="${1:-ljwx-boot}"
|
||||
log "显示 ${service} 日志(按Ctrl+C退出)..."
|
||||
cd "$BASE_DIR"
|
||||
docker-compose logs -f "$service"
|
||||
}
|
||||
|
||||
# 检查防火墙
|
||||
check_firewall() {
|
||||
echo ""
|
||||
highlight "==================== 防火墙检查 ===================="
|
||||
echo ""
|
||||
|
||||
info "macOS 防火墙状态:"
|
||||
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
|
||||
echo ""
|
||||
|
||||
info "监听的端口:"
|
||||
netstat -an | grep LISTEN | grep -E ":(3306|6379|9998|5173|5001|3001|9091|38080)" || echo "未发现服务监听"
|
||||
echo ""
|
||||
|
||||
warn "如需允许远程访问,请确保:"
|
||||
echo " 1. 系统偏好设置 -> 安全性与隐私 -> 防火墙 -> 防火墙选项"
|
||||
echo " 2. 允许 Docker 接受传入连接"
|
||||
echo " 3. 路由器需要配置端口转发(如需外网访问)"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 健康检查
|
||||
health_check() {
|
||||
log "执行健康检查..."
|
||||
echo ""
|
||||
|
||||
local status=0
|
||||
|
||||
# 检查Docker
|
||||
if docker info &>/dev/null; then
|
||||
log "✅ Docker 服务正常"
|
||||
else
|
||||
error "❌ Docker 服务异常"
|
||||
((status++))
|
||||
fi
|
||||
|
||||
# 检查各服务
|
||||
check_service() {
|
||||
local name=$1
|
||||
local url=$2
|
||||
|
||||
if curl -sf "$url" &>/dev/null; then
|
||||
log "✅ $name 服务正常"
|
||||
else
|
||||
warn "⚠️ $name 服务异常或未启动"
|
||||
fi
|
||||
}
|
||||
|
||||
check_service "ljwx-boot" "http://localhost:9998/actuator/health"
|
||||
check_service "ljwx-admin" "http://localhost:5173"
|
||||
check_service "ljwx-bigscreen" "http://localhost:5001"
|
||||
check_service "Grafana" "http://localhost:3001"
|
||||
check_service "Prometheus" "http://localhost:9091"
|
||||
|
||||
echo ""
|
||||
if [[ $status -eq 0 ]]; then
|
||||
log "🎉 核心服务健康"
|
||||
else
|
||||
error "❌ 发现问题,请检查"
|
||||
fi
|
||||
}
|
||||
|
||||
# 快速访问
|
||||
quick_open() {
|
||||
local target="${1:-admin}"
|
||||
local url=""
|
||||
|
||||
case "$target" in
|
||||
"admin"|"管理")
|
||||
url="http://localhost:5173"
|
||||
;;
|
||||
"bigscreen"|"大屏")
|
||||
url="http://localhost:5001"
|
||||
;;
|
||||
"grafana"|"监控")
|
||||
url="http://localhost:3001"
|
||||
;;
|
||||
"jenkins")
|
||||
url="http://localhost:38080"
|
||||
;;
|
||||
"prometheus")
|
||||
url="http://localhost:9091"
|
||||
;;
|
||||
*)
|
||||
error "未知服务: $target"
|
||||
echo "可用服务: admin, bigscreen, grafana, jenkins, prometheus"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
log "打开 $target: $url"
|
||||
open "$url" 2>/dev/null || echo "请手动访问: $url"
|
||||
}
|
||||
|
||||
# 显示帮助
|
||||
show_help() {
|
||||
cat << EOF
|
||||
LJWX 服务管理脚本 - 支持远程访问
|
||||
|
||||
用法: $0 [命令]
|
||||
|
||||
命令:
|
||||
start 启动开发环境(默认,包含所有服务)
|
||||
start-prod 启动生产环境
|
||||
start-minimal 启动最小环境(仅MySQL和Redis)
|
||||
start-jenkins 启动Jenkins CI/CD
|
||||
|
||||
stop 停止所有服务
|
||||
restart 重启服务
|
||||
status 显示服务状态
|
||||
|
||||
logs [service] 查看服务日志(默认:ljwx-boot)
|
||||
health 健康检查
|
||||
firewall 检查防火墙状态
|
||||
access 显示访问地址
|
||||
|
||||
open [service] 快速打开服务页面
|
||||
可选: admin, bigscreen, grafana, jenkins, prometheus
|
||||
|
||||
help 显示此帮助信息
|
||||
|
||||
示例:
|
||||
$0 start # 启动所有服务
|
||||
$0 status # 查看状态
|
||||
$0 logs ljwx-boot # 查看后端日志
|
||||
$0 open admin # 打开管理界面
|
||||
$0 firewall # 检查防火墙
|
||||
|
||||
远程访问:
|
||||
本机IP: ${LOCAL_IP}
|
||||
所有服务已绑定到 0.0.0.0,可通过局域网IP访问
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# 主程序
|
||||
main() {
|
||||
local command="${1:-start}"
|
||||
|
||||
case "$command" in
|
||||
"start")
|
||||
start_dev
|
||||
;;
|
||||
"start-prod"|"prod")
|
||||
start_prod
|
||||
;;
|
||||
"start-minimal"|"minimal")
|
||||
start_minimal
|
||||
;;
|
||||
"start-jenkins"|"jenkins")
|
||||
start_jenkins
|
||||
;;
|
||||
"stop")
|
||||
stop_services
|
||||
;;
|
||||
"restart")
|
||||
restart_services
|
||||
;;
|
||||
"status")
|
||||
show_status
|
||||
;;
|
||||
"logs")
|
||||
show_logs "${2:-ljwx-boot}"
|
||||
;;
|
||||
"health")
|
||||
health_check
|
||||
;;
|
||||
"firewall")
|
||||
check_firewall
|
||||
;;
|
||||
"access"|"info")
|
||||
show_access_info
|
||||
;;
|
||||
"open")
|
||||
quick_open "${2:-admin}"
|
||||
;;
|
||||
"help"|"-h"|"--help")
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
warn "未知命令: $command"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 检查Docker是否运行
|
||||
if ! docker info &>/dev/null; then
|
||||
error "Docker未运行,请先启动Docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 执行主程序
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user