Zealot

  • 说明

    • 开源移动应用、macOS、Linux 和 Windows 应用分发平台,相关地址如下
    # 开源地址
    https://github.com/tryzealot/zealot/
    # 镜像仓库地址
    https://hub.docker.com/r/tryzealot/zealot
    # 官方文档
    https://zealot.ews.im/zh-Hans/docs/self-hosted/
    # 接口文档
    https://zealot.ews.im/zh-Hans/api/v1/zh-Hans
    • 服务架构

16.1 容器部署

  • 说明

    • 本示例需额外准备好 Postgres域名域名SSL证书Nginx
    • 亦可参考官方提供的部署方式 https://github.com/tryzealot/zealot-docker
  • 操作如下

    • 目录结构
    zealot
    ├── config
    │   └── zealot.env
    ├── data
    │   ├── backup
    │   └── uploads
    ├── docker-compose.yaml
    └── log
    • config/zealot.env
    ######################################
    # Domain&Certificate | 域名及证书
    ######################################
    ## 语言设置 (默认中文:zh-CN)
    # DEFAULT_LOCALE=en
    ## 网站外观(默认浅色:light)
    # ZEALOT_APPEARANCE=dark
    ## 站点域名
    ZEALOT_DOMAIN=zealot.hukanfa.com
    
    ######################################
    # Account | 账户
    ######################################
    ## 默认生成的管理员账户和密码
    ZEALOT_ADMIN_EMAIL=admin@zealot.com
    ZEALOT_ADMIN_PASSWORD=ze@l0t
    ## Guest mode | 是否开启游客模式 (无需登录即可浏览绝大部分内部服务)
    ZEALOT_GUEST_MODE=false
    ## Account register mode | 是否开放注册功能 | 生产环境关闭
    ZEALOT_REGISTER_ENABLED=false
    
    ######################################
    # Sending email | 发送邮件 - 必须 - 可以配置QQ的或者企业专用的 - 新用户注册需要邮件确认才能激活账号
    ######################################
    
    # SMTP 以下为官方 demo
    SMTP_DOMAIN=zealot.com
    SMTP_ADDRESS=smtp.gmail.com
    SMTP_PORT=587
    SMTP_USERNAME=you@gmail.com
    SMTP_PASSWORD=your_app_password
    SMTP_AUTH_METHOD=plain
    SMTP_ENABLE_STARTTLS=true
    
    # Default mail sender | 邮件默认收发人
    ACTION_MAILER_DEFAULT_FROM=notifiacation@zealot.com
    ACTION_MAILER_DEFAULT_TO=no-reply@zealot.com
    
    ######################################
    # Third-Party Authentation | 第三方一键登录
    ######################################
    ## Gitlab
    # 配置教程:https://zealot.ews.im/docs/self-hosted/configuration/third-party-authentication#gitlab
    GITLAB_ENABLED=true
    GITLAB_SITE=https://gitlab.com/api/v4
    GITLAB_SCOPE=read_user
    GITLAB_APP_ID=
    GITLAB_SECRET=
    
    ######################################
    # Schedule jobs | 定时任务
    ######################################
    ## 默认保留所有上传应用,否则会定期清理上传的应用(调试文件除外)| 生产建议关闭,根据规则保持清理
    # 清理规则参见:https://zealot.ews.im/#/configuration
    # ZEALOT_KEEP_UPLOADS=true
    
    ######################################
    # Analytics | 统计
    ######################################
    ## 匿名错误上报
    ZEALOT_SENTRY_DISABLE=false
    
    ######################################
    # Development only | 开发使用变量 (非开发者请忽略下面)
    ######################################
    ## Docker Compose 项目名(建议保留不变)
    COMPOSE_PROJECT_NAME=zealot
    ## 加密密钥,建议使用 openssl 或者 rails secret 生成
    SECRET_KEY_BASE='xgcb0ium95evovql1c0ed9hm66s8pfmqq6z5jy38to1h7xcelfig6p7sup3vfpxmd0svwa5ho8dozhhavk3ikeaifabb45ya33nkmuqv38phpzlrfedhytbzopcp26bu'
    ## Puma 外部控制 API
    PUMA_CONTROL_URL=0.0.0.0:9293
    PUMA_CONTROL_URL_TOKEN=zealot
    
    ## 数据库链接
    ZEALOT_DATABASE_URL=postgresql://pgadmin:123@192.168.26.12:5432/postgredb?sslmode=disable
    • docker-compose.yaml
    services:
    zealot:
      image: tryzealot/zealot:6.0.3
      env_file:
        - ./config/zealot.env
      volumes:
        - ./data/uploads:/app/public/uploads
        - ./data/backup:/app/public/backup
        - ./log:/app/log
      ports:
        - "8080:80"
        - "9094":"9293"
      healthcheck:
        test: ["CMD-SHELL", "wget -q --spider --proxy=off 127.0.0.1/api/health || exit 1"]
      logging:
        driver: "json-file"
        options:
          max-size: "1g"
          max-file: "5"
          max-buffer-size: "4m"
          mode: "non-blocking"
    • zealot.hukanfa.com.conf Nginx配置,示例仅供参考
    server {
      listen 80;
      listen 443 ssl;
      server_name zealot.hukanfa.com;
      ssl_certificate ./certs/hukanfa.com.crt;
      ssl_certificate_key ./certs/hukanfa.com.key;
      access_log logs/zealot_access.log main;
      error_log  logs/zealot_error.log;
      client_max_body_size 1024M;
    
      location / {
          proxy_pass http://0.0.0.0:8080;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
          # 关键:升级头,告诉后端这是 WebSocket 请求
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "Upgrade";
    
          # 超时设置(根据需要调节)
          proxy_read_timeout 86400s;
          proxy_send_timeout 86400s;
      }
    }

16.2 上传接口

  • 说明

    • 通过此接口可以对接CICD流程,构建完成后自动上传app文件到分发平台
    • 接口地址
    POST /api/apps/upload

16.2.1 请求参数

  • 操作如下

    • 这是一个 multipart/form-data 类型的请求,参数信息介绍如下
    字段名称 类型 是否必填 描述
    token String 用户的 API Token,用于身份验证。
    file File 要上传的应用文件(.ipa, .apk, .aab)。
    channel_key String 指定要发布到的渠道的 Key。如果为空,则会尝试创建新应用和渠道。
    name String 应用的名称。如果为空,将从应用文件中解析。如果应用已存在,此字段将被忽略。
    changelog String 本次的更新日志。
    release_type String 发布类型,例如:debugbetaadhocreleaseenterprise
    password String 为该渠道或版本设置下载密码。
    source String 上传来源,例如:apiclijenkinsgitlab-ci
    branch String 应用构建时所在的 Git 分支。
    git_commit String 本次构建对应的 Git Commit SHA 值。
    ci_url String 指向 CI/CD 系统上本次构建页面的 URL。
    devices String (iOS Adhoc) 指定允许安装的设备 UDID 列表,多个 UDID 以逗号分隔。
    custom_fields JSON String 自定义字段,以 JSON 字符串格式提供。
    slug String 自定义渠道的友好 URL slug。
    git_url String 渠道关联的 Git 仓库地址。
    download_filename_type String 下载文件名的生成格式。

16.2.2 返回信息

  • 操作如下

    • 状态码 201
    字段 类型 描述
    id Integer 新版本的唯一标识。
    version String 内部版本号。
    app_name String 应用的完整名称(包含渠道信息)。
    bundle_id String 应用的 Bundle ID 或包名。
    release_version String 应用的发布版本号(如 1.0.0)。
    build_version String 应用的构建版本号(如 101)。
    source String 上传来源。
    branch String Git 分支。
    git_commit String Git 提交记录。
    ci_url String CI/CD 的链接地址。
    size Integer 应用文件的大小(字节)。
    platform String 应用平台(如 iOSAndroid)。
    device_type String 设备类型。
    icon_url String 应用图标的 URL。
    release_url String 应用发布页面的 URL。
    install_url String 应用的安装链接。
    qrcode_url String 应用安装页面的二维码链接。
    changelog Array 更新日志(数组形式)。
    text_changelog String 更新日志(文本形式)。
    custom_fields Object 自定义字段。
    created_at String 创建时间。
    app Object 关联的 App 对象信息。
    scheme Object 关联的 Scheme 对象信息。
    channel Object 关联的 Channel 对象信息。

16.2.3 示例:上传应用

  • 操作如下

    • 需要先创建应用和相应渠道,获取渠道KEY。路径:应用 -> 新建应用 -> 点击应用名 -> 点击渠道名
    1、创建应用后,可自定义渠道或编辑现有渠道信息
    2、进入渠道信息详情页后,下拉右下角可以看到渠道KEY: eca80a73527f0bdd381713d95f67d708
    • 上传应用
    curl -X POST \
    -H "Content-Type: multipart/form-data" \
    -F "token=222acafd2b7132b00876565aa23c953a" \
    -F "name=app-xxx" \
    -F "channel_key=eca80a73527f0bdd381713d95f67d708" \
    -F "file=@/other_data/app-release.apk" \
    -F "changelog=修复了若干 Bug,提升了应用性能。" \
    https://zealot.hukanfa.com/api/apps/upload
    • 响应信息
    {
    "id": 24,
    "version": 1,
    "app_name": "app-xxx AdHoc Android",
    "bundle_id": "com.xxx.hukanfa",
    "release_version": "4.0.11",
    "build_version": "4011",
    "source": "api",
    "branch": null,
    "git_commit": null,
    "ci_url": null,
    "size": 167527861,
    "platform": "Android",
    "device_type": "phone",
    "icon_url": "https://zealot.hukanfa.com/uploads/apps/a3/r24/icons/CG.png",
    "release_url": "https://zealot.hukanfa.com/DOzrS/24",
    "install_url": "https://zealot.hukanfa.com/download/releases/24",
    "qrcode_url": "https://zealot.hukanfa.com/channels/DOzrS/releases/24/qrcode?size=thumb",
    "changelog": [
      {
        "message": "修复了若干 Bug,提升了应用性能。"
      }
    ],
    "text_changelog": "- 修复了若干 Bug,提升了应用性能。",
    "custom_fields": [],
    "created_at": "2025-07-03T18:57:08.094+08:00",
    "app": {
      "id": 3,
      "name": "app-xxx"
    },
    "scheme": {
      "id": 5,
      "name": "AdHoc",
      "new_build_callout": true,
      "retained_builds": 0
    },
    "channel": {
      "id": 12,
      "slug": "DOzrS",
      "name": "Android",
      "device_type": "android",
      "bundle_id": "*",
      "git_url": null,
      "has_password": false,
      "key": "eca80a73527f0bdd381713d95f67d708",
      "download_filename_type": "version_datetime"
    }
    }