{"id":50781318,"url":"https://github.com/alectrocute/tunbun","last_synced_at":"2026-06-12T03:05:32.274Z","repository":{"id":350036229,"uuid":"1205037523","full_name":"alectrocute/tunbun","owner":"alectrocute","description":"Cloudflare Tunnels alternative that runs natively on Bunny.net CDN/Magic Containers","archived":false,"fork":false,"pushed_at":"2026-04-09T22:46:16.000Z","size":52,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T03:37:06.371Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://alec.is/posts/cloudflare-tunnels-on-bunny-net/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alectrocute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-08T15:16:39.000Z","updated_at":"2026-04-15T05:19:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alectrocute/tunbun","commit_stats":null,"previous_names":["alectrocute/tunbun"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alectrocute/tunbun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alectrocute%2Ftunbun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alectrocute%2Ftunbun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alectrocute%2Ftunbun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alectrocute%2Ftunbun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alectrocute","download_url":"https://codeload.github.com/alectrocute/tunbun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alectrocute%2Ftunbun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34226707,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-12T03:05:31.560Z","updated_at":"2026-06-12T03:05:32.268Z","avatar_url":"https://github.com/alectrocute.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tunbun\n\n`tunbun` runs [frp](https://github.com/fatedier/frp) in Docker so you can:\n\n1. run a lightweight tunnel server on Bunny.net Magic Containers, and\n2. forward traffic from Bunny to services in your homelab via a client container.\n\n## Quick architecture\n\n- **Server (Bunny.net Magic Container):** `TUNBUN_MODE=server`\n- **Client (homelab Docker host):** `TUNBUN_MODE=client`\n- **Auth:** shared `TUNBUN_TOKEN` on both sides\n- **Routing:** `TUNBUN_LOCAL_PORT_TO_FQDN` maps `localPort:hostname`\n\nExample mapping:\n\n- `8080:app1-abc123.b-cdn.net` -\u003e requests for that hostname go to `localhost:8080` on your homelab host.\n\n## 1) Simple Bunny.net setup (server)\n\n### Create the Magic Container\n\nUse image `alectrocute/tunbun:latest` and set:\n\n- `TUNBUN_MODE=server`\n- `TUNBUN_TOKEN=\u003clong-random-secret\u003e`\n- `TUNBUN_DASHBOARD_USER=admin`\n- `TUNBUN_DASHBOARD_PASSWORD=changeme`\n\n### Expose ports with Anycast endpoints\n\nCreate endpoints so Bunny can reach your server container:\n\n- `7000 -\u003e 7000` (frp control channel from client)\n- `7500 -\u003e 7500` (frps dashboard)\n- `80 -\u003e 80` (HTTP ingress from pull zones)\n\nImportant: Make sure port 80 is set as an Anycast endpoint, not CDN. If you don't, your pull-zone origin will be set to Bunny CDN and you will get 508 loops.\n\nNote the provided `7000` endpoint/IP for use in `TUNBUN_SERVER_ADDR` on your client's `docker-compose.yml`.\n\n### Pull zone origin\n\nFor each Bunny pull zone you want to tunnel:\n\n- set **Origin URL** to your Anycast endpoint for port `80`\n- enable forwarding of the pull-zone hostname to origin (so origin receives `Host: \u003czone\u003e.b-cdn.net`)\n- disable/override all caching\n\nDo not set a Bunny CDN hostname as the origin (that causes 508 loops).\n\n## 2) Simple homelab Docker Compose setup (client)\n\nUse this as your baseline `docker-compose.yml`:\n\n```yaml\nservices:\n  tunbun-client:\n    image: alectrocute/tunbun:latest\n    container_name: tunbun-client\n    restart: unless-stopped\n    network_mode: host\n    environment:\n      TUNBUN_MODE: client\n      TUNBUN_SERVER_ADDR: YOUR_BUNNY_ANYCAST_IP_OR_HOST_FOR_7000\n      TUNBUN_SERVER_PORT: 7000\n      TUNBUN_TOKEN: REPLACE_WITH_THE_SAME_SECRET_AS_SERVER\n      TUNBUN_LOCAL_PORT_TO_FQDN: \"8080:app1-abc123.b-cdn.net,8081:app2-abc123.b-cdn.net\"\n      TUNBUN_DASHBOARD_USER: admin\n      TUNBUN_DASHBOARD_PASSWORD: changeme\n```\n\nThen run, for example:\n\n```bash\ndocker compose up -d\ndocker compose logs -f tunbun-client\n```\n\n### Homelab notes\n\n- `network_mode: host` is simplest on Linux homelab hosts.\n- If your apps run on another machine, set `TUNBUN_LOCAL_IP` to that reachable LAN IP.\n- On Docker Desktop (Mac/Windows), do not use host networking for this pattern; use published ports and `TUNBUN_LOCAL_IP=host.docker.internal`.\n\n## 3) Verify traffic path\n\n1. Confirm client is connected in logs (no auth/connection errors).\n2. Hit your pull-zone URL.\n3. If needed, test origin directly:\n\n```bash\ncurl -sSI \"http://\u003cyour-anycast-origin-ip\u003e/\" -H \"Host: \u003cyour-zone\u003e.b-cdn.net\"\n```\n\nIf response headers still indicate Bunny CDN, your origin is still pointing at Bunny instead of your Magic Container endpoint.\n\n## Minimal environment reference\n\n### Common\n\n| Variable | Description |\n|---|---|\n| `TUNBUN_MODE` | `server` or `client` |\n| `TUNBUN_TOKEN` | Shared secret (must match on both sides) |\n| `TUNBUN_LOG_LEVEL` | frp log level (`info` default) |\n| `TUNBUN_DASHBOARD_PORT` | `7500` | set `0` to disable dashboard |\n| `TUNBUN_DASHBOARD_USER` | no | defaults to `admin` |\n| `TUNBUN_DASHBOARD_PASSWORD` | no | defaults to `changeme` |\n\n### Server\n\n| Variable | Default | Description |\n|---|---|---|\n| `TUNBUN_BIND_PORT` | `7000` | frp control port |\n| `TUNBUN_VHOST_HTTP_PORT` | `80` | incoming HTTP vhost port |\n\n### Client\n\n| Variable | Required | Description |\n|---|---|---|\n| `TUNBUN_SERVER_ADDR` | yes | Bunny Anycast IP/host for port `7000` |\n| `TUNBUN_SERVER_PORT` | no | defaults to `7000` |\n| `TUNBUN_LOCAL_PORT_TO_FQDN` | yes | `port:hostname,port:hostname` mappings |\n| `TUNBUN_LOCAL_IP` | no | defaults to `127.0.0.1` |\n| `TUNBUN_PROXY_TYPE` | no | `http` (default) or `https` |\n\n## Optional: build/publish image\n\n```bash\n./build.sh\n./build.sh --push\n./build.sh --push --multiarch\n```\n\n## Links\n\n- [Bunny.net Magic Containers docs](https://docs.bunny.net/magic-containers)\n- [frp](https://github.com/fatedier/frp)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falectrocute%2Ftunbun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falectrocute%2Ftunbun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falectrocute%2Ftunbun/lists"}