Remote Host for Manifest Generator
Configure OpenSSH on a remote Windows host so AxiomEditor can upload client patches via SFTP.
The Manifest Generator in AxiomEditor can upload client patches directly to your update server over SFTP. This guide walks through installing and configuring OpenSSH on the remote Windows host so that upload works out of the box.
This guide covers the remote host (the machine that serves patches to players). You run AxiomEditor on your local dev machine - no SSH setup is needed there.
Prerequisites
OS
Windows Server 2019+ or Windows 10 1809+ (OpenSSH is a built-in optional feature)
Access
Administrator or Remote Desktop access to the host
Web server
Nginx, Apache, IIS, or any HTTP server already serving your update folder
Firewall
Ability to open TCP port 22 (or your chosen SSH port)
1. Install OpenSSH Server
OpenSSH ships as an optional Windows feature since Windows Server 2019 / Windows 10 1809. No third-party downloads needed.
Open PowerShell as administrator:
# Check if OpenSSH Server is available
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
# Install it
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0If the capability isn't listed (older builds), install manually from the Microsoft OpenSSH releases.
Settings -> Apps -> Optional Features -> Add a feature -> search for OpenSSH Server -> Install.
On Windows Server: Server Manager -> Manage -> Add Roles and Features -> Features -> OpenSSH Server.
2. Start and enable the SSH service
You should see Status: Running.
3. Configure the SFTP subsystem
OpenSSH on Windows includes the SFTP subsystem by default. Verify it's enabled in the SSH config:
Confirm this line exists and is not commented out:
If the file doesn't exist yet, start the sshd service once and it will generate the default config at C:\ProgramData\ssh\sshd_config.
If you made any changes, restart the service:
4. Open the firewall
The installer usually creates a firewall rule automatically. Verify it exists:
If no rule exists, create one:
If your host provider has an external firewall (Azure NSG, AWS Security Group, Hetzner firewall, etc.), open port 22 there too.
5. Set up a Windows user account
AxiomEditor authenticates with a username and password. The account needs read/write access to the update folder.
If you already RDP in as Administrator, you can use those same credentials in AxiomEditor. No extra setup needed - skip to step 6.
Creating a separate user limits access scope:
If you want this user to be able to create the folder structure on first upload, grant access to the parent directory instead.
6. Verify SSH works
From your local dev machine (where AxiomEditor runs), open a terminal and test:
Accept the host key fingerprint when prompted. If you get a command prompt on the remote machine, SSH is working. Type exit to disconnect.
If this step fails, AxiomEditor's upload will fail too. Common issues:
Connection refused:
sshdservice not running, or firewall blocking port 22.Permission denied: Wrong username or password.
Connection timed out: External firewall (cloud provider) hasn't opened port 22.
7. Configure AxiomEditor
Open AxiomEditor and go to the Manifest Generator tab. Fill in the Upload section:
Enable Upload
Checked
Host
Remote host IP or hostname
62.84.187.28
Port
SSH port
22
Username
Windows account on the host
Administrator
Password
Account password
Remote Path
Folder on the host where patches are served
C:\nginx\html\muupdate
Streams
Concurrent upload connections (1-32)
16
Click Save Config to persist these settings to manifest.ini alongside AxiomEditor.
The Remote Path should point to the directory your web server serves over HTTP. The client launcher downloads patches from this folder. For Nginx, this is typically a subdirectory under html\.
8. Set up Nginx to serve the update files
AxiomEditor uploads patch files to the remote host via SFTP, but players download them over HTTP. You need a web server on the remote host to serve the update folder. Nginx is the recommended option.
Install Nginx
Download the latest Windows build from nginx.org (the "Stable" zip).
Extract to
C:\nginx-1.28.1(or wherever you prefer).Replace
conf\nginx.confwith the configuration below.
Nginx configuration
Key points about this config
/
Serves your website frontend (React SPA with client-side routing)
/api
Proxies API requests to your backend on port 3001
/update/
Serves the update folder — this is what the client launcher hits
Caching strategy: All patch files under /update/ are cached aggressively (1 year) because the client uses the manifest to decide what to download — file URLs effectively change when content changes. manifest.json and version.dat are explicitly set to no-cache so the launcher always gets the latest version info.
The alias path in the /update/ block must match the Remote Path you configured in AxiomEditor. If AxiomEditor uploads to C:\nginx-1.28.1\html\muupdate, the alias must point there too.
Create the update folder and start Nginx
Make Nginx start on boot
Nginx on Windows doesn't install as a service by default. Use NSSM (Non-Sucking Service Manager) to wrap it:
Open port 80 in the firewall
Verify it works
After AxiomEditor uploads a manifest, open a browser and navigate to:
You should see the JSON manifest with your file list and version number. If this works, the client launcher will be able to download patches.
8b. Alternative: Set up IIS to serve the update files
If you prefer IIS over Nginx (common on Windows Server where IIS is already installed), use this setup instead of step 8.
Install IIS
Server Manager -> Manage -> Add Roles and Features -> Server Roles -> Web Server (IIS) -> check Web Server and Management Tools -> Install.
On Windows 10/11 (non-Server): Settings -> Apps -> Optional Features -> More Windows Features -> Internet Information Services -> check the box -> OK.
Create the update site folder
Set this as your Remote Path in AxiomEditor.
Configure IIS
Open IIS Manager (inetmgr) and either add a virtual directory to the Default Web Site or create a new site.
In IIS Manager, expand Sites -> Default Web Site.
Right-click -> Add Virtual Directory.
Alias:
updatePhysical path:
C:\inetpub\muupdateClick OK.
Players will access patches at http://YOUR_HOST_IP/update/manifest.json.
Right-click Sites -> Add Website.
Site name:
MuUpdatePhysical path:
C:\inetpub\muupdatePort:
8080(or 80 if no other site uses it)Click OK.
Add a web.config for caching and MIME types
web.config for caching and MIME typesCreate C:\inetpub\muupdate\web.config:
IIS blocks unknown file extensions by default (returns 404). The <staticContent> block above registers all MU client file types so IIS serves them. Without this, players get download failures on .bmd, .ozj, .ozt, etc.
Grant folder permissions
The IIS worker process (IIS_IUSRS) needs read access, and your SFTP upload user needs write access:
Open port 80 in the firewall (IIS)
IIS typically adds its own firewall rule during install. Verify:
If no rule exists:
Verify IIS is serving updates
After AxiomEditor uploads a manifest:
You should see the JSON manifest. If you get a 404 on .dat or .bmd files, check that the web.config MIME types are in place.
9. Test the full pipeline
Set Client Folder to your compiled client output directory.
Set Output Folder to a local staging directory (e.g.
D:\manifest_output).Click Generate Manifest.
AxiomEditor runs 5 phases: scan, hash, copy, create manifest, upload.
Phase 5 (SFTP upload) connects to the remote host and uploads only changed files.
On the first run, all files are uploaded. Subsequent runs use delta sync - only files whose CRC32 hash changed since the last manifest are transferred.
How the upload works
Understanding the upload mechanics helps troubleshoot issues:
AxiomEditor connects to the host via SFTP (SSH file transfer protocol).
It downloads the existing
manifest.jsonfrom the remote path (if any).It compares local vs remote file hashes.
Only changed or new files are uploaded. Deleted files are removed from the remote.
manifest.jsonandversion.datare always uploaded last.Multiple SFTP connections run in parallel (controlled by the Streams setting).
Troubleshooting
Upload fails with "connection refused" or timeout
Verify
sshdis running:Get-Service sshdon the remote host.Check Windows Firewall:
Get-NetFirewallRule -Name *ssh*.Check external firewall (cloud provider panel).
Test from your local machine:
ssh Username@Host -p Port.
Upload fails with "permission denied"
Double-check the username and password in AxiomEditor.
Verify the user can log in via SSH:
ssh Username@Host.If using a non-admin user, confirm it has write access to the remote path:
icacls "C:\nginx\html\muupdate".
Upload succeeds but client launcher can't download patches
The remote path must match your web server's document root. Files uploaded via SFTP are just files on disk - the web server (Nginx/IIS/Apache) must be configured to serve that directory over HTTP.
Check that
manifest.jsonis accessible in a browser:http://YOUR_HOST_IP/muupdate/manifest.json.
Upload is slow
Increase the Streams setting (up to 32) for more parallel connections.
First upload transfers everything. Subsequent uploads are incremental (delta sync) and much faster.
Check network bandwidth between your machine and the host.
"Subsystem request failed" error
The SFTP subsystem isn't enabled. Open C:\ProgramData\ssh\sshd_config on the remote host and ensure the Subsystem sftp sftp-server.exe line is uncommented. Restart sshd after editing.
Security considerations
The password is stored in plain text in manifest.ini next to AxiomEditor. Keep this file on your dev machine only - do not distribute it with client or server bundles.
Consider using a dedicated user with access only to the update folder, not the full Administrator account.
If your host supports it, change the SSH port from the default 22 to reduce automated scan noise. Update the Port field in AxiomEditor to match.
Disable SSH password authentication entirely once you've confirmed AxiomEditor works, and switch to key-based auth if your workflow supports it (advanced - requires manual SSH key setup outside AxiomEditor).
Last updated