29 min read

Self-Host Zerobyte and Access It with Localtonet

Install Zerobyte with Docker Compose, verify its backup web interface locally, and enable remote HTTP access through Localtonet.

Self-Hosting ยท Zerobyte ยท Localtonet ยท 2026

Build a Restic-powered backup control plane, verify recovery locally, and expose its web endpoint with a carefully controlled tunnel

Zerobyte provides a web interface for scheduling, monitoring, restoring, and maintaining Restic backups. In this guide, we install the evidenced v0.42 container with Docker Compose, configure persistent local storage, create the initial administrator account, and verify the service on port 4096. We compare the standard deployment for remote filesystem mounts with a reduced-privilege deployment for local directories. After the local installation and a test restore work, we connect the HTTP interface to Localtonet without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.

๐Ÿ”’ Local verification and exposure guidance ๐ŸŒ Zerobyte HTTP interface on port 4096 โšก Docker Compose and Localtonet workflow

What Zerobyte does and how this deployment works

A remote browser reaches a Docker-hosted Zerobyte service through a Localtonet HTTP tunnel.
Zerobyte runs on the local Docker host while Localtonet provides the remote HTTP path.

Zerobyte is an open-source backup automation service built on Restic. Restic remains the underlying backup engine, while Zerobyte provides a web control plane for routine administration. Operators can connect source volumes, create backup repositories, define schedules and retention policies, monitor runs, browse snapshots, restore data, and perform repository maintenance without assembling separate scripts for every routine task.

Zerobyte supports local directories and remote sources such as NFS, SMB/CIFS, WebDAV, SFTP, and rclone-backed storage. Backup repositories can use local storage, S3-compatible services, Google Cloud Storage, Azure Blob Storage, REST servers, SFTP targets, and providers available through rclone. The exact source and destination settings depend on your storage systems, credentials, permissions, recovery objectives, and failure model.

Zerobyte runs as a Docker container. Its web interface and API listen on port 4096 by default. Docker Compose describes the image, port mapping, environment variables, capabilities, devices, and persistent volumes. The application data directory inside the container is /var/lib/zerobyte, and it must be mapped to durable local storage on the host.

Localtonet is a separate connectivity layer. Zerobyte continues running on your own server and remains responsible for its users, roles, sessions, and application authorization. Our client establishes an outbound connection from a device that can reach Zerobyte to a Localtonet relay server. A running HTTP tunnel then maps a public HTTPS address to the local Zerobyte HTTP endpoint. The endpoint is available only while the selected Localtonet client is connected and the tunnel is running.

๐Ÿ—„๏ธ Restic-powered backups Zerobyte manages encrypted, compressed, incremental, and deduplicated Restic snapshots through a web interface.
๐Ÿ“… Scheduling and retention Backup jobs can use cron-based schedules, include and exclude rules, retention policies, compression choices, and manual runs.
๐Ÿ” Monitoring and restores Operators can review run status and snapshot history, monitor repository health, and restore files or directories.
๐Ÿ’พ Persistent application state Zerobyte stores its database, configuration, and encryption-related material under /var/lib/zerobyte.
๐ŸŒ Local HTTP service The web interface and API listen on port 4096 by default and can be verified before remote access is introduced.
๐Ÿ”— Outbound tunnel connectivity The Localtonet client initiates the relay connection, so this workflow does not require an inbound router port forward or public IP address.
Zerobyte remains a 0.x project

Zerobyte warns that major changes can occur between versions while core features remain under active development. This tutorial uses the v0.42 image shown in the verified installation evidence. It is a version-scoped example, not a timeless claim that v0.42 will always be the newest release. Review the v0.42.0 release information and the current release list before changing image tags.

Separate application state, source data, and repositories

Zerobyte's application directory is not the same resource as a source directory or backup repository. The application directory contains the configuration, database, and encryption-related material needed to operate Zerobyte. Source directories contain the files you want to protect. Repositories contain the Restic snapshots from which you recover.

Plan persistence, permissions, capacity, and disaster recovery for all three resources. Backing up only the application directory does not protect the source data, while preserving only the repository may leave an operator without the application configuration or credentials needed for a smooth recovery.

A working dashboard is also not proof that a backup is recoverable. A complete validation includes a successful backup run, snapshot inspection, repository health checks, and a restore to a safe destination. Remote access improves administrative reachability, but it cannot validate the integrity or usability of the stored data.

Prerequisites and deployment decisions

Zerobyte requires a server with Docker and Docker Compose. Docker Compose is included with Docker Desktop and may be installed separately as a plugin on Linux servers. This guide uses the modern docker compose command form. Consult the current Zerobyte installation documentation while preparing the host, especially if its requirements have changed since the evidenced v0.42 configuration.

You also need durable local storage for /var/lib/zerobyte, a valid timezone for scheduling, and a way to generate a random application secret. If you plan to back up host directories, identify their exact host paths before creating the Compose file. If Zerobyte must mount NFS, SMB, WebDAV, or SFTP sources from inside the container, use the standard installation and understand why it grants additional privileges.

Verify Docker and Docker Compose before continuing:

docker --version
docker compose version

Both commands should return version information. If either is unavailable, install the missing component using the instructions for your operating system and Docker distribution. There is no single verified package-manager command suitable for every supported host platform.

Choose the standard or simplified deployment

Deployment choice Use it when Capability profile Important limitation
Standard installation Zerobyte must mount NFS, SMB, WebDAV, or SFTP sources itself Adds SYS_ADMIN and passes /dev/fuse into the container Elevated capabilities increase the deployment's security impact
Simplified installation All source directories are already mounted locally on the Docker host Does not require SYS_ADMIN or /dev/fuse Cannot mount remote shares from inside Zerobyte
Read-only source mount Zerobyte should read source files without modifying them Adds :ro to the relevant bind mount Cannot restore directly to that read-only location
Read-write source mount Restoration to the mapped location is required Allows writes within the permissions granted by the host A broader write path requires careful permission management

Prefer the simplified deployment when local bind-mounted directories meet your requirements. It removes capabilities that are unnecessary for that use case. If a network share is already mounted by the host operating system, you may expose that mounted path as a local bind mount, but you still need to evaluate ownership, permissions, ACL behavior, symlinks, and metadata fidelity.

Keep Zerobyte application data on local storage

Do not point the host path mapped to /var/lib/zerobyte at a network share. Zerobyte warns that doing so causes permission problems and severe performance degradation. A remote backup repository is a different resource and does not change the local-storage requirement for the application's own state.

Special persistence requirement for TrueNAS

Zerobyte's installation guidance notes that the host /var/lib path is ephemeral on TrueNAS and can be reset during system upgrades. Create a dedicated ZFS dataset and map that durable dataset to /var/lib/zerobyte inside the container. The documented example uses /mnt/tank/docker/zerobyte, but your pool and dataset path may differ.

volumes:
  - /etc/localtime:/etc/localtime:ro
  - /mnt/tank/docker/zerobyte:/var/lib/zerobyte

Confirm that the dataset exists, remains persistent through upgrades, and is accessible to Docker before starting the container.

Install Zerobyte with Docker Compose

Docker Compose creates the Zerobyte container, persistent storage, and local web connection.
The Compose deployment connects the Zerobyte container to persistent storage and a local web port.

The documented installation sequence contains five stages: create the Compose configuration, set the environment variables, configure volume mounts, start the container, and access the web interface. Complete this local installation before creating a public tunnel. That boundary makes it easier to determine whether an error belongs to Zerobyte, Docker, host storage, local networking, or Localtonet.

1

Create compose.yaml

Create a deployment directory and place a file named compose.yaml in it. Choose the standard configuration for remote mounts or the simplified configuration for local bind-mounted directories.

2

Configure the environment variables

Set BASE_URL, generate a unique APP_SECRET, and select the correct TZ timezone. Never reuse or publish an example secret.

3

Configure persistent and source volumes

Map durable local host storage to /var/lib/zerobyte. Add explicit bind mounts for source directories, using read-only mappings when restoration to the source is unnecessary.

4

Start Zerobyte

Run docker compose up -d, check status with docker compose ps, and inspect startup output with docker compose logs -f zerobyte.

5

Open the web interface

Visit the address configured in BASE_URL. On first access, create the administrator account that will have full backup-management access.

Standard Compose configuration for remote mounts

The following example follows the documented v0.42 standard deployment while binding the host port to loopback for this tutorial. Replace the timezone and secret before starting it.

services:
  zerobyte:
    image: ghcr.io/nicotsx/zerobyte:v0.42
    container_name: zerobyte
    restart: unless-stopped
    cap_add:
      - SYS_ADMIN
    ports:
      - "127.0.0.1:4096:4096"
    devices:
      - /dev/fuse:/dev/fuse
    environment:
      - TZ=Europe/Zurich
      - BASE_URL=http://localhost:4096
      - APP_SECRET=REPLACE_WITH_YOUR_GENERATED_SECRET
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/lib/zerobyte:/var/lib/zerobyte

Generate the required secret with:

openssl rand -hex 32

Copy the output into APP_SECRET. Zerobyte requires a random value of at least 32 characters and uses it to encrypt sensitive data in its database. Do not paste it into tickets, screenshots, public repositories, or published shell transcripts.

Why this guide binds port 4096 to 127.0.0.1

Zerobyte discourages direct internet exposure and recommends a loopback mapping when using a secure tunnel. The mapping 127.0.0.1:4096:4096 works when the Localtonet client runs on the same host. If our client runs on another device, that device cannot reach the Zerobyte server's loopback interface. You would need a protected network-reachable target instead.

Simplified Compose configuration for local directories

If every source is a local directory mounted into the container, remove SYS_ADMIN and /dev/fuse. This example maps one host directory to /mydata as read-only:

services:
  zerobyte:
    image: ghcr.io/nicotsx/zerobyte:v0.42
    container_name: zerobyte
    restart: unless-stopped
    ports:
      - "127.0.0.1:4096:4096"
    environment:
      - TZ=Europe/Zurich
      - BASE_URL=http://localhost:4096
      - APP_SECRET=REPLACE_WITH_YOUR_GENERATED_SECRET
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/lib/zerobyte:/var/lib/zerobyte
      - /path/to/your/directory:/mydata:ro

Replace /path/to/your/directory with a real host path. Inside Zerobyte, the source is available as /mydata, not under its original host path. Add other explicit mappings as needed, but do not map the entire host filesystem merely for convenience.

A read-only source reduces write access when Zerobyte only needs to create backups. It also prevents restoration to that source location. Use a separate writable restore destination for routine recovery testing.

Understand the important environment variables

The current Zerobyte documentation should remain your final reference for version-specific configuration. The following options are established by the supplied installation and configuration evidence:

Variable Purpose Default or requirement
BASE_URL Defines the access origin and affects cookie security and CORS behavior Required, no default
APP_SECRET Encrypts sensitive information stored in the database Required random value of at least 32 characters
APP_SECRET_FILE Reads the application secret from a file No default and mutually exclusive with APP_SECRET
TZ Controls timezone-sensitive scheduling UTC
PORT Controls the internal web interface and API port 4096
RESTIC_HOSTNAME Sets the hostname Restic records in snapshots zerobyte
GOMAXPROCS Limits Go scheduler threads used by newly started Restic processes Restic default
TRUST_PROXY Controls whether an existing X-Forwarded-For header is trusted false
TRUSTED_ORIGINS Adds comma-separated trusted CORS origins None
WEBHOOK_TIMEOUT Sets the backup webhook timeout in seconds 60
LOG_LEVEL Selects debug, info, warn, or error logging info
SERVER_IDLE_TIMEOUT Sets the server idle timeout in seconds 60
RCLONE_CONFIG_DIR Sets the location of rclone.conf inside the container /root/.config/rclone
PROVISIONING_PATH Points to operator-managed repository and volume configuration None

Use an HTTP or IP-based BASE_URL for the initial local check. Zerobyte disables secure cookies for HTTP or IP-address access so local setup can work. An HTTPS domain enables secure cookies. When the final Localtonet public HTTPS address is known, update BASE_URL to that exact origin and recreate the container.

Do not enable TRUST_PROXY automatically merely because a tunnel exists. Its documented purpose is to trust an existing X-Forwarded-For header from a reverse proxy. Leave the default in place unless you have verified the full request path and have a specific reason to trust that header.

Start the service

docker compose up -d
docker compose ps

If the container does not remain running, inspect its logs:

docker compose logs -f zerobyte

Stop following the output after collecting the information you need. Before sharing logs, check them for private paths, repository addresses, account information, hostnames, or credentials.

Complete first-run setup and create a backup workflow

Open http://localhost:4096 on the Docker host when using the loopback mapping. Zerobyte prompts you to create an administrator account on first access. This account has full backup-management access, so use unique credentials and store them safely. There is no universal default username or password in this workflow.

Zerobyte organizes the initial backup lifecycle around four practical stages: connect a source volume, create a repository, define a backup job, and monitor or restore snapshots. Storage-specific form fields vary, so enter values issued by your own storage systems rather than copying generic credentials.

1. Connect a source volume

For a local bind mount, use the container-side path from compose.yaml, such as /mydata or /photos. A path that exists only on the host is not visible inside the container unless it is explicitly mounted.

For NFS, SMB, WebDAV, or SFTP mounting inside Zerobyte, use the standard deployment with SYS_ADMIN and /dev/fuse. Remote mounts can expose translated ownership, permissions, and ACL metadata. If metadata fidelity matters, test representative files, ownership, permissions, symlinks, and ACLs through an actual restore.

2. Create a backup repository

The repository stores encrypted Restic snapshots. Zerobyte supports local repositories and remote destinations including S3-compatible storage, Google Cloud Storage, Azure Blob Storage, REST servers, SFTP, and rclone-backed providers. Select a destination that matches your failure model. A repository on the same disk as the source cannot protect against failure or loss of that disk.

Preserve the credentials, recovery keys, and other information required to access snapshots independently of the live container. A repository that exists but cannot be authenticated to or decrypted is not recoverable.

3. Define the backup job

Connect the chosen volume and repository, then select a schedule appropriate for how quickly the source changes and how much data loss you can tolerate. Zerobyte supports cron-based scheduling, include and exclude rules, manual runs, compression choices, and retention policies.

Confirm that TZ represents the intended timezone. A syntactically correct job can run at the wrong local time when the container timezone is wrong. Retention should reflect both recovery requirements and available capacity. Observe actual repository growth before aggressively removing older recovery points.

4. Run, inspect, and restore

Trigger an initial backup and monitor its status. After completion, inspect the snapshot and verify that expected paths are present. Restore representative files and directories to a separate destination, open the restored content, and compare it with the source.

This test exercises repository access, decryption, snapshot traversal, write permissions, and the recovery procedure. It provides stronger evidence than a successful status indicator alone.

Remote access is not backup validation

Signing in remotely proves only that the administrative web path works. It does not prove that jobs run successfully, snapshots contain the intended files, repositories are healthy, retention behaves correctly, or restored data is usable. Schedule recurring restore tests and preserve all credentials and keys needed during a server-loss scenario.

Verify Zerobyte locally before exposing it

Local verification creates a clean troubleshooting boundary. A tunnel cannot repair a stopped container, invalid environment variable, inaccessible mount, repository error, or host permission problem.

Check container state and logs:

docker compose ps
docker compose logs -f zerobyte

Look for missing variables, invalid filesystem paths, permission failures, mount errors, or repeated restarts. Correct the underlying setting in compose.yaml, recreate the container when required, and check again.

With the loopback binding, open:

http://localhost:4096

The browser must run on the Docker host because localhost always refers to the machine making the request. A successful check displays the Zerobyte interface. Complete administrator setup, sign in, and confirm that configured source paths are visible from the container's perspective.

If you deliberately used the upstream-style 4096:4096 mapping rather than loopback, the local network address takes this form:

http://<your-server-ip>:4096

Use that form only on an appropriately protected network where the server is reachable. Do not create an internet-facing router port forward for this tutorial.

Local readiness checklist

  • Docker and Docker Compose return valid version information.
  • The Zerobyte container remains running.
  • Logs contain no unresolved startup, mount, or storage errors.
  • The interface loads at the address configured in BASE_URL.
  • The administrator account has unique credentials.
  • /var/lib/zerobyte maps to durable local host storage.
  • Expected source paths are visible inside the container.
  • An initial job creates a snapshot in the intended repository.
  • The snapshot contains the expected files.
  • A test restore succeeds to a safe destination.

Access Zerobyte remotely with a Localtonet HTTP tunnel

Remote HTTP traffic passes through Localtonet to the local Zerobyte web service.
The Localtonet client carries requests from the public HTTP endpoint to Zerobyte on the private host.

Once local access works, an HTTP tunnel can publish the web interface through Localtonet. Our client runs on the Zerobyte host or another device that can reach it. The client establishes an outbound connection to a selected relay server, and the running tunnel provides a public HTTPS address.

Review the current Localtonet HTTP tunnel documentation before configuration. Available relay servers, regions, process types, and account-specific choices must come from the current dashboard. Do not copy a server code, hostname, or region from another deployment.

An HTTP tunnel targets only the local IP address and port you configure. If the client and Zerobyte run on the same host, use 127.0.0.1 and port 4096. If they run on different devices, use an address reachable from the Localtonet client and protect that private network path appropriately.

Application authentication and tunnel-layer access control are different

Zerobyte credentials protect the application after a request reaches Zerobyte. They are application-layer controls. A publicly reachable Localtonet URL still creates an internet exposure boundary. Zerobyte's upstream guidance recommends a secure tunnel with authentication for remote exposure, but the supplied Localtonet evidence does not establish a tunnel-layer authentication feature for this HTTP workflow. Therefore, do not assume that an ordinary public URL by itself satisfies the upstream recommendation. Verify and use only access restrictions currently documented for your Localtonet configuration. If suitable tunnel-layer protection is not documented or available for your deployment, assess whether application authentication alone meets your risk requirements before publishing the service.

Create and start the HTTP tunnel

The current verified workflow preserves an important lifecycle distinction: creating a tunnel does not start it. Follow the dashboard and documentation in this order:

1

Install and run the Localtonet client

Install our client on the Zerobyte host or on a device that can reach the Zerobyte HTTP endpoint. The client must remain connected whenever remote access is required.

2

Authenticate or select the client device

Use the device-specific authentication token issued for that client. Treat it as a secret, never publish it, and do not substitute a guessed value.

3

Select an available relay server

Choose from the server or region values currently offered in your dashboard. Availability may vary by account, plan, region, or product version.

4

Create the HTTP tunnel configuration

Enter the local IP address and port reachable from the client. For a same-host loopback deployment, use 127.0.0.1 and 4096. Select the appropriate process type from the choices currently available in the dashboard.

5

Start the tunnel

Creating the tunnel only saves its configuration. Use the Start button and wait for it to run before attempting to use the assigned public address.

6

Use and verify the assigned address

Note the assigned public URL, update Zerobyte's BASE_URL as described below, recreate the container, and test sign-in and navigation from a separate browser session.

HTTP tunnels may use Random Sub Domain, Custom Sub Domain, or Custom Domain process types, with each serving the same target content through a public HTTPS address. Exact custom-domain DNS instructions can change and should be taken from current Localtonet documentation rather than inferred from this tutorial.

Update Zerobyte's public base URL

Replace the initial local BASE_URL with the exact assigned HTTPS origin. Do not copy this placeholder literally:

environment:
  - TZ=Europe/Zurich
  - BASE_URL=https://YOUR_ASSIGNED_PUBLIC_HOST
  - APP_SECRET=REPLACE_WITH_YOUR_EXISTING_GENERATED_SECRET

Keep your existing application secret. Changing the public origin does not require rotating APP_SECRET. Recreate the service:

docker compose down
docker compose up -d
docker compose ps

Test the assigned address only after the container is running again. If the page loads but authentication loops, browser requests fail CORS checks, or navigation returns to the wrong address, compare BASE_URL with the exact public scheme and hostname.

A public URL is not a secret or an authorization mechanism

Anyone who knows or discovers the address can reach the exposed service unless an applicable access control blocks the request. Use strong Zerobyte credentials, assign application roles according to least privilege, monitor access, review updates, and stop the tunnel when remote administration is unnecessary. Confirm any current Localtonet access restrictions in official documentation before relying on them.

Tunnel lifecycle matters

The endpoint works only while the selected Localtonet client is connected and the HTTP tunnel is running. A created but stopped tunnel is not active. You can stop the tunnel to remove remote reachability without stopping Zerobyte's local backup service, or delete the tunnel when it is no longer required.

Routine operation, security, and recovery

Use least privilege for storage

Mount only the directories Zerobyte needs. Use :ro when a source should not be modified, then restore to a separate writable destination. If remote mount support is unnecessary, use the simplified deployment rather than retaining SYS_ADMIN and /dev/fuse.

Protect compose.yaml because it may contain APP_SECRET and sensitive deployment paths. Zerobyte supports APP_SECRET_FILE as an alternative, and it is mutually exclusive with APP_SECRET. Secret-file mounting and permissions depend on your container environment, so verify them before switching.

Limit and review remote reachability

Keep the Docker mapping on loopback when the Localtonet client runs on the same host. Start the tunnel only for the periods when remote administration is needed if continuous exposure is unnecessary. Stopping the tunnel does not stop scheduled local backups, provided the Zerobyte container and its storage remain available.

Treat the public URL, application login, and any tunnel-layer restriction as separate controls. The URL provides reachability. Zerobyte credentials provide application authentication. Any additional Localtonet access restriction must be verified against current documentation and configured deliberately. Do not infer such a restriction from HTTPS alone.

Monitor application and backup outcomes

Use docker compose ps for container state and docker compose logs -f zerobyte during investigation. Inside Zerobyte, review run status, next-run timing, snapshot history, repository health, and notification outcomes. Test notification delivery rather than assuming that a saved configuration works.

A useful operating routine includes investigating failures, reviewing unexpectedly short or long jobs, checking repository growth, confirming retention results, resolving stale locks carefully, and restoring representative data on a recurring schedule.

Control backup CPU use

If Restic processes create excessive CPU pressure, Zerobyte supports GOMAXPROCS:

environment:
  - GOMAXPROCS=2

Restart the container after changing it. The value applies to Restic processes started after the restart and does not alter operations already running. Select a positive integer based on your host rather than assuming that 2 is ideal everywhere.

Repository compression also affects CPU use. Zerobyte supports off, auto, and max compression behavior through Restic. Turning compression off can reduce CPU consumption, auto provides the usual balance, and max may save more storage at the cost of additional CPU work. Measure with your own data and hardware.

Plan upgrades and server-loss recovery

Preserve the application data directory, but do not confuse it with the backup repository. Record repository locations, authentication requirements, recovery keys, and the procedure an operator would follow if the Zerobyte server disappeared.

Before changing a 0.x image tag, review the project's current releases, identify migration or configuration changes, confirm that persistent storage is healthy, and record the currently deployed tag. The v0.42 configuration in this guide is tied to the supplied evidence. Validate a newer version against its own documentation before adopting it.

Troubleshooting Zerobyte and Localtonet access

A troubleshooting flow checks Zerobyte locally before testing the tunnel and public endpoint.
Testing local access first separates Zerobyte problems from tunnel and public-origin problems.

Zerobyte maintains a dedicated troubleshooting guide. Use it for current project-specific behavior while following the layered checks below.

The container exits or repeatedly restarts

Run docker compose ps and docker compose logs -f zerobyte. Confirm that BASE_URL and either APP_SECRET or APP_SECRET_FILE are configured correctly. Check YAML indentation, the application-data path, host permissions, and configured devices.

If using the standard deployment, confirm that /dev/fuse exists and can be passed to the container. If internal remote mounts are unnecessary, switch to the simplified configuration rather than forcing unsupported capabilities onto the host.

The browser cannot open localhost:4096

Confirm that the browser runs on the Docker host. Typing localhost on another computer points to that other computer. Then verify that the container is running and that Compose maps 127.0.0.1:4096 to container port 4096.

If you changed the internal PORT, update the Docker mapping and Localtonet target consistently.

A local source directory is missing

Check the bind mount in compose.yaml. For /path/to/photos:/photos:ro, Zerobyte must use /photos. It cannot access the original host path unless that path is deliberately mounted into the container.

After changing mounts, recreate the container:

docker compose down
docker compose up -d

A backup receives permission errors

Check host ownership, permissions, ACLs, and the bind mount's access mode. A read-only source supports backup reads but cannot receive an in-place restore. Network filesystems may present translated metadata, so reproduce the issue from the container's view and test representative files.

The Localtonet public URL does not load

First verify Zerobyte locally. Then confirm that the Localtonet client is connected, the correct device token is selected, and the tunnel has been started rather than merely created. Confirm that the configured target is reachable from the device running our client.

For a same-host deployment, target 127.0.0.1:4096. If the client runs elsewhere, its own 127.0.0.1 cannot reach Zerobyte. Use a protected address reachable from that client and ensure Docker listens on the required interface.

The public page loads but sign-in or browser requests fail

Compare BASE_URL with the exact public HTTPS origin. Recreate the container after changing it. Do not add speculative TRUSTED_ORIGINS values or enable TRUST_PROXY without identifying the specific CORS or forwarded-header problem being solved.

Schedules run at the wrong time

Check TZ. Zerobyte identifies timezone configuration as important for accurate scheduling. Set a valid timezone or use UTC, restart the container, and review the next scheduled run.

Backups use too much CPU

Consider a positive GOMAXPROCS limit and restart the container. Review repository compression as well. Change one factor at a time so its effect can be measured.

The tunnel works, but the security model is unclear

Stop the tunnel while you review the deployment. Confirm which controls exist at the Zerobyte application layer and which, if any, are documented at the tunnel layer. The supplied evidence confirms Zerobyte authentication and a public Localtonet endpoint, but it does not establish tunnel-layer authentication for this workflow. Do not continue under the assumption that an obscure URL is private.

Frequently asked questions

What is Zerobyte?

Zerobyte is a self-hosted backup automation service built on Restic. It provides a web control plane for sources, repositories, schedules, retention, monitoring, restores, and repository maintenance.

Which port does Zerobyte use?

The web interface and API listen on port 4096 by default. If you change the internal PORT, update the Docker mapping and Localtonet target consistently.

Is v0.42 the latest Zerobyte version?

This guide uses v0.42 because that image is supported by the supplied installation evidence. It does not claim that v0.42 will remain the latest version. Check current releases and migration guidance before deploying or upgrading.

Does Zerobyte require SYS_ADMIN?

The standard installation uses SYS_ADMIN and /dev/fuse for mounting remote NFS, SMB, WebDAV, or SFTP filesystems inside Zerobyte. A simplified deployment for local bind-mounted directories removes both.

Can I store /var/lib/zerobyte on a NAS share?

No. Zerobyte warns against placing its application-data directory on network storage because of permission problems and severe performance degradation. Use durable local storage. A remote backup repository is separate from this application state.

Why bind Docker to 127.0.0.1?

The mapping 127.0.0.1:4096:4096 keeps the Docker-published port on host loopback and is appropriate when the Localtonet client runs on the same machine. A client on another device cannot reach that loopback endpoint.

Does Localtonet require router port forwarding?

No. Our client establishes an outbound connection to a Localtonet relay server. A running HTTP tunnel can provide a public address without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.

Does a Localtonet URL satisfy Zerobyte's recommendation for a tunnel with authentication?

Not by itself. Zerobyte credentials provide application-layer authentication after requests reach the service. The supplied Localtonet evidence does not establish tunnel-layer authentication for this HTTP workflow. Verify and configure only currently documented access restrictions, and do not treat an unshared public URL as private or authenticated.

Should BASE_URL use the Localtonet public address?

Yes, when that HTTPS address is the intended public origin. Set BASE_URL to the exact origin, keep the existing APP_SECRET, and recreate the container. Zerobyte uses the base URL for cookie security and CORS behavior.

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

No. The endpoint is available only while the selected client is connected and the tunnel is running. Zerobyte can continue scheduled local operation while the tunnel is stopped, provided its container and storage remain available.

How do I know the deployment is ready?

Confirm that the container remains running, the local interface loads, application storage is persistent, a source is readable, a backup completes, the snapshot contains expected data, and a test restore succeeds. Add remote access only after those checks pass.

Connect your verified Zerobyte deployment with Localtonet

Finish the local Docker Compose installation first, verify a backup and test restore, then review the current HTTP tunnel documentation and your required access controls. When the security model is appropriate, create and start a tunnel to port 4096 without configuring an inbound router port forward or requiring a public IP address.

Get Started Free โ†’

Corrections & updates

Substantive changes approved by the Localtonet editorial team are listed transparently below.

Remove the outer article wrapper; move the hero to the beginning of Model.Body and place the existing architecture figure after the guide navigation or within the architecture section; retain the valid clickable guide card and section IDs; add contextual links to Zerobyte installation, configuration, troubleshooting, release, and Localtonet HTTP tunnel documentation; clarify that Zerobyte credentials are application-layer protection and that a publicly reachable tunnel remains an exposure boundary; disclose that the supplied Localtone

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