{"id":13542481,"url":"https://github.com/yyyar/gobetween","last_synced_at":"2025-04-11T02:27:33.544Z","repository":{"id":40490361,"uuid":"60521033","full_name":"yyyar/gobetween","owner":"yyyar","description":":cloud: Modern \u0026 minimalistic load balancer for the Сloud era","archived":false,"fork":false,"pushed_at":"2025-02-17T16:02:10.000Z","size":518,"stargazers_count":1950,"open_issues_count":100,"forks_count":214,"subscribers_count":61,"default_branch":"master","last_synced_at":"2025-04-03T23:39:35.055Z","etag":null,"topics":["backend","cloud","consul","discovery","docker","go","golang","letsencrypt","load-balancer","lxd","proxy","proxy-server","sni","srv","tcp","tcp-proxy","tls","tls-proxy","udp","udp-proxy"],"latest_commit_sha":null,"homepage":"http://gobetween.io","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yyyar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-06T10:56:03.000Z","updated_at":"2025-04-02T15:34:45.000Z","dependencies_parsed_at":"2024-08-01T10:17:28.015Z","dependency_job_id":"0436ab47-77bd-44db-a494-6829b62b3243","html_url":"https://github.com/yyyar/gobetween","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Fgobetween","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Fgobetween/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Fgobetween/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yyyar%2Fgobetween/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yyyar","download_url":"https://codeload.github.com/yyyar/gobetween/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248328927,"owners_count":21085421,"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":["backend","cloud","consul","discovery","docker","go","golang","letsencrypt","load-balancer","lxd","proxy","proxy-server","sni","srv","tcp","tcp-proxy","tls","tls-proxy","udp","udp-proxy"],"created_at":"2024-08-01T10:01:08.589Z","updated_at":"2025-04-11T02:27:28.536Z","avatar_url":"https://github.com/yyyar.png","language":"Go","funding_links":[],"categories":["Go","golang","Load Balancing \u0026 Ingress","NetWork","proxy","DevOps Utilities","Repositories"],"sub_categories":[],"readme":"[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://vshymanskyy.github.io/StandWithUkraine)\n\n\u003cimg src=\"/logo.png?raw=true\" alt=\"gobetween\" width=\"256px\" /\u003e\n\n[![Tag](https://img.shields.io/github/tag/yyyar/gobetween.svg)](https://github.com/yyyar/gobetween/releases/latest)\n[![Build Status](https://travis-ci.org/yyyar/gobetween.svg?branch=master)](https://travis-ci.org/yyyar/gobetween)\n[![Go Report Card](https://goreportcard.com/badge/github.com/yyyar/gobetween)](https://goreportcard.com/report/github.com/yyyar/gobetween)\n[![Docs](https://img.shields.io/badge/docs-current-brightgreen.svg)](https://github.com/yyyar/gobetween/wiki)\n[![Docker](https://img.shields.io/docker/pulls/yyyar/gobetween.svg)](https://hub.docker.com/r/yyyar/gobetween/)\n[![Telegram](https://img.shields.io/badge/telegram-chat-blue.svg)](https://t.me/joinchat/GdlUlg_gRfchk1BORU82PA)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](/LICENSE)\n\n\n**gobetween** -  modern \u0026 minimalistic load balancer and reverse-proxy for the :cloud: Cloud era.\n\n**Current status**: *Maintenance mode, accepting PRs*. Currently in use in several highly loaded production environments.\n\n## Features\n\n* [Fast L4 Load Balancing](https://github.com/yyyar/gobetween/wiki)\n  * **TCP** - with optional [The PROXY Protocol](https://github.com/yyyar/gobetween/wiki/Proxy-Protocol) support\n  * **TLS** - [TLS Termination](https://github.com/yyyar/gobetween/wiki/Protocols#tls) + [ACME](https://github.com/yyyar/gobetween/wiki/Protocols#tls) \u0026 [TLS Proxy](https://github.com/yyyar/gobetween/wiki/Tls-Proxying)\n  * **UDP** - with optional virtual sessions and transparent mode\n\n\n* [Clear \u0026 Flexible Configuration](https://github.com/yyyar/gobetween/wiki/Configuration) with [TOML](config/gobetween.toml) or [JSON](config/gobetween.json)\n  * **File** - read configuration from the file\n  * **URL** - query URL by HTTP and get configuration from the response body \n  * **Consul** - query Consul key-value storage API for configuration\n\n* [Management REST API](https://github.com/yyyar/gobetween/wiki/REST-API)\n  * **System Information** - general server info\n  * **Configuration** - dump current config \n  * **Servers** - list, create \u0026 delete\n  * **Stats \u0026 Metrics** - for servers and backends including rx/tx, status, active connections \u0026 etc.\n \n* [Discovery](https://github.com/yyyar/gobetween/wiki/Discovery)\n  * **Static** - hardcode backends list in the config file\n  * **Docker** - query backends from Docker / Swarm API filtered by label\n  * **Exec** - execute an arbitrary program and get backends from its stdout\n  * **JSON** - query arbitrary http url and pick backends from response json (of any structure)\n  * **Plaintext** - query arbitrary http and parse backends from response text with customized regexp\n  * **SRV** - query DNS server and get backends from SRV records\n  * **Consul** - query Consul Services API for backends \n  * **LXD** - query backends from LXD\n\n* [Healthchecks](https://github.com/yyyar/gobetween/wiki/Healthchecks)\n  * **Ping** - simple TCP ping healthcheck\n  * **Exec** - execute arbitrary program passing host \u0026 port as options, and read healthcheck status from the stdout\n  * **Probe** - send specific bytes to backend (udp, tcp or tls) and expect a correct answer (bytes or regexp)\n\n* [Balancing Strategies](https://github.com/yyyar/gobetween/wiki/Balancing) (with [SNI](https://github.com/yyyar/gobetween/wiki/Server-Name-Indication) support)\n  * **Weight** - select backend from pool based relative weights of backends\n  * **Roundrobin** - simple elect backend from pool in circular order\n  * **Iphash** - route client to the same backend based on client ip hash\n  * **Iphash1** - same as iphash but backend removal consistent (clients remain connecting to the same backend, even if some other backends down)\n  * **Leastconn** - select backend with least active connections\n  * **Leastbandwidth** -  backends with least bandwidth\n\n* Integrates seamlessly with Docker and with any custom system (thanks to Exec discovery and healthchecks)\n\n* Single binary distribution\n\n\n## Architecture\n\u003cimg src=\"/architecture.png?raw=true\" alt=\"architecture\" /\u003e\n\n## Usage\n\n* Install with snap: https://snapcraft.io/gobetween\n* [Other Installation Options](https://github.com/yyyar/gobetween/wiki/Installation)\n* [Read Configuration Reference](https://github.com/yyyar/gobetween/wiki)\n* Execute `gobetween --help` for full help on all available commands and options.\n\n## Hacking\n\n* Install Go 1.24+ https://golang.org/\n* `$ git clone git@github.com:yyyar/gobetween.git`\n* `$ make`\n* `$ make run`\n\n### Debug and Test\nRun several web servers for tests in different terminals:\n\n* `$ python -m SimpleHTTPServer 8000`\n* `$ python -m SimpleHTTPServer 8001`\n\nInstead of Python's internal HTTP module, you can also use a single binary (Go based) webserver like:\nhttps://github.com/udhos/gowebhello\n\n**gowebhello** has support for SSL sertificates as well (**HTTPS** mode), in case you want to do quick demos\nof the **TLS+SNI** capabilities of gobetween.\n\nPut `localhost:8000` and `localhost:8001` to `static_list` of static discovery in config file, then try it:\n\n* `$ gobetween -c gobetween.toml`\n\n* `$ curl http://localhost:3000`\n\nEnable [profiler](https://blog.golang.org/profiling-go-programs) and debug issues you encounter\n```\n[profiler]\nenabled = true     # false | true\nbind    = \":6060\"  # \"host:port\"\n```\n\n## Performance\nIt's Fast! See [Performance Testing](https://github.com/yyyar/gobetween/wiki/Performance-tests)\n\n## The Name\nIt's a play on words: gobetween (\"go between\"). \n\nAlso, it's written in Go, and it's a proxy so it's something that stays between 2 parties :smile:\n\n## License\nMIT. See LICENSE file for more details.\n\n## Authors \u0026 Maintainers\n- [Yaroslav Pogrebnyak](http://pogrebnyak.info)\n- [Nick Doikov](https://github.com/nickdoikov)\n- [Ievgen Ponomarenko](https://github.com/kikom)\n- [Illarion Kovalchuk](https://github.com/illarion)\n\n## All Contributors\n- See [AUTHORS](AUTHORS)\n\n## Community\n- Join gobetween Telegram group [here](https://t.me/joinchat/GdlUlg_gRfchk1BORU82PA).\n\n## Logo\nLogo by [Max Demchenko](https://www.linkedin.com/in/max-demchenko-116170112)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyyyar%2Fgobetween","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyyyar%2Fgobetween","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyyyar%2Fgobetween/lists"}