Merge pull request #11 from starkSV/feat/cf-worker-proxy

docs: update README, About, Privacy and Disclaimer for CF Worker
This commit is contained in:
Shekhar 2026-05-18 12:58:47 +05:30 committed by GitHub
commit 38ea92d014
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 48 additions and 15 deletions

View file

@ -37,8 +37,9 @@ MSDL replicates the session flow that Microsoft uses to serve ISO download links
```
windows-iso-downloader/
├── frontend/ # React 19 + TypeScript + Vite + Tailwind v4
├── backend/ # Go proxy server (recommended for production)
├── frontend/ # React 19 + TypeScript + Vite + Tailwind v4
├── backend/ # Go proxy server (recommended for production)
├── cloudflare-worker/ # Optional CF Worker for distributed IP routing
└── README.md
```
@ -47,16 +48,18 @@ windows-iso-downloader/
## How It Works
```
Browser → Backend Proxy → Microsoft Download API → Signed CDN URL
1. Register session (Microsoft tracking endpoint)
2. Parse MDT fingerprint script
3. Fetch SKU list (available languages)
4. Fetch signed CDN download URL
Browser → Backend → (CF Worker) → Microsoft API → Signed CDN URL
1. Register session (Microsoft tracking endpoint)
2. Parse MDT fingerprint script
3. Fetch SKU list (available languages)
4. Fetch signed CDN download URL
```
The flow mirrors [Fido.ps1](https://github.com/pbatard/Fido) by Pete Batard — the same script bundled with Rufus.
Outbound requests to Microsoft are optionally routed through a Cloudflare Worker (`cloudflare-worker/worker.js`). This distributes requests across Cloudflare's global edge IPs instead of a single server IP, preventing Microsoft's rate-limit block (error 715-123130) under high traffic. The Worker is opt-in via environment variables — omit them to go direct to Microsoft.
---
## Running Locally
@ -84,6 +87,17 @@ Create `frontend/.env.local`:
VITE_API_URL=http://localhost:3002
```
#### Optional: Cloudflare Worker (recommended for production)
Deploy `cloudflare-worker/worker.js` to Cloudflare Workers, then set these on the backend:
```env
CF_WORKER_URL=https://your-worker.your-name.workers.dev
CF_WORKER_SECRET=your-secret # must match the CF_WORKER_SECRET secret set in the Worker's settings
```
Omit both to go direct to Microsoft (fine for local development and low-traffic self-hosting).
---
## API Reference
@ -167,14 +181,15 @@ Returns signed download links from Microsoft's CDN.
## Deployment
> ⚠️ **Deploy the backend to a standard VPS** (Hetzner, DigitalOcean, Linode, etc.) — **not** serverless platforms like Vercel, Cloudflare Workers, or AWS Lambda. Microsoft rate-limits known datacenter IP ranges.
Recommended setup:
| Component | Platform |
|---|---|
| Frontend | Cloudflare Pages / Vercel (static) |
| Backend | VPS with a non-datacenter IP |
| Backend | VPS (Hetzner, DigitalOcean, Linode, etc.) |
| Outbound proxy | Cloudflare Worker (optional, recommended for public instances) |
> ⚠️ **Deploy the Go backend to a standard VPS**, not serverless platforms. The Cloudflare Worker is used only as an outbound proxy for Microsoft API calls — the backend itself must be a long-running process with session state.
---

View file

@ -67,8 +67,12 @@ export default function AboutPage() {
<li>Call the download links API using the warmed session to get signed CDN URLs</li>
</ol>
<p>
Links are IP-tied to the server and expire after 24 hours this is standard
Microsoft behaviour, not a limitation of MSDL.
Outbound requests to Microsoft are routed through a Cloudflare Worker, which
distributes traffic across Cloudflare's global edge IPs. This prevents any single
IP from being rate-limited by Microsoft under high traffic.
</p>
<p>
Links expire after 24 hours this is standard Microsoft behaviour, not a limitation of MSDL.
</p>
</Section>

View file

@ -30,7 +30,7 @@ export default function DisclaimerPage() {
>
<div>
<h1 className="text-2xl font-bold text-white mb-1">Disclaimer</h1>
<p className="text-xs font-mono text-zinc-600">Last updated: April 9, 2026</p>
<p className="text-xs font-mono text-zinc-600">Last updated: May 18, 2026</p>
</div>
<div className="p-4 rounded-xl border border-amber-500/15 bg-amber-500/6 text-amber-400/80 text-[12px] leading-relaxed">

View file

@ -30,7 +30,7 @@ export default function PrivacyPolicyPage() {
>
<div>
<h1 className="text-2xl font-bold text-white mb-1">Privacy Policy</h1>
<p className="text-xs font-mono text-zinc-600">Last updated: April 9, 2026</p>
<p className="text-xs font-mono text-zinc-600">Last updated: May 18, 2026</p>
</div>
<Section title="No data collected">
@ -60,6 +60,20 @@ export default function PrivacyPolicyPage() {
(<code className="text-zinc-400 text-[11px] font-mono bg-white/5 px-1 py-0.5 rounded">software.download.prss.microsoft.com</code>).
We are not responsible for Microsoft's privacy practices or link availability.
</p>
<p>
API requests to Microsoft are routed through a Cloudflare Worker running on
Cloudflare's edge network. Cloudflare may process request metadata in transit
in accordance with their{' '}
<a
href="https://www.cloudflare.com/privacypolicy/"
target="_blank"
rel="noopener noreferrer"
className="text-blue-400 hover:text-blue-300 transition-colors"
>
privacy policy
</a>.
No user data or download links are stored by the Worker.
</p>
</Section>
<Section title="Open source">