diff --git a/.github/workflows/issue-check-inactive.yml b/.github/workflows/issue-check-inactive.yml index e3cb873a64..399dd5adb1 100644 --- a/.github/workflows/issue-check-inactive.yml +++ b/.github/workflows/issue-check-inactive.yml @@ -4,14 +4,42 @@ on: schedule: - cron: "0 0 * * *" +permissions: + issues: write + jobs: issue-check-inactive: runs-on: ubuntu-latest steps: - - name: check-inactive - uses: actions-cool/issues-helper@v2 - with: - actions: 'check-inactive' - inactive-label: 'stale' - inactive-day: 30 - exclude-labels: 'announcement' + - name: Label inactive issues as stale + env: + GH_TOKEN: ${{ github.token }} + INACTIVE_DAY: "30" + INACTIVE_LABEL: "stale" + EXCLUDE_LABEL: "announcement" + run: | + set -euo pipefail + cutoff="$(date -u -d "${INACTIVE_DAY} days ago" +%Y-%m-%dT%H:%M:%SZ)" + + gh issue list \ + --repo "${{ github.repository }}" \ + --state open \ + --limit 1000 \ + --json number,labels,updatedAt \ + | jq -c \ + --arg cutoff "$cutoff" \ + --arg inactive "$INACTIVE_LABEL" \ + --arg exclude "$EXCLUDE_LABEL" \ + ' + .[] + | select(.updatedAt < $cutoff) + | select([.labels[].name] | index($exclude) | not) + | select([.labels[].name] | index($inactive) | not) + ' \ + | while IFS= read -r issue; do + number="$(echo "$issue" | jq -r .number)" + echo "Marking issue #${number} as ${INACTIVE_LABEL}" + gh issue edit "$number" \ + --repo "${{ github.repository }}" \ + --add-label "$INACTIVE_LABEL" + done diff --git a/.github/workflows/issue-close-require.yml b/.github/workflows/issue-close-require.yml index 766d69d45c..c64a51b8be 100644 --- a/.github/workflows/issue-close-require.yml +++ b/.github/workflows/issue-close-require.yml @@ -4,17 +4,41 @@ on: schedule: - cron: "0 1 * * *" +permissions: + issues: write + jobs: issue-close-require: runs-on: ubuntu-latest steps: - - name: need reproduce - uses: actions-cool/issues-helper@v2 - with: - actions: 'close-issues' - labels: 'stale,state/awaiting user feedback' - inactive-day: 7 - body: | - If you do not provide feedback for more than 37 days, we will close the issue and you can either reopen it or submit a new issue. + - name: Close inactive issues awaiting user feedback + env: + GH_TOKEN: ${{ github.token }} + INACTIVE_DAY: "7" + run: | + set -euo pipefail + cutoff="$(date -u -d "${INACTIVE_DAY} days ago" +%Y-%m-%dT%H:%M:%SZ)" + body="$(cat <<'EOF' + If you do not provide feedback for more than 37 days, we will close the issue and you can either reopen it or submit a new issue. - 您超过 37 天未反馈信息,我们将关闭该 issue,如有需求您可以重新打开或者提交新的 issue。 + 您超过 37 天未反馈信息,我们将关闭该 issue,如有需求您可以重新打开或者提交新的 issue。 + EOF + )" + # Trim leading indentation from heredoc lines for a cleaner comment. + body="$(printf '%s\n' "$body" | sed 's/^[[:space:]]*//')" + + gh issue list \ + --repo "${{ github.repository }}" \ + --state open \ + --label "stale" \ + --label "state/awaiting user feedback" \ + --limit 1000 \ + --json number,updatedAt \ + | jq -c --arg cutoff "$cutoff" '.[] | select(.updatedAt < $cutoff)' \ + | while IFS= read -r issue; do + number="$(echo "$issue" | jq -r .number)" + echo "Closing issue #${number}" + gh issue close "$number" \ + --repo "${{ github.repository }}" \ + --comment "$body" + done diff --git a/.github/workflows/issue-close.yml b/.github/workflows/issue-close.yml index aa7c0ade48..6e374bf2bd 100644 --- a/.github/workflows/issue-close.yml +++ b/.github/workflows/issue-close.yml @@ -4,13 +4,19 @@ on: issues: types: [closed] +permissions: + issues: write + jobs: issue-closed-remove-labels: runs-on: ubuntu-latest if: "!contains(github.event.issue.labels.*.name, 'stale')" steps: - - name: Remove statle labels when issue that hasn't stale label is closed - uses: actions-cool/issues-helper@v2 - with: - actions: 'remove-labels' - labels: 'state/awaiting processing,state/awaiting user feedback' + - name: Remove state labels when issue that hasn't stale label is closed + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --remove-label "state/awaiting processing" \ + --remove-label "state/awaiting user feedback" || true diff --git a/.github/workflows/issue-comment.yml b/.github/workflows/issue-comment.yml index a620af8c9c..1cacfb0692 100644 --- a/.github/workflows/issue-comment.yml +++ b/.github/workflows/issue-comment.yml @@ -4,35 +4,48 @@ on: name: Add issues workflow labels +permissions: + issues: write + jobs: add-label-if-is-author: runs-on: ubuntu-latest if: (github.event.issue.user.id == github.event.comment.user.id) && !github.event.issue.pull_request && (github.event.issue.state == 'open') steps: - name: Add require handle label - uses: actions-cool/issues-helper@v2 - with: - actions: 'add-labels' - labels: 'state/awaiting processing' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --add-label "state/awaiting processing" - name: Remove require reply label - uses: actions-cool/issues-helper@v2 - with: - actions: 'remove-labels' - labels: 'state/awaiting user feedback,stale' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --remove-label "state/awaiting user feedback" \ + --remove-label "stale" || true add-label-if-not-author: runs-on: ubuntu-latest if: (github.event.issue.user.id != github.event.comment.user.id) && !github.event.issue.pull_request && (github.event.issue.state == 'open') && (!contains(github.event.comment.body, '/keep-state')) steps: - - name: Add require replay label - uses: actions-cool/issues-helper@v2 - with: - actions: 'add-labels' - labels: 'state/awaiting user feedback' + - name: Add require reply label + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --add-label "state/awaiting user feedback" - name: Remove require handle label - uses: actions-cool/issues-helper@v2 - with: - actions: 'remove-labels' - labels: 'state/awaiting processing,stale' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --remove-label "state/awaiting processing" \ + --remove-label "stale" || true diff --git a/.github/workflows/issue-open.yml b/.github/workflows/issue-open.yml index fd2f7c7b90..8505ce5292 100644 --- a/.github/workflows/issue-open.yml +++ b/.github/workflows/issue-open.yml @@ -4,22 +4,30 @@ on: issues: types: [opened, reopened] +permissions: + issues: write + jobs: issue-open-add-labels: runs-on: ubuntu-latest + if: ${{ !github.event.issue.pull_request }} steps: - name: Add labels - uses: actions-cool/issues-helper@v2 - if: ${{ !github.event.comment.pull_request.pull_request }} - with: - actions: 'add-labels' - labels: 'state/awaiting processing' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --add-label "state/awaiting processing" - name: Remove require reply label - uses: actions-cool/issues-helper@v2 - with: - actions: 'remove-labels' - labels: 'state/awaiting user feedback,stale' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh issue edit "${{ github.event.issue.number }}" \ + --repo "${{ github.repository }}" \ + --remove-label "state/awaiting user feedback" \ + --remove-label "stale" || true notify-author-comment: runs-on: ubuntu-latest diff --git a/README-CN.md b/README-CN.md index 4fe1815b74..c2eb2e9731 100644 --- a/README-CN.md +++ b/README-CN.md @@ -20,7 +20,7 @@ Cloudpods还提供了 **AI 云**,一个面向大语言模型(LLM)推理与 * 将VMware vSphere虚拟化集群转换为一个可以自服务的私有云平台 * 在混合云的场景,能够在一个界面访问私有云和公有云 * 通过一个集中的入口访问分布在多个公有云平台上的多个账号 -* 当前只使用一个云公有云账号但希望将来使用多云的用户 +* 当前只使用一个公有云账号但希望将来使用多云的用户 * 需要部署和管理 LLM 推理服务及 AI 容器应用,并需要 GPU 调度支持的用户 ## 功能 @@ -29,15 +29,15 @@ Cloudpods还提供了 **AI 云**,一个面向大语言模型(LLM)推理与 ### AI 云 -* **AI 推理服务**:部署和管理 LLM 推理实例,支持 GPU 调度、模型挂载与推理服务地址分配。 +* **AI 推理服务**:部署和管理 LLM 推理实例(支持 Ollama、vLLM、SGLang 等),支持 GPU 调度、模型挂载与推理服务地址分配。 * **AI 应用管理**:一站式部署 LLM 应用编排、智能体助手、图像生成等 AI 容器应用。 * **模型库**:统一管理模型来源、版本与缓存,支持多实例复用、离线分发,避免重复下载。 * **模板与镜像**:通过模板定义 CPU/内存/GPU 等资源规格,通过镜像管理容器运行环境,实现标准化交付。 * **GPU 运维**:GPU 设备自动探测与注册,支持 NVIDIA/CUDA 环境的统一配置与管理。 -支持的 AI 应用: -* AI 推理:Ollama -* AI 应用:OpenClaw、Dify、ComfyUI +支持的 AI 工作负载: +* AI 推理:Ollama、vLLM、SGLang +* AI 应用:OpenClaw、Dify、ComfyUI、Hermes Agent ### 支持的云平台 @@ -52,29 +52,38 @@ Cloudpods还提供了 **AI 云**,一个面向大语言模型(LLM)推理与 * 天翼云 * 移动云 * 京东云 + * 火山引擎 + * 百度云 + * 金山云 + * 青云 + * Oracle Cloud + * 联通云 * 私有云: * OpenStack * ZStack - * Alibaba Cloud Aspara (阿里飞天) + * Alibaba Cloud Apsara (阿里飞天) * Huawei HCSO (华为HCSO) * Nutanix + * BingoCloud + * OceanBase * 本地基础设施资源: * 基于 KVM 实现的轻量级私有云 - * VMWare vSphere vCenter/ESXi - * Baremetals (IPMI, Redfish API) - * Object storages (Minio, Ceph, XSky) + * VMware vSphere vCenter/ESXi + * Proxmox VE + * 裸金属 (IPMI, Redfish API) + * 对象存储 (Minio, Ceph, XSky) * NAS (Ceph) ### 支持的云资源 -* Servers: instances, disks, network interfaces, networks, vpcs, storages, hosts, wires, snapshots, snapshot policies, security groups, elastic IPs, SSH keypairs, images -* Load Balancers: instances, listeners, backend groups, backends, TLS certificates, ACLs -* Object Storage: buckets, objects -* NAS: file_systems, access_groups, mount_targets -* RDS: instances, accounts, backups, databases, parameters, privileges -* Elastic Cache: instances, accounts, backups, parameters -* DNS: DNS zones, DNS records -* VPC: VPCs, VPC peering, inter-VPC network, NAT gateway, DNAT/SNAT rules, route tables, route entries +* 服务器:实例、磁盘、网卡、网络、VPC、存储、宿主机、二层网络、快照、快照策略、安全组、弹性 IP、SSH 密钥对、镜像 +* 负载均衡:实例、监听、后端服务器组、后端服务器、TLS 证书、访问控制 +* 对象存储:存储桶、对象 +* NAS:文件系统、权限组、挂载点 +* RDS:实例、账号、备份、数据库、参数、权限 +* 弹性缓存:实例、账号、备份、参数 +* DNS:DNS 区域、DNS 记录 +* VPC:VPC、VPC 对等连接、跨 VPC 网络、NAT 网关、DNAT/SNAT 规则、路由表、路由条目 ## 安装部署 diff --git a/README.md b/README.md index 90202926fa..b44086ac5b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Cloudpods also provides **AI Cloud**, a unified management platform for large la * Those who need a compact and fully automatic baremetal lift-cycle management solution * Those who want to turn a VMware vSphere virtualization cluster into a private cloud * Those who need a cohesive view of both public and private cloud in a hybrid cloud setup -* Those who need a centric portal to access multiple acccounts from multiple public clouds +* Those who need a centric portal to access multiple accounts from multiple public clouds * Those who is currently using a single cloud account, but will not lose the possibility to adopt multicloud strategy * Those who need to deploy and manage LLM inference services and AI container applications with GPU support @@ -29,15 +29,15 @@ See [Introduction](https://www.cloudpods.org/docs/introduction/) for details. ### AI Cloud -* **AI Inference Services**: Deploy and manage LLM inference instances with GPU scheduling, model mounting, and inference service address allocation. +* **AI Inference Services**: Deploy and manage LLM inference instances (Ollama, vLLM, SGLang, and more) with GPU scheduling, model mounting, and inference service address allocation. * **AI Application Management**: One-stop deployment of LLM application orchestration, agent assistants, image generation, and other AI container applications. * **Model Library**: Unified management of model sources, versions, and caches, supporting multi-instance reuse and offline distribution. * **Templates and Images**: Define resource specifications (CPU/memory/GPU) through templates, manage container runtime environments through images. * **GPU Operations**: Automatic GPU device detection and registration, unified NVIDIA/CUDA environment configuration and management. -Supported AI applications: -* AI Inference: Ollama -* AI Applications: OpenClaw, Dify, ComfyUI +Supported AI workloads: +* AI Inference: Ollama, vLLM, SGLang +* AI Applications: OpenClaw, Dify, ComfyUI, Hermes Agent ### Supported cloud providers @@ -52,15 +52,24 @@ Supported AI applications: * Ctyun (China Telecom) * ECloud (China Mobile) * JDCloud + * Volcengine + * Baidu Cloud + * Kingsoft Cloud + * QingCloud + * Oracle Cloud + * China Unicom Cloud * Private Clouds: * OpenStack * ZStack - * Alibaba Cloud Aspara + * Alibaba Cloud Apsara * Huawei HCSO * Nutanix + * BingoCloud + * OceanBase * On-premise resources: * Lightweight private cloud built on KVM - * VMWare vSphere vCenter/ESXi + * VMware vSphere vCenter/ESXi + * Proxmox VE * Baremetals (IPMI, Redfish API) * Object storages (Minio, Ceph, XSky) * NAS (Ceph) @@ -99,7 +108,7 @@ Please check this [issue](https://github.com/yunionio/cloudpods/issues/11427) fo ## Changelog -See [Relase Notes](https://www.cloudpods.org/en/docs/release-notes/) and [Changelog](https://www.cloudpods.org/en/docs/development/changelog/) for details. +See [Release Notes](https://www.cloudpods.org/en/docs/release-notes/) and [Changelog](https://www.cloudpods.org/en/docs/development/changelog/) for details. ## Contribution @@ -112,4 +121,3 @@ Apache License 2.0. See [LICENSE](./LICENSE). ## AI-generated doc [DeepWiki](https://deepwiki.com/yunionio/cloudpods) provides an amazing AI-generated doc of this project, you may refer to it for more detailed and comprehensive understanding of codes. -