---
title: "Deploy Ubuntu Desktop | (Just Updated) Full XFCE GUI in the Browser, Password Enforced"
description: "A full Ubuntu XFCE desktop in your browser. Never open without a password."
category: "Other"
url: https://railway.com/deploy/ubuntu-desktop-or-just-updated-full-xfce
---

# Deploy Ubuntu Desktop | (Just Updated) Full XFCE GUI in the Browser, Password Enforced

A full Ubuntu XFCE desktop in your browser. Never open without a password.

**[Deploy Ubuntu Desktop | (Just Updated) Full XFCE GUI in the Browser, Password Enforced on Railway](https://railway.com/template/ubuntu-desktop-or-just-updated-full-xfce)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/ubuntu-desktop-or-just-updated-full-xfce/manifest.json

- **Creator:** SuperSlowSloth
- **Category:** Other

## Template content

### ubuntu-desktop

- **Image:** ghcr.io/bon5co/ubuntu-desktop-railway:2026.09.07
- **Health check:** /healthz
- **Public domain:** Yes

## Documentation

# Deploy and Host Ubuntu Desktop on Railway

A complete Ubuntu XFCE desktop, streamed to your browser over one HTTPS URL. Files
manager, terminal, Firefox, and anything else you `apt install` — no VNC client, no
X server on your machine, no SSH tunnel. Built on the LinuxServer.io webtop image,
pinned by digest, with the desktop's home directory on a Railway volume so it
survives every redeploy.

## About Hosting Ubuntu Desktop

The desktop runs as a single Railway service. A bundled nginx serves the web client
and the WebSocket that carries your keyboard, mouse and the H.264 video stream, all
on the port Railway injects — there is no second service, no TURN server and no
external relay to configure.

The whole surface sits behind HTTP basic auth as user `admin`. Upstream only enables
that auth when `PASSWORD` is non-empty, which means a blank value does not weaken the
desktop, it publishes it: the client page and the input WebSocket both answer
anonymous callers, and whoever finds the URL gets a root session on your instance.
This template refuses to start on an empty password and generates a strong one for
you by default, so a deploy is never an open desktop. The healthcheck endpoint is the
one route left unauthenticated, and it is patched into the nginx config at image
build time with an assertion, rather than rewritten on every boot.

The user's home directory, `/config`, is mounted on a volume. Packages installed with
`apt` land on the container's own filesystem and are reset by a redeploy; anything
under the home directory is not.

## Why Deploy Ubuntu Desktop?

- A throwaway Linux GUI on demand, reachable from a phone, a tablet or a locked-down
  work laptop with nothing installed.
- A browser that runs somewhere else — a different IP, a different country, a session
  that keeps running when you close the tab.
- A place to run GUI tools that have no web version, without keeping a VM on.
- Persistent: your files, browser profile and desktop settings are still there after
  a redeploy.

## Common Use Cases

- Remote development or debugging from a device that cannot run the toolchain.
- Running a desktop browser session for testing, scraping or account work.
- Teaching and demos: a clean, identical Linux desktop per person, no local setup.
- A long-running GUI job you want to check on from anywhere.

## Dependencies for Ubuntu Desktop Hosting

- A Railway account and one service with a persistent volume.

### Deployment Dependencies

- Base image: [linuxserver/webtop](https://docs.linuxserver.io/images/docker-webtop/)
  (Ubuntu XFCE), pinned by digest.
- Wrapper image and source:
  [bon5co/ubuntu-desktop-railway](https://github.com/bon5co/ubuntu-desktop-railway).

### Variables

| Variable | Description |
| --- | --- |
| `PASSWORD` | Password for the desktop's `admin` login. A strong value is generated for you; the container refuses to boot if it is empty. |


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/ubuntu-desktop-or-just-updated-full-xfce
