25 min read

Set Up and Harden DockDash for Localtonet Access

Install DockDash with Docker Compose, secure it using OIDC or an authenticated reverse proxy, then provide remote HTTP access with Localtonet.

Remote browser reaching a Docker-hosted DockDash instance through Localtonet and an authentication layer.
DockDash remains on the local Docker host while authenticated HTTP traffic arrives through a Localtonet tunnel.
Self-Hosting ยท DockDash ยท Localtonet ยท 2026

Build a protected Docker operations dashboard before making it remotely reachable

DockDash brings Docker discovery, monitoring, update information, logs, container controls, file access, and terminal sessions into one self-hosted web interface. Those capabilities are useful, but they also make an unauthenticated DockDash deployment inappropriate for exposure to an untrusted network. This guide installs DockDash with its supported Docker Compose workflow, verifies it locally, and then hardens access with either built-in OIDC or an authenticated reverse proxy. Only after authentication is working do we connect the protected HTTP endpoint to Localtonet for remote access without inbound router port forwarding.

๐Ÿ”’ OIDC or authenticated reverse proxy ๐ŸŒ Remote HTTPS access through an HTTP tunnel โšก Docker Compose installation and verification

Understand what you are deploying

DockDash is a self-hosted service monitoring and Docker management dashboard. It can discover containers and network services, track health and resource history, monitor container image updates, display release notes, and organize services on an interactive topology canvas. Its Docker-oriented features also include container start, stop, and restart controls, live logs, a container file explorer, text-file editing, and an interactive terminal.

This is not merely a read-only status page. A user who gains access to a fully configured DockDash instance may be able to inspect logs, modify files, open a shell inside containers, or change container state. The exact impact depends on the containers and hosts connected to DockDash, but the dashboard should be treated as an administrative interface.

The standard Compose deployment mounts the Docker socket at /var/run/docker.sock. That socket lets DockDash communicate with the local Docker daemon and is what enables discovery and container operations. Access to a Docker daemon is highly privileged in practical terms, so protecting the web interface is essential.

DockDash does not enforce authentication by default

Do not expose a default DockDash installation to the public internet. Complete the local installation first, then configure and test built-in OIDC or place DockDash behind an authenticated reverse proxy. Create the Localtonet tunnel only after the selected authentication boundary works correctly.

๐Ÿ“ฆ Docker discovery and operations DockDash can discover Docker services, report container state, stream logs, and provide start, stop, and restart controls.
๐Ÿ“ˆ Health and resource history The dashboard tracks service health and presents history across 1, 7, or 30 days, together with current and historical container resource information.
๐Ÿ”” Version-aware updates Version-shaped image tags can be compared with compatible registry tags so an update can be shown as a meaningful version transition, with matching release notes when available.
๐Ÿ” Two supported security patterns DockDash supports built-in OpenID Connect authentication or deployment behind an authenticated reverse proxy.
๐ŸŒ Outbound remote-access path Our Localtonet client establishes an outbound connection to a relay, so the protected local service can receive a public URL without inbound router port forwarding.
๐Ÿงญ Interactive service topology Services can be arranged, grouped, and connected on an interactive canvas while live status remains visible.

Recommended request path

The secure request path depends on the authentication design you choose. With built-in OIDC, the browser connects to the public Localtonet HTTPS address, the HTTP tunnel forwards the request to DockDash on the local host, and DockDash handles the OIDC login flow. In this model, Localtonet should target the loopback-bound DockDash listener at port 3001.

With an authenticated reverse proxy, the browser still enters through the Localtonet public address, but the tunnel targets the proxy's local listener instead of targeting DockDash directly. The proxy authenticates the user and forwards approved traffic to DockDash. DockDash should not remain separately reachable from untrusted interfaces.

Layer Responsibility Security consideration
DockDash Docker discovery, monitoring, update information, logs, files, terminal, and container operations Treat it as a privileged administrative application
OIDC provider or authenticated proxy Authenticates users before administrative access is granted Use an exact callback URI and protect all client secrets
Localtonet client Connects the selected local HTTP endpoint to a Localtonet relay Keep the device token private and run the client on a host that can reach the protected endpoint
Localtonet HTTP tunnel Provides a public HTTPS address for the selected local target A running tunnel creates reachability, not application authorization

Prepare the DockDash host

Use a host on which Docker and the Docker Compose plugin are already installed and functioning. The official DockDash workflow builds and starts the repository's included Compose configuration, so the host must be able to build container images and run Compose projects. You also need enough permission to communicate with the local Docker daemon and to mount its socket into the DockDash container.

Git is useful for cloning and later updating the repository. If Git is not available, an archive of the repository can be downloaded and extracted instead, but the working directory must still contain the project's docker-compose.yml, Dockerfile, source files, and related build files.

Before continuing, verify the tools rather than discovering a missing dependency during the build:

docker --version
docker compose version
git --version

The exact Docker installation procedure depends on the host operating system and packaging method. This guide does not assume an undocumented DockDash platform matrix. Use a Docker-supported host where docker compose works, and follow the operating system's appropriate Docker installation process if either Docker check fails.

Network and identity prerequisites

Reserve local TCP port 3001, which is the documented DockDash web port. If another process already uses it, the supplied mapping cannot start unchanged. You can inspect existing listeners with the tools available on your operating system or check running containers with:

docker ps

For built-in OIDC, prepare an application registration at an OpenID Connect provider. DockDash documents compatibility with standard OIDC providers such as Keycloak, Authentik, Authelia, and Google. You will need the provider issuer or discovery URL, a client ID, and a client secret. You will also need to register the exact public callback URI once the final public hostname is known.

For the authenticated reverse-proxy option, prepare a proxy or authentication layer that can protect an upstream HTTP application. DockDash documentation names Caddy, Traefik, nginx, oauth2-proxy, Authelia, and Tailscale as examples. Their individual installation and policy syntax differ, so do not copy configuration intended for one proxy into another.

Back up and isolate the host

DockDash stores persistent application data in a named volume in the supplied Compose arrangement. Plan a backup procedure for that data before relying on the dashboard operationally. Also consider placing administrative applications on a dedicated Docker host or restricted management network. Authentication is necessary, but it does not remove the consequences of granting an application access to the Docker socket.

Choose the authentication model before creating the tunnel

Built-in OIDC and an authenticated reverse proxy are alternative protection patterns. You can build more complex layered designs, but doing so introduces additional callback, header, cookie, and routing considerations. For a straightforward deployment, choose one clear authentication boundary and test it locally before adding public reachability.

Install DockDash with Docker Compose

Docker Compose creates the DockDash container, persistent storage, and local browser access.
The Compose deployment defines DockDash and its storage before the service is verified locally.

The supported quick-start path uses the Compose file included in the DockDash repository. The build is performed locally from the checked-out source, and the service is started in detached mode. Run the following steps from the host that will operate DockDash.

1

Obtain the DockDash repository

Clone the official repository and enter its project directory. Review the checked-out files before running them, especially the Compose file, Dockerfile, volume mounts, published ports, and environment settings.

2

Review the included Compose configuration

Confirm that port 3001 is available, that the Docker socket mount is intentional, and that the named data volume meets your persistence requirements. Configure the desired network scan range only if it is appropriate for your environment.

3

Build and start DockDash

Run the documented Compose command from the project directory. Compose builds the application image and starts the service in the background.

git clone https://github.com/dougmaitelli/DockDash.git
cd DockDash
docker compose up -d --build

DockDash's documented Compose arrangement publishes container port 3001 on host port 3001, mounts /var/run/docker.sock into the container, and uses a named volume at /app/data. It also supports environment configuration such as LOG_LEVEL and NETWORK_CIDRS. Do not copy an example network range without checking whether it matches a network you are authorized to scan.

Do not scan arbitrary networks

DockDash supports network discovery across configurable CIDR ranges. Set NETWORK_CIDRS only to ranges you own or are explicitly authorized to inspect. A sample private range is not evidence that it matches your LAN, container network, or organizational policy.

Inspect startup state

After Compose returns, check whether the container is running:

docker compose ps

If the service is not running or repeatedly restarts, inspect its logs:

docker compose logs dockdash

The service name in the supplied Compose configuration is dockdash. Build failures, unavailable ports, inaccessible Docker sockets, and malformed environment values should be resolved before any authentication or tunneling work begins.

Verify the local DockDash deployment

The documented local interface is available at http://localhost:3001. Open that address in a browser running on the DockDash host. If you are administering a remote server, use an existing secure management path to test the local listener rather than temporarily exposing port 3001 to the internet.

A command-line header request can confirm that the HTTP listener responds:

curl -I http://127.0.0.1:3001

A successful response establishes only that an HTTP service is listening. It does not confirm every DockDash feature, Docker permission, discovery range, or authentication rule. Complete a browser-based functional check as well.

Local verification checklist

  • Confirm that the DockDash interface loads without browser connection errors.
  • Confirm that expected local containers appear after discovery completes.
  • Check that container status and resource information are visible where expected.
  • Open logs for a non-sensitive test container and confirm that log access works.
  • Verify that persistent dashboard changes survive a controlled container restart.
  • Check the Compose logs for repeated errors, permission failures, or unexpected scan activity.

Avoid using a production container as the first target for start, stop, terminal, or file-editing tests. If you need to validate administrative controls, create or select a disposable test container whose interruption cannot affect other services.

Reduce the initial listening scope

The example port mapping 3001:3001 ordinarily publishes the service through the host's network interfaces. DockDash specifically recommends binding the published port to loopback when an authenticated reverse proxy is used and clients must not bypass that proxy:

ports:
  - "127.0.0.1:3001:3001"

A loopback binding is also a sensible starting point when the Localtonet client runs on the same host and will connect directly to DockDash with built-in OIDC. It prevents ordinary remote hosts from reaching port 3001 through a host interface while still allowing a local client to connect.

If the Localtonet client runs on a different device, 127.0.0.1 on that device refers to the Localtonet device itself, not the DockDash host. In that architecture, the client needs a permitted network path to a protected DockDash or reverse-proxy listener. Do not broaden the bind address casually. Use firewall rules and network segmentation appropriate to your environment.

Harden DockDash before remote access

Two DockDash protection patterns using OIDC or an authenticated reverse proxy.
Remote requests should cross an authentication boundary before they can reach DockDash.

DockDash supports two documented approaches: built-in OIDC and an authenticated reverse proxy. Built-in OIDC keeps login handling inside DockDash. A reverse proxy moves the authentication boundary in front of DockDash and should be the only client allowed to reach the application.

Approach Best fit Localtonet target
Built-in OIDC You already operate a standard OIDC provider and want DockDash to manage its own login session DockDash at 127.0.0.1:3001 when the client is on the same host
Authenticated reverse proxy You already centralize authentication and access policy at a trusted proxy The proxy's protected local HTTP listener, using the actual port you configured
Unprotected direct access Local-only setup and initial testing on a trusted host Do not use this model for an internet-reachable tunnel

Option A: Configure built-in OIDC

DockDash enables OIDC when all three required provider settings are present: OIDC_ISSUER, OIDC_CLIENT_ID, and OIDC_CLIENT_SECRET. The issuer is the provider issuer or discovery URL. The client ID and secret come from the application registration at your identity provider.

The following optional or supporting settings affect the login flow:

  • OIDC_REDIRECT_URI sets an explicit callback when request and proxy headers do not produce the correct public URL.
  • OIDC_SCOPES defaults to openid profile email.
  • SESSION_SECRET signs cookies. If omitted, DockDash generates a new value per process.
  • SESSION_MAX_AGE defaults to 28800000 milliseconds, which is eight hours.

Add the variables to the DockDash service's existing environment section in the Compose file. Preserve the rest of the service configuration:

environment:
  - OIDC_ISSUER=https://auth.example.com/realms/homelab
  - OIDC_CLIENT_ID=dockdash
  - OIDC_CLIENT_SECRET=replace-with-provider-secret
  - SESSION_SECRET=replace-with-a-long-random-value
  - OIDC_REDIRECT_URI=https://your-public-host/auth/callback

The values above are placeholders. Do not commit a real client secret or session secret to a public repository. Use your normal secret-management process and restrict access to any local environment or Compose override files containing credentials.

Set a stable, random SESSION_SECRET for production. If it is omitted, DockDash generates a new value at startup, invalidating existing sessions whenever the process restarts. Do not reuse the OIDC client secret as the session secret.

Make the callback URI exact

When the final public address is known, the explicit DockDash callback takes this form:

https://your-public-host/auth/callback

Register that exact value with the identity provider and use the same value for OIDC_REDIRECT_URI. Scheme, hostname, port, path, case, encoding, and trailing slash can affect callback matching. The local upstream address, such as http://127.0.0.1:3001, is not the browser-facing callback and should not replace the public URI in a remote deployment.

If you use a generated Localtonet subdomain, create the HTTP tunnel configuration first so that you can obtain its public address, but do not start public access until authentication is configured. Add the resulting HTTPS callback to the OIDC provider and DockDash, rebuild or recreate the DockDash service as needed, test the login flow, and only then start or retain the public tunnel.

After changing the Compose environment, apply the configuration:

docker compose up -d --build

Open the local interface and confirm that unauthenticated access initiates the expected login flow. Complete a sign-in, sign out, and sign in again. Restart DockDash and verify that the stable session-secret configuration behaves as intended.

Option B: Use an authenticated reverse proxy

In this design, the proxy authenticates the browser before forwarding requests to DockDash. Bind DockDash to loopback if the proxy runs directly on the host:

ports:
  - "127.0.0.1:3001:3001"

If the proxy runs on a separate Docker network, DockDash documentation recommends not publishing the DockDash port at all. Connect the proxy and DockDash directly to that Docker network, then address DockDash by its service identity and internal port from the proxy. The exact network and proxy configuration depends on the selected proxy and is not specified by DockDash's authentication guide.

Configure the proxy to require authentication for every DockDash route, including callback, API, WebSocket, and other application paths required by the UI. Test direct access to DockDash from an untrusted interface and confirm that it fails. Then test the proxy endpoint and confirm that unauthenticated requests are challenged or redirected according to your authentication policy.

Limit trusted proxy scope

DockDash defaults TRUST_PROXY to loopback, uniquelocal. Use true only when every upstream proxy that can reach DockDash is trusted. An overly broad trust configuration can let a client spoof forwarded connection information.

The proxy should deliberately set or overwrite the forwarded host, scheme, port, and client-address information expected by the application. Do not blindly trust forwarded headers supplied by an internet client. When callbacks or secure cookies depend on the public origin, explicitly configure the public callback rather than weakening identity-provider redirect checks.

Authentication must not be bypassable

If Localtonet targets DockDash directly while authentication exists only on a separate reverse proxy, remote users bypass the proxy. In the reverse-proxy design, point the Localtonet HTTP tunnel at the authenticated proxy listener, not port 3001, and remove or restrict every alternate route to DockDash.

Provide remote HTTP access with Localtonet

HTTP traffic traveling from a remote browser through Localtonet, authentication, and the local DockDash container.
The Localtonet agent carries remote HTTP traffic through the tunnel to the authenticated local DockDash service.

Once the protected local endpoint works, Localtonet can make it remotely reachable. Our client application runs on a device that can reach DockDash or the authenticated proxy and establishes an outbound connection to a Localtonet relay. This avoids inbound router port forwarding, public-IP requirements, firewall changes for inbound exposure, and VPN setup.

An HTTP tunnel provides a public HTTPS address for the local HTTP target. The tunnel carries traffic to the selected endpoint, but it does not replace DockDash authentication. Keep OIDC or the authenticated proxy enabled for the entire time the tunnel is running.

1

Install and run the Localtonet client

Install our client on the DockDash host or another device that can securely reach the protected local endpoint. Keep the client running whenever remote access is required.

2

Authenticate the intended device

Use the device-specific authentication token supplied through your Localtonet account. Never place that token in this article's example commands, source control, screenshots, support tickets, or shared configuration.

3

Select an available relay server

Select a currently available relay server or region from the dashboard. Availability can vary, so obtain the current server value from the product instead of copying a hardcoded server code.

4

Create the HTTP tunnel

Set the local target to the protected endpoint. For built-in OIDC on the same host, this is normally local IP 127.0.0.1 and port 3001. For an authenticated reverse proxy, use that proxy's actual local address and configured listener port instead.

5

Start and test the tunnel

Creating a tunnel does not start it. Press Start, open the assigned public HTTPS address in a private browser window, and confirm that authentication is required before DockDash content or administrative functions are available.

Consult our Localtonet HTTP tunnel documentation while configuring the current dashboard fields. HTTP tunnels can use a generated subdomain, a selected subdomain where supported, or a custom domain. Exact custom-domain DNS requirements should be checked against current documentation before changing DNS.

Use the correct local target

  • Built-in DockDash OIDC, same host: target 127.0.0.1 and port 3001.
  • Authenticated host proxy: target the proxy's bound local address and its configured port.
  • Proxy in Docker: ensure the Localtonet client can actually reach the proxy listener from its execution environment.
  • Client on another machine: use a restricted network-reachable address, not that machine's loopback address.

Test with a fresh private browser session so an existing OIDC cookie does not conceal an authentication bypass. The first visible result should be the intended identity-provider or proxy authentication flow. After signing in, test the main dashboard, logs, and any real-time features you expect to use.

Tunnel lifecycle matters

A Localtonet tunnel is available only while the selected client is connected and the tunnel is running. Stop the tunnel when remote administration is no longer required, or delete it when the configuration should not be reused.

Operate DockDash safely

Routine operation should include checks at the application, container, authentication, and tunnel layers. When access fails, separating these layers helps identify whether the problem is DockDash, Docker, the identity provider, the reverse proxy, the Localtonet client, or the tunnel lifecycle.

Common Docker Compose operations

docker compose ps
docker compose logs dockdash
docker compose logs -f dockdash
docker compose restart dockdash
docker compose down
docker compose up -d --build

docker compose down stops and removes the Compose containers and network. Named volumes are retained unless you explicitly request their removal. Do not add a volume-removal option unless you intend to delete persistent DockDash data and have a verified backup.

Before updating, review DockDash release notes and repository changes, especially migrations, authentication changes, Docker permissions, and Compose modifications. Back up persistent data, update the checked-out source using your chosen Git workflow, and rebuild with the documented Compose command. Verify locally before reopening remote access.

Keep the attack surface small

  • Leave DockDash bound to loopback or an isolated Docker network whenever the architecture permits it.
  • Do not publish port 3001 separately if all access is supposed to pass through an authenticated proxy.
  • Use least-privilege identity-provider groups and access policies.
  • Protect the OIDC client secret, session secret, and Localtonet device token.
  • Review users and sessions after personnel or role changes.
  • Use a disposable container when testing terminal, file-editing, and lifecycle controls.
  • Stop the Localtonet tunnel when remote administration is not needed.
  • Review DockDash and container logs for unexpected administrative activity.

Backup scope

Back up the DockDash persistent data volume according to your Docker backup process. A dashboard backup does not automatically back up every managed container, bind mount, Docker volume, database, or remote host. Continue using workload-specific backup and restore procedures for the services displayed in DockDash.

Test restoration in a non-production environment. A backup that has never been restored is not sufficient evidence that recovery will work. Record the DockDash version, Compose configuration, environment settings, secret-recovery process, and identity-provider application configuration alongside the operational documentation.

Troubleshoot installation, authentication, and tunneling

The Compose build fails

Confirm that the command is running from the repository directory containing docker-compose.yml. Check available disk space, Docker daemon status, and network access required to obtain build dependencies. Read the complete build error rather than repeatedly restarting the command.

Port 3001 is already in use

Stop or reconfigure the conflicting service before starting DockDash. Do not choose a replacement host port without also updating every local test, reverse-proxy upstream, firewall rule, and Localtonet target that depends on it. The documented browser address assumes port 3001.

DockDash cannot discover or control containers

Verify that the Docker socket exists on the host, is mounted at /var/run/docker.sock in the container, and is accessible to the DockDash process. Review the container logs for permission failures. Do not solve socket errors by granting broad host permissions without understanding the resulting privilege.

OIDC is not enabled

All three required settings must be present: OIDC_ISSUER, OIDC_CLIENT_ID, and OIDC_CLIENT_SECRET. Check the effective Compose configuration and container environment without printing secret values into shared logs. Recreate the service after configuration changes.

The provider reports a redirect URI mismatch

Compare the URI sent in the authorization request with the URI registered at the provider and the value in OIDC_REDIRECT_URI. They should describe the same public HTTPS callback, including /auth/callback. Do not register a container hostname, loopback address, or internal HTTP upstream as the remote browser callback.

Login works locally but fails through the public URL

Set OIDC_REDIRECT_URI explicitly to the public callback and verify forwarded host and scheme handling. If a reverse proxy is involved, ensure it overwrites forwarded metadata consistently and that DockDash trusts only the intended proxy chain. Check browser cookie behavior and confirm that the callback reaches the same deployment that started the login flow.

Sessions disappear after every restart

Configure a stable, random SESSION_SECRET. DockDash generates a new value per process when this setting is omitted, so cookies signed before a restart no longer validate afterward.

The public address bypasses the login page

Stop the Localtonet tunnel immediately. Confirm whether it targets DockDash directly instead of the authenticated proxy. For built-in OIDC, verify that all required OIDC settings are active in the running container. Do not restart public access until a private browser session is forced through authentication.

The Localtonet URL does not respond

Verify the layers in order. Confirm that DockDash or the proxy responds locally, that the Localtonet client device can reach the configured target, that the intended device is connected, and that the tunnel has been started. Recheck the local IP and port. A tunnel that has merely been created is not yet running.

The tunnel works only when targeting a non-loopback address

This usually means the Localtonet client is not running in the same network namespace or on the same host as DockDash. Determine where the client actually runs. If it runs in a container, 127.0.0.1 refers to that container. If it runs on another device, loopback refers to that other device. Provide a narrowly restricted network path to the protected endpoint instead of exposing DockDash broadly.

Frequently asked questions

Does DockDash require authentication by default?

No. DockDash does not enforce authentication by default. Configure its built-in OIDC support or place it behind an authenticated reverse proxy before exposing it to an untrusted network.

What local address does DockDash use?

The documented Compose deployment makes the web interface available at http://localhost:3001. For a same-host Localtonet client and built-in OIDC, the HTTP tunnel can normally target 127.0.0.1:3001.

Should Localtonet target DockDash or the reverse proxy?

Target DockDash directly only when DockDash's own OIDC authentication is protecting it. If authentication is implemented by a reverse proxy, target the proxy's protected listener. Otherwise the tunnel would bypass the authentication layer.

What OIDC settings are required?

DockDash requires OIDC_ISSUER, OIDC_CLIENT_ID, and OIDC_CLIENT_SECRET to enable OIDC. A stable SESSION_SECRET is strongly recommended, and OIDC_REDIRECT_URI should be set explicitly when the public URL cannot be inferred correctly.

What callback path does DockDash use for OIDC?

The documented explicit callback uses /auth/callback. Register the complete public URI, such as https://your-public-host/auth/callback, exactly at the identity provider and configure the same value in DockDash.

Does a Localtonet HTTP tunnel replace OIDC?

No. The tunnel provides network reachability and a public address for the selected local HTTP target. DockDash OIDC or the authenticated reverse proxy remains responsible for deciding who may use the administrative interface.

Why should the Docker socket mount be treated carefully?

The Docker socket permits communication with the Docker daemon and enables DockDash features such as discovery, logs, terminal access, file operations, and container controls. Compromise of an application with that access can have serious host and workload consequences, so the interface requires strong authentication and restricted network exposure.

Will the public DockDash URL remain available if the Localtonet client stops?

No. The tunnel is available only while the selected Localtonet client is connected and the tunnel is running. Creating the tunnel configuration alone does not start it.

Connect your protected DockDash deployment

After DockDash works locally and every remote request is forced through OIDC or your authenticated proxy, create a Localtonet HTTP tunnel to the protected endpoint and test it in a fresh private browser session.

Get Started Free โ†’

Localtonet is a secure multi-protocol tunneling and proxy platform designed to expose localhost, devices, private services, and AI agents to the public internet supporting HTTP/HTTPS tunnels, TCP/UDP forwarding, mobile proxy infrastructure, file server publishing, latency-optimized game connectivity, and developer-ready AI agent endpoint exposure from a single unified control plane.

support