feat: add app APIPark

This commit is contained in:
arch3rPro
2025-08-28 17:24:54 +00:00
parent b45696c83d
commit e9c067993d
8 changed files with 927 additions and 0 deletions

220
apps/apipark/README.md Normal file
View File

@@ -0,0 +1,220 @@
# APIPark
![APIPark](https://img.shields.io/github/stars/APIParkLab/APIPark?style=social)
![Docker Pulls](https://img.shields.io/docker/pulls/apipark/apipark)
![GitHub release](https://img.shields.io/github/v/release/APIParkLab/APIPark)
![License](https://img.shields.io/github/license/APIParkLab/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
View 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

View 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

View 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: 日志级别

View 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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB