NetDesk 1.5.0 — source release
This commit is contained in:
commit
40318aafdd
227 files changed
+80798
No files matched your search
@@ -0,0 +1,52 @@
|
||||
# Publishing the source on netdesk.space
|
||||
|
||||
The full source is downloadable + git-cloneable straight from the website:
|
||||
- Page: https://netdesk.space/source
|
||||
- Download: https://netdesk.space/downloads/netdesk-src-latest.tar.gz (+ .zip)
|
||||
- Clone: git clone https://netdesk.space/git/netdesk.git
|
||||
|
||||
## How it's built (secret-safe)
|
||||
|
||||
1. **Export tracked files only** (never DBs/artifacts/secrets):
|
||||
`git archive HEAD` from this repo + the sibling `netdesk-native` repo
|
||||
(extracted into `netdesk/native/`).
|
||||
2. **Strip internal + sensitive** files: planning/roadmap/queue docs,
|
||||
`native/certs/`, `native/docs/implementation-specs.md`, dev screenshots.
|
||||
3. **Secret scan** the export (known secrets + an adversarial multi-scanner
|
||||
sweep for keys/tokens/PII/stray binaries) and scrub any hit. The real
|
||||
account password, owner email, account token and live host ID have been
|
||||
removed from source — keep it that way (they must never be committed).
|
||||
4. **Package**: `.tar.gz` + `.zip` (top-level `netdesk/`) and a bare repo
|
||||
(`git clone --bare` + `git update-server-info`) for dumb-HTTP clone.
|
||||
|
||||
## How it's served
|
||||
|
||||
Static nginx locations in `/etc/nginx/conf.d/netdesk.space.conf` (see
|
||||
`nginx-source.snippet`) serving `/opt/netdesk/public/{source,downloads,git}`.
|
||||
Zero app-server changes; `nginx -t` + `systemctl reload nginx` (no downtime).
|
||||
|
||||
`source-page.html` is the download/clone landing page (served at /source/).
|
||||
|
||||
## GitHub-style browsing (Gitea)
|
||||
|
||||
The source is also browsable like GitHub — file tree, rendered README, commit
|
||||
history, language stats, per-branch ZIP/TAR.GZ downloads:
|
||||
|
||||
- **Browse:** https://netdesk.space/git/akronlogic/netdesk
|
||||
- **Clone:** git clone https://netdesk.space/git/akronlogic/netdesk.git
|
||||
|
||||
Served by **Gitea** (self-hosted, latest stable) running as the systemd service
|
||||
`gitea` on 127.0.0.1:3030, reverse-proxied by nginx at the `/git/` sub-path
|
||||
(`ROOT_URL = https://netdesk.space/git/`). SQLite data in `/var/lib/gitea`,
|
||||
config in `/etc/gitea/app.ini`. Hardened: registration disabled, anonymous
|
||||
read-only, SSH/Actions/Packages off, offline mode. Admin login is in
|
||||
`/root/gitea-admin.txt` (root-only) — user `ndadmin`.
|
||||
|
||||
### Publishing an update
|
||||
Rebuild the secret-scrubbed export (see above), then push it to the Gitea repo:
|
||||
```bash
|
||||
cd <scrubbed-export> && git init && git add -A && git commit -m "release"
|
||||
git push --force https://ndadmin:<pw>@netdesk.space/git/akronlogic/netdesk.git master
|
||||
```
|
||||
(Only ever push the SCRUBBED export — never the raw repo, which contains the
|
||||
owner email in portal.js. Re-run the secret scan first.)
|
||||
@@ -0,0 +1,16 @@
|
||||
# ---- Public source code: download + git clone (served statically) ----
|
||||
location = /source { return 302 /source/; }
|
||||
location /source/ {
|
||||
alias /opt/netdesk/public/source/;
|
||||
index index.html;
|
||||
add_header Cache-Control "public, max-age=300";
|
||||
}
|
||||
location /downloads/ {
|
||||
alias /opt/netdesk/public/downloads/;
|
||||
autoindex on;
|
||||
add_header Cache-Control "public, max-age=300";
|
||||
}
|
||||
location /git/ {
|
||||
alias /opt/netdesk/public/git/;
|
||||
autoindex off;
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
<!doctype html>
|
||||
<html lang="en" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>NetDesk — Source Code</title>
|
||||
<meta name="description" content="Download or clone the full NetDesk source — self-hosted remote desktop. Server, Windows host, and native Rust client. Straight from netdesk.space, no GitHub needed.">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<style>
|
||||
:root{
|
||||
--bg:#0b0e14; --bg2:#11151f; --card:#121724; --fg:#e8edf6; --muted:#9aa6bd; --faint:#6b7688;
|
||||
--accent:#4d8bff; --accent2:#34d399; --hair:rgba(255,255,255,.08); --hair2:rgba(255,255,255,.14);
|
||||
--grad:linear-gradient(135deg,#4d8bff,#6aa1ff 44%,#34d399);
|
||||
--shadow:0 24px 70px -18px rgba(0,0,0,.7);
|
||||
font-synthesis-weight:none;
|
||||
}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:var(--bg);color:var(--fg);
|
||||
font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
|
||||
line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}
|
||||
body::before{content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
|
||||
background:
|
||||
radial-gradient(900px 500px at 12% -8%, rgba(77,139,255,.16), transparent 60%),
|
||||
radial-gradient(800px 520px at 100% 0%, rgba(52,211,153,.10), transparent 55%)}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
a:hover{text-decoration:underline}
|
||||
.wrap{max-width:900px;margin:0 auto;padding:0 20px}
|
||||
nav{display:flex;align-items:center;justify-content:space-between;padding:20px 0;border-bottom:1px solid var(--hair)}
|
||||
.brand{display:flex;align-items:center;gap:10px;font-weight:750;font-size:18px;letter-spacing:-.3px}
|
||||
.logo{width:30px;height:30px;border-radius:9px;background:var(--grad);display:inline-flex;align-items:center;justify-content:center}
|
||||
.logo svg{width:18px;height:18px}
|
||||
.nav-links a{color:var(--muted);margin-left:20px;font-size:14.5px;font-weight:500}
|
||||
.nav-links a:hover{color:var(--fg);text-decoration:none}
|
||||
header.hero{padding:64px 0 34px;text-align:center}
|
||||
.eyebrow{display:inline-block;font-size:12px;font-weight:700;letter-spacing:1.3px;text-transform:uppercase;
|
||||
color:#9cc0ff;background:rgba(77,139,255,.12);border:1px solid rgba(77,139,255,.25);padding:5px 13px;border-radius:999px}
|
||||
h1{font-size:clamp(34px,6vw,52px);line-height:1.08;letter-spacing:-1.4px;margin:18px 0 10px;font-weight:800}
|
||||
h1 .g{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
||||
.sub{color:var(--muted);font-size:clamp(16px,2.3vw,19px);max-width:620px;margin:0 auto}
|
||||
.cta{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;margin-top:30px}
|
||||
.btn{display:inline-flex;align-items:center;gap:9px;padding:14px 26px;border-radius:12px;font-weight:650;font-size:15px;
|
||||
border:1px solid var(--hair2);color:var(--fg);background:var(--card);transition:.15s;position:relative;overflow:hidden}
|
||||
.btn:hover{transform:translateY(-2px);text-decoration:none;border-color:rgba(77,139,255,.5)}
|
||||
.btn.primary{background:var(--grad);border-color:transparent;color:#071018;box-shadow:0 10px 26px -8px rgba(61,126,255,.55)}
|
||||
.btn.primary:hover{filter:brightness(1.05)}
|
||||
.btn .sz{color:var(--faint);font-weight:500;font-size:13px}
|
||||
.btn.primary .sz{color:rgba(7,16,24,.65)}
|
||||
section{padding:30px 0;border-top:1px solid var(--hair)}
|
||||
h2{font-size:24px;letter-spacing:-.5px;margin:0 0 6px;font-weight:750}
|
||||
.lead{color:var(--muted);margin:0 0 18px}
|
||||
.code{background:#0a0e16;border:1px solid var(--hair);border-radius:12px;padding:16px 46px 16px 18px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
|
||||
font-size:14px;line-height:1.7;color:#c7d2e6;overflow-x:auto;position:relative;white-space:pre-wrap;word-break:break-word}
|
||||
.code .c{color:#5f6b80}
|
||||
.code .p{color:var(--accent2)}
|
||||
.copy{position:absolute;top:10px;right:10px;background:var(--card);border:1px solid var(--hair2);color:var(--muted);
|
||||
border-radius:8px;padding:5px 11px;font-size:12px;cursor:pointer;font-family:Inter,sans-serif}
|
||||
.copy:hover{color:var(--fg);border-color:var(--accent)}
|
||||
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-top:6px}
|
||||
.c-card{background:var(--card);border:1px solid var(--hair);border-radius:14px;padding:18px}
|
||||
.c-card b{display:block;font-size:15px;margin-bottom:4px}
|
||||
.c-card span{color:var(--muted);font-size:13.5px}
|
||||
.c-card .mono{font-family:ui-monospace,monospace;color:#9cc0ff;font-size:12.5px}
|
||||
footer{padding:36px 0 50px;color:var(--faint);font-size:13.5px;text-align:center;border-top:1px solid var(--hair);margin-top:24px}
|
||||
.note{font-size:13.5px;color:var(--faint);margin-top:14px}
|
||||
@media (max-width:560px){.btn{width:100%;justify-content:center}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<nav>
|
||||
<a class="brand" href="/"><span class="logo"><svg viewBox="0 0 32 32" fill="none"><path d="M8 20l8-12 8 12-8-4z" fill="#071018"/><rect x="12" y="18" width="8" height="7" rx="2" fill="#071018"/></svg></span>NetDesk</a>
|
||||
<div class="nav-links"><a href="/">Home</a><a href="/app">Web app</a><a href="/download">Download app</a></div>
|
||||
</nav>
|
||||
|
||||
<header class="hero">
|
||||
<span class="eyebrow">Open source · self-hosted</span>
|
||||
<h1>The complete <span class="g">NetDesk source</span></h1>
|
||||
<p class="sub">Every line — the relay server, the Windows host, the zero-install web viewer, and the native Rust client. Clone it or download it straight from here. No GitHub account required.</p>
|
||||
<div class="cta">
|
||||
<a class="btn primary" href="/git/akronlogic/netdesk"></> Browse the code</a>
|
||||
<a class="btn" href="/downloads/netdesk-src-latest.tar.gz" download>⬇ .tar.gz <span class="sz" id="szTgz"></span></a>
|
||||
<a class="btn" href="/downloads/netdesk-src-latest.zip" download>⬇ .zip <span class="sz" id="szZip"></span></a>
|
||||
</div>
|
||||
<p class="note">Version 1.5.0 · AES-256 end-to-end · Windows + Web today, macOS/Linux/Android via the native client build</p>
|
||||
</header>
|
||||
|
||||
<section>
|
||||
<h2>Clone with git</h2>
|
||||
<p class="lead">Served straight from netdesk.space over HTTPS:</p>
|
||||
<div class="code" id="cloneBox"><button class="copy" onclick="cp('cloneCmd')">Copy</button><span id="cloneCmd"><span class="c"># get the full source</span>
|
||||
git clone https://netdesk.space/git/akronlogic/netdesk.git
|
||||
cd netdesk</span></div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>What's inside</h2>
|
||||
<p class="lead">A single repository with every component of the system.</p>
|
||||
<div class="grid">
|
||||
<div class="c-card"><b>server/</b><span>Python aiohttp signaling + relay + REST API, SSO (SAML/OIDC/LDAP), SCIM, admin console, and the <span class="mono">web/</span> browser viewer.</span></div>
|
||||
<div class="c-card"><b>host/</b><span>Windows host/agent (runs as a SYSTEM service — reachable at the logon screen & across UAC) + a pywebview desktop app.</span></div>
|
||||
<div class="c-card"><b>native/</b><span>From-scratch native client: a Rust core (capture, encode, crypto, P2P) with a Flutter UI. Workspace crates: core, viewer, host, cli, opus, vpx, frb.</span></div>
|
||||
<div class="c-card"><b>docker/</b><span>Dockerfile + compose to run your own relay server with one command.</span></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Self-host in 60 seconds</h2>
|
||||
<p class="lead">Run your own relay server (your VPS, your rules — the shop never sees your screen):</p>
|
||||
<div class="code"><button class="copy" onclick="cp('runCmd')">Copy</button><span id="runCmd"><span class="c"># 1. get it</span>
|
||||
git clone https://netdesk.space/git/akronlogic/netdesk.git && cd netdesk
|
||||
<span class="c"># 2. install deps + run the server</span>
|
||||
pip install -r requirements.txt
|
||||
python server/netdesk_server.py --port 8443 --portal-password <span class="p">YOUR_PASSWORD</span>
|
||||
<span class="c"># 3. put it behind TLS (nginx/Caddy) and point your host + browser at it</span></span></div>
|
||||
<p class="note">Full deployment guide in <span style="color:var(--accent2)">docker/README.md</span> and <span style="color:var(--accent2)">README.md</span>. Source-available license — free to self-host & modify. See <span style="color:var(--accent2)">LICENSE</span>.</p>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
NetDesk · self-hosted remote desktop · <a href="/">netdesk.space</a><br>
|
||||
© 2026 Akronlogic. Source-available — free to self-host.
|
||||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
function cp(id){var t=document.getElementById(id).innerText;navigator.clipboard&&navigator.clipboard.writeText(t);
|
||||
var b=event.target;var o=b.textContent;b.textContent="Copied";setTimeout(function(){b.textContent=o},1200);}
|
||||
// fill archive sizes if a sizes.json is present
|
||||
fetch('/downloads/sizes.json',{cache:'no-store'}).then(function(r){return r.ok?r.json():null}).then(function(d){
|
||||
if(!d)return; if(d.tgz){document.getElementById('szTgz').textContent='('+d.tgz+')';}
|
||||
if(d.zip){document.getElementById('szZip').textContent='('+d.zip+')';}
|
||||
}).catch(function(){});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user