
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.
๐ What's in this guide
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.
/var/lib/zerobyte, which must use durable local host storage.
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.
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

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.
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.
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.
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.
Start Zerobyte
Run docker compose up -d, check container status with docker compose ps, and inspect startup output with docker compose logs -f zerobyte.
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.
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.
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

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

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 โ