Skip to main content
This guide walks through creating a Backstage instance on a remote server. It preserves the original sequence of steps and examples while improving flow, troubleshooting guidance, and configuration notes for running Backstage in a remote environment.
Note: terminal prompts like
indicate a shell connected to a remote server (not your local workstation). When running Backstage on a remote server you may need to update host/IP/base URLs so the UI is reachable from your workstation.
Before you begin, ensure you have shell access to the target server and permission to install Node.js, Yarn, and other developer tools. You can scaffold a Backstage app on your server and then expose it to your workstation via SSH tunneling, a reverse proxy, or by binding services to 0.0.0.0 and opening firewall ports.

Prerequisites

Using nvm (Node Version Manager) is recommended because it makes switching Node versions simple and avoids system-wide package issues. Follow the nvm install directions from the project README and run the install script. For reference, the README “Install & Update Script” section looks like this:
A screenshot of a GitHub README page for "Node Version Manager (nvm)" showing the project header, badges, and a Table of Contents with a mouse cursor hovering over the "Install & Update Script" link. The page layout and repository sidebar are visible in a browser window.
After installing nvm, install Node 18 (or a later 18.x/20.x release). Example:
You can switch between versions easily:
A minimal Node.js example (for quick verification):

Create your Backstage app

Follow the official Backstage documentation for details on creating an app: The scaffolder can be run with npx:
Example CLI interaction:
Reference screenshot from the Backstage docs:
A screenshot of the Backstage documentation page titled "Creating your Backstage App," showing the main article content with note boxes and a "Summary" section. The page includes a left-hand navigation menu and a right-hand table-of-contents panel.

After scaffolding

If the scaffold completes, the CLI runs yarn install and TypeScript checks. A successful run ends with messages like:
If you need to retry after a failed run, remove the partially-created directory:

Common errors and how to fix them

1) Yarn not found

During scaffolding the CLI executes yarn install. If Yarn is missing you’ll see an error like:
Fix: install Yarn globally (for the Node version currently active under nvm):

2) Node version too old

Backstage requires Node >= 18.12 in the toolchain. If you run the scaffolder with an older Node, you may see:
Fix with nvm:
Note: global npm packages are per-Node installation when using nvm. If Yarn was installed under a different Node version, (re)install it for the currently active Node:

Inspect the generated repository

Change into the created repo:
The repo is a Yarn workspaces monorepo. The root package.json includes workspace config and dev scripts. Example (excerpt):
Monorepo layout:
  • packages/* — contains the main app (frontend) and backend.
  • plugins/* — individual Backstage plugins as separate packages.
Frontend (packages/app) is a React app with its own package.json, src/, and public/. Backend (packages/backend) includes server code, Dockerfile, and dependencies such as @backstage/config, pg, etc. Frontend entrypoint example (packages/app/src/index.tsx):
public/index.html contains the div where the React app mounts:

Configuration files

Backstage uses YAML configuration files:
  • app-config.yaml
  • app-config.local.yaml
  • app-config.production.yaml
These configure backend baseUrl, listen port, CORS, proxy endpoints, and external integrations (GitHub, GitLab, etc.). Example backend config excerpt:
Adjust these files for remote deployments—particularly baseUrl—so the frontend can reach the backend when accessed from another machine.

Run the app in development mode

From the repository root:
This runs frontend and backend in parallel with hot reloading. Example output:
Quick test from the server:
This should return the frontend HTML (index page) when the dev server is running.
When running Backstage on a remote server, the webpack dev server commonly binds to localhost (loopback) by default. To access the frontend from your workstation you must either bind the dev server to 0.0.0.0, configure an SSH tunnel, or put a reverse proxy (e.g., Nginx) in front of the app. Also ensure firewall and security group rules allow required ports.

Accessing Backstage from your workstation (remote tips)

To access Backstage running on a remote server:
  • Webpack dev server: change its host from localhost to 0.0.0.0 or use an SSH tunnel (recommended for development).
  • Backend baseUrl: update app-config.yaml or app-config.local.yaml to use the server’s IP or domain so the frontend can reach the backend.
  • Ports: open firewall ports (e.g., 3000 frontend, 7007 backend) or expose services with a reverse proxy and TLS.
  • For production: prefer building the app and serving behind a proper reverse proxy with TLS rather than exposing dev servers directly.
The exact configuration changes (binding hosts, setting baseUrl, and reverse proxy examples) can be found in separate deployment and production-hardening guides on the Backstage docs.

Watch Video