30 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.

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.
Self-Hosting ยท Zerobyte ยท Localtonet ยท 2026

Build a private Restic-powered backup control plane, verify it locally, then publish only the web endpoint you need

Zerobyte provides a web interface for scheduling, monitoring, restoring, and maintaining Restic backups. In this guide, we install it with Docker Compose, configure persistent local storage, create the initial administrator account, and validate the service on port 4096. We also explain the difference between the standard deployment for remote filesystem mounts and a reduced-privilege deployment for local directories. After the local installation works, we connect its HTTP interface to Localtonet without requiring inbound router port forwarding, firewall changes, a VPN, or a public IP address.

๐Ÿ”’ Local-first installation and security guidance ๐ŸŒ HTTP web interface on port 4096 โšก Docker Compose deployment and remote access

What Zerobyte does and how this deployment works

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. Instead of maintaining separate command-line scripts and cron jobs, an operator can use the interface to connect source volumes, create backup repositories, define schedules and retention policies, monitor runs, browse snapshots, restore data, and perform repository maintenance.

The project supports sources such as local directories, 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 configuration depends on your storage systems, credentials, permissions, and desired recovery design.

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

Localtonet is a separate layer in the deployment. Zerobyte continues running on your own server and remains responsible for backup management and application authentication. Our client establishes an outbound connection from a device that can reach Zerobyte to a Localtonet relay server. An HTTP tunnel then connects a public HTTPS address to the local Zerobyte HTTP endpoint. The tunnel 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, and manual runs.
๐Ÿ” Monitoring and restores Operators can review run status and snapshot history, monitor repository health, and restore files or directories.
๐Ÿ’พ Persistent application data Zerobyte stores its database, configuration, and encryption-related data under /var/lib/zerobyte, which must use durable local host storage.
๐ŸŒ Local HTTP service The web interface and API listen on port 4096 by default and can be checked locally before any remote-access layer is introduced.
๐Ÿ”— Outbound tunnel connectivity With Localtonet, the client initiates the relay connection, so the workflow does not require an inbound router port forward or public IP address.
Zerobyte is still a 0.x project

The project warns that major changes can occur between versions while core features remain under active development. Review release notes and current project documentation before changing versions, preserve the application data directory, and test backup and restore behavior before depending on an upgraded deployment.

Separate the control plane from the backup data

The Zerobyte application directory is not the same thing as a backup repository or a source directory. The application directory contains the state required to operate Zerobyte, including configuration, database content, and encryption-related material. Source directories are the files you want to protect. Repositories are where Restic snapshots are stored. Treat all three as distinct resources when planning permissions, capacity, persistence, and disaster recovery.

A working dashboard is also not proof that a backup is recoverable. A sound deployment includes a successful backup run, snapshot inspection, repository health checks, and a test restore to a safe destination. Remote access makes administration more convenient, but it does not replace backup validation.

Prerequisites and deployment decisions

Zerobyte requires a server with Docker and Docker Compose. Docker Compose is included with Docker Desktop, while Linux server installations may provide it as a separate Compose plugin. This guide uses the modern docker compose command form rather than the legacy standalone docker-compose form.

You also need local host storage for /var/lib/zerobyte, a timezone appropriate for the server, 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 you plan to mount NFS, SMB, WebDAV, or SFTP sources from inside Zerobyte, use the standard installation and understand why it grants additional container privileges.

Verify Docker and Docker Compose before continuing:

docker --version
docker compose version

Both commands should return version information. If either command is unavailable, install the missing component using the instructions appropriate for your operating system and Docker distribution. The Zerobyte evidence used for this guide does not establish one universal Docker installation command across all supported host platforms, so we do not recommend copying an unverified package-manager command.

Choose the standard or simplified deployment

Deployment Use it when Security and 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 NFS, SMB, WebDAV, or SFTP shares from inside Zerobyte
Read-only source mount Zerobyte should read source files without modifying them Adds :ro to the relevant bind mount Zerobyte cannot restore files directly to that read-only source location
Read-write source mount Restores to the original mapped location are required Allows container writes within the permissions granted by the host A broader write path requires careful host 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 be able to expose that mounted path to the container as a local bind mount. You still need to evaluate ownership, permissions, ACL behavior, and whether the mounted view preserves the metadata you expect to recover.

Do not place Zerobyte's application data on a network share

The host path mapped to /var/lib/zerobyte must use local storage. Zerobyte explicitly warns that pointing this application directory at a network share causes permission problems and severe performance degradation. A remote backup repository is a different resource and does not change this requirement for the application's own state.

Special persistence requirement for TrueNAS

On TrueNAS, the host /var/lib path is ephemeral 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

This mapping preserves Zerobyte's configuration, database, and keys across TrueNAS upgrades. Confirm that the dataset exists and that Docker can access it 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 official installation sequence has five stages: create the Compose configuration, set the environment variables, configure volume mounts, start the container, and access the web interface. Complete the local installation before creating a public tunnel. This separation makes it much easier to determine whether an error belongs to Zerobyte, Docker, host networking, or the remote-access layer.

1

Create compose.yaml

Create a deployment directory and place a file named compose.yaml in it. Use the standard configuration if Zerobyte needs to mount remote filesystems internally, or the simplified configuration if it only needs local bind-mounted directories.

2

Configure the required environment variables

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

3

Configure persistent and source volume mounts

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

4

Start Zerobyte

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

5

Open the web interface

Visit the URL configured in BASE_URL. On first access, create the administrator account that will have full access to Zerobyte's backup management features.

Standard Compose configuration for remote mounts

The following configuration follows the documented standard deployment. Replace the timezone and secret before starting it. The example initially binds the application to the host loopback interface because the intended workflow is local access followed by an outbound Localtonet tunnel running on the same machine.

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 command's output into APP_SECRET. Keep it confidential. Zerobyte uses this random value to encrypt sensitive data in its database, and the required value must be at least 32 characters. Do not paste it into tickets, screenshots, shell transcripts intended for publication, or a public source repository.

Why this guide binds port 4096 to 127.0.0.1

The upstream example uses 4096:4096, which publishes the port on host interfaces according to Docker's networking behavior. Zerobyte discourages exposing the service directly to the internet and recommends 127.0.0.1:4096:4096 when using a secure tunnel. This loopback mapping works when the Localtonet client runs on the same host. If our client runs on another device, that device cannot reach the server's loopback interface, so you must provide an appropriately protected network-reachable target instead.

Simplified Compose configuration for local directories

If your backup sources are local directories mounted into the container, remove SYS_ADMIN and /dev/fuse. The following example maps one host directory to /mydata as read-only. Replace /path/to/your/directory with a real host path.

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

Inside Zerobyte, the source is available as /mydata, not under its original host path. You can add other explicit mappings such as /photos, /documents, or /media. Do not map the entire host filesystem merely for convenience. Give the container access only to directories it needs.

A read-only source is safer when Zerobyte only needs to create backups. It also prevents restoration to the original location. For restore testing, select a separate writable destination rather than weakening source protections without a clear operational need.

Understand the important environment variables

Variable Purpose Documented default or requirement
BASE_URL Defines the address used to access Zerobyte and affects cookie security and CORS behavior Required, with 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 for secret-management workflows 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 child processes Restic default
TRUST_PROXY Controls whether an existing X-Forwarded-For value from a reverse proxy is trusted false
TRUSTED_ORIGINS Adds comma-separated trusted CORS origins None
WEBHOOK_ALLOWED_ORIGINS Allows specified HTTP origins for backup webhooks and outbound notification destinations 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 a JSON file containing operator-managed repositories and volumes synchronized at startup 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 causes secure cookies to be enabled, which is the appropriate behavior for a production address. When the final Localtonet public HTTPS URL is known, update BASE_URL to that exact public origin and restart the container.

Do not enable TRUST_PROXY automatically just because a tunnel is involved. Its documented function is specifically to trust an existing X-Forwarded-For header from a reverse proxy. Whether it is appropriate depends on your complete request path and the headers reaching Zerobyte. Leave the default in place unless you have verified that your deployment requires a change.

Start the service

From the directory containing compose.yaml, run:

docker compose up -d
docker compose ps

The first command creates and starts the container in detached mode. The second shows its current state. If the container does not remain running, inspect its logs:

docker compose logs -f zerobyte

The -f option follows new log entries. Stop following the output when you have collected the information you need. Never share logs publicly without checking them for private hostnames, filesystem paths, repository addresses, account information, or other sensitive details.

Complete first-run setup and create a backup workflow

Open http://localhost:4096 from the Docker host when using the loopback port mapping. On first access, Zerobyte prompts you to create an administrator account. This account has full access to backup management, so use unique credentials and store them safely. The supplied evidence does not establish a universal default username or password because the operator creates the account during first access.

Zerobyte organizes the backup lifecycle around four practical stages: connect a source volume, create a repository, define a backup schedule, and monitor or restore snapshots. The exact form fields vary with the selected storage protocol, so use values issued by your storage system rather than copying generic examples.

1. Connect a source volume

A volume identifies data that Zerobyte can read. For a local bind mount, use the container-side path from compose.yaml, such as /mydata or /photos. A host path that was not mapped into the container will not become available merely because it exists on the Docker server.

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 rather than exactly reproducing the source system's native view. If metadata fidelity matters to recovery, validate representative files, ownership behavior, permissions, symlinks, and ACLs through a test 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 fits your failure model. Keeping the repository on the same disk as the source may help with accidental deletion, but it does not protect against failure or loss of that disk.

Repository credentials and recovery information are critical. Preserve any keys or recovery material required to access snapshots independently of the live Zerobyte container. A backup set that exists but cannot be decrypted is not recoverable.

3. Define the backup job

Create a job that connects the chosen volume and repository. Define a schedule appropriate for how quickly your 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 before relying on a schedule. A syntactically correct job can still run at the wrong local time if the container timezone is wrong. Retention rules should reflect both recovery needs and repository capacity. Avoid deleting older recovery points aggressively until you have observed actual change rates and repository growth.

4. Run, monitor, and restore

Trigger an initial backup and watch its status. After it completes, inspect the snapshot history and confirm that expected paths are present. Then perform a restore to a separate test directory. Open several restored files and compare them with their sources. This checks much more than a green job status: it exercises repository access, decryption, snapshot traversal, write permissions, and the practical recovery procedure.

Remote access is not backup validation

Being able to sign in to Zerobyte from outside your network proves only that the administrative web path works. It does not prove that jobs are running, repositories are healthy, retention behaves as intended, or restored data is usable. Schedule recurring restore tests and preserve the credentials and keys required during a server-loss scenario.

Verify Zerobyte locally before exposing it

Local verification creates a clean troubleshooting boundary. If Zerobyte does not work at the local URL, adding a tunnel cannot repair the container, application configuration, storage permissions, or repository credentials.

Begin with container status:

docker compose ps

Confirm that the zerobyte container remains running. Then inspect its logs:

docker compose logs -f zerobyte

Look for configuration errors involving missing required environment variables, invalid filesystem paths, permission failures, or an inability to use a configured mount. Correct the underlying setting in compose.yaml, recreate the container, and check again.

With the recommended loopback binding, open:

http://localhost:4096

A successful check should display the Zerobyte web interface. Complete the administrator setup if this is the first visit, sign in, and navigate through the interface. If you configured a local source, verify that the container-side path can be selected and that its expected content is visible to the application.

If you intentionally used 4096:4096 rather than a loopback binding, the documented network URL is:

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

Use that form only from a network where the server address is reachable and where access to the port is appropriately restricted. Do not create an internet-facing router port forward for this workflow.

Local readiness checklist

  • Docker and Docker Compose report valid versions.
  • The Zerobyte container remains running.
  • The logs do not show unresolved startup or storage errors.
  • The interface loads at the address configured in BASE_URL.
  • The initial administrator account has been created securely.
  • Persistent application storage maps to a durable local host path.
  • Expected source paths are visible inside the container.
  • An initial job can produce a snapshot in the selected repository.
  • 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 agent carries public HTTP requests 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.

This does not turn Zerobyte into a VPN service and does not expose unrelated devices automatically. The HTTP tunnel targets the specific local IP address and port you configure. If the client and Zerobyte share a host, the narrowest target is normally 127.0.0.1 on port 4096. If they run on different devices, use an address reachable from the Localtonet client and protect that network path appropriately.

The currently available relay server values, process types, and account-specific options must be taken from the current Localtonet dashboard. We do not hardcode a region, server code, or generated hostname because those values can vary.

1

Install and run the Localtonet client

Install our client on the Zerobyte server or on a device that can reach the Zerobyte HTTP endpoint. Keep the client running whenever remote access is required.

2

Authenticate the client device

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

3

Select an available relay server

Choose from the relay servers or regions currently available in your dashboard. Availability can vary, so use the displayed value rather than copying a server code from another deployment.

4

Create an HTTP tunnel to Zerobyte

Configure the tunnel's local target as the IP address and port reachable from the Localtonet client. For a client on the same host as the loopback-bound deployment, use 127.0.0.1 and 4096. Select the desired HTTP process type from the options available to your account.

5

Start the tunnel

Creating a tunnel does not start it. Use the Start button, then wait for the tunnel to run and note the assigned public HTTPS address.

6

Open and verify the public address

Update Zerobyte's BASE_URL to the exact assigned HTTPS origin, recreate the container, and test the public address in a separate browser session. Confirm that sign-in and normal navigation work before relying on remote administration.

HTTP and File Server tunnels can use Random Sub Domain, Custom Sub Domain, or Custom Domain process types, and each serves content at a public HTTPS address. Custom-domain DNS requirements should always be checked against current Localtonet documentation before changing DNS records. For the simplest validation, use an address assigned through the current dashboard.

Update Zerobyte's public base URL

Zerobyte requires BASE_URL and uses it for cookie security and CORS. After Localtonet assigns the public HTTPS address, replace the initial local value with that exact origin. Do not copy the placeholder below literally:

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

Keep the same application secret. Changing BASE_URL does not require rotating APP_SECRET. After saving the Compose file, recreate the service:

docker compose down
docker compose up -d
docker compose ps

Test the assigned public address after the container is running. An HTTPS domain causes Zerobyte to enable secure cookies. If the login page appears but authentication loops, requests fail CORS checks, or the browser returns to the wrong address, recheck BASE_URL for an exact scheme and hostname match.

A public URL is a real exposure boundary

Anyone who knows or discovers the public address can reach the exposed web service unless an applicable access control blocks them. Use strong Zerobyte credentials, preserve least privilege for non-administrator users, keep the application current after reviewing release changes, and stop the tunnel when remote administration is not needed. Do not assume that an unshared URL is an authentication mechanism.

Tunnel lifecycle matters

The public 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 service, or delete it when it is no longer required.

Routine operation, security, and performance

Use least privilege for storage access

Mount only the source directories Zerobyte needs. Use :ro when a source should never be modified by the container, and restore to a separate writable location. 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 deployment paths. Zerobyte also supports APP_SECRET_FILE as an alternative to an inline secret, and that option is mutually exclusive with APP_SECRET. Secret-file handling depends on your container environment, so verify permissions and mounting behavior before switching.

Monitor the application and backup outcomes

Use docker compose ps for container state and docker compose logs -f zerobyte when investigating application behavior. Inside Zerobyte, review backup run status, next-run timing, snapshot history, and repository health. Notifications can be configured through supported channels, but notification delivery should be tested rather than assumed.

Treat silent operation as something to verify, not proof of success. A useful operating routine includes reviewing failures, investigating unexpectedly short or long runs, checking repository growth, confirming retention results, and periodically restoring representative data.

Control backup CPU use

If Restic backup processes create excessive CPU pressure, Zerobyte supports GOMAXPROCS. For example:

environment:
  - GOMAXPROCS=2

Restart the container after changing it. The setting applies to Restic processes started after the restart and does not change operations that are already running. Choose a positive integer appropriate for your host rather than assuming that 2 is ideal for every server.

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 can save more space at the cost of additional CPU work. Measure using your own files and hardware before selecting a policy.

Plan for maintenance and recovery

Preserve the application data directory, but do not mistake it for the backup repository. Record where repositories live, how they are authenticated, what recovery keys are needed, and how an operator would restore data if the Zerobyte server were unavailable. Zerobyte provides repository maintenance functions such as health checks, stale-lock handling, and repository statistics, but operational documentation is still necessary.

Before changing a 0.x version, read the release notes and identify configuration or data-model changes. Confirm that persistent storage is healthy, record the currently deployed image tag, and test the upgraded system before declaring maintenance complete. This article uses the evidenced v0.42 image configuration. It does not claim that this remains the newest version at the time you deploy, so confirm the desired release rather than changing the tag blindly.

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 Localtonet tunnel problems.

The container exits or repeatedly restarts

Run docker compose ps, followed by docker compose logs -f zerobyte. Check that BASE_URL and either APP_SECRET or APP_SECRET_FILE are configured correctly. Confirm that YAML indentation is valid, the application data host path exists, and Docker has permission to use the configured paths and devices.

If you selected the standard deployment, verify that /dev/fuse exists and can be passed to the container. If you do not need internal remote mounts, switch to the simplified configuration rather than trying to force unsupported capabilities onto the host.

The browser cannot open localhost:4096

Confirm that the browser is running on the Docker host. A loopback address always refers to the machine making the request. If you type localhost on a different computer, it points to that computer, not the Zerobyte server.

Next, confirm the container is running and that Compose maps 127.0.0.1:4096 to container port 4096. If you changed the internal PORT, the mapping and local target must be consistent with that change.

A local source directory is missing

Zerobyte can see only paths available inside its container. Check the bind mount in compose.yaml. For a mapping such as /path/to/your/photos:/photos:ro, Zerobyte must use /photos. It cannot use the original host path unless that same path was deliberately mapped into the container.

After adding or changing mounts, recreate the container:

docker compose down
docker compose up -d

A backup receives permission errors

Check host permissions, ownership, ACL behavior, and the access mode of the bind mount. A read-only source is suitable for backup reads but cannot accept an in-place restore. Network-mounted filesystems can present translated metadata, so reproduce the problem with a representative file and verify access from the container's view rather than relying only on host-side permissions.

The Localtonet public URL does not load

First confirm that Zerobyte still works locally. Then verify that the Localtonet client is connected, the correct device token was selected, and the tunnel was started rather than only created. Confirm that the local target is reachable from the device running our client.

If both services run on the same host, target 127.0.0.1:4096. If the client runs on another device, 127.0.0.1 points to that other device and cannot reach Zerobyte. Use an appropriately protected address reachable from the client and make sure Docker is listening on the required host interface.

The public page loads but login or browser requests fail

Compare Zerobyte's BASE_URL with the exact public HTTPS origin assigned to the tunnel. Scheme, hostname, and any relevant port must match the way users access the service. Recreate the container after changing the environment variable. Do not add speculative values to TRUSTED_ORIGINS or enable TRUST_PROXY without identifying the specific browser or forwarded-header problem they are intended to solve.

Schedules run at the wrong time

Check the container's TZ value. Zerobyte identifies timezone configuration as crucial for accurate scheduling. Set a valid timezone appropriate for your location or use UTC, then restart the container. Review the next scheduled run in the interface after making the change.

Backups consume too much CPU

Consider a positive GOMAXPROCS limit and restart the container so it applies to newly started Restic processes. Review repository compression as well. Use off to reduce compression work, auto for the normal balance, or max when storage reduction is worth more CPU usage. Avoid changing several variables at once because doing so makes the result harder to interpret.

Frequently asked questions

What is Zerobyte?

Zerobyte is a self-hosted backup automation service built on Restic. It provides a web interface for connecting sources and repositories, scheduling jobs, applying retention policies, monitoring runs, browsing snapshots, restoring data, and maintaining repositories.

Which port does Zerobyte use?

The web interface and API listen on port 4096 by default. The internal port can be changed with the PORT environment variable, but Docker's port mapping and the Localtonet target must then be updated consistently.

Does Zerobyte require SYS_ADMIN?

Only the standard installation for mounting remote NFS, SMB, WebDAV, or SFTP filesystems inside Zerobyte requires SYS_ADMIN and /dev/fuse. A simplified deployment for local bind-mounted directories removes both and has a reduced privilege profile.

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

No. Zerobyte warns against mapping its application data directory to network storage because doing so causes permission problems and severe performance degradation. Map /var/lib/zerobyte to durable local storage. Backup repositories can be remote, but they are separate from the application's state directory.

Why should I bind Docker to 127.0.0.1?

Binding 127.0.0.1:4096:4096 keeps the Docker-published port on the host loopback interface. It is appropriate when the Localtonet client runs on the same machine. It also avoids making the port directly reachable through external host interfaces. A client on another device cannot use that loopback target.

Does Localtonet require router port forwarding?

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

Should BASE_URL use the Localtonet public address?

Yes, after the public address is assigned and you intend to use it as Zerobyte's primary access origin. Set BASE_URL to the exact HTTPS origin, preserve the existing APP_SECRET, and recreate the container. Zerobyte uses the base URL for cookie security and CORS behavior.

Is a Localtonet tunnel a replacement for Zerobyte authentication?

No. The tunnel provides network reachability to the web endpoint. Zerobyte remains responsible for its application accounts and authorization. Use strong credentials, apply least privilege, and stop the tunnel when remote administration is unnecessary.

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

No. The tunnel is available only while the selected client device is connected and the tunnel is running. Zerobyte can continue operating locally, including scheduled backups, even when the remote tunnel is stopped, provided the container and required storage remain available.

How do I know that my Zerobyte deployment is actually ready?

Confirm that the container remains running, the local interface loads, persistent storage is correctly mapped, a source is readable, an initial backup completes, the expected snapshot contents are present, and a test restore succeeds. Only then add and test remote access.

Access your working Zerobyte dashboard with Localtonet

Finish the local Docker Compose deployment first, verify a backup and test restore, then create an HTTP tunnel to port 4096. With Localtonet, you can reach the Zerobyte interface through a public HTTPS address without configuring an inbound router port forward or requiring a public IP.

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