Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
c3e8e6a
Configure Argo CD bootstrap for helm-argocd
ihaardik Mar 28, 2026
0de4a09
Add helm-argocd secret value files for testing
ihaardik Mar 28, 2026
3b96374
Allow Namespace in helm-argocd AppProject
ihaardik Mar 28, 2026
d589d0c
Set helm-argocd Countly secret values
ihaardik Mar 28, 2026
a2a616a
Add Argo CD operator bootstrap apps
ihaardik Mar 28, 2026
30afdd0
Delay Countly HPAs until after deployments
ihaardik Mar 28, 2026
05ecbf5
Add Argo CD nginx ingress bootstrap app
ihaardik Mar 28, 2026
4152c21
Increase nginx ingress controller memory
ihaardik Mar 28, 2026
c3bcb89
Add GitOps letsencrypt ClusterIssuer
ihaardik Mar 28, 2026
04fd60a
Target letsencrypt ClusterIssuer to deployment cluster
ihaardik Mar 28, 2026
086820f
Exclude operator manifests from root bootstrap
ihaardik Mar 28, 2026
9fc4fe4
Fix LetsEncrypt HTTP-01 ingress annotations
ihaardik Mar 28, 2026
52dd043
Use temporary cert for LetsEncrypt HTTP-01
ihaardik Mar 28, 2026
5719fcc
Fix cert-manager HTTP-01 solver override
ihaardik Mar 28, 2026
27b3c29
Ignore benign nginx ingress drift
ihaardik Mar 28, 2026
7da7eda
Refactor Argo CD for reusable customer onboarding
ihaardik Mar 28, 2026
a7c1e50
Make customer selectors authoritative in Argo CD
ihaardik Mar 30, 2026
1a385c1
Add helm-argo-test direct-secret customer
ihaardik Mar 30, 2026
608fba0
Fix bootstrap exclude patterns
ihaardik Mar 30, 2026
c5e0de1
Make migration optional in customer appsets
ihaardik Mar 30, 2026
16114e4
Disable drill connector via customer kafka values
ihaardik Mar 30, 2026
b0657ad
Remove helm-argo-test customer
ihaardik Mar 30, 2026
e5b382b
Add argo1 test customer
ihaardik Mar 31, 2026
a6aecbb
Fix argo1 kafka connector override
ihaardik Mar 31, 2026
33f3d11
Map Countly hostname and TLS from customer metadata
ihaardik Mar 31, 2026
c70dcbb
Add argo2 test customer
ihaardik Mar 31, 2026
d6ea447
Remove Countly ingress defaults from customer envs
ihaardik Mar 31, 2026
f847d67
Add argo3 test customer
ihaardik Mar 31, 2026
511b179
Remove test customers and direct secret fixtures
ihaardik Mar 31, 2026
14d6025
Simplify Argo CD customer onboarding guide
ihaardik Mar 31, 2026
47aab68
Add GAR image pull support for Argo customer deployments
ihaardik Mar 31, 2026
c6faf3b
Fix gcr-argo GAR overrides for countly and kafka
ihaardik Mar 31, 2026
4bcd547
Add external-secrets operator appset
ihaardik Mar 31, 2026
deb76e6
Use External Secrets v1 APIs
ihaardik Mar 31, 2026
33f359e
Use published Kafka Connect image tag
ihaardik Mar 31, 2026
01190fb
Keep customer env files as profile overrides
ihaardik Mar 31, 2026
6794157
Ignore benign Argo drift for ESO, ingress, and Keeper
ihaardik Mar 31, 2026
7d1bf3f
Add Secret Manager-backed app secrets via External Secrets
ihaardik Mar 31, 2026
917c471
Add optional MongoDB admin user support
ihaardik Mar 31, 2026
7ab6b69
Enable MongoDB admin user by default
ihaardik Mar 31, 2026
97dbf70
Use Secret Manager-backed app secrets for gcr-argo
ihaardik Mar 31, 2026
eadf9b6
Limit gcr-argo app secrets to passwords only
ihaardik Mar 31, 2026
a9c67db
Fallback countly common and kafka secrets to values
ihaardik Mar 31, 2026
b6efd9e
Fetch countly common secrets from Secret Manager
ihaardik Mar 31, 2026
7d011d6
Skip empty common secret template data
ihaardik Mar 31, 2026
c4e4207
Standardize secret naming and document onboarding
ihaardik Mar 31, 2026
60d224a
Document image sources and ownership
ihaardik Apr 1, 2026
df59c07
Fix Helm-only deployment documentation
ihaardik Apr 1, 2026
cf94b7f
Use public Kafka Connect image
ihaardik Apr 1, 2026
cebddc7
Merge mixed ExternalSecret template data
ihaardik Apr 1, 2026
62ba37c
Align official image versions
ihaardik Apr 1, 2026
3bf53cc
Add v2-argo customer
ihaardik Apr 1, 2026
541e878
Reuse GAR pull secret for v2-argo
ihaardik Apr 1, 2026
d7255fc
Rename customer secret files to credentials
ihaardik Apr 1, 2026
511694a
Keep Kafka Connect image public
ihaardik Apr 1, 2026
fb37800
Clean fresh customer path and drop v2-argo
ihaardik Apr 1, 2026
b60f665
Remove gcr-argo customer
ihaardik Apr 1, 2026
774e23e
Add v2-argo customer
ihaardik Apr 1, 2026
c8ecfa4
Remove v2-argo test customer
ihaardik Apr 1, 2026
d09b093
Clarify cluster identity onboarding
ihaardik Apr 1, 2026
8e0438e
Add gcr-argo customer
ihaardik Apr 1, 2026
5390e91
Fix gcr-argo cluster endpoint
ihaardik Apr 1, 2026
61ee521
Reduce gcr-argo Kafka Connect memory
ihaardik Apr 1, 2026
a27ed28
Remove gcr-argo test customer
ihaardik Apr 1, 2026
e997fa4
Harden customer scaffold and onboarding
ihaardik Apr 1, 2026
26bfad1
Add div-ya-argo customer
ihaardik Apr 2, 2026
43f3552
Escape MongoDB passwords in Countly URIs
ihaardik Apr 2, 2026
00eebba
Add hardik-argo customer
ihaardik Apr 2, 2026
f4a2052
Reuse MongoDB app secret across charts
ihaardik Apr 2, 2026
f8ebe0d
Remove test customers
ihaardik Apr 2, 2026
7b38817
Add final-argo customer
ihaardik Apr 2, 2026
a07c1da
Simplify customer scaffold secret modes
ihaardik Apr 2, 2026
965c914
Add prod-argo customer
ihaardik Apr 2, 2026
47bbb2b
Add GSM TLS support and remove test customers
ihaardik Apr 2, 2026
63db107
Refresh reference environment examples
ihaardik Apr 2, 2026
186eb44
Add tls-argo customer
ihaardik Apr 2, 2026
9836077
Point Argo to main and remove tls-argo
ihaardik Apr 2, 2026
0f04fdc
Clarify shared TLS secret defaults
ihaardik Apr 2, 2026
5e69772
Merge main into gcp-artifact-rep-integration
ihaardik Apr 2, 2026
b4cea8a
Fix chart render validation inputs
ihaardik Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/validate-charts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,19 @@ jobs:
;;
countly-mongodb)
helm template test-release "${chart}" \
--set users.admin.password=test \
--set users.app.password=test \
--set users.metrics.password=test \
> /dev/null || exit_code=1
;;
countly-cluster-secret-store)
helm template test-release "${chart}" \
--set secretStore.secretManagerProjectID=test-project \
--set secretStore.clusterProjectID=test-cluster-project \
--set secretStore.clusterName=test-cluster \
--set secretStore.clusterLocation=test-location \
> /dev/null || exit_code=1
;;
countly-migration)
helm template test-release "${chart}" \
--set backingServices.mongodb.password=test \
Expand Down
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ overlay-secrets.yaml
*-secrets.yaml
secrets-*.yaml

# Exception: reference environment templates (contain no real secrets)
!environments/reference/secrets-*.yaml

# Helmfile state
helmfile.lock
.helmfile/
Expand Down
93 changes: 86 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,11 @@ Install required operators before deploying Countly. See [docs/PREREQUISITES.md]
- Choose `global.observability`: `disabled`, `full`, `external-grafana`, or `external`
- Choose `global.kafkaConnect`: `throughput`, `balanced`, or `low-latency`
- Choose `global.security`: `open` or `hardened`
- Keep `global.imageSource.mode: direct` for the current direct-pull flow, or switch to `gcpArtifactRegistry` and set `global.imageSource.gcpArtifactRegistry.repositoryPrefix`
- Set `global.imagePullSecrets` when pulling from a private registry such as GAR

3. **Fill in required secrets** in the chart-specific files. See `environments/reference/secrets.example.yaml` for a complete reference.
3. **Fill in required credentials** in the chart-specific files. See `environments/reference/secrets.example.yaml` for a complete reference.
Keep `secrets.mode: values` for direct YAML values, switch to `secrets.mode: externalSecret` to have the charts create `ExternalSecret` resources backed by your Secret Manager store.

4. **Register your environment** in `helmfile.yaml.gotmpl`:
```yaml
Expand All @@ -173,6 +176,81 @@ Install required operators before deploying Countly. See [docs/PREREQUISITES.md]
helmfile -e my-deployment apply
```

For a GAR-backed production example, see [environments/example-production/global.yaml](/Users/admin/cly/helm/environments/example-production/global.yaml) and replace `countly-gar` with your Kubernetes docker-registry secret name.
For GitOps-managed pull secrets, start from [environments/reference/image-pull-secrets.example.yaml](/Users/admin/cly/helm/environments/reference/image-pull-secrets.example.yaml) and encrypt or template it before committing.
For Secret Manager + External Secrets Operator, set `global.imagePullSecretExternalSecret` in your environment `global.yaml` so Countly can create its namespaced `dockerconfigjson` pull secret.
Application secrets can use the same pattern in `credentials-countly.yaml`, `credentials-kafka.yaml`, `credentials-clickhouse.yaml`, and `credentials-mongodb.yaml` by switching `secrets.mode` to `externalSecret` and filling `secrets.externalSecret.remoteRefs`.
Countly ingress TLS can also use the same pattern: set customer `tls: provided`, then enable `ingress.tls.externalSecret` in `countly.yaml` to materialize a `kubernetes.io/tls` secret from Secret Manager. The default scaffold already points all customers at the shared keys `countly-prod-tls-crt` and `countly-prod-tls-key`; override them only when a customer needs a dedicated certificate.

Recommended Secret Manager naming convention:
- `<customer>-gar-dockerconfig`
- `<customer>-countly-encryption-reports-key`
- `<customer>-countly-web-session-secret`
- `<customer>-countly-password-secret`
- `<customer>-countly-clickhouse-password`
- `<customer>-kafka-connect-clickhouse-password`
- `<customer>-clickhouse-default-user-password`
- `<customer>-mongodb-admin-password`
- `<customer>-mongodb-app-password`
- `<customer>-mongodb-metrics-password`

### GitOps Customer Onboarding

For Argo CD managed deployments, scaffold a new customer/cluster with:

```bash
./scripts/new-argocd-customer.sh [--secret-mode values|gcp-secrets] <customer> <server> <hostname>
```

This creates:
- `environments/<customer>/`
- `argocd/customers/<customer>.yaml`

For Secret Manager from day one, prefer:

```bash
./scripts/new-argocd-customer.sh --secret-mode gcp-secrets <customer> <server> <hostname>
```

Then:
1. fill in `environments/<customer>/credentials-*.yaml`
2. commit
3. sync `countly-bootstrap`

## Image Sources

This table shows which images are used by the platform, where they are pulled from, and whether they are Countly-provided or official upstream/vendor images.

| Component | Image / Pattern | Source Registry | Ownership | Private/GAR Ready |
|-------|-------|-------|-------|-------|
| Countly app pods (`api`, `frontend`, `ingestor`, `aggregator`, `jobserver`) | `gcr.io/countly-dev-313620/countly-unified:26.01` or `<repositoryPrefix>/countly-unified` | `gcr.io` or `us-docker.pkg.dev` | Countly-provided | Yes |
| Kafka Connect ClickHouse | `countly/strimzi-kafka-connect-clickhouse:kafka4.2.0-ch1.3.5-strimzi0.51-otel2.12.0` | Docker Hub | Countly-provided custom image | Public by default |
| ClickHouse server | `clickhouse/clickhouse-server:26.3` | Docker Hub style namespace | Official provider image | No, not via current GAR toggle |
| ClickHouse keeper | `clickhouse/clickhouse-keeper:26.3` | Docker Hub style namespace | Official provider image | No, not via current GAR toggle |
| MongoDB database | chosen by MongoDB Kubernetes Operator from `version: 8.2.5` | operator-resolved upstream image | Official provider image | No, not via current chart values |
| MongoDB exporter | `percona/mongodb_exporter:0.47.2` | Docker Hub style namespace | Official provider/vendor image | No |
| Migration service | `countly/migration:<appVersion or override>` | configurable, default public-style repo | Countly-provided | Not wired to GAR automatically |
| Prometheus | `prom/prometheus:v3.8.1` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| Loki | `grafana/loki:3.6.3` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| Tempo | `grafana/tempo:2.8.1` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| Pyroscope | `grafana/pyroscope:1.16.0` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| Grafana | `grafana/grafana:12.3.5` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| Alloy / Alloy OTLP / Alloy Metrics | `grafana/alloy:v1.14.0` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| kube-state-metrics | `registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.17.0` | `registry.k8s.io` | Official provider image | Only via `global.imageRegistry` mirror |
| node-exporter | `prom/node-exporter:v1.10.2` | Docker Hub style namespace | Official provider image | Only via `global.imageRegistry` mirror |
| busybox init/test containers | `busybox:1.37.0` | Docker Hub | Official provider image | No explicit mirror logic |

Operator and platform apps are pinned by Helm chart version in `argocd/operators/`, so this repo controls the chart source and version, but not every underlying container image directly:

| Operator/App | Source | Version | Ownership |
|-------|-------|-------|-------|
| cert-manager | Jetstack chart | `v1.17.2` | Official provider |
| External Secrets Operator | external-secrets chart | `1.3.1` | Official provider |
| Strimzi Kafka Operator | Strimzi chart | `0.51.0` | Official provider |
| ClickHouse Operator | GHCR OCI chart | `0.0.2` | Official provider |
| MongoDB Kubernetes Operator | MongoDB chart | `1.7.0` | Official provider |
| F5 NGINX Ingress | NGINX chart | `2.1.0` | Official provider |

### Manual Installation (without Helmfile)

Substitute your profile choices from `global.yaml` into the commands below.
Expand All @@ -193,15 +271,15 @@ helm install countly-mongodb ./charts/countly-mongodb -n mongodb --create-namesp
-f profiles/sizing/$SIZING/mongodb.yaml \
-f profiles/security/$SECURITY/mongodb.yaml \
-f environments/$ENV/mongodb.yaml \
-f environments/$ENV/secrets-mongodb.yaml
-f environments/$ENV/credentials-mongodb.yaml

helm install countly-clickhouse ./charts/countly-clickhouse -n clickhouse --create-namespace \
--wait --timeout 10m \
-f environments/$ENV/global.yaml \
-f profiles/sizing/$SIZING/clickhouse.yaml \
-f profiles/security/$SECURITY/clickhouse.yaml \
-f environments/$ENV/clickhouse.yaml \
-f environments/$ENV/secrets-clickhouse.yaml
-f environments/$ENV/credentials-clickhouse.yaml

helm install countly-kafka ./charts/countly-kafka -n kafka --create-namespace \
--wait --timeout 10m \
Expand All @@ -211,7 +289,7 @@ helm install countly-kafka ./charts/countly-kafka -n kafka --create-namespace \
-f profiles/observability/$OBS/kafka.yaml \
-f profiles/security/$SECURITY/kafka.yaml \
-f environments/$ENV/kafka.yaml \
-f environments/$ENV/secrets-kafka.yaml
-f environments/$ENV/credentials-kafka.yaml

helm install countly ./charts/countly -n countly --create-namespace \
--wait --timeout 10m \
Expand All @@ -221,7 +299,7 @@ helm install countly ./charts/countly -n countly --create-namespace \
-f profiles/observability/$OBS/countly.yaml \
-f profiles/security/$SECURITY/countly.yaml \
-f environments/$ENV/countly.yaml \
-f environments/$ENV/secrets-countly.yaml
-f environments/$ENV/credentials-countly.yaml

helm install countly-observability ./charts/countly-observability -n observability --create-namespace \
--wait --timeout 10m \
Expand All @@ -233,11 +311,12 @@ helm install countly-observability ./charts/countly-observability -n observabili
-f environments/$ENV/secrets-observability.yaml

# Optional: MongoDB to ClickHouse batch migration (includes bundled Redis)
helm dependency build ./charts/countly-migration
helm install countly-migration ./charts/countly-migration -n countly-migration --create-namespace \
--wait --timeout 5m \
-f environments/$ENV/global.yaml \
-f environments/$ENV/migration.yaml \
-f environments/$ENV/secrets-migration.yaml
-f environments/$ENV/credentials-migration.yaml
```

## Configuration Model
Expand All @@ -263,7 +342,7 @@ Composable profile dimensions — select one value per dimension in `global.yaml
Environments contain deployment-specific choices:
- `global.yaml` — Profile selectors, hostname, backing service modes
- `<chart>.yaml` — Per-chart overrides (tuning, network policy, OTEL)
- `secrets-<chart>.yaml` — Per-chart secrets (gitignored)
- `credentials-<chart>.yaml` — Per-chart credentials overrides

### Deployment Modes

Expand Down
Loading
Loading