{"id":13566143,"url":"https://github.com/jippi/hashi-ui","last_synced_at":"2025-09-29T01:30:36.801Z","repository":{"id":14160535,"uuid":"64083411","full_name":"jippi/hashi-ui","owner":"jippi","description":"A modern user interface for @hashicorp Consul \u0026 Nomad","archived":true,"fork":false,"pushed_at":"2023-02-25T01:33:25.000Z","size":9486,"stargazers_count":1232,"open_issues_count":69,"forks_count":148,"subscribers_count":44,"default_branch":"master","last_synced_at":"2024-09-27T04:22:45.167Z","etag":null,"topics":["consul","consul-configuration","consul-template","devops","devops-tools","docker","hashi-ui","hashicorp","hashicorp-consul","hashicorp-nomad","nomad","nomad-configuration","nomad-server","react","ui"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/jippi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-07-24T20:05:06.000Z","updated_at":"2024-09-26T05:11:52.000Z","dependencies_parsed_at":"2024-01-08T01:44:52.417Z","dependency_job_id":"69a34d7c-bb62-4255-94c6-d2679908ac20","html_url":"https://github.com/jippi/hashi-ui","commit_stats":{"total_commits":1064,"total_committers":65,"mean_commits":"16.369230769230768","dds":0.6541353383458647,"last_synced_commit":"32c792ff9e5ced770dbd491b222434712689c4d5"},"previous_names":["iverberk/nomad-ui"],"tags_count":68,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jippi%2Fhashi-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jippi%2Fhashi-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jippi%2Fhashi-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jippi%2Fhashi-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jippi","download_url":"https://codeload.github.com/jippi/hashi-ui/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234579583,"owners_count":18855636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["consul","consul-configuration","consul-template","devops","devops-tools","docker","hashi-ui","hashicorp","hashicorp-consul","hashicorp-nomad","nomad","nomad-configuration","nomad-server","react","ui"],"created_at":"2024-08-01T13:02:03.135Z","updated_at":"2025-09-29T01:30:36.305Z","avatar_url":"https://github.com/jippi.png","language":"JavaScript","funding_links":[],"categories":["JavaScript","System jobs","ui","Links","devops"],"sub_categories":["UI"],"readme":"Hashi UI [![Build Status](https://travis-ci.org/jippi/hashi-ui.svg?branch=master)](https://travis-ci.org/jippi/hashi-ui)\n========\n[![Code Quality: Javascript](https://img.shields.io/lgtm/grade/javascript/g/jippi/hashi-ui.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/jippi/hashi-ui/context:javascript)\n[![Total Alerts](https://img.shields.io/lgtm/alerts/g/jippi/hashi-ui.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/jippi/hashi-ui/alerts)\n\n[![Join the chat at https://gitter.im/hashi-ui/Lobby](https://badges.gitter.im/hashi-ui/Lobby.svg)](https://gitter.im/hashi-ui/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![Docker Stars](https://img.shields.io/docker/stars/jippi/hashi-ui.svg)](https://hub.docker.com/r/jippi/hashi-ui/)\n[![Docker Pulls](https://img.shields.io/docker/pulls/jippi/hashi-ui.svg)](https://hub.docker.com/r/jippi/hashi-ui/)\n\nAn awesome user interface (even for mobile devices!) for HashiCorp Consul \u0026 Nomad, plain and simple :-)\n\n![Hashi UI](https://photos-1.dropbox.com/t/2/AAAlaj58EMrlMs0OnIzJ5mdEW_nL_1D9VG34ZtEtyt9q4Q/12/27514/jpeg/32x32/3/1506114000/0/2/cluster-overview-small.jpg/EI74IBjWwZDkBCAHKAc/KKeQKoMcAJemYXbzAnpkb77O5ajxj7I-qD4bE44eMXk?dl=0\u0026size=2048x1536\u0026size_mode=3)\n\n[View more screenshots of Nomad \u0026 Consul interface](https://www.dropbox.com/sh/lce7ya1zsa6rjm8/AADH6hYQSnW-KxKkIybiOK9ta?dl=0)\n\n# TOC\n\n- [Why](#why)\n- [Usage](#usage)\n- [Configuration](#configuration)\n  * [General Configuration](#general-configuration)\n  * [Nomad Configuration](#nomad-configuration)\n  * [Consul Configuration](#consul-configuration)\n  * [Instrumentation Configuration](#instrumentation-configuration)\n  * [Running in AWS](#running-in-aws)\n  * [Running in Docker Compose](#running-in-docker-compose)\n- [Try](#try)\n  * [Nomad](#nomad)\n  * [Consul](#consul)\n- [Development \u0026 Build](#development---build)\n\n# Why\n\nFor Nomad, it was quite simple, no mobile-optimized, (somewhat) feature-complete and live-updating interface existed.\n\nFor Consul, the built-in UI is decent, but lacks a variety of essential features:\n\n- Live update of Services, Nodes and Key/Value lists (nobody likes to refresh)\n- More API complete (e.g. unregister services and services checks directly from UI)\n- CAS (Check-And-Set) support in both Write and Delete actions for KV, preventing accidental modification or deleting of keys that have changed since you loaded them.\n- KV breadcrumbs could not be used for navigation\n- Sorting KV folders and keys separately (always folders first)\n- More inter-linking between services/nodes\n\nToday the Consul and Nomad UI exist in the same binary, but do not \"cross-talk\" to each other, but long term goal is to integrate them even closer, so from Nomad Job UI you can see Consul health check status for the job tasks, and vice versa be able to cross-link between two otherwise distinct systems.\n\nLong term, **Vault** support would be an amazing addition to the UI, contributions are more than welcome on this!\n\n# Usage\n\n\u003e Until Hash-UI reaches 1.x, development efforts will focus on the latest versions of HashiCorp products\n\nDownload the latest release from the Github repository and start it with:\n\n```\n# if you got Nomad running on localhost\n./hashi-ui-\u003cos\u003e-\u003carch\u003e --nomad-enable\n\n# if you got Nomad running on a specific Protocol/IP/Port\n./hashi-ui-\u003cos\u003e-\u003carch\u003e --nomad-enable --nomad-address http://IP:Port\n\n# if you got Consul running on localhost\n./hashi-ui-\u003cos\u003e-\u003carch\u003e --consul-enable\n\n# if you got Consul running on a specific IP/Port\n./hashi-ui-\u003cos\u003e-\u003carch\u003e --consul-enable  --consul-address IP:Port\n\n# if you got nomad and Consul running on localhost\n./hashi-ui-\u003cos\u003e-\u003carch\u003e --nomad-enable --consul-enable\n```\n\nThis will start the hashi-ui server that will try to connect to local\nnomad server. The frontend can be accessed on port `3000` by default.\nYou can override this with the `-listen-address`.\n\nAnother way to run hashi-ui is through Docker. Run the following command to\nstart a webserver that will serve the application.\n\n```sh\n# nomad only\ndocker run -e NOMAD_ENABLE=1 -e NOMAD_ADDR=... -p 8000:3000 jippi/hashi-ui\n# consul only\ndocker run -e CONSUL_ENABLE=1 -e CONSUL_ADDR=... -p 8000:3000 jippi/hashi-ui\n# consul only with https\ndocker run -e CONSUL_HTTP_TOKEN=one_ring -e CONSUL_HTTP_SSL_VERIFY=false -e CONSUL_HTTP_SSL=true CONSUL_ENABLE=1 -e CONSUL_ADDR=... -p 8000:3000 jippi/hashi-ui\n# nomad + consul\ndocker run -e NOMAD_ENABLE=1 -e NOMAD_ADDR=... -e CONSUL_ENABLE=1 -e CONSUL_ADDR=... -p 8000:3000 jippi/hashi-ui\n```\n\nCheck the releases page on GitHub to see which version is current.\n\nThe user interface will be accessible on localhost, port `8000`. Adjust the Docker\nrun parameters as needed. If you need to change the port that Nomad is listening\non, you should do it with `-e NOMAD_ADDR` environment variable that contains\nboth hostname and port.\n\n# Configuration\n\nhashi-ui can be controlled by both ENV or CLI flags as described below\n\n## General Configuration\n\n| Environment        \t       | CLI (`--flag`)              | Default                 \t    | Description                                                                                                      |\n|----------------------------|-----------------------------|---------------------------- |------------------------------------------------------------------------------------------------------------------|\n| `LOG_LEVEL` \t             | `log-level`                 | `info`                  \t| Log level to use while running the hashi-ui server - (`critical`, `error`, `warning`, `notice`, `info`, `debug`) |\n| `PROXY_ADDRESS`            | `proxy-address` \t           | `\u003cempty\u003e`               \t| (optional) The base URL of the UI when running behind a reverse proxy (ie: example.com/nomad/)                   |\n| `LISTEN_ADDRESS`           | `listen-address`            | `0.0.0.0:3000`              | The IP + PORT to listen on |\n| `HTTPS_ENABLE`             | `https-enable`              | `false`                     | Use HTTPS instead of HTTP for Hashi-UI |\n| `SERVER_CERT`              | `server-cert`               | `\u003cempty\u003e`                   | Server certificate to use when HTTPS is enabled |\n| `SERVER_KEY`               | `server-key`                | `\u003cempty\u003e`                   | Server key to use when HTTPS is enabled |\n| `SITE_TITLE`               | `site-title`                | `\u003cempty\u003e`                   | Free-form text to be prepended to title-bar; eg. \"Staging\" |\n| `UPDATE_THROTTLE_DURATION` | `throttle-update-duration`  | `\u003cempty\u003e`                   | Duration to sleep before polling Nomad/Consul for updates. Useful in busy clusters ([example: `5s`, `250ms`](https://golang.org/pkg/time/#ParseDuration)) |\n\n## Nomad Configuration\n\n| Environment        \t  |CLI (`--flag`)    \t      | Default                 \t| Description                                                                                                      |\n|-------------------------|---------------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------|\n| `NOMAD_ENABLE`          | `nomad-enable`      \t  | `false` \t                | Use `--nomad.enable` or env `NOMAD_ENABLE=1` to enable Nomad backend                                             |\n| `NOMAD_ADDR`            | `nomad-address`      \t  | `http://127.0.0.1:4646` \t| Protocol + Host + Port for your Nomad instance                                                                   |\n| `NOMAD_ACL_TOKEN`  \t  | `nomad-acl-token`   \t  | `\u003cempty\u003e` \t\t          \t| The Nomad access token to use (optional)                                                                        |\n| `NOMAD_READ_ONLY`    \t  | `nomad-read-only`   \t  | `false` \t\t        \t| Should hash-ui allowed to modify Nomad state (stop/start jobs and so forth)\t                                   |\n| `NOMAD_CACERT`      \t  | `nomad-ca-cert`      \t  | `\u003cempty\u003e`   \t            | (optional) path to a CA Cert file (remember to use `https://` in `NOMAD_ADDR` if you enable TLS)                 |\n| `NOMAD_CLIENT_CERT`  \t  | `nomad-client-cert`       | `\u003cempty\u003e` \t                | (optional) path to a client cert file (remember to use `https://` in `NOMAD_ADDR` if you enable TLS)             |\n| `NOMAD_CLIENT_KEY`  \t  | `nomad-client-key`        | `\u003cempty\u003e` \t                | (optional) path to a client key file (remember to use `https://` in `NOMAD_ADDR` if you enable TLS)          \t   |\n| `NOMAD_PORT_http` \t  | `\u003cnone\u003e` \t              | `0.0.0.0:3000`          \t| The IP + PORT to listen on (will overwrite `LISTEN_ADDRESS`)                                                     |\n| `NOMAD_HIDE_ENV_DATA`   | `nomad-hide-env-data` \t  | `false`          \t        | Whether Nomad env{} values should be hidden (will prevent updating jobs in the UI)                               |\n| `NOMAD_ALLOW_STALE`     | `nomad-allow-stale` \t  | `true`          \t        | Whether Hashi-UI should use stale mode when connecting to the nomad-api servers                                  |\n| `NOMAD_COLOR`           | `nomad-color` \t          | `#4b9a7d`          \t        | Set the main color for nomad related screens.                                                                    |\n\n## Consul Configuration\n\n| Environment        \t  |CLI (`--flag`)   \t      | Default                     | Description                                                                                                      |\n|-------------------------|-------------------------  |-----------------------------|------------------------------------------------------------------------------------------------------------------|\n| `CONSUL_ENABLE`         | `consul-enable`      \t  | `false` \t                | Use `--consul-enable` or env `CONSUL_ENABLE=1` to enable Consul backend                                          |\n| `CONSUL_ADDR`           | `consul-address`    \t  | `127.0.0.1:8500`            | Host + Port for your Consul server, e.g. localhost:8500` (Do not include protocol)                               |\n| `CONSUL_READ_ONLY`  \t  | `consul-read-only`   \t  | `false` \t\t            | Should hash-ui be allowed to modify Consul state (modify KV, Services and so forth)                              |\n| `CONSUL_ACL_TOKEN`  \t  | `consul-acl-token`   \t  | `\u003cempty\u003e` \t\t          \t| The Consul access token to use (optional)                                                                        |\n| `CONSUL_HTTP_TOKEN`     | `\u003cempty\u003e`                 | `\u003cempty\u003e`                   | Synonym for `CONSUL_ACL_TOKEN`                                                                                   |\n| `CONSUL_HTTP_SSL_VERIFY`| `\u003cempty\u003e`                 | `true`                      | Choose if you want your certificate to be verified (Likely to choose false if you have a custom SSL certificate) |\n| `CONSUL_HTTP_SSL`       | `\u003cempty\u003e`                 | `false`                     | Enable HTTPS client to consul                                                                                    |\n| `CONSUL_CACERT`      \t  | `\u003cempty\u003e`      \t          | `\u003cempty\u003e`   \t            | (optional) path to a CA Cert file (remember to set `CONSUL_HTTP_SSL` to true)                                    |\n| `CONSUL_CLIENT_CERT`    | `\u003cempty\u003e`                 | `\u003cempty\u003e` \t                | (optional) path to a client cert file (remember to set `CONSUL_HTTP_SSL` to true)                                |\n| `CONSUL_CLIENT_KEY`  \t  | `\u003cempty\u003e`                 | `\u003cempty\u003e` \t                | (optional) path to a client key file (remember to set `CONSUL_HTTP_SSL` to true)          \t                   |\n| `CONSUL_COLOR`          | `consul-color` \t          | `#694a9c`          \t        | Set the main color for consul related screens.                                                                   |\n\n## Running behind a Load Balancer\n\nWhen Running Hashi UI behind AWS, an ALB is preferable as it supports HTTP websockets. Alternatively a NLB or ELB in 'TCP' mode will suffice.\n\n\nHashi-UI exposes a `/_status` endpoint that can be used to check the health of Nomad and Consul endpoints.\n\n## Running in Docker Compose\n\nWhen running Hashi UI in [Docker Compose](https://docs.docker.com/compose/), configure Consul with the following environment variable for Hashi UI's deregister button to work.\n\n```\nservices:\n  consul:\n    image: consul\n    environment:\n      CONSUL_BIND_INTERFACE: eth0\n```\n\n# Try\n\n## Nomad\n\nYou need a running nomad server to try Hashi UI:\n\n```\nnomad agent -server -client -bootstrap-expect 1 -data-dir /tmp/nomad\n```\n\nNow you can run Hashi UI in other terminal (we assume you have it in PATH):\n\n```\nhashi-ui-\u003cos\u003e-\u003carch\u003e --nomad-enable\n```\n\nOpen browser and visit [http://127.0.0.1:3000](http://127.0.0.1:3000).\n\n## Consul\n\nYou can run the Consul UI against the official HashiCorp Consul demo like this:\n\n```\nhashi-ui-\u003cos\u003e-\u003carch\u003e --consul-enable --consul-address demo.consul.io\n```\n\nOpen browser and visit [http://127.0.0.1:3000](http://127.0.0.1:3000).\n\n## Troubleshooting\n\n- Log lines like `19:25:54.105 nomad_hub.go:69 ▶ ERROR  transport: websocket upgrade failed: websocket: could not find connection header with token 'upgrade'` and the web interface is not working.\n  - Ensure your load balancer is treating the services as TCP on port 80 (and SSL on 443). Websockets can't use HTTP/HTTPS mode.\n\n# Contributing \u0026 Development\n\nIf you would like to contribute (Thanks ! \u003c3) please open a pull-request with your code change or a RFC issue.\n\nSee [DEVELOPMENT.md](https://github.com/jippi/hashi-ui/blob/master/DEVELOPMENT.md) for information on how to get started with hacking on hashi-ui.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjippi%2Fhashi-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjippi%2Fhashi-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjippi%2Fhashi-ui/lists"}