6.1 KiB
infinite-noodle
infinite-noodle is a small Go service that combines:
- a web UI for viewing configured TCP proxies
- a login-protected UI with user and admin account management
- a Bitcask-backed data store for persisted proxy definitions
- a TCP proxy runner built with Go's standard
netpackage
This README is written for working in a GitHub Codespace.
What It Does
Each "noodle" is a TCP forwarding rule with:
- a name
- an allowed source list (
All, one or more IPs, or CIDR ranges) - a listen port
- a destination host
- a destination port
- an expiration duration
- an up/down state
- the user who created it
When the app starts, it loads saved noodles from the local database and starts any active proxy routes. It also serves a web UI for creating, pausing, resuming, and deleting them.
Current State
The project is functional enough to:
- start the web app
- create a default admin user on a new database
- require login before the proxy management UI is available
- support two user levels:
regularandadmin - let any signed-in user change their own password
- let admin users create users, change roles, change any user's password, and delete user accounts
- load stored proxy definitions from
./infinite.db - create new noodles from the UI
- run active TCP and UDP proxies
- restrict a proxy to comma-separated source IPs and CIDR ranges
- update expiration values in the database every second while a proxy is active
- close and delete expired noodles automatically
- pause a noodle from the UI without decrementing its expiration
- delete existing noodles from the UI with confirmation
Current limitations:
- there is no REST API; management is currently through the server-rendered UI
- protocols are limited to TCP and UDP
Running In A Codespace
This repo expects a Go toolchain to be available in the Codespace. If it is missing, install or add Go first.
Start the app:
go run ./cmd/infinite-noodle
Default runtime settings:
- host:
0.0.0.0 - web UI port:
7878 - database path:
./infinite.db
Open the app in the browser from the forwarded port for 7878.
On a brand-new database, the app creates a default UI user:
- username:
admin - password:
admin - role:
admin
Any signed-in user can access /users to manage their own password. Admin users also get full user management on that page.
You can also override the defaults:
go run ./cmd/infinite-noodle -host 0.0.0.0 -port 7878 -data ./infinite.db
Available flags:
-host: host/interface to bind the web server to-port: web server port-data: path to the Bitcask database directory-test: seeds the database with sample noodles on startup
UI Behavior
The web UI is protected by a login page. After signing in, the main table includes an add row for creating a proxy with:
NameAllow From: acceptsAll, comma-separated IP addresses, or CIDR ranges such as10.0.0.5, 192.168.1.0/24Proto: chooseTCPorUDPListen PortDestination PortDestination HostExpiration: parsed as a Gotime.Durationsuch as30s,5m, or1h15m
The Status column is a checkbox:
- checked: the proxy is active and the expiration counts down
- unchecked: the proxy is closed and the expiration is paused
The table also shows:
Created By: the authenticated user who created the proxy
Delete actions in the UI prompt for confirmation before the request is submitted.
The /users page behavior depends on role:
regular: can change their own passwordadmin: can create users, change roles, change any password, and delete users
The expiration value is shown as a live countdown in the browser. When it reaches zero, the row is removed from the UI and the noodle is deleted from the database.
Codespaces Port Notes
In Codespaces, you will usually need to forward:
7878for the web UI- any listen ports used by active noodles
Example:
- if a noodle listens on
5555, forward port5555 - if it proxies to another service running inside the Codespace on
6666, that destination only needs forwarding if you also want direct browser or external access to it
Quick Local Proxy Demo
The repo includes simple Python test scripts in test/server.py and test/client.py.
Typical flow:
- Run the app with
go run ./cmd/infinite-noodle - Start the test echo server on
127.0.0.1:6666 - Add a noodle in the UI that listens on
5555and forwards to127.0.0.1:6666 - Run the test client, which connects to
127.0.0.1:5555
Building Binaries
The repo includes build.sh, which builds binaries for:
- Linux amd64
- macOS arm64
- macOS amd64
- Windows arm64
- Windows amd64
Run:
sh build.sh
Artifacts are written under ./target/.
To build only the Linux amd64 target:
GOOS=linux GOARCH=amd64 go build -buildvcs=false -o target/infinite-noodle.net-proxy ./cmd/infinite-noodle
Important Files
cmd/infinite-noodle/main.go: binary entrypoint and CLI flagsinternal/app/app.go: app startup, HTTP server, and proxy lifecycleinternal/noodle/database.go: Bitcask storage layerinternal/web/auth.go: login, sessions, and role-based access controlinternal/web/handlers.go: HTML handlersinternal/assets/templates/index.html: UI templateinternal/assets/templates/login.html: login pageinternal/assets/templates/users.html: user configuration page
Verification Note
The reorganized project layout was verified with go test ./... and go build ./... in this workspace.