一个基于NestJS生成图表的服务,集成MinIO对象存储,支持22种以上的图表类型服务器端渲染。
基础图表线形图(line chart)、面积图(area chart)、柱状图(column chart)、条形图(bar chart)、饼图(pie chart)、散点图(scatter plot)
高级图表直方图(histogram)、箱型图(box plot)、雷达图(radar chart)、漏斗图(funnel chart)、树状图(treemap)、桑基图(Sankey diagram)、词云图(word cloud)、双轴图(dual-axis chart)、液态图(liquid chart)、小提琴图(violin plot)、韦恩图(Venn diagram)
关系图思维导图、组织结构图、流程图、鱼骨图、网络图
适用场景:生产环境、虚拟机部署、一键启动完整服务
git clone <repository-url>
cd mcp-server-chart-minio
docker compose --env-file .env.docker up -d
重要配置参数说明(基于.env.production):
修改外部访问地址和凭证(必须)
创建或编辑.env.production至少设置:
PUBLIC_API_URL=http://YOUR_SERVER_IP:3000
MINIO_EXTERNAL_ENDPOINT=YOUR_SERVER_IP
MINIO_EXTERNAL_PORT=9000
MINIO_ROOT_USER=your_admin_user
MINIO_ROOT_PASSWORD=your_secure_pwd
MINIO_ACCESS_KEY=your_admin_user
MINIO_SECRET_KEY=your_secure_pwd
MINIO_AUTO_CREATE_BUCKET=false
端口配置(可选):
在.env.production中注释调整:
PORT 应用程序端口(默认 3000)MINIO_EXTERNAL_PORT MinIO外部端口(默认 9000)数据持久化: 默认使用Docker卷存储。要指定路径,在Compose中设置:
volumes:
- /your/data/path:/data # 替换为实际路径
Linux/macOS:
./deploy-production.sh
Windows:
deploy-production.bat
适用场景:本地开发、调试和代码修改
git clone <repository-url>
cd mcp-server-chart-minio
# macOS
brew install pkg-config cairo pango libpng jpeg giflib librsvg pixman
# Ubuntu/Debian
sudo apt-get install pkg-config libcairo2-dev libpango1.0-dev libpng-dev libjpeg-dev libgif-dev librsvg2-dev libpixman-1-dev
npm run docker:up:minio
# 或
docker compose -f docker-compose.minio.yml up -d
npm install
配置环境变量:
.env文件(用于本地开发)localhost:9000 MinIO启动开发服务器:
npm run start:dev
curl -X POST http://localhost:3000/api/chart-generators/line \
-H "Content-Type: application/json" \
-d '{
"data": [
{"time": "一月", "value": 100},
{"time": "二月", "value": 120},
{"time": "三月", "value": 140}
],
"title": "销售趋势图"
}'
curl -X POST http://localhost:3000/api/chart-generators/pie \
-H "Content-Type: application/json" \
-d '{
"data": [
{"category": "产品A", "value": 30},
{"category": "产品B", "value": 25},
{"category": "产品C", "value": 45}
],
"title": "市场份额"
}'
项目提供了两个环境配置文件:
| 文件 | 目的 | 使用场景 |
|---|---|---|
.env | 本地开发配置 | 本地运行应用 + 使用Docker运行MinIO |
.env.docker | 完整Docker部署配置 | 使用Docker Compose部署全服务 |
主要区别:
# .env (本地开发)
MINIO_ENDPOINT=localhost # 本地通过 localhost 访问 Docker 中的 MinIO
PORT=4000 # 开发端口
NODE_ENV=development
# .env.docker (Docker 部署)
MINIO_ENDPOINT=minio # 容器间通过服务名通信
PORT=3000 # 生产端口
NODE_ENV=production
使用说明:
# 本地开发
docker compose -f docker-compose.minio.yml up -d # 只启动 MinIO
npm run start:dev # 本地运行 app
# Docker 完整部署
docker compose --env-file .env.docker up -d # 启动所有服务
| 参数 | 默认值 | 描述 | 修改建议 |
|---|---|---|---|
PUBLIC_API_URL | http://localhost:3000 | API服务外部访问地址 | 生产环境中改为实际IP |
MINIO_EXTERNAL_ENDPOINT | localhost | MinIO外部访问地址 | 生产环境中改为实际IP |
MINIO_EXTERNAL_PORT | 9000 | MinIO外部访问端口 | 通常保持默认 |
| 参数 | 默认值 | 描述 | 修改建议 |
|---|---|---|---|
MINIO_ROOT_USER | minioadmin | MinIO管理员用户名 | 生产环境中必须修改 |
MINIO_ROOT_PASSWORD | minioadmin | MinIO管理员密码 | 生产环境中必须修改(至少8位,包含字母、数字和特殊字符) |
MINIO_BUCKET_NAME | charts 默认存储桶名称 | 根据需要修改 | |
MINIO_ACCESS_KEY | minioadmin | 应用访问MinIO账户 | 生产环境中必须修改 |
MINIO_SECRET_KEY | minioadmin | 应用访问MinIO密码 | 生产环境中必须修改 |
MINIO_AUTO_CREATE_BUCKET | false | 启动时自动创建存储桶 | 建议受限账户设为false |
| 参数 | 默认值 | 描述 | 修改建议 |
|---|---|---|---|
NODE_ENV | production | 运行环境 | 保持默认 |
PORT | 3000 | 应用程序端口 | 根据需要修改 |
HOST | 0.0.0.0 | 监听地址 | 保持默认 |
PUBLIC_API_URL 实际服务器IPMINIO_EXTERNAL_ENDPOINT 实际服务器IPMINIO_ROOT_USER 和 MINIO_ROOT_PASSWORDMINIO_ACCESS_KEY 和 MINIO_SECRET_KEY# 适用于本地开发,使用默认配置
environment:
- PUBLIC_API_URL=http://localhost:3000
- MINIO_EXTERNAL_ENDPOINT=localhost
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
# 适用于生产部署,服务器 IP: 192.168.1.100
environment:
- PUBLIC_API_URL=http://192.168.1.100:3000
- MINIO_EXTERNAL_ENDPOINT=192.168.1.100
- MINIO_ROOT_USER=chart_admin
- MINIO_ROOT_PASSWORD=SecurePass2024!
.env 文件(已包含在项目中):
# 基础配置
NODE_ENV=development
PORT=4000
HOST=0.0.0.0
PUBLIC_API_URL=http://localhost:4000
# MinIO 连接配置(本地开发模式)
MINIO_ENDPOINT=localhost # 连接本地 Docker 中的 MinIO
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
# 存储桶配置
MINIO_BUCKET_NAME=charts
MINIO_AUTO_CREATE_BUCKET=false
# 外部访问配置
MINIO_EXTERNAL_ENDPOINT=localhost
MINIO_EXTERNAL_PORT=9000
.env.docker 文件(已包含在项目中):
# 基础配置
NODE_ENV=production
PORT=3000
HOST=0.0.0.0
PUBLIC_API_URL=http://localhost:3000
# MinIO 连接配置(容器间通信)
MINIO_ENDPOINT=minio # 使用 Docker 服务名
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
# 存储桶配置
MINIO_BUCKET_NAME=charts
MINIO_AUTO_CREATE_BUCKET=true # Docker 部署时自动创建
# 外部访问配置(生产环境需修改为实际 IP)
MINIO_EXTERNAL_ENDPOINT=localhost
MINIO_EXTERNAL_PORT=9000
问题在虚拟机或服务器上部署后,无法从外部访问服务
解决方案:
检查配置:
# 展开并查看最终生效的配置(基于 .env.production)
docker compose --env-file .env.production config
修改配置:
# 推荐直接编辑 .env.production
nano .env.production
重启服务:
docker compose --env-file .env.production down
docker compose --env-file .env.production up -d
问题启动时端口被占用
解决方案:
# 检查端口占用
netstat -tulpn | grep -E "(3000|9000|9001)"
# 修改端口映射(在 docker-compose.yml 中)
ports:
- "3001:3000" # 改为 3001
- "9002:9000" # 改为 9002
- "9003:9001" # 改为 9003
问题MinIO数据目录权限不足
解决方案:
# 创建数据目录并设置权限
sudo mkdir -p /docker/minio-data
sudo chown -R 1000:1000 /docker/minio-data
# 在 docker-compose.yml 中指定路径
volumes:
- /docker/minio-data:/data
问题容器之间无法通信
解决方案:
# 检查网络状态
docker network ls
docker network inspect mcp-server-chart-minio_mcp-network
# 重新创建网络
docker compose down
docker system prune -f
docker compose up -d
如果在安装依赖项时遇到Canvas编译错误:
# 清除缓存重新安装
npm cache clean --force
rm -rf node_modules
npm install
# Apple Silicon Mac
arch -x86_64 npm install canvas
# Ubuntu/Debian 安装系统依赖
sudo apt-get update
sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
服务状态检查:
# 检查容器状态
docker compose ps
# 查看 MinIO 日志
docker compose logs minio
# 检查健康状态
docker compose exec minio curl -f http://localhost:9000/minio/health/live
访问权限检查:
# 测试 MinIO API 连接
curl -I http://你的服务器IP:9000
# 检查防火墙状态(Ubuntu)
sudo ufw status
sudo ufw allow 9000
sudo ufw allow 9001
# 检查系统资源
docker system df
free -h
# 清理无用容器和镜像
docker system prune -a
# 重新构建镜像
docker compose build --no-cache app
# 查看构建日志
docker compose build app --progress=plain
预防措施:
# 备份 MinIO 数据
docker run --rm -v mcp-server-chart-minio_minio_data:/source -v $(pwd):/backup busybox tar czf /backup/minio-backup.tar.gz -C /source .
# 恢复数据
docker run --rm -v mcp-server-chart-minio_minio_data:/target -v $(pwd):/backup busybox tar xzf /backup/minio-backup.tar.gz -C /target
出现类似以下错误信息:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
<Key>chart-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.png</Key>
<BucketName>charts</BucketName>
</Error>
此错误通常是由于MinIO存储桶权限配置不正确导致的:
方法1:重启服务(推荐,最简单)
# 完全重启所有服务
docker compose down
docker compose up -d
# 或者只重启应用服务
docker compose restart app
方法2:手动配置存储桶策略
minioadminminioadmincharts 存储桶方法3:使用诊断脚本