Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tomashubelbauer/bun-reverse-proxy
Bun reverse proxy
https://github.com/tomashubelbauer/bun-reverse-proxy
bun javascript proxy-server reverse-proxy reverse-proxy-server typescript
Last synced: 3 days ago
JSON representation
Bun reverse proxy
- Host: GitHub
- URL: https://github.com/tomashubelbauer/bun-reverse-proxy
- Owner: TomasHubelbauer
- Created: 2024-02-13T23:46:01.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2024-04-08T17:56:42.000Z (9 months ago)
- Last Synced: 2024-05-02T03:54:47.957Z (8 months ago)
- Topics: bun, javascript, proxy-server, reverse-proxy, reverse-proxy-server, typescript
- Language: TypeScript
- Homepage:
- Size: 3.91 KB
- Stars: 3
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Bun Reverse Proxy
This repository intends to demonstrate using Bun as a reverse proxy and binding
it to port 80 so that multiple other services running at their own ports can be
accessed via a plain host name.The idea is that the Bun reverse proxy binds to port 80 and it keeps a list of
services and their corresponding ports that are running on the same macOS system
and those services also have their own corresponding `/etc/hosts` entries all
being mapped to the loopback address.`/etc/hosts`:
```
127.0.0.1 service1.localhost # 7001
127.0.0.1 service2.localhost # 7002
```The `/etc/hosts` file can be edited by running `sudo code /etc/hosts`.
The file requires `sudo` for writing (it can be read without it), but VS Code
recognizes this and will offer to retry with `sudo` when saving.I am opting to use the end of line comments in the hosts file as the "database"
of services for the Bun reverse proxy to discover so there is a single source of
truth and not two places that can go out of sync (the hosts file for the mapping
to loopback and whatever other mechanism would there be for the reverse proxy to
map the host names to port names on `localhost`).When the user accesses `service1.localhost` or `service2.localhost` in their
browser, the reverse proxy will intercept the request (being bound to port 80,
the default for HTTP) and will inspect the host name to see what address to
forward the request to and proxy the response for.They all use the `*.localhost` TLD so they are treated as a secure context by
the browser and do not need an HTTPS certificate to use modern web features.
https://developer.mozilla.org/en-US/docs/Web/Security/Secure_ContextsI have added sample `service1` and `service2` directories for quick testing.
Those services can be started by `cd service#` followed by `bun .`.VS Code Integrated Terminal allows doing multiple ones to run these in parallel.
Bun is used because it has a nice built-in HTTP API unlike Node.
In development, run the reverse proxy using `bun --hot run .`.
In "production" (running it in the background on the computer), build it and run
the executable and detach: `bun build . --compile --outfile reverse-proxy` and
then `./reverse-proxy &`.If the "production" instance is already running, `bun run` will fail to start
because the server will fail to bind to the already taken port 80.
Kill the "production" instance first using `pkill reverse-proxy`.I have extracted this command to the `start` package script so it can be run
using `bun start`.There is also `bun run build` for making and starting the "production" instance.
The same way, the "production" instance won't run if the development one is
bound to the port 80, so treat running the development instance and building and
running the "production" instance as mutually exclusive.With this setup, it is possible to run several custom local applications each on
its own port but access them via user-friendly names and do it using super small
tooling (just Bun and the compiled reverse proxy binary) and standard approaches
(the hosts file).