{"id":20678469,"url":"https://github.com/codecentric/habitcentric","last_synced_at":"2026-02-08T06:05:36.910Z","repository":{"id":38085318,"uuid":"448952713","full_name":"codecentric/habitcentric","owner":"codecentric","description":"A microservice demo application showcasing cloud-native technologies","archived":false,"fork":false,"pushed_at":"2024-04-16T22:46:23.000Z","size":20813,"stargazers_count":22,"open_issues_count":11,"forks_count":3,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-04-17T18:05:17.179Z","etag":null,"topics":["docker","istio","java","kotlin","kubernetes","linkerd2","semantic-release","spring-boot","traefik"],"latest_commit_sha":null,"homepage":"","language":"Java","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/codecentric.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2022-01-17T15:41:50.000Z","updated_at":"2024-04-23T12:48:09.486Z","dependencies_parsed_at":"2023-11-16T16:27:18.091Z","dependency_job_id":"9af0ce95-a71c-44f8-a4e7-8d27c2aff2ca","html_url":"https://github.com/codecentric/habitcentric","commit_stats":null,"previous_names":[],"tags_count":357,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codecentric%2Fhabitcentric","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codecentric%2Fhabitcentric/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codecentric%2Fhabitcentric/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codecentric%2Fhabitcentric/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codecentric","download_url":"https://codeload.github.com/codecentric/habitcentric/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224970067,"owners_count":17400337,"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":["docker","istio","java","kotlin","kubernetes","linkerd2","semantic-release","spring-boot","traefik"],"created_at":"2024-11-16T21:20:09.108Z","updated_at":"2025-12-25T12:57:18.022Z","avatar_url":"https://github.com/codecentric.png","language":"Java","readme":"\u003ch1 align=\"center\" style=\"border-bottom: none;\"\u003e🗓 🔍 ☀️ habitcentric\u003c/h1\u003e\n\u003ch3 align=\"center\"\u003eA microservice demo application showcasing cloud-native technologies\u003c/h3\u003e\n\nhabitcentric is a small web application for creating and maintaining long-term positive habits.\nIt is used as an example for a containerized application in multiple showcases demonstrating\ncloud-native technologies.\n\n![habitcentric user interface](docs/images/user-interface.png)\n\n## ⭐️ Overview\n\nWelcome to habitcentric! 👋 🎈 Before you can start learning new technologies by following the\nprovided showcases, let us take a look at habitcentric's components:\n\n- [**habit**](./services/habit) - manages \u0026 persists habits with their name, repetitions and frequency\n- [**track**](./services/track) - manages \u0026 persists tracked dates for habits\n- [**report**](./services/report) - calculates habit tracking report based on saved habits and tracked dates\n- [**gateway**](./services/gateway) - routes requests to backend services\n- [**ui**](./services/ui) - delivers user interface to manage habits and tracked dates\n- [**auth-keycloak**](./services/auth-keycloak) - enables OIDC authorization flows\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/services.png\" width=\"600\"/\u003e\n\u003c/p\u003e\n\n## 📖 Showcases\n\nNow that you know what habitcentric is, you can start learning how to deploy habitcentric to\nKubernetes using Helm charts and Helmfile or take an even deeper dive by learning all about\nservice meshes and their features!\n\n- [**Docker Compose Deployment**](./infrastructure/docker/README.md)\n- [**Kubernetes Deployment**](./infrastructure/kubernetes/README.md)\n- [**Istio Configuration**](./infrastructure/istio/README.md)\n- [**Linkerd Configuration**](./infrastructure/linkerd/README.md)\n- [**Kuma Configuration**](./infrastructure/kuma/README.md)\n- [**Traefik Mesh Configuration**](./infrastructure/traefik-mesh/README.md)\n\n### Supported infrastructure features/components per showcase\n\n|  Feature / Environment  |        Docker Compose         |          Kubernetes           |               Istio               |              Linkerd              |               Kuma                |              Traefik              |\n|:-----------------------:|:-----------------------------:|:-----------------------------:|:---------------------------------:|:---------------------------------:|:---------------------------------:|:---------------------------------:|\n| API Gateway Replacement | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) |\n|          mTLS           | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/minus-circle.svg) | ![](docs/images/check-circle.svg) |\n|    Advanced Routing     | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |\n|  Service Authorization  | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |\n|   User Authorization    | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |\n|       Resilience        | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/minus-circle.svg) |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |\n|     Fault Injection     | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/minus-circle.svg) |   ![](docs/images/x-circle.svg)   |   ![](docs/images/x-circle.svg)   |\n| Network / Route Metrics | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) |\n|   Distributed Tracing   | ![](docs/images/x-circle.svg) | ![](docs/images/x-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) | ![](docs/images/check-circle.svg) |\n\nPlease note that a feature may be unsupported because of several reasons. It may be unsupported\nby the used product, it may not be working for unknown reasons (i.e. Kuma mTLS) or we may\nnot had the time to configure it yet at all.\n\n## 🚀 Advanced quickstart\n\nIf you don't want to go through the detailed step-by-step showcases but want to get up and running \nfast, we provide a `bootstrap.sh` script to quickly bootstrap some environments. \nIt uses minikube to start a Kubernetes cluster and deploys \u0026 configures habitcentric and all\ninfrastructure components for you.\n\n\u003e ⚠️ Currently supported environments are:\n\u003e\n\u003e - Kubernetes\n\u003e - Istio\n\u003e - Linkerd\n\n```shell\n# kubernetes\n./bootstrap.sh\n\n# istio\n./bootstrap.sh istio\n\n# linkerd\n./bootstrap.sh linkerd\n```\n\nThe script tells you how to access the habitcentric UI after the deployment was successful.\n\n## ⚙️ Scripted Demos\n\nYou can also find some scripted demos in the `demos` directory.\nThe demos interactively apply configurations step-by-step and guide you through them. They showcase\nspecific scenarios, like for example a chaos experiment with Istio.\n\n## 🛠 Contributing\n\nWe ❤️ pull requests! You can view habitcentric as your personal playground for studying new\ntechnologies and just trying them in a more sophisticated environment. If you want to hack on\nhabitcentric, fix issues and maybe even provide additional components, showcases or demos, you can\nfind more infos on how to work with this repository in our [`BUILD.md`](./BUILD.md).\n\n## ⚠️ Known Issues\n\n### docker \u0026 minikube with kvm2 driver\n\nThe network minikube uses for kvm2 VMs restricts routing to the guest. This prevents communication\nfrom docker containers to the minikube VM.\n\nWhen you want to use the locust load \u0026 performance testing running inside docker containers on the\nhost you need to apply the following workaround.\n\nCheck which bridge interface is used by the network\n\n```shell\nsudo virsh net-info minikube-net\n```\n\n```\nsudo virsh net-info minikube-net\nName:           minikube-net\nUUID:           b006294e-dcbd-4263-b9e0-af9cd3d88ba1\nActive:         yes\nPersistent:     yes\nAutostart:      yes\nBridge:         virbr1\n```\n\nTo take a look at the rules run `sudo iptables -vnxL FORWARD`\nThe rules you don't want are looking like this:\n\n```\nChain FORWARD (policy DROP 0 packets, 0 bytes)\n    pkts      bytes target     prot opt in     out     source               destination\n       0        0 REJECT     all  --  *      virbr1  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable\n       0        0 REJECT     all  --  virbr1 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable\n```\n\nTo remove the rules run:\n\n```shell\nsudo iptables -D FORWARD -i virbr1 -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT\nsudo iptables -D FORWARD -o virbr1 -s 0.0.0.0/0 -d 0.0.0.0/0 -j REJECT\n```\n\nIt is possible that there are multiple identical iptables rules, just run the delete commands until\niptables returns an error:\n`iptables: Bad rule (does a matching rule exist in that chain?).`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodecentric%2Fhabitcentric","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodecentric%2Fhabitcentric","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodecentric%2Fhabitcentric/lists"}