diff --git a/apps/apipark/README.md b/apps/apipark/README.md new file mode 100644 index 0000000..82ae34e --- /dev/null +++ b/apps/apipark/README.md @@ -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) 文件。 \ No newline at end of file diff --git a/apps/apipark/data.yml b/apps/apipark/data.yml new file mode 100644 index 0000000..8a11c29 --- /dev/null +++ b/apps/apipark/data.yml @@ -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 \ No newline at end of file diff --git a/apps/apipark/latest/config.yml b/apps/apipark/latest/config.yml new file mode 100644 index 0000000..e9563cd --- /dev/null +++ b/apps/apipark/latest/config.yml @@ -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 \ No newline at end of file diff --git a/apps/apipark/latest/data.yml b/apps/apipark/latest/data.yml new file mode 100644 index 0000000..000dac5 --- /dev/null +++ b/apps/apipark/latest/data.yml @@ -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: 日志级别 \ No newline at end of file diff --git a/apps/apipark/latest/docker-compose-test.yml b/apps/apipark/latest/docker-compose-test.yml new file mode 100644 index 0000000..198ccbc --- /dev/null +++ b/apps/apipark/latest/docker-compose-test.yml @@ -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 < /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 < /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 diff --git a/apps/apipark/latest/docker-compose.yml b/apps/apipark/latest/docker-compose.yml new file mode 100644 index 0000000..ffb75b9 --- /dev/null +++ b/apps/apipark/latest/docker-compose.yml @@ -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 < /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 < /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 \ No newline at end of file diff --git a/apps/apipark/latest/scripts/init.sh b/apps/apipark/latest/scripts/init.sh new file mode 100755 index 0000000..c7252ed --- /dev/null +++ b/apps/apipark/latest/scripts/init.sh @@ -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 "数据目录权限设置完成!" \ No newline at end of file diff --git a/apps/apipark/logo.png b/apps/apipark/logo.png new file mode 100644 index 0000000..537125e Binary files /dev/null and b/apps/apipark/logo.png differ