Files

YMhut Unified Management

This service unifies the old server/update and server/feedback-mailer projects.

Nginx Reverse Proxy

Production deployments should start from deploy/nginx/unified-management.conf.example. Set its domain, TLS settings, upstream port, and /downloads/ alias for the current machine. Keep client_max_body_size at least 8 MiB above YMHUT_RELEASE_UPLOAD_MAX_BYTES for multipart overhead; the default service limit is 1 GiB.

The upload location disables request buffering so packages stream directly to Go and uses a 30-minute timeout. The download location lets Nginx send immutable package files without routing their bytes through the service. Run nginx -t before reloading a control-panel generated configuration.

What It Provides

  • Go backend with SQLite by default.
  • Optional MySQL configuration with runtime status and failover hooks.
  • Legacy routes for update-info.json, tool-status.json, media-types.json, modules.json, downloads, and feedback.
  • New client discovery through /api/client/bootstrap.
  • Admin login with default account admin/admin.
  • Login captcha, HttpOnly session cookie, and CSRF checks.
  • In-process media/data source service with scheduled health checks.
  • Vue admin/portal source and Rust WASM helper source.

Run

cd server\unified-management
$env:GOPROXY="https://goproxy.io,https://mirrors.aliyun.com/goproxy,direct"
go mod download all
go mod verify
go run main.go

These commands only set the proxy for the current PowerShell process and do not modify the global Go configuration. Use go mod tidy -diff when reviewing dependency changes; normal startup must not rewrite go.mod or go.sum.

The startup preflight prints:

  • the accepted entrypoint: go run main.go
  • the listen address
  • storage, SQLite, legacy JSON, downloads, and frontend dist status

Alternative command entrypoint:

go run .\cmd\unified-management

Tests:

.\scripts\test.ps1

The test and release scripts prefetch the complete module graph through a process-local proxy fallback and verify every module against go.sum/GOSUMDB. Override the proxy chain without changing global Go settings when needed:

$env:YMHUT_GOPROXY="https://your-proxy.example,direct"
.\scripts\test.ps1 -Race

-Race requires a working C compiler in PATH; normal tests and release builds do not.

Frontend Build Check

Startup preflight checks the selected admin asset source and both other built web apps. The admin build must include:

  • web/admin/dist/index.html
  • web/admin/dist/asset-manifest.json
  • web/admin/dist/admin-build.json
  • every entry, CSS file, asset, import, and dynamic import named by the manifest
  • web/portal/dist/index.html
  • web/portal/dist/assets

Release binaries built with embed_web default to the embedded admin build and never mix it with files from disk. Non-embedded development builds default to disk. Override this explicitly with YMHUT_ADMIN_ASSET_MODE=embedded|disk; an invalid or incomplete selected source is reported through /api/admin/system/health and is not replaced by files from the other source. Build the local dist files with:

cd server\unified-management\web\admin
npm install
npm run build
npm run validate:build

cd ..\portal
npm install
npm run build

The Go server serves portal assets from /assets/* and admin assets from /admin/assets/*. Admin HTML is always no-store, hashed assets are immutable, and missing assets return 404 rather than the SPA shell. Production deployment replaces the single embedded service binary; do not copy web/admin/dist over a production binary.

Release Binaries

Build frontend assets and produce merged backend binaries for Windows and Linux. The scripts run npm run build for both web apps and compile Go with -tags embed_web, so the resulting binaries include the admin and portal frontends:

cd server\unified-management
.\scripts\build-release.ps1 -Version 0.1.0

Linux/macOS shell:

cd server/unified-management
VERSION=0.1.0 ./scripts/build-release.sh

Outputs are written to dist-release/:

  • ymhut-unified-management-windows-amd64.exe
  • ymhut-unified-management-linux-amd64
  • ymhut-unified-management-linux-arm64

Default Port

The default listen address is :33550.

Override it with either:

$env:YMHUT_LISTEN=":33551"

or:

$env:PORT="33551"

Environment

  • YMHUT_LISTEN: listen address, default :33550
  • YMHUT_BASE_URL: public endpoint, default https://update.ymhut.cn
  • YMHUT_DB_PROVIDER: sqlite or mysql
  • YMHUT_SQLITE_PATH: SQLite path
  • YMHUT_MYSQL_DSN: MySQL DSN
  • YMHUT_UPDATE_PUBLIC_DIR: legacy update public directory
  • YMHUT_DOWNLOADS_DIR: package download directory
  • YMHUT_SOURCE_CHECK_SECONDS: source health check interval

Frontend

  • web/admin: Vue admin console source
  • web/portal: Vue public portal source
  • web/wasm: Rust WASM helpers

Rust WASM functions:

  • compareVersions
  • normalizeReleaseManifest
  • validateSourceCatalog
  • scoreEndpointHealth
  • mergeLegacyMediaTypes