Skip to content

Deploying IceHive

IceHive ships as a single Linux container image that bundles every backend binary plus a small entrypoint. You pick which workload runs via ICEHIVE_SERVICE, which aligns with Kubernetes (one Deployment per service, identical image digest).

Official release images carry the registry and tags listed on GitHub Releases (commonly ghcr.io/jamesread/icehive:<version>).

How the container starts

For every backend service the entrypoint runs:

exec "/usr/local/bin/${ICEHIVE_SERVICE}" "$@"

Anything you append after the image name (args in Kubernetes, trailing arguments after docker run) is passed straight through (for example -configdir /etc/icehive). ICEHIVE_SERVICE=frontend instead starts NGINX with the bundled web UI.

Choosing ICEHIVE_SERVICE

ICEHIVE_SERVICE value Role
frontend NGINX serving the web UI and proxying /api, /mcp, /openapi and /llms.txt to the controller
controller Connect (gRPC-compatible) HTTP API, MySQL for platform metadata, distributes worker bootstrap data
collector-github Pulls configured GitHub repositories on a cron schedule
collector-azure Azure integrations (minimal behaviour today—see service page)
collector-jmap JMAP mailbox ingestion
collector-rss RSS/Atom ingestion
collector-testdata Emits fixed test entities onto the bus
persister-mysql Dynamically tails entity messages into a sink MySQL database
persister-yaml Placeholder YAML sink (consumes bootstrap only—see service page)

Choosing how to deploy

  • Kubernetes (recommended): one Deployment per service from the same image, with probes, config mounts and the example manifest.
  • Docker: run each service as its own container. Useful for evaluation or single-host setups.

Both need MySQL and RabbitMQ, and both use the same icehive_meta settings and environment variables described below.

Operational settings (icehive_meta)

The Controller distributes AMQP URIs/exchange knobs and persister-mysql sink credentials to collectors and persisters via WorkerBootstrap. Values come from relational rows keyed by dot-separated names stored in icehive_meta (readable through the ListConfig / GetConfig / SetConfig RPCs).

Bootstrap your cluster by inserting/updating rows through migrations, kubectl exec, DBA tooling, automation that calls SetConfig, or Helm hooks.

AMQP bootstrap keys (amqp.%)

Either supply a composite URI (amqp.url) or individual fields that the Controller assembles internally before connecting.

Meta key Required / optional Meaning
amqp.url Prefer Full AMQP URI, e.g. amqp://user:pass@rabbitmq.icehive.svc:5672/vhost
amqp.host When url absent Broker hostname/IP
amqp.port Optional Broker port (5672 when blank)
amqp.user Optional Username inside URI assembly
amqp.password Optional Password inside URI assembly
amqp.vhost Optional / virtual host semantics
amqp.exchange Optional Topic exchange (ex_icehive when omitted)
amqp.routing_key_control_events Optional Routing key (control.events when omitted)

Sink database keys (persister_mysql.%)

Meta key Required Meaning
persister_mysql.host Yes Reachable hostname from persister Pods
persister_mysql.port Implicit 3306 when unset
persister_mysql.user Yes Sink DB user
persister_mysql.password Yes Sink DB password
persister_mysql.database Yes Sink logical database

If persister-mysql cannot read these rows, the YAML block persister_mysql on the controller Pod temporarily supplies sink settings as a bootstrap fallback—but normal operations should hydrate icehive_meta.


Collector-specific meta keys (github.token)

GitHub ingest reads the GetConfig("github.token") value to authenticate API calls. Store that token in icehive_meta (or set it through RPC). Treat it as a secret in Kubernetes.


Shared environment variables and flags

Name Applies to Description
ICEHIVE_SERVICE Container entrypoint Selects the binary to launch
LOG_LEVEL All backend binaries trace · debug · info · warn · error · fatal · panic (invalid → info)
ICEHIVE_CONTROLLER_URL Collectors + persisters Connect base URL (http/https, no trailing slash). Falls back to http://localhost:8080 when unset—almost never correct in-cluster
CLI -configdir All services Directory containing YAML; controller uses /opt/ih/migrations in official images when that path exists, otherwise <configdir>/migrations for dev/tests
CLI -controller Collectors + persisters Overrides ICEHIVE_CONTROLLER_URL when non-empty
CLI -listen All services HTTP bind address; defaults per binary but YAML listen wins when present

Service-specific YAML keys are documented on each service page under Configuration.