Files
therealaleph 9909b9b30b docs(tunnel): document ngrok *.ngrok-free.dev block + alternative hosts (#924)
Multiple Iran-ISP users (#924 Recruit1992, #913 ehsan272727) report that
ngrok's free tier now exclusively hands out *.ngrok-free.dev domains for
new accounts, with no path to claim the older *.ngrok-free.app TLD. Some
Iran ISPs (TCI, Irancell, IRMCI confirmed) block *.ngrok-free.dev at DNS
or TCP. Symptom: curl from Iran network to ngrok URL times out, but works
from non-Iran.

Updates README.md and ngrok.md to:

1. Note the ngrok TLD shift (.app grandfathered, .dev for new accounts).
2. List ISPs confirmed to block *.ngrok-free.dev.
3. Add an "Alternative hosts" section recommending HuggingFace Spaces
   (Docker SDK) as the most Iran-friendly option in 2026 — permanent
   *.hf.space URL with no tunnel layer.
4. Update the URL behavior column for Method 2 since ngrok now gives a
   permanent dev domain by default (not "new URL each session").

No code changes — docs only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 12:15:29 +03:00

138 lines
5.4 KiB
Markdown

# ngrok Tunnel
Run a Full tunnel for 6 hours using an ngrok account (free tier). ngrok provides
a public URL that exposes the tunnel-node running on GitHub Actions.
## Prerequisites
- A GitHub account (free)
- An ngrok account (free — sign up at [ngrok.com](https://ngrok.com))
- `CodeFull.gs` deployed as a Google Apps Script Web App
## Setup
### Step 1: Get Your ngrok Authtoken
1. Go to [dashboard.ngrok.com](https://dashboard.ngrok.com) and sign in
2. Copy your authtoken from the **Getting Started** or **Your Authtoken** section
### Step 2: Create the Repository
If you already have a repository from another method, you can reuse it.
Otherwise:
1. Go to [github.com](https://github.com) and sign in
2. Click the **+** icon in the top-right corner, then **New repository**
3. Enter a repository name (e.g., `my-tunnel`)
4. Select **Private** (recommended — keeps your secrets secure)
5. Click **Create repository**
### Step 3: Add the Secrets
1. In your repository, go to **Settings > Secrets and variables > Actions**
2. Click **New repository secret** and add:
| Name | Value |
|---|---|
| `TUNNEL_AUTH_KEY` | A strong password. You will also set this in `CodeFull.gs`. |
| `NGROK_AUTH_TOKEN` | Your ngrok authtoken from Step 1. |
3. Click **Add secret** for each
### Step 4: Add the Workflow
1. In your repository, go to the **Actions** tab
2. Click **New workflow**
3. Click the **set up a workflow yourself** link
4. Delete the default content and paste the contents of `ngrok.yml` [[here]]
5. Click **Commit changes...**, add a commit message, then click **Commit changes**
The workflow file will be saved to `.github/workflows/ngrok.yml`.
### Step 5: Run the Workflow
1. Go to the **Actions** tab
2. Select **Full Tunnel (ngrok)** from the left sidebar
3. Click **Run workflow > Run workflow**
The workflow will start immediately.
### Step 6: Get the Tunnel URL
1. Click on the running workflow to see live logs
2. Wait for the **Expose tunnel** step to complete (about 10 seconds)
3. Look for the `::notice::Tunnel URL:` line in the log output
4. Copy the URL — it will look like `https://abc123.ngrok-free.app`
### Step 7: Configure CodeFull.gs
Open `CodeFull.gs` in the Google Apps Script editor and update these constants:
```javascript
const TUNNEL_SERVER_URL = "https://abc123.ngrok-free.app";
const TUNNEL_AUTH_KEY = "the-secret-you-set-in-step-3";
```
Deploy: **Deploy > New Deployment > Web App**.
Copy the new Deployment ID and update your `mhrv-rs` config.
### Step 8: Verify
`mhrv-rs test` is wired only for the apps_script relay path; in Full mode it
refuses to run. To verify a Full-mode tunnel, visit `https://ipleak.net` (or
`https://whatismyipaddress.com`) through your proxy — you should see a
GitHub Actions or ngrok IP address.
## How It Works
1. GitHub Actions starts a Docker container running `mhrv-tunnel-node` on port
`8080`
2. `ngrok` creates a secure tunnel using your authtoken, assigning a temporary
`*.ngrok-free.app` URL that routes to `localhost:8080` on the runner
3. The workflow extracts this URL from the ngrok API and displays it
4. `CodeFull.gs` forwards tunnel operations to this URL over HTTPS
5. The runner stays alive for 6 hours, then shuts down automatically
## Renewing the Tunnel
The tunnel shuts down after 6 hours. To start a new session:
1. Go to the **Actions** tab
2. Select **Full Tunnel (ngrok)**
3. Click **Run workflow > Run workflow**
4. Check the tunnel URL in the logs. Each ngrok free account gets one
auto-assigned **dev domain** that's permanent across runs — the URL is the
same every time you re-run the workflow, so no `CodeFull.gs` update is
needed after the initial setup.
## Limitations
- Requires an ngrok account (free tier: 1 online tunnel, limited connections
per minute).
- **ngrok TLD note**: ngrok handed out `*.ngrok-free.app` domains until early
2026; new free-tier accounts now get `*.ngrok-free.dev` instead, with no
way to switch back. **Some Iran ISPs block `*.ngrok-free.dev` at the DNS
layer.** If your tunnel works on a non-Iran network but `curl` from your
Iran network times out at TCP, the `.dev` block is why. Workarounds:
- Switch to **cloudflared Quick** (Method 1) — different TLD, often passes
where ngrok's `.dev` doesn't.
- Switch to **HuggingFace Spaces (Docker)** — run tunnel-node directly on
a Space, get a permanent `*.hf.space` URL with no tunnel layer.
- Pay for ngrok's $10/mo Personal plan to get a `*.ngrok.app` domain
(the older, more widely allowlisted TLD).
- 6-hour maximum per session (GitHub Actions limit).
- Slightly higher latency than cloudflared methods (extra hop through ngrok's
relay servers).
## Troubleshooting
| Problem | Solution |
|---|---|
| ngrok authentication fails | Verify `NGROK_AUTH_TOKEN` matches the token in your [ngrok dashboard](https://dashboard.ngrok.com). |
| Workflow fails at Docker step | GitHub Actions may be pulling the image for the first time. Wait 2-3 minutes and retry. |
| No tunnel URL appears in logs | Check that the **Expose tunnel** step completed. The URL is fetched from the ngrok API — allow 10 seconds for the tunnel to establish. |
| Connection limit reached | ngrok's free tier limits connections per minute. Wait a moment and retry. |
| `CodeFull.gs` returns 502 or timeout | Verify the tunnel URL is correct and the workflow is still running. Check that `TUNNEL_AUTH_KEY` matches in both the secret and `CodeFull.gs`. |
[here]: ngrok.yml