mirror of
https://github.com/arch3rPro/1Panel-Appstore.git
synced 2026-04-15 00:17:12 +08:00
feat: add app APIPark
This commit is contained in:
220
apps/apipark/README.md
Normal file
220
apps/apipark/README.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
# APIPark
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## 项目简介
|
||||||
|
|
||||||
|
APIPark 是一个开源的企业级 API 全生命周期管理平台,旨在帮助企业和开发者更好地设计、开发、调试、发布和运维 API。它提供了直观的 Web 界面和强大的功能,让 API 管理变得简单高效。
|
||||||
|
|
||||||
|
## 核心特性
|
||||||
|
|
||||||
|
### 🚀 全生命周期管理
|
||||||
|
- **API 设计**: 支持 OpenAPI 规范的 API 设计和文档生成
|
||||||
|
- **API 开发**: 集成开发环境,支持多种编程语言
|
||||||
|
- **API 调试**: 内置 API 测试工具,支持多种认证方式
|
||||||
|
- **API 发布**: 一键发布 API 到生产环境
|
||||||
|
- **API 运维**: 实时监控 API 性能和健康状态
|
||||||
|
|
||||||
|
### 📊 监控与分析
|
||||||
|
- **实时监控**: 基于 InfluxDB 的高性能时序数据存储
|
||||||
|
- **日志聚合**: 集成 Loki 和 Grafana 的日志收集与可视化
|
||||||
|
- **性能分析**: 详细的 API 调用统计和性能指标
|
||||||
|
- **告警通知**: 智能的异常检测和告警机制
|
||||||
|
|
||||||
|
### 🔒 安全与权限
|
||||||
|
- **身份认证**: 多种认证方式支持(JWT、OAuth2、API Key 等)
|
||||||
|
- **权限控制**: 细粒度的权限管理和访问控制
|
||||||
|
- **安全审计**: 完整的操作日志和安全审计功能
|
||||||
|
- **数据加密**: 传输和存储数据的端到端加密
|
||||||
|
|
||||||
|
### 🌐 企业级特性
|
||||||
|
- **多租户**: 支持多租户架构,数据隔离
|
||||||
|
- **高可用**: 支持集群部署,确保服务高可用
|
||||||
|
- **扩展性**: 微服务架构,支持水平扩展
|
||||||
|
- **国际化**: 支持多语言界面
|
||||||
|
|
||||||
|
## 技术架构
|
||||||
|
|
||||||
|
APIPark 采用现代微服务架构,包含以下核心组件:
|
||||||
|
|
||||||
|
- **APIPark Core**: 核心 API 管理服务
|
||||||
|
- **MySQL**: 主数据库,存储业务数据
|
||||||
|
- **Redis**: 缓存服务,提高系统性能
|
||||||
|
- **InfluxDB**: 时序数据库,存储监控指标
|
||||||
|
- **NSQ**: 分布式消息队列,处理异步任务
|
||||||
|
- **Loki**: 日志聚合服务
|
||||||
|
- **Grafana**: 数据可视化平台
|
||||||
|
|
||||||
|
## 版本信息
|
||||||
|
|
||||||
|
- **当前版本**: v1.9.0-beta
|
||||||
|
- **最低配置**: 2核4G内存,200G存储
|
||||||
|
- **推荐配置**: 8核16G内存,200G存储
|
||||||
|
|
||||||
|
## 系统要求
|
||||||
|
|
||||||
|
### 硬件要求
|
||||||
|
- **CPU**: 最低 2 核,推荐 8 核
|
||||||
|
- **内存**: 最低 4G,推荐 16G
|
||||||
|
- **存储**: 最低 200G
|
||||||
|
- **系统**: Linux / Mac
|
||||||
|
- **架构**: AMD64 / ARM64
|
||||||
|
|
||||||
|
### 软件依赖
|
||||||
|
- **MySQL**: >= 5.7.x
|
||||||
|
- **Redis**: >= 6.2.x
|
||||||
|
- **InfluxDB**: >= 2.6
|
||||||
|
- **NSQ**: 分布式消息队列服务
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
### 使用 1Panel 部署(推荐)
|
||||||
|
|
||||||
|
1. 在 1Panel 应用商店中搜索 "APIPark"
|
||||||
|
2. 点击安装,配置以下参数:
|
||||||
|
- **Web 端口**: 默认 18288
|
||||||
|
- **数据库密码**: 自动生成或自定义
|
||||||
|
- **Redis 密码**: 自动生成或自定义
|
||||||
|
- **管理员密码**: 设置管理员登录密码
|
||||||
|
- **日志级别**: 选择合适的日志级别
|
||||||
|
3. 等待安装完成
|
||||||
|
4. 访问 `http://your-server:18288` 开始使用
|
||||||
|
|
||||||
|
### 手动部署
|
||||||
|
|
||||||
|
1. 下载配置文件:
|
||||||
|
```bash
|
||||||
|
curl -sSO https://download.apipark.com/install/quick-start.sh
|
||||||
|
bash quick-start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 或使用 Docker Compose:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/APIParkLab/APIPark.git
|
||||||
|
cd APIPark
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置说明
|
||||||
|
|
||||||
|
### 环境变量
|
||||||
|
|
||||||
|
| 变量名 | 说明 | 默认值 |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `MYSQL_PWD` | MySQL 数据库密码 | - |
|
||||||
|
| `REDIS_PWD` | Redis 密码 | - |
|
||||||
|
| `ADMIN_PASSWORD` | 管理员登录密码 | admin123 |
|
||||||
|
| `LOG_LEVEL` | 日志级别 | info |
|
||||||
|
| `INFLUXDB_TOKEN` | InfluxDB 访问令牌 | - |
|
||||||
|
|
||||||
|
### 数据目录
|
||||||
|
|
||||||
|
- `/data/apipark`: APIPark 应用数据
|
||||||
|
- `/data/mysql`: MySQL 数据库文件
|
||||||
|
- `/data/redis`: Redis 数据文件
|
||||||
|
- `/data/influxdb`: InfluxDB 数据文件
|
||||||
|
- `/data/loki`: Loki 日志文件
|
||||||
|
- `/data/grafana`: Grafana 配置和数据
|
||||||
|
|
||||||
|
## 使用指南
|
||||||
|
|
||||||
|
### 首次登录
|
||||||
|
|
||||||
|
1. 使用浏览器访问部署的地址
|
||||||
|
2. 使用管理员账号登录(用户名:admin,密码:安装时设置的密码)
|
||||||
|
3. 按照向导完成初始化配置
|
||||||
|
|
||||||
|
### API 网关配置
|
||||||
|
|
||||||
|
APIPark 需要配置 API 网关节点才能完整使用:
|
||||||
|
|
||||||
|
1. 准备网关配置文件 `config.yml`
|
||||||
|
2. 配置网关服务地址和端口
|
||||||
|
3. 在 APIPark 控制台中添加网关节点
|
||||||
|
|
||||||
|
### 监控面板
|
||||||
|
|
||||||
|
系统自动配置 Grafana 监控面板:
|
||||||
|
- 系统会自动配置 Grafana 服务(内部访问)
|
||||||
|
- 自动配置 Loki 数据源
|
||||||
|
- 预设 APIPark 监控仪表板
|
||||||
|
- Grafana 登录密码与管理员密码相同
|
||||||
|
|
||||||
|
## 故障排除
|
||||||
|
|
||||||
|
### 常见问题
|
||||||
|
|
||||||
|
1. **容器启动失败**
|
||||||
|
- 检查端口是否被占用
|
||||||
|
- 验证配置文件格式
|
||||||
|
- 查看容器日志:`docker logs container_name`
|
||||||
|
|
||||||
|
2. **数据库连接失败**
|
||||||
|
- 确认 MySQL 服务正常运行
|
||||||
|
- 检查数据库密码配置
|
||||||
|
- 验证网络连接
|
||||||
|
|
||||||
|
3. **Redis 连接失败**
|
||||||
|
- 确认 Redis 服务正常运行
|
||||||
|
- 检查 Redis 密码配置
|
||||||
|
- 验证网络连接
|
||||||
|
|
||||||
|
4. **Grafana 权限问题**
|
||||||
|
- 如果出现权限错误,应用已自动配置权限修复
|
||||||
|
- 初始化脚本会自动设置正确的目录权限
|
||||||
|
- 如仍有问题,手动运行:`chown -R 472:472 ./data/grafana`
|
||||||
|
|
||||||
|
5. **InfluxDB 启动慢**
|
||||||
|
- InfluxDB 首次启动需要较长初始化时间(可能超过60秒)
|
||||||
|
- 请耐心等待健康检查通过
|
||||||
|
- 可查看日志:`docker logs ${CONTAINER_NAME}_influxdb`
|
||||||
|
|
||||||
|
### 日志查看
|
||||||
|
|
||||||
|
- APIPark 日志:`docker logs ${CONTAINER_NAME}`
|
||||||
|
### 日志查看
|
||||||
|
|
||||||
|
- APIPark 日志:`docker logs ${CONTAINER_NAME}`
|
||||||
|
- MySQL 日志:`docker logs ${CONTAINER_NAME}_mysql`
|
||||||
|
- Redis 日志:`docker logs ${CONTAINER_NAME}_redis`
|
||||||
|
- InfluxDB 日志:`docker logs ${CONTAINER_NAME}_influxdb`
|
||||||
|
- NSQ 日志:`docker logs ${CONTAINER_NAME}_nsq`
|
||||||
|
- Grafana 日志:`docker logs ${CONTAINER_NAME}_grafana`
|
||||||
|
- Loki 日志:`docker logs ${CONTAINER_NAME}_loki`
|
||||||
|
|
||||||
|
## 更新升级
|
||||||
|
|
||||||
|
1. 停止当前容器:`docker-compose down`
|
||||||
|
2. 拉取最新镜像:`docker-compose pull`
|
||||||
|
3. 启动新版本:`docker-compose up -d`
|
||||||
|
4. 验证服务状态
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
⚠️ **重要提醒**:
|
||||||
|
- 首次部署前请确保系统满足最低配置要求
|
||||||
|
- InfluxDB 首次启动可能需要60-120秒,请耐心等待
|
||||||
|
- Grafana 权限问题已通过初始化容器自动修复
|
||||||
|
- 生产环境建议使用外部数据库服务
|
||||||
|
- 定期备份重要数据
|
||||||
|
- 及时关注版本更新和安全补丁
|
||||||
|
|
||||||
|
💡 **性能优化建议**:
|
||||||
|
- 建议为 InfluxDB 分配至少 2GB 内存
|
||||||
|
- MySQL 和 Redis 数据目录建议使用 SSD 存储
|
||||||
|
- 在生产环境中考虑使用外部持久化存储
|
||||||
|
|
||||||
|
## 相关链接
|
||||||
|
|
||||||
|
- [官方网站](https://apipark.com)
|
||||||
|
- [GitHub 仓库](https://github.com/APIParkLab/APIPark)
|
||||||
|
- [在线文档](https://docs.apipark.com)
|
||||||
|
- [社区论坛](https://community.apipark.com)
|
||||||
|
- [问题反馈](https://github.com/APIParkLab/APIPark/issues)
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
本项目采用 Apache-2.0 许可证。详细信息请参阅 [LICENSE](https://github.com/APIParkLab/APIPark/blob/main/LICENSE) 文件。
|
||||||
30
apps/apipark/data.yml
Normal file
30
apps/apipark/data.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: APIPark
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
- DevTool
|
||||||
|
- AI
|
||||||
|
title: 开源企业级API全生命周期管理平台
|
||||||
|
description: 企业级API管理工具,提供API设计、开发、调试、发布、运维等全生命周期管理
|
||||||
|
additionalProperties:
|
||||||
|
key: apipark
|
||||||
|
name: APIPark
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
- DevTool
|
||||||
|
- AI
|
||||||
|
description:
|
||||||
|
en: Enterprise-level API lifecycle management platform providing comprehensive API design, development, debugging, publishing and operations management
|
||||||
|
zh: 企业级API全生命周期管理平台,提供API设计、开发、调试、发布、运维等全生命周期管理
|
||||||
|
zh-Hant: 企業級API全生命週期管理平台,提供API設計、開發、調試、發布、運維等全生命週期管理
|
||||||
|
ja: API設計、開発、デバッグ、公開、運用管理などの包括的なライフサイクル管理を提供するエンタープライズレベルのAPIライフサイクル管理プラットフォーム
|
||||||
|
ms: Platform pengurusan kitaran hidup API peringkat enterprise yang menyediakan pengurusan komprehensif reka bentuk, pembangunan, debug, penerbitan dan operasi API
|
||||||
|
pt-br: Plataforma de gerenciamento de ciclo de vida de API de nível empresarial fornecendo design, desenvolvimento, depuração, publicação e gerenciamento de operações de API abrangente
|
||||||
|
ru: Платформа управления жизненным циклом API корпоративного уровня, обеспечивающая комплексное управление проектированием, разработкой, отладкой, публикацией и эксплуатацией API
|
||||||
|
ko: API 설계, 개발, 디버깅, 게시 및 운영 관리의 포괄적인 라이프사이클 관리를 제공하는 엔터프라이즈급 API 라이프사이클 관리 플랫폼
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 1
|
||||||
|
website: https://apipark.com
|
||||||
|
github: https://github.com/APIParkLab/APIPark
|
||||||
|
document: https://docs.apipark.com
|
||||||
26
apps/apipark/latest/config.yml
Normal file
26
apps/apipark/latest/config.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
version: 2
|
||||||
|
#certificate: # 证书存放根目录
|
||||||
|
# dir: /etc/apinto/cert
|
||||||
|
client:
|
||||||
|
advertise_urls: # open api 服务的广播地址
|
||||||
|
- http://172.18.65.22:9400
|
||||||
|
listen_urls: # open api 服务的监听地址
|
||||||
|
- http://0.0.0.0:9400
|
||||||
|
#certificate: # 证书配置,允许使用ip的自签证书
|
||||||
|
# - cert: server.pem
|
||||||
|
# key: server.key
|
||||||
|
gateway:
|
||||||
|
advertise_urls: # 转发服务的广播地址
|
||||||
|
- http://172.18.65.22:8099
|
||||||
|
- https://172.18.65.22:8099
|
||||||
|
listen_urls: # 转发服务的监听地址
|
||||||
|
- https://0.0.0.0:8099
|
||||||
|
- http://0.0.0.0:8099
|
||||||
|
peer: # 集群间节点通信配置信息
|
||||||
|
listen_urls: # 节点监听地址
|
||||||
|
- http://0.0.0.0:9401
|
||||||
|
advertise_urls: # 节点通信广播地址
|
||||||
|
- http://172.18.65.22:9401
|
||||||
|
#certificate: # 证书配置,允许使用ip的自签证书
|
||||||
|
# - cert: server.pem
|
||||||
|
# key: server.key
|
||||||
135
apps/apipark/latest/data.yml
Normal file
135
apps/apipark/latest/data.yml
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 18288
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
label:
|
||||||
|
en: Web Port
|
||||||
|
ja: Webポート
|
||||||
|
ms: Port Web
|
||||||
|
pt-br: Porta Web
|
||||||
|
ru: Веб-порт
|
||||||
|
ko: 웹 포트
|
||||||
|
zh-Hant: Web 埠
|
||||||
|
zh: Web 端口
|
||||||
|
- default: apipark
|
||||||
|
envKey: PANEL_DB_NAME
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramCommon
|
||||||
|
type: text
|
||||||
|
label:
|
||||||
|
en: Database Name
|
||||||
|
ja: データベース名
|
||||||
|
ms: Nama Pangkalan Data
|
||||||
|
pt-br: Nome do Banco de Dados
|
||||||
|
ru: Имя базы данных
|
||||||
|
ko: 데이터베이스 이름
|
||||||
|
zh-Hant: 資料庫名稱
|
||||||
|
zh: 数据库名
|
||||||
|
- default: apipark
|
||||||
|
envKey: PANEL_DB_ROOT_PASSWORD
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
label:
|
||||||
|
en: Database Root Password
|
||||||
|
ja: データベースルートパスワード
|
||||||
|
ms: Kata Laluan Root Pangkalan Data
|
||||||
|
pt-br: Senha Root do Banco de Dados
|
||||||
|
ru: Пароль root базы данных
|
||||||
|
ko: 데이터베이스 루트 비밀번호
|
||||||
|
zh-Hant: 資料庫 Root 密碼
|
||||||
|
zh: 数据库 Root 密码
|
||||||
|
- default: apipark
|
||||||
|
envKey: PANEL_REDIS_ROOT_PASSWORD
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
label:
|
||||||
|
en: Redis Password
|
||||||
|
ja: Redis パスワード
|
||||||
|
ms: Kata Laluan Redis
|
||||||
|
pt-br: Senha Redis
|
||||||
|
ru: Пароль Redis
|
||||||
|
ko: Redis 비밀번호
|
||||||
|
zh-Hant: Redis 密碼
|
||||||
|
zh: Redis 密码
|
||||||
|
- default: admin123
|
||||||
|
envKey: ADMIN_PASSWORD
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
label:
|
||||||
|
en: Admin Password
|
||||||
|
ja: 管理者パスワード
|
||||||
|
ms: Kata Laluan Pentadbir
|
||||||
|
pt-br: Senha do Administrador
|
||||||
|
ru: Пароль администратора
|
||||||
|
ko: 관리자 비밀번호
|
||||||
|
zh-Hant: 管理員密碼
|
||||||
|
zh: 管理员密码
|
||||||
|
- default: Key123qaz
|
||||||
|
envKey: INFLUXDB_ADMIN_PASSWORD
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
label:
|
||||||
|
en: InfluxDB Admin Password
|
||||||
|
ja: InfluxDB 管理者パスワード
|
||||||
|
ms: Kata Laluan Pentadbir InfluxDB
|
||||||
|
pt-br: Senha do Administrador InfluxDB
|
||||||
|
ru: Пароль администратора InfluxDB
|
||||||
|
ko: InfluxDB 관리자 비밀번호
|
||||||
|
zh-Hant: InfluxDB 管理員密碼
|
||||||
|
zh: InfluxDB 管理员密码
|
||||||
|
- default: apipark-token
|
||||||
|
envKey: INFLUXDB_TOKEN
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramCommon
|
||||||
|
type: text
|
||||||
|
label:
|
||||||
|
en: InfluxDB Token
|
||||||
|
ja: InfluxDB トークン
|
||||||
|
ms: Token InfluxDB
|
||||||
|
pt-br: Token InfluxDB
|
||||||
|
ru: Токен InfluxDB
|
||||||
|
ko: InfluxDB 토큰
|
||||||
|
zh-Hant: InfluxDB 權杖
|
||||||
|
zh: InfluxDB 令牌
|
||||||
|
- default: "info"
|
||||||
|
envKey: LOG_LEVEL
|
||||||
|
required: true
|
||||||
|
type: select
|
||||||
|
values:
|
||||||
|
- label: "DEBUG"
|
||||||
|
value: "debug"
|
||||||
|
- label: "INFO"
|
||||||
|
value: "info"
|
||||||
|
- label: "WARNING"
|
||||||
|
value: "warning"
|
||||||
|
- label: "ERROR"
|
||||||
|
value: "error"
|
||||||
|
- label: "FATAL"
|
||||||
|
value: "fatal"
|
||||||
|
- label: "PANIC"
|
||||||
|
value: "panic"
|
||||||
|
- label: "TRACE"
|
||||||
|
value: "trace"
|
||||||
|
label:
|
||||||
|
en: Log Level
|
||||||
|
ja: ログレベル
|
||||||
|
ms: Tahap Log
|
||||||
|
pt-br: Nível de Log
|
||||||
|
ru: Уровень логирования
|
||||||
|
ko: 로그 레벨
|
||||||
|
zh-Hant: 日誌等級
|
||||||
|
zh: 日志级别
|
||||||
225
apps/apipark/latest/docker-compose-test.yml
Normal file
225
apps/apipark/latest/docker-compose-test.yml
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
apipark-mysql:
|
||||||
|
image: mysql:8.0.37
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
container_name: apipark-mysql
|
||||||
|
hostname: apipark-mysql
|
||||||
|
command:
|
||||||
|
- "--character-set-server=utf8mb4"
|
||||||
|
- "--collation-server=utf8mb4_unicode_ci"
|
||||||
|
ports:
|
||||||
|
- "33306:3306"
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD={MYSQL_PWD}
|
||||||
|
- MYSQL_DATABASE=apipark
|
||||||
|
volumes:
|
||||||
|
- /var/lib/apipark/mysql:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark:
|
||||||
|
image: apipark/apipark:v1.9.0-beta
|
||||||
|
container_name: apipark
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
ports:
|
||||||
|
- "18288:8288"
|
||||||
|
depends_on:
|
||||||
|
- apipark-mysql
|
||||||
|
environment:
|
||||||
|
- MYSQL_USER_NAME=root
|
||||||
|
- MYSQL_PWD={MYSQL_PWD}
|
||||||
|
- MYSQL_IP=apipark-mysql
|
||||||
|
- MYSQL_PORT=3306 #mysql端口
|
||||||
|
- MYSQL_DB="apipark"
|
||||||
|
- ERROR_DIR=work/logs # 日志放置目录
|
||||||
|
- ERROR_FILE_NAME=error.log # 错误日志文件名
|
||||||
|
- ERROR_LOG_LEVEL=info # 错误日志等级,可选:panic,fatal,error,warning,info,debug,trace 不填或者非法则为info
|
||||||
|
- ERROR_EXPIRE=7d # 错误日志过期时间,默认单位为天,d|天,h|小时, 不合法配置默认为7d
|
||||||
|
- ERROR_PERIOD=day # 错误日志切割周期,仅支持day、hour
|
||||||
|
- REDIS_ADDR=apipark-redis:6379 #Redis集群地址 多个用,隔开
|
||||||
|
- REDIS_PWD={REDIS_PWD} # Redis密码
|
||||||
|
- ADMIN_PASSWORD={ADMIN_PASSWORD}
|
||||||
|
- Init=true
|
||||||
|
- InfluxdbToken={INFLUXDB_TOKEN}
|
||||||
|
apipark-influxdb:
|
||||||
|
image: influxdb:2.6
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
container_name: apipark-influxdb
|
||||||
|
hostname: apipark-influxdb
|
||||||
|
ports:
|
||||||
|
- "8086:8086"
|
||||||
|
volumes:
|
||||||
|
- /var/lib/apipark/influxdb2:/var/lib/influxdb2
|
||||||
|
environment:
|
||||||
|
- DOCKER_INFLUXDB_INIT_USERNAME=admin
|
||||||
|
- DOCKER_INFLUXDB_INIT_PASSWORD=Key123qaz
|
||||||
|
- DOCKER_INFLUXDB_INIT_ORG=apipark
|
||||||
|
- DOCKER_INFLUXDB_INIT_BUCKET=apinto
|
||||||
|
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN={INFLUXDB_TOKEN}
|
||||||
|
- DOCKER_INFLUXDB_INIT_MODE=setup
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark-redis:
|
||||||
|
container_name: apipark-redis
|
||||||
|
image: redis:7.2.4
|
||||||
|
hostname: apipark-redis
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
command:
|
||||||
|
- bash
|
||||||
|
- -c
|
||||||
|
- "redis-server --protected-mode yes --logfile redis.log --appendonly no --port 6379 --requirepass {REDIS_PWD}"
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark-loki:
|
||||||
|
container_name: apipark-loki
|
||||||
|
image: grafana/loki:3.2.1
|
||||||
|
hostname: apipark-loki
|
||||||
|
privileged: true
|
||||||
|
user: root
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 3100:3100
|
||||||
|
volumes:
|
||||||
|
- /var/lib/apipark/loki:/tmp/loki
|
||||||
|
entrypoint:
|
||||||
|
- sh
|
||||||
|
- -euc
|
||||||
|
- |
|
||||||
|
mkdir -p /mnt/config
|
||||||
|
cat <<EOF > /mnt/config/loki-config.yaml
|
||||||
|
---
|
||||||
|
auth_enabled: false
|
||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 3100
|
||||||
|
grpc_listen_port: 9096
|
||||||
|
|
||||||
|
common:
|
||||||
|
instance_addr: 127.0.0.1
|
||||||
|
path_prefix: /tmp/loki
|
||||||
|
storage:
|
||||||
|
filesystem:
|
||||||
|
chunks_directory: /tmp/loki/chunks
|
||||||
|
rules_directory: /tmp/loki/rules
|
||||||
|
replication_factor: 1
|
||||||
|
ring:
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
|
||||||
|
query_range:
|
||||||
|
results_cache:
|
||||||
|
cache:
|
||||||
|
embedded_cache:
|
||||||
|
enabled: true
|
||||||
|
max_size_mb: 100
|
||||||
|
|
||||||
|
schema_config:
|
||||||
|
configs:
|
||||||
|
- from: 2020-10-24
|
||||||
|
store: tsdb
|
||||||
|
object_store: filesystem
|
||||||
|
schema: v13
|
||||||
|
index:
|
||||||
|
prefix: index_
|
||||||
|
period: 24h
|
||||||
|
limits_config:
|
||||||
|
max_query_length: 90d # 设置最大查询时长为 30 天
|
||||||
|
ruler:
|
||||||
|
alertmanager_url: http://localhost:9093
|
||||||
|
|
||||||
|
# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
|
||||||
|
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
|
||||||
|
#
|
||||||
|
# Statistics help us better understand how Loki is used, and they show us performance
|
||||||
|
# levels for most users. This helps us prioritize features and documentation.
|
||||||
|
# For more information on what's sent, look at
|
||||||
|
# https://github.com/grafana/loki/blob/main/pkg/analytics/stats.go
|
||||||
|
# Refer to the buildReport method to see what goes into a report.
|
||||||
|
#
|
||||||
|
# If you would like to disable reporting, uncomment the following lines:
|
||||||
|
#analytics:
|
||||||
|
# reporting_enabled: false
|
||||||
|
table_manager:
|
||||||
|
retention_period: 90d
|
||||||
|
EOF
|
||||||
|
/usr/bin/loki -config.file=/mnt/config/loki-config.yaml
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark-grafana:
|
||||||
|
container_name: apipark-grafana
|
||||||
|
image: grafana/grafana:11.3.2
|
||||||
|
hostname: apipark-grafana
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
|
||||||
|
- GF_AUTH_ANONYMOUS_ENABLED=true
|
||||||
|
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
||||||
|
depends_on:
|
||||||
|
- apipark-loki
|
||||||
|
entrypoint:
|
||||||
|
- sh
|
||||||
|
- -euc
|
||||||
|
- |
|
||||||
|
mkdir -p /etc/grafana/provisioning/datasources
|
||||||
|
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
|
||||||
|
apiVersion: 1
|
||||||
|
datasources:
|
||||||
|
- name: Loki
|
||||||
|
type: loki
|
||||||
|
access: proxy
|
||||||
|
url: http://apipark-loki:3100
|
||||||
|
EOF
|
||||||
|
/run.sh
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" ]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark-nsq:
|
||||||
|
container_name: apipark-nsq
|
||||||
|
image: nsqio/nsq:v1.3.0
|
||||||
|
hostname: apipark-nsq
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
command:
|
||||||
|
- /nsqd
|
||||||
|
ports:
|
||||||
|
- 4150:4150
|
||||||
|
- 4151:4151
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
apipark-apinto:
|
||||||
|
image: eolinker/apinto-gateway
|
||||||
|
container_name: apipark-apinto
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "18099:8099"
|
||||||
|
- "19400:9400"
|
||||||
|
- "19401:9401"
|
||||||
|
volumes:
|
||||||
|
- /var/lib/apipark/apinto/data:/var/lib/apinto
|
||||||
|
- /var/lib/apipark/apinto/log:/var/log/apinto
|
||||||
|
- ${PWD}/config.yml:/etc/apinto/config.yml
|
||||||
|
networks:
|
||||||
|
- apipark
|
||||||
|
networks:
|
||||||
|
apipark:
|
||||||
|
driver: bridge
|
||||||
|
ipam:
|
||||||
|
driver: default
|
||||||
|
config:
|
||||||
|
- subnet: 172.100.0.0/24
|
||||||
259
apps/apipark/latest/docker-compose.yml
Normal file
259
apps/apipark/latest/docker-compose.yml
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
services:
|
||||||
|
apipark:
|
||||||
|
image: apipark/apipark:v1.9.0-beta
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
influxdb:
|
||||||
|
condition: service_healthy
|
||||||
|
nsq:
|
||||||
|
condition: service_started
|
||||||
|
environment:
|
||||||
|
- MYSQL_USER_NAME=root
|
||||||
|
- MYSQL_PWD=${PANEL_DB_ROOT_PASSWORD}
|
||||||
|
- MYSQL_IP=mysql
|
||||||
|
- MYSQL_PORT=3306
|
||||||
|
- MYSQL_DB=${PANEL_DB_NAME}
|
||||||
|
- ERROR_DIR=work/logs
|
||||||
|
- ERROR_FILE_NAME=error.log
|
||||||
|
- ERROR_LOG_LEVEL=${LOG_LEVEL}
|
||||||
|
- ERROR_EXPIRE=7d
|
||||||
|
- ERROR_PERIOD=day
|
||||||
|
- REDIS_ADDR=redis:6379
|
||||||
|
- REDIS_PWD=${PANEL_REDIS_ROOT_PASSWORD}
|
||||||
|
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
|
||||||
|
- Init=true
|
||||||
|
- InfluxdbToken=${INFLUXDB_TOKEN}
|
||||||
|
- NSQ_ADDR=nsq:4150
|
||||||
|
- NSQ_TOPIC_PREFIX=apipark
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:8288"
|
||||||
|
volumes:
|
||||||
|
- ./data/apipark:/app/work
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0.37
|
||||||
|
container_name: ${CONTAINER_NAME}_mysql
|
||||||
|
restart: always
|
||||||
|
command:
|
||||||
|
- "--character-set-server=utf8mb4"
|
||||||
|
- "--collation-server=utf8mb4_unicode_ci"
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=${PANEL_DB_ROOT_PASSWORD}
|
||||||
|
- MYSQL_DATABASE=${PANEL_DB_NAME}
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
expose:
|
||||||
|
- "3306"
|
||||||
|
volumes:
|
||||||
|
- ./data/mysql:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7.2.4
|
||||||
|
container_name: ${CONTAINER_NAME}_redis
|
||||||
|
restart: always
|
||||||
|
command: redis-server --requirepass ${PANEL_REDIS_ROOT_PASSWORD} --appendonly no --logfile redis.log
|
||||||
|
expose:
|
||||||
|
- "6379"
|
||||||
|
volumes:
|
||||||
|
- ./data/redis:/data
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "-a", "${PANEL_REDIS_ROOT_PASSWORD}", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
influxdb:
|
||||||
|
image: influxdb:2.6
|
||||||
|
container_name: ${CONTAINER_NAME}_influxdb
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- DOCKER_INFLUXDB_INIT_USERNAME=admin
|
||||||
|
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_ADMIN_PASSWORD}
|
||||||
|
- DOCKER_INFLUXDB_INIT_ORG=apipark
|
||||||
|
- DOCKER_INFLUXDB_INIT_BUCKET=apinto
|
||||||
|
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_TOKEN}
|
||||||
|
- DOCKER_INFLUXDB_INIT_MODE=setup
|
||||||
|
expose:
|
||||||
|
- "8086"
|
||||||
|
volumes:
|
||||||
|
- ./data/influxdb:/var/lib/influxdb2
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8086/api/v2/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 10
|
||||||
|
start_period: 60s
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
loki:
|
||||||
|
image: grafana/loki:3.2.1
|
||||||
|
container_name: ${CONTAINER_NAME}_loki
|
||||||
|
restart: always
|
||||||
|
user: root
|
||||||
|
expose:
|
||||||
|
- "3100"
|
||||||
|
volumes:
|
||||||
|
- ./data/loki:/tmp/loki
|
||||||
|
entrypoint:
|
||||||
|
- sh
|
||||||
|
- -euc
|
||||||
|
- |
|
||||||
|
mkdir -p /mnt/config
|
||||||
|
cat <<EOF > /mnt/config/loki-config.yaml
|
||||||
|
---
|
||||||
|
auth_enabled: false
|
||||||
|
server:
|
||||||
|
http_listen_port: 3100
|
||||||
|
grpc_listen_port: 9096
|
||||||
|
common:
|
||||||
|
instance_addr: 127.0.0.1
|
||||||
|
path_prefix: /tmp/loki
|
||||||
|
storage:
|
||||||
|
filesystem:
|
||||||
|
chunks_directory: /tmp/loki/chunks
|
||||||
|
rules_directory: /tmp/loki/rules
|
||||||
|
replication_factor: 1
|
||||||
|
ring:
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
query_range:
|
||||||
|
results_cache:
|
||||||
|
cache:
|
||||||
|
embedded_cache:
|
||||||
|
enabled: true
|
||||||
|
max_size_mb: 100
|
||||||
|
schema_config:
|
||||||
|
configs:
|
||||||
|
- from: 2020-10-24
|
||||||
|
store: tsdb
|
||||||
|
object_store: filesystem
|
||||||
|
schema: v13
|
||||||
|
index:
|
||||||
|
prefix: index_
|
||||||
|
period: 24h
|
||||||
|
limits_config:
|
||||||
|
max_query_length: 90d
|
||||||
|
ruler:
|
||||||
|
alertmanager_url: http://localhost:9093
|
||||||
|
table_manager:
|
||||||
|
retention_period: 90d
|
||||||
|
EOF
|
||||||
|
/usr/bin/loki -config.file=/mnt/config/loki-config.yaml
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
nsq:
|
||||||
|
image: nsqio/nsq:latest
|
||||||
|
container_name: ${CONTAINER_NAME}_nsq
|
||||||
|
restart: always
|
||||||
|
command: /nsqd --broadcast-address=nsq --lookupd-tcp-address=nsqlookupd:4160
|
||||||
|
depends_on:
|
||||||
|
- nsqlookupd
|
||||||
|
expose:
|
||||||
|
- "4150"
|
||||||
|
- "4151"
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
nsqlookupd:
|
||||||
|
image: nsqio/nsq:latest
|
||||||
|
container_name: ${CONTAINER_NAME}_nsqlookupd
|
||||||
|
restart: always
|
||||||
|
command: /nsqlookupd
|
||||||
|
expose:
|
||||||
|
- "4160"
|
||||||
|
- "4161"
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
grafana-init:
|
||||||
|
image: busybox:latest
|
||||||
|
container_name: ${CONTAINER_NAME}_grafana_init
|
||||||
|
user: root
|
||||||
|
command: |
|
||||||
|
sh -c '
|
||||||
|
chown -R 472:472 /var/lib/grafana
|
||||||
|
chmod -R 755 /var/lib/grafana
|
||||||
|
'
|
||||||
|
volumes:
|
||||||
|
- ./data/grafana:/var/lib/grafana
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
grafana:
|
||||||
|
image: grafana/grafana:11.3.2
|
||||||
|
container_name: ${CONTAINER_NAME}_grafana
|
||||||
|
restart: always
|
||||||
|
user: "472:472"
|
||||||
|
environment:
|
||||||
|
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
|
||||||
|
- GF_AUTH_ANONYMOUS_ENABLED=true
|
||||||
|
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
||||||
|
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}
|
||||||
|
- GF_INSTALL_PLUGINS=
|
||||||
|
depends_on:
|
||||||
|
- loki
|
||||||
|
- grafana-init
|
||||||
|
entrypoint:
|
||||||
|
- sh
|
||||||
|
- -euc
|
||||||
|
- |
|
||||||
|
mkdir -p /etc/grafana/provisioning/datasources
|
||||||
|
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
|
||||||
|
apiVersion: 1
|
||||||
|
datasources:
|
||||||
|
- name: Loki
|
||||||
|
type: loki
|
||||||
|
access: proxy
|
||||||
|
url: http://loki:3100
|
||||||
|
EOF
|
||||||
|
/run.sh
|
||||||
|
expose:
|
||||||
|
- "3000"
|
||||||
|
volumes:
|
||||||
|
- ./data/grafana:/var/lib/grafana
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
||||||
32
apps/apipark/latest/scripts/init.sh
Executable file
32
apps/apipark/latest/scripts/init.sh
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# APIPark 初始化脚本
|
||||||
|
# 确保数据目录具有正确的权限
|
||||||
|
|
||||||
|
echo "正在初始化 APIPark 数据目录权限..."
|
||||||
|
|
||||||
|
# 创建必要的数据目录
|
||||||
|
mkdir -p ./data/apipark
|
||||||
|
mkdir -p ./data/mysql
|
||||||
|
mkdir -p ./data/redis
|
||||||
|
mkdir -p ./data/influxdb
|
||||||
|
mkdir -p ./data/loki
|
||||||
|
mkdir -p ./data/grafana
|
||||||
|
|
||||||
|
# 设置 Grafana 目录权限 (用户 ID: 472)
|
||||||
|
chown -R 472:472 ./data/grafana
|
||||||
|
chmod -R 755 ./data/grafana
|
||||||
|
|
||||||
|
# 设置 MySQL 目录权限 (用户 ID: 999)
|
||||||
|
chown -R 999:999 ./data/mysql
|
||||||
|
|
||||||
|
# 设置 InfluxDB 目录权限
|
||||||
|
chown -R 1000:1000 ./data/influxdb
|
||||||
|
|
||||||
|
# 设置 Redis 目录权限 (用户 ID: 999)
|
||||||
|
chown -R 999:999 ./data/redis
|
||||||
|
|
||||||
|
# 设置 Loki 目录权限 (root)
|
||||||
|
chown -R 0:0 ./data/loki
|
||||||
|
|
||||||
|
echo "数据目录权限设置完成!"
|
||||||
BIN
apps/apipark/logo.png
Normal file
BIN
apps/apipark/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
Reference in New Issue
Block a user