From 1ba8ea1240d1b88fa806a43dde9b71f921a6651b Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Wed, 6 May 2026 14:26:54 +0500 Subject: [PATCH 1/9] docs: add platform licenses reference Signed-off-by: tym83 <6355522@gmail.com> --- content/en/docs/_include/licenses.md | 201 ++++++++++++++++++ .../next/operations/configuration/licenses.md | 8 + .../v1.2/operations/configuration/licenses.md | 8 + 3 files changed, 217 insertions(+) create mode 100644 content/en/docs/_include/licenses.md create mode 100644 content/en/docs/next/operations/configuration/licenses.md create mode 100644 content/en/docs/v1.2/operations/configuration/licenses.md diff --git a/content/en/docs/_include/licenses.md b/content/en/docs/_include/licenses.md new file mode 100644 index 00000000..118bbf8c --- /dev/null +++ b/content/en/docs/_include/licenses.md @@ -0,0 +1,201 @@ +This page lists the licenses for the primary components packaged with Cozystack. +Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under Apache-2.0. +When a package vendors or deploys an upstream component, the table shows the upstream component license. + +{{% alert color="info" %}} +This reference covers top-level Cozystack packages from `packages/core`, `packages/system`, `packages/apps`, and `packages/extra`, plus the primary managed workload runtimes. +Container images can include additional operating-system packages and library dependencies with their own licenses. +{{% /alert %}} + +## Core Packages + +| Package | Component | License | Source | +|---|---|---|---| +| `core/flux-aio` | Cozystack Flux AIO manifests | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/flux-aio) | +| `core/installer` | Cozystack installer chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/installer) | +| `core/platform` | Cozystack Platform Package chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/platform) | +| `core/talos` | Cozystack Talos assets | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/talos) | +| `core/testing` | Cozystack test chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/testing) | + +## System Packages + +| Package | Component | License | Source | +|---|---|---|---| +| `system/application-definition-crd` | Cozystack ApplicationDefinition CRD | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/application-definition-crd) | +| `system/backup-controller` | Cozystack backup controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/backup-controller) | +| `system/backupstrategy-controller` | Cozystack backup strategy controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/backupstrategy-controller) | +| `system/bootbox` | Tinkerbell Smee | Apache-2.0 | [source](https://github.com/tinkerbell/smee/blob/main/LICENSE) | +| `system/bootbox-rd` | Cozystack Bootbox resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/bootbox-rd) | +| `system/bucket` | S3 Manager | Apache-2.0 | [source](https://github.com/cloudlena/s3manager/blob/main/LICENSE) | +| `system/bucket-rd` | Cozystack Bucket resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/bucket-rd) | +| `system/capi-operator` | Cluster API Operator | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api-operator/blob/main/LICENSE) | +| `system/capi-providers-bootstrap` | Cluster API kubeadm bootstrap provider | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE) | +| `system/capi-providers-core` | Cluster API core provider | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE) | +| `system/capi-providers-cpprovider` | Kamaji Cluster API control-plane provider | Apache-2.0 | [source](https://github.com/clastix/cluster-api-control-plane-provider-kamaji/blob/master/LICENSE) | +| `system/capi-providers-infraprovider` | KubeVirt Cluster API infrastructure provider | Apache-2.0 | [source](https://github.com/kubevirt/cluster-api-provider-kubevirt/blob/main/LICENSE) | +| `system/cert-manager` | cert-manager | Apache-2.0 | [source](https://github.com/cert-manager/cert-manager/blob/master/LICENSE) | +| `system/cert-manager-crds` | cert-manager CRDs | Apache-2.0 | [source](https://github.com/cert-manager/cert-manager/blob/master/LICENSE) | +| `system/cert-manager-issuers` | Cozystack cert-manager issuers | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cert-manager-issuers) | +| `system/cilium` | Cilium | Apache-2.0 | [source](https://github.com/cilium/cilium/blob/main/LICENSE) | +| `system/cilium-networkpolicy` | Cozystack Cilium network policies | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cilium-networkpolicy) | +| `system/clickhouse-operator` | Altinity ClickHouse Operator | Apache-2.0 | [source](https://github.com/Altinity/clickhouse-operator/blob/master/LICENSE) | +| `system/clickhouse-rd` | Cozystack ClickHouse resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/clickhouse-rd) | +| `system/cluster-autoscaler` | Kubernetes Cluster Autoscaler | Apache-2.0 | [source](https://github.com/kubernetes/autoscaler/blob/master/LICENSE) | +| `system/clustersecret-operator` | SAP ClusterSecret Operator | Apache-2.0 | [source](https://github.com/SAP/clustersecret-operator/blob/main/LICENSE) | +| `system/coredns` | CoreDNS | Apache-2.0 | [source](https://github.com/coredns/coredns/blob/master/LICENSE) | +| `system/cozy-proxy` | cozy-proxy | Apache-2.0 | [source](https://github.com/cozystack/cozy-proxy/blob/main/LICENSE) | +| `system/cozystack-api` | Cozystack API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-api) | +| `system/cozystack-basics` | Cozystack basics | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-basics) | +| `system/cozystack-controller` | Cozystack controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-controller) | +| `system/cozystack-scheduler` | Cozystack scheduler | Apache-2.0 | [source](https://github.com/cozystack/cozystack-scheduler/blob/main/LICENSE) | +| `system/dashboard` | Cozystack dashboard | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/dashboard) | +| `system/etcd-operator` | Aenix etcd Operator | Apache-2.0 | [source](https://github.com/aenix-io/etcd-operator/blob/main/LICENSE) | +| `system/etcd-rd` | Cozystack etcd resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/etcd-rd) | +| `system/external-dns` | ExternalDNS | Apache-2.0 | [source](https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md) | +| `system/external-dns-rd` | Cozystack ExternalDNS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/external-dns-rd) | +| `system/external-secrets-operator` | External Secrets Operator | Apache-2.0 | [source](https://github.com/external-secrets/external-secrets/blob/main/LICENSE) | +| `system/flux-plunger` | Cozystack Flux plunger | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/flux-plunger) | +| `system/fluxcd` | ControlPlane Flux instance chart; Flux controllers | AGPL-3.0; Apache-2.0 | [charts](https://github.com/controlplaneio-fluxcd/charts/blob/main/LICENSE), [flux](https://github.com/fluxcd/flux2/blob/main/LICENSE) | +| `system/fluxcd-operator` | ControlPlane Flux Operator | AGPL-3.0 | [source](https://github.com/controlplaneio-fluxcd/flux-operator/blob/main/LICENSE) | +| `system/foundationdb-operator` | FoundationDB Kubernetes Operator | Apache-2.0 | [source](https://github.com/FoundationDB/fdb-kubernetes-operator/blob/main/LICENSE) | +| `system/foundationdb-rd` | Cozystack FoundationDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/foundationdb-rd) | +| `system/gateway-api-crds` | Kubernetes Gateway API CRDs | Apache-2.0 | [source](https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE) | +| `system/goldpinger` | Goldpinger | Apache-2.0 | [source](https://github.com/bloomberg/goldpinger/blob/master/LICENSE) | +| `system/gpu-operator` | NVIDIA GPU Operator | Apache-2.0 | [source](https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE) | +| `system/grafana-operator` | Grafana Operator | Apache-2.0 | [source](https://github.com/grafana/grafana-operator/blob/master/LICENSE) | +| `system/hami` | HAMi | Apache-2.0 | [source](https://github.com/Project-HAMi/HAMi/blob/master/LICENSE) | +| `system/harbor` | Harbor Helm chart | Apache-2.0 | [source](https://github.com/goharbor/harbor-helm/blob/main/LICENSE) | +| `system/harbor-rd` | Cozystack Harbor resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/harbor-rd) | +| `system/hetzner-robotlb` | RobotLB | MIT | [source](https://github.com/Intreecom/robotlb/blob/master/LICENSE) | +| `system/http-cache-rd` | Cozystack HTTP cache resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/http-cache-rd) | +| `system/info-rd` | Cozystack Info resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/info-rd) | +| `system/ingress-nginx` | ingress-nginx | Apache-2.0 | [source](https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE) | +| `system/ingress-rd` | Cozystack Ingress resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/ingress-rd) | +| `system/kafka-operator` | Strimzi Kafka Operator | Apache-2.0 | [source](https://github.com/strimzi/strimzi-kafka-operator/blob/main/LICENSE) | +| `system/kafka-rd` | Cozystack Kafka resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kafka-rd) | +| `system/kamaji` | Kamaji | Apache-2.0 | [source](https://github.com/clastix/kamaji/blob/master/LICENSE) | +| `system/keycloak` | Keycloak | Apache-2.0 | [source](https://github.com/keycloak/keycloak/blob/main/LICENSE.txt) | +| `system/keycloak-configure` | Cozystack Keycloak configuration job | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/keycloak-configure) | +| `system/keycloak-operator` | KubeRocketCI Keycloak Operator | Apache-2.0 | [source](https://github.com/epam/edp-keycloak-operator/blob/master/LICENSE-2.0) | +| `system/kilo` | Kilo | Apache-2.0 | [source](https://github.com/squat/kilo/blob/main/LICENSE) | +| `system/kubeovn` | Kube-OVN chart | Apache-2.0 | [source](https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE) | +| `system/kubeovn-plunger` | Cozystack Kube-OVN plunger | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubeovn-plunger) | +| `system/kubeovn-webhook` | Cozystack Kube-OVN webhook | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubeovn-webhook) | +| `system/kubernetes-rd` | Cozystack Kubernetes resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubernetes-rd) | +| `system/kubevirt` | KubeVirt | Apache-2.0 | [source](https://github.com/kubevirt/kubevirt/blob/main/LICENSE) | +| `system/kubevirt-cdi` | KubeVirt Containerized Data Importer | Apache-2.0 | [source](https://github.com/kubevirt/containerized-data-importer/blob/main/LICENSE) | +| `system/kubevirt-cdi-operator` | KubeVirt CDI Operator | Apache-2.0 | [source](https://github.com/kubevirt/containerized-data-importer/blob/main/LICENSE) | +| `system/kubevirt-csi-node` | KubeVirt CSI driver | Apache-2.0 | [source](https://github.com/kubevirt/csi-driver/blob/main/LICENSE) | +| `system/kubevirt-instancetypes` | KubeVirt common instancetypes | Apache-2.0 | [source](https://github.com/kubevirt/common-instancetypes/blob/main/LICENSE) | +| `system/kubevirt-operator` | KubeVirt Operator | Apache-2.0 | [source](https://github.com/kubevirt/kubevirt/blob/main/LICENSE) | +| `system/lineage-controller-webhook` | Cozystack lineage controller webhook | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/lineage-controller-webhook) | +| `system/linstor` | LINSTOR Server; LINSTOR CSI | GPL-3.0; Apache-2.0 | [server](https://github.com/LINBIT/linstor-server/blob/master/LICENSE), [csi](https://github.com/piraeusdatastore/linstor-csi/blob/master/LICENSE) | +| `system/linstor-gui` | LINSTOR GUI | GPL-3.0 | [source](https://github.com/LINBIT/linstor-gui) | +| `system/linstor-scheduler` | LINSTOR scheduler extender | Apache-2.0 | [source](https://github.com/piraeusdatastore/linstor-scheduler-extender/blob/master/LICENSE) | +| `system/local-ccm` | Local Cloud Controller Manager | Apache-2.0 | [source](https://github.com/cozystack/local-ccm/blob/main/LICENSE) | +| `system/mariadb-operator` | mariadb-operator | MIT | [source](https://github.com/mariadb-operator/mariadb-operator/blob/main/LICENSE) | +| `system/mariadb-rd` | Cozystack MariaDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/mariadb-rd) | +| `system/metallb` | MetalLB | Apache-2.0 | [source](https://github.com/metallb/metallb/blob/main/LICENSE) | +| `system/metrics-server` | Metrics Server | Apache-2.0 | [source](https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE) | +| `system/mongodb-operator` | Percona Operator for MongoDB Helm chart | Apache-2.0 | [source](https://github.com/percona/percona-server-mongodb-operator/blob/main/LICENSE) | +| `system/mongodb-rd` | Cozystack MongoDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/mongodb-rd) | +| `system/monitoring` | Cozystack monitoring package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/monitoring) | +| `system/monitoring-agents` | Fluent Bit; kube-state-metrics; node-exporter | Apache-2.0 | [source](https://github.com/fluent/fluent-bit/blob/master/LICENSE) | +| `system/monitoring-rd` | Cozystack Monitoring resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/monitoring-rd) | +| `system/multus` | Multus CNI | Apache-2.0 | [source](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE) | +| `system/nats` | NATS Helm chart | Apache-2.0 | [source](https://github.com/nats-io/k8s/blob/main/LICENSE) | +| `system/nats-rd` | Cozystack NATS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/nats-rd) | +| `system/nfs-driver` | CSI Driver NFS | Apache-2.0 | [source](https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE) | +| `system/objectstorage-controller` | Container Object Storage Interface controller | Apache-2.0 | [source](https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE) | +| `system/openbao` | OpenBao Helm chart | MPL-2.0 | [source](https://github.com/openbao/openbao-helm/blob/main/LICENSE) | +| `system/openbao-rd` | Cozystack OpenBao resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/openbao-rd) | +| `system/opencost` | OpenCost Helm chart | Apache-2.0 | [source](https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE) | +| `system/opensearch-operator` | OpenSearch Operator | Apache-2.0 | [source](https://github.com/opensearch-project/opensearch-k8s-operator/blob/main/LICENSE) | +| `system/opensearch-rd` | Cozystack OpenSearch resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/opensearch-rd) | +| `system/piraeus-operator` | Piraeus Operator | Apache-2.0 | [source](https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE) | +| `system/piraeus-operator-crds` | Piraeus Operator CRDs | Apache-2.0 | [source](https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE) | +| `system/postgres-operator` | CloudNativePG operator chart | Apache-2.0 | [source](https://github.com/cloudnative-pg/charts/blob/main/LICENSE) | +| `system/postgres-rd` | Cozystack PostgreSQL resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/postgres-rd) | +| `system/prometheus-operator-crds` | Prometheus Operator CRDs chart | Apache-2.0 | [source](https://github.com/prometheus-community/helm-charts/blob/main/LICENSE) | +| `system/qdrant` | Qdrant Helm chart | Apache-2.0 | [source](https://github.com/qdrant/qdrant-helm/blob/main/LICENSE) | +| `system/qdrant-rd` | Cozystack Qdrant resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/qdrant-rd) | +| `system/rabbitmq-operator` | RabbitMQ cluster and topology operators | MPL-2.0 | [source](https://github.com/rabbitmq/cluster-operator/blob/main/LICENSE.txt) | +| `system/rabbitmq-rd` | Cozystack RabbitMQ resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/rabbitmq-rd) | +| `system/redis-operator` | Spotahome Redis Operator | Apache-2.0 | [source](https://github.com/spotahome/redis-operator/blob/master/LICENSE) | +| `system/redis-rd` | Cozystack Redis resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/redis-rd) | +| `system/reloader` | Stakater Reloader | Apache-2.0 | [source](https://github.com/stakater/Reloader/blob/master/LICENSE) | +| `system/seaweedfs` | SeaweedFS Helm chart | Apache-2.0 | [source](https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE) | +| `system/seaweedfs-rd` | Cozystack SeaweedFS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/seaweedfs-rd) | +| `system/snapshot-controller` | CSI external snapshotter | Apache-2.0 | [source](https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE) | +| `system/tcp-balancer-rd` | Cozystack TCP balancer resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/tcp-balancer-rd) | +| `system/telepresence` | Telepresence Traffic Manager chart | Apache-2.0 | [source](https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE) | +| `system/tenant-rd` | Cozystack Tenant resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/tenant-rd) | +| `system/velero` | Velero Helm chart | Apache-2.0 | [source](https://github.com/velero-io/velero/blob/main/LICENSE) | +| `system/vertical-pod-autoscaler` | Vertical Pod Autoscaler chart | MIT; Apache-2.0 | [source](https://github.com/cowboysysop/charts/blob/master/LICENSE) | +| `system/vertical-pod-autoscaler-crds` | Vertical Pod Autoscaler CRDs | Apache-2.0 | [source](https://github.com/kubernetes/autoscaler/blob/master/LICENSE) | +| `system/victoria-metrics-operator` | VictoriaMetrics Operator chart | Apache-2.0 | [source](https://github.com/VictoriaMetrics/operator/blob/master/LICENSE) | +| `system/virtualprivatecloud-rd` | Cozystack VPC resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/virtualprivatecloud-rd) | +| `system/vm-default-images` | Cozystack VM default image catalog | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-default-images) | +| `system/vm-disk-rd` | Cozystack VM disk resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-disk-rd) | +| `system/vm-instance-rd` | Cozystack VM instance resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-instance-rd) | +| `system/vpn-rd` | Cozystack VPN resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vpn-rd) | +| `system/vsnap-crd` | CSI VolumeSnapshot CRDs | Apache-2.0 | [source](https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE) | + +## Application and Extra Packages + +The following packages define Cozystack application APIs and tenant-level extras. Their package source is Apache-2.0; runtime software licenses for managed services are listed in the next section. + +| Package | Component | License | Source | +|---|---|---|---| +| `apps/bucket` | Cozystack Bucket application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/bucket) | +| `apps/clickhouse` | Cozystack ClickHouse application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/clickhouse) | +| `apps/foundationdb` | Cozystack FoundationDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/foundationdb) | +| `apps/harbor` | Cozystack Harbor application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/harbor) | +| `apps/http-cache` | Cozystack HTTP cache application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/http-cache) | +| `apps/kafka` | Cozystack Kafka application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/kafka) | +| `apps/kubernetes` | Cozystack Kubernetes application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/kubernetes) | +| `apps/mariadb` | Cozystack MariaDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/mariadb) | +| `apps/mongodb` | Cozystack MongoDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/mongodb) | +| `apps/nats` | Cozystack NATS application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/nats) | +| `apps/openbao` | Cozystack OpenBao application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/openbao) | +| `apps/opensearch` | Cozystack OpenSearch application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/opensearch) | +| `apps/postgres` | Cozystack PostgreSQL application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/postgres) | +| `apps/qdrant` | Cozystack Qdrant application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/qdrant) | +| `apps/rabbitmq` | Cozystack RabbitMQ application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/rabbitmq) | +| `apps/redis` | Cozystack Redis application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/redis) | +| `apps/tcp-balancer` | Cozystack TCP balancer application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/tcp-balancer) | +| `apps/tenant` | Cozystack Tenant application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/tenant) | +| `apps/vm-disk` | Cozystack VM disk application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vm-disk) | +| `apps/vm-instance` | Cozystack VM instance application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vm-instance) | +| `apps/vpc` | Cozystack VPC application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vpc) | +| `apps/vpn` | Cozystack VPN application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vpn) | +| `extra/bootbox` | Cozystack Bootbox extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/bootbox) | +| `extra/etcd` | Cozystack etcd extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/etcd) | +| `extra/external-dns` | Cozystack ExternalDNS extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/external-dns) | +| `extra/info` | Cozystack Info extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/info) | +| `extra/ingress` | Cozystack Ingress extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/ingress) | +| `extra/monitoring` | Cozystack Monitoring extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/monitoring) | +| `extra/seaweedfs` | Cozystack SeaweedFS extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/seaweedfs) | + +## Managed Workload Runtimes + +| Managed service | Runtime component | License | Source | +|---|---|---|---| +| Bucket/Object Storage | SeaweedFS; S3 Manager | Apache-2.0 | [seaweedfs](https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE), [s3manager](https://github.com/cloudlena/s3manager/blob/main/LICENSE) | +| ClickHouse | ClickHouse Server and ClickHouse Keeper | Apache-2.0 | [source](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE) | +| FoundationDB | FoundationDB | Apache-2.0 | [source](https://github.com/apple/foundationdb/blob/main/LICENSE) | +| Harbor | Harbor | Apache-2.0 | [source](https://github.com/goharbor/harbor/blob/main/LICENSE) | +| HTTP Cache | NGINX; HAProxy; IP2Location/IP2Proxy modules | BSD-2-Clause; GPL-2.0 with exceptions; MIT | [nginx](https://github.com/nginx/nginx/blob/master/LICENSE), [haproxy](https://github.com/haproxy/haproxy/blob/master/LICENSE), [ip2location](https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE), [ip2proxy](https://github.com/ip2location/ip2proxy-nginx/blob/master/LICENSE) | +| Kafka | Apache Kafka through Strimzi | Apache-2.0 | [source](https://github.com/apache/kafka/blob/trunk/LICENSE) | +| Kubernetes | Kubernetes control plane and add-ons | Apache-2.0 | [source](https://github.com/kubernetes/kubernetes/blob/master/LICENSE) | +| MariaDB | MariaDB Server | GPL-2.0 | [source](https://github.com/MariaDB/server/blob/main/COPYING) | +| MongoDB | Percona Server for MongoDB | SSPL-1.0 | [source](https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt) | +| NATS | NATS Server | Apache-2.0 | [source](https://github.com/nats-io/nats-server/blob/main/LICENSE) | +| OpenBao | OpenBao | MPL-2.0 | [source](https://github.com/openbao/openbao/blob/main/LICENSE) | +| OpenSearch | OpenSearch | Apache-2.0 | [source](https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt) | +| PostgreSQL | PostgreSQL | PostgreSQL License | [source](https://www.postgresql.org/about/licence/) | +| Qdrant | Qdrant | Apache-2.0 | [source](https://github.com/qdrant/qdrant/blob/master/LICENSE) | +| RabbitMQ | RabbitMQ Server | MPL-2.0; Apache-2.0 for some files | [source](https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE) | +| Redis | Redis 7.4 and Redis 8 | RSALv2 or SSPLv1; Redis 8 also AGPLv3 | [source](https://redis.io/legal/licenses/) | +| TCP Balancer | HAProxy | GPL-2.0 with exceptions | [source](https://github.com/haproxy/haproxy/blob/master/LICENSE) | +| VPN | Outline Shadowsocks server | Apache-2.0 | [source](https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE) | diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.2/operations/configuration/licenses.md b/content/en/docs/v1.2/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/v1.2/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} From da836bdbb077396da9ba096fd2c7eb28572453fa Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Wed, 6 May 2026 23:54:47 +0500 Subject: [PATCH 2/9] docs: publish licenses page for all versions Signed-off-by: tym83 <6355522@gmail.com> --- content/en/docs/v0/operations/configuration/licenses.md | 8 ++++++++ content/en/docs/v1.0/operations/configuration/licenses.md | 8 ++++++++ content/en/docs/v1.1/operations/configuration/licenses.md | 8 ++++++++ content/en/docs/v1.3/operations/configuration/licenses.md | 8 ++++++++ 4 files changed, 32 insertions(+) create mode 100644 content/en/docs/v0/operations/configuration/licenses.md create mode 100644 content/en/docs/v1.0/operations/configuration/licenses.md create mode 100644 content/en/docs/v1.1/operations/configuration/licenses.md create mode 100644 content/en/docs/v1.3/operations/configuration/licenses.md diff --git a/content/en/docs/v0/operations/configuration/licenses.md b/content/en/docs/v0/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/v0/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.0/operations/configuration/licenses.md b/content/en/docs/v1.0/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/v1.0/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.1/operations/configuration/licenses.md b/content/en/docs/v1.1/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/v1.1/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md new file mode 100644 index 00000000..cc2bc9f9 --- /dev/null +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -0,0 +1,8 @@ +--- +title: "Licenses" +linkTitle: "Licenses" +description: "License reference for Cozystack platform components." +weight: 40 +--- + +{{< include "docs/_include/licenses.md" >}} From 614c6a553c1a01f62fb1459639f5fdb3c4886f86 Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 14:03:09 +0500 Subject: [PATCH 3/9] docs(licenses): rework as oss-card grid, scope to next + v1.3 Aggregate sub-components into top-level entries (one KubeVirt instead of six packages, one LINSTOR/Piraeus instead of four, etc.) and present them as a card grid inspired by the Deckhouse OSS-info layout. Address @myasnikovdaniil review on #530: - drop license pages from v0/v1.0/v1.1/v1.2 (frozen per-release snapshots, current package list doesn't apply to those releases) - drop shared _include/licenses.md and inline content per version (matches existing per-version _include/ convention by avoiding it) - monitoring agents and LINSTOR sub-components now linked to the correct upstream LICENSE files Generator script tracked as a separate follow-up. Signed-off-by: tym83 <6355522@gmail.com> --- assets/scss/_oss_info.scss | 138 ++++++++++++ assets/scss/main.scss | 1 + content/en/docs/_include/licenses.md | 201 ------------------ .../next/operations/configuration/licenses.md | 130 ++++++++++- .../v0/operations/configuration/licenses.md | 8 - .../v1.0/operations/configuration/licenses.md | 8 - .../v1.1/operations/configuration/licenses.md | 8 - .../v1.2/operations/configuration/licenses.md | 8 - .../v1.3/operations/configuration/licenses.md | 130 ++++++++++- layouts/shortcodes/oss-card.html | 46 ++++ layouts/shortcodes/oss-cards.html | 12 ++ 11 files changed, 451 insertions(+), 239 deletions(-) create mode 100644 assets/scss/_oss_info.scss delete mode 100644 content/en/docs/_include/licenses.md delete mode 100644 content/en/docs/v0/operations/configuration/licenses.md delete mode 100644 content/en/docs/v1.0/operations/configuration/licenses.md delete mode 100644 content/en/docs/v1.1/operations/configuration/licenses.md delete mode 100644 content/en/docs/v1.2/operations/configuration/licenses.md create mode 100644 layouts/shortcodes/oss-card.html create mode 100644 layouts/shortcodes/oss-cards.html diff --git a/assets/scss/_oss_info.scss b/assets/scss/_oss_info.scss new file mode 100644 index 00000000..f3679251 --- /dev/null +++ b/assets/scss/_oss_info.scss @@ -0,0 +1,138 @@ +// Component cards for /operations/configuration/licenses/ +// Inspired by Deckhouse OSS-info layout. + +.oss-cards-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1rem; + margin: 1.5rem 0 2rem; + + // Hugo wraps shortcode output in

when the parent is markdown. + // Flatten that so cards sit directly in the grid. + > p { + display: contents; + } +} + +.oss-card { + display: flex; + flex-direction: column; + gap: .5rem; + padding: 1rem 1.1rem; + border: 1px solid var(--bs-gray-300, #dee2e6); + border-radius: .5rem; + background: var(--bs-body-bg, #fff); + transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease; + + &:hover { + border-color: var(--bs-primary, #0d6efd); + box-shadow: 0 2px 8px rgba(0, 0, 0, .06); + transform: translateY(-1px); + } +} + +.oss-card-head { + display: flex; + align-items: center; + gap: .65rem; +} + +.oss-card-logo { + width: 36px; + height: 36px; + flex-shrink: 0; + object-fit: contain; + border-radius: 6px; +} + +.oss-card-logo-fallback { + display: inline-flex; + align-items: center; + justify-content: center; + font-family: var(--bs-font-monospace, ui-monospace, monospace); + font-size: .8rem; + font-weight: 600; + letter-spacing: .02em; + color: #fff; + background: hsl(var(--oss-hue, 210), 55%, 45%); + user-select: none; +} + +.oss-card-titleblock { + display: flex; + flex-direction: column; + min-width: 0; +} + +.oss-card-title { + font-weight: 600; + font-size: 1rem; + line-height: 1.25; + color: inherit; + text-decoration: none; + word-break: break-word; + + &:hover { + color: var(--bs-primary, #0d6efd); + text-decoration: underline; + } +} + +.oss-card-version { + font-family: var(--bs-font-monospace, ui-monospace, monospace); + font-size: .8rem; + color: var(--bs-secondary, #6c757d); + margin-top: 1px; +} + +.oss-card-desc { + margin: 0; + font-size: .9rem; + color: var(--bs-body-color, #212529); + line-height: 1.4; +} + +.oss-card-meta { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: .35rem; + font-size: .82rem; + color: var(--bs-secondary, #6c757d); + margin-top: auto; + padding-top: .25rem; +} + +.oss-card-license { + font-family: var(--bs-font-monospace, ui-monospace, monospace); + background: var(--bs-gray-100, #f8f9fa); + border: 1px solid var(--bs-gray-200, #e9ecef); + border-radius: 3px; + padding: .05rem .4rem; + color: var(--bs-body-color, #212529); + font-size: .78rem; +} + +.oss-card-usedin { + color: inherit; + text-decoration: none; + border-bottom: 1px dashed currentColor; + + &:hover { + color: var(--bs-primary, #0d6efd); + border-bottom-style: solid; + } +} + +// Dark mode (Docsy supports it via data-bs-theme="dark") +[data-bs-theme="dark"] { + .oss-card { + border-color: var(--bs-gray-700, #495057); + background: var(--bs-gray-900, #212529); + } + + .oss-card-license { + background: var(--bs-gray-800, #343a40); + border-color: var(--bs-gray-700, #495057); + } +} diff --git a/assets/scss/main.scss b/assets/scss/main.scss index e91fab0b..89999676 100644 --- a/assets/scss/main.scss +++ b/assets/scss/main.scss @@ -157,6 +157,7 @@ a { @import "support"; @import "ecosystem"; @import "oss_health"; +@import "oss_info"; @import "adopters_wall"; @import "announcement-banner"; @import "tabs_alerts"; diff --git a/content/en/docs/_include/licenses.md b/content/en/docs/_include/licenses.md deleted file mode 100644 index 118bbf8c..00000000 --- a/content/en/docs/_include/licenses.md +++ /dev/null @@ -1,201 +0,0 @@ -This page lists the licenses for the primary components packaged with Cozystack. -Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under Apache-2.0. -When a package vendors or deploys an upstream component, the table shows the upstream component license. - -{{% alert color="info" %}} -This reference covers top-level Cozystack packages from `packages/core`, `packages/system`, `packages/apps`, and `packages/extra`, plus the primary managed workload runtimes. -Container images can include additional operating-system packages and library dependencies with their own licenses. -{{% /alert %}} - -## Core Packages - -| Package | Component | License | Source | -|---|---|---|---| -| `core/flux-aio` | Cozystack Flux AIO manifests | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/flux-aio) | -| `core/installer` | Cozystack installer chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/installer) | -| `core/platform` | Cozystack Platform Package chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/platform) | -| `core/talos` | Cozystack Talos assets | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/talos) | -| `core/testing` | Cozystack test chart | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/core/testing) | - -## System Packages - -| Package | Component | License | Source | -|---|---|---|---| -| `system/application-definition-crd` | Cozystack ApplicationDefinition CRD | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/application-definition-crd) | -| `system/backup-controller` | Cozystack backup controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/backup-controller) | -| `system/backupstrategy-controller` | Cozystack backup strategy controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/backupstrategy-controller) | -| `system/bootbox` | Tinkerbell Smee | Apache-2.0 | [source](https://github.com/tinkerbell/smee/blob/main/LICENSE) | -| `system/bootbox-rd` | Cozystack Bootbox resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/bootbox-rd) | -| `system/bucket` | S3 Manager | Apache-2.0 | [source](https://github.com/cloudlena/s3manager/blob/main/LICENSE) | -| `system/bucket-rd` | Cozystack Bucket resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/bucket-rd) | -| `system/capi-operator` | Cluster API Operator | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api-operator/blob/main/LICENSE) | -| `system/capi-providers-bootstrap` | Cluster API kubeadm bootstrap provider | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE) | -| `system/capi-providers-core` | Cluster API core provider | Apache-2.0 | [source](https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE) | -| `system/capi-providers-cpprovider` | Kamaji Cluster API control-plane provider | Apache-2.0 | [source](https://github.com/clastix/cluster-api-control-plane-provider-kamaji/blob/master/LICENSE) | -| `system/capi-providers-infraprovider` | KubeVirt Cluster API infrastructure provider | Apache-2.0 | [source](https://github.com/kubevirt/cluster-api-provider-kubevirt/blob/main/LICENSE) | -| `system/cert-manager` | cert-manager | Apache-2.0 | [source](https://github.com/cert-manager/cert-manager/blob/master/LICENSE) | -| `system/cert-manager-crds` | cert-manager CRDs | Apache-2.0 | [source](https://github.com/cert-manager/cert-manager/blob/master/LICENSE) | -| `system/cert-manager-issuers` | Cozystack cert-manager issuers | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cert-manager-issuers) | -| `system/cilium` | Cilium | Apache-2.0 | [source](https://github.com/cilium/cilium/blob/main/LICENSE) | -| `system/cilium-networkpolicy` | Cozystack Cilium network policies | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cilium-networkpolicy) | -| `system/clickhouse-operator` | Altinity ClickHouse Operator | Apache-2.0 | [source](https://github.com/Altinity/clickhouse-operator/blob/master/LICENSE) | -| `system/clickhouse-rd` | Cozystack ClickHouse resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/clickhouse-rd) | -| `system/cluster-autoscaler` | Kubernetes Cluster Autoscaler | Apache-2.0 | [source](https://github.com/kubernetes/autoscaler/blob/master/LICENSE) | -| `system/clustersecret-operator` | SAP ClusterSecret Operator | Apache-2.0 | [source](https://github.com/SAP/clustersecret-operator/blob/main/LICENSE) | -| `system/coredns` | CoreDNS | Apache-2.0 | [source](https://github.com/coredns/coredns/blob/master/LICENSE) | -| `system/cozy-proxy` | cozy-proxy | Apache-2.0 | [source](https://github.com/cozystack/cozy-proxy/blob/main/LICENSE) | -| `system/cozystack-api` | Cozystack API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-api) | -| `system/cozystack-basics` | Cozystack basics | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-basics) | -| `system/cozystack-controller` | Cozystack controller | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/cozystack-controller) | -| `system/cozystack-scheduler` | Cozystack scheduler | Apache-2.0 | [source](https://github.com/cozystack/cozystack-scheduler/blob/main/LICENSE) | -| `system/dashboard` | Cozystack dashboard | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/dashboard) | -| `system/etcd-operator` | Aenix etcd Operator | Apache-2.0 | [source](https://github.com/aenix-io/etcd-operator/blob/main/LICENSE) | -| `system/etcd-rd` | Cozystack etcd resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/etcd-rd) | -| `system/external-dns` | ExternalDNS | Apache-2.0 | [source](https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md) | -| `system/external-dns-rd` | Cozystack ExternalDNS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/external-dns-rd) | -| `system/external-secrets-operator` | External Secrets Operator | Apache-2.0 | [source](https://github.com/external-secrets/external-secrets/blob/main/LICENSE) | -| `system/flux-plunger` | Cozystack Flux plunger | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/flux-plunger) | -| `system/fluxcd` | ControlPlane Flux instance chart; Flux controllers | AGPL-3.0; Apache-2.0 | [charts](https://github.com/controlplaneio-fluxcd/charts/blob/main/LICENSE), [flux](https://github.com/fluxcd/flux2/blob/main/LICENSE) | -| `system/fluxcd-operator` | ControlPlane Flux Operator | AGPL-3.0 | [source](https://github.com/controlplaneio-fluxcd/flux-operator/blob/main/LICENSE) | -| `system/foundationdb-operator` | FoundationDB Kubernetes Operator | Apache-2.0 | [source](https://github.com/FoundationDB/fdb-kubernetes-operator/blob/main/LICENSE) | -| `system/foundationdb-rd` | Cozystack FoundationDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/foundationdb-rd) | -| `system/gateway-api-crds` | Kubernetes Gateway API CRDs | Apache-2.0 | [source](https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE) | -| `system/goldpinger` | Goldpinger | Apache-2.0 | [source](https://github.com/bloomberg/goldpinger/blob/master/LICENSE) | -| `system/gpu-operator` | NVIDIA GPU Operator | Apache-2.0 | [source](https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE) | -| `system/grafana-operator` | Grafana Operator | Apache-2.0 | [source](https://github.com/grafana/grafana-operator/blob/master/LICENSE) | -| `system/hami` | HAMi | Apache-2.0 | [source](https://github.com/Project-HAMi/HAMi/blob/master/LICENSE) | -| `system/harbor` | Harbor Helm chart | Apache-2.0 | [source](https://github.com/goharbor/harbor-helm/blob/main/LICENSE) | -| `system/harbor-rd` | Cozystack Harbor resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/harbor-rd) | -| `system/hetzner-robotlb` | RobotLB | MIT | [source](https://github.com/Intreecom/robotlb/blob/master/LICENSE) | -| `system/http-cache-rd` | Cozystack HTTP cache resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/http-cache-rd) | -| `system/info-rd` | Cozystack Info resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/info-rd) | -| `system/ingress-nginx` | ingress-nginx | Apache-2.0 | [source](https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE) | -| `system/ingress-rd` | Cozystack Ingress resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/ingress-rd) | -| `system/kafka-operator` | Strimzi Kafka Operator | Apache-2.0 | [source](https://github.com/strimzi/strimzi-kafka-operator/blob/main/LICENSE) | -| `system/kafka-rd` | Cozystack Kafka resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kafka-rd) | -| `system/kamaji` | Kamaji | Apache-2.0 | [source](https://github.com/clastix/kamaji/blob/master/LICENSE) | -| `system/keycloak` | Keycloak | Apache-2.0 | [source](https://github.com/keycloak/keycloak/blob/main/LICENSE.txt) | -| `system/keycloak-configure` | Cozystack Keycloak configuration job | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/keycloak-configure) | -| `system/keycloak-operator` | KubeRocketCI Keycloak Operator | Apache-2.0 | [source](https://github.com/epam/edp-keycloak-operator/blob/master/LICENSE-2.0) | -| `system/kilo` | Kilo | Apache-2.0 | [source](https://github.com/squat/kilo/blob/main/LICENSE) | -| `system/kubeovn` | Kube-OVN chart | Apache-2.0 | [source](https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE) | -| `system/kubeovn-plunger` | Cozystack Kube-OVN plunger | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubeovn-plunger) | -| `system/kubeovn-webhook` | Cozystack Kube-OVN webhook | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubeovn-webhook) | -| `system/kubernetes-rd` | Cozystack Kubernetes resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/kubernetes-rd) | -| `system/kubevirt` | KubeVirt | Apache-2.0 | [source](https://github.com/kubevirt/kubevirt/blob/main/LICENSE) | -| `system/kubevirt-cdi` | KubeVirt Containerized Data Importer | Apache-2.0 | [source](https://github.com/kubevirt/containerized-data-importer/blob/main/LICENSE) | -| `system/kubevirt-cdi-operator` | KubeVirt CDI Operator | Apache-2.0 | [source](https://github.com/kubevirt/containerized-data-importer/blob/main/LICENSE) | -| `system/kubevirt-csi-node` | KubeVirt CSI driver | Apache-2.0 | [source](https://github.com/kubevirt/csi-driver/blob/main/LICENSE) | -| `system/kubevirt-instancetypes` | KubeVirt common instancetypes | Apache-2.0 | [source](https://github.com/kubevirt/common-instancetypes/blob/main/LICENSE) | -| `system/kubevirt-operator` | KubeVirt Operator | Apache-2.0 | [source](https://github.com/kubevirt/kubevirt/blob/main/LICENSE) | -| `system/lineage-controller-webhook` | Cozystack lineage controller webhook | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/lineage-controller-webhook) | -| `system/linstor` | LINSTOR Server; LINSTOR CSI | GPL-3.0; Apache-2.0 | [server](https://github.com/LINBIT/linstor-server/blob/master/LICENSE), [csi](https://github.com/piraeusdatastore/linstor-csi/blob/master/LICENSE) | -| `system/linstor-gui` | LINSTOR GUI | GPL-3.0 | [source](https://github.com/LINBIT/linstor-gui) | -| `system/linstor-scheduler` | LINSTOR scheduler extender | Apache-2.0 | [source](https://github.com/piraeusdatastore/linstor-scheduler-extender/blob/master/LICENSE) | -| `system/local-ccm` | Local Cloud Controller Manager | Apache-2.0 | [source](https://github.com/cozystack/local-ccm/blob/main/LICENSE) | -| `system/mariadb-operator` | mariadb-operator | MIT | [source](https://github.com/mariadb-operator/mariadb-operator/blob/main/LICENSE) | -| `system/mariadb-rd` | Cozystack MariaDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/mariadb-rd) | -| `system/metallb` | MetalLB | Apache-2.0 | [source](https://github.com/metallb/metallb/blob/main/LICENSE) | -| `system/metrics-server` | Metrics Server | Apache-2.0 | [source](https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE) | -| `system/mongodb-operator` | Percona Operator for MongoDB Helm chart | Apache-2.0 | [source](https://github.com/percona/percona-server-mongodb-operator/blob/main/LICENSE) | -| `system/mongodb-rd` | Cozystack MongoDB resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/mongodb-rd) | -| `system/monitoring` | Cozystack monitoring package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/monitoring) | -| `system/monitoring-agents` | Fluent Bit; kube-state-metrics; node-exporter | Apache-2.0 | [source](https://github.com/fluent/fluent-bit/blob/master/LICENSE) | -| `system/monitoring-rd` | Cozystack Monitoring resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/monitoring-rd) | -| `system/multus` | Multus CNI | Apache-2.0 | [source](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE) | -| `system/nats` | NATS Helm chart | Apache-2.0 | [source](https://github.com/nats-io/k8s/blob/main/LICENSE) | -| `system/nats-rd` | Cozystack NATS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/nats-rd) | -| `system/nfs-driver` | CSI Driver NFS | Apache-2.0 | [source](https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE) | -| `system/objectstorage-controller` | Container Object Storage Interface controller | Apache-2.0 | [source](https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE) | -| `system/openbao` | OpenBao Helm chart | MPL-2.0 | [source](https://github.com/openbao/openbao-helm/blob/main/LICENSE) | -| `system/openbao-rd` | Cozystack OpenBao resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/openbao-rd) | -| `system/opencost` | OpenCost Helm chart | Apache-2.0 | [source](https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE) | -| `system/opensearch-operator` | OpenSearch Operator | Apache-2.0 | [source](https://github.com/opensearch-project/opensearch-k8s-operator/blob/main/LICENSE) | -| `system/opensearch-rd` | Cozystack OpenSearch resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/opensearch-rd) | -| `system/piraeus-operator` | Piraeus Operator | Apache-2.0 | [source](https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE) | -| `system/piraeus-operator-crds` | Piraeus Operator CRDs | Apache-2.0 | [source](https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE) | -| `system/postgres-operator` | CloudNativePG operator chart | Apache-2.0 | [source](https://github.com/cloudnative-pg/charts/blob/main/LICENSE) | -| `system/postgres-rd` | Cozystack PostgreSQL resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/postgres-rd) | -| `system/prometheus-operator-crds` | Prometheus Operator CRDs chart | Apache-2.0 | [source](https://github.com/prometheus-community/helm-charts/blob/main/LICENSE) | -| `system/qdrant` | Qdrant Helm chart | Apache-2.0 | [source](https://github.com/qdrant/qdrant-helm/blob/main/LICENSE) | -| `system/qdrant-rd` | Cozystack Qdrant resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/qdrant-rd) | -| `system/rabbitmq-operator` | RabbitMQ cluster and topology operators | MPL-2.0 | [source](https://github.com/rabbitmq/cluster-operator/blob/main/LICENSE.txt) | -| `system/rabbitmq-rd` | Cozystack RabbitMQ resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/rabbitmq-rd) | -| `system/redis-operator` | Spotahome Redis Operator | Apache-2.0 | [source](https://github.com/spotahome/redis-operator/blob/master/LICENSE) | -| `system/redis-rd` | Cozystack Redis resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/redis-rd) | -| `system/reloader` | Stakater Reloader | Apache-2.0 | [source](https://github.com/stakater/Reloader/blob/master/LICENSE) | -| `system/seaweedfs` | SeaweedFS Helm chart | Apache-2.0 | [source](https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE) | -| `system/seaweedfs-rd` | Cozystack SeaweedFS resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/seaweedfs-rd) | -| `system/snapshot-controller` | CSI external snapshotter | Apache-2.0 | [source](https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE) | -| `system/tcp-balancer-rd` | Cozystack TCP balancer resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/tcp-balancer-rd) | -| `system/telepresence` | Telepresence Traffic Manager chart | Apache-2.0 | [source](https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE) | -| `system/tenant-rd` | Cozystack Tenant resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/tenant-rd) | -| `system/velero` | Velero Helm chart | Apache-2.0 | [source](https://github.com/velero-io/velero/blob/main/LICENSE) | -| `system/vertical-pod-autoscaler` | Vertical Pod Autoscaler chart | MIT; Apache-2.0 | [source](https://github.com/cowboysysop/charts/blob/master/LICENSE) | -| `system/vertical-pod-autoscaler-crds` | Vertical Pod Autoscaler CRDs | Apache-2.0 | [source](https://github.com/kubernetes/autoscaler/blob/master/LICENSE) | -| `system/victoria-metrics-operator` | VictoriaMetrics Operator chart | Apache-2.0 | [source](https://github.com/VictoriaMetrics/operator/blob/master/LICENSE) | -| `system/virtualprivatecloud-rd` | Cozystack VPC resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/virtualprivatecloud-rd) | -| `system/vm-default-images` | Cozystack VM default image catalog | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-default-images) | -| `system/vm-disk-rd` | Cozystack VM disk resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-disk-rd) | -| `system/vm-instance-rd` | Cozystack VM instance resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vm-instance-rd) | -| `system/vpn-rd` | Cozystack VPN resource definition | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/system/vpn-rd) | -| `system/vsnap-crd` | CSI VolumeSnapshot CRDs | Apache-2.0 | [source](https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE) | - -## Application and Extra Packages - -The following packages define Cozystack application APIs and tenant-level extras. Their package source is Apache-2.0; runtime software licenses for managed services are listed in the next section. - -| Package | Component | License | Source | -|---|---|---|---| -| `apps/bucket` | Cozystack Bucket application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/bucket) | -| `apps/clickhouse` | Cozystack ClickHouse application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/clickhouse) | -| `apps/foundationdb` | Cozystack FoundationDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/foundationdb) | -| `apps/harbor` | Cozystack Harbor application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/harbor) | -| `apps/http-cache` | Cozystack HTTP cache application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/http-cache) | -| `apps/kafka` | Cozystack Kafka application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/kafka) | -| `apps/kubernetes` | Cozystack Kubernetes application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/kubernetes) | -| `apps/mariadb` | Cozystack MariaDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/mariadb) | -| `apps/mongodb` | Cozystack MongoDB application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/mongodb) | -| `apps/nats` | Cozystack NATS application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/nats) | -| `apps/openbao` | Cozystack OpenBao application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/openbao) | -| `apps/opensearch` | Cozystack OpenSearch application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/opensearch) | -| `apps/postgres` | Cozystack PostgreSQL application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/postgres) | -| `apps/qdrant` | Cozystack Qdrant application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/qdrant) | -| `apps/rabbitmq` | Cozystack RabbitMQ application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/rabbitmq) | -| `apps/redis` | Cozystack Redis application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/redis) | -| `apps/tcp-balancer` | Cozystack TCP balancer application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/tcp-balancer) | -| `apps/tenant` | Cozystack Tenant application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/tenant) | -| `apps/vm-disk` | Cozystack VM disk application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vm-disk) | -| `apps/vm-instance` | Cozystack VM instance application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vm-instance) | -| `apps/vpc` | Cozystack VPC application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vpc) | -| `apps/vpn` | Cozystack VPN application API | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/apps/vpn) | -| `extra/bootbox` | Cozystack Bootbox extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/bootbox) | -| `extra/etcd` | Cozystack etcd extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/etcd) | -| `extra/external-dns` | Cozystack ExternalDNS extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/external-dns) | -| `extra/info` | Cozystack Info extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/info) | -| `extra/ingress` | Cozystack Ingress extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/ingress) | -| `extra/monitoring` | Cozystack Monitoring extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/monitoring) | -| `extra/seaweedfs` | Cozystack SeaweedFS extra package | Apache-2.0 | [source](https://github.com/cozystack/cozystack/tree/main/packages/extra/seaweedfs) | - -## Managed Workload Runtimes - -| Managed service | Runtime component | License | Source | -|---|---|---|---| -| Bucket/Object Storage | SeaweedFS; S3 Manager | Apache-2.0 | [seaweedfs](https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE), [s3manager](https://github.com/cloudlena/s3manager/blob/main/LICENSE) | -| ClickHouse | ClickHouse Server and ClickHouse Keeper | Apache-2.0 | [source](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE) | -| FoundationDB | FoundationDB | Apache-2.0 | [source](https://github.com/apple/foundationdb/blob/main/LICENSE) | -| Harbor | Harbor | Apache-2.0 | [source](https://github.com/goharbor/harbor/blob/main/LICENSE) | -| HTTP Cache | NGINX; HAProxy; IP2Location/IP2Proxy modules | BSD-2-Clause; GPL-2.0 with exceptions; MIT | [nginx](https://github.com/nginx/nginx/blob/master/LICENSE), [haproxy](https://github.com/haproxy/haproxy/blob/master/LICENSE), [ip2location](https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE), [ip2proxy](https://github.com/ip2location/ip2proxy-nginx/blob/master/LICENSE) | -| Kafka | Apache Kafka through Strimzi | Apache-2.0 | [source](https://github.com/apache/kafka/blob/trunk/LICENSE) | -| Kubernetes | Kubernetes control plane and add-ons | Apache-2.0 | [source](https://github.com/kubernetes/kubernetes/blob/master/LICENSE) | -| MariaDB | MariaDB Server | GPL-2.0 | [source](https://github.com/MariaDB/server/blob/main/COPYING) | -| MongoDB | Percona Server for MongoDB | SSPL-1.0 | [source](https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt) | -| NATS | NATS Server | Apache-2.0 | [source](https://github.com/nats-io/nats-server/blob/main/LICENSE) | -| OpenBao | OpenBao | MPL-2.0 | [source](https://github.com/openbao/openbao/blob/main/LICENSE) | -| OpenSearch | OpenSearch | Apache-2.0 | [source](https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt) | -| PostgreSQL | PostgreSQL | PostgreSQL License | [source](https://www.postgresql.org/about/licence/) | -| Qdrant | Qdrant | Apache-2.0 | [source](https://github.com/qdrant/qdrant/blob/master/LICENSE) | -| RabbitMQ | RabbitMQ Server | MPL-2.0; Apache-2.0 for some files | [source](https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE) | -| Redis | Redis 7.4 and Redis 8 | RSALv2 or SSPLv1; Redis 8 also AGPLv3 | [source](https://redis.io/legal/licenses/) | -| TCP Balancer | HAProxy | GPL-2.0 with exceptions | [source](https://github.com/haproxy/haproxy/blob/master/LICENSE) | -| VPN | Outline Shadowsocks server | Apache-2.0 | [source](https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE) | diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md index cc2bc9f9..761c73be 100644 --- a/content/en/docs/next/operations/configuration/licenses.md +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -1,8 +1,132 @@ --- title: "Licenses" linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 +description: "Licenses of open-source components packaged with Cozystack." +weight: 35 --- -{{< include "docs/_include/licenses.md" >}} +This page lists the open-source components Cozystack ships, grouped by their role in the platform. +Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. +For each upstream component, the card links to the upstream license file. + +{{% alert color="info" %}} +This reference is hand-curated against the current `next` set of components. +Container images can include additional operating-system packages and library dependencies with their own licenses. +Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) may change between Cozystack minor releases — check the version of Cozystack you run. +{{% /alert %}} + +## Operating system and Kubernetes runtime + +{{< oss-cards >}} +{{< oss-card name="Talos Linux" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} +{{< oss-card name="Kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} +{{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} +{{< oss-card name="Cluster API" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} +{{< oss-card name="KubeVirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} +{{< /oss-cards >}} + +## Networking + +{{< oss-cards >}} +{{< oss-card name="Cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} +{{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} +{{< oss-card name="Multus CNI" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} +{{< oss-card name="MetalLB" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} +{{< oss-card name="ingress-nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} +{{< oss-card name="Gateway API CRDs" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} +{{< oss-card name="CoreDNS" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} +{{< oss-card name="ExternalDNS" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} +{{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} +{{< oss-card name="Hetzner RobotLB" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} +{{< /oss-cards >}} + +## Storage + +{{< oss-cards >}} +{{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} +{{< oss-card name="SeaweedFS" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} +{{< oss-card name="CSI Driver NFS" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} +{{< oss-card name="CSI Snapshot Controller" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} +{{< oss-card name="Velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} +{{< oss-card name="Container Object Storage Interface" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Web UI for S3-compatible buckets." >}} +{{< /oss-cards >}} + +## Observability + +{{< oss-cards >}} +{{< oss-card name="VictoriaMetrics Operator" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} +{{< oss-card name="Grafana Operator" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} +{{< oss-card name="Fluent Bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} +{{< oss-card name="kube-state-metrics" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} +{{< oss-card name="node-exporter" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} +{{< oss-card name="Prometheus Operator CRDs" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} +{{< oss-card name="Metrics Server" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} +{{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} +{{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} +{{< /oss-cards >}} + +## Autoscaling and resource management + +{{< oss-cards >}} +{{< oss-card name="Vertical Pod Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} +{{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} +{{< /oss-cards >}} + +## GPU and accelerators + +{{< oss-cards >}} +{{< oss-card name="NVIDIA GPU Operator" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} +{{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} +{{< /oss-cards >}} + +## GitOps and platform automation + +{{< oss-cards >}} +{{< oss-card name="Flux" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} +{{< oss-card name="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} +{{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} +{{< oss-card name="SAP ClusterSecret Operator" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} +{{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} +{{< oss-card name="Telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} +{{< /oss-cards >}} + +## Identity, registry, and admin UI + +{{< oss-cards >}} +{{< oss-card name="Keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} +{{< oss-card name="Harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} +{{< /oss-cards >}} + +## Managed database runtimes + +{{< oss-cards >}} +{{< oss-card name="PostgreSQL" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} +{{< oss-card name="MariaDB Server" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} +{{< oss-card name="MongoDB (Percona Server)" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} +{{< oss-card name="ClickHouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} +{{< oss-card name="OpenSearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} +{{< oss-card name="Qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} +{{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} +{{< oss-card name="Redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} +{{< /oss-cards >}} + +## Managed messaging and caching runtimes + +{{< oss-cards >}} +{{< oss-card name="Apache Kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} +{{< oss-card name="NATS" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} +{{< oss-card name="RabbitMQ" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} +{{< oss-card name="OpenBao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} +{{< /oss-cards >}} + +## Managed networking services + +{{< oss-cards >}} +{{< oss-card name="NGINX" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} +{{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} +{{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} +{{< /oss-cards >}} diff --git a/content/en/docs/v0/operations/configuration/licenses.md b/content/en/docs/v0/operations/configuration/licenses.md deleted file mode 100644 index cc2bc9f9..00000000 --- a/content/en/docs/v0/operations/configuration/licenses.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Licenses" -linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 ---- - -{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.0/operations/configuration/licenses.md b/content/en/docs/v1.0/operations/configuration/licenses.md deleted file mode 100644 index cc2bc9f9..00000000 --- a/content/en/docs/v1.0/operations/configuration/licenses.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Licenses" -linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 ---- - -{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.1/operations/configuration/licenses.md b/content/en/docs/v1.1/operations/configuration/licenses.md deleted file mode 100644 index cc2bc9f9..00000000 --- a/content/en/docs/v1.1/operations/configuration/licenses.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Licenses" -linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 ---- - -{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.2/operations/configuration/licenses.md b/content/en/docs/v1.2/operations/configuration/licenses.md deleted file mode 100644 index cc2bc9f9..00000000 --- a/content/en/docs/v1.2/operations/configuration/licenses.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Licenses" -linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 ---- - -{{< include "docs/_include/licenses.md" >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md index cc2bc9f9..761c73be 100644 --- a/content/en/docs/v1.3/operations/configuration/licenses.md +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -1,8 +1,132 @@ --- title: "Licenses" linkTitle: "Licenses" -description: "License reference for Cozystack platform components." -weight: 40 +description: "Licenses of open-source components packaged with Cozystack." +weight: 35 --- -{{< include "docs/_include/licenses.md" >}} +This page lists the open-source components Cozystack ships, grouped by their role in the platform. +Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. +For each upstream component, the card links to the upstream license file. + +{{% alert color="info" %}} +This reference is hand-curated against the current `next` set of components. +Container images can include additional operating-system packages and library dependencies with their own licenses. +Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) may change between Cozystack minor releases — check the version of Cozystack you run. +{{% /alert %}} + +## Operating system and Kubernetes runtime + +{{< oss-cards >}} +{{< oss-card name="Talos Linux" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} +{{< oss-card name="Kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} +{{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} +{{< oss-card name="Cluster API" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} +{{< oss-card name="KubeVirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} +{{< /oss-cards >}} + +## Networking + +{{< oss-cards >}} +{{< oss-card name="Cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} +{{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} +{{< oss-card name="Multus CNI" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} +{{< oss-card name="MetalLB" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} +{{< oss-card name="ingress-nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} +{{< oss-card name="Gateway API CRDs" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} +{{< oss-card name="CoreDNS" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} +{{< oss-card name="ExternalDNS" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} +{{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} +{{< oss-card name="Hetzner RobotLB" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} +{{< /oss-cards >}} + +## Storage + +{{< oss-cards >}} +{{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} +{{< oss-card name="SeaweedFS" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} +{{< oss-card name="CSI Driver NFS" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} +{{< oss-card name="CSI Snapshot Controller" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} +{{< oss-card name="Velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} +{{< oss-card name="Container Object Storage Interface" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Web UI for S3-compatible buckets." >}} +{{< /oss-cards >}} + +## Observability + +{{< oss-cards >}} +{{< oss-card name="VictoriaMetrics Operator" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} +{{< oss-card name="Grafana Operator" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} +{{< oss-card name="Fluent Bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} +{{< oss-card name="kube-state-metrics" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} +{{< oss-card name="node-exporter" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} +{{< oss-card name="Prometheus Operator CRDs" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} +{{< oss-card name="Metrics Server" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} +{{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} +{{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} +{{< /oss-cards >}} + +## Autoscaling and resource management + +{{< oss-cards >}} +{{< oss-card name="Vertical Pod Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} +{{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} +{{< /oss-cards >}} + +## GPU and accelerators + +{{< oss-cards >}} +{{< oss-card name="NVIDIA GPU Operator" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} +{{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} +{{< /oss-cards >}} + +## GitOps and platform automation + +{{< oss-cards >}} +{{< oss-card name="Flux" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} +{{< oss-card name="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} +{{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} +{{< oss-card name="SAP ClusterSecret Operator" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} +{{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} +{{< oss-card name="Telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} +{{< /oss-cards >}} + +## Identity, registry, and admin UI + +{{< oss-cards >}} +{{< oss-card name="Keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} +{{< oss-card name="Harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} +{{< /oss-cards >}} + +## Managed database runtimes + +{{< oss-cards >}} +{{< oss-card name="PostgreSQL" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} +{{< oss-card name="MariaDB Server" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} +{{< oss-card name="MongoDB (Percona Server)" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} +{{< oss-card name="ClickHouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} +{{< oss-card name="OpenSearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} +{{< oss-card name="Qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} +{{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} +{{< oss-card name="Redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} +{{< /oss-cards >}} + +## Managed messaging and caching runtimes + +{{< oss-cards >}} +{{< oss-card name="Apache Kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} +{{< oss-card name="NATS" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} +{{< oss-card name="RabbitMQ" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} +{{< oss-card name="OpenBao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} +{{< /oss-cards >}} + +## Managed networking services + +{{< oss-cards >}} +{{< oss-card name="NGINX" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} +{{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} +{{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} +{{< /oss-cards >}} diff --git a/layouts/shortcodes/oss-card.html b/layouts/shortcodes/oss-card.html new file mode 100644 index 00000000..fca6983f --- /dev/null +++ b/layouts/shortcodes/oss-card.html @@ -0,0 +1,46 @@ +{{- /* + oss-card: single OSS component card. + + Parameters (named): + name — display name of the component (required) + license — SPDX license identifier or short label (required) + source — URL to the upstream LICENSE file or repository (required) + description — short one-line description (optional) + version — pinned/upstream version label (optional) + logo — basename under /img/logos/components/.svg (optional) + if omitted or file missing, a colored initials badge is rendered + used-in — URL to the Cozystack module/section that consumes this component (optional) +*/ -}} +{{- $name := .Get "name" -}} +{{- $license := .Get "license" -}} +{{- $source := .Get "source" -}} +{{- $description := .Get "description" -}} +{{- $version := .Get "version" -}} +{{- $logo := .Get "logo" -}} +{{- $usedIn := .Get "used-in" -}} +{{- $logoFile := printf "img/logos/components/%s.svg" $logo -}} +{{- $hasLogo := and $logo (fileExists (printf "static/%s" $logoFile)) -}} +{{- $initials := substr $name 0 2 | upper -}} +{{- $hue := mod (mul (len $name) 47) 360 -}} +

+
+ {{- if $hasLogo -}} + + {{- else -}} + + {{- end -}} +
+ {{ $name }} + {{- with $version -}}{{ . }}{{- end -}} +
+
+ {{- with $description -}} +

{{ . }}

+ {{- end -}} +
+ {{ $license }} + {{- with $usedIn -}} + · used in + {{- end -}} +
+
diff --git a/layouts/shortcodes/oss-cards.html b/layouts/shortcodes/oss-cards.html new file mode 100644 index 00000000..988edd8d --- /dev/null +++ b/layouts/shortcodes/oss-cards.html @@ -0,0 +1,12 @@ +{{- /* + oss-cards: wrapper for a grid of OSS component cards. + + Usage: + {{< oss-cards >}} + {{< oss-card name="KubeVirt" license="Apache-2.0" source="..." description="..." >}} + {{< oss-card name="Cilium" license="Apache-2.0" source="..." description="..." >}} + {{< /oss-cards >}} +*/ -}} +
+{{ .Inner }} +
From e0f62a67ab9cbb62a90fc6d884982689f1f13da4 Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 14:15:58 +0500 Subject: [PATCH 4/9] docs(licenses): add SVG/PNG logos for OSS component cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 36 logos under static/img/logos/components/ — pulled from Simple Icons (CC0), CNCF Artwork, and upstream project repos. Components without an obvious upstream brand asset (Kamaji, LINSTOR, S3 Manager, OpenCost, Goldpinger, Stakater Reloader, HAMi, External Secrets Operator, Tinkerbell Smee, FoundationDB, HAProxy, IP2Location, Outline, Kube-OVN, Kilo) fall back to the initials badge from the shortcode — can be added incrementally without touching the shortcode API. Also extend oss-card to accept .svg, .png, .jpg, .webp so logos that only ship as raster files (multus, seaweedfs, telepresence, external-dns, metallb) render correctly. Signed-off-by: tym83 <6355522@gmail.com> --- .../next/operations/configuration/licenses.md | 92 +++++++++--------- .../v1.3/operations/configuration/licenses.md | 92 +++++++++--------- layouts/shortcodes/oss-card.html | 13 ++- static/img/logos/components/cert-manager.svg | 1 + static/img/logos/components/cilium.svg | 1 + static/img/logos/components/clickhouse.svg | 1 + static/img/logos/components/clusterapi.svg | 1 + static/img/logos/components/coredns.svg | 1 + static/img/logos/components/etcd.svg | 1 + static/img/logos/components/externaldns.png | Bin 0 -> 256840 bytes static/img/logos/components/fluent-bit.svg | 1 + static/img/logos/components/fluxcd.svg | 1 + static/img/logos/components/grafana.svg | 1 + static/img/logos/components/harbor.svg | 1 + static/img/logos/components/hetzner.svg | 1 + static/img/logos/components/kafka.svg | 1 + static/img/logos/components/keycloak.svg | 1 + static/img/logos/components/kubernetes.svg | 1 + static/img/logos/components/kubevirt.svg | 1 + static/img/logos/components/mariadb.svg | 1 + static/img/logos/components/metallb.png | Bin 0 -> 19036 bytes static/img/logos/components/mongodb.svg | 1 + static/img/logos/components/multus.png | Bin 0 -> 38872 bytes static/img/logos/components/nats.svg | 1 + static/img/logos/components/nginx.svg | 1 + static/img/logos/components/nvidia.svg | 1 + static/img/logos/components/openbao.svg | 1 + static/img/logos/components/opensearch.svg | 1 + static/img/logos/components/postgresql.svg | 1 + static/img/logos/components/prometheus.svg | 1 + static/img/logos/components/qdrant.svg | 1 + static/img/logos/components/rabbitmq.svg | 1 + static/img/logos/components/redis.svg | 1 + static/img/logos/components/sap.svg | 1 + static/img/logos/components/seaweedfs.png | Bin 0 -> 78638 bytes static/img/logos/components/talos.svg | 1 + static/img/logos/components/telepresence.png | Bin 0 -> 33920 bytes static/img/logos/components/velero.svg | 1 + .../img/logos/components/victoriametrics.svg | 1 + 39 files changed, 134 insertions(+), 94 deletions(-) create mode 100644 static/img/logos/components/cert-manager.svg create mode 100644 static/img/logos/components/cilium.svg create mode 100644 static/img/logos/components/clickhouse.svg create mode 100644 static/img/logos/components/clusterapi.svg create mode 100644 static/img/logos/components/coredns.svg create mode 100644 static/img/logos/components/etcd.svg create mode 100644 static/img/logos/components/externaldns.png create mode 100644 static/img/logos/components/fluent-bit.svg create mode 100644 static/img/logos/components/fluxcd.svg create mode 100644 static/img/logos/components/grafana.svg create mode 100644 static/img/logos/components/harbor.svg create mode 100644 static/img/logos/components/hetzner.svg create mode 100644 static/img/logos/components/kafka.svg create mode 100644 static/img/logos/components/keycloak.svg create mode 100644 static/img/logos/components/kubernetes.svg create mode 100644 static/img/logos/components/kubevirt.svg create mode 100644 static/img/logos/components/mariadb.svg create mode 100644 static/img/logos/components/metallb.png create mode 100644 static/img/logos/components/mongodb.svg create mode 100644 static/img/logos/components/multus.png create mode 100644 static/img/logos/components/nats.svg create mode 100644 static/img/logos/components/nginx.svg create mode 100644 static/img/logos/components/nvidia.svg create mode 100644 static/img/logos/components/openbao.svg create mode 100644 static/img/logos/components/opensearch.svg create mode 100644 static/img/logos/components/postgresql.svg create mode 100644 static/img/logos/components/prometheus.svg create mode 100644 static/img/logos/components/qdrant.svg create mode 100644 static/img/logos/components/rabbitmq.svg create mode 100644 static/img/logos/components/redis.svg create mode 100644 static/img/logos/components/sap.svg create mode 100644 static/img/logos/components/seaweedfs.png create mode 100644 static/img/logos/components/talos.svg create mode 100644 static/img/logos/components/telepresence.png create mode 100644 static/img/logos/components/velero.svg create mode 100644 static/img/logos/components/victoriametrics.svg diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md index 761c73be..58e0de61 100644 --- a/content/en/docs/next/operations/configuration/licenses.md +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -18,50 +18,50 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) ## Operating system and Kubernetes runtime {{< oss-cards >}} -{{< oss-card name="Talos Linux" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} -{{< oss-card name="Kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} {{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} -{{< oss-card name="Cluster API" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} -{{< oss-card name="KubeVirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} {{< /oss-cards >}} ## Networking {{< oss-cards >}} -{{< oss-card name="Cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} {{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} -{{< oss-card name="Multus CNI" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} -{{< oss-card name="MetalLB" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} -{{< oss-card name="ingress-nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} -{{< oss-card name="Gateway API CRDs" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} -{{< oss-card name="CoreDNS" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} -{{< oss-card name="ExternalDNS" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} {{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} -{{< oss-card name="Hetzner RobotLB" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} {{< /oss-cards >}} ## Storage {{< oss-cards >}} {{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} -{{< oss-card name="SeaweedFS" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} -{{< oss-card name="CSI Driver NFS" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} -{{< oss-card name="CSI Snapshot Controller" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} -{{< oss-card name="Velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} -{{< oss-card name="Container Object Storage Interface" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} {{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Web UI for S3-compatible buckets." >}} {{< /oss-cards >}} ## Observability {{< oss-cards >}} -{{< oss-card name="VictoriaMetrics Operator" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} -{{< oss-card name="Grafana Operator" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} -{{< oss-card name="Fluent Bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} -{{< oss-card name="kube-state-metrics" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} -{{< oss-card name="node-exporter" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} -{{< oss-card name="Prometheus Operator CRDs" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} -{{< oss-card name="Metrics Server" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} {{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} @@ -69,63 +69,63 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) ## Autoscaling and resource management {{< oss-cards >}} -{{< oss-card name="Vertical Pod Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} -{{< oss-card name="Cluster Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} {{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} {{< /oss-cards >}} ## GPU and accelerators {{< oss-cards >}} -{{< oss-card name="NVIDIA GPU Operator" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} {{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} {{< /oss-cards >}} ## GitOps and platform automation {{< oss-cards >}} -{{< oss-card name="Flux" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} -{{< oss-card name="Aenix etcd Operator" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} -{{< oss-card name="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} {{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} -{{< oss-card name="SAP ClusterSecret Operator" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} {{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} -{{< oss-card name="Telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} {{< /oss-cards >}} ## Identity, registry, and admin UI {{< oss-cards >}} -{{< oss-card name="Keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} -{{< oss-card name="Harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} {{< /oss-cards >}} ## Managed database runtimes {{< oss-cards >}} -{{< oss-card name="PostgreSQL" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} -{{< oss-card name="MariaDB Server" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} -{{< oss-card name="MongoDB (Percona Server)" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} -{{< oss-card name="ClickHouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} -{{< oss-card name="OpenSearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} -{{< oss-card name="Qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} {{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} -{{< oss-card name="Redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} {{< /oss-cards >}} ## Managed messaging and caching runtimes {{< oss-cards >}} -{{< oss-card name="Apache Kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} -{{< oss-card name="NATS" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} -{{< oss-card name="RabbitMQ" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} -{{< oss-card name="OpenBao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} {{< /oss-cards >}} ## Managed networking services {{< oss-cards >}} -{{< oss-card name="NGINX" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} {{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} {{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md index 761c73be..58e0de61 100644 --- a/content/en/docs/v1.3/operations/configuration/licenses.md +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -18,50 +18,50 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) ## Operating system and Kubernetes runtime {{< oss-cards >}} -{{< oss-card name="Talos Linux" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} -{{< oss-card name="Kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} {{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} -{{< oss-card name="Cluster API" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} -{{< oss-card name="KubeVirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} {{< /oss-cards >}} ## Networking {{< oss-cards >}} -{{< oss-card name="Cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} {{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} -{{< oss-card name="Multus CNI" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} -{{< oss-card name="MetalLB" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} -{{< oss-card name="ingress-nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} -{{< oss-card name="Gateway API CRDs" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} -{{< oss-card name="CoreDNS" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} -{{< oss-card name="ExternalDNS" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} {{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} -{{< oss-card name="Hetzner RobotLB" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} {{< /oss-cards >}} ## Storage {{< oss-cards >}} {{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} -{{< oss-card name="SeaweedFS" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} -{{< oss-card name="CSI Driver NFS" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} -{{< oss-card name="CSI Snapshot Controller" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} -{{< oss-card name="Velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} -{{< oss-card name="Container Object Storage Interface" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Cluster and persistent volume backups." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="COSI controller for managed object storage." >}} {{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Web UI for S3-compatible buckets." >}} {{< /oss-cards >}} ## Observability {{< oss-cards >}} -{{< oss-card name="VictoriaMetrics Operator" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} -{{< oss-card name="Grafana Operator" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} -{{< oss-card name="Fluent Bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} -{{< oss-card name="kube-state-metrics" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} -{{< oss-card name="node-exporter" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} -{{< oss-card name="Prometheus Operator CRDs" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} -{{< oss-card name="Metrics Server" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Metrics storage, ingestion, and Prometheus-compatible query layer." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and datasources." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Log forwarder running on every node." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Exposes Kubernetes object state as metrics." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} {{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} @@ -69,63 +69,63 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) ## Autoscaling and resource management {{< oss-cards >}} -{{< oss-card name="Vertical Pod Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} -{{< oss-card name="Cluster Autoscaler" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} {{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} {{< /oss-cards >}} ## GPU and accelerators {{< oss-cards >}} -{{< oss-card name="NVIDIA GPU Operator" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} {{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} {{< /oss-cards >}} ## GitOps and platform automation {{< oss-cards >}} -{{< oss-card name="Flux" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} -{{< oss-card name="Aenix etcd Operator" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} -{{< oss-card name="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} {{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} -{{< oss-card name="SAP ClusterSecret Operator" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} {{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} -{{< oss-card name="Telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} {{< /oss-cards >}} ## Identity, registry, and admin UI {{< oss-cards >}} -{{< oss-card name="Keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} -{{< oss-card name="Harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC provider for platform and tenant SSO; deployed with the KubeRocketCI Keycloak Operator." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="OCI registry for container images and Helm charts." >}} {{< /oss-cards >}} ## Managed database runtimes {{< oss-cards >}} -{{< oss-card name="PostgreSQL" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} -{{< oss-card name="MariaDB Server" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} -{{< oss-card name="MongoDB (Percona Server)" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} -{{< oss-card name="ClickHouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} -{{< oss-card name="OpenSearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} -{{< oss-card name="Qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Managed via CloudNativePG operator (Apache-2.0)." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="Managed via mariadb-operator (MIT)." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Managed via Percona Operator for MongoDB (Apache-2.0)." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} {{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} -{{< oss-card name="Redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} {{< /oss-cards >}} ## Managed messaging and caching runtimes {{< oss-cards >}} -{{< oss-card name="Apache Kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} -{{< oss-card name="NATS" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} -{{< oss-card name="RabbitMQ" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} -{{< oss-card name="OpenBao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Managed via Strimzi Kafka Operator (Apache-2.0)." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight messaging server, deployed via the upstream NATS Helm chart." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="Managed via RabbitMQ Cluster Operator (MPL-2.0)." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Secrets management fork of HashiCorp Vault, deployed via the upstream OpenBao Helm chart." >}} {{< /oss-cards >}} ## Managed networking services {{< oss-cards >}} -{{< oss-card name="NGINX" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} {{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} {{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} diff --git a/layouts/shortcodes/oss-card.html b/layouts/shortcodes/oss-card.html index fca6983f..70e01ffb 100644 --- a/layouts/shortcodes/oss-card.html +++ b/layouts/shortcodes/oss-card.html @@ -18,8 +18,17 @@ {{- $version := .Get "version" -}} {{- $logo := .Get "logo" -}} {{- $usedIn := .Get "used-in" -}} -{{- $logoFile := printf "img/logos/components/%s.svg" $logo -}} -{{- $hasLogo := and $logo (fileExists (printf "static/%s" $logoFile)) -}} +{{- $logoFile := "" -}} +{{- $hasLogo := false -}} +{{- if $logo -}} + {{- range $ext := slice "svg" "png" "jpg" "webp" -}} + {{- $candidate := printf "img/logos/components/%s.%s" $logo $ext -}} + {{- if and (not $hasLogo) (fileExists (printf "static/%s" $candidate)) -}} + {{- $logoFile = $candidate -}} + {{- $hasLogo = true -}} + {{- end -}} + {{- end -}} +{{- end -}} {{- $initials := substr $name 0 2 | upper -}} {{- $hue := mod (mul (len $name) 47) 360 -}}
diff --git a/static/img/logos/components/cert-manager.svg b/static/img/logos/components/cert-manager.svg new file mode 100644 index 00000000..89e8e50d --- /dev/null +++ b/static/img/logos/components/cert-manager.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/cilium.svg b/static/img/logos/components/cilium.svg new file mode 100644 index 00000000..769fad07 --- /dev/null +++ b/static/img/logos/components/cilium.svg @@ -0,0 +1 @@ +Cilium \ No newline at end of file diff --git a/static/img/logos/components/clickhouse.svg b/static/img/logos/components/clickhouse.svg new file mode 100644 index 00000000..95c0bef8 --- /dev/null +++ b/static/img/logos/components/clickhouse.svg @@ -0,0 +1 @@ +ClickHouse \ No newline at end of file diff --git a/static/img/logos/components/clusterapi.svg b/static/img/logos/components/clusterapi.svg new file mode 100644 index 00000000..2133449f --- /dev/null +++ b/static/img/logos/components/clusterapi.svg @@ -0,0 +1 @@ +kubernetes-cluster-logos_final \ No newline at end of file diff --git a/static/img/logos/components/coredns.svg b/static/img/logos/components/coredns.svg new file mode 100644 index 00000000..ddd2fe22 --- /dev/null +++ b/static/img/logos/components/coredns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/etcd.svg b/static/img/logos/components/etcd.svg new file mode 100644 index 00000000..cb9f3cee --- /dev/null +++ b/static/img/logos/components/etcd.svg @@ -0,0 +1 @@ +etcd \ No newline at end of file diff --git a/static/img/logos/components/externaldns.png b/static/img/logos/components/externaldns.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee8e0753172768e52a40fe936674e050f80a9ae GIT binary patch literal 256840 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

Ci0>wh=Lg}%=7O{fQAv1|mpQSH_IQ6*s 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%0D3vJ)FU4)C* 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μ#uZ?a&eUOIbrd5C8XA)Y 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

NYF&`qrmW5=5U`lK)pJ6^v{ZWZ|pj4N>BEvul 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 literal 0 HcmV?d00001 diff --git a/static/img/logos/components/fluent-bit.svg b/static/img/logos/components/fluent-bit.svg new file mode 100644 index 00000000..cc0c5ffc --- /dev/null +++ b/static/img/logos/components/fluent-bit.svg @@ -0,0 +1 @@ +Fluent Bit \ No newline at end of file diff --git a/static/img/logos/components/fluxcd.svg b/static/img/logos/components/fluxcd.svg new file mode 100644 index 00000000..7ba68c5e --- /dev/null +++ b/static/img/logos/components/fluxcd.svg @@ -0,0 +1 @@ +Flux \ No newline at end of file diff --git a/static/img/logos/components/grafana.svg b/static/img/logos/components/grafana.svg new file mode 100644 index 00000000..c99695a1 --- /dev/null +++ b/static/img/logos/components/grafana.svg @@ -0,0 +1 @@ +Grafana \ No newline at end of file diff --git a/static/img/logos/components/harbor.svg b/static/img/logos/components/harbor.svg new file mode 100644 index 00000000..8dc9fa9d --- /dev/null +++ b/static/img/logos/components/harbor.svg @@ -0,0 +1 @@ +Harbor \ No newline at end of file diff --git a/static/img/logos/components/hetzner.svg b/static/img/logos/components/hetzner.svg new file mode 100644 index 00000000..4307bf26 --- /dev/null +++ b/static/img/logos/components/hetzner.svg @@ -0,0 +1 @@ +Hetzner \ No newline at end of file diff --git a/static/img/logos/components/kafka.svg b/static/img/logos/components/kafka.svg new file mode 100644 index 00000000..dc2b7b8b --- /dev/null +++ b/static/img/logos/components/kafka.svg @@ -0,0 +1 @@ +Apache Kafka \ No newline at end of file diff --git a/static/img/logos/components/keycloak.svg b/static/img/logos/components/keycloak.svg new file mode 100644 index 00000000..a2c6a28d --- /dev/null +++ b/static/img/logos/components/keycloak.svg @@ -0,0 +1 @@ +Keycloak \ No newline at end of file diff --git a/static/img/logos/components/kubernetes.svg b/static/img/logos/components/kubernetes.svg new file mode 100644 index 00000000..b2dded3a --- /dev/null +++ b/static/img/logos/components/kubernetes.svg @@ -0,0 +1 @@ +Kubernetes \ No newline at end of file diff --git a/static/img/logos/components/kubevirt.svg b/static/img/logos/components/kubevirt.svg new file mode 100644 index 00000000..00d9ace8 --- /dev/null +++ b/static/img/logos/components/kubevirt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/mariadb.svg b/static/img/logos/components/mariadb.svg new file mode 100644 index 00000000..837e440f --- /dev/null +++ b/static/img/logos/components/mariadb.svg @@ -0,0 +1 @@ +MariaDB \ No newline at end of file diff --git a/static/img/logos/components/metallb.png b/static/img/logos/components/metallb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a19cd00bb3aa60a9b3a0a2f9d5c9bf20ab49a2f GIT binary patch literal 19036 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 \ No newline at end of file diff --git a/static/img/logos/components/multus.png b/static/img/logos/components/multus.png new file mode 100644 index 0000000000000000000000000000000000000000..49e60fd45084b0f37b489a3c13edde8d51d83b59 GIT binary patch literal 38872 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

vZ~6%XW%nV&FsOuLPIktcdk0-^pTGmuJYm11U%j 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 OUM5BshNWjO$NU#nu%~4J literal 0 HcmV?d00001 diff --git a/static/img/logos/components/nats.svg b/static/img/logos/components/nats.svg new file mode 100644 index 00000000..4a44b41a --- /dev/null +++ b/static/img/logos/components/nats.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/nginx.svg b/static/img/logos/components/nginx.svg new file mode 100644 index 00000000..e52ea9fe --- /dev/null +++ b/static/img/logos/components/nginx.svg @@ -0,0 +1 @@ +NGINX \ No newline at end of file diff --git a/static/img/logos/components/nvidia.svg b/static/img/logos/components/nvidia.svg new file mode 100644 index 00000000..e427e2ce --- /dev/null +++ b/static/img/logos/components/nvidia.svg @@ -0,0 +1 @@ +NVIDIA \ No newline at end of file diff --git a/static/img/logos/components/openbao.svg b/static/img/logos/components/openbao.svg new file mode 100644 index 00000000..c242553a --- /dev/null +++ b/static/img/logos/components/openbao.svg @@ -0,0 +1 @@ +OpenBao \ No newline at end of file diff --git a/static/img/logos/components/opensearch.svg b/static/img/logos/components/opensearch.svg new file mode 100644 index 00000000..6d6fa5ea --- /dev/null +++ b/static/img/logos/components/opensearch.svg @@ -0,0 +1 @@ +OpenSearch \ No newline at end of file diff --git a/static/img/logos/components/postgresql.svg b/static/img/logos/components/postgresql.svg new file mode 100644 index 00000000..931bdae1 --- /dev/null +++ b/static/img/logos/components/postgresql.svg @@ -0,0 +1 @@ +PostgreSQL \ No newline at end of file diff --git a/static/img/logos/components/prometheus.svg b/static/img/logos/components/prometheus.svg new file mode 100644 index 00000000..7dd2b46f --- /dev/null +++ b/static/img/logos/components/prometheus.svg @@ -0,0 +1 @@ +Prometheus \ No newline at end of file diff --git a/static/img/logos/components/qdrant.svg b/static/img/logos/components/qdrant.svg new file mode 100644 index 00000000..cc5dcb12 --- /dev/null +++ b/static/img/logos/components/qdrant.svg @@ -0,0 +1 @@ +Qdrant \ No newline at end of file diff --git a/static/img/logos/components/rabbitmq.svg b/static/img/logos/components/rabbitmq.svg new file mode 100644 index 00000000..f8b90f5b --- /dev/null +++ b/static/img/logos/components/rabbitmq.svg @@ -0,0 +1 @@ +RabbitMQ \ No newline at end of file diff --git a/static/img/logos/components/redis.svg b/static/img/logos/components/redis.svg new file mode 100644 index 00000000..61480c93 --- /dev/null +++ b/static/img/logos/components/redis.svg @@ -0,0 +1 @@ +Redis \ No newline at end of file diff --git a/static/img/logos/components/sap.svg b/static/img/logos/components/sap.svg new file mode 100644 index 00000000..e45a0b4e --- /dev/null +++ b/static/img/logos/components/sap.svg @@ -0,0 +1 @@ +SAP \ No newline at end of file diff --git a/static/img/logos/components/seaweedfs.png b/static/img/logos/components/seaweedfs.png new file mode 100644 index 0000000000000000000000000000000000000000..74bfb12a0d20cf54080980e7d4fe1a7d6597c36a GIT binary patch literal 78638 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 Ds*%E} literal 0 HcmV?d00001 diff --git a/static/img/logos/components/talos.svg b/static/img/logos/components/talos.svg new file mode 100644 index 00000000..d08df252 --- /dev/null +++ b/static/img/logos/components/talos.svg @@ -0,0 +1 @@ +Talos \ No newline at end of file diff --git a/static/img/logos/components/telepresence.png b/static/img/logos/components/telepresence.png new file mode 100644 index 0000000000000000000000000000000000000000..701f63ba88182d529ddc728ee76899773371dbf7 GIT binary patch literal 33920 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 B{1|F+dAQbWABw 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 OK;Y@>=d#Wzp$PyGxPevx literal 0 HcmV?d00001 diff --git a/static/img/logos/components/velero.svg b/static/img/logos/components/velero.svg new file mode 100644 index 00000000..8cb0588f --- /dev/null +++ b/static/img/logos/components/velero.svg @@ -0,0 +1 @@ +velero diff --git a/static/img/logos/components/victoriametrics.svg b/static/img/logos/components/victoriametrics.svg new file mode 100644 index 00000000..354ea08c --- /dev/null +++ b/static/img/logos/components/victoriametrics.svg @@ -0,0 +1 @@ +VictoriaMetrics \ No newline at end of file From c8ccef13a59a936f173b99f3f895a70c634ae4c6 Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 14:34:31 +0500 Subject: [PATCH 5/9] docs(licenses): wire 10 more logos from CNCF landscape Add CNCF landscape hosted_logos for Kamaji, Kube-OVN, Kilo, LINSTOR, HAMi, External Secrets, Tinkerbell, OpenCost, FoundationDB, HAProxy. Cards for these components now render with their proper brand marks instead of the initials-badge fallback. Remaining text-fallback components (Goldpinger, S3 Manager, Stakater Reloader, Outline, IP2Location) have no widely-distributed brand asset upstream. Signed-off-by: tym83 <6355522@gmail.com> --- .../next/operations/configuration/licenses.md | 20 +-- .../v1.3/operations/configuration/licenses.md | 20 +-- .../img/logos/components/external-secrets.svg | 1 + static/img/logos/components/foundationdb.svg | 67 ++++++++ static/img/logos/components/hami.svg | 1 + static/img/logos/components/haproxy.svg | 1 + static/img/logos/components/kamaji.svg | 1 + static/img/logos/components/kilo.svg | 155 ++++++++++++++++++ static/img/logos/components/kubeovn.svg | 1 + static/img/logos/components/linstor.svg | 55 +++++++ static/img/logos/components/opencost.svg | 22 +++ static/img/logos/components/tinkerbell.svg | 1 + 12 files changed, 325 insertions(+), 20 deletions(-) create mode 100644 static/img/logos/components/external-secrets.svg create mode 100644 static/img/logos/components/foundationdb.svg create mode 100644 static/img/logos/components/hami.svg create mode 100644 static/img/logos/components/haproxy.svg create mode 100644 static/img/logos/components/kamaji.svg create mode 100644 static/img/logos/components/kilo.svg create mode 100644 static/img/logos/components/kubeovn.svg create mode 100644 static/img/logos/components/linstor.svg create mode 100644 static/img/logos/components/opencost.svg create mode 100644 static/img/logos/components/tinkerbell.svg diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md index 58e0de61..3a29afe7 100644 --- a/content/en/docs/next/operations/configuration/licenses.md +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -20,7 +20,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} {{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} -{{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} {{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} {{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} {{< /oss-cards >}} @@ -29,21 +29,21 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} -{{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} {{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} {{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} {{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} {{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} {{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} {{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} -{{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} {{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} {{< /oss-cards >}} ## Storage {{< oss-cards >}} -{{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} {{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} {{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} {{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} @@ -62,7 +62,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} -{{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} +{{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} @@ -78,7 +78,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} -{{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} {{< /oss-cards >}} ## GitOps and platform automation @@ -87,9 +87,9 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} {{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} {{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} -{{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} {{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} -{{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} {{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} {{< /oss-cards >}} @@ -109,7 +109,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} {{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} {{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} -{{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} {{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} {{< /oss-cards >}} @@ -126,7 +126,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} -{{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} {{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} {{< /oss-cards >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md index 58e0de61..3a29afe7 100644 --- a/content/en/docs/v1.3/operations/configuration/licenses.md +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -20,7 +20,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes." >}} {{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration kernel used for both the management cluster and tenant clusters." >}} -{{< oss-card name="Kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Hosted control planes for tenant Kubernetes clusters." >}} {{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative provisioning of tenant Kubernetes clusters (core, operator, and Kamaji/KubeVirt providers)." >}} {{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machines as Kubernetes-native workloads (core, CDI, CSI, and instancetypes)." >}} {{< /oss-cards >}} @@ -29,21 +29,21 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy." >}} -{{< oss-card name="Kube-OVN" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking, used for VPC and floating IPs." >}} {{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Multiple network interfaces per pod." >}} {{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer for Kubernetes Services." >}} {{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="HTTP ingress controller." >}} {{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API definitions." >}} {{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server." >}} {{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Sync Kubernetes resources to external DNS providers." >}} -{{< oss-card name="Kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="Mesh networking across geographically distributed nodes." >}} {{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer integration for Hetzner dedicated hardware." >}} {{< /oss-cards >}} ## Storage {{< oss-cards >}} -{{< oss-card name="LINSTOR / Piraeus" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage (LINSTOR server, CSI, scheduler extender, GUI, Piraeus operator)." >}} {{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage; backs the managed Bucket service." >}} {{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="NFS CSI driver." >}} {{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="External snapshotter and VolumeSnapshot CRDs." >}} @@ -62,7 +62,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} -{{< oss-card name="OpenCost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} +{{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} @@ -78,7 +78,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Driver, container runtime, and device-plugin lifecycle for NVIDIA GPUs." >}} -{{< oss-card name="HAMi" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional GPU scheduling." >}} {{< /oss-cards >}} ## GitOps and platform automation @@ -87,9 +87,9 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine. ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0." >}} {{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages etcd clusters used by tenant Kamaji control planes." >}} {{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automated TLS certificate issuance and rotation." >}} -{{< oss-card name="External Secrets Operator" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Sync secrets from external KMS into Kubernetes." >}} {{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicate secrets across namespaces." >}} -{{< oss-card name="Tinkerbell Smee" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE / DHCP boot server for bare-metal provisioning." >}} {{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Local development against a remote cluster (Traffic Manager)." >}} {{< /oss-cards >}} @@ -109,7 +109,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Server and Keeper, managed via Altinity ClickHouse Operator (Apache-2.0)." >}} {{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Managed via opensearch-k8s-operator (Apache-2.0)." >}} {{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="Vector database, deployed via the upstream Qdrant Helm chart." >}} -{{< oss-card name="FoundationDB" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Managed via FoundationDB Kubernetes Operator (Apache-2.0)." >}} {{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="Managed via Spotahome Redis Operator (Apache-2.0). Cozystack supports Redis 7.4 and Redis 8." >}} {{< /oss-cards >}} @@ -126,7 +126,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} -{{< oss-card name="HAProxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} {{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} {{< /oss-cards >}} diff --git a/static/img/logos/components/external-secrets.svg b/static/img/logos/components/external-secrets.svg new file mode 100644 index 00000000..7d6fb1c2 --- /dev/null +++ b/static/img/logos/components/external-secrets.svg @@ -0,0 +1 @@ +EXTERNAL SECRETS OPERATOR \ No newline at end of file diff --git a/static/img/logos/components/foundationdb.svg b/static/img/logos/components/foundationdb.svg new file mode 100644 index 00000000..28eebaa5 --- /dev/null +++ b/static/img/logos/components/foundationdb.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logos/components/hami.svg b/static/img/logos/components/hami.svg new file mode 100644 index 00000000..33c04185 --- /dev/null +++ b/static/img/logos/components/hami.svg @@ -0,0 +1 @@ +hami.svg \ No newline at end of file diff --git a/static/img/logos/components/haproxy.svg b/static/img/logos/components/haproxy.svg new file mode 100644 index 00000000..259eab6a --- /dev/null +++ b/static/img/logos/components/haproxy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/kamaji.svg b/static/img/logos/components/kamaji.svg new file mode 100644 index 00000000..62bd0ba8 --- /dev/null +++ b/static/img/logos/components/kamaji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logos/components/kilo.svg b/static/img/logos/components/kilo.svg new file mode 100644 index 00000000..447ed3cc --- /dev/null +++ b/static/img/logos/components/kilo.svg @@ -0,0 +1,155 @@ + + + + + + image/svg+xml + + + + + + + Kilo + + + + + + + + + + + + + + + + diff --git a/static/img/logos/components/kubeovn.svg b/static/img/logos/components/kubeovn.svg new file mode 100644 index 00000000..70ed29c7 --- /dev/null +++ b/static/img/logos/components/kubeovn.svg @@ -0,0 +1 @@ +画板 3 副本Kube-OVN \ No newline at end of file diff --git a/static/img/logos/components/linstor.svg b/static/img/logos/components/linstor.svg new file mode 100644 index 00000000..33621b37 --- /dev/null +++ b/static/img/logos/components/linstor.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logos/components/opencost.svg b/static/img/logos/components/opencost.svg new file mode 100644 index 00000000..cab34420 --- /dev/null +++ b/static/img/logos/components/opencost.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logos/components/tinkerbell.svg b/static/img/logos/components/tinkerbell.svg new file mode 100644 index 00000000..bef13d20 --- /dev/null +++ b/static/img/logos/components/tinkerbell.svg @@ -0,0 +1 @@ + \ No newline at end of file From 4f31453c3993dbb04e0ba660fa2cabf28c9d7569 Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 15:15:40 +0500 Subject: [PATCH 6/9] docs(licenses): add logos for Outline Server, Goldpinger, and Reloader Co-Authored-By: Claude Signed-off-by: tym83 <6355522@gmail.com> --- .../next/operations/configuration/licenses.md | 6 +++--- .../v1.3/operations/configuration/licenses.md | 6 +++--- static/img/logos/components/goldpinger.png | Bin 0 -> 9425 bytes static/img/logos/components/outline.svg | 11 +++++++++++ static/img/logos/components/reloader.jpg | Bin 0 -> 119439 bytes 5 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 static/img/logos/components/goldpinger.png create mode 100644 static/img/logos/components/outline.svg create mode 100644 static/img/logos/components/reloader.jpg diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md index 3a29afe7..5c58ec5a 100644 --- a/content/en/docs/next/operations/configuration/licenses.md +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -63,7 +63,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} {{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} -{{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} ## Autoscaling and resource management @@ -71,7 +71,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} {{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} -{{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} {{< /oss-cards >}} ## GPU and accelerators @@ -128,5 +128,5 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} {{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} -{{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} {{< /oss-cards >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md index 3a29afe7..5c58ec5a 100644 --- a/content/en/docs/v1.3/operations/configuration/licenses.md +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -63,7 +63,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} {{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} -{{< oss-card name="Goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} ## Autoscaling and resource management @@ -71,7 +71,7 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-cards >}} {{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Vertical resource right-sizing for pods (chart: MIT)." >}} {{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Horizontal scaling of node pools." >}} -{{< oss-card name="Stakater Reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Restarts pods when their ConfigMaps or Secrets change." >}} {{< /oss-cards >}} ## GPU and accelerators @@ -128,5 +128,5 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Used by the managed HTTP Cache service." >}} {{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Used by the managed TCP Balancer and HTTP Cache services." >}} {{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules bundled into the HTTP Cache (IP2Location and IP2Proxy)." >}} -{{< oss-card name="Outline Server (Shadowsocks)" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Backs the managed VPN service." >}} {{< /oss-cards >}} diff --git a/static/img/logos/components/goldpinger.png b/static/img/logos/components/goldpinger.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5c5005f547d38e67c11d7d70a674337e8a4ec0 GIT binary patch literal 9425 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 literal 0 HcmV?d00001 diff --git a/static/img/logos/components/outline.svg b/static/img/logos/components/outline.svg new file mode 100644 index 00000000..9aeb169a --- /dev/null +++ b/static/img/logos/components/outline.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/logos/components/reloader.jpg b/static/img/logos/components/reloader.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d510a681b155c23ba54714f4a23034ecb8f0fb50 GIT binary patch literal 119439 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 Qb`aP>;6Fe>`@P`50a_;$EdT%j literal 0 HcmV?d00001 From 5209b6189148d8faf9349df42f80c37cad17640d Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 15:18:27 +0500 Subject: [PATCH 7/9] docs(licenses): remove OpenCost card and logo Co-Authored-By: Claude Signed-off-by: tym83 <6355522@gmail.com> --- .../next/operations/configuration/licenses.md | 1 - .../v1.3/operations/configuration/licenses.md | 1 - static/img/logos/components/opencost.svg | 22 ------------------- 3 files changed, 24 deletions(-) delete mode 100644 static/img/logos/components/opencost.svg diff --git a/content/en/docs/next/operations/configuration/licenses.md b/content/en/docs/next/operations/configuration/licenses.md index 5c58ec5a..da6d82c8 100644 --- a/content/en/docs/next/operations/configuration/licenses.md +++ b/content/en/docs/next/operations/configuration/licenses.md @@ -62,7 +62,6 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} -{{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} diff --git a/content/en/docs/v1.3/operations/configuration/licenses.md b/content/en/docs/v1.3/operations/configuration/licenses.md index 5c58ec5a..da6d82c8 100644 --- a/content/en/docs/v1.3/operations/configuration/licenses.md +++ b/content/en/docs/v1.3/operations/configuration/licenses.md @@ -62,7 +62,6 @@ Pinned upstream versions of managed runtimes (PostgreSQL, MariaDB, Kafka, etc.) {{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="System and hardware metrics from each node." >}} {{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for Prometheus-style monitoring resources, consumed by VictoriaMetrics." >}} {{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Kubelet metrics for HPA and `kubectl top`." >}} -{{< oss-card name="OpenCost" logo="opencost" license="Apache-2.0" source="https://github.com/opencost/opencost-helm-chart/blob/main/LICENSE" description="Real-time cost monitoring for Kubernetes workloads." >}} {{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checks across the cluster." >}} {{< /oss-cards >}} diff --git a/static/img/logos/components/opencost.svg b/static/img/logos/components/opencost.svg deleted file mode 100644 index cab34420..00000000 --- a/static/img/logos/components/opencost.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - From 17bd2d4762fed97d4b3e5bb981f8bfa7dbfb2ab7 Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 15:25:46 +0500 Subject: [PATCH 8/9] docs(platform-stack): transform to component cards with license and SEO descriptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace long prose sections with oss-card shortcodes organized by platform role. Each component now shows a logo, SPDX license, upstream source link, and a 300–500 character SEO-optimised description. Merges the content intent of the licenses reference page into the platform stack guide. Co-Authored-By: Claude Signed-off-by: tym83 <6355522@gmail.com> --- .../docs/next/guides/platform-stack/_index.md | 434 ++++++------------ .../docs/v1.3/guides/platform-stack/_index.md | 434 ++++++------------ 2 files changed, 270 insertions(+), 598 deletions(-) diff --git a/content/en/docs/next/guides/platform-stack/_index.md b/content/en/docs/next/guides/platform-stack/_index.md index 230c5fb0..fab4b5de 100644 --- a/content/en/docs/next/guides/platform-stack/_index.md +++ b/content/en/docs/next/guides/platform-stack/_index.md @@ -1,314 +1,150 @@ --- -title: "Cozystack Architecture and Platform Stack" +title: "Cozystack Platform Stack" linkTitle: "Platform Stack" -description: "Learn of the core components that power the functionality and flexibility of Cozystack" +description: "All open-source components in the Cozystack platform stack: networking, storage, observability, databases, and managed services with licenses and technical descriptions." weight: 15 --- -This article explains Cozystack composition through its four layers, and shows the role and value of each component in the platform stack. +Cozystack is composed entirely of open-source components, layered from the operating system up to user-facing managed services. +This page describes each component, its role in the platform, and its upstream license. ## Overview -To understand Cozystack composition, it's helpful to view it as sub-systems, layered from hardware to user-facing: - ![Cozystack Architecture Layers](cozystack-layers.png) -## Layer 1: OS and Hardware - -This is a foundation layer, providing cluster functionality on bare metal. -It consists of Talos Linux and a Kubernetes cluster installed on Talos. - -### Talos Linux - -Talos Linux is a Linux distribution made and optimized for a single purpose: to run Kubernetes. -It provides the foundation for reliability and security in a Cozystack cluster. -Its use allows Cozystack to limit the technology stack, improving stability and security. - -Read more about it in the [Talos Linux]({{% ref "/docs/next/guides/talos" %}}) section. - -### Kubernetes - -Kubernetes has already become a kind of de facto standard for managing server workloads. - -One of the key features of Kubernetes is a convenient and unified API that is understandable to everyone (everything is YAML). Also, the best software design patterns that provide continuous recovery in any situation (reconciliation method) and efficient scaling to a large number of servers. - -This fully solves the integration problem, since all existing virtualization platforms have an outdated and rather complex APIs that cannot be extended without modifying the source code. As a result, there is always a need to create your own custom solutions, which requires additional effort. - -## Layer 2: Infrastructure Services - -Second layer contains the key components which perform major roles such as storage, networking, and virtualization. -Adding these components to the base Kubernetes cluster makes it much more functional. - -### Flux CD - -FluxCD provides a simple and uniform interface for both installing all platform components and managing their lifecycle. -Cozystack developers have adopted FluxCD as the core element of the platform, believing it sets a new industry standard for platform engineering. - -### KubeVirt - -KubeVirt brings virtualization capability to Cozystack. -It enables creating virtual machines and worker nodes for tenant Kubernetes clusters. - -KubeVirt is a project started by global industry leaders with a common vision to unify Kubernetes and a desire to introduce it to the world of virtualization. -It extends the capabilities of Kubernetes by providing convenient abstractions for launching and managing virtual machines, -as well the all related entities such as snapshots, presets, virtual volumes, and more. - -At the moment, the KubeVirt project is being jointly developed by such world-famous companies as RedHat, NVIDIA, ARM. - -### DRBD and LINSTOR - -DRBD and LINSTOR are the foundation of replicated storage in Cozystack. - -DRBD is the fastest replication block storage running right in the Linux kernel. -When DRBD only deals with data replication, time-tested technologies such as LVM or ZFS are used to securely store the data. -The DRBD kernel module is included in the mainline Linux kernel and has been used to build fault-tolerant systems for over a decade. - -DRBD is managed using LINSTOR, a system integrated with Kubernetes. -LINSTOR is a management layer for creating virtual volumes based on DRBD. -It enables managing hundreds or thousands of virtual volumes in the Cozystack cluster. - -### Kube-OVN - -The networking functionality in Cozystack is based on Kube-OVN and Cilium. - -OVN is a free implementation of virtual network fabric for Kubernetes and OpenStack based on the Open vSwitch technology. -With Kube-OVN, you get a robust and functional virtual network that ensures reliable isolation between tenants and provides floating addresses for virtual machines. - -In the future, this will enable seamless integration with other clusters and customer network services. - -### Cilium - -Utilizing Cilium in conjunction with OVN enables the most efficient and flexible network policies, -along with a productive services network in Kubernetes, leveraging an offloaded Linux network stack featuring the cutting-edge eBPF technology. - -Cilium is a highly promising project, widely adopted and supported by numerous cloud providers worldwide. - -## Layer 3: Platform Services - -These are components that provide the user-side functionality to Cozystack and its managed applications. - -### OpenAPI UI - -OpenAPI UI provides the main web interface for deploying and managing applications in Cozystack. -It serves as the primary dashboard that allows users to interact with the Cozystack API through a user-friendly interface. - -The interface is built on top of the Cozystack OpenAPI specifications, automatically generating forms and documentation -for all available managed applications. Users can deploy databases, Kubernetes clusters, virtual machines, and other services -directly through the dashboard without needing to write YAML manifests manually. - -The dashboard also integrates with OIDC authentication via Keycloak, providing secure single sign-on access to the platform. - -### Kamaji - -Cozystack uses Kamaji Control Plane to deploy tenant Kubernetes clusters. -Kamaji provides a straightforward and convenient method for launching all the necessary Kubernetes control-plane in containers. -Worker nodes are then connected to these control planes and handle user workloads. - -The approach developed by the Kamaji project is modeled after the design of modern clouds and ensures security by design -where end users do not have any control plane nodes for their clusters. - -### Grafana - -Grafana with Grafana Loki and the OnCall extension provides a single interface to Observability. -It allows you to conveniently view charts, logs and manage alerts for your infrastructure and applications. - -### Victoria Metrics - -Victoria Metrics allows you to most efficiently collect, store and process metrics in the Open Metrics format, -doing it more efficiently than Prometheus in the same setup. - -### MetalLB - -MetalLB is the default load balancer for Kubernetes; -with its help, your services can obtain public addresses that are accessible not only from inside, -but also from outside your cluster network. - -### HAProxy - -HAProxy is an advanced and widely known TCP balancer. -It continuously checks service availability and carefully balances production traffic between them in real time. - -See the application reference: [TCP Balancer]({{% ref "/docs/next/networking/tcp-balancer" %}}) - -### SeaweedFS - -SeaweedFS is a simple and highly scalable distributed file system designed for two main objectives: -to store billions of files and to serve the files faster. It allows access O(1), usually just one disk read operation. - -### Kubernetes Operators - -Cozystack includes a set of Kubernetes operators, used for managing system services and managed applications. - -## Layer 4: User-side services - -Cozystack is shipped with a number of user-side applications, pre-configured for reliability and resource efficiency, -coming with monitoring and observability included: - -- [Tenant Kubernetes clusters]({{% ref "/docs/next/kubernetes" %}}), fully-functional managed Kubernetes clusters for development and production workloads. -- [Managed applications]({{% ref "/docs/next/applications" %}}), such as databases and queues. -- [Virtual machines]({{% ref "/docs/next/virtualization" %}}), supporting Linux and Windows OS. -- [Networking appliances]({{% ref "/docs/next/networking" %}}), including VPN, HTTP cache, TCP load balancer, and virtual routers. - -### Managed Kubernetes - -Cozystack deploys and manages tenant Kubernetes clusters as standalone applications within each tenant’s isolated environment. -These clusters are fully separate from the root management cluster and are intended for deploying tenant-specific or customer-developed applications. - -Deployment involves the following components: - -- **Kamaji Control Plane**: [Kamaji](https://kamaji.clastix.io/) is an open-source project that facilitates the deployment - of Kubernetes control planes as pods within a root cluster. - Each control plane pod includes essential components like `kube-apiserver`, `controller-manager`, and `scheduler`, - allowing for efficient multi-tenancy and resource utilization. - -- **Etcd Cluster**: A dedicated etcd cluster is deployed using Ænix's [aenix-io/etcd-operator](https://github.com/aenix-io/etcd-operator). - It provides reliable and scalable key-value storage for the Kubernetes control plane. - -- **Worker Nodes**: Virtual Machines are provisioned to serve as worker nodes. - These nodes are configured to join the tenant Kubernetes cluster, enabling the deployment and management of workloads. - -This architecture ensures isolated, scalable, and efficient Kubernetes environments tailored for each tenant. - -- Supported version: Kubernetes v1.32.4 -- Operator: [aenix-io/etcd-operator](https://github.com/aenix-io/etcd-operator) v0.4.2 -- Managed application reference: [Kubernetes]({{% ref "/docs/next/kubernetes" %}}) - - -### Virtual Machines - -In Cozystack, virtualization features are powered by [KubeVirt]({{% ref "/docs/next/guides/platform-stack#kubevirt" %}}). -Cozystack has a number of applications providing virtualization functionality: - -- [Virtual machine instance]({{% ref "/docs/next/virtualization/vm-instance" %}}) with more advanced configuration. -- [Virtual machine disk]({{% ref "/docs/next/virtualization/vm-disk" %}}), offering a choice of image sources. -- [VM image (Golden Disk)]({{% ref "/docs/next/virtualization/vm-image" %}}), which makes OS images locally available, improving VM creation time and saving network traffic. - - -### ClickHouse - -ClickHouse is an open source high-performance and column-oriented SQL database management system (DBMS). -It is used for online analytical processing (OLAP). -In the Cozystack platform, we use the Altinity operator to provide ClickHouse. - -- Supported version: 24.9.2.42 -- Kubernetes operator: [Altinity/clickhouse-operator](https://github.com/Altinity/clickhouse-operator) v0.25.0 -- Website: [clickhouse.com](https://clickhouse.com/) -- Managed application reference: [ClickHouse]({{% ref "/docs/next/applications/clickhouse" %}}) - - -### Kafka - -Apache Kafka is an open-source distributed event streaming platform. -It aims to provide a unified, high-throughput, low-latency platform for handling real-time data feeds. -Cozystack is using [Strimzi](https://github.com/cozystack/cozystack/blob/main/packages/system/kafka-operator/charts/strimzi-kafka-operator/README.md) -to run an Apache Kafka cluster on Kubernetes in various deployment configurations. - -- Supported version: Apache Kafka 3.9.0 -- Kubernetes operator: [strimzi/strimzi-kafka-operator](https://github.com/strimzi/strimzi-kafka-operator) v0.45.0 -- Website: [kafka.apache.org](https://kafka.apache.org/) -- Managed application reference: [Kafka]({{% ref "/docs/next/applications/kafka" %}}) - - -### MariaDB (MySQL fork) - -MySQL is a widely used and well-known relational database. -The implementation in the platform provides the ability to create a replicated MariaDB cluster. -This cluster is managed using the increasingly popular mariadb-operator. - -For each database, there is an interface for configuring users, their permissions, -as well as schedules for creating backups using [Restic](https://restic.net/), one of the most efficient tools currently available. - -- Supported version: MariaDB 11.4.3 -- Kubernetes operator: [mariadb-operator/mariadb-operator](https://github.com/mariadb-operator/mariadb-operator) v0.18.0 -- Website: [mariadb.com](https://mariadb.com/) -- Managed application reference: [MySQL]({{% ref "/docs/next/applications/mariadb" %}}) - - -### NATS Messaging - -NATS is an open-source, simple, secure, and high performance messaging system. -It provides a data layer for cloud native applications, IoT messaging, and microservices architectures. - -- Supported version: NATS 2.10.17 -- Website: [nats.io](https://nats.io/) -- Managed application reference: [NATS]({{% ref "/docs/next/applications/nats" %}}) - - -### PostgreSQL - -Nowadays, PostgreSQL is the most popular relational database. -Its platform-side implementation involves a self-healing replicated cluster. -This is managed with the increasingly popular CloudNativePG operator within the community. - - -- Supported version: PostgreSQL 17 -- Kubernetes operator: [cloudnative-pg/cloudnative-pg](https://github.com/cloudnative-pg/cloudnative-pg) v1.24.0 -- Website: [cloudnative-pg.io](https://cloudnative-pg.io/) -- Managed application reference: [PostgreSQL]({{% ref "/docs/next/applications/postgres" %}}) - - -### RabbitMQ - -RabbitMQ is a widely known message broker. -The platform-side implementation allows you to create failover clusters managed by the official RabbitMQ operator. - -- Supported version: RabbitMQ 4.1.0+ (latest stable version) -- Kubernetes operator: [rabbitmq/cluster-operator](https://github.com/rabbitmq/cluster-operator) v1.10.0 -- Website: [rabbitmq.com](https://www.rabbitmq.com/) -- Managed application reference: [RabbitMQ]({{% ref "/docs/next/applications/rabbitmq" %}}) - - -### Redis - -Redis is the most commonly used key-value in-memory data store. -It is most often used as a cache, as storage for user sessions, or as a message broker. -The platform-side implementation involves a replicated failover Redis cluster with Sentinel. -This is managed by the spotahome/redis-operator. - -- Supported version: Redis 6.2.6+ (based on `alpine`) -- Kubernetes operator: [spotahome/redis-operator](https://github.com/spotahome/redis-operator) v1.3.0-rc1 -- Website: [redis.io](https://redis.io/) -- Managed application reference: [Redis]({{% ref "/docs/next/applications/redis" %}}) - - -### VPN Service - -The VPN Service is powered by the Outline Server, an advanced and user-friendly VPN solution. -It is internally known as "Shadowbox," which simplifies the process of setting up and sharing Shadowsocks servers. -It operates by launching Shadowsocks instances on demand. - -The Shadowsocks protocol uses symmetric encryption algorithms. -This enables fast internet access while complicating traffic analysis and blocking through DPI (Deep Packet Inspection). - -- Supported version: Outline Server, v1.12.3+ (stable) -- Website: [getoutline.org](https://getoutline.org/) -- Managed application reference: [VPN]({{% ref "/docs/next/networking/vpn" %}}) - -### HTTP Cache - -Nginx-based HTTP caching service helps protect your application from overload using the powerful Nginx. -Nginx is traditionally used to build CDNs and caching servers. - -The platform-side implementation features efficient caching without using a clustered file system. -It also supports horizontal scaling without duplicating data on multiple servers. - -- Included versions: Nginx 1.25.3, HAProxy latest stable. -- Website: [nginx.org](https://nginx.org/) -- Managed application reference: [HTTP Cache]({{% ref "/docs/next/networking/http-cache" %}}) - - -### TCP Balancer - -The Managed TCP Load Balancer service provides deployment and management of load balancers. -It efficiently distributes incoming TCP traffic across multiple backend servers, ensuring high availability and optimal resource utilization. +Components are organized by their role in the platform stack, from the lowest-level OS and Kubernetes runtime up through platform automation and managed application runtimes. +Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. + +## Operating system and Kubernetes runtime -TCP Load Balancer service is powered by [HAProxy](https://www.haproxy.org/), a mature and reliable TCP load balancer. +The foundation layer provides a secure, immutable operating system and the Kubernetes control loop on top of which all other components run. -- Managed application reference: [TCP balancer]({{% ref "/docs/next/networking/tcp-balancer" %}}) -- Docs: [HAProxy Documentation](https://www.haproxy.com/documentation/) +{{< oss-cards >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="A purpose-built, immutable Linux distribution designed exclusively for running Kubernetes. Talos eliminates the traditional OS attack surface by removing shell access, SSH, and mutable filesystem layers. Cozystack uses Talos to provide consistent, secure, and self-healing Kubernetes nodes with minimal operational overhead." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="The industry-standard container orchestration platform that manages all Cozystack workloads. Kubernetes provides a unified, declarative API for deploying and scaling services. Both the management cluster and tenant clusters run on Kubernetes, enabling operators and users to interact with the platform through a familiar YAML-based interface." >}} +{{< /oss-cards >}} +## Cluster provisioning and virtualization -### Tenants +These components enable declarative provisioning of tenant Kubernetes clusters and virtual machines as native Kubernetes workloads. + +{{< oss-cards >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys and manages tenant Kubernetes control planes as pods within the Cozystack management cluster, enabling efficient multi-tenancy. Each tenant receives a dedicated control plane (API server, controller-manager, scheduler) without requiring dedicated VMs for control-plane nodes. Kamaji follows the design patterns of modern managed Kubernetes cloud offerings." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="The Kubernetes SIG-maintained standard for declarative cluster lifecycle management. Cozystack uses CAPI with Kamaji and KubeVirt providers to provision tenant Kubernetes clusters: Kamaji manages the control plane while KubeVirt provisions worker node VMs. Cluster API enables consistent, reproducible cluster creation and upgrade workflows." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Extends Kubernetes with virtual machine management capabilities, enabling VMs to run alongside containerized workloads on the same cluster. KubeVirt underpins Cozystack's Virtual Machine service and bare-metal worker node provisioning for tenant Kubernetes clusters. It supports CDI (Containerized Data Importer) for disk image management and live migration." >}} +{{< /oss-cards >}} -Tenants in Cozystack are implemented as managed applications. -Learn more about tenants in [Tenant System]({{% ref "/docs/next/guides/tenants" %}}). +## Networking + +Cozystack uses a layered networking stack: Kube-OVN for VPC isolation and floating IPs, Cilium for eBPF-based pod networking, and additional components for DNS, load balancing, and ingress. + +{{< oss-cards >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="An eBPF-based Container Network Interface (CNI) providing advanced pod networking and NetworkPolicy enforcement in Cozystack. Cilium leverages the Linux kernel's eBPF technology for high-throughput, low-latency packet processing without kernel module dependencies. It works alongside Kube-OVN to deliver efficient pod-to-pod and pod-to-external traffic routing." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking fabric providing VPC isolation, floating IP addresses, and tenant network segmentation in Cozystack. Built on Open vSwitch technology, Kube-OVN enables each tenant to have a fully isolated virtual network environment. It supports static IP allocation, subnet management, and seamless integration with KubeVirt VM networking." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="A meta-CNI plugin enabling Kubernetes pods to attach multiple network interfaces simultaneously. Cozystack uses Multus to connect KubeVirt VMs to both the cluster overlay network and secondary physical or VLAN-backed interfaces. This enables advanced networking scenarios such as SR-IOV and bridged networking for virtual machine workloads." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="A bare-metal load balancer implementation for Kubernetes Services of type LoadBalancer. MetalLB assigns external IP addresses to services using ARP/NDP (layer 2 mode) or BGP (layer 3 mode), making services accessible from outside the cluster. Cozystack uses MetalLB as the default load balancer for all platform and tenant services requiring external access." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="The Kubernetes-community NGINX-based ingress controller managing HTTP and HTTPS routing for platform and tenant services in Cozystack. ingress-nginx terminates TLS, routes traffic based on hostname and path rules, and supports WebSocket, gRPC, and HTTP/2 protocols. It is deployed as the default ingress controller for Cozystack's management and tenant clusters." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="The standard Kubernetes Gateway API Custom Resource Definitions providing a role-oriented, extensible model for configuring L4/L7 network routing. Gateway API supersedes the Ingress resource with richer expressiveness and multi-tenancy support. Cozystack installs the Gateway API CRDs to enable modern traffic management integrations with compatible gateway controllers." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="The default DNS server for Kubernetes clusters in Cozystack, handling service discovery and internal name resolution for all pod-to-service DNS lookups. CoreDNS is extensible via a plugin architecture, supporting custom zone files, conditional forwarding, and health checking. It resolves cluster-internal service names in the cluster.local domain." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Synchronizes Kubernetes Service and Ingress resources to external DNS providers automatically. ExternalDNS watches for changes to DNS-annotated Kubernetes resources and creates, updates, or deletes corresponding DNS records in the configured provider. Cozystack uses ExternalDNS to automate DNS registration for platform services and tenant ingress endpoints." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="A WireGuard-based mesh networking solution for Kubernetes clusters distributed across multiple geographic locations or network segments. Kilo creates encrypted tunnels between nodes in different network zones, enabling seamless pod-to-pod communication across cloud providers, data centers, and edge locations. Cozystack uses Kilo for multi-site cluster topologies." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="A load balancer controller integrating Kubernetes Services with Hetzner dedicated server hardware via the Hetzner Robot API. RobotLB enables bare-metal Hetzner servers to provide LoadBalancer-type Kubernetes Services without requiring Hetzner Cloud. Cozystack bundles RobotLB for operators running clusters on Hetzner Robot dedicated hardware." >}} +{{< /oss-cards >}} + +## Storage and backup + +Cozystack provides replicated block storage via LINSTOR/DRBD, distributed object storage via SeaweedFS, and cluster backup via Velero. + +{{< oss-cards >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="High-performance replicated block storage built on DRBD (Distributed Replicated Block Device), the Linux kernel's native storage replication subsystem. LINSTOR acts as the management layer providing Kubernetes-integrated provisioning of persistent volumes with synchronous replication across cluster nodes. Used by Cozystack for VM disks and database persistent storage." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="A distributed object storage system designed for storing billions of files with O(1) disk read performance. SeaweedFS backs the Cozystack managed Bucket service, providing S3-compatible object storage for tenant workloads. It is optimized for high-throughput read/write operations without relying on a clustered filesystem, making it suitable for CDN and media storage." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="A backup and disaster recovery solution for Kubernetes clusters and persistent volumes. Velero enables Cozystack operators to schedule automated backups of cluster state and application data, then restore to the same or a different cluster. It supports S3-compatible object storage backends for reliable, off-cluster backup retention and point-in-time recovery." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="The Kubernetes CSI NFS driver enabling pods to mount NFS shares as persistent volumes without kernel NFS client dependencies. CSI Driver NFS supports dynamic provisioning of NFS-backed PersistentVolumeClaims and ReadWriteMany access mode required for multi-pod shared storage. Cozystack uses it for shared filesystem scenarios across cluster workloads." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle in Kubernetes, providing a consistent API for creating and restoring point-in-time storage snapshots. The external-snapshotter includes the controller and VolumeSnapshot CRDs required for snapshot operations across all CSI drivers. Cozystack uses it to enable snapshot-based backup and clone workflows for persistent volumes." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="The Kubernetes SIG Storage standard controller for managing object storage buckets as Kubernetes resources. COSI provides a vendor-neutral API for provisioning S3-compatible buckets and granting access credentials to workloads. Cozystack's managed Bucket service uses COSI to provision SeaweedFS buckets through a consistent Kubernetes-native interface." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="A lightweight web-based management interface for S3-compatible object storage, bundled with the Cozystack managed Bucket service. S3 Manager provides bucket browsing, file upload and download, and basic access management via an intuitive UI without requiring AWS CLI or complex tooling. It is deployed alongside SeaweedFS to simplify object storage operations." >}} +{{< /oss-cards >}} + +## GitOps and platform automation + +Flux is the GitOps engine for all Cozystack components. Supporting tools handle certificates, secret distribution, and configuration-change propagation. + +{{< oss-cards >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="The GitOps engine and primary lifecycle management tool for all Cozystack platform components. Flux continuously reconciles the desired cluster state declared in Helm releases and Kustomization objects. The ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0. Cozystack uses Flux for day-two operations automation." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes created by Kamaji in Cozystack. The Ænix etcd Operator provisions and operates reliable, replicated key-value storage required by each tenant's kube-apiserver. It handles etcd member addition, removal, and backup-restore operations as Kubernetes-native reconciliation loops." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation for all platform services and tenant workloads in Cozystack. cert-manager integrates with ACME-compatible CAs (Let's Encrypt), internal PKI (OpenBao), and self-signed issuers. It watches Kubernetes Ingress and Gateway resources to automatically provision and inject TLS certificates without manual intervention." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Synchronizes secrets from external key management systems — AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, OpenBao — into Kubernetes Secrets. External Secrets Operator watches ExternalSecret CRs and automatically creates and updates Kubernetes Secrets from the configured backend. It enables GitOps-friendly secret management without storing sensitive values in Git." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across multiple namespaces, keeping copies in sync whenever the source secret is updated or rotated. The ClusterSecret Operator is used in Cozystack to propagate platform-level secrets (TLS certificates, credentials) to tenant namespaces without manual copy operations. It reduces operational overhead for multi-tenant secret distribution." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Watches for changes to ConfigMaps and Secrets and automatically triggers rolling restarts of the affected Deployments, StatefulSets, or DaemonSets. Reloader eliminates the need for manual pod restarts when configuration or secret values are updated. It is deployed across the Cozystack platform to ensure components pick up configuration changes without operator intervention." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="An iPXE boot and DHCP server providing bare-metal node provisioning capabilities for Cozystack clusters. Smee handles DHCP lease allocation and serves iPXE boot scripts to network-booting servers, enabling automated OS installation and Talos Linux deployment on physical hardware. It is part of the Tinkerbell bare-metal provisioning ecosystem." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="A developer tool that creates a transparent two-way network proxy between a local development machine and a remote Kubernetes cluster. Telepresence intercepts traffic to a specific deployment and routes it to the local machine, enabling developers to run and debug services locally while accessing remote cluster services. Cozystack deploys the Traffic Manager component." >}} +{{< /oss-cards >}} + +## Observability + +The observability stack is built on VictoriaMetrics for metrics, Grafana for dashboards, and Fluent Bit for log forwarding. Goldpinger provides network connectivity checks. + +{{< oss-cards >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="A Prometheus-compatible, high-performance metrics storage and query engine deployed across the Cozystack platform. VictoriaMetrics consumes significantly less memory and disk space than Prometheus while providing better query performance at scale. It collects metrics from all platform components and exposes a PromQL-compatible API for Grafana dashboards and alerting rules." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes resources within Cozystack's observability stack. The Grafana Operator enables declarative, GitOps-friendly management of the entire Grafana configuration through CRDs. It provides platform operators and tenants with a unified interface for viewing metrics, logs, and infrastructure alerts." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="A lightweight log forwarder deployed as a DaemonSet on every Cozystack node, collecting and shipping logs from all platform components and tenant workloads. Fluent Bit uses minimal CPU and memory resources, making it suitable for high-throughput log collection. It supports flexible output routing to VictoriaLogs or any OpenTelemetry-compatible log storage backend." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Listens to the Kubernetes API and generates metrics about the state of Kubernetes objects: deployments, pods, nodes, PersistentVolumeClaims, and more. kube-state-metrics exposes this data in Prometheus format, enabling Cozystack's VictoriaMetrics stack to track cluster health and resource usage over time for dashboards and alerting." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exposes detailed system and hardware metrics from each Kubernetes node in Cozystack, including CPU usage, memory pressure, disk I/O, and network statistics. node-exporter runs as a DaemonSet and feeds host-level telemetry into VictoriaMetrics. It is the standard tool for bare-metal and VM node observability in Prometheus-compatible stacks." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="Custom Resource Definitions for Prometheus-style monitoring resources (ServiceMonitor, PodMonitor, PrometheusRule, AlertmanagerConfig) consumed by VictoriaMetrics in Cozystack. These CRDs provide a standard, vendor-neutral interface for declaring monitoring targets and alerting rules, independent of whether Prometheus or VictoriaMetrics is the underlying engine." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for Kubernetes, feeding CPU and memory usage data to the Horizontal Pod Autoscaler and the kubectl top command. Metrics Server aggregates kubelet-reported resource usage and exposes it as an API extension. Cozystack deploys Metrics Server as a prerequisite for HPA and VPA functionality across platform and tenant clusters." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="A pod-to-pod network connectivity checker developed by Bloomberg and deployed as a DaemonSet across all Cozystack nodes. Goldpinger continuously pings every other Goldpinger instance in the cluster and exposes connectivity metrics and a real-time visualization UI. It enables rapid detection of node-to-node network partitions and CNI routing failures." >}} +{{< /oss-cards >}} + +## Autoscaling and resource management + +{{< oss-cards >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically adjusts CPU and memory resource requests and limits for running pods based on observed usage patterns. VPA eliminates the need for manual resource tuning, right-sizing pods to match their actual workload requirements. Cozystack deploys VPA to optimize resource utilization across platform components and tenant application workloads (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Dynamically scales node pools up or down in response to pending pod scheduling failures or underutilized nodes. The Cluster Autoscaler integrates with cloud provider APIs to provision or terminate worker node VMs, maintaining the optimal cluster size for current workload demand. Cozystack uses it to enable cost-efficient elastic scaling of tenant Kubernetes clusters." >}} +{{< /oss-cards >}} + +## GPU and accelerators + +{{< oss-cards >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Automates the complete lifecycle of NVIDIA GPU drivers, container runtimes, device plugins, and monitoring components on Kubernetes nodes. The GPU Operator eliminates manual driver installation and maintenance on GPU-equipped Cozystack nodes. It enables GPU-accelerated workloads including AI/ML training, LLM inference, and scientific computing without per-node manual setup." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="A CNCF Sandbox project that enables GPU sharing and fractional GPU scheduling on Kubernetes, allowing multiple workloads to share a single physical GPU. HAMi intercepts CUDA API calls to enforce resource limits and isolation between co-hosted GPU workloads. Cozystack uses HAMi to maximize GPU utilization for LLM inference and AI development platforms." >}} +{{< /oss-cards >}} + +## Identity, registry, and secrets + +{{< oss-cards >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="An enterprise-grade OIDC and SAML identity provider deployed via the KubeRocketCI Keycloak Operator in Cozystack. Keycloak provides single sign-on for the platform API, Grafana dashboards, Harbor registry, and tenant services. It supports role-based access control, external identity provider federation, and token-based API authentication for the entire platform." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="A CNCF-graduated OCI-compliant container registry deployed in Cozystack for hosting container images and Helm charts. Harbor provides role-based access control, image vulnerability scanning, content trust signing, and replication across registries. Platform operators and tenants can use Harbor as a private registry for custom application images and chart repositories." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="An open-source, community-driven fork of HashiCorp Vault under MPL-2.0, deployed via the official OpenBao Helm chart in Cozystack. OpenBao provides dynamic secrets generation, PKI certificate management, and encrypted secret storage for Kubernetes workloads. It supports multiple authentication backends including Kubernetes service account tokens and OIDC." >}} +{{< /oss-cards >}} + +## Managed database runtimes + +Cozystack ships one-click managed databases for the most common relational, document, columnar, search, vector, and in-memory use cases. + +{{< oss-cards >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="A powerful, open-source relational database managed via the CloudNativePG operator in Cozystack. Cozystack provisions self-healing replicated PostgreSQL clusters with automated failover, backup scheduling via Barman, and connection pooling. Ideal for transactional workloads, web application backends, and any application requiring ACID-compliant relational storage." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="A MySQL-compatible relational database managed via mariadb-operator in Cozystack, providing fully replicated cluster deployments. Supports Galera multi-primary replication, automated user and permission management, and Restic-based backup scheduling. A drop-in replacement for MySQL workloads requiring high availability and familiar SQL semantics." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="A document-oriented NoSQL database deployed as a sharded or replica-set cluster via the Percona Operator for MongoDB in Cozystack. Supports flexible JSON-like BSON document storage, horizontal sharding for multi-terabyte datasets, and automated backup via Percona Backup for MongoDB. Suitable for high-throughput document storage and aggregation workloads." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="A column-oriented SQL database management system optimized for real-time analytical queries on large datasets. Cozystack deploys ClickHouse via the Altinity ClickHouse Operator, providing distributed multi-shard clusters with data replication. Ideal for OLAP workloads such as event analytics, time-series data processing, and ad-tech pipelines." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="An Apache 2.0-licensed search and analytics engine managed via opensearch-k8s-operator in Cozystack. OpenSearch provides full-text search, log aggregation, security analytics, and observability features. It serves as a scalable alternative to Elasticsearch for applications requiring advanced query DSL, index management, and dashboarding via OpenSearch Dashboards." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="A high-performance vector database designed for similarity search and machine learning workloads, deployed via the official Qdrant Helm chart in Cozystack. Qdrant enables approximate nearest-neighbor search over dense and sparse vector embeddings, making it a natural fit for AI applications, recommendation engines, and semantic search pipelines." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="A distributed, multi-model database with strong ACID guarantees across the entire cluster, managed via the FoundationDB Kubernetes Operator in Cozystack. FoundationDB is designed for extreme reliability and scalability, powering the storage backend for Apple iCloud. It provides the core transactional layer for applications requiring strict consistency at scale." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="An in-memory key-value store managed via the Spotahome Redis Operator in Cozystack, deployed as a replicated Sentinel cluster for automatic failover. Cozystack supports Redis 7.4 and Redis 8, covering the licensing transition from RSALv2/SSPL to AGPL. Common use cases include session storage, distributed caching, pub/sub messaging, and rate limiting." >}} +{{< /oss-cards >}} + +## Managed messaging and caching runtimes + +{{< oss-cards >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="A distributed event streaming platform managed via the Strimzi Kafka Operator in Cozystack, enabling high-throughput, fault-tolerant message queues. Kafka decouples producers and consumers, supporting event-driven architectures, stream processing, and durable log storage. Cozystack provides multi-broker Kafka clusters with configurable replication and retention policies." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="A lightweight, high-performance messaging system deployed via the official NATS Helm chart in Cozystack. NATS supports publish-subscribe, request-reply, and queue-based messaging patterns with low latency and minimal resource overhead. It is well-suited for microservices communication, IoT messaging, and cloud-native applications requiring simple, fast message passing." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="A widely-used message broker managed via the official RabbitMQ Cluster Operator in Cozystack, providing AMQP-based messaging with configurable routing, acknowledgments, and dead-letter exchanges. RabbitMQ supports complex messaging topologies with fanout, direct, and topic-based exchanges. Cozystack deploys it as a highly available cluster with quorum queues." >}} +{{< /oss-cards >}} + +## Managed networking services + +{{< oss-cards >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the Cozystack managed HTTP Cache service, providing reverse-proxy caching to shield origin servers from traffic spikes. The HTTP Cache service integrates Nginx's efficient caching engine with GeoIP filtering via IP2Location modules. It supports horizontal scaling without a shared filesystem and is suitable for CDN-like caching architectures and high-traffic origins." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="An enterprise-grade TCP and HTTP load balancer powering both the managed TCP Balancer service and HTTP Cache appliance in Cozystack. HAProxy provides active health checking, session persistence, and high-throughput connection handling. It is used for production traffic distribution in environments requiring deterministic, low-latency TCP load balancing." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP database modules (IP2Location and IP2Proxy) bundled into the Cozystack HTTP Cache service for IP-based geolocation and proxy detection. These Nginx modules enable country-based traffic filtering, geo-targeted content routing, and proxy/VPN detection in the managed HTTP Cache appliance." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="The VPN service backend powering Cozystack's managed VPN offering, based on the Shadowsocks protocol developed by the Jigsaw team at Google. Outline Server manages Shadowsocks instances on demand, providing fast access keys and an API for user management. The Shadowsocks protocol uses symmetric encryption to resist Deep Packet Inspection and traffic blocking." >}} +{{< /oss-cards >}} diff --git a/content/en/docs/v1.3/guides/platform-stack/_index.md b/content/en/docs/v1.3/guides/platform-stack/_index.md index 7d393c9c..fab4b5de 100644 --- a/content/en/docs/v1.3/guides/platform-stack/_index.md +++ b/content/en/docs/v1.3/guides/platform-stack/_index.md @@ -1,314 +1,150 @@ --- -title: "Cozystack Architecture and Platform Stack" +title: "Cozystack Platform Stack" linkTitle: "Platform Stack" -description: "Learn of the core components that power the functionality and flexibility of Cozystack" +description: "All open-source components in the Cozystack platform stack: networking, storage, observability, databases, and managed services with licenses and technical descriptions." weight: 15 --- -This article explains Cozystack composition through its four layers, and shows the role and value of each component in the platform stack. +Cozystack is composed entirely of open-source components, layered from the operating system up to user-facing managed services. +This page describes each component, its role in the platform, and its upstream license. ## Overview -To understand Cozystack composition, it's helpful to view it as sub-systems, layered from hardware to user-facing: - ![Cozystack Architecture Layers](cozystack-layers.png) -## Layer 1: OS and Hardware - -This is a foundation layer, providing cluster functionality on bare metal. -It consists of Talos Linux and a Kubernetes cluster installed on Talos. - -### Talos Linux - -Talos Linux is a Linux distribution made and optimized for a single purpose: to run Kubernetes. -It provides the foundation for reliability and security in a Cozystack cluster. -Its use allows Cozystack to limit the technology stack, improving stability and security. - -Read more about it in the [Talos Linux]({{% ref "/docs/v1.3/guides/talos" %}}) section. - -### Kubernetes - -Kubernetes has already become a kind of de facto standard for managing server workloads. - -One of the key features of Kubernetes is a convenient and unified API that is understandable to everyone (everything is YAML). Also, the best software design patterns that provide continuous recovery in any situation (reconciliation method) and efficient scaling to a large number of servers. - -This fully solves the integration problem, since all existing virtualization platforms have an outdated and rather complex APIs that cannot be extended without modifying the source code. As a result, there is always a need to create your own custom solutions, which requires additional effort. - -## Layer 2: Infrastructure Services - -Second layer contains the key components which perform major roles such as storage, networking, and virtualization. -Adding these components to the base Kubernetes cluster makes it much more functional. - -### Flux CD - -FluxCD provides a simple and uniform interface for both installing all platform components and managing their lifecycle. -Cozystack developers have adopted FluxCD as the core element of the platform, believing it sets a new industry standard for platform engineering. - -### KubeVirt - -KubeVirt brings virtualization capability to Cozystack. -It enables creating virtual machines and worker nodes for tenant Kubernetes clusters. - -KubeVirt is a project started by global industry leaders with a common vision to unify Kubernetes and a desire to introduce it to the world of virtualization. -It extends the capabilities of Kubernetes by providing convenient abstractions for launching and managing virtual machines, -as well the all related entities such as snapshots, presets, virtual volumes, and more. - -At the moment, the KubeVirt project is being jointly developed by such world-famous companies as RedHat, NVIDIA, ARM. - -### DRBD and LINSTOR - -DRBD and LINSTOR are the foundation of replicated storage in Cozystack. - -DRBD is the fastest replication block storage running right in the Linux kernel. -When DRBD only deals with data replication, time-tested technologies such as LVM or ZFS are used to securely store the data. -The DRBD kernel module is included in the mainline Linux kernel and has been used to build fault-tolerant systems for over a decade. - -DRBD is managed using LINSTOR, a system integrated with Kubernetes. -LINSTOR is a management layer for creating virtual volumes based on DRBD. -It enables managing hundreds or thousands of virtual volumes in the Cozystack cluster. - -### Kube-OVN - -The networking functionality in Cozystack is based on Kube-OVN and Cilium. - -OVN is a free implementation of virtual network fabric for Kubernetes and OpenStack based on the Open vSwitch technology. -With Kube-OVN, you get a robust and functional virtual network that ensures reliable isolation between tenants and provides floating addresses for virtual machines. - -In the future, this will enable seamless integration with other clusters and customer network services. - -### Cilium - -Utilizing Cilium in conjunction with OVN enables the most efficient and flexible network policies, -along with a productive services network in Kubernetes, leveraging an offloaded Linux network stack featuring the cutting-edge eBPF technology. - -Cilium is a highly promising project, widely adopted and supported by numerous cloud providers worldwide. - -## Layer 3: Platform Services - -These are components that provide the user-side functionality to Cozystack and its managed applications. - -### OpenAPI UI - -OpenAPI UI provides the main web interface for deploying and managing applications in Cozystack. -It serves as the primary dashboard that allows users to interact with the Cozystack API through a user-friendly interface. - -The interface is built on top of the Cozystack OpenAPI specifications, automatically generating forms and documentation -for all available managed applications. Users can deploy databases, Kubernetes clusters, virtual machines, and other services -directly through the dashboard without needing to write YAML manifests manually. - -The dashboard also integrates with OIDC authentication via Keycloak, providing secure single sign-on access to the platform. - -### Kamaji - -Cozystack uses Kamaji Control Plane to deploy tenant Kubernetes clusters. -Kamaji provides a straightforward and convenient method for launching all the necessary Kubernetes control-plane in containers. -Worker nodes are then connected to these control planes and handle user workloads. - -The approach developed by the Kamaji project is modeled after the design of modern clouds and ensures security by design -where end users do not have any control plane nodes for their clusters. - -### Grafana - -Grafana with Grafana Loki and the OnCall extension provides a single interface to Observability. -It allows you to conveniently view charts, logs and manage alerts for your infrastructure and applications. - -### Victoria Metrics - -Victoria Metrics allows you to most efficiently collect, store and process metrics in the Open Metrics format, -doing it more efficiently than Prometheus in the same setup. - -### MetalLB - -MetalLB is the default load balancer for Kubernetes; -with its help, your services can obtain public addresses that are accessible not only from inside, -but also from outside your cluster network. - -### HAProxy - -HAProxy is an advanced and widely known TCP balancer. -It continuously checks service availability and carefully balances production traffic between them in real time. - -See the application reference: [TCP Balancer]({{% ref "/docs/v1.3/networking/tcp-balancer" %}}) - -### SeaweedFS - -SeaweedFS is a simple and highly scalable distributed file system designed for two main objectives: -to store billions of files and to serve the files faster. It allows access O(1), usually just one disk read operation. - -### Kubernetes Operators - -Cozystack includes a set of Kubernetes operators, used for managing system services and managed applications. - -## Layer 4: User-side services - -Cozystack is shipped with a number of user-side applications, pre-configured for reliability and resource efficiency, -coming with monitoring and observability included: - -- [Tenant Kubernetes clusters]({{% ref "/docs/v1.3/kubernetes" %}}), fully-functional managed Kubernetes clusters for development and production workloads. -- [Managed applications]({{% ref "/docs/v1.3/applications" %}}), such as databases and queues. -- [Virtual machines]({{% ref "/docs/v1.3/virtualization" %}}), supporting Linux and Windows OS. -- [Networking appliances]({{% ref "/docs/v1.3/networking" %}}), including VPN, HTTP cache, TCP load balancer, and virtual routers. - -### Managed Kubernetes - -Cozystack deploys and manages tenant Kubernetes clusters as standalone applications within each tenant’s isolated environment. -These clusters are fully separate from the root management cluster and are intended for deploying tenant-specific or customer-developed applications. - -Deployment involves the following components: - -- **Kamaji Control Plane**: [Kamaji](https://kamaji.clastix.io/) is an open-source project that facilitates the deployment - of Kubernetes control planes as pods within a root cluster. - Each control plane pod includes essential components like `kube-apiserver`, `controller-manager`, and `scheduler`, - allowing for efficient multi-tenancy and resource utilization. - -- **Etcd Cluster**: A dedicated etcd cluster is deployed using Ænix's [aenix-io/etcd-operator](https://github.com/aenix-io/etcd-operator). - It provides reliable and scalable key-value storage for the Kubernetes control plane. - -- **Worker Nodes**: Virtual Machines are provisioned to serve as worker nodes. - These nodes are configured to join the tenant Kubernetes cluster, enabling the deployment and management of workloads. - -This architecture ensures isolated, scalable, and efficient Kubernetes environments tailored for each tenant. - -- Supported version: Kubernetes v1.32.4 -- Operator: [aenix-io/etcd-operator](https://github.com/aenix-io/etcd-operator) v0.4.2 -- Managed application reference: [Kubernetes]({{% ref "/docs/v1.3/kubernetes" %}}) - - -### Virtual Machines - -In Cozystack, virtualization features are powered by [KubeVirt]({{% ref "/docs/v1.3/guides/platform-stack#kubevirt" %}}). -Cozystack has a number of applications providing virtualization functionality: - -- [Virtual machine instance]({{% ref "/docs/v1.3/virtualization/vm-instance" %}}) with more advanced configuration. -- [Virtual machine disk]({{% ref "/docs/v1.3/virtualization/vm-disk" %}}), offering a choice of image sources. -- [VM image (Golden Disk)]({{% ref "/docs/v1.3/virtualization/vm-image" %}}), which makes OS images locally available, improving VM creation time and saving network traffic. - - -### ClickHouse - -ClickHouse is an open source high-performance and column-oriented SQL database management system (DBMS). -It is used for online analytical processing (OLAP). -In the Cozystack platform, we use the Altinity operator to provide ClickHouse. - -- Supported version: 24.9.2.42 -- Kubernetes operator: [Altinity/clickhouse-operator](https://github.com/Altinity/clickhouse-operator) v0.25.0 -- Website: [clickhouse.com](https://clickhouse.com/) -- Managed application reference: [ClickHouse]({{% ref "/docs/v1.3/applications/clickhouse" %}}) - - -### Kafka - -Apache Kafka is an open-source distributed event streaming platform. -It aims to provide a unified, high-throughput, low-latency platform for handling real-time data feeds. -Cozystack is using [Strimzi](https://github.com/cozystack/cozystack/blob/main/packages/system/kafka-operator/charts/strimzi-kafka-operator/README.md) -to run an Apache Kafka cluster on Kubernetes in various deployment configurations. - -- Supported version: Apache Kafka 3.9.0 -- Kubernetes operator: [strimzi/strimzi-kafka-operator](https://github.com/strimzi/strimzi-kafka-operator) v0.45.0 -- Website: [kafka.apache.org](https://kafka.apache.org/) -- Managed application reference: [Kafka]({{% ref "/docs/v1.3/applications/kafka" %}}) - - -### MariaDB (MySQL fork) - -MySQL is a widely used and well-known relational database. -The implementation in the platform provides the ability to create a replicated MariaDB cluster. -This cluster is managed using the increasingly popular mariadb-operator. - -For each database, there is an interface for configuring users, their permissions, -as well as schedules for creating backups using [Restic](https://restic.net/), one of the most efficient tools currently available. - -- Supported version: MariaDB 11.4.3 -- Kubernetes operator: [mariadb-operator/mariadb-operator](https://github.com/mariadb-operator/mariadb-operator) v0.18.0 -- Website: [mariadb.com](https://mariadb.com/) -- Managed application reference: [MySQL]({{% ref "/docs/v1.3/applications/mariadb" %}}) - - -### NATS Messaging - -NATS is an open-source, simple, secure, and high performance messaging system. -It provides a data layer for cloud native applications, IoT messaging, and microservices architectures. - -- Supported version: NATS 2.10.17 -- Website: [nats.io](https://nats.io/) -- Managed application reference: [NATS]({{% ref "/docs/v1.3/applications/nats" %}}) - - -### PostgreSQL - -Nowadays, PostgreSQL is the most popular relational database. -Its platform-side implementation involves a self-healing replicated cluster. -This is managed with the increasingly popular CloudNativePG operator within the community. - - -- Supported version: PostgreSQL 17 -- Kubernetes operator: [cloudnative-pg/cloudnative-pg](https://github.com/cloudnative-pg/cloudnative-pg) v1.24.0 -- Website: [cloudnative-pg.io](https://cloudnative-pg.io/) -- Managed application reference: [PostgreSQL]({{% ref "/docs/v1.3/applications/postgres" %}}) - - -### RabbitMQ - -RabbitMQ is a widely known message broker. -The platform-side implementation allows you to create failover clusters managed by the official RabbitMQ operator. - -- Supported version: RabbitMQ 4.1.0+ (latest stable version) -- Kubernetes operator: [rabbitmq/cluster-operator](https://github.com/rabbitmq/cluster-operator) v1.10.0 -- Website: [rabbitmq.com](https://www.rabbitmq.com/) -- Managed application reference: [RabbitMQ]({{% ref "/docs/v1.3/applications/rabbitmq" %}}) - - -### Redis - -Redis is the most commonly used key-value in-memory data store. -It is most often used as a cache, as storage for user sessions, or as a message broker. -The platform-side implementation involves a replicated failover Redis cluster with Sentinel. -This is managed by the spotahome/redis-operator. - -- Supported version: Redis 6.2.6+ (based on `alpine`) -- Kubernetes operator: [spotahome/redis-operator](https://github.com/spotahome/redis-operator) v1.3.0-rc1 -- Website: [redis.io](https://redis.io/) -- Managed application reference: [Redis]({{% ref "/docs/v1.3/applications/redis" %}}) - - -### VPN Service - -The VPN Service is powered by the Outline Server, an advanced and user-friendly VPN solution. -It is internally known as "Shadowbox," which simplifies the process of setting up and sharing Shadowsocks servers. -It operates by launching Shadowsocks instances on demand. - -The Shadowsocks protocol uses symmetric encryption algorithms. -This enables fast internet access while complicating traffic analysis and blocking through DPI (Deep Packet Inspection). - -- Supported version: Outline Server, v1.12.3+ (stable) -- Website: [getoutline.org](https://getoutline.org/) -- Managed application reference: [VPN]({{% ref "/docs/v1.3/networking/vpn" %}}) - -### HTTP Cache - -Nginx-based HTTP caching service helps protect your application from overload using the powerful Nginx. -Nginx is traditionally used to build CDNs and caching servers. - -The platform-side implementation features efficient caching without using a clustered file system. -It also supports horizontal scaling without duplicating data on multiple servers. - -- Included versions: Nginx 1.25.3, HAProxy latest stable. -- Website: [nginx.org](https://nginx.org/) -- Managed application reference: [HTTP Cache]({{% ref "/docs/v1.3/networking/http-cache" %}}) - - -### TCP Balancer - -The Managed TCP Load Balancer service provides deployment and management of load balancers. -It efficiently distributes incoming TCP traffic across multiple backend servers, ensuring high availability and optimal resource utilization. +Components are organized by their role in the platform stack, from the lowest-level OS and Kubernetes runtime up through platform automation and managed application runtimes. +Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. + +## Operating system and Kubernetes runtime -TCP Load Balancer service is powered by [HAProxy](https://www.haproxy.org/), a mature and reliable TCP load balancer. +The foundation layer provides a secure, immutable operating system and the Kubernetes control loop on top of which all other components run. -- Managed application reference: [TCP balancer]({{% ref "/docs/v1.3/networking/tcp-balancer" %}}) -- Docs: [HAProxy Documentation](https://www.haproxy.com/documentation/) +{{< oss-cards >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="A purpose-built, immutable Linux distribution designed exclusively for running Kubernetes. Talos eliminates the traditional OS attack surface by removing shell access, SSH, and mutable filesystem layers. Cozystack uses Talos to provide consistent, secure, and self-healing Kubernetes nodes with minimal operational overhead." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="The industry-standard container orchestration platform that manages all Cozystack workloads. Kubernetes provides a unified, declarative API for deploying and scaling services. Both the management cluster and tenant clusters run on Kubernetes, enabling operators and users to interact with the platform through a familiar YAML-based interface." >}} +{{< /oss-cards >}} +## Cluster provisioning and virtualization -### Tenants +These components enable declarative provisioning of tenant Kubernetes clusters and virtual machines as native Kubernetes workloads. + +{{< oss-cards >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys and manages tenant Kubernetes control planes as pods within the Cozystack management cluster, enabling efficient multi-tenancy. Each tenant receives a dedicated control plane (API server, controller-manager, scheduler) without requiring dedicated VMs for control-plane nodes. Kamaji follows the design patterns of modern managed Kubernetes cloud offerings." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="The Kubernetes SIG-maintained standard for declarative cluster lifecycle management. Cozystack uses CAPI with Kamaji and KubeVirt providers to provision tenant Kubernetes clusters: Kamaji manages the control plane while KubeVirt provisions worker node VMs. Cluster API enables consistent, reproducible cluster creation and upgrade workflows." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Extends Kubernetes with virtual machine management capabilities, enabling VMs to run alongside containerized workloads on the same cluster. KubeVirt underpins Cozystack's Virtual Machine service and bare-metal worker node provisioning for tenant Kubernetes clusters. It supports CDI (Containerized Data Importer) for disk image management and live migration." >}} +{{< /oss-cards >}} -Tenants in Cozystack are implemented as managed applications. -Learn more about tenants in [Tenant System]({{% ref "/docs/v1.3/guides/tenants" %}}). +## Networking + +Cozystack uses a layered networking stack: Kube-OVN for VPC isolation and floating IPs, Cilium for eBPF-based pod networking, and additional components for DNS, load balancing, and ingress. + +{{< oss-cards >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="An eBPF-based Container Network Interface (CNI) providing advanced pod networking and NetworkPolicy enforcement in Cozystack. Cilium leverages the Linux kernel's eBPF technology for high-throughput, low-latency packet processing without kernel module dependencies. It works alongside Kube-OVN to deliver efficient pod-to-pod and pod-to-external traffic routing." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking fabric providing VPC isolation, floating IP addresses, and tenant network segmentation in Cozystack. Built on Open vSwitch technology, Kube-OVN enables each tenant to have a fully isolated virtual network environment. It supports static IP allocation, subnet management, and seamless integration with KubeVirt VM networking." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="A meta-CNI plugin enabling Kubernetes pods to attach multiple network interfaces simultaneously. Cozystack uses Multus to connect KubeVirt VMs to both the cluster overlay network and secondary physical or VLAN-backed interfaces. This enables advanced networking scenarios such as SR-IOV and bridged networking for virtual machine workloads." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="A bare-metal load balancer implementation for Kubernetes Services of type LoadBalancer. MetalLB assigns external IP addresses to services using ARP/NDP (layer 2 mode) or BGP (layer 3 mode), making services accessible from outside the cluster. Cozystack uses MetalLB as the default load balancer for all platform and tenant services requiring external access." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="The Kubernetes-community NGINX-based ingress controller managing HTTP and HTTPS routing for platform and tenant services in Cozystack. ingress-nginx terminates TLS, routes traffic based on hostname and path rules, and supports WebSocket, gRPC, and HTTP/2 protocols. It is deployed as the default ingress controller for Cozystack's management and tenant clusters." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="The standard Kubernetes Gateway API Custom Resource Definitions providing a role-oriented, extensible model for configuring L4/L7 network routing. Gateway API supersedes the Ingress resource with richer expressiveness and multi-tenancy support. Cozystack installs the Gateway API CRDs to enable modern traffic management integrations with compatible gateway controllers." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="The default DNS server for Kubernetes clusters in Cozystack, handling service discovery and internal name resolution for all pod-to-service DNS lookups. CoreDNS is extensible via a plugin architecture, supporting custom zone files, conditional forwarding, and health checking. It resolves cluster-internal service names in the cluster.local domain." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Synchronizes Kubernetes Service and Ingress resources to external DNS providers automatically. ExternalDNS watches for changes to DNS-annotated Kubernetes resources and creates, updates, or deletes corresponding DNS records in the configured provider. Cozystack uses ExternalDNS to automate DNS registration for platform services and tenant ingress endpoints." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="A WireGuard-based mesh networking solution for Kubernetes clusters distributed across multiple geographic locations or network segments. Kilo creates encrypted tunnels between nodes in different network zones, enabling seamless pod-to-pod communication across cloud providers, data centers, and edge locations. Cozystack uses Kilo for multi-site cluster topologies." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="A load balancer controller integrating Kubernetes Services with Hetzner dedicated server hardware via the Hetzner Robot API. RobotLB enables bare-metal Hetzner servers to provide LoadBalancer-type Kubernetes Services without requiring Hetzner Cloud. Cozystack bundles RobotLB for operators running clusters on Hetzner Robot dedicated hardware." >}} +{{< /oss-cards >}} + +## Storage and backup + +Cozystack provides replicated block storage via LINSTOR/DRBD, distributed object storage via SeaweedFS, and cluster backup via Velero. + +{{< oss-cards >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="High-performance replicated block storage built on DRBD (Distributed Replicated Block Device), the Linux kernel's native storage replication subsystem. LINSTOR acts as the management layer providing Kubernetes-integrated provisioning of persistent volumes with synchronous replication across cluster nodes. Used by Cozystack for VM disks and database persistent storage." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="A distributed object storage system designed for storing billions of files with O(1) disk read performance. SeaweedFS backs the Cozystack managed Bucket service, providing S3-compatible object storage for tenant workloads. It is optimized for high-throughput read/write operations without relying on a clustered filesystem, making it suitable for CDN and media storage." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="A backup and disaster recovery solution for Kubernetes clusters and persistent volumes. Velero enables Cozystack operators to schedule automated backups of cluster state and application data, then restore to the same or a different cluster. It supports S3-compatible object storage backends for reliable, off-cluster backup retention and point-in-time recovery." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="The Kubernetes CSI NFS driver enabling pods to mount NFS shares as persistent volumes without kernel NFS client dependencies. CSI Driver NFS supports dynamic provisioning of NFS-backed PersistentVolumeClaims and ReadWriteMany access mode required for multi-pod shared storage. Cozystack uses it for shared filesystem scenarios across cluster workloads." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle in Kubernetes, providing a consistent API for creating and restoring point-in-time storage snapshots. The external-snapshotter includes the controller and VolumeSnapshot CRDs required for snapshot operations across all CSI drivers. Cozystack uses it to enable snapshot-based backup and clone workflows for persistent volumes." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="The Kubernetes SIG Storage standard controller for managing object storage buckets as Kubernetes resources. COSI provides a vendor-neutral API for provisioning S3-compatible buckets and granting access credentials to workloads. Cozystack's managed Bucket service uses COSI to provision SeaweedFS buckets through a consistent Kubernetes-native interface." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="A lightweight web-based management interface for S3-compatible object storage, bundled with the Cozystack managed Bucket service. S3 Manager provides bucket browsing, file upload and download, and basic access management via an intuitive UI without requiring AWS CLI or complex tooling. It is deployed alongside SeaweedFS to simplify object storage operations." >}} +{{< /oss-cards >}} + +## GitOps and platform automation + +Flux is the GitOps engine for all Cozystack components. Supporting tools handle certificates, secret distribution, and configuration-change propagation. + +{{< oss-cards >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="The GitOps engine and primary lifecycle management tool for all Cozystack platform components. Flux continuously reconciles the desired cluster state declared in Helm releases and Kustomization objects. The ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0. Cozystack uses Flux for day-two operations automation." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes created by Kamaji in Cozystack. The Ænix etcd Operator provisions and operates reliable, replicated key-value storage required by each tenant's kube-apiserver. It handles etcd member addition, removal, and backup-restore operations as Kubernetes-native reconciliation loops." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation for all platform services and tenant workloads in Cozystack. cert-manager integrates with ACME-compatible CAs (Let's Encrypt), internal PKI (OpenBao), and self-signed issuers. It watches Kubernetes Ingress and Gateway resources to automatically provision and inject TLS certificates without manual intervention." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Synchronizes secrets from external key management systems — AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, OpenBao — into Kubernetes Secrets. External Secrets Operator watches ExternalSecret CRs and automatically creates and updates Kubernetes Secrets from the configured backend. It enables GitOps-friendly secret management without storing sensitive values in Git." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across multiple namespaces, keeping copies in sync whenever the source secret is updated or rotated. The ClusterSecret Operator is used in Cozystack to propagate platform-level secrets (TLS certificates, credentials) to tenant namespaces without manual copy operations. It reduces operational overhead for multi-tenant secret distribution." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Watches for changes to ConfigMaps and Secrets and automatically triggers rolling restarts of the affected Deployments, StatefulSets, or DaemonSets. Reloader eliminates the need for manual pod restarts when configuration or secret values are updated. It is deployed across the Cozystack platform to ensure components pick up configuration changes without operator intervention." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="An iPXE boot and DHCP server providing bare-metal node provisioning capabilities for Cozystack clusters. Smee handles DHCP lease allocation and serves iPXE boot scripts to network-booting servers, enabling automated OS installation and Talos Linux deployment on physical hardware. It is part of the Tinkerbell bare-metal provisioning ecosystem." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="A developer tool that creates a transparent two-way network proxy between a local development machine and a remote Kubernetes cluster. Telepresence intercepts traffic to a specific deployment and routes it to the local machine, enabling developers to run and debug services locally while accessing remote cluster services. Cozystack deploys the Traffic Manager component." >}} +{{< /oss-cards >}} + +## Observability + +The observability stack is built on VictoriaMetrics for metrics, Grafana for dashboards, and Fluent Bit for log forwarding. Goldpinger provides network connectivity checks. + +{{< oss-cards >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="A Prometheus-compatible, high-performance metrics storage and query engine deployed across the Cozystack platform. VictoriaMetrics consumes significantly less memory and disk space than Prometheus while providing better query performance at scale. It collects metrics from all platform components and exposes a PromQL-compatible API for Grafana dashboards and alerting rules." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes resources within Cozystack's observability stack. The Grafana Operator enables declarative, GitOps-friendly management of the entire Grafana configuration through CRDs. It provides platform operators and tenants with a unified interface for viewing metrics, logs, and infrastructure alerts." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="A lightweight log forwarder deployed as a DaemonSet on every Cozystack node, collecting and shipping logs from all platform components and tenant workloads. Fluent Bit uses minimal CPU and memory resources, making it suitable for high-throughput log collection. It supports flexible output routing to VictoriaLogs or any OpenTelemetry-compatible log storage backend." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Listens to the Kubernetes API and generates metrics about the state of Kubernetes objects: deployments, pods, nodes, PersistentVolumeClaims, and more. kube-state-metrics exposes this data in Prometheus format, enabling Cozystack's VictoriaMetrics stack to track cluster health and resource usage over time for dashboards and alerting." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exposes detailed system and hardware metrics from each Kubernetes node in Cozystack, including CPU usage, memory pressure, disk I/O, and network statistics. node-exporter runs as a DaemonSet and feeds host-level telemetry into VictoriaMetrics. It is the standard tool for bare-metal and VM node observability in Prometheus-compatible stacks." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="Custom Resource Definitions for Prometheus-style monitoring resources (ServiceMonitor, PodMonitor, PrometheusRule, AlertmanagerConfig) consumed by VictoriaMetrics in Cozystack. These CRDs provide a standard, vendor-neutral interface for declaring monitoring targets and alerting rules, independent of whether Prometheus or VictoriaMetrics is the underlying engine." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for Kubernetes, feeding CPU and memory usage data to the Horizontal Pod Autoscaler and the kubectl top command. Metrics Server aggregates kubelet-reported resource usage and exposes it as an API extension. Cozystack deploys Metrics Server as a prerequisite for HPA and VPA functionality across platform and tenant clusters." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="A pod-to-pod network connectivity checker developed by Bloomberg and deployed as a DaemonSet across all Cozystack nodes. Goldpinger continuously pings every other Goldpinger instance in the cluster and exposes connectivity metrics and a real-time visualization UI. It enables rapid detection of node-to-node network partitions and CNI routing failures." >}} +{{< /oss-cards >}} + +## Autoscaling and resource management + +{{< oss-cards >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically adjusts CPU and memory resource requests and limits for running pods based on observed usage patterns. VPA eliminates the need for manual resource tuning, right-sizing pods to match their actual workload requirements. Cozystack deploys VPA to optimize resource utilization across platform components and tenant application workloads (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Dynamically scales node pools up or down in response to pending pod scheduling failures or underutilized nodes. The Cluster Autoscaler integrates with cloud provider APIs to provision or terminate worker node VMs, maintaining the optimal cluster size for current workload demand. Cozystack uses it to enable cost-efficient elastic scaling of tenant Kubernetes clusters." >}} +{{< /oss-cards >}} + +## GPU and accelerators + +{{< oss-cards >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Automates the complete lifecycle of NVIDIA GPU drivers, container runtimes, device plugins, and monitoring components on Kubernetes nodes. The GPU Operator eliminates manual driver installation and maintenance on GPU-equipped Cozystack nodes. It enables GPU-accelerated workloads including AI/ML training, LLM inference, and scientific computing without per-node manual setup." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="A CNCF Sandbox project that enables GPU sharing and fractional GPU scheduling on Kubernetes, allowing multiple workloads to share a single physical GPU. HAMi intercepts CUDA API calls to enforce resource limits and isolation between co-hosted GPU workloads. Cozystack uses HAMi to maximize GPU utilization for LLM inference and AI development platforms." >}} +{{< /oss-cards >}} + +## Identity, registry, and secrets + +{{< oss-cards >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="An enterprise-grade OIDC and SAML identity provider deployed via the KubeRocketCI Keycloak Operator in Cozystack. Keycloak provides single sign-on for the platform API, Grafana dashboards, Harbor registry, and tenant services. It supports role-based access control, external identity provider federation, and token-based API authentication for the entire platform." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="A CNCF-graduated OCI-compliant container registry deployed in Cozystack for hosting container images and Helm charts. Harbor provides role-based access control, image vulnerability scanning, content trust signing, and replication across registries. Platform operators and tenants can use Harbor as a private registry for custom application images and chart repositories." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="An open-source, community-driven fork of HashiCorp Vault under MPL-2.0, deployed via the official OpenBao Helm chart in Cozystack. OpenBao provides dynamic secrets generation, PKI certificate management, and encrypted secret storage for Kubernetes workloads. It supports multiple authentication backends including Kubernetes service account tokens and OIDC." >}} +{{< /oss-cards >}} + +## Managed database runtimes + +Cozystack ships one-click managed databases for the most common relational, document, columnar, search, vector, and in-memory use cases. + +{{< oss-cards >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="A powerful, open-source relational database managed via the CloudNativePG operator in Cozystack. Cozystack provisions self-healing replicated PostgreSQL clusters with automated failover, backup scheduling via Barman, and connection pooling. Ideal for transactional workloads, web application backends, and any application requiring ACID-compliant relational storage." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="A MySQL-compatible relational database managed via mariadb-operator in Cozystack, providing fully replicated cluster deployments. Supports Galera multi-primary replication, automated user and permission management, and Restic-based backup scheduling. A drop-in replacement for MySQL workloads requiring high availability and familiar SQL semantics." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="A document-oriented NoSQL database deployed as a sharded or replica-set cluster via the Percona Operator for MongoDB in Cozystack. Supports flexible JSON-like BSON document storage, horizontal sharding for multi-terabyte datasets, and automated backup via Percona Backup for MongoDB. Suitable for high-throughput document storage and aggregation workloads." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="A column-oriented SQL database management system optimized for real-time analytical queries on large datasets. Cozystack deploys ClickHouse via the Altinity ClickHouse Operator, providing distributed multi-shard clusters with data replication. Ideal for OLAP workloads such as event analytics, time-series data processing, and ad-tech pipelines." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="An Apache 2.0-licensed search and analytics engine managed via opensearch-k8s-operator in Cozystack. OpenSearch provides full-text search, log aggregation, security analytics, and observability features. It serves as a scalable alternative to Elasticsearch for applications requiring advanced query DSL, index management, and dashboarding via OpenSearch Dashboards." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="A high-performance vector database designed for similarity search and machine learning workloads, deployed via the official Qdrant Helm chart in Cozystack. Qdrant enables approximate nearest-neighbor search over dense and sparse vector embeddings, making it a natural fit for AI applications, recommendation engines, and semantic search pipelines." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="A distributed, multi-model database with strong ACID guarantees across the entire cluster, managed via the FoundationDB Kubernetes Operator in Cozystack. FoundationDB is designed for extreme reliability and scalability, powering the storage backend for Apple iCloud. It provides the core transactional layer for applications requiring strict consistency at scale." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="An in-memory key-value store managed via the Spotahome Redis Operator in Cozystack, deployed as a replicated Sentinel cluster for automatic failover. Cozystack supports Redis 7.4 and Redis 8, covering the licensing transition from RSALv2/SSPL to AGPL. Common use cases include session storage, distributed caching, pub/sub messaging, and rate limiting." >}} +{{< /oss-cards >}} + +## Managed messaging and caching runtimes + +{{< oss-cards >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="A distributed event streaming platform managed via the Strimzi Kafka Operator in Cozystack, enabling high-throughput, fault-tolerant message queues. Kafka decouples producers and consumers, supporting event-driven architectures, stream processing, and durable log storage. Cozystack provides multi-broker Kafka clusters with configurable replication and retention policies." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="A lightweight, high-performance messaging system deployed via the official NATS Helm chart in Cozystack. NATS supports publish-subscribe, request-reply, and queue-based messaging patterns with low latency and minimal resource overhead. It is well-suited for microservices communication, IoT messaging, and cloud-native applications requiring simple, fast message passing." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="A widely-used message broker managed via the official RabbitMQ Cluster Operator in Cozystack, providing AMQP-based messaging with configurable routing, acknowledgments, and dead-letter exchanges. RabbitMQ supports complex messaging topologies with fanout, direct, and topic-based exchanges. Cozystack deploys it as a highly available cluster with quorum queues." >}} +{{< /oss-cards >}} + +## Managed networking services + +{{< oss-cards >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the Cozystack managed HTTP Cache service, providing reverse-proxy caching to shield origin servers from traffic spikes. The HTTP Cache service integrates Nginx's efficient caching engine with GeoIP filtering via IP2Location modules. It supports horizontal scaling without a shared filesystem and is suitable for CDN-like caching architectures and high-traffic origins." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="An enterprise-grade TCP and HTTP load balancer powering both the managed TCP Balancer service and HTTP Cache appliance in Cozystack. HAProxy provides active health checking, session persistence, and high-throughput connection handling. It is used for production traffic distribution in environments requiring deterministic, low-latency TCP load balancing." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP database modules (IP2Location and IP2Proxy) bundled into the Cozystack HTTP Cache service for IP-based geolocation and proxy detection. These Nginx modules enable country-based traffic filtering, geo-targeted content routing, and proxy/VPN detection in the managed HTTP Cache appliance." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="The VPN service backend powering Cozystack's managed VPN offering, based on the Shadowsocks protocol developed by the Jigsaw team at Google. Outline Server manages Shadowsocks instances on demand, providing fast access keys and an API for user management. The Shadowsocks protocol uses symmetric encryption to resist Deep Packet Inspection and traffic blocking." >}} +{{< /oss-cards >}} From 67efb2ca9d95cdde4980ec5b4d24884e9c120dae Mon Sep 17 00:00:00 2001 From: tym83 <6355522@gmail.com> Date: Mon, 11 May 2026 15:46:55 +0500 Subject: [PATCH 9/9] docs(platform-stack): shorten component descriptions by half Co-Authored-By: Claude Signed-off-by: tym83 <6355522@gmail.com> --- .../docs/next/guides/platform-stack/_index.md | 136 ++++++++---------- .../docs/v1.3/guides/platform-stack/_index.md | 136 ++++++++---------- 2 files changed, 122 insertions(+), 150 deletions(-) diff --git a/content/en/docs/next/guides/platform-stack/_index.md b/content/en/docs/next/guides/platform-stack/_index.md index fab4b5de..1323c063 100644 --- a/content/en/docs/next/guides/platform-stack/_index.md +++ b/content/en/docs/next/guides/platform-stack/_index.md @@ -12,139 +12,125 @@ This page describes each component, its role in the platform, and its upstream l ![Cozystack Architecture Layers](cozystack-layers.png) -Components are organized by their role in the platform stack, from the lowest-level OS and Kubernetes runtime up through platform automation and managed application runtimes. +Components are organized by their role in the platform stack. Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. ## Operating system and Kubernetes runtime -The foundation layer provides a secure, immutable operating system and the Kubernetes control loop on top of which all other components run. - {{< oss-cards >}} -{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="A purpose-built, immutable Linux distribution designed exclusively for running Kubernetes. Talos eliminates the traditional OS attack surface by removing shell access, SSH, and mutable filesystem layers. Cozystack uses Talos to provide consistent, secure, and self-healing Kubernetes nodes with minimal operational overhead." >}} -{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="The industry-standard container orchestration platform that manages all Cozystack workloads. Kubernetes provides a unified, declarative API for deploying and scaling services. Both the management cluster and tenant clusters run on Kubernetes, enabling operators and users to interact with the platform through a familiar YAML-based interface." >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes. Removes shell, SSH, and mutable filesystem layers to minimize the attack surface." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration platform managing all Cozystack workloads. Both the management cluster and tenant clusters run on Kubernetes." >}} {{< /oss-cards >}} ## Cluster provisioning and virtualization -These components enable declarative provisioning of tenant Kubernetes clusters and virtual machines as native Kubernetes workloads. - {{< oss-cards >}} -{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys and manages tenant Kubernetes control planes as pods within the Cozystack management cluster, enabling efficient multi-tenancy. Each tenant receives a dedicated control plane (API server, controller-manager, scheduler) without requiring dedicated VMs for control-plane nodes. Kamaji follows the design patterns of modern managed Kubernetes cloud offerings." >}} -{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="The Kubernetes SIG-maintained standard for declarative cluster lifecycle management. Cozystack uses CAPI with Kamaji and KubeVirt providers to provision tenant Kubernetes clusters: Kamaji manages the control plane while KubeVirt provisions worker node VMs. Cluster API enables consistent, reproducible cluster creation and upgrade workflows." >}} -{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Extends Kubernetes with virtual machine management capabilities, enabling VMs to run alongside containerized workloads on the same cluster. KubeVirt underpins Cozystack's Virtual Machine service and bare-metal worker node provisioning for tenant Kubernetes clusters. It supports CDI (Containerized Data Importer) for disk image management and live migration." >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys tenant Kubernetes control planes as pods in the management cluster. Enables multi-tenancy without dedicated control-plane VMs." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative cluster lifecycle management via Kamaji and KubeVirt providers. Enables consistent, reproducible tenant cluster provisioning and upgrades." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machine management as native Kubernetes workloads. Powers Cozystack's VM service and tenant cluster worker nodes via CDI disk management." >}} {{< /oss-cards >}} ## Networking -Cozystack uses a layered networking stack: Kube-OVN for VPC isolation and floating IPs, Cilium for eBPF-based pod networking, and additional components for DNS, load balancing, and ingress. - {{< oss-cards >}} -{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="An eBPF-based Container Network Interface (CNI) providing advanced pod networking and NetworkPolicy enforcement in Cozystack. Cilium leverages the Linux kernel's eBPF technology for high-throughput, low-latency packet processing without kernel module dependencies. It works alongside Kube-OVN to deliver efficient pod-to-pod and pod-to-external traffic routing." >}} -{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking fabric providing VPC isolation, floating IP addresses, and tenant network segmentation in Cozystack. Built on Open vSwitch technology, Kube-OVN enables each tenant to have a fully isolated virtual network environment. It supports static IP allocation, subnet management, and seamless integration with KubeVirt VM networking." >}} -{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="A meta-CNI plugin enabling Kubernetes pods to attach multiple network interfaces simultaneously. Cozystack uses Multus to connect KubeVirt VMs to both the cluster overlay network and secondary physical or VLAN-backed interfaces. This enables advanced networking scenarios such as SR-IOV and bridged networking for virtual machine workloads." >}} -{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="A bare-metal load balancer implementation for Kubernetes Services of type LoadBalancer. MetalLB assigns external IP addresses to services using ARP/NDP (layer 2 mode) or BGP (layer 3 mode), making services accessible from outside the cluster. Cozystack uses MetalLB as the default load balancer for all platform and tenant services requiring external access." >}} -{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="The Kubernetes-community NGINX-based ingress controller managing HTTP and HTTPS routing for platform and tenant services in Cozystack. ingress-nginx terminates TLS, routes traffic based on hostname and path rules, and supports WebSocket, gRPC, and HTTP/2 protocols. It is deployed as the default ingress controller for Cozystack's management and tenant clusters." >}} -{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="The standard Kubernetes Gateway API Custom Resource Definitions providing a role-oriented, extensible model for configuring L4/L7 network routing. Gateway API supersedes the Ingress resource with richer expressiveness and multi-tenancy support. Cozystack installs the Gateway API CRDs to enable modern traffic management integrations with compatible gateway controllers." >}} -{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="The default DNS server for Kubernetes clusters in Cozystack, handling service discovery and internal name resolution for all pod-to-service DNS lookups. CoreDNS is extensible via a plugin architecture, supporting custom zone files, conditional forwarding, and health checking. It resolves cluster-internal service names in the cluster.local domain." >}} -{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Synchronizes Kubernetes Service and Ingress resources to external DNS providers automatically. ExternalDNS watches for changes to DNS-annotated Kubernetes resources and creates, updates, or deletes corresponding DNS records in the configured provider. Cozystack uses ExternalDNS to automate DNS registration for platform services and tenant ingress endpoints." >}} -{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="A WireGuard-based mesh networking solution for Kubernetes clusters distributed across multiple geographic locations or network segments. Kilo creates encrypted tunnels between nodes in different network zones, enabling seamless pod-to-pod communication across cloud providers, data centers, and edge locations. Cozystack uses Kilo for multi-site cluster topologies." >}} -{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="A load balancer controller integrating Kubernetes Services with Hetzner dedicated server hardware via the Hetzner Robot API. RobotLB enables bare-metal Hetzner servers to provide LoadBalancer-type Kubernetes Services without requiring Hetzner Cloud. Cozystack bundles RobotLB for operators running clusters on Hetzner Robot dedicated hardware." >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy enforcement. Works alongside Kube-OVN for high-throughput, low-latency packet processing." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking providing VPC isolation, floating IPs, and tenant network segmentation. Built on Open vSwitch technology." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Meta-CNI enabling pods to attach multiple network interfaces simultaneously. Used to connect KubeVirt VMs to secondary physical or VLAN-backed interfaces." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer assigning external IPs to Kubernetes Services via ARP/NDP or BGP. Default load balancer for all platform and tenant services." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="NGINX-based ingress controller for HTTP/HTTPS routing with TLS termination. Deployed as the default ingress controller across management and tenant clusters." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API CRDs for role-oriented L4/L7 routing. Enables modern traffic management with compatible gateway controllers." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server for service discovery and internal name resolution. Resolves cluster.local service names for all pod-to-service lookups." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Syncs Kubernetes Service and Ingress resources to external DNS providers automatically. Eliminates manual DNS record management for platform and tenant endpoints." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="WireGuard-based mesh networking for clusters spanning multiple geographic locations. Creates encrypted tunnels for seamless cross-site pod-to-pod communication." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer controller for Hetzner dedicated hardware via the Robot API. Enables LoadBalancer-type Services on Hetzner bare-metal without Hetzner Cloud." >}} {{< /oss-cards >}} ## Storage and backup -Cozystack provides replicated block storage via LINSTOR/DRBD, distributed object storage via SeaweedFS, and cluster backup via Velero. - {{< oss-cards >}} -{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="High-performance replicated block storage built on DRBD (Distributed Replicated Block Device), the Linux kernel's native storage replication subsystem. LINSTOR acts as the management layer providing Kubernetes-integrated provisioning of persistent volumes with synchronous replication across cluster nodes. Used by Cozystack for VM disks and database persistent storage." >}} -{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="A distributed object storage system designed for storing billions of files with O(1) disk read performance. SeaweedFS backs the Cozystack managed Bucket service, providing S3-compatible object storage for tenant workloads. It is optimized for high-throughput read/write operations without relying on a clustered filesystem, making it suitable for CDN and media storage." >}} -{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="A backup and disaster recovery solution for Kubernetes clusters and persistent volumes. Velero enables Cozystack operators to schedule automated backups of cluster state and application data, then restore to the same or a different cluster. It supports S3-compatible object storage backends for reliable, off-cluster backup retention and point-in-time recovery." >}} -{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="The Kubernetes CSI NFS driver enabling pods to mount NFS shares as persistent volumes without kernel NFS client dependencies. CSI Driver NFS supports dynamic provisioning of NFS-backed PersistentVolumeClaims and ReadWriteMany access mode required for multi-pod shared storage. Cozystack uses it for shared filesystem scenarios across cluster workloads." >}} -{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle in Kubernetes, providing a consistent API for creating and restoring point-in-time storage snapshots. The external-snapshotter includes the controller and VolumeSnapshot CRDs required for snapshot operations across all CSI drivers. Cozystack uses it to enable snapshot-based backup and clone workflows for persistent volumes." >}} -{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="The Kubernetes SIG Storage standard controller for managing object storage buckets as Kubernetes resources. COSI provides a vendor-neutral API for provisioning S3-compatible buckets and granting access credentials to workloads. Cozystack's managed Bucket service uses COSI to provision SeaweedFS buckets through a consistent Kubernetes-native interface." >}} -{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="A lightweight web-based management interface for S3-compatible object storage, bundled with the Cozystack managed Bucket service. S3 Manager provides bucket browsing, file upload and download, and basic access management via an intuitive UI without requiring AWS CLI or complex tooling. It is deployed alongside SeaweedFS to simplify object storage operations." >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage managed by LINSTOR. Provisions persistent volumes with synchronous replication for VM disks and databases." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage backing the managed Bucket service. S3-compatible with O(1) disk read performance and no clustered filesystem dependency." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Backup and restore for Kubernetes clusters and persistent volumes. Stores backups in S3-compatible object storage for off-cluster retention." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="CSI driver for mounting NFS shares as persistent volumes. Supports ReadWriteMany access mode required for multi-pod shared storage scenarios." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle across all CSI drivers. Provides a consistent API for point-in-time storage snapshots and clone workflows." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="Kubernetes-native API for provisioning S3-compatible object storage buckets. Used to provision SeaweedFS buckets for the managed Bucket service." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Lightweight web UI for S3-compatible object storage. Bundled with the managed Bucket service for bucket browsing and file management." >}} {{< /oss-cards >}} ## GitOps and platform automation -Flux is the GitOps engine for all Cozystack components. Supporting tools handle certificates, secret distribution, and configuration-change propagation. - {{< oss-cards >}} -{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="The GitOps engine and primary lifecycle management tool for all Cozystack platform components. Flux continuously reconciles the desired cluster state declared in Helm releases and Kustomization objects. The ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0. Cozystack uses Flux for day-two operations automation." >}} -{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes created by Kamaji in Cozystack. The Ænix etcd Operator provisions and operates reliable, replicated key-value storage required by each tenant's kube-apiserver. It handles etcd member addition, removal, and backup-restore operations as Kubernetes-native reconciliation loops." >}} -{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation for all platform services and tenant workloads in Cozystack. cert-manager integrates with ACME-compatible CAs (Let's Encrypt), internal PKI (OpenBao), and self-signed issuers. It watches Kubernetes Ingress and Gateway resources to automatically provision and inject TLS certificates without manual intervention." >}} -{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Synchronizes secrets from external key management systems — AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, OpenBao — into Kubernetes Secrets. External Secrets Operator watches ExternalSecret CRs and automatically creates and updates Kubernetes Secrets from the configured backend. It enables GitOps-friendly secret management without storing sensitive values in Git." >}} -{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across multiple namespaces, keeping copies in sync whenever the source secret is updated or rotated. The ClusterSecret Operator is used in Cozystack to propagate platform-level secrets (TLS certificates, credentials) to tenant namespaces without manual copy operations. It reduces operational overhead for multi-tenant secret distribution." >}} -{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Watches for changes to ConfigMaps and Secrets and automatically triggers rolling restarts of the affected Deployments, StatefulSets, or DaemonSets. Reloader eliminates the need for manual pod restarts when configuration or secret values are updated. It is deployed across the Cozystack platform to ensure components pick up configuration changes without operator intervention." >}} -{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="An iPXE boot and DHCP server providing bare-metal node provisioning capabilities for Cozystack clusters. Smee handles DHCP lease allocation and serves iPXE boot scripts to network-booting servers, enabling automated OS installation and Talos Linux deployment on physical hardware. It is part of the Tinkerbell bare-metal provisioning ecosystem." >}} -{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="A developer tool that creates a transparent two-way network proxy between a local development machine and a remote Kubernetes cluster. Telepresence intercepts traffic to a specific deployment and routes it to the local machine, enabling developers to run and debug services locally while accessing remote cluster services. Cozystack deploys the Traffic Manager component." >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine reconciling cluster state from Helm releases and Kustomizations. ControlPlane Flux Operator is AGPL-3.0; upstream controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes. Handles member lifecycle, scaling, and backup-restore as Kubernetes reconciliation loops." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation. Integrates with ACME, internal PKI (OpenBao), and self-signed issuers." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Syncs secrets from external KMS (Vault, OpenBao, AWS, GCP) into Kubernetes Secrets. Enables GitOps secret management without storing values in Git." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across namespaces, keeping copies in sync. Used to propagate platform-level credentials to tenant namespaces." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Triggers rolling restarts when ConfigMaps or Secrets change. Ensures Deployments and StatefulSets pick up configuration updates without manual intervention." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE boot and DHCP server for bare-metal node provisioning. Serves boot scripts enabling automated Talos Linux deployment on physical hardware." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Proxies traffic between a local dev machine and a remote Kubernetes cluster. Enables local debugging while accessing live remote cluster services." >}} {{< /oss-cards >}} ## Observability -The observability stack is built on VictoriaMetrics for metrics, Grafana for dashboards, and Fluent Bit for log forwarding. Goldpinger provides network connectivity checks. - {{< oss-cards >}} -{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="A Prometheus-compatible, high-performance metrics storage and query engine deployed across the Cozystack platform. VictoriaMetrics consumes significantly less memory and disk space than Prometheus while providing better query performance at scale. It collects metrics from all platform components and exposes a PromQL-compatible API for Grafana dashboards and alerting rules." >}} -{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes resources within Cozystack's observability stack. The Grafana Operator enables declarative, GitOps-friendly management of the entire Grafana configuration through CRDs. It provides platform operators and tenants with a unified interface for viewing metrics, logs, and infrastructure alerts." >}} -{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="A lightweight log forwarder deployed as a DaemonSet on every Cozystack node, collecting and shipping logs from all platform components and tenant workloads. Fluent Bit uses minimal CPU and memory resources, making it suitable for high-throughput log collection. It supports flexible output routing to VictoriaLogs or any OpenTelemetry-compatible log storage backend." >}} -{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Listens to the Kubernetes API and generates metrics about the state of Kubernetes objects: deployments, pods, nodes, PersistentVolumeClaims, and more. kube-state-metrics exposes this data in Prometheus format, enabling Cozystack's VictoriaMetrics stack to track cluster health and resource usage over time for dashboards and alerting." >}} -{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exposes detailed system and hardware metrics from each Kubernetes node in Cozystack, including CPU usage, memory pressure, disk I/O, and network statistics. node-exporter runs as a DaemonSet and feeds host-level telemetry into VictoriaMetrics. It is the standard tool for bare-metal and VM node observability in Prometheus-compatible stacks." >}} -{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="Custom Resource Definitions for Prometheus-style monitoring resources (ServiceMonitor, PodMonitor, PrometheusRule, AlertmanagerConfig) consumed by VictoriaMetrics in Cozystack. These CRDs provide a standard, vendor-neutral interface for declaring monitoring targets and alerting rules, independent of whether Prometheus or VictoriaMetrics is the underlying engine." >}} -{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for Kubernetes, feeding CPU and memory usage data to the Horizontal Pod Autoscaler and the kubectl top command. Metrics Server aggregates kubelet-reported resource usage and exposes it as an API extension. Cozystack deploys Metrics Server as a prerequisite for HPA and VPA functionality across platform and tenant clusters." >}} -{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="A pod-to-pod network connectivity checker developed by Bloomberg and deployed as a DaemonSet across all Cozystack nodes. Goldpinger continuously pings every other Goldpinger instance in the cluster and exposes connectivity metrics and a real-time visualization UI. It enables rapid detection of node-to-node network partitions and CNI routing failures." >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Prometheus-compatible metrics storage and query engine. More memory-efficient than Prometheus at scale; exposes a PromQL-compatible API for Grafana." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes CRDs. Provides a unified observability UI for platform operators and tenants." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Lightweight log forwarder running as a DaemonSet on every node. Collects platform and tenant workload logs with minimal CPU and memory overhead." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Generates Prometheus-format metrics about Kubernetes object state (deployments, pods, nodes, PVCs). Feeds cluster health data into VictoriaMetrics." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exports system and hardware metrics (CPU, memory, disk, network) from each node as a DaemonSet. Feeds host telemetry into VictoriaMetrics." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for ServiceMonitor, PodMonitor, and PrometheusRule resources consumed by VictoriaMetrics. Provides a vendor-neutral monitoring target API." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for HPA and kubectl top. Aggregates kubelet-reported CPU and memory usage across cluster nodes." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checker deployed as a DaemonSet. Surfaces node-to-node network partition failures with metrics and a real-time visualization UI." >}} {{< /oss-cards >}} ## Autoscaling and resource management {{< oss-cards >}} -{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically adjusts CPU and memory resource requests and limits for running pods based on observed usage patterns. VPA eliminates the need for manual resource tuning, right-sizing pods to match their actual workload requirements. Cozystack deploys VPA to optimize resource utilization across platform components and tenant application workloads (chart: MIT)." >}} -{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Dynamically scales node pools up or down in response to pending pod scheduling failures or underutilized nodes. The Cluster Autoscaler integrates with cloud provider APIs to provision or terminate worker node VMs, maintaining the optimal cluster size for current workload demand. Cozystack uses it to enable cost-efficient elastic scaling of tenant Kubernetes clusters." >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically right-sizes CPU and memory requests for pods based on observed usage. Eliminates manual resource tuning for platform and tenant workloads (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Scales node pools based on pending pods or underutilized nodes. Enables cost-efficient elastic scaling of tenant Kubernetes clusters." >}} {{< /oss-cards >}} ## GPU and accelerators {{< oss-cards >}} -{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Automates the complete lifecycle of NVIDIA GPU drivers, container runtimes, device plugins, and monitoring components on Kubernetes nodes. The GPU Operator eliminates manual driver installation and maintenance on GPU-equipped Cozystack nodes. It enables GPU-accelerated workloads including AI/ML training, LLM inference, and scientific computing without per-node manual setup." >}} -{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="A CNCF Sandbox project that enables GPU sharing and fractional GPU scheduling on Kubernetes, allowing multiple workloads to share a single physical GPU. HAMi intercepts CUDA API calls to enforce resource limits and isolation between co-hosted GPU workloads. Cozystack uses HAMi to maximize GPU utilization for LLM inference and AI development platforms." >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Manages the full lifecycle of NVIDIA GPU drivers, device plugins, and runtimes on Kubernetes nodes. Enables AI/ML and LLM inference workloads without per-node manual setup." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional scheduling for Kubernetes. Allows multiple workloads to share a single GPU, maximizing utilization for LLM inference platforms." >}} {{< /oss-cards >}} ## Identity, registry, and secrets {{< oss-cards >}} -{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="An enterprise-grade OIDC and SAML identity provider deployed via the KubeRocketCI Keycloak Operator in Cozystack. Keycloak provides single sign-on for the platform API, Grafana dashboards, Harbor registry, and tenant services. It supports role-based access control, external identity provider federation, and token-based API authentication for the entire platform." >}} -{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="A CNCF-graduated OCI-compliant container registry deployed in Cozystack for hosting container images and Helm charts. Harbor provides role-based access control, image vulnerability scanning, content trust signing, and replication across registries. Platform operators and tenants can use Harbor as a private registry for custom application images and chart repositories." >}} -{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="An open-source, community-driven fork of HashiCorp Vault under MPL-2.0, deployed via the official OpenBao Helm chart in Cozystack. OpenBao provides dynamic secrets generation, PKI certificate management, and encrypted secret storage for Kubernetes workloads. It supports multiple authentication backends including Kubernetes service account tokens and OIDC." >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC and SAML identity provider for platform SSO. Secures the platform API, Grafana, Harbor, and tenant services with role-based access control." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="CNCF-graduated OCI registry for container images and Helm charts. Provides RBAC, vulnerability scanning, content trust signing, and registry replication." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Open-source Vault fork for dynamic secrets, PKI management, and encrypted secret storage. Supports Kubernetes and OIDC authentication backends." >}} {{< /oss-cards >}} ## Managed database runtimes -Cozystack ships one-click managed databases for the most common relational, document, columnar, search, vector, and in-memory use cases. - {{< oss-cards >}} -{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="A powerful, open-source relational database managed via the CloudNativePG operator in Cozystack. Cozystack provisions self-healing replicated PostgreSQL clusters with automated failover, backup scheduling via Barman, and connection pooling. Ideal for transactional workloads, web application backends, and any application requiring ACID-compliant relational storage." >}} -{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="A MySQL-compatible relational database managed via mariadb-operator in Cozystack, providing fully replicated cluster deployments. Supports Galera multi-primary replication, automated user and permission management, and Restic-based backup scheduling. A drop-in replacement for MySQL workloads requiring high availability and familiar SQL semantics." >}} -{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="A document-oriented NoSQL database deployed as a sharded or replica-set cluster via the Percona Operator for MongoDB in Cozystack. Supports flexible JSON-like BSON document storage, horizontal sharding for multi-terabyte datasets, and automated backup via Percona Backup for MongoDB. Suitable for high-throughput document storage and aggregation workloads." >}} -{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="A column-oriented SQL database management system optimized for real-time analytical queries on large datasets. Cozystack deploys ClickHouse via the Altinity ClickHouse Operator, providing distributed multi-shard clusters with data replication. Ideal for OLAP workloads such as event analytics, time-series data processing, and ad-tech pipelines." >}} -{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="An Apache 2.0-licensed search and analytics engine managed via opensearch-k8s-operator in Cozystack. OpenSearch provides full-text search, log aggregation, security analytics, and observability features. It serves as a scalable alternative to Elasticsearch for applications requiring advanced query DSL, index management, and dashboarding via OpenSearch Dashboards." >}} -{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="A high-performance vector database designed for similarity search and machine learning workloads, deployed via the official Qdrant Helm chart in Cozystack. Qdrant enables approximate nearest-neighbor search over dense and sparse vector embeddings, making it a natural fit for AI applications, recommendation engines, and semantic search pipelines." >}} -{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="A distributed, multi-model database with strong ACID guarantees across the entire cluster, managed via the FoundationDB Kubernetes Operator in Cozystack. FoundationDB is designed for extreme reliability and scalability, powering the storage backend for Apple iCloud. It provides the core transactional layer for applications requiring strict consistency at scale." >}} -{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="An in-memory key-value store managed via the Spotahome Redis Operator in Cozystack, deployed as a replicated Sentinel cluster for automatic failover. Cozystack supports Redis 7.4 and Redis 8, covering the licensing transition from RSALv2/SSPL to AGPL. Common use cases include session storage, distributed caching, pub/sub messaging, and rate limiting." >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Replicated relational database managed via CloudNativePG. Features automated failover, Barman-based backup scheduling, and connection pooling." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="MySQL-compatible replicated database managed via mariadb-operator. Supports Galera multi-primary replication and Restic-based backup scheduling." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Document-oriented NoSQL database deployed via Percona Operator. Supports replica sets, sharded clusters, and automated Percona backup." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Column-oriented DBMS optimized for real-time analytics. Deployed via Altinity ClickHouse Operator with multi-shard distributed clusters." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Search and analytics engine managed via opensearch-k8s-operator. Full-text search, log aggregation, and Elasticsearch-compatible query API." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="High-performance vector database for similarity search and AI workloads. Supports dense and sparse vector embeddings for recommendation and semantic search." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Distributed database with strong ACID guarantees across the cluster, managed via FoundationDB Kubernetes Operator. Designed for extreme reliability at scale." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="In-memory key-value store deployed as a replicated Sentinel cluster via Spotahome Redis Operator. Supports Redis 7.4 and Redis 8 for caching and pub/sub." >}} {{< /oss-cards >}} ## Managed messaging and caching runtimes {{< oss-cards >}} -{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="A distributed event streaming platform managed via the Strimzi Kafka Operator in Cozystack, enabling high-throughput, fault-tolerant message queues. Kafka decouples producers and consumers, supporting event-driven architectures, stream processing, and durable log storage. Cozystack provides multi-broker Kafka clusters with configurable replication and retention policies." >}} -{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="A lightweight, high-performance messaging system deployed via the official NATS Helm chart in Cozystack. NATS supports publish-subscribe, request-reply, and queue-based messaging patterns with low latency and minimal resource overhead. It is well-suited for microservices communication, IoT messaging, and cloud-native applications requiring simple, fast message passing." >}} -{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="A widely-used message broker managed via the official RabbitMQ Cluster Operator in Cozystack, providing AMQP-based messaging with configurable routing, acknowledgments, and dead-letter exchanges. RabbitMQ supports complex messaging topologies with fanout, direct, and topic-based exchanges. Cozystack deploys it as a highly available cluster with quorum queues." >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Distributed event streaming platform managed via Strimzi Kafka Operator. Multi-broker clusters with configurable replication for event-driven architectures." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight pub-sub and request-reply messaging deployed via the official Helm chart. Low-latency, minimal-overhead messaging for microservices and IoT." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="AMQP message broker managed via RabbitMQ Cluster Operator. Highly available clusters with quorum queues and fanout, topic, and direct exchange routing." >}} {{< /oss-cards >}} ## Managed networking services {{< oss-cards >}} -{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the Cozystack managed HTTP Cache service, providing reverse-proxy caching to shield origin servers from traffic spikes. The HTTP Cache service integrates Nginx's efficient caching engine with GeoIP filtering via IP2Location modules. It supports horizontal scaling without a shared filesystem and is suitable for CDN-like caching architectures and high-traffic origins." >}} -{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="An enterprise-grade TCP and HTTP load balancer powering both the managed TCP Balancer service and HTTP Cache appliance in Cozystack. HAProxy provides active health checking, session persistence, and high-throughput connection handling. It is used for production traffic distribution in environments requiring deterministic, low-latency TCP load balancing." >}} -{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP database modules (IP2Location and IP2Proxy) bundled into the Cozystack HTTP Cache service for IP-based geolocation and proxy detection. These Nginx modules enable country-based traffic filtering, geo-targeted content routing, and proxy/VPN detection in the managed HTTP Cache appliance." >}} -{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="The VPN service backend powering Cozystack's managed VPN offering, based on the Shadowsocks protocol developed by the Jigsaw team at Google. Outline Server manages Shadowsocks instances on demand, providing fast access keys and an API for user management. The Shadowsocks protocol uses symmetric encryption to resist Deep Packet Inspection and traffic blocking." >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the managed HTTP Cache service with reverse-proxy caching and GeoIP filtering. Scales horizontally without a shared filesystem." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Enterprise TCP/HTTP load balancer powering the managed TCP Balancer and HTTP Cache. Provides active health checks and high-throughput connection handling." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules (IP2Location and IP2Proxy) bundled into the HTTP Cache. Enables country-based traffic filtering and proxy/VPN detection." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Shadowsocks-based VPN backend developed by Google's Jigsaw team. Manages Shadowsocks instances with symmetric encryption to resist DPI traffic analysis." >}} {{< /oss-cards >}} diff --git a/content/en/docs/v1.3/guides/platform-stack/_index.md b/content/en/docs/v1.3/guides/platform-stack/_index.md index fab4b5de..1323c063 100644 --- a/content/en/docs/v1.3/guides/platform-stack/_index.md +++ b/content/en/docs/v1.3/guides/platform-stack/_index.md @@ -12,139 +12,125 @@ This page describes each component, its role in the platform, and its upstream l ![Cozystack Architecture Layers](cozystack-layers.png) -Components are organized by their role in the platform stack, from the lowest-level OS and Kubernetes runtime up through platform automation and managed application runtimes. +Components are organized by their role in the platform stack. Cozystack-maintained charts, CRDs, controllers, and application APIs are licensed under **Apache-2.0** and are not listed individually below. ## Operating system and Kubernetes runtime -The foundation layer provides a secure, immutable operating system and the Kubernetes control loop on top of which all other components run. - {{< oss-cards >}} -{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="A purpose-built, immutable Linux distribution designed exclusively for running Kubernetes. Talos eliminates the traditional OS attack surface by removing shell access, SSH, and mutable filesystem layers. Cozystack uses Talos to provide consistent, secure, and self-healing Kubernetes nodes with minimal operational overhead." >}} -{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="The industry-standard container orchestration platform that manages all Cozystack workloads. Kubernetes provides a unified, declarative API for deploying and scaling services. Both the management cluster and tenant clusters run on Kubernetes, enabling operators and users to interact with the platform through a familiar YAML-based interface." >}} +{{< oss-card name="Talos Linux" logo="talos" license="MPL-2.0" source="https://github.com/siderolabs/talos/blob/main/LICENSE" description="Immutable Linux distribution built for Kubernetes nodes. Removes shell, SSH, and mutable filesystem layers to minimize the attack surface." >}} +{{< oss-card name="Kubernetes" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kubernetes/blob/master/LICENSE" description="Container orchestration platform managing all Cozystack workloads. Both the management cluster and tenant clusters run on Kubernetes." >}} {{< /oss-cards >}} ## Cluster provisioning and virtualization -These components enable declarative provisioning of tenant Kubernetes clusters and virtual machines as native Kubernetes workloads. - {{< oss-cards >}} -{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys and manages tenant Kubernetes control planes as pods within the Cozystack management cluster, enabling efficient multi-tenancy. Each tenant receives a dedicated control plane (API server, controller-manager, scheduler) without requiring dedicated VMs for control-plane nodes. Kamaji follows the design patterns of modern managed Kubernetes cloud offerings." >}} -{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="The Kubernetes SIG-maintained standard for declarative cluster lifecycle management. Cozystack uses CAPI with Kamaji and KubeVirt providers to provision tenant Kubernetes clusters: Kamaji manages the control plane while KubeVirt provisions worker node VMs. Cluster API enables consistent, reproducible cluster creation and upgrade workflows." >}} -{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Extends Kubernetes with virtual machine management capabilities, enabling VMs to run alongside containerized workloads on the same cluster. KubeVirt underpins Cozystack's Virtual Machine service and bare-metal worker node provisioning for tenant Kubernetes clusters. It supports CDI (Containerized Data Importer) for disk image management and live migration." >}} +{{< oss-card name="Kamaji" logo="kamaji" license="Apache-2.0" source="https://github.com/clastix/kamaji/blob/master/LICENSE" description="Deploys tenant Kubernetes control planes as pods in the management cluster. Enables multi-tenancy without dedicated control-plane VMs." >}} +{{< oss-card name="Cluster API" logo="clusterapi" license="Apache-2.0" source="https://github.com/kubernetes-sigs/cluster-api/blob/main/LICENSE" description="Declarative cluster lifecycle management via Kamaji and KubeVirt providers. Enables consistent, reproducible tenant cluster provisioning and upgrades." >}} +{{< oss-card name="KubeVirt" logo="kubevirt" license="Apache-2.0" source="https://github.com/kubevirt/kubevirt/blob/main/LICENSE" description="Virtual machine management as native Kubernetes workloads. Powers Cozystack's VM service and tenant cluster worker nodes via CDI disk management." >}} {{< /oss-cards >}} ## Networking -Cozystack uses a layered networking stack: Kube-OVN for VPC isolation and floating IPs, Cilium for eBPF-based pod networking, and additional components for DNS, load balancing, and ingress. - {{< oss-cards >}} -{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="An eBPF-based Container Network Interface (CNI) providing advanced pod networking and NetworkPolicy enforcement in Cozystack. Cilium leverages the Linux kernel's eBPF technology for high-throughput, low-latency packet processing without kernel module dependencies. It works alongside Kube-OVN to deliver efficient pod-to-pod and pod-to-external traffic routing." >}} -{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking fabric providing VPC isolation, floating IP addresses, and tenant network segmentation in Cozystack. Built on Open vSwitch technology, Kube-OVN enables each tenant to have a fully isolated virtual network environment. It supports static IP allocation, subnet management, and seamless integration with KubeVirt VM networking." >}} -{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="A meta-CNI plugin enabling Kubernetes pods to attach multiple network interfaces simultaneously. Cozystack uses Multus to connect KubeVirt VMs to both the cluster overlay network and secondary physical or VLAN-backed interfaces. This enables advanced networking scenarios such as SR-IOV and bridged networking for virtual machine workloads." >}} -{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="A bare-metal load balancer implementation for Kubernetes Services of type LoadBalancer. MetalLB assigns external IP addresses to services using ARP/NDP (layer 2 mode) or BGP (layer 3 mode), making services accessible from outside the cluster. Cozystack uses MetalLB as the default load balancer for all platform and tenant services requiring external access." >}} -{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="The Kubernetes-community NGINX-based ingress controller managing HTTP and HTTPS routing for platform and tenant services in Cozystack. ingress-nginx terminates TLS, routes traffic based on hostname and path rules, and supports WebSocket, gRPC, and HTTP/2 protocols. It is deployed as the default ingress controller for Cozystack's management and tenant clusters." >}} -{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="The standard Kubernetes Gateway API Custom Resource Definitions providing a role-oriented, extensible model for configuring L4/L7 network routing. Gateway API supersedes the Ingress resource with richer expressiveness and multi-tenancy support. Cozystack installs the Gateway API CRDs to enable modern traffic management integrations with compatible gateway controllers." >}} -{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="The default DNS server for Kubernetes clusters in Cozystack, handling service discovery and internal name resolution for all pod-to-service DNS lookups. CoreDNS is extensible via a plugin architecture, supporting custom zone files, conditional forwarding, and health checking. It resolves cluster-internal service names in the cluster.local domain." >}} -{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Synchronizes Kubernetes Service and Ingress resources to external DNS providers automatically. ExternalDNS watches for changes to DNS-annotated Kubernetes resources and creates, updates, or deletes corresponding DNS records in the configured provider. Cozystack uses ExternalDNS to automate DNS registration for platform services and tenant ingress endpoints." >}} -{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="A WireGuard-based mesh networking solution for Kubernetes clusters distributed across multiple geographic locations or network segments. Kilo creates encrypted tunnels between nodes in different network zones, enabling seamless pod-to-pod communication across cloud providers, data centers, and edge locations. Cozystack uses Kilo for multi-site cluster topologies." >}} -{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="A load balancer controller integrating Kubernetes Services with Hetzner dedicated server hardware via the Hetzner Robot API. RobotLB enables bare-metal Hetzner servers to provide LoadBalancer-type Kubernetes Services without requiring Hetzner Cloud. Cozystack bundles RobotLB for operators running clusters on Hetzner Robot dedicated hardware." >}} +{{< oss-card name="Cilium" logo="cilium" license="Apache-2.0" source="https://github.com/cilium/cilium/blob/main/LICENSE" description="eBPF-based CNI for pod networking and NetworkPolicy enforcement. Works alongside Kube-OVN for high-throughput, low-latency packet processing." >}} +{{< oss-card name="Kube-OVN" logo="kubeovn" license="Apache-2.0" source="https://github.com/cozystack/kubeovn-chart/blob/main/LICENSE" description="OVN-based virtual networking providing VPC isolation, floating IPs, and tenant network segmentation. Built on Open vSwitch technology." >}} +{{< oss-card name="Multus CNI" logo="multus" license="Apache-2.0" source="https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/LICENSE" description="Meta-CNI enabling pods to attach multiple network interfaces simultaneously. Used to connect KubeVirt VMs to secondary physical or VLAN-backed interfaces." >}} +{{< oss-card name="MetalLB" logo="metallb" license="Apache-2.0" source="https://github.com/metallb/metallb/blob/main/LICENSE" description="Bare-metal load balancer assigning external IPs to Kubernetes Services via ARP/NDP or BGP. Default load balancer for all platform and tenant services." >}} +{{< oss-card name="ingress-nginx" logo="nginx" license="Apache-2.0" source="https://github.com/kubernetes/ingress-nginx/blob/main/LICENSE" description="NGINX-based ingress controller for HTTP/HTTPS routing with TLS termination. Deployed as the default ingress controller across management and tenant clusters." >}} +{{< oss-card name="Gateway API CRDs" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/gateway-api/blob/main/LICENSE" description="Standard Kubernetes Gateway API CRDs for role-oriented L4/L7 routing. Enables modern traffic management with compatible gateway controllers." >}} +{{< oss-card name="CoreDNS" logo="coredns" license="Apache-2.0" source="https://github.com/coredns/coredns/blob/master/LICENSE" description="Cluster DNS server for service discovery and internal name resolution. Resolves cluster.local service names for all pod-to-service lookups." >}} +{{< oss-card name="ExternalDNS" logo="externaldns" license="Apache-2.0" source="https://github.com/kubernetes-sigs/external-dns/blob/master/LICENSE.md" description="Syncs Kubernetes Service and Ingress resources to external DNS providers automatically. Eliminates manual DNS record management for platform and tenant endpoints." >}} +{{< oss-card name="Kilo" logo="kilo" license="Apache-2.0" source="https://github.com/squat/kilo/blob/main/LICENSE" description="WireGuard-based mesh networking for clusters spanning multiple geographic locations. Creates encrypted tunnels for seamless cross-site pod-to-pod communication." >}} +{{< oss-card name="Hetzner RobotLB" logo="hetzner" license="MIT" source="https://github.com/Intreecom/robotlb/blob/master/LICENSE" description="Load balancer controller for Hetzner dedicated hardware via the Robot API. Enables LoadBalancer-type Services on Hetzner bare-metal without Hetzner Cloud." >}} {{< /oss-cards >}} ## Storage and backup -Cozystack provides replicated block storage via LINSTOR/DRBD, distributed object storage via SeaweedFS, and cluster backup via Velero. - {{< oss-cards >}} -{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="High-performance replicated block storage built on DRBD (Distributed Replicated Block Device), the Linux kernel's native storage replication subsystem. LINSTOR acts as the management layer providing Kubernetes-integrated provisioning of persistent volumes with synchronous replication across cluster nodes. Used by Cozystack for VM disks and database persistent storage." >}} -{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="A distributed object storage system designed for storing billions of files with O(1) disk read performance. SeaweedFS backs the Cozystack managed Bucket service, providing S3-compatible object storage for tenant workloads. It is optimized for high-throughput read/write operations without relying on a clustered filesystem, making it suitable for CDN and media storage." >}} -{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="A backup and disaster recovery solution for Kubernetes clusters and persistent volumes. Velero enables Cozystack operators to schedule automated backups of cluster state and application data, then restore to the same or a different cluster. It supports S3-compatible object storage backends for reliable, off-cluster backup retention and point-in-time recovery." >}} -{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="The Kubernetes CSI NFS driver enabling pods to mount NFS shares as persistent volumes without kernel NFS client dependencies. CSI Driver NFS supports dynamic provisioning of NFS-backed PersistentVolumeClaims and ReadWriteMany access mode required for multi-pod shared storage. Cozystack uses it for shared filesystem scenarios across cluster workloads." >}} -{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle in Kubernetes, providing a consistent API for creating and restoring point-in-time storage snapshots. The external-snapshotter includes the controller and VolumeSnapshot CRDs required for snapshot operations across all CSI drivers. Cozystack uses it to enable snapshot-based backup and clone workflows for persistent volumes." >}} -{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="The Kubernetes SIG Storage standard controller for managing object storage buckets as Kubernetes resources. COSI provides a vendor-neutral API for provisioning S3-compatible buckets and granting access credentials to workloads. Cozystack's managed Bucket service uses COSI to provision SeaweedFS buckets through a consistent Kubernetes-native interface." >}} -{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="A lightweight web-based management interface for S3-compatible object storage, bundled with the Cozystack managed Bucket service. S3 Manager provides bucket browsing, file upload and download, and basic access management via an intuitive UI without requiring AWS CLI or complex tooling. It is deployed alongside SeaweedFS to simplify object storage operations." >}} +{{< oss-card name="LINSTOR / Piraeus" logo="linstor" license="GPL-3.0; Apache-2.0" source="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/LICENSE" description="DRBD-based replicated block storage managed by LINSTOR. Provisions persistent volumes with synchronous replication for VM disks and databases." >}} +{{< oss-card name="SeaweedFS" logo="seaweedfs" license="Apache-2.0" source="https://github.com/seaweedfs/seaweedfs/blob/master/LICENSE" description="Distributed object storage backing the managed Bucket service. S3-compatible with O(1) disk read performance and no clustered filesystem dependency." >}} +{{< oss-card name="Velero" logo="velero" license="Apache-2.0" source="https://github.com/velero-io/velero/blob/main/LICENSE" description="Backup and restore for Kubernetes clusters and persistent volumes. Stores backups in S3-compatible object storage for off-cluster retention." >}} +{{< oss-card name="CSI Driver NFS" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/LICENSE" description="CSI driver for mounting NFS shares as persistent volumes. Supports ReadWriteMany access mode required for multi-pod shared storage scenarios." >}} +{{< oss-card name="CSI Snapshot Controller" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-csi/external-snapshotter/blob/master/LICENSE" description="Manages the VolumeSnapshot lifecycle across all CSI drivers. Provides a consistent API for point-in-time storage snapshots and clone workflows." >}} +{{< oss-card name="Container Object Storage Interface" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/LICENSE" description="Kubernetes-native API for provisioning S3-compatible object storage buckets. Used to provision SeaweedFS buckets for the managed Bucket service." >}} +{{< oss-card name="S3 Manager" license="Apache-2.0" source="https://github.com/cloudlena/s3manager/blob/main/LICENSE" description="Lightweight web UI for S3-compatible object storage. Bundled with the managed Bucket service for bucket browsing and file management." >}} {{< /oss-cards >}} ## GitOps and platform automation -Flux is the GitOps engine for all Cozystack components. Supporting tools handle certificates, secret distribution, and configuration-change propagation. - {{< oss-cards >}} -{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="The GitOps engine and primary lifecycle management tool for all Cozystack platform components. Flux continuously reconciles the desired cluster state declared in Helm releases and Kustomization objects. The ControlPlane Flux Operator and instance chart are AGPL-3.0; upstream Flux controllers are Apache-2.0. Cozystack uses Flux for day-two operations automation." >}} -{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes created by Kamaji in Cozystack. The Ænix etcd Operator provisions and operates reliable, replicated key-value storage required by each tenant's kube-apiserver. It handles etcd member addition, removal, and backup-restore operations as Kubernetes-native reconciliation loops." >}} -{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation for all platform services and tenant workloads in Cozystack. cert-manager integrates with ACME-compatible CAs (Let's Encrypt), internal PKI (OpenBao), and self-signed issuers. It watches Kubernetes Ingress and Gateway resources to automatically provision and inject TLS certificates without manual intervention." >}} -{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Synchronizes secrets from external key management systems — AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, OpenBao — into Kubernetes Secrets. External Secrets Operator watches ExternalSecret CRs and automatically creates and updates Kubernetes Secrets from the configured backend. It enables GitOps-friendly secret management without storing sensitive values in Git." >}} -{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across multiple namespaces, keeping copies in sync whenever the source secret is updated or rotated. The ClusterSecret Operator is used in Cozystack to propagate platform-level secrets (TLS certificates, credentials) to tenant namespaces without manual copy operations. It reduces operational overhead for multi-tenant secret distribution." >}} -{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Watches for changes to ConfigMaps and Secrets and automatically triggers rolling restarts of the affected Deployments, StatefulSets, or DaemonSets. Reloader eliminates the need for manual pod restarts when configuration or secret values are updated. It is deployed across the Cozystack platform to ensure components pick up configuration changes without operator intervention." >}} -{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="An iPXE boot and DHCP server providing bare-metal node provisioning capabilities for Cozystack clusters. Smee handles DHCP lease allocation and serves iPXE boot scripts to network-booting servers, enabling automated OS installation and Talos Linux deployment on physical hardware. It is part of the Tinkerbell bare-metal provisioning ecosystem." >}} -{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="A developer tool that creates a transparent two-way network proxy between a local development machine and a remote Kubernetes cluster. Telepresence intercepts traffic to a specific deployment and routes it to the local machine, enabling developers to run and debug services locally while accessing remote cluster services. Cozystack deploys the Traffic Manager component." >}} +{{< oss-card name="Flux" logo="fluxcd" license="Apache-2.0; AGPL-3.0" source="https://github.com/fluxcd/flux2/blob/main/LICENSE" description="GitOps engine reconciling cluster state from Helm releases and Kustomizations. ControlPlane Flux Operator is AGPL-3.0; upstream controllers are Apache-2.0." >}} +{{< oss-card name="Aenix etcd Operator" logo="etcd" license="Apache-2.0" source="https://github.com/aenix-io/etcd-operator/blob/main/LICENSE" description="Manages dedicated etcd clusters for tenant Kubernetes control planes. Handles member lifecycle, scaling, and backup-restore as Kubernetes reconciliation loops." >}} +{{< oss-card name="cert-manager" logo="cert-manager" license="Apache-2.0" source="https://github.com/cert-manager/cert-manager/blob/master/LICENSE" description="Automates TLS certificate issuance, renewal, and rotation. Integrates with ACME, internal PKI (OpenBao), and self-signed issuers." >}} +{{< oss-card name="External Secrets Operator" logo="external-secrets" license="Apache-2.0" source="https://github.com/external-secrets/external-secrets/blob/main/LICENSE" description="Syncs secrets from external KMS (Vault, OpenBao, AWS, GCP) into Kubernetes Secrets. Enables GitOps secret management without storing values in Git." >}} +{{< oss-card name="SAP ClusterSecret Operator" logo="sap" license="Apache-2.0" source="https://github.com/SAP/clustersecret-operator/blob/main/LICENSE" description="Replicates Kubernetes Secrets across namespaces, keeping copies in sync. Used to propagate platform-level credentials to tenant namespaces." >}} +{{< oss-card name="Stakater Reloader" logo="reloader" license="Apache-2.0" source="https://github.com/stakater/Reloader/blob/master/LICENSE" description="Triggers rolling restarts when ConfigMaps or Secrets change. Ensures Deployments and StatefulSets pick up configuration updates without manual intervention." >}} +{{< oss-card name="Tinkerbell Smee" logo="tinkerbell" license="Apache-2.0" source="https://github.com/tinkerbell/smee/blob/main/LICENSE" description="iPXE boot and DHCP server for bare-metal node provisioning. Serves boot scripts enabling automated Talos Linux deployment on physical hardware." >}} +{{< oss-card name="Telepresence" logo="telepresence" license="Apache-2.0" source="https://github.com/telepresenceio/telepresence/blob/release/v2/LICENSE" description="Proxies traffic between a local dev machine and a remote Kubernetes cluster. Enables local debugging while accessing live remote cluster services." >}} {{< /oss-cards >}} ## Observability -The observability stack is built on VictoriaMetrics for metrics, Grafana for dashboards, and Fluent Bit for log forwarding. Goldpinger provides network connectivity checks. - {{< oss-cards >}} -{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="A Prometheus-compatible, high-performance metrics storage and query engine deployed across the Cozystack platform. VictoriaMetrics consumes significantly less memory and disk space than Prometheus while providing better query performance at scale. It collects metrics from all platform components and exposes a PromQL-compatible API for Grafana dashboards and alerting rules." >}} -{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes resources within Cozystack's observability stack. The Grafana Operator enables declarative, GitOps-friendly management of the entire Grafana configuration through CRDs. It provides platform operators and tenants with a unified interface for viewing metrics, logs, and infrastructure alerts." >}} -{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="A lightweight log forwarder deployed as a DaemonSet on every Cozystack node, collecting and shipping logs from all platform components and tenant workloads. Fluent Bit uses minimal CPU and memory resources, making it suitable for high-throughput log collection. It supports flexible output routing to VictoriaLogs or any OpenTelemetry-compatible log storage backend." >}} -{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Listens to the Kubernetes API and generates metrics about the state of Kubernetes objects: deployments, pods, nodes, PersistentVolumeClaims, and more. kube-state-metrics exposes this data in Prometheus format, enabling Cozystack's VictoriaMetrics stack to track cluster health and resource usage over time for dashboards and alerting." >}} -{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exposes detailed system and hardware metrics from each Kubernetes node in Cozystack, including CPU usage, memory pressure, disk I/O, and network statistics. node-exporter runs as a DaemonSet and feeds host-level telemetry into VictoriaMetrics. It is the standard tool for bare-metal and VM node observability in Prometheus-compatible stacks." >}} -{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="Custom Resource Definitions for Prometheus-style monitoring resources (ServiceMonitor, PodMonitor, PrometheusRule, AlertmanagerConfig) consumed by VictoriaMetrics in Cozystack. These CRDs provide a standard, vendor-neutral interface for declaring monitoring targets and alerting rules, independent of whether Prometheus or VictoriaMetrics is the underlying engine." >}} -{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for Kubernetes, feeding CPU and memory usage data to the Horizontal Pod Autoscaler and the kubectl top command. Metrics Server aggregates kubelet-reported resource usage and exposes it as an API extension. Cozystack deploys Metrics Server as a prerequisite for HPA and VPA functionality across platform and tenant clusters." >}} -{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="A pod-to-pod network connectivity checker developed by Bloomberg and deployed as a DaemonSet across all Cozystack nodes. Goldpinger continuously pings every other Goldpinger instance in the cluster and exposes connectivity metrics and a real-time visualization UI. It enables rapid detection of node-to-node network partitions and CNI routing failures." >}} +{{< oss-card name="VictoriaMetrics Operator" logo="victoriametrics" license="Apache-2.0" source="https://github.com/VictoriaMetrics/operator/blob/master/LICENSE" description="Prometheus-compatible metrics storage and query engine. More memory-efficient than Prometheus at scale; exposes a PromQL-compatible API for Grafana." >}} +{{< oss-card name="Grafana Operator" logo="grafana" license="Apache-2.0" source="https://github.com/grafana/grafana-operator/blob/master/LICENSE" description="Manages Grafana instances, dashboards, and data sources as Kubernetes CRDs. Provides a unified observability UI for platform operators and tenants." >}} +{{< oss-card name="Fluent Bit" logo="fluent-bit" license="Apache-2.0" source="https://github.com/fluent/fluent-bit/blob/master/LICENSE" description="Lightweight log forwarder running as a DaemonSet on every node. Collects platform and tenant workload logs with minimal CPU and memory overhead." >}} +{{< oss-card name="kube-state-metrics" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/kube-state-metrics/blob/main/LICENSE" description="Generates Prometheus-format metrics about Kubernetes object state (deployments, pods, nodes, PVCs). Feeds cluster health data into VictoriaMetrics." >}} +{{< oss-card name="node-exporter" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus/node_exporter/blob/master/LICENSE" description="Exports system and hardware metrics (CPU, memory, disk, network) from each node as a DaemonSet. Feeds host telemetry into VictoriaMetrics." >}} +{{< oss-card name="Prometheus Operator CRDs" logo="prometheus" license="Apache-2.0" source="https://github.com/prometheus-community/helm-charts/blob/main/LICENSE" description="CRDs for ServiceMonitor, PodMonitor, and PrometheusRule resources consumed by VictoriaMetrics. Provides a vendor-neutral monitoring target API." >}} +{{< oss-card name="Metrics Server" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes-sigs/metrics-server/blob/master/LICENSE" description="Provides the Resource Metrics API for HPA and kubectl top. Aggregates kubelet-reported CPU and memory usage across cluster nodes." >}} +{{< oss-card name="Goldpinger" logo="goldpinger" license="Apache-2.0" source="https://github.com/bloomberg/goldpinger/blob/master/LICENSE" description="Pod-to-pod connectivity checker deployed as a DaemonSet. Surfaces node-to-node network partition failures with metrics and a real-time visualization UI." >}} {{< /oss-cards >}} ## Autoscaling and resource management {{< oss-cards >}} -{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically adjusts CPU and memory resource requests and limits for running pods based on observed usage patterns. VPA eliminates the need for manual resource tuning, right-sizing pods to match their actual workload requirements. Cozystack deploys VPA to optimize resource utilization across platform components and tenant application workloads (chart: MIT)." >}} -{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Dynamically scales node pools up or down in response to pending pod scheduling failures or underutilized nodes. The Cluster Autoscaler integrates with cloud provider APIs to provision or terminate worker node VMs, maintaining the optimal cluster size for current workload demand. Cozystack uses it to enable cost-efficient elastic scaling of tenant Kubernetes clusters." >}} +{{< oss-card name="Vertical Pod Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Automatically right-sizes CPU and memory requests for pods based on observed usage. Eliminates manual resource tuning for platform and tenant workloads (chart: MIT)." >}} +{{< oss-card name="Cluster Autoscaler" logo="kubernetes" license="Apache-2.0" source="https://github.com/kubernetes/autoscaler/blob/master/LICENSE" description="Scales node pools based on pending pods or underutilized nodes. Enables cost-efficient elastic scaling of tenant Kubernetes clusters." >}} {{< /oss-cards >}} ## GPU and accelerators {{< oss-cards >}} -{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Automates the complete lifecycle of NVIDIA GPU drivers, container runtimes, device plugins, and monitoring components on Kubernetes nodes. The GPU Operator eliminates manual driver installation and maintenance on GPU-equipped Cozystack nodes. It enables GPU-accelerated workloads including AI/ML training, LLM inference, and scientific computing without per-node manual setup." >}} -{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="A CNCF Sandbox project that enables GPU sharing and fractional GPU scheduling on Kubernetes, allowing multiple workloads to share a single physical GPU. HAMi intercepts CUDA API calls to enforce resource limits and isolation between co-hosted GPU workloads. Cozystack uses HAMi to maximize GPU utilization for LLM inference and AI development platforms." >}} +{{< oss-card name="NVIDIA GPU Operator" logo="nvidia" license="Apache-2.0" source="https://github.com/NVIDIA/gpu-operator/blob/main/LICENSE" description="Manages the full lifecycle of NVIDIA GPU drivers, device plugins, and runtimes on Kubernetes nodes. Enables AI/ML and LLM inference workloads without per-node manual setup." >}} +{{< oss-card name="HAMi" logo="hami" license="Apache-2.0" source="https://github.com/Project-HAMi/HAMi/blob/master/LICENSE" description="GPU sharing and fractional scheduling for Kubernetes. Allows multiple workloads to share a single GPU, maximizing utilization for LLM inference platforms." >}} {{< /oss-cards >}} ## Identity, registry, and secrets {{< oss-cards >}} -{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="An enterprise-grade OIDC and SAML identity provider deployed via the KubeRocketCI Keycloak Operator in Cozystack. Keycloak provides single sign-on for the platform API, Grafana dashboards, Harbor registry, and tenant services. It supports role-based access control, external identity provider federation, and token-based API authentication for the entire platform." >}} -{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="A CNCF-graduated OCI-compliant container registry deployed in Cozystack for hosting container images and Helm charts. Harbor provides role-based access control, image vulnerability scanning, content trust signing, and replication across registries. Platform operators and tenants can use Harbor as a private registry for custom application images and chart repositories." >}} -{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="An open-source, community-driven fork of HashiCorp Vault under MPL-2.0, deployed via the official OpenBao Helm chart in Cozystack. OpenBao provides dynamic secrets generation, PKI certificate management, and encrypted secret storage for Kubernetes workloads. It supports multiple authentication backends including Kubernetes service account tokens and OIDC." >}} +{{< oss-card name="Keycloak" logo="keycloak" license="Apache-2.0" source="https://github.com/keycloak/keycloak/blob/main/LICENSE.txt" description="OIDC and SAML identity provider for platform SSO. Secures the platform API, Grafana, Harbor, and tenant services with role-based access control." >}} +{{< oss-card name="Harbor" logo="harbor" license="Apache-2.0" source="https://github.com/goharbor/harbor/blob/main/LICENSE" description="CNCF-graduated OCI registry for container images and Helm charts. Provides RBAC, vulnerability scanning, content trust signing, and registry replication." >}} +{{< oss-card name="OpenBao" logo="openbao" license="MPL-2.0" source="https://github.com/openbao/openbao/blob/main/LICENSE" description="Open-source Vault fork for dynamic secrets, PKI management, and encrypted secret storage. Supports Kubernetes and OIDC authentication backends." >}} {{< /oss-cards >}} ## Managed database runtimes -Cozystack ships one-click managed databases for the most common relational, document, columnar, search, vector, and in-memory use cases. - {{< oss-cards >}} -{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="A powerful, open-source relational database managed via the CloudNativePG operator in Cozystack. Cozystack provisions self-healing replicated PostgreSQL clusters with automated failover, backup scheduling via Barman, and connection pooling. Ideal for transactional workloads, web application backends, and any application requiring ACID-compliant relational storage." >}} -{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="A MySQL-compatible relational database managed via mariadb-operator in Cozystack, providing fully replicated cluster deployments. Supports Galera multi-primary replication, automated user and permission management, and Restic-based backup scheduling. A drop-in replacement for MySQL workloads requiring high availability and familiar SQL semantics." >}} -{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="A document-oriented NoSQL database deployed as a sharded or replica-set cluster via the Percona Operator for MongoDB in Cozystack. Supports flexible JSON-like BSON document storage, horizontal sharding for multi-terabyte datasets, and automated backup via Percona Backup for MongoDB. Suitable for high-throughput document storage and aggregation workloads." >}} -{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="A column-oriented SQL database management system optimized for real-time analytical queries on large datasets. Cozystack deploys ClickHouse via the Altinity ClickHouse Operator, providing distributed multi-shard clusters with data replication. Ideal for OLAP workloads such as event analytics, time-series data processing, and ad-tech pipelines." >}} -{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="An Apache 2.0-licensed search and analytics engine managed via opensearch-k8s-operator in Cozystack. OpenSearch provides full-text search, log aggregation, security analytics, and observability features. It serves as a scalable alternative to Elasticsearch for applications requiring advanced query DSL, index management, and dashboarding via OpenSearch Dashboards." >}} -{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="A high-performance vector database designed for similarity search and machine learning workloads, deployed via the official Qdrant Helm chart in Cozystack. Qdrant enables approximate nearest-neighbor search over dense and sparse vector embeddings, making it a natural fit for AI applications, recommendation engines, and semantic search pipelines." >}} -{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="A distributed, multi-model database with strong ACID guarantees across the entire cluster, managed via the FoundationDB Kubernetes Operator in Cozystack. FoundationDB is designed for extreme reliability and scalability, powering the storage backend for Apple iCloud. It provides the core transactional layer for applications requiring strict consistency at scale." >}} -{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="An in-memory key-value store managed via the Spotahome Redis Operator in Cozystack, deployed as a replicated Sentinel cluster for automatic failover. Cozystack supports Redis 7.4 and Redis 8, covering the licensing transition from RSALv2/SSPL to AGPL. Common use cases include session storage, distributed caching, pub/sub messaging, and rate limiting." >}} +{{< oss-card name="PostgreSQL" logo="postgresql" license="PostgreSQL License" source="https://www.postgresql.org/about/licence/" description="Replicated relational database managed via CloudNativePG. Features automated failover, Barman-based backup scheduling, and connection pooling." >}} +{{< oss-card name="MariaDB Server" logo="mariadb" license="GPL-2.0" source="https://github.com/MariaDB/server/blob/main/COPYING" description="MySQL-compatible replicated database managed via mariadb-operator. Supports Galera multi-primary replication and Restic-based backup scheduling." >}} +{{< oss-card name="MongoDB (Percona Server)" logo="mongodb" license="SSPL-1.0" source="https://github.com/percona/percona-server-mongodb/blob/master/LICENSE-Community.txt" description="Document-oriented NoSQL database deployed via Percona Operator. Supports replica sets, sharded clusters, and automated Percona backup." >}} +{{< oss-card name="ClickHouse" logo="clickhouse" license="Apache-2.0" source="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE" description="Column-oriented DBMS optimized for real-time analytics. Deployed via Altinity ClickHouse Operator with multi-shard distributed clusters." >}} +{{< oss-card name="OpenSearch" logo="opensearch" license="Apache-2.0" source="https://github.com/opensearch-project/OpenSearch/blob/main/LICENSE.txt" description="Search and analytics engine managed via opensearch-k8s-operator. Full-text search, log aggregation, and Elasticsearch-compatible query API." >}} +{{< oss-card name="Qdrant" logo="qdrant" license="Apache-2.0" source="https://github.com/qdrant/qdrant/blob/master/LICENSE" description="High-performance vector database for similarity search and AI workloads. Supports dense and sparse vector embeddings for recommendation and semantic search." >}} +{{< oss-card name="FoundationDB" logo="foundationdb" license="Apache-2.0" source="https://github.com/apple/foundationdb/blob/main/LICENSE" description="Distributed database with strong ACID guarantees across the cluster, managed via FoundationDB Kubernetes Operator. Designed for extreme reliability at scale." >}} +{{< oss-card name="Redis" logo="redis" license="RSALv2 or SSPLv1 (7.x) / AGPLv3 (8.x)" source="https://redis.io/legal/licenses/" description="In-memory key-value store deployed as a replicated Sentinel cluster via Spotahome Redis Operator. Supports Redis 7.4 and Redis 8 for caching and pub/sub." >}} {{< /oss-cards >}} ## Managed messaging and caching runtimes {{< oss-cards >}} -{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="A distributed event streaming platform managed via the Strimzi Kafka Operator in Cozystack, enabling high-throughput, fault-tolerant message queues. Kafka decouples producers and consumers, supporting event-driven architectures, stream processing, and durable log storage. Cozystack provides multi-broker Kafka clusters with configurable replication and retention policies." >}} -{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="A lightweight, high-performance messaging system deployed via the official NATS Helm chart in Cozystack. NATS supports publish-subscribe, request-reply, and queue-based messaging patterns with low latency and minimal resource overhead. It is well-suited for microservices communication, IoT messaging, and cloud-native applications requiring simple, fast message passing." >}} -{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="A widely-used message broker managed via the official RabbitMQ Cluster Operator in Cozystack, providing AMQP-based messaging with configurable routing, acknowledgments, and dead-letter exchanges. RabbitMQ supports complex messaging topologies with fanout, direct, and topic-based exchanges. Cozystack deploys it as a highly available cluster with quorum queues." >}} +{{< oss-card name="Apache Kafka" logo="kafka" license="Apache-2.0" source="https://github.com/apache/kafka/blob/trunk/LICENSE" description="Distributed event streaming platform managed via Strimzi Kafka Operator. Multi-broker clusters with configurable replication for event-driven architectures." >}} +{{< oss-card name="NATS" logo="nats" license="Apache-2.0" source="https://github.com/nats-io/nats-server/blob/main/LICENSE" description="Lightweight pub-sub and request-reply messaging deployed via the official Helm chart. Low-latency, minimal-overhead messaging for microservices and IoT." >}} +{{< oss-card name="RabbitMQ" logo="rabbitmq" license="MPL-2.0; Apache-2.0 for some files" source="https://github.com/rabbitmq/rabbitmq-server/blob/main/LICENSE" description="AMQP message broker managed via RabbitMQ Cluster Operator. Highly available clusters with quorum queues and fanout, topic, and direct exchange routing." >}} {{< /oss-cards >}} ## Managed networking services {{< oss-cards >}} -{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the Cozystack managed HTTP Cache service, providing reverse-proxy caching to shield origin servers from traffic spikes. The HTTP Cache service integrates Nginx's efficient caching engine with GeoIP filtering via IP2Location modules. It supports horizontal scaling without a shared filesystem and is suitable for CDN-like caching architectures and high-traffic origins." >}} -{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="An enterprise-grade TCP and HTTP load balancer powering both the managed TCP Balancer service and HTTP Cache appliance in Cozystack. HAProxy provides active health checking, session persistence, and high-throughput connection handling. It is used for production traffic distribution in environments requiring deterministic, low-latency TCP load balancing." >}} -{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP database modules (IP2Location and IP2Proxy) bundled into the Cozystack HTTP Cache service for IP-based geolocation and proxy detection. These Nginx modules enable country-based traffic filtering, geo-targeted content routing, and proxy/VPN detection in the managed HTTP Cache appliance." >}} -{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="The VPN service backend powering Cozystack's managed VPN offering, based on the Shadowsocks protocol developed by the Jigsaw team at Google. Outline Server manages Shadowsocks instances on demand, providing fast access keys and an API for user management. The Shadowsocks protocol uses symmetric encryption to resist Deep Packet Inspection and traffic blocking." >}} +{{< oss-card name="NGINX" logo="nginx" license="BSD-2-Clause" source="https://github.com/nginx/nginx/blob/master/LICENSE" description="Powers the managed HTTP Cache service with reverse-proxy caching and GeoIP filtering. Scales horizontally without a shared filesystem." >}} +{{< oss-card name="HAProxy" logo="haproxy" license="GPL-2.0 with exceptions" source="https://github.com/haproxy/haproxy/blob/master/LICENSE" description="Enterprise TCP/HTTP load balancer powering the managed TCP Balancer and HTTP Cache. Provides active health checks and high-throughput connection handling." >}} +{{< oss-card name="IP2Location modules" license="MIT" source="https://github.com/ip2location/ip2location-nginx/blob/master/LICENSE" description="GeoIP modules (IP2Location and IP2Proxy) bundled into the HTTP Cache. Enables country-based traffic filtering and proxy/VPN detection." >}} +{{< oss-card name="Outline Server (Shadowsocks)" logo="outline" license="Apache-2.0" source="https://github.com/OutlineFoundation/outline-server/blob/master/LICENSE" description="Shadowsocks-based VPN backend developed by Google's Jigsaw team. Manages Shadowsocks instances with symmetric encryption to resist DPI traffic analysis." >}} {{< /oss-cards >}}