The launcher for the Fuuz In-House Deployment, currently in beta
281
Beta — on-premises Fuuz for Docker Swarm. One container installs and runs the whole platform.
⚠️ Beta. In-house Fuuz is still being shaped by the installations running it — expect rough edges, and please tell us when you hit one, with the launcher's log output. Evaluate freely, but think twice about production data: take backups and keep a copy off the machine. Settings and defaults may still change between releases.
Request a trial license — Fuuz will not start without one.
Give Docker 12 GB of memory and 4 CPUs (16 GB is better). On Windows that is .wslconfig, not the Docker Desktop sliders — see Giving Docker enough memory and CPU.
Start the launcher on the machine that will run Fuuz:
docker run -d --name fuuz-launcher \
--restart unless-stopped \
-p 127.0.0.1:9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v fuuz_launcher_state:/var/lib/fuuz-launcher \
mfgx/native-app-launcher:trial-latest
Windows: use PowerShell and the single-line form in step 3 — \ is not a line continuation there, and Git Bash breaks the Docker socket path.
Open the launcher. docker logs fuuz-launcher prints its address with an access token — http://localhost:9000/?token=…. The bare address will not work; take the whole line. Then paste your license key and press Start Fuuz.
The first start downloads ~32 images, so it is governed mostly by your connection. Everything below is detail.
Part of the Fuuz Industrial Intelligence Platform, for on-premises deployment.
This repository holds one image of roughly 32, and you do not pull them individually. The Fuuz Launcher deploys and manages the rest — three RabbitMQ brokers and a proxy, a three-member MongoDB replica set, Redis, object storage, an nginx reverse proxy, and the Fuuz services and web app — and it is where you go afterwards to start, stop, update, back up and troubleshoot.
You do not need to know Docker Swarm: the launcher initializes it, generates every password, orders the startup so nothing starts before what it depends on, and reports what is running.
Your key arrives by email from the form linked above. Copy the whole key — a partial one will not validate. Subscription customers use the key supplied with the subscription.
| Requirement | If it is not met | |
|---|---|---|
| Docker | Docker Desktop (Windows/macOS) or Docker Engine (Linux), running | Nothing can start. The launcher reports "Docker is not reachable". |
| CPU architecture | 64-bit x86 — x86_64, also called amd64 | Not supported on ARM. See x86 machines only below. |
| Memory available to Docker | 12 GB minimum, 16 GB recommended | Below 12 GB the launcher warns and lets you start anyway; expect services to restart under load and some not to come up. See Giving Docker enough memory and CPU. |
| CPUs available to Docker | 4 or more | A warning rather than a refusal, but scheduling ~32 containers on fewer is what makes a first start slow. |
| Host ports 80 and 443 | free, or moved | You do not have to free them. Set Web port and Secure web port to anything free instead — the launcher checks the ports you configured, and a conflict names the setting that moves it. An existing IIS, Apache or nginx is the usual cause; see If ports 80 or 443 are taken. |
| Disk | room for ~32 container images plus your data | Image pulls fail partway through. |
| Outbound access to Docker Hub | for the first start | Images cannot be pulled. Air-gapped installations are possible but need the images loaded onto the machine first — contact Fuuz. |
| A license key | see above | Fuuz cannot start. |
Fuuz images are published for 64-bit x86 (linux/amd64) only — ordinary Intel and AMD hardware, which is nearly every Windows and Linux server, plus Intel Macs.
ARM is not supported: Apple Silicon Macs, ARM cloud instances, Windows on ARM. Docker there offers x86 emulation and some containers appear to start, but the databases underneath Fuuz do not run dependably that way. Use an x86 machine or cloud VM.
Check with docker info --format '{{.Architecture}}': it should report x86_64, not aarch64 or arm64.
Where this is configured depends on how Docker runs on your machine.
Windows, Docker Desktop with the WSL 2 backend (the default). Memory and CPU come from WSL, not from Docker Desktop, so Settings → Resources has no sliders for them. Create or edit %UserProfile%\.wslconfig:
[wsl2]
memory=16GB
processors=6
Then run wsl --shutdown and restart Docker Desktop. WSL takes only a share of host RAM by default, so on a machine with 16 GB or less you may need to add memory before Docker can have 12 GB.
Windows with the Hyper-V backend, and macOS: the sliders do apply — Settings → Resources → Advanced, then restart Docker.
Linux, Docker Engine: containers use the host's memory and CPUs directly, with no limit to raise. If the check reports too little, the machine itself needs more.
The launcher reports the figure Docker has, not the machine's total, rounded to whole gigabytes — a hypervisor keeps a few percent off the top, so 12 GB arrives as about 11.7 and is read as the 12 you asked for.
The macOS/Linux/WSL command is in the TL;DR above. On Windows, use PowerShell and this single line instead:
docker run -d --name fuuz-launcher --restart unless-stopped -p 127.0.0.1:9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v fuuz_launcher_state:/var/lib/fuuz-launcher mfgx/native-app-launcher:trial-latest
Subscription customers substitute their own channel (mfgx/native-app-launcher:production-latest) and set the launcher's Image tag setting to match, so the launcher and the platform it deploys come from one release channel. See Image tags below.
| Flag | Why it is there |
|---|---|
-p 127.0.0.1:9000:9000 | Serves the launcher only to this machine. Load-bearing: anything reaching this port has root-equivalent control of Docker on the host. Drop the 127.0.0.1: and you publish that control plane to your network — read Reaching the launcher from another machine first. |
-v /var/run/docker.sock:/var/run/docker.sock | How the launcher talks to Docker. Without it nothing works. |
-v fuuz_launcher_state:/var/lib/fuuz-launcher | Keeps settings, generated passwords and backups when the container is replaced. Do not skip it. |
--restart unless-stopped | Brings the launcher back after a reboot. Swarm restarts your Fuuz services itself; the launcher is not one of them. |
--name fuuz-launcher | The name used by every other command on this page. |
Do not paste the multi-line form into PowerShell — \ is not a line continuation there, so you get docker: invalid reference format and The term '-p' is not recognized.... Do not run either form in Git Bash: it rewrites the leading / in /var/run/docker.sock into a path inside your Git install, so the container starts but cannot see Docker. Use PowerShell, or prefix with MSYS_NO_PATHCONV=1.
Run docker logs fuuz-launcher. Near the end it prints the address with an access token — http://localhost:9000/?token=Yk3n_9pQ... — which you open in a browser on the same machine.
-e LAUNCHER_TOKEN=<your-token> to fix it.LAUNCHER_REQUIRE_TOKEN=false turns it off entirely — only sensible on a host you fully control.)The first screen asks for one thing. Paste the entire key and press Save and continue. Add this later gets you past it — useful if you opened the launcher just to check Docker is healthy — and you can add it under Settings → License before starting.
The key is validated by Fuuz's own initialization container during the start, not by the launcher. A wrong or truncated key stops the start at the licensing stage and shows you that container's output.
Everything except the license key has a working default. The ones most installations look at, under Settings:
| Setting | Default | Change it when |
|---|---|---|
| Deployment → Enterprise domain name | fuuz.localhost | You want a real hostname. The default resolves to the machine in a browser with no DNS setup at all. For a real domain, create records for both <domain> and api.<domain>. |
| Deployment → Web port / Secure web port | 80 / 443 | Something else on the machine already serves them. See below. |
| Deployment → Certificate directory | /fuuz/certs | You have your own TLS certificate — name the files <domain>.crt and <domain>.key. Otherwise the proxy self-signs. |
| Deployment → Container group name | fuuz | You want Fuuz's ~32 containers collapsed under a different name in Docker Desktop. Presentation only — no address changes. |
| Email → SMTP host, port, user, password | empty | You want Fuuz to deliver notification emails. Without an SMTP host, notifications are generated but never sent. |
| Object storage → S3 endpoint URL | http://localstack.fuuz.localhost | You changed the domain — it must match, as http://localstack.<your-domain> — or you use real AWS S3 rather than the bundled storage. |
| MongoDB / RabbitMQ → root username and password | mongodb/admin, rabbitmq/admin | Always, for anything beyond a short evaluation. These are defaulted for quick trial setup only. |
| Images → Image tag | trial-latest | You are on a channel other than trial, or want to pin to a specific release (production-2026.8.0) rather than move forward on every re-deploy. |
| Authentication → Token expiration / max age | 15m / 90m | Your security policy calls for different session lifetimes. Max age should always exceed token expiration. |
Press Save. Saved settings take effect on the next start or re-deploy — Docker Swarm cannot change a running container's environment, so nothing moves until the services are replaced.
Two options:
fuuz.localhost:8080, api.fuuz.localhost:8080). That works, but everyone who uses Fuuz sees the port.Host header through unchanged — Fuuz's proxy routes on it, and api.<domain> is otherwise the same server.Ports are checked before anything is downloaded, so a conflict is reported in seconds rather than part-way through a start.
On Overview, press Start Fuuz. The run streams through five stages:
The run finishing does not mean every service is up. The final check covers the proxy and the web application, neither of which waits on a backend service, so the stream can complete while backend services are still starting. Overview → Service details lists live status for every service — read that rather than the stream.
| Address | ||
|---|---|---|
| Fuuz | http://<domain> | The platform web application. |
| RabbitMQ | http://admin.<domain> | Broker management UI. Sign in with the RabbitMQ username and password from Settings → RabbitMQ. |
MongoDB is deliberately not published to the host — backups, restores and health checks all run inside its container. Database credentials for your own tooling are on the launcher's Credentials tab.
All on the launcher's Overview tab.
| I want to… | Do this |
|---|---|
| Open Fuuz | Open Fuuz in the top bar, or the Fuuz row on the endpoints card. |
| Stop Fuuz | Stop Fuuz on the Overview card. Data, settings and credentials are kept; starting again brings it back as it was. |
| Start it again | Start Fuuz. |
| Apply a settings change | Save the setting, then Re-deploy. Services are replaced, so Fuuz is briefly unavailable. Your data is untouched. |
| Restart one service | Service details → the service's ⋮ menu → Restart. |
| Read a service's logs, or see its configuration | Service details → ⋮ → View logs or Inspect environment. |
| Run more copies of a service | Service details → ⋮ → Scale…. Replica counts are remembered across re-deploys. |
| Restart or stop a whole tier | The Actions button beside Core or Backend. |
| Check my license | The License card shows the licensed window, days remaining and your deployment tier. |
Renewing or replacing a license. Paste the new key into Settings → License, Save, then Re-deploy. The license is checked on every start, so an expired key is reported at the licensing stage rather than surfacing later as services failing for no obvious reason. Data and credentials are unaffected.
Moving to a new Fuuz version. A -latest tag moves with each release, so a Re-deploy picks up the current one. To stay on a known version, pin Settings → Images → Image tag to a specific release. Take a backup first, and read the release notes.
Updating the launcher itself. A running container keeps the image it started from, so replace the container:
docker pull mfgx/native-app-launcher:trial-latest
docker rm -f fuuz-launcher
Then run the docker run command again. Settings, credentials and backups live in the fuuz_launcher_state volume and survive it. Your Fuuz installation keeps running throughout — the launcher going away does not stop it.
The launcher takes a consistent snapshot of the whole Fuuz database with MongoDB's own tooling, as a single compressed archive.
Automatic backups are on by default: one a day at 02:00 UTC, keeping the 7 most recent. Change that with variables on the docker run command:
| Variable | Default | |
|---|---|---|
LAUNCHER_BACKUP_ENABLED | true | false turns the schedule off. Manual backups still work. |
LAUNCHER_BACKUP_CRON | 0 2 * * * | Cron expression for the schedule. |
LAUNCHER_BACKUP_TIMEZONE | UTC | Timezone the schedule is read in. |
LAUNCHER_BACKUP_RETAIN | 7 | How many to keep; the oldest are deleted beyond this. 0 keeps everything, which means nothing reclaims the disk. |
Archives land in the launcher's state volume (fuuz_launcher_state, under backups/) as fuuz-<timestamp>.archive.gz — outside the Fuuz stack's volumes, so deleting the installation does not delete its backups. Generated passwords are Swarm secrets and cannot be read back, so the Credentials tab is the only copy.
A backup on the same machine does not protect you from losing the machine. It protects you from a bad import, a dropped collection or a failed upgrade. Download a copy elsewhere on whatever schedule your data deserves.
Backups are managed over the launcher's API, using the token from docker logs fuuz-launcher:
TOKEN=<token from the launcher log>
# List backups, and the current schedule
curl -s "http://127.0.0.1:9000/api/backups?token=$TOKEN"
# Take one now
curl -s -X POST "http://127.0.0.1:9000/api/backups?token=$TOKEN"
# Download one — do this
curl -s -o fuuz-backup.archive.gz \
"http://127.0.0.1:9000/api/backups/<name>/download?token=$TOKEN"
A restore replaces the current contents of the database with the archive's. It cannot be undone — back up the current state first.
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"confirm":"restore"}' \
"http://127.0.0.1:9000/api/backups/<name>/restore?token=$TOKEN"
The confirmation is required; a request without it is rejected rather than performed. A restore is also refused (HTTP 409, with an explanation) if the archive came from a different line of Fuuz images than the one you are restoring into — putting data written by one build underneath another is not recoverable. Add "force":true if you are certain.
Start with the launcher's own page — the banner at the top, and the service states under Overview → Service details. docker logs fuuz-launcher is the next place to look.
| Symptom | Cause | Fix |
|---|---|---|
| "Docker is not reachable" | Docker is not running, or the socket was not mounted | Start Docker. Check the run command included -v /var/run/docker.sock:/var/run/docker.sock. On Windows, if you ran it in Git Bash, re-run it in PowerShell — see step 3. |
| "Missing or invalid launcher token" | The URL predates the last restart | docker logs fuuz-launcher and open the current URL. Set LAUNCHER_TOKEN for a stable one. |
| "Cross-origin requests are not permitted" | You are reaching the launcher by a hostname it was not told about | Add that hostname to LAUNCHER_ALLOWED_ORIGINS — see below. |
| "This launcher is reachable from your network" | Port 9000 was published on every interface | Re-run with -p 127.0.0.1:9000:9000 unless you meant to share it. Anyone who can reach that port controls Docker on this machine. |
| Services exit immediately, or Docker warns an image's platform does not match the host | The machine is not x86 | Fuuz runs on x86 (amd64) hosts only. Emulation on ARM is not supported. |
| The memory check warns | Docker has less than 12 GB | Raise it where your platform configures it — .wslconfig on WSL 2, the Resources sliders on Hyper-V or macOS. You can start anyway, but expect services to restart. |
| "Port 80 is already in use" | Something else serves that port | Move Fuuz's ports, or stop the other service. See If ports 80 or 443 are taken. |
| A warning that the domain does not resolve | No DNS record for your domain, api.<domain> or license.<domain> | Create those records, add hosts-file entries on this machine, or set the domain back to fuuz.localhost. |
| The start stops at the licensing stage | The key is invalid, truncated or expired | Re-copy the whole key into Settings → License and start again. The message carries the licensing container's output — send that to Fuuz if the key is current. |
| Swarm could not be initialized | The machine has several network interfaces, so Docker will not guess | Re-run the launcher with -e LAUNCHER_SWARM_ADVERTISE_ADDR=<this machine's address>. |
| The start finished but services are still converging | Normal on a first run — the finish line is the proxy and web app, not every service | Watch Service details until everything reads running. |
| "Fuuz is only partly deployed" | Docker stopped part-way through, so some services were never created | Re-deploy — it resumes where it stopped and leaves running services alone. If it recurs, check free disk and memory. |
| MongoDB logs "rejected the root credentials" | Database volumes survive from an earlier installation whose passwords are gone; MongoDB only accepts the passwords it was created with | That data cannot be recovered without them. Restore a backup, or use Starting over to clear volumes and credentials together. |
| A service stays failed | Varies | ⋮ → View logs on it. If several failed together, suspect memory or free disk. |
| A saved setting changed nothing | Settings apply to new containers only | Re-deploy. |
| File uploads fail after a domain change | The object storage endpoint no longer matches the domain | Set Settings → Object storage → S3 endpoint URL to http://localstack.<your-domain> and re-deploy. |
| The license card says "unknown" | The licensing service is not running | Expected while Fuuz is stopped or starting. If Fuuz is fully up, read that service's logs. |
| Endpoints show an old domain, with a warning | The domain was changed but not yet deployed | Re-deploy to apply it. |
The run command deliberately serves the launcher only to the machine it runs on, because anything that can reach port 9000 has root-equivalent control of Docker on that host. Prefer a VPN or an SSH tunnel to publishing the port.
If you do publish it, two changes go together: publish on a reachable interface (-p 9000:9000), and name the hostname you will use (-e LAUNCHER_ALLOWED_ORIGINS=fuuz-box:9000). That is a comma-separated list of the hostnames (with port, if not 80 or 443) you browse on; anything else is refused even if it resolves here, which stops a hostile site pointing a name it controls at your host and driving Docker through your browser.
Credentials → Danger zone → Delete everything removes the whole installation on this machine: every service, all data volumes, and the generated database and broker passwords. It asks you to type DELETE first, and keeps your license key so you can set Fuuz up again. There is no undo and it does not consult your backups — download one first if any of the data matters.
Use it rather than removing volumes by hand: the passwords and the data have to go as a set, because old data volumes paired with newly generated passwords cannot start, and that failure looks nothing like its cause.
Tags follow {channel}-{version}, with calendar versioning (YYYY.M.patch). Every channel also publishes a {channel}-latest tag pointing at its most recent release.
| Tag pattern | Example | |
|---|---|---|
production-{version} | production-2026.8.0 | Stable, production-ready release for on-premises deployment. |
trial-{version} | trial-2026.8.0 | Trial release, published on its own cadence. May not yet carry every feature available in production. |
{channel}-latest | production-latest | Always the most recent release on that channel. |
Pin Settings → Images → Image tag to a specific version to keep an installation on a known release; leave it on a -latest tag to move forward whenever you re-deploy. Keep the launcher's own image on the same channel as that setting.
While in-house Fuuz is in beta, trial-latest moves often — usually what you want during an evaluation, since fixes reach you without asking. Pin the version instead if a machine has to stay exactly as you left it. Take a backup before any update.
When you contact Fuuz, include:
docker logs fuuz-launcher), the text of any stage that failed, and the logs of any failing service.docker version.Never send your license key or the contents of the Credentials tab unless Fuuz asks for them specifically.
Content type
Image
Digest
sha256:41f556922…
Size
60.8 MB
Last updated
20 days ago
docker pull mfgx/native-app-launcher:trial-2026.8.1