{"id":20655048,"url":"https://github.com/devops-ia/kafka-cruise-control","last_synced_at":"2026-06-10T09:31:34.221Z","repository":{"id":47117786,"uuid":"478536855","full_name":"devops-ia/kafka-cruise-control","owner":"devops-ia","description":"Image Cruise Control for Apache Kafka","archived":false,"fork":false,"pushed_at":"2026-06-03T08:06:06.000Z","size":142,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-03T10:05:52.789Z","etag":null,"topics":["cruise-control","docker","kafka","monitoring"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/r/devopsiaci/cruise-control/tags","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devops-ia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-04-06T11:50:42.000Z","updated_at":"2026-06-03T08:06:08.000Z","dependencies_parsed_at":"2025-12-03T14:04:09.007Z","dependency_job_id":null,"html_url":"https://github.com/devops-ia/kafka-cruise-control","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devops-ia/kafka-cruise-control","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devops-ia%2Fkafka-cruise-control","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devops-ia%2Fkafka-cruise-control/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devops-ia%2Fkafka-cruise-control/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devops-ia%2Fkafka-cruise-control/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devops-ia","download_url":"https://codeload.github.com/devops-ia/kafka-cruise-control/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devops-ia%2Fkafka-cruise-control/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34146871,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cruise-control","docker","kafka","monitoring"],"created_at":"2024-11-16T18:08:40.497Z","updated_at":"2026-06-10T09:31:33.936Z","avatar_url":"https://github.com/devops-ia.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cruise Control for Apache Kafka\n\n## Introduction\n\nOptimized multi-stage Docker images for Cruise Control and Cruise Control UI for Apache Kafka. Based on [linkedin/cruise-control](https://github.com/linkedin/cruise-control).\n\n- **Cruise Control Server**: Java-based service for managing Kafka clusters\n- **Cruise Control UI**: Nginx-based web interface with multi-cluster support\n- **Multi-stage builds**: Optimized images with separate build and runtime stages\n- **Security**: Non-root users and minimal attack surface\n- **AWS MSK IAM Auth**: Built-in support for AWS MSK authentication\n\nDefault versions:\n\n- Cruise Control: `3.0.3`\n- Cruise Control UI: `0.4.0`\n- AWS IAM Auth: `2.3.5`\n- Java (Amazon Corretto): `17`\n- Nginx: `1.25-alpine`\n\n## Available images\n\nThe build process generates two separate images:\n\n1. **cruise-control**: Server component (Java-based)\n2. **cruise-control-ui**: Web interface (Nginx-based)\n\n[**View all available tags**](https://hub.docker.com/r/devopsiaci/cruise-control/tags)\n\n## Architecture\n\nThe Dockerfile uses a multi-stage build approach:\n\n```text\n┌─────────────────┐\n│  Build Stage    │  Amazon Corretto + Git\n│  (build)        │  - Clone Cruise Control\n│                 │  - Download UI assets\n│                 │  - Compile JAR files\n│                 │  - Download AWS MSK IAM Auth\n└────────┬────────┘\n         │\n         ├──────────────────────┬─────────────────────┐\n         │                      │                     │\n┌────────▼────────┐    ┌────────▼────────┐   ┌───────▼──────┐\n│ cruise-control  │    │cruise-control-ui│   │  Artifacts   │\n│                 │    │                 │   │   Discarded  │\n│ Runtime: Java   │    │ Runtime: Nginx  │   └──────────────┘\n│ User: nobody    │    │ User: nginx     │\n│ Port: 9090      │    │ Port: 80        │\n└─────────────────┘    └─────────────────┘\n```\n\n## Quick start\n\n### `cruise-control`\n\nRun the server component:\n\n```bash\ndocker run --name cruise-control-server \\\n  -p 9090:9090 \\\n  -v $(pwd)/config:/cruise-control/config \\\n  devopsiaci/cruise-control:jdk17-cc3.0.3-iam2.3.5\n```\n\n### `cruise-control-ui`\n\nRun the UI component with multi-cluster support:\n\n```bash\ndocker run --name cruise-control-ui \\\n  -p 8080:80 \\\n  -v $(pwd)/config.csv:/usr/share/nginx/html/static/config.csv:ro \\\n  devopsiaci/cruise-control-ui:0.4.0\n```\n\nThe `config.csv` file format for multi-cluster configuration:\n\n```csv\n\u003cgroup\u003e,\u003ccluster-name\u003e,\u003ccruise-control-url\u003e\ndevelop,cluster-dev,/cluster-dev/kafkacruisecontrol/\nstaging,cluster-staging,/cluster-staging/kafkacruisecontrol/\ncluster,cluster-prod,/cluster-prod/kafkacruisecontrol/\n```\n\n## Configuration\n\n### Configure `cruise-control.properties`\n\nYou must customize the configuration file with your Kafka cluster details. Review the sample configuration:\n\n- [Sample cruisecontrol.properties](./config/cruisecontrol.properties)\n- [LinkedIn Cruise Control configs](https://github.com/linkedin/cruise-control/tree/3.0.3/config)\n\nRequired configuration values:\n\n```properties\nbootstrap.servers=\u003ckafka-broker-1\u003e:9092,\u003ckafka-broker-2\u003e:9092\nzookeeper.connect=\u003czookeeper-1\u003e:2181,\u003czookeeper-2\u003e:2181\n\n# Webserver configuration\nwebserver.http.port=9090\nwebserver.api.urlprefix=/kafkacruisecontrol\nwebserver.session.path=/\n\n# Topic configuration\npartition.metric.sample.store.topic=__CruiseControlMetrics\nbroker.metric.sample.store.topic=__CruiseControlModelTrainingSamples\nmetric.reporter.topic=__CruiseControlMetrics\n```\n\n### Multi-cluster UI configuration\n\nCreate a `config.csv` file to configure multiple Kafka clusters in the UI:\n\n```csv\ndevelop,dev-kafka,/dev/kafkacruisecontrol/\ndevelop,dev-kafka-2,/dev-2/kafkacruisecontrol/\nstaging,staging-kafka,/staging/kafkacruisecontrol/\ncluster,prod-kafka,/prod/kafkacruisecontrol/\ncluster,prod-kafka-dr,/prod-dr/kafkacruisecontrol/\n```\n\nFormat: `\u003cgroup\u003e,\u003ccluster-name\u003e,\u003cpath-to-cruise-control-api\u003e`\n\nThe UI will group clusters by the first column, making it easier to manage multiple environments.\n\n## Build custom images\n\n### Build arguments\n\nAvailable build arguments:\n\n| Argument | Default | Description |\n|----------|---------|-------------|\n| `OPENJDK_VERSION` | `17` | Amazon Corretto Java version |\n| `NGINX_VERSION` | `1.25-alpine` | Nginx version for UI |\n| `CC_TAG` | `3.0.3` | Cruise Control version |\n| `CC_UI_TAG` | `0.4.0` | Cruise Control UI version |\n| `AWS_MSK_IAM_AUTH_VERSION` | `2.3.5` | AWS MSK IAM Auth library version |\n\n### Build both Images\n\nBuild the `cruise-control` server:\n\n```bash\ndocker build \\\n  --target cruise-control \\\n  --build-arg CC_TAG=3.0.3 \\\n  --build-arg OPENJDK_VERSION=17 \\\n  --build-arg AWS_MSK_IAM_AUTH_VERSION=2.3.5 \\\n  -t my-cruise-control:latest \\\n  .\n```\n\nBuild the `cruise-control-ui`:\n\n```bash\ndocker build \\\n  --target cruise-control-ui \\\n  --build-arg CC_UI_TAG=0.4.0 \\\n  --build-arg NGINX_VERSION=1.25-alpine \\\n  -t my-cruise-control-ui:latest \\\n  .\n```\n\n### Build with different `Java` version\n\nIMPORTANT: Kafka and Cruise Control must use the same Java version.\n\n```bash\ndocker build \\\n  --target cruise-control \\\n  --build-arg OPENJDK_VERSION=11 \\\n  -t cruise-control:jdk11 \\\n  .\n```\n\nSupported Java versions: [Amazon Corretto tags](https://hub.docker.com/_/amazoncorretto/tags)\n\n### Build with different cruise-control version\n\nCheck compatibility before changing versions:\n\n- [Environment Requirements](https://github.com/linkedin/cruise-control#environment-requirements)\n- [Known Compatibility Issues](https://github.com/linkedin/cruise-control#known-compatibility-issues)\n\n```bash\ndocker build \\\n  --target cruise-control \\\n  --build-arg CC_TAG=2.5.138 \\\n  -t cruise-control:2.5.138 \\\n  .\n```\n\n## `docker-compose` sample\n\nExample `docker-compose.yml` for running both server and UI:\n\n```yaml\nversion: '3.8'\n\nservices:\n  cruise-control:\n    image: devopsiaci/cruise-control:jdk17-cc3.0.3-iam2.3.5\n    container_name: cruise-control-server\n    ports:\n      - \"9090:9090\"\n    volumes:\n      - ./config:/cruise-control/config:ro\n    environment:\n      JAVA_OPTS: \"-Xms512m -Xmx2g -Djava.security.egd=file:/dev/./urandom\"\n    restart: unless-stopped\n\n  cruise-control-ui:\n    image: devopsiaci/cruise-control-ui:0.4.0\n    container_name: cruise-control-ui\n    ports:\n      - \"8080:80\"\n    volumes:\n      - ./config.csv:/usr/share/nginx/html/static/config.csv:ro\n    restart: unless-stopped\n    depends_on:\n      - cruise-control\n```\n\n## Nginx reverse proxy configuration\n\nIf you need to serve the UI under a specific path (e.g., `/cruise-control`), configure your reverse proxy:\n\n### Nginx configuration\n\n```nginx\nlocation /cruise-control {\n    # Rewrite path\n    rewrite ^/cruise-control/(.*) /$1 break;\n\n    # Proxy configuration\n    proxy_pass http://cruise-control-ui:80;\n    proxy_pass_request_headers on;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n\n    # Rewrite static assets\n    sub_filter /static/js          /cruise-control/static/js;\n    sub_filter /static/css         /cruise-control/static/css;\n    sub_filter /static/cc-logo.png /cruise-control/static/cc-logo.png;\n    sub_filter /kafkacruisecontrol /cruise-control/kafkacruisecontrol;\n    sub_filter_last_modified on;\n    sub_filter_once off;\n    sub_filter_types *;\n}\n```\n\n## Contributing\n\nContributions are welcome! Please open an issue or submit a pull request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevops-ia%2Fkafka-cruise-control","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevops-ia%2Fkafka-cruise-control","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevops-ia%2Fkafka-cruise-control/lists"}