{"id":15288867,"url":"https://github.com/ramchaik/hermes","last_synced_at":"2026-02-20T18:04:25.022Z","repository":{"id":245622249,"uuid":"817033898","full_name":"ramchaik/hermes","owner":"ramchaik","description":"A robust HTTP load balancer and reverse proxy written from scratch in Golang.","archived":false,"fork":false,"pushed_at":"2024-06-26T20:43:01.000Z","size":18660,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-30T22:42:15.455Z","etag":null,"topics":["ci","docker","docker-image","go","golang","hermes","least-connections","load-balancer","round-robin","weighted-round-robin"],"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/ramchaik.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,"publiccode":null,"codemeta":null}},"created_at":"2024-06-18T22:15:38.000Z","updated_at":"2024-10-19T13:51:24.000Z","dependencies_parsed_at":"2024-06-23T03:26:26.998Z","dependency_job_id":"91758e4b-fe65-47eb-aac5-5fcf2cb10f2d","html_url":"https://github.com/ramchaik/hermes","commit_stats":null,"previous_names":["ramchaik/hermes"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ramchaik/hermes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramchaik%2Fhermes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramchaik%2Fhermes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramchaik%2Fhermes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramchaik%2Fhermes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramchaik","download_url":"https://codeload.github.com/ramchaik/hermes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramchaik%2Fhermes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29659754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T16:33:43.953Z","status":"ssl_error","status_checked_at":"2026-02-20T16:33:43.598Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ci","docker","docker-image","go","golang","hermes","least-connections","load-balancer","round-robin","weighted-round-robin"],"created_at":"2024-09-30T15:53:53.739Z","updated_at":"2026-02-20T18:04:20.008Z","avatar_url":"https://github.com/ramchaik.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hermes Load Balancer\n\nWelcome to **Hermes**, a robust HTTP load balancer and reverse proxy written from scratch in Go. Hermes is designed to optimize your network's load distribution, ensuring smooth and reliable service delivery.\n\n## :star: Key Features\n\n- HTTP load balancing and reverse proxy functionality\n- Multiple load distribution strategies\n- Active and passive health checks for backend services\n- Easy configuration via YAML file or command-line arguments\n- Docker support for simple deployment\n\n## :zap: Load Distribution Strategies\n\nHermes supports multiple strategies to cater to different needs and infrastructure setups:\n\n- **Round Robin**: A fair and equal distribution method, perfect for when all backend services have similar processing capabilities.\n- **Weighted Round Robin**: Tailor the load distribution based on the processing power of each backend, assigning more weight to stronger servers.\n- **Least Connections**: Smartly routes traffic to the servers with the fewest active connections, minimizing response times and maximizing efficiency.\n\n## :heart: Health Checks\n\nHermes ensures high availability through two types of health checks:\n\n- **Active Checks**: During request processing, if a selected backend is unresponsive, it's immediately marked as down.\n- **Passive Checks**: Regular pings are sent to backends at fixed intervals to monitor their status.\n\n## :rocket: Getting Started\n\nRunning Hermes is straightforward, with options for configuration file, command-line arguments, or Docker deployment.\n\n### Using a Configuration File\n\nEnsure you have a `config.yaml` set up with your desired settings.\n\n```sh\n./hermes\n```\n\n### Using Command-Line Arguments\n\n```sh\n./hermes --help\n```\n\n### :whale: Running with Docker Compose\n\n```sh\ndocker compose up\n```\nHermes comes with Docker configurations for seamless deployment across any setup.\nTo customize Hermes' deployment, modify the docker-compose.yaml file with your preferred settings.\n\n## :gear: Configuration\n\nHermes can be configured using a YAML file. Here's an explanation of the configuration options:\n```yaml\nport: 80 # Port on which the load balancer will be running\nhealthCheckInSec: 20 # Interval for passive health checks in seconds\nstrategy: \"least-connections\" # Load balancing strategy\nservices: # Backend services configuration\n  - name: srv1\n    url: http://localhost:9001\n    weight: 30\n  - name: srv2\n    url: http://localhost:9002\n    weight: 1\n  - name: srv3\n    url: http://localhost:9003\n    weight: 1\n```\n\n### Configuration Options\n\n- port: The port on which Hermes will listen for incoming requests.\n- healthCheckInSec: The interval (in seconds) for passive health checks.\n- strategy: The load balancing strategy. Possible values are \"round-robin\", \"weighted-round-robin\", or \"least-connections\".\n- services: A list of backend services.\n    - name: A unique identifier for the service.\n    - url: The URL of the backend service.\n    - weight: The weight assigned to the service (required for \"weighted-round-robin\" strategy).\n\n### :sparkles: Why Hermes?\n\n- Efficiency: Optimized for minimal latency and maximum throughput.\n- Flexibility: Supports multiple load distribution strategies.\n- Reliability: Active and passive health checks ensure high availability.\n- Ease of Use: Simple setup with Docker support for hassle-free deployment.\n\n### :construction: TODO\n\n- [ ] Implement a heap for sorting alive backends to reduce search complexity\n\n### :clap: Acknowledgements\n\nThis project stands on the shoulders of giants. A heartfelt thank you to the following resources and communities:\n\n[Let's Create a Simple Load Balancer With Go](https://kasvith.me/posts/lets-create-a-simple-lb-go/) - This insightful blog post was the spark that ignited the creation of Hermes. It provided foundational knowledge and inspiration.\n\n### :handshake: Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n### :memo: License\n\nThis project is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framchaik%2Fhermes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framchaik%2Fhermes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framchaik%2Fhermes/lists"}