28 min read

Build OpenAList from Source with Localtonet Access

Build and verify OpenAList from source, then securely connect its local web interface through a Localtonet HTTP tunnel.

Source-built OpenAList running locally and connected to a remote browser through a Localtonet HTTP tunnel.
OpenAList runs on the local machine while Localtonet carries remote HTTP traffic to it.
Self-Hosting ยท OpenAList ยท Localtonet ยท 2026

Compile a local file management service and make its web interface reachable when you need it

OpenAList is a self-hosted file listing and management application that connects multiple storage systems through a browser-based interface. In this guide, we build the Go application from source, start it with its documented defaults, inspect its configuration, and verify the local web endpoint before introducing any remote access. We then connect the working service through a Localtonet HTTP tunnel without requiring inbound router port forwarding, firewall changes, a VPN, or a public IP address. The result is a practical installation-first workflow with clear security, operations, and troubleshooting guidance.

๐Ÿ”’ Verify locally before creating public access ๐ŸŒ Connect the documented HTTP endpoint on port 5244 โšก Build directly from the OpenAList source repository

Understand what you are building

OpenAList is an independently maintained, community-driven fork that originated from Alist v3.45.0. It provides a browser-accessible file listing and management service that can work with local storage, cloud drives, object storage, and virtual storage drivers. The project reports support for more than 60 storage drivers and also advertises WebDAV, FTP, SFTP, and S3-compatible access.

This article deliberately focuses on the HTTP web interface. The documented default web address is http://localhost:5244, which gives us a specific endpoint that can be built, started, and tested consistently. Although OpenAList supports additional access protocols, the available evidence does not establish their ports or complete configuration procedures. We therefore do not guess those details or treat an HTTP tunnel as a substitute for a native WebDAV, FTP, SFTP, or S3-compatible connection.

Building from source is useful when you want to inspect the code you are compiling, test a particular revision, contribute changes, or avoid depending on a prebuilt package. It also places more responsibility on the operator. You must install a compatible Go toolchain and C compiler, retain the application data, manage startup and restarts, decide how updates will be reviewed, and protect any service you expose beyond the local machine.

๐Ÿงฑ Go source build The documented build uses Go 1.27.1 or later, a C compiler for SQLite and CGO, and the jsoniter build tag.
๐Ÿ—‚๏ธ Storage gateway OpenAList presents connected local and remote storage through a file-oriented web interface and supports multiple storage drivers.
๐ŸŒ Documented web endpoint The default local address is http://localhost:5244, which can be tested before any remote tunnel is created.
๐Ÿ”Œ Outbound tunnel connection With Localtonet, the client establishes an outbound connection to our relay and provides a public HTTP address for the local service.

How the completed workflow fits together

OpenAList runs on the host and listens for web requests on its local endpoint. A browser on that host can use http://localhost:5244 directly. For remote access, the Localtonet client must run on the same device or on another device that can reach the OpenAList IP address and port. The HTTP tunnel then forwards requests arriving at its assigned public HTTPS address to that local target.

These are separate layers. OpenAList remains responsible for its users, storage configuration, file permissions, application behavior, and data. Localtonet provides the network path to the local HTTP service. Creating a tunnel does not install OpenAList, configure storage, or replace application authentication.

Build first, expose second

Keep the service local while installing it. Confirm that OpenAList starts, that its web interface loads, and that administrator access is under your control before creating a public tunnel. This separation makes build failures and networking failures much easier to diagnose.

Prepare the OpenAList build system

The documented source build has three tool requirements: Git, Go 1.27.1 or later, and a C compiler for SQLite and CGO. You also need enough local storage for the repository, Go module downloads, the compiled executable, the application data directory, and any local files you later connect to OpenAList.

Requirement Why it is needed What to verify
Git Clones the OpenAList source repository and lets you identify the revision being built. The git command is available in the shell used for the build.
Go 1.27.1 or later Compiles the OpenAList Go application and resolves its declared Go modules. go version reports a release that satisfies the documented minimum.
C compiler Supports the SQLite and CGO portions of the documented build. A compiler suitable for the operating system and Go target is installed and discoverable.
Writable working directory Holds the repository, build output, and the default ./data directory. The account running OpenAList can write to the selected location.
Available TCP port 5244 The default OpenAList web endpoint uses this port. No unrelated process is already listening on the required local port.

You can check the two versioned command-line tools with:

git --version
go version

Compiler installation and detection differ by operating system and toolchain. The project evidence requires a C compiler but does not establish one universal compiler package or installation command. Install the compiler recommended for your operating system and Go environment rather than copying a package-manager command intended for a different platform.

Choose a service account and working directory

Decide which operating-system account will own the OpenAList process and data. For a durable installation, avoid building and running the service from a temporary directory. The documented default data directory is relative to the current working directory, so changing that directory can affect which ./data folder the process uses.

This detail matters during later restarts. Starting the same executable from a different working directory can cause the application to find or create a different relative data directory. Keep the executable, working directory, and data backup procedure clearly documented for your host.

Decide whether to build a moving branch or a reviewed revision

A plain clone followed by a build compiles the revision currently checked out by Git. For repeatable deployments, record the exact commit or release tag that you reviewed and built. Do not assume that rebuilding a moving branch at a later date will produce the same binary or dependency set.

Release tags provide a useful review boundary, but the operator should still inspect the selected release notes and verify that the revision is appropriate for the deployment. The source repository also includes a build.sh file, but the project states that this script is intended for release and CI workflows and requires an explicit build mode. It is not the normal local build command used in this guide.

Do not treat a successful compilation as a security review

Compilation only shows that the selected source and dependencies can produce an executable in the current environment. Review the revision you intend to run, keep the build environment trustworthy, and protect the resulting binary and data directory from unauthorized modification.

Build and start OpenAList from source

Five-stage flow from OpenAList source code to a running local web service.
The source workflow prepares dependencies, builds an executable, and starts the local service.

The official source workflow is concise: clone the repository, enter it, build the current package with the required tag, and start the generated executable. Run these commands as the operating-system account that will own the working files, unless your deployment process intentionally separates building from runtime operation.

1

Clone the OpenAList repository

Use Git to obtain the source tree from the maintained repository. This creates an openalist directory beneath the current directory.

git clone https://github.com/AlliotTech/openalist.git
2

Enter the source directory

Change into the cloned repository so that the Go build uses the project module and writes the executable into the expected working directory.

cd openalist
3

Compile the application

Build the current package with the documented jsoniter build tag and write the result to an executable named alist.

go build -tags=jsoniter -o alist .
4

Start the OpenAList server

Run the generated executable in server mode. Keep this terminal available while performing the first local verification so that startup messages and errors remain visible.

./alist server

The build can download Go modules declared by the project, so the build environment needs access to the dependency locations used by the Go toolchain. If the build stops during dependency resolution, distinguish an internet, proxy, certificate, or module-fetching problem from a compiler error in OpenAList itself.

The command syntax shown above is the project-documented source workflow. Executable invocation conventions can differ across operating systems. If your platform names or launches executables differently, use the platform-appropriate form while preserving the same server argument. The supplied project evidence does not provide separate source-build commands for every operating system, so we do not invent platform-specific variants.

What a successful first start should establish

A successful start should leave the server process running and make the documented web address available at http://localhost:5244. The default data directory is ./data, relative to the process working directory, and the default configuration file is data/config.json.

Do not immediately edit configuration values merely because the file now exists. First preserve a copy, inspect the generated structure, and identify the exact setting you need to change. Configuration formats can evolve between revisions, so using the file generated by the version you actually built is safer than pasting an old example from an unrelated release.

Source build and frontend development are different workflows

The normal source build above produces and starts OpenAList. The separate development workflow uses the backend repository, the openalist-web repository, Node.js 22.22.1 or later, pnpm 11, and ./dev.sh. You do not need that frontend development setup merely to perform the documented go build installation.

Configure credentials, storage, and application behavior

OpenAList stores its default configuration in data/config.json. Configuration can also be supplied through environment variables prefixed with ALIST_. The evidence does not provide a complete environment-variable reference, so use only variable names documented for the OpenAList version you are running. Do not infer a variable name by converting a JSON key and assuming it will work.

Establish administrator control

A new installation needs a protected administrator account before it is exposed remotely. The Docker workflow explicitly documents that a random administrator password is printed in container logs, along with Docker-specific commands for setting or resetting that password. Those Docker commands do not apply to a source-built process, and the available source-build evidence does not establish an equivalent password retrieval or reset command.

For that reason, inspect the startup output and the administration flow presented by the exact source-built version. Confirm that you can authenticate as the administrator and replace any temporary or generated credential with a strong, unique password before creating a Localtonet tunnel. If the expected credential information is not present, consult the matching OpenAList version documentation rather than attempting Docker-only commands against the source installation.

Never expose an installation with uncertain administrator credentials

If you cannot confirm who controls the administrator account, stop the server and resolve that issue locally. A public URL makes the login surface reachable from the internet, so credential ownership must be established first.

Add storage carefully

OpenAList supports local storage and numerous external storage providers. Each provider can have different credentials, permissions, redirect requirements, token lifetimes, and path conventions. Use local tools or provider-approved authorization methods to obtain credentials. Do not submit cloud storage tokens, refresh tokens, cookies, or account passwords to untrusted online token generators.

Apply least privilege to every connected storage account. If an OpenAList user only needs to browse or download files, avoid giving the underlying provider credential unnecessary write or administrative permissions. If uploads are required, limit access to the relevant directory or bucket wherever the provider supports that restriction.

OpenAList supports protected routes and authentication for specific paths, but exact setup details are version-specific and are not included in the supplied evidence. Verify those controls in the administration interface of the version you built. Do not assume that every listed directory is private simply because the administrator interface requires a login.

Understand migration behavior

If this is a fresh OpenAList installation, the migration warning from upstream Alist does not apply. If you are reusing an existing Alist data directory, back it up before starting OpenAList. OpenAList uses a different static password salt from upstream Alist, so existing password hashes in that reused data directory will no longer validate.

After switching from Alist, reset the administrator password and then reset the passwords of other local users through the administration interface as needed. Do not expose the migrated service until you have tested account access and confirmed that old credentials are not leaving users unexpectedly locked out.

Verify the local OpenAList service

Terminal and localhost browser views confirming that OpenAList is running and responding.
A running process and successful localhost response verify the OpenAList service before tunneling.

Local verification proves that the application is working independently of Localtonet. Perform these checks from the OpenAList host before diagnosing tunnels, DNS, or remote browser behavior.

Open the documented local address

On the same machine as the running process, open:

http://localhost:5244

The OpenAList web interface should load. If it does, confirm that page assets render correctly, administrator authentication works, and the administration area is accessible only with the intended credentials. Add a limited test storage target or inspect an already configured target, then verify that file listings and intended operations behave correctly.

A page that loads is necessary but not sufficient. Test the particular workflow you plan to use remotely. For example, if the deployment is intended for read-only browsing, verify directory navigation and a permitted download. If uploads are intended, test them with a non-sensitive file and confirm where the file is stored. Remove the test file afterward if it is no longer needed.

Confirm the runtime directory

Verify that data/config.json and the rest of the ./data directory are being created or read beneath the intended working directory. Restarting from another directory can change the meaning of a relative path, so record the directory from which ./alist server is launched.

Test from the Localtonet client host if it is different

When the Localtonet client runs on the OpenAList machine, the tunnel can normally target the loopback service at 127.0.0.1 on port 5244. If the client runs on another device, 127.0.0.1 would refer to that other device, not the OpenAList host. In that topology, the client device must be able to reach an appropriate local network address for the OpenAList host.

The project evidence establishes the default localhost endpoint, but it does not establish the exact OpenAList listener configuration required for access from another LAN device. Do not assume the service is listening on all network interfaces. Either run the Localtonet client on the same host or verify the relevant OpenAList listener configuration for your installed version before using a separate tunnel device.

Use one layer at a time during verification

First test localhost:5244 on the OpenAList host. Next, if applicable, test connectivity from the Localtonet client device. Only then start the public tunnel. This sequence reveals whether a failure belongs to the application, the local network path, or the tunnel.

Run, back up, and update the source-built service

The documented command ./alist server runs the application directly. During initial testing, foreground operation is useful because messages remain visible. For unattended operation, use a process supervisor appropriate to your operating system, but define it around the verified executable, working directory, runtime user, and data directory.

The available project evidence does not specify a universal system service definition. Service managers differ across Linux distributions, Windows, macOS, containers, and NAS platforms, so this guide does not fabricate one. Whatever supervisor you select should start OpenAList from the same working directory used during testing, retain logs, restart it according to your policy, and avoid running it with unnecessary operating-system privileges.

Back up the persistent data

Treat the ./data directory as persistent application state. Before migration, configuration changes, or upgrades, create a recoverable backup using a method appropriate to your filesystem and deployment. Protect backups because configuration data can contain sensitive provider details or references to connected storage.

A backup is only useful if restoration has been tested. On a non-production copy, confirm that the backed-up data can be restored with the expected ownership and permissions. Keep the OpenAList version associated with each backup so that you can reason about configuration compatibility during recovery.

Plan controlled source updates

A source installation does not update itself merely because the repository has a newer release. A controlled update should identify the target revision, review its release information, back up the current data, stop the running process cleanly, build the selected source, and verify the new executable locally before restoring remote access.

Retain the previously working executable or another tested rollback path until the update has passed local and remote checks. Avoid rebuilding directly over the only known-good binary without a recovery plan. If an update changes storage drivers or authentication behavior, test those areas explicitly rather than relying only on the home page loading.

Know the alternative installation methods

Installation method Documented startup Best fit Important consideration
Source build go build -tags=jsoniter -o alist ., then ./alist server Code review, development, customization, or controlled builds You maintain the compiler toolchain, build process, runtime supervision, and updates.
Prebuilt binary Extract the release archive, then run ./alist server A simpler host installation without compiling locally Select the archive matching the operating system and architecture.
Docker image Run the published alliot/alist image with port and data volume mappings Container-oriented deployment and reproducible image selection Persist /opt/alist/data and prefer a reviewed version tag for reproducible production deployment.
Docker Compose example Review the included file, then use docker compose up -d Declarative container configuration Review its volume path and environment variables before starting it.

Docker image variants are published with different bundled components: the standard image contains OpenAList, the ffmpeg variant includes FFmpeg, the aria2 variant includes aria2, and the aio variant includes OpenAList, FFmpeg, and aria2. Published Docker images cover Linux AMD64 and ARM64. Those image variants do not change the source-build procedure in this article.

Connect OpenAList through a Localtonet HTTP tunnel

Remote browser traffic passing through Localtonet to an OpenAList service on localhost.
The Localtonet client carries public HTTP requests to OpenAList without exposing the local service directly.

Once http://localhost:5244 works reliably, you can add remote access. With Localtonet, the client application on the selected device establishes an outbound connection to one of our relay servers. This means you do not need to configure inbound router port forwarding, change inbound firewall rules, set up a VPN, or obtain a public IP address for this workflow.

An HTTP tunnel is the appropriate choice for the documented OpenAList browser endpoint. It forwards web traffic to the local IP address and port you configure. It does not automatically expose OpenAList's separate WebDAV, FTP, SFTP, or S3-compatible protocols, and it should not be described as a VPN.

1

Install and run the Localtonet client

Install our client on the OpenAList host or on another device that can reach the OpenAList service. Keep OpenAList running and locally verified before proceeding.

2

Authenticate or select the client device

Use the device-specific authentication token associated with the client that will run the tunnel. Treat the token as a secret, and never paste it into an article, screenshot, public issue, or shared command history.

3

Select an available relay server

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

4

Create the HTTP tunnel configuration

Create an HTTP tunnel and point it to the OpenAList local target. When the Localtonet client runs on the same host, use local IP address 127.0.0.1 and port 5244. If the client runs elsewhere, use only an address that has already been verified as reachable from that device.

5

Start the tunnel and test the assigned address

Creating a tunnel does not make it run. Press the Start button, then open the assigned public HTTPS address in a separate browser session and verify the same limited workflow you tested locally.

6

Stop or delete access when it is no longer needed

Stop the tunnel to remove active remote access while retaining its configuration, or delete the tunnel when the configuration is no longer required. The public endpoint is available only while the selected client is connected and the tunnel is running.

HTTP tunnels can use a Random Sub Domain, Custom Sub Domain, or Custom Domain process type. All three serve the configured content at a public HTTPS address. Availability can vary by plan or current product configuration, and custom-domain DNS requirements must be checked against current documentation before making DNS changes.

For the current dashboard workflow and available options, consult our Localtonet HTTP tunnel documentation. Use the dashboard values shown for your account instead of relying on server names, region codes, or options copied from an older guide.

A public URL expands the service's attack surface

Anyone who learns or discovers the URL can attempt to reach the OpenAList web interface. Require strong application authentication, review public and protected paths, limit storage permissions, keep the selected OpenAList revision updated, and stop the tunnel when remote access is not required.

Apply a layered security checklist

Remote access should preserve the principle that each layer has a separate responsibility. OpenAList controls application users, paths, storage drivers, and file operations. The operating system controls the process account and local files. Localtonet carries requests between the public endpoint and the configured local target. Securing one layer does not remove the need to secure the others.

๐Ÿ”‘ Protect administrator access Confirm administrator ownership locally, replace temporary credentials, and use a unique password before starting the tunnel.
๐Ÿ“ Limit storage permissions Give provider credentials and OpenAList users only the file access required for their tasks.
๐Ÿงฉ Review every public path Test protected routes and anonymous behavior explicitly. Do not assume the entire listing is private because administration requires authentication.
๐Ÿ›ก๏ธ Protect local state Restrict access to the executable, working directory, configuration, data directory, logs, and backups.
๐Ÿ”„ Review updates Track the revision in use, read relevant release information, back up state, and verify updates before restoring public access.
โน๏ธ Minimize exposure time Stop the Localtonet tunnel when remote access is unnecessary, especially during maintenance or credential recovery.

Keep tokens and provider credentials out of diagnostics

Troubleshooting information can contain secrets. Before sharing OpenAList logs, configuration excerpts, screenshots, or Localtonet dashboard captures, remove authentication tokens, provider credentials, private URLs, cookies, user names, and sensitive paths. Do not commit generated configuration or secrets to a public source repository.

Use separate accounts for separate people

Avoid sharing the administrator credential for routine file access. Where the installed OpenAList version supports the required user and path controls, create accounts with permissions aligned to each person's task. Administrative access should be reserved for configuration and maintenance.

Do not expose development mode as production

The OpenAList development workflow starts a Go backend and frontend development server together. It requires a separate frontend repository, Node.js 22.22.1 or later, pnpm 11, and normally expects the backend and frontend repositories to be sibling directories. That workflow is intended for development and contribution work, not as a shortcut for the source-built service described here.

Troubleshoot build, startup, and tunnel failures

The Go build reports an unsupported version

Run go version in the same shell used for the build. OpenAList requires Go 1.27.1 or later according to the supplied project documentation. If multiple Go installations exist, verify that the shell resolves the intended executable rather than an older copy earlier in the system path.

The build fails around CGO, SQLite, or a C compiler

Confirm that a compatible C compiler is installed and available to the Go toolchain. A Go-only setup is not sufficient for the documented SQLite and CGO requirement. The exact compiler package varies by operating system, so use the toolchain recommended for the host rather than guessing from another distribution.

Go cannot download modules

Check outbound network access, DNS resolution, proxy settings, certificate trust, and any organization-specific Go module policy. A module-fetching error occurs before or during dependency resolution and is different from a source compilation error. Preserve the exact error text when diagnosing it, but redact private proxy addresses or credentials before sharing it.

./alist server does not start

Confirm that the build completed and that the alist executable exists in the current directory. Verify that the runtime account can execute it and write to the intended working directory. Read the process output for a specific configuration, database, permission, or port error rather than repeatedly restarting it without changing the underlying condition.

The browser cannot open localhost:5244

First confirm that the OpenAList process is still running. Then verify that you are testing from the same host and using the exact HTTP URL and port. If another process already occupies port 5244, inspect the conflict before changing application settings. The evidence establishes the default port but does not provide a complete port-change procedure, so follow the configuration reference for the exact OpenAList version if a different port is necessary.

OpenAList starts with an unexpected empty configuration

Check the current working directory. Because the default data location is ./data, launching the executable from another directory can point it at a different relative data directory. Stop the process before moving or replacing state, verify your backups, and restart it from the intended working directory.

The local interface works but the Localtonet URL does not

Confirm that the Localtonet client is connected, the correct device token was selected, the HTTP tunnel is started, and the local target is correct. If both processes run on the same host, verify 127.0.0.1 and port 5244. If they run on different devices, test the OpenAList address directly from the Localtonet client device before blaming the public tunnel.

Also remember that tunnel creation and tunnel startup are separate actions. A saved configuration does not provide a live public endpoint until it has been started, and the endpoint remains available only while the selected client is connected and the tunnel is running.

The public page loads but login or file operations fail

Compare the same action locally and remotely. If it also fails locally, investigate OpenAList users, route protection, storage credentials, provider permissions, and application logs. If it fails only through the public address, capture the browser behavior and relevant logs while removing secrets. Avoid broadening storage or user permissions merely as a diagnostic shortcut.

Passwords fail after migrating from Alist

This is expected when reusing an upstream Alist data directory because OpenAList uses a different static password salt. Restore from backup if needed, reset the administrator password using the procedure appropriate to the installed OpenAList version, and reset other local user passwords through the administration interface. Fresh installations are not affected by this migration-specific issue.

Frequently asked questions

What version of Go is required to build OpenAList?

The documented requirement is Go 1.27.1 or later. The source build also requires Git and a C compiler for SQLite and CGO. Check the active toolchain with go version before building.

What command builds OpenAList from source?

After cloning the repository and entering its directory, the documented command is go build -tags=jsoniter -o alist .. Start the resulting application with ./alist server.

Where does a source-built OpenAList installation store its configuration?

The default data directory is ./data, and the default configuration file is data/config.json. Because the data path is relative, keep the process working directory consistent across restarts.

What local address should I test before creating a tunnel?

Test http://localhost:5244 from the OpenAList host. Confirm that the interface loads, administrator access works, and the intended file operations succeed before adding remote access.

Which Localtonet tunnel type should I use for the OpenAList web interface?

Use an HTTP tunnel for the documented browser endpoint. When the Localtonet client and OpenAList run on the same host, configure the local target as 127.0.0.1 on port 5244.

Does an HTTP tunnel also expose OpenAList WebDAV, FTP, SFTP, or S3 access?

No. The HTTP tunnel in this guide targets the web interface on port 5244. OpenAList advertises additional protocols, but their ports and complete setup details are not established by the evidence used for this tutorial. Configure those protocols separately using verified documentation if you need them.

Does Localtonet require router port forwarding or a public IP?

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

Will creating the tunnel make OpenAList publicly available immediately?

Not by itself. Creating a Localtonet tunnel saves its configuration, but you must also start it. The public endpoint remains available only while the selected Localtonet client is connected and the tunnel is running.

Can the Localtonet client run on a different device?

Yes, if that device can reach the OpenAList host and port. Do not use 127.0.0.1 in that topology because it would refer to the Localtonet client device itself. Verify the local network path and the OpenAList listener behavior before starting the tunnel.

Should I use build.sh for a normal local build?

No. The project identifies build.sh as a release and CI workflow script that requires an explicit build mode. The normal local build documented by the project is go build -tags=jsoniter -o alist ..

Connect your verified OpenAList service with Localtonet

Build OpenAList, confirm that its web interface works locally, secure the administrator account, and then create an HTTP tunnel to the verified port 5244 target. You can stop the tunnel whenever remote access is no longer required.

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