Files
BetterDesk/web-nodejs
UNITRONIX 760c0e933d feat(agent-client): alpha bundle generator + cross-platform build pipeline
Generator UI: web-nodejs/views/generator.ejs + public/js/generator.js + public/css/generator.css. Logo upload up to 10 MB, 16 MB body parser, branding form (product name, colors, server URL, etc.), per-branding hash deduplication.

Build pipeline: web-nodejs/services/agentBundleService.js (queue API + branding hash) and agentBuildWorker.js (DB-backed queue, 5s poll, concurrency 1, 30 min timeout). Spawns 'cargo tauri build --bundles <fmt> [--target <triple>] [--runner cargo-xwin]' per platform under systemd User=root. Loads /etc/betterdesk/build.env at module top so BUILD_USER/CARGO_HOME/PATH survive empty service env. Uses absolute CARGO_BIN/NPM_BIN paths to avoid PATH-resolution issues. Artifact path resolution honors profile.target presence (no triple subdir when omitted).

Toolchain installer: scripts/install-build-toolchain.sh (Rust + targets + cargo-tauri + cargo-xwin + mingw + makensis + dpkg-deb + rpmbuild + appimagetool + pnpm + node), writes /etc/betterdesk/build.env, 12-tool verification. Wired into betterdesk.sh menu as option B with post-install rsync of agent source to /opt/BetterDeskConsole/agent-source/.

Agent download page: web-nodejs/views/agent-download.ejs + public/css/agent-download.css for end-user installer downloads per platform/format with live status.

Branding scaffold (Tauri side): betterdesk-agent-client/src-tauri/src/branding.rs (Branding struct + OnceLock cache + BETTERDESK_AGENT_BRANDING env override + BaseDirectory::Resource resolve). resources/branding.json (dev skeleton). lib.rs registers module + get_branding command. commands.rs exposes get_branding IPC. tauri.conf.json declares resources/branding.json. Frontend integration of get_branding is intentionally pending — alpha.

Database: web-nodejs/services/database.js + dbAdapter.js add agent_bundle_builds + agent_bundles tables with full PostgreSQL + SQLite parity.

i18n: en.json + pl.json + zh-TW.json get ~75 new keys covering generator wizard, build status, download page, and toolchain installer messages.

Validated end-to-end on prod (Ubuntu 24.04, 4-core, PostgreSQL): linux/x64/AppImage built successfully (83.7 MB, 283s) for branding hash 25e2f242. linux/deb in progress, rpm + windows/exe queued.

Known follow-ups (NOT in this commit): SolidJS invoke('get_branding') wiring in App.tsx, betterdesk.ps1 toolchain menu mirror, reset-password.js PostgreSQL support, Docker decision.

This commit was made possible thanks to Insolve.
2026-05-29 07:15:45 +02:00
..

BetterDesk Console v2.0 (Node.js)

Modern web management console for RustDesk/BetterDesk server.

Features

  • 🎨 Modern UI - Dark theme, responsive design, Google Material Icons
  • 🌍 Multilingual - English and Polish support, easy to add more
  • 🔐 Secure - Session-based authentication, bcrypt password hashing, rate limiting
  • 📱 Devices - View, search, filter, ban/unban, change ID, bulk delete
  • 🔑 Keys - View public key, download file, QR code for mobile
  • ⚙️ Generator - Generate client configuration strings
  • 📊 Dashboard - Server status, device statistics

Requirements

  • Node.js 18.x or 20.x
  • npm 9.x or later
  • SQLite3 (for better-sqlite3)

Installation

Development

cd web-nodejs
npm install
npm run dev

Production

cd web-nodejs
npm install --production
npm start

Docker

docker build -f Dockerfile.console.node -t betterdesk-console .
docker run -d -p 5000:5000 \
  -v /opt/rustdesk:/opt/rustdesk \
  -e SESSION_SECRET=your-secret-here \
  betterdesk-console

Environment Variables

Variable Default Description
PORT 5000 HTTP server port
NODE_ENV development Environment (development / production)
DB_PATH /opt/rustdesk/db_v2.sqlite3 Path to SQLite database
KEYS_PATH /opt/rustdesk Path to key files directory
SESSION_SECRET auto-generated Session cookie secret
BETTERDESK_API_URL http://127.0.0.1:21114 BetterDesk Go server API endpoint
DEFAULT_LANG en Default language code

Project Structure

web-nodejs/
├── config/
│   └── config.js        # Environment configuration
├── lang/
│   ├── en.json          # English translations
│   └── pl.json          # Polish translations
├── middleware/
│   ├── auth.js          # Authentication middleware
│   ├── i18n.js          # Language detection
│   ├── rateLimiter.js   # Rate limiting
│   └── security.js      # Security headers
├── public/
│   ├── css/             # Stylesheets
│   ├── js/              # Client-side JavaScript
│   └── favicon.svg      # App icon
├── routes/
│   ├── auth.routes.js   # Login/logout endpoints
│   ├── dashboard.routes.js
│   ├── devices.routes.js
│   ├── generator.routes.js
│   ├── i18n.routes.js
│   ├── index.js         # Route mounting
│   ├── keys.routes.js
│   └── settings.routes.js
├── services/
│   ├── authService.js   # Password hashing
│   ├── database.js      # SQLite operations
│   ├── betterdeskApi.js  # BetterDesk Go server REST API client
│   ├── i18nService.js   # Translation manager
│   └── keyService.js    # Key file operations
├── views/
│   ├── errors/          # Error pages
│   ├── layouts/         # Base templates
│   ├── partials/        # Reusable components
│   └── *.ejs            # Page templates
├── package.json
└── server.js            # Application entry point

API Endpoints

Authentication

Method Endpoint Description
POST /api/auth/login Login with username/password
POST /api/auth/logout Logout current session
GET /api/auth/verify Verify current session
POST /api/auth/password Change password

Devices

Method Endpoint Description
GET /api/devices List all devices
GET /api/devices/:id Get device details
DELETE /api/devices/:id Delete device
POST /api/devices/:id/ban Ban device
POST /api/devices/:id/unban Unban device
POST /api/devices/:id/change-id Change device ID
POST /api/devices/bulk-delete Delete multiple devices

Keys

Method Endpoint Description
GET /api/keys/public Get public key
GET /api/keys/qr Get public key as QR code
GET /api/keys/download Download key file

Other

Method Endpoint Description
GET /api/stats Device statistics
GET /api/server/status Server status
POST /api/sync-status Sync online status from HBBS
GET /api/settings/server-info Server information
GET /api/settings/audit-log Audit log entries

Default Credentials

  • Username: admin
  • Password: admin

⚠️ Change the default password immediately after installation!

Adding Languages

  1. Copy lang/en.json to lang/xx.json (where xx is language code)
  2. Translate all values (keep keys unchanged)
  3. Update meta.lang, meta.name, meta.native_name
  4. Restart the application

License

Apache-2.0 License - see LICENSE file for details.