25 min read

Install OpenOps and Access It with Localtonet

Set up and verify OpenOps with Docker Compose, then securely access its self-hosted FinOps web interface through a Localtonet HTTP tunnel.

OpenOps running in Docker Compose and reached remotely through a Localtonet HTTP tunnel.
OpenOps remains on the local host while Localtonet provides a remote HTTP path to its web interface.
Self-Hosting ยท OpenOps ยท Localtonet ยท 2026

Build a locally verified FinOps automation environment before making its web interface remotely reachable

OpenOps is an open-source, no-code platform for building and operating FinOps workflows across cloud, engineering, finance, and operations teams. Its official self-hosting path uses Docker Compose and includes a browser-based workflow editor, OpenOps Tables, OpenOps Analytics, integrations, workflow logs, and human approval controls. This guide explains what can be established safely from the available project documentation, how to validate the application locally, and how to expose the verified HTTP service with Localtonet. Where the supplied OpenOps documentation does not establish an exact command, port, path, credential, or platform requirement, we identify that limitation rather than guessing.

๐Ÿ”’ Verify access controls before public exposure ๐ŸŒ Publish the web interface through an HTTP tunnel โšก Keep the Docker Compose deployment behind one managed endpoint

What OpenOps provides

OpenOps is a no-code FinOps automation platform designed to turn cloud financial management findings into repeatable workflows. It is intended for processes such as allocation, unit economics, anomaly management, workload optimization, tagging, budgeting, reporting, governance, and controlled de-provisioning. Instead of limiting a team to a fixed set of reports, OpenOps provides a workflow editor that can be used to customize existing automation or build new processes.

The platform is also designed to support collaboration among FinOps practitioners, engineers, DevOps teams, finance teams, and leadership. This matters because a cloud cost recommendation often cannot be implemented safely by one person. A workflow may need data from a cloud provider, technical review from an application owner, financial approval, and a record of what happened. OpenOps includes human-in-the-loop controls for workflows where an automated action should pause for a decision.

๐Ÿงฉ No-code workflow editor Teams can use pre-built FinOps workflows, customize them, or construct new workflows without making source-code development the default requirement.
๐Ÿ“Š Tables and analytics OpenOps includes an Excel-like database called OpenOps Tables and a visualization system called OpenOps Analytics for organizing and presenting operational data.
โ˜๏ธ Cloud and tool integrations The project describes integrations with major cloud providers, databases, FinOps tools, communication platforms, and project management systems.
๐Ÿ‘ฅ Human approval controls Human-in-the-loop capabilities can keep stakeholders involved when a workflow reaches a decision or action that should not proceed automatically.
๐Ÿงพ Versioning and traceability OpenOps supports testing workflow steps, maintaining workflow versions, and tracking actions through workflow logs.
๐Ÿณ Docker Compose self-hosting The project identifies a free, ready-to-install Docker Compose deployment as its official self-hosting option for local or cloud infrastructure.

The self-hosted edition is useful when an organization wants to operate OpenOps on infrastructure it controls. OpenOps is licensed under the Apache License 2.0. Self-hosting, however, also makes the operator responsible for host security, updates, persistent data, credentials, backups, application access, and the network path used to reach the interface.

Separate installation from remote access

A tunnel should not be the first test of a new application deployment. Start OpenOps, confirm that its containers are healthy, and load the interface locally before adding Localtonet. This separation makes troubleshooting much easier because it establishes whether a failure belongs to OpenOps, Docker networking, the host firewall, or the remote-access path.

Prerequisites and decisions before installation

The available OpenOps project material confirms that the self-hosted deployment is based on Docker Compose, but the supplied evidence does not state a supported operating-system list, minimum CPU or memory allocation, minimum disk capacity, required Docker version, required Compose version, or architecture matrix. It also does not establish the exact production sizing required for a given number of integrations or workflows.

Before installation, choose a host that can run the Docker Compose deployment and that has enough capacity for the workload you intend to create. Verify host compatibility against the current OpenOps documentation and the current deployment files rather than assuming that an arbitrary Docker environment is supported. Capacity needs can change as workflows, stored data, analytics, integrations, and concurrent users increase.

Container tooling

You need a working container environment that provides Docker Compose functionality. Confirm that the Docker engine is running and that the account performing the installation is authorized to create containers, networks, volumes, and published ports. The precise installation procedure for Docker depends on the operating system and is not specified by the supplied OpenOps material.

Project files and release selection

Obtain OpenOps from its official project repository or an official project release. The repository contains a compose.yaml file and an environment template named .env.template. Those filenames establish that the project supplies Compose and environment configuration material, but they do not by themselves establish which values must be changed for a particular release.

Choose a deliberate release or revision rather than assuming that an unpinned moving branch is appropriate for a production deployment. Read the release notes before upgrading, and retain a record of the exact revision and configuration used. This makes a failed upgrade easier to diagnose or reverse.

Network placement

Decide where both OpenOps and the Localtonet client will run. The Localtonet client must run on a device that can reach the OpenOps HTTP endpoint. They may run on the same host, but they do not have to. If they run on separate devices, the OpenOps endpoint must be reachable from the Localtonet client over the local network.

Remember that loopback addresses are local to a network namespace. If a Localtonet client runs directly on the host, a host-published OpenOps endpoint can be used as the target. If the client runs inside another container, that container's loopback address does not refer to the Docker host or to the OpenOps application container. Use a network arrangement in which the client can genuinely reach the selected address and port.

Application secrets and cloud permissions

OpenOps workflows may connect to cloud providers and other operational systems. Do not place real production credentials into configuration until you understand how the selected integration stores and uses them. Begin with the least privilege needed for the intended workflow. A reporting workflow may not require permission to change resources, while a remediation workflow may require narrowly scoped write permissions.

Do not invent environment values

The supplied OpenOps evidence does not document the complete environment-variable set, generated secrets, default credentials, initial administrator workflow, data-volume layout, or required production overrides. Use the environment template and instructions that belong to the exact OpenOps revision you install. Never copy placeholder secrets into a remotely accessible deployment.

Layer What to confirm Why it matters
Host Supported platform, storage, memory, CPU, and administrative access An undersized or unsupported host can cause container startup failures and unstable workflows.
Docker Compose Docker is running and Compose is available to the installation account OpenOps identifies Docker Compose as its official self-hosting method.
OpenOps revision The selected release, its deployment files, and its release notes Commands, images, configuration requirements, and upgrade behavior can change between revisions.
Local endpoint The actual HTTP address and port published by the deployment Local verification and the Localtonet HTTP tunnel must use a real reachable endpoint.
Identity and permissions Application users and least-privilege integration credentials FinOps automation can handle sensitive cost data and may trigger infrastructure actions.
Recovery Persistent data locations, backup method, and tested restore process Container recreation is not a substitute for protecting application data and configuration.

Install and configure OpenOps with Docker Compose

Docker Compose installation flow from prerequisites and configuration to a local OpenOps check.
Configure and start the Compose stack, then confirm that OpenOps responds locally before exposing it.

The official project identifies Docker Compose as the ready-to-install self-hosting method. The repository contains the Compose file and environment template needed to define the deployment. However, the evidence supplied for this draft does not include the official quick-start commands, required Docker versions, exact environment setup, service names, image tags, local port, startup command, or initialization sequence.

For that reason, this article does not present an unverified command block. A plausible-looking command copied from a different OpenOps revision could start the wrong image, omit a required configuration step, overwrite local changes, or publish an unintended port. The safe installation workflow is to keep the Compose file, environment template, and instructions from the same project revision together.

1. Select and record the OpenOps revision

Start with the official OpenOps repository or an official release. Record the tag or commit that you intend to deploy. Review its release information for migration notices, fixes, or configuration changes. Avoid combining a current Compose file with environment instructions from another release.

2. Obtain the complete deployment files

Download or clone the selected project revision so that the Compose file and related configuration are available together. The repository includes compose.yaml, .env.template, Docker build files, and other project material. Do not extract only one file unless the instructions for that exact revision explicitly say that it is sufficient.

3. Inspect the Compose definition before running it

Review the Compose file to identify the services it creates, the container images or build contexts it uses, its volume declarations, dependency relationships, and any ports it publishes to the host. The supplied project extract does not establish the service names or port mappings, so those values must be read from the selected revision.

This inspection also tells you whether the browser interface binds only to the local machine, to a LAN interface, or to all host interfaces. Binding behavior directly affects local security and determines which target address the Localtonet client can use later.

4. Build the environment configuration from the matching template

Use the included .env.template and the documentation for the chosen revision to create the runtime configuration expected by its Compose deployment. Determine which entries are mandatory, which are optional, and which require unique secrets. Do not assume that a template value is secure for production merely because it allows a development deployment to start.

Keep the resulting environment file out of public repositories, shared chat logs, screenshots, and support messages. If a secret is accidentally disclosed, rotate it rather than only deleting the visible copy.

5. Start the deployment using the documented command for that revision

Run the Docker Compose startup procedure specified by the current OpenOps quick-start documentation. The exact command is intentionally not reproduced here because it was not included in the supplied evidence. Observe the initial output rather than immediately moving on to the tunnel.

Image downloads, builds, database initialization, or other startup work may take time. A container being created does not prove that the application is ready. Review service states and logs using the Docker Compose operations documented for the installed version.

6. Complete any documented first-run setup

If the selected OpenOps release presents an initialization or account-creation workflow, complete it locally. The supplied evidence does not specify default usernames, passwords, or a fixed first-run sequence, so this guide does not invent them. Do not search for or rely on presumed default credentials.

7. Record the verified local endpoint

From the actual Compose port mapping and a successful browser test, record the precise HTTP endpoint that works from the Localtonet client device. You need a local IP address or hostname and a port. Do not assume a common development port, and do not use a container-internal port unless the Localtonet client shares a network where that address is reachable.

Why there is no copy-and-paste installation command here

The project evidence confirms the Docker Compose installation path but does not include its current quick-start command or endpoint details. Omitting those values is deliberate. Before editorial publication, the command sequence should be checked against the current official OpenOps quick-start documentation and the exact release selected for the tutorial.

Verify OpenOps locally before creating a tunnel

Local verification creates a known-good baseline. If the interface works locally but not remotely, you can concentrate on target reachability and tunnel configuration. If the interface does not work locally, changing the tunnel will not repair the OpenOps deployment.

Check the Compose workload

Use the Docker and Compose inspection commands appropriate to the installed versions to confirm that the expected services are running. Look for containers that repeatedly restart, exit immediately, remain unhealthy, or report dependency failures. Review logs for configuration errors, missing values, failed migrations, permission problems, unavailable dependencies, and port conflicts.

Do not assume that every container must publish a host port. Multi-service applications commonly keep supporting components on an internal container network and publish only the browser-facing service. Use the Compose definition as the authority for the selected revision.

Open the interface from the host

Load the exact host address and port published by the Compose deployment. Confirm that the browser receives an OpenOps page rather than a Docker error, unrelated service, generic proxy response, or blank connection. If the deployment redirects between paths or schemes, note the final working URL.

Test from the Localtonet client device

If Localtonet will run on another device, test the same endpoint from that device before creating the tunnel. A browser, HTTP client, or equivalent local test can establish basic reachability. If the host itself can open OpenOps but the Localtonet device cannot, investigate the OpenOps bind address, LAN routing, host firewall, and container port publication.

Exercise an application-level function

A page loading is only the first check. Confirm that you can authenticate through the configured access flow and reach the expected OpenOps interface. Open a workflow-related page, OpenOps Tables, or OpenOps Analytics if enabled in your deployment. Verify that navigation and API-backed page content work, since a partially initialized application can render an initial page while later requests fail.

Create a baseline for troubleshooting

Record the working local URL without including credentials, tokens, or sensitive query strings. Note which device performed the test and whether the target uses an IP address or hostname. This verified endpoint is the only endpoint that should be entered as the Localtonet HTTP tunnel target.

Do not expose an uninitialized interface

Complete the intended account and authentication setup before remote access. If the installed OpenOps revision starts with an enrollment, bootstrap, or administrator-creation page, exposing that page publicly could allow an unintended person to reach it. The exact first-run behavior must be confirmed against the selected release.

Access the verified OpenOps interface with Localtonet

Once OpenOps works from the device that will run our client, an HTTP tunnel is the appropriate Localtonet tunnel family for its browser-based interface. The client establishes an outbound connection to a Localtonet relay server, so this workflow does not require inbound router port forwarding, a public IP address, VPN setup, or an inbound firewall change.

An HTTP tunnel points to a local IP address and port. Its public side uses an HTTPS address. HTTP tunnel process types can use a random subdomain, a custom subdomain where supported, or a custom domain. These process types change how the public address is selected, not which OpenOps content the tunnel serves.

1

Install and run the Localtonet client

Install our client on the OpenOps host or on another device that can reach the verified OpenOps HTTP endpoint. Confirm the client device remains available whenever remote access is required.

2

Authenticate or select the client device

Use the device-specific authentication token associated with the client that will run the tunnel. Treat this token as a secret. Do not copy it into documentation, screenshots, public repositories, or shared troubleshooting output.

3

Select an available relay server

Choose a current relay server or region from the Localtonet dashboard. Available server codes and regions can vary, so obtain the value from the current product rather than following a hardcoded example.

4

Create an HTTP tunnel for OpenOps

Select the HTTP tunnel family and enter the exact local IP address and port that passed the earlier reachability test. Choose the appropriate process type for the desired public address. Do not guess the OpenOps port or substitute a container-only endpoint that the Localtonet client cannot reach.

5

Start the tunnel and test its public address

Creating a tunnel does not start it. Use the Start button, then open the assigned public HTTPS address from a separate network or device. Confirm that the expected OpenOps authentication flow and interface appear.

6

Stop or delete access when it is no longer required

Stop the tunnel when temporary access ends. Delete configurations that are no longer needed. The public endpoint is available only while the selected client device is connected and the tunnel is running.

For the current dashboard workflow and field names, consult our Localtonet HTTP tunnel documentation. Current product documentation should be treated as authoritative when an option differs by client version, account, plan, or dashboard release.

A tunnel is not the same as a VPN

This workflow publishes the OpenOps HTTP interface through a targeted tunnel. It does not place the remote user on the entire host network. Localtonet VPN Manager is our separate private mesh VPN feature and should not be confused with a standard HTTP tunnel.

Secure a remotely reachable FinOps interface

Security boundaries between a public OpenOps endpoint, the Localtonet tunnel, and the private Docker host.
Only the OpenOps web endpoint should be reachable; host services, internal containers, and secrets remain private.

A FinOps platform may display cost information, account metadata, workflow history, resource identifiers, approval decisions, and integration status. Depending on its configured permissions, it may also initiate actions against cloud infrastructure. Treat public reachability as a security boundary change even when the tunnel is intended only for a small internal team.

Require application-level authentication

The public URL should lead to an authenticated OpenOps experience, not an open dashboard or an unfinished initialization screen. The supplied OpenOps evidence does not establish the authentication methods available in every release, so configure the mechanism supported by the version you install and test it before distributing the URL.

Use least-privilege cloud credentials

Scope each integration to the minimum accounts, projects, subscriptions, resources, and actions needed by the workflow. Separate read-only discovery from remediation where practical. A workflow that calculates allocation or reports anomalies should not automatically receive broad destructive permissions.

Keep secrets outside public material

Do not expose the OpenOps environment file, cloud credentials, webhook secrets, Localtonet device token, session data, or private endpoint details. Redact them from screenshots and logs. If a secret appears in a public location, assume it has been copied and rotate it.

Control who receives the public URL

A hard-to-guess address is not a substitute for authentication. Share access only with intended users, review application accounts regularly, and remove access when a team member or contractor no longer needs it. If your security policy requires stronger restrictions, evaluate the controls available in the current OpenOps and Localtonet configurations before exposure.

Test actions with low-risk resources

Before enabling a workflow that modifies infrastructure, test its inputs, conditions, approval points, and outputs against a limited non-production scope. Review workflow logs and verify that failure handling does not turn a partial error into an unsafe retry or repeated action.

Public HTTPS does not remove application security responsibilities

Localtonet provides the public HTTPS address and carries traffic to the configured local HTTP target, but the OpenOps operator remains responsible for user authentication, integration permissions, secrets, workflow design, host maintenance, backups, and safe application configuration.

Routine operation, maintenance, and upgrades

A useful self-hosted deployment needs more than a successful first startup. Document the OpenOps revision, configuration process, persistent storage, backup schedule, local endpoint, Localtonet device, and tunnel ownership. Keep secrets out of that operational record, but record where authorized administrators can retrieve or rotate them.

Starting and stopping services

Use the Docker Compose lifecycle commands documented for the installed OpenOps revision and your Docker environment. A normal stop should preserve persistent data, but that depends on how the deployment defines volumes and how an operator removes containers. Do not use destructive cleanup options until you know exactly which named volumes or host paths contain OpenOps data.

The Localtonet tunnel has a separate lifecycle. OpenOps can be healthy while its tunnel is stopped, and a tunnel can be running while OpenOps is unavailable. When remote access fails, check both states independently.

Backups

Identify every persistent component from the selected Compose file and current OpenOps documentation. Back up application data and the configuration needed to reconstruct the deployment. A copy of compose.yaml alone is not a data backup.

Protect backup copies because they may contain sensitive operational or financial data. Test restoration in an isolated environment. A backup procedure is not complete until the team has demonstrated that it can restore a usable deployment.

Upgrades

Review the target release notes and current OpenOps upgrade instructions before changing images or project files. Back up persistent data, preserve the current configuration, and note the running revision. Do not assume that replacing containers is sufficient if a release introduces a migration or new required environment value.

After upgrading, repeat the local verification sequence before re-enabling or relying on remote access. Confirm service health, authentication, workflow pages, tables, analytics, integrations, and a low-risk workflow operation. Then test the Localtonet URL.

Monitoring availability

Remote availability depends on several components: the OpenOps services, Docker, the host, the local network path, the Localtonet client, and the tunnel state. Monitor each layer appropriately. The tunnel is available only while its selected client is connected and the tunnel is running.

Troubleshooting OpenOps and the Localtonet tunnel

Troubleshooting checkpoints from the remote browser to the OpenOps Compose stack.
Check the browser path, public endpoint, tunnel session, local response, and container state in sequence.

The OpenOps page does not load locally

Start with Docker Compose rather than Localtonet. Confirm that the expected services exist and remain running. Review their logs for missing environment values, startup dependencies, permission failures, migrations, unavailable storage, or port conflicts. Compare the active project files with the instructions for the exact revision you selected.

Recheck the published port in compose.yaml. A container may listen internally without publishing that listener to the host. Because the supplied evidence does not establish a default OpenOps port, do not troubleshoot against an assumed port number.

The host can open OpenOps, but the Localtonet device cannot

This normally indicates a reachability difference between the two devices or network namespaces. Check the application's bind address, the host's LAN address, Docker's published-port configuration, local firewall rules, and network routing. If the Localtonet client runs in a container, remember that its loopback interface belongs to that container.

The tunnel exists, but no public address works

Verify that the intended Localtonet client is connected and that the tunnel was explicitly started. Tunnel creation and tunnel startup are separate actions. Also confirm that the selected device token belongs to the device that can reach OpenOps and that the selected relay server remains available in the current dashboard.

The public address returns an error or the wrong page

Compare the tunnel target with the locally verified IP address and port. Check whether another service occupies that port. Retest the target directly from the Localtonet client device. If the local test now fails, repair OpenOps or local networking before modifying the tunnel.

The login page appears, but later requests fail

Inspect OpenOps and browser errors for API, session, callback, or application configuration problems. The supplied evidence does not establish whether a particular OpenOps release requires a configured external URL, trusted origin, proxy header, or callback setting. Do not invent one. Check the documentation for the installed release and change only settings it explicitly supports.

The deployment worked until an update

Compare the previous and new release instructions, Compose definitions, image references, and environment templates. Look for newly required values or migrations. Restore from a tested backup if the documented recovery process calls for it. Avoid repeatedly recreating volumes, since destructive cleanup can turn an application problem into data loss.

The remote URL became unavailable unexpectedly

Check whether the OpenOps host restarted, Docker stopped, the Localtonet client disconnected, or the tunnel was stopped. Then check local OpenOps reachability from the client device. This sequence prevents time being spent on public routing when the underlying service is offline.

Frequently asked questions

What is the official self-hosting method for OpenOps?

OpenOps identifies a free, ready-to-install Docker Compose deployment as its self-hosting option. The project repository includes a compose.yaml file and an environment template. Exact commands and required values should be taken from the instructions belonging to the selected OpenOps revision.

Which port does OpenOps use?

The supplied project evidence does not establish a default local port. Read the port mapping from the compose.yaml file for the exact revision you install, then verify the resulting endpoint locally. Use that tested port as the Localtonet target.

Why should I test OpenOps locally before using Localtonet?

A local test proves that the application, Docker networking, configuration, and published port work before a remote-access layer is added. If local access succeeds but remote access fails, troubleshooting can focus on reachability and tunnel configuration.

Which Localtonet tunnel type should I use for the OpenOps interface?

Use an HTTP tunnel for the browser-based OpenOps interface. Configure it with the local IP address and port that you already verified from the Localtonet client device. Do not guess the endpoint from a generic OpenOps example.

Do I need router port forwarding or a public IP address?

No. Our client establishes an outbound connection to a Localtonet relay server. This workflow does not require inbound router port forwarding, a public IP address, VPN setup, or an inbound firewall change.

Does creating a Localtonet tunnel immediately make OpenOps available?

No. Creating the configuration and starting it are separate lifecycle actions. Select the correct client device and relay server, create the HTTP tunnel, and then use the Start button. The tunnel remains available only while the client is connected and the tunnel is running.

Can the Localtonet client run on a different device from OpenOps?

Yes, provided that the client device can reach the OpenOps local IP address and port. Test that path directly before creating the tunnel. If the client is on another device, a service bound only to the OpenOps host's loopback interface will not be reachable from it.

Is an HTTP tunnel a replacement for OpenOps authentication?

No. The tunnel provides remote network reachability to the configured endpoint. OpenOps still needs appropriate application authentication, user management, least-privilege integrations, secure secrets, backups, and safe workflow controls.

Can I use a custom domain for the OpenOps tunnel?

HTTP tunnels support random subdomain, custom subdomain, and custom domain process types. Availability can vary by current product configuration or plan. Check the current dashboard and Localtonet documentation before changing DNS because exact custom-domain DNS instructions are not established in the supplied context.

Access your verified OpenOps deployment with Localtonet

After OpenOps is running, authenticated, and reachable from the client device, create an HTTP tunnel using the exact local endpoint you tested. Start the tunnel only when the interface is ready for its intended remote users.

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