Operations & uninstallation
Use this page for day-2 checks, common fixes and removal of an install.
Common commands
These run the release's own kubectl and helmfile: put them on your PATH first
(see Prerequisites), or use your own of a matching version.
# Pod and service status (default namespace: octostar-main)
kubectl get pods -n octostar-main
kubectl get svc -n octostar-main
# Logs and roll-out status of a workload
kubectl logs -n octostar-main deploy/<deployment>
kubectl rollout status deploy/<deployment> -n octostar-main
# Stream the namespace logs to the screen and to a timestamped file (needs stern)
kubectl config use-context <context-name>
./bin/install.sh --dump-logs --context <context-name>
--install-utils installs k9s and stern. --dump-logs reads the octostar-main
namespace and runs until you press Ctrl+C. It ignores --context and reads the
cluster of your current context, so switch to the right context first. Add
--log-level debug to install.sh for more detail. update-existing.sh and
destroy.sh do not accept this option.
To log in as the admin, see Keycloak and custom OIDC.
Without Keycloak, use admin and timbrAdminPassword at https://home.<domain>.
Monitoring
Grafana ships dashboards for ClickHouse, OpenSearch, PostgreSQL, SeaweedFS, Temporal and octostar-api.
⚠️ Alerts reach nobody by default — Set up delivery as described in Alert notifications. On a cluster that already runs Prometheus and Loki, see Installing on a shared cluster.
If something is wrong
| Symptom | Fix |
|---|---|
Pod in ImagePullBackOff | Check dockerHub.token. On RKE2, check /etc/rancher/rke2/registries.yaml on every node. Air-gapped: see Air-gapped installation. |
Pod in CrashLoopBackOff | Read its logs: kubectl logs -n octostar-main <pod> --previous. |
Pod stays Pending | The node has too little CPU, memory or storage. Run kubectl describe pod <pod>. See Prerequisites. |
Pod killed (OOMKilled) | The node has too little memory. This is the most common cause of a failed install. |
UPGRADE FAILED … conflict with "kubectl-patch" | helm 4 does not overwrite a field that someone changed by hand. Put the field back, or let the chart win for that release (below). Make changes in local-env.yaml to avoid this. |
To let the chart win for one release, then run bin/update-existing.sh again, with
the release's own helmfile and helm on your PATH (see
Prerequisites):
helmfile --kube-context <ctx> -f <the helmfile named in the error> \
-l name=<release> --args=--force-conflicts sync
Uninstalling
./bin/destroy.sh --context <context-name>
destroy.sh uninstalls the releases of the install and deletes its namespaces.
The Langfuse, backup and apps-upgrade releases go with the namespace. It does not delete a cert-manager that the cluster already
had. On a minikube context it deletes the cluster. On docker-desktop it stops:
reset that cluster from the Docker Desktop UI.
⚠️ Destructive —
destroy.shremoves the Octostar deployment and its data from the targeted context. It asks you to typeyesonly when it runs in a terminal. Overssh host ./bin/destroy.sh, in CI or in a pipe, it deletes at once with no prompt. Back up first (see Backup & restore).
⚠️ Persistent volumes can stay — With
reclaimPolicy: Retain(for example the single-node Longhorn class), the volumes stay after the namespace is gone. On Longhorn they still count against the free space, so a new install on the same node may not fit. Delete the released volumes (PVs and Longhorn volumes) before you install again. The vLLM model weights also stay. Delete thevllmnamespace to remove them.
Getting help
Keep the --dump-logs file, and contact Octostar support.
Recovering from an interrupted mapping refresh
A mapping refresh (POST or PATCH /api/v1/search_api/<ontology>/refresh-opensearch-mapping)
answers 409 when a reindex was interrupted and left OpenSearch inconsistent:
a _reindex task still running with no refresh behind it, aliases split across
indices, or a data index without aliases. Recover the index before refreshing
again, and do it right away: entity upserts go through the read alias
(os_ontology_v1), but pipeline writes (processing status, materialized
annotations, scripted updates) go through the write alias
(os_ontology_v1_write), and OpenSearch refuses every one of them while that
alias spans two indices ("no write index is defined for alias").
The examples use os_ontology_v1; substitute the ontology from the 409. To
reach OpenSearch:
kubectl port-forward -n octostar-main svc/opensearch 9200 &
OS="https://localhost:9200"
AUTH="admin:<password from the opensearch-secret secret>"
0. Make sure no refresh is running
A refresh that is still running looks exactly like an interrupted one: its
_reindex task runs and its write alias spans both indices until its cleanup.
Changing anything under it makes its cleanup and rollback delete both copies.
Before going on, confirm:
- the refresh's task in the Tasks list is no longer running, or, if it shows
Running but nothing progresses, its Temporal workflow
opensearch-reindex-<task id>is closed:temporal workflow describe --workflow-id opensearch-reindex-<task id>; - no reindex is underway on purpose (another operator, an upgrade).
1. Find the state
curl -sk -u "$AUTH" "$OS/_cat/aliases/os_ontology_v1*?v"
curl -sk -u "$AUTH" "$OS/_cat/indices/os_ontology_v1*?v&h=index,docs.count,store.size,creation.date.string"
curl -sk -u "$AUTH" "$OS/_tasks?actions=*reindex&detailed=true"
| What you see | What happened | Index to keep |
|---|---|---|
| Read alias on A; write alias on A and B | Interrupted before the cutover; B is a partial copy | A |
| Read alias on B; write alias on A and B | Interrupted after the cutover, before the cleanup; A is the complete previous copy | B |
An index named os_ontology_v1 and an os_ontology_v1_v<n> in the write alias; no read alias | The first move to aliases was interrupted; the read alias is created only at its last step | os_ontology_v1 (the original) |
No alias; one or more os_ontology_v1_v<n> | A rollback after the cutover deleted the new index; the previous copy remains without aliases | The one holding the documents (docs.count) |
When in doubt, keep the index with the most documents and the latest data.
An extra os_ontology_v1_v<n> with no alias next to an index holding both
aliases causes no 409: a rollback whose _reindex OpenSearch registered late
recreated its destination as a partial copy with dynamic mappings. Delete it as
in step 4.
2. Stop a stray reindex
A _reindex task naming an os_ontology_v1 index has no worker left to cut
over or clean up. Cancel it and wait until it stops, or it recreates an index
deleted under it:
curl -sk -u "$AUTH" -X POST "$OS/_tasks/<task id>/_cancel?wait_for_completion=true"
3. Put both aliases on the index to keep
curl -sk -u "$AUTH" -X POST "$OS/_aliases" -H 'Content-Type: application/json' -d '{
"actions": [
{ "remove": { "index": "<other index>", "alias": "os_ontology_v1_write" } },
{ "remove": { "index": "<other index>", "alias": "os_ontology_v1" } },
{ "add": { "index": "<index to keep>", "alias": "os_ontology_v1" } },
{ "add": { "index": "<index to keep>", "alias": "os_ontology_v1_write" } }
]
}'
Drop the remove actions for aliases the other index doesn't have. For an
interrupted first move to aliases, add nothing: remove the write alias from
both indices instead, and the next refresh moves to aliases again. Pipeline
writes resume as soon as the write alias is on a single index.
4. Delete the other index
If you kept B after the cutover, A can hold entity edits B lacks: edits made
during the copy went through the read alias, still on A, after _reindex took
its snapshot. Copy them to B, or accept losing them, before deleting A.
Check once more that it is behind neither alias and is not the one you kept, then:
curl -sk -u "$AUTH" -X DELETE "$OS/<other index>"
5. Free the refresh slot
While the interrupted run still holds its Redis slot, a refresh POST answers
202 with that run's task id, and that task stays Running forever; the
PATCH answers 409 "reindex in progress". The slot expires on its own after
the reindex timeout plus 10 minutes. Once step 0 confirmed nothing runs, free it
at once in the platform's Redis:
redis-cli DEL octostar:opensearch_reindex:active
6. Refresh again
Re-run the mapping refresh, or the live PATCH.