{"id":22352163,"url":"https://github.com/vodolaz095/dashboard","last_synced_at":"2026-04-11T14:06:01.617Z","repository":{"id":266116410,"uuid":"799679236","full_name":"vodolaz095/dashboard","owner":"vodolaz095","description":"Minimalistic golang dashboard","archived":false,"fork":false,"pushed_at":"2025-06-13T10:51:21.000Z","size":841,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-13T11:38:10.461Z","etag":null,"topics":["dashboard","golang","metrics","metrics-exporter","minimal","mysql","postgresql","promql","redis","server-sent-events","shell","victoriametrics"],"latest_commit_sha":null,"homepage":"","language":"Go","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/vodolaz095.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":["https://www.tinkoff.ru/rm/ostroumov.anatoliy2/4HFzm76801/"]}},"created_at":"2024-05-12T20:59:43.000Z","updated_at":"2025-06-13T10:50:07.000Z","dependencies_parsed_at":"2025-05-02T13:20:09.474Z","dependency_job_id":"038b606f-9b7d-4180-8cfc-a2f9351b17c6","html_url":"https://github.com/vodolaz095/dashboard","commit_stats":null,"previous_names":["vodolaz095/dashboard"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/vodolaz095/dashboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fdashboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fdashboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fdashboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fdashboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vodolaz095","download_url":"https://codeload.github.com/vodolaz095/dashboard/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fdashboard/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266404940,"owners_count":23923490,"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","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["dashboard","golang","metrics","metrics-exporter","minimal","mysql","postgresql","promql","redis","server-sent-events","shell","victoriametrics"],"created_at":"2024-12-04T12:17:35.597Z","updated_at":"2026-04-11T14:06:01.610Z","avatar_url":"https://github.com/vodolaz095.png","language":"Go","funding_links":["https://www.tinkoff.ru/rm/ostroumov.anatoliy2/4HFzm76801/"],"categories":[],"sub_categories":[],"readme":"Vodolaz095's Dashboard\n======================\nMinimalistic and DDOS-proof Golang powered dashboard\n\nUsage example\n======================\nConsider your business depends on MySQL database of CRM, PostgreSQL database for shipping,\nfew 3rd party APIs (like get balance of bank account), redis database with real time machinery state and few scripts\nyou are running on servers on site to see its working. \nSo, important readings can be, for example, \n\n- number of active orders in MySQL database of CRM extracted by query like \n```sql\nSELECT COALESCE(count(orders.id),0) as \"orders_pending\"\nFROM orders\nWHERE DATE(orders.created_at) = CURDATE() and orders.status=1;\n```\n\n- number of completed orders extracted this way\n```sql\nSELECT COALESCE(count(orders.id),0) as \"orders_completed\"\nFROM orders\nWHERE DATE(orders.created_at) = CURDATE() and orders.status=2;\n```\n\n- query like this (with stored procedure) is used to count active deliveries in PostgreSQL\n```sql\nSELECT doCountActiveDeliveries(CURDATE());\n```\n \n- real time machinery readings are extracted by redis commands like this one\n```\n127.0.0.1:6379\u003e hget reactor1 power_output\n```\n\n- bank account can be checked by sending HTTP POST request to, for example, https://example.org/api/v1/rpc\n\nChecking every parameter separately can be automated by scripts, but making it all easy and in one place\ncan be complicated. It can be wise idea to combine all these readings in single dashboard available for all stakeholders \nand important employees, so they can have eagle's eye perspective on what is happening. It can be wise to conceal \nsome technical data (like database connection strings) but, in general, all important data should be available \non single page in a way it can be understood by general audience without technical skills.\n\nExample dashboard screenshots\n=====================\n![dashboard_example.png](contrib%2Fdashboard_example.png)\n![elinks.png](contrib%2Felinks.png)\n![mobile.jpg](contrib%2Fmobile.jpg)\n\nArchitecture\n=====================\nApplication has list of in-memory sensors.\nHTTP server load sensor values from memory, so databases cannot be DDoSed.\nBackground process updates sensors' readings using [defered queue](https://github.com/vodolaz095/dqueue), \nseparate goroutines keep readings updates via external events (http requests, redis subscription messages, etc.).\n\n\n\nMain features\n======================\n1. Manifold of very hackable sensors - MySQL/PostgreSQL queryes, Redis sync and subscription, Victoria Metrics single query api\n   file, remote HTTP endpoint, periodical shell command execution, local HTTP POST endpoint updated by remote script with secret token.\n2. Single cross-platform binary with simple `yaml` encoded config\n3. Light-weight (dashboard has ~1 kb [style.css](assets%2Fstyle.css), ~1 kb [feed.js](assets%2Ffeed.js) and ~ 5kb \n   main page)- works ok even on IPhone 6 and 2013 year Android Smartphones\n4. Real time updates using [SSE](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)\n5. JSON and [Prometheous v4](https://prometheus.io/docs/instrumenting/exposition_formats/#text-format-example)\n   endpoints to read sensors readings\n6. DDOS (distributed denial of service attacks) proof - sensors readings are updated in memory by background goroutines \n   and served by HTTP server from memory. No matter how many clients open dashboard - they receive values from memory,\n   no extra calls to database and other resources are issued. \n7. Database access credentials, tokens, passwords and other sensitive data is concealed from visitors.\n\n\nPossible alternatives\n======================\nRequirement - simple realtime dashboard with list of sensors readings, containing actual numerical values \nand some technical background (minimum, maximum, link to wiki) available for all team members.\nNo historical charts required. Numerical values can be extracted by SQL requests, HTTP requests and so on.\nData can be (but not required to) stored to some 3rd party time series database.\n`Pros` here means what does alternative have, and my dashboard - do not, and `cons` describes why\nalternative was discarded.\n\n\nAlternative 1. [monit](https://mmonit.com/monit/)\n- Pros: Easy to setup, lots of plugins, [powerfull scripting language](https://mmonit.com/monit/documentation/monit.html#MYSQL) to write tests.\n- Cons: dashboard requires password based authorization, with misconfigured board user can start/stop services.\n  Complicated scripting language, writing sensor extracting metrics from *SQL database was painful since it required \n  to write shell scripts...\n- Conclusion: overcomplicated.\n\nAlternative 2. [grafana](https://grafana.com/)\n- Pros: popular system with years of production service\n- Cons: too complicated, hard to setup, authorization required for users to view charts data.\n  3rd party tools are required to extract sensors' readings from observable servers.\n  3rd party tools (Influxdb, Prometheus, etc) are required to store data being visualized.\n- Conclusion: overcomplicated.\n\nAlternative 3. [zabbix](https://www.zabbix.com/)\n- Pros: popular system with years of production service\n- Cons: too complicated, hard to setup, authorization required for users to view charts data.\n- Conclusion: overcomplicated.\n\n\nAlternative 4. [netdata](https://www.netdata.cloud/)\n- Pros: lot of plugins, fancy UI, quite easy to setup.\n- Cons: webui is quite heavy, works slow via 3G mobile connection. I just need table with few actual readings.\n- Conclusion: overcomplicated.\n\n\nAlternative 5. [Influxdb v2](https://docs.influxdata.com/influxdb/v2/) + [Telegraf](https://docs.influxdata.com/telegraf/v1/)\n- Pros: telegraf has lots of inputs and outputs, which are quite easy to configure. Easy to make dashboards in Influxdb. Historical data available. \n  Our dashboard can [send data directly to Influxdb via wire protocol](docs%2Fexport_influx.md).\n- Cons: Influxdb doesn't render UI without authorization. Loading simple dashboard eats 12+ mb of traffic. Telegraf \n  does not have easy to use web UI to read actual data manually.\n- Conclusion: overcomplicated.\n\nQuickstart\n======================\n\n1. Obtain suitable binary from https://github.com/vodolaz095/dashboard/releases\n2. Copy configuration example with comments [dashboard.yaml](contrib%2Fdashboard.yaml),\n   and change parameters to your own and start application in this way:\n\n   ```shell\n     \n     $ dashboard /path/to/dashboard_config.yaml\n     \n   ```\n\n3. See [deployment](docs%2Fdeployment.md) how to ran application for production.\n\nSecurity\n=============================\n1. All sensor readings are available to all dashboard users, while database access credentials and database queries are concealed\n2. Dashboard WebUI access can be restricted either by reverse proxy, or it can be served only in local network - so\n   if somebody can view this dashboard - he/she is allowed to do to.\n3. Updating dashboard is performed automatically\n4. Configuring dashboard is done by system administrators, allowed to work with data required.\n\n\nConfiguration\n=======================\n- [Defining database connections pool in config](docs%2Fconnection_pool.md)\n- [Logging](docs%2Flogging.md)\n- [Dashboard customization](docs%2Fui_customization.md)\n- [Exporting data via HTTP transport](docs%2Fexport_http.md)\n- [Exporting data via redis publishers](docs%2Fexport_redis_.md)\n- [Exporting sensor data into InfluxDB via wire protocol](docs%2Fexport_influx.md)\n- [Exporting sensor data into Prometheus/InfluxDB via scrapper](docs%2Fexport_metrics.md)\n- [Linking few dashboards via redis pub/sub](docs%2Flinking_via_redis.md)\n- [Deployment](docs%2Fdeployment.md)\n\nSensors documentation\n==========================\n- [Shared sensor parameters](docs%2Fsensor_shared.md)\n- [Shell sensor](docs%2Fsensor_shell.md)\n- [Linux system sensor](docs%2Fsensor_linux_system.md)\n- [MySQL/PostgreSQL sensor](docs%2Fsensor_sql.md)\n- [Redis sensor (synchronous and subscriber)](docs%2Fsensor_redis.md)\n- [File sensor which reads data from file](docs%2Fsensor_file.md)\n- [Victoria Metrics instant query](docs%2Fsensor_victoria_metrics.md)\n- [Incoming HTTP POST request / endpoint / webhook sensor](docs%2Fsensor_endpoint.md)\n- [Outgoing HTTP Request (CURL) sensor](docs%2Fsensor_curl.md)\n- [Creating your own sensor](docs%2Fsensor_your_own.md)\n\nDevelopment using golang compiler on host machine\n=============================\nApplication requires [Golang 1.22.0](https://go.dev/dl/) and [GNU Make](https://www.gnu.org/software/make/) installed.\n\n```shell\n\n# ensure development tools in place\n$ make tools\n\n# ensure golang modules are installed\n$ make deps\n\n# start application for development using configuration from contrib/dashboard.yaml on http://localhost:3000\n$ make start\n\n# build production grade binary at `build/dashboard`\n$ make build\n\n```\n\nMySQL, PostgreSQL, Redis and Influxdb can be started by docker/podman\n\n```shell\n\n# start development databases (depending on what container engine is available)  \n$ make docker/resource\n$ make podman/resource\n\n```\n\nDevelopment using docker + docker compose\n=============================\n[GNU Make](https://www.gnu.org/software/make/), [Docker engine](https://docs.docker.com/engine/install/) with\n[compose plugin](https://docs.docker.com/compose/install/linux/) should be installed.\nInstalling golang toolchain on host machine is not required.\n\n```shell\n\n# start development databases and build and start application on http://localhost:3001 \n$ make docker/up\n\n# start development databases  \n$ make docker/resource\n\n# stop all\n$ make docker/down\n\n# prune all development environment\n$ make docker/prune\n\n\n```\n\n\nDevelopment using podman + podman-compose\n=============================\nInstalling golang toolchain on host machine is not required.\nTested on Fedora 39, 40 and Centos 9 Stream. \n\n```shell\n\n# install development environment\n$ sudo dnf install make podman podman-compose podman-plugins containernetworking-plugins\n\n# start development databases and build and start application on http://localhost:3001\n$ make podman/up\n\n# start development databases  \n$ make podman/resource\n\n# stop all\n$ make podman/down\n\n# prune all development environment\n$ make podman/prune\n\n```\n\nLicense\n===================================\nMIT License\n\nCopyright (c) 2024 Остроумов Анатолий\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvodolaz095%2Fdashboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvodolaz095%2Fdashboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvodolaz095%2Fdashboard/lists"}