diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..9e1c8148522b8c234de89fb0fdf893bbf202e248 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +Copyright 2024 Frank Sauerburger + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Softwareâ€), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0fef7612d913672c3615241963570937acead2d4 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# TCP Junction + +TCP junction is a tiny TCP-level reverse project implemented in Rust. +The binary doesn't read a configuration file and is completely configured via command-line arguments. +Upstream health is inferred from TCP connection success or failure. + +TCP Junction makes it easy to implemented dynamic primary/standby setups or canary deployments. + +## Junction logic + +TCP Junction accepts at list of `host:port` as it's command-line arguments. The first entry +is the host and port to listen on, e.g., `0.0.0.0:8080`. All allowing arguments are considered +upstream sockets. + +* By default, the first item in the list is the preferred socket and + all requests are sent to that host. +* If the preferred socket is offline, all requests are sent to the next online socket in the list, + cycling back to the beginning at the end of the list. +* If all sockets are offline and the search for an online socket reach the preferred server again, + requests are sent to the preferred socket regardless of its state. +* When TCP Junction receives the `USR1` signal, the preferred host is advanced by one socket, + cycling back at the end. + +Health probes are sent continuously to all configured upstream sockets. + +## Usage example + +```bash +$ tcpjunction 0.0.0.0:8080 10.0.0.20:8080 10.0.0.21:8080 +```