fix: anchor links

This commit is contained in:
Nicolas Meienberger 2026-04-15 21:06:24 +02:00
parent 48c2b5570b
commit dd5c0cd29a
No known key found for this signature in database
15 changed files with 204 additions and 152 deletions

View file

@ -20,7 +20,7 @@
[![Discord](https://img.shields.io/discord/1466834119873925263?label=discord&logo=discord)](https://discord.gg/XjgVyXrcEH)
> [!WARNING]
> Zerobyte is still in version 0.x.x and is subject to major changes from version to version. I am developing the core features and collecting feedbacks. Expect bugs! Please open issues or feature requests
> Zerobyte is still in version 0.x.x and is subject to major changes from version to version. I am developing the core features and collecting feedbacks. Please open issues for bugs or feature requests
<p align="center">
<a href="https://www.buymeacoffee.com/nicotsx" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
@ -30,6 +30,12 @@
Zerobyte is a backup automation tool that helps you save your data across multiple storage backends. Built on top of Restic, it provides an modern web interface to schedule, manage, and monitor encrypted backups of your remote storage.
## Documentation
The official documentation website is available at [zerobyte.app](https://zerobyte.app).
It contains up-to-date setup guides, configuration reference, and usage documentation for running Zerobyte in production.
### Features
- &nbsp; **Automated backups** with encryption, compression and retention policies powered by Restic

View file

@ -9,10 +9,10 @@ Learn how backup jobs connect volumes to repositories with scheduling, retention
A backup job is the central piece of Zerobyte. It defines four things:
- **What** to back up a [volume](/docs/concepts/volumes) (your data source)
- **Where** to store it a [repository](/docs/concepts/repositories) (your encrypted storage destination)
- **When** to run a cron schedule
- **How long** to keep snapshots a retention policy
- **What** to back up, a [volume](/docs/concepts/volumes) (your data source)
- **Where** to store it, a [repository](/docs/concepts/repositories) (your encrypted storage destination)
- **When** to run, a cron schedule
- **How long** to keep snapshots, a retention policy
Each time a backup job runs, Restic creates an incremental, encrypted snapshot of the volume's contents and stores it in the repository.
@ -20,10 +20,10 @@ Each time a backup job runs, Restic creates an incremental, encrypted snapshot o
To create a backup job, navigate to **Backups** in the sidebar and click **Create a backup job**. First choose a volume, then fill in the backup form:
- **Backup name** — A descriptive name for the job (e.g., "Daily Database Backup")
- **Backup repository** — Select from your configured repositories
- **Backup frequency** — Choose `Manual only`, `Hourly`, `Daily`, `Weekly`, `Specific days`, or `Custom (Cron)`
- **Retention policy** — Optionally define how many snapshots to keep
- **Backup name**, a descriptive name for the job (e.g., "Daily Database Backup")
- **Backup repository**, select from your configured repositories
- **Backup frequency**, choose `Manual only`, `Hourly`, `Daily`, `Weekly`, `Specific days`, or `Custom (Cron)`
- **Retention policy**, optionally define how many snapshots to keep
<Callout type="info">
Choose **Manual only** if you want to create the job without scheduled runs and trigger it yourself.
@ -65,10 +65,10 @@ You can configure the following retention rules:
A balanced policy for most workloads:
- **Keep Daily**: 7 — One snapshot per day for the past week
- **Keep Weekly**: 4 — One snapshot per week for the past month
- **Keep Monthly**: 6 — One snapshot per month for the past half year
- **Keep Yearly**: 1 — One snapshot per year for long-term archival
- **Keep Daily**: 7, one snapshot per day for the past week
- **Keep Weekly**: 4, one snapshot per week for the past month
- **Keep Monthly**: 6, one snapshot per month for the past half year
- **Keep Yearly**: 1, one snapshot per year for long-term archival
<Callout type="info">
Retention rules are additive. A snapshot that satisfies any rule is kept. Restic determines which snapshots best represent each time period automatically.
@ -86,10 +86,10 @@ Specify subdirectories within the volume to back up. Only these paths will be in
Exclude files or directories that do not need to be backed up. Common patterns:
- `*.tmp` — Temporary files
- `node_modules/` — Dependency directories
- `.cache/` — Cache directories
- `*.log` — Log files
- `*.tmp`, temporary files
- `node_modules/`, dependency directories
- `.cache/`, cache directories
- `*.log`, log files
<Callout type="warn">
Exclude patterns use Restic's pattern matching. Test your patterns after the first backup by browsing the snapshot contents to confirm the right files are included.
@ -105,8 +105,8 @@ Available modes are **auto** (default), **off**, and **max**. See [Repositories]
There are two ways to run a backup job:
- **Scheduled** — The job runs automatically according to its cron schedule. No intervention required.
- **Manual** — Click **Backup now** on any backup job to trigger it immediately, regardless of the schedule.
- **Scheduled**, the job runs automatically according to its cron schedule. No intervention required.
- **Manual**, click **Backup now** on any backup job to trigger it immediately, regardless of the schedule.
Both methods produce identical snapshots. Manual runs are useful for verifying a new backup job or creating an extra snapshot before a major change.
@ -120,15 +120,15 @@ The UI exposes two related status views:
- In the **Backups** list, the status dot shows **Active**, **Paused**, **Error**, **Warning**, or **Backup in progress**
- In the backup job details page, the last run status shows **Success**, **Error**, **Warning**, or **in progress**
- If a backup job has not completed a run yet, the details page shows `—`
- If a backup job has not completed a run yet, the details page shows no last run value
## Snapshots
Each successful backup creates a snapshot in the repository. Snapshots have several important properties:
- **Immutable** — Once created, a snapshot cannot be modified
- **Incremental** — Only changed data since the last snapshot is uploaded
- **Browsable** — You can explore snapshot contents directly in the web interface, viewing file sizes, modification times, and directory structure
- **Immutable**, once created, a snapshot cannot be modified
- **Incremental**, only changed data since the last snapshot is uploaded
- **Browsable**, you can explore snapshot contents directly in the web interface, viewing file sizes, modification times, and directory structure
The first backup uploads all data and may take longer. Subsequent backups are significantly faster because Restic deduplicates data at the chunk level and only transfers new or changed blocks.
@ -186,9 +186,9 @@ Click **Restore** and wait for the operation to complete.
You can optionally copy snapshots to additional repositories after each backup. Mirrors provide:
- **Geographic redundancy** — Store copies in different regions or data centers
- **Provider diversification** — Avoid depending on a single cloud provider
- **Compliance** — Meet data locality or regulatory requirements
- **Geographic redundancy**, store copies in different regions or data centers
- **Provider diversification**, avoid depending on a single cloud provider
- **Compliance**, meet data locality or regulatory requirements
Mirrors are configured per backup job. After each successful backup, snapshots are automatically copied to all enabled mirror repositories.
@ -198,12 +198,12 @@ For a practical pattern that combines fast local restores with an offsite copy,
The Zerobyte web interface provides visibility into each backup job:
- **Schedule** — The cron expression or `Manual only` configuration for the job
- **Last backup** — When the most recent run happened
- **Next backup** — When the job is expected to run next
- **Snapshot history** — The list of snapshots created for that job
- **Snapshot statistics** — Data added, data stored, files processed, bytes processed, and duration for the selected snapshot
- **Restore actions** — Restore or download data from the selected snapshot
- **Schedule**, the cron expression or `Manual only` configuration for the job
- **Last backup**, when the most recent run happened
- **Next backup**, when the job is expected to run next
- **Snapshot history**, the list of snapshots created for that job
- **Snapshot statistics**, data added, data stored, files processed, bytes processed, and duration for the selected snapshot
- **Restore actions**, restore or download data from the selected snapshot
## Best practices

View file

@ -7,15 +7,15 @@ Repositories are encrypted storage destinations where your backup snapshots are
## What are repositories?
A repository is a Restic-powered storage location that holds your backup snapshots. When you create a backup job, you point it at a repository that is where the encrypted data goes.
A repository is a Restic-powered storage location that holds your backup snapshots. When you create a backup job, you point it at a repository, and that is where the encrypted data goes.
Repositories provide:
- **End-to-end encryption** all data is encrypted before it leaves your machine, so even your storage provider cannot read it
- **Deduplication** identical data blocks are stored only once, even across different backups
- **Compression** configurable compression reduces storage costs
- **Immutable snapshots** once a snapshot is created, it cannot be modified
- **Incremental backups** only changed data is transferred and stored after the initial backup
- **End-to-end encryption**, all data is encrypted before it leaves your machine, so even your storage provider cannot read it
- **Deduplication**, identical data blocks are stored only once, even across different backups
- **Compression**, configurable compression reduces storage costs
- **Immutable snapshots**, once a snapshot is created, it cannot be modified
- **Incremental backups**, only changed data is transferred and stored after the initial backup
Each repository is self-contained. You can store repositories on local disks, cloud object storage, remote servers, or any of 40+ backends supported through rclone.
@ -139,8 +139,8 @@ Compression is set when creating a repository and applies to all backups stored
You can configure upload and download speed limits per repository to prevent backups from saturating your network. Limits are set in the repository settings with the following units: **Kbps**, **Mbps**, or **Gbps**.
- **Upload limit** controls the speed at which data is sent to the repository during backups. Useful for avoiding bandwidth contention during business hours or staying within ISP caps.
- **Download limit** controls the speed at which data is retrieved during restores or snapshot browsing. Helps manage egress costs on cloud providers.
- **Upload limit**, controls the speed at which data is sent to the repository during backups. Useful for avoiding bandwidth contention during business hours or staying within ISP caps.
- **Download limit**, controls the speed at which data is retrieved during restores or snapshot browsing. Helps manage egress costs on cloud providers.
<Callout type="info">
Bandwidth limits are enforced at the application layer. Actual network usage may be slightly higher due to protocol overhead.
@ -172,7 +172,7 @@ The refresh button in **Compression Statistics** recalculates stored-size, compr
## Snapshots
Each backup creates an immutable snapshot in the repository. Snapshots are incremental after the initial full backup, only changed data is stored in subsequent snapshots. This means the 10th backup of a 100 GB dataset might only add a few megabytes if little has changed.
Each backup creates an immutable snapshot in the repository. Snapshots are incremental, so after the initial full backup, only changed data is stored in subsequent snapshots. This means the 10th backup of a 100 GB dataset might only add a few megabytes if little has changed.
You can browse the contents of any snapshot and restore individual files or entire directories from the Zerobyte interface.
@ -180,9 +180,9 @@ You can browse the contents of any snapshot and restore individual files or enti
You can configure backup jobs to copy snapshots to additional repositories after each successful backup. This provides:
- **Geographic redundancy** store copies in different regions or data centers
- **Provider diversification** avoid depending on a single cloud provider
- **Compliance** meet data locality or multi-copy retention requirements
- **Geographic redundancy**, store copies in different regions or data centers
- **Provider diversification**, avoid depending on a single cloud provider
- **Compliance**, meet data locality or multi-copy retention requirements
Mirrors are configured per backup job. See [Backups](/docs/concepts/backups) for details on setting up mirror repositories.
@ -192,8 +192,8 @@ All sensitive fields (passwords, access keys, private keys, service account cred
Provisioned repositories also support secret references:
- **`env://VARIABLE_NAME`** resolves the value from the specified environment variable during provisioning
- **`file://secret_name`** resolves the value from a Docker secret file at `/run/secrets/secret_name` during provisioning
- **`env://VARIABLE_NAME`**, resolves the value from the specified environment variable during provisioning
- **`file://secret_name`**, resolves the value from a Docker secret file at `/run/secrets/secret_name` during provisioning
During provisioning, Zerobyte resolves these references on startup and stores the resolved value encrypted in the database.

View file

@ -3,7 +3,7 @@ title: Volumes
description: Understand volume types, mounting, and how Zerobyte connects to your data sources
---
Volumes are the data sources you want to protect with Zerobyte. Each volume represents a filesystem -- a local directory, a network share, or a remote storage location -- that Zerobyte mounts and reads from when running backups.
Volumes are the data sources you want to protect with Zerobyte. Each volume represents a filesystem, such as a local directory, a network share, or a remote storage location, that Zerobyte mounts and reads from when running backups.
## What are volumes?
@ -29,8 +29,8 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Path** -- The path *inside the container* where the directory is mounted (e.g., `/data`)
- **Name**, a descriptive label for this volume
- **Path**, the path *inside the container* where the directory is mounted (e.g., `/data`)
<Callout type="info">
You must first mount the host directory into the Zerobyte container by adding it to the `volumes` section of your `docker-compose.yml`. For example, to back up `/home/user/photos` on the host, add `- /home/user/photos:/photos:ro` to your compose file, restart the container, then create a Directory volume in the UI with the path `/photos`.
@ -50,12 +50,12 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Server** -- Hostname or IP address of the NFS server
- **Export Path** -- The exported directory on the server (e.g., `/volume1/data`)
- **NFS Version** -- Protocol version: `3`, `4`, or `4.1`
- **Port** -- NFS port (default: `2049`)
- **Read Only** -- Mount the share in read-only mode
- **Name**, a descriptive label for this volume
- **Server**, hostname or IP address of the NFS server
- **Export Path**, the exported directory on the server (e.g., `/volume1/data`)
- **NFS Version**, protocol version: `3`, `4`, or `4.1`
- **Port**, NFS port (default: `2049`)
- **Read Only**, mount the share in read-only mode
<Callout type="warn">
NFS volumes require the `SYS_ADMIN` capability in your Docker container configuration. See the [Installation guide](/docs/installation) for details on enabling `cap_add: [SYS_ADMIN]`.
@ -75,16 +75,16 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Server** -- Hostname or IP address of the SMB server
- **Share** -- Name of the shared folder (e.g., `documents`)
- **Guest Mode** -- Enable unauthenticated access if the share allows it
- **Username** -- Account used to connect when guest mode is disabled
- **Password** -- Account password when guest mode is disabled
- **Domain** -- Windows domain (optional)
- **SMB Version** -- Protocol version: `1.0`, `2.0`, `2.1`, or `3.0`
- **Port** -- SMB port (default: `445`)
- **Read Only** -- Mount the share in read-only mode
- **Name**, a descriptive label for this volume
- **Server**, hostname or IP address of the SMB server
- **Share**, name of the shared folder (e.g., `documents`)
- **Guest Mode**, enable unauthenticated access if the share allows it
- **Username**, account used to connect when guest mode is disabled
- **Password**, account password when guest mode is disabled
- **Domain**, Windows domain (optional)
- **SMB Version**, protocol version: `1.0`, `2.0`, `2.1`, or `3.0`
- **Port**, SMB port (default: `445`)
- **Read Only**, mount the share in read-only mode
<Callout type="info">
Guest access is supported through the **Guest Mode** option.
@ -108,14 +108,14 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Server** -- Hostname or IP of the WebDAV server
- **Path** -- Path on the server (e.g., `/remote.php/dav/files/username`)
- **Username** -- WebDAV account username (optional)
- **Password** -- WebDAV account password (optional)
- **Port** -- Server port (e.g., `443` for HTTPS)
- **SSL** -- Enable HTTPS connection
- **Read Only** -- Mount in read-only mode
- **Name**, a descriptive label for this volume
- **Server**, hostname or IP of the WebDAV server
- **Path**, path on the server (e.g., `/remote.php/dav/files/username`)
- **Username**, WebDAV account username (optional)
- **Password**, WebDAV account password (optional)
- **Port**, server port (e.g., `443` for HTTPS)
- **SSL**, enable HTTPS connection
- **Read Only**, mount in read-only mode
<Callout type="warn">
WebDAV volumes require the `SYS_ADMIN` capability in your Docker container configuration. See the [Installation guide](/docs/installation) for setup details.
@ -135,16 +135,16 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Host** -- Hostname or IP of the SSH server
- **Port** -- SSH port (default: `22`)
- **Username** -- SSH account username
- **Password** -- Password authentication (optional if using a private key)
- **Private Key** -- SSH private key authentication (optional if using a password)
- **Path** -- Directory path on the remote server
- **Skip Host Key Verification** -- Disable host key checking (not recommended for production)
- **Known Hosts** -- Required unless host key verification is skipped
- **Read Only** -- Mount in read-only mode
- **Name**, a descriptive label for this volume
- **Host**, hostname or IP of the SSH server
- **Port**, SSH port (default: `22`)
- **Username**, SSH account username
- **Password**, password authentication (optional if using a private key)
- **Private Key**, SSH private key authentication (optional if using a password)
- **Path**, directory path on the remote server
- **Skip Host Key Verification**, disable host key checking (not recommended for production)
- **Known Hosts**, required unless host key verification is skipped
- **Read Only**, mount in read-only mode
<Callout type="warn">
SFTP volumes require both the `SYS_ADMIN` capability and access to `/dev/fuse` in your Docker container configuration. See the [Installation guide](/docs/installation) for setup details.
@ -164,10 +164,10 @@ Zerobyte supports six volume types. Each one is configured through the web UI wh
**Form fields:**
- **Name** -- A descriptive label for this volume
- **Remote** -- The rclone remote name as defined in your rclone configuration (e.g., `gdrive`)
- **Path** -- Path within the remote (e.g., `/documents`)
- **Read Only** -- Mount in read-only mode
- **Name**, a descriptive label for this volume
- **Remote**, the rclone remote name as defined in your rclone configuration (e.g., `gdrive`)
- **Path**, path within the remote (e.g., `/documents`)
- **Read Only**, mount in read-only mode
<Callout type="info">
Rclone must be configured on your host first, and the configuration directory must be mounted into the Zerobyte container. See the [Installation guide](/docs/installation#mounting-rclone-configuration) for instructions on mounting your rclone config.
@ -204,7 +204,7 @@ The volume exists in Zerobyte but is not currently connected. Backups that depen
### Error
Something went wrong -- the mount failed, the network is unreachable, or credentials were rejected. The volume detail view shows the specific error message. If auto-remount is enabled, Zerobyte will attempt to recover automatically.
Something went wrong, the mount failed, the network is unreachable, or credentials were rejected. The volume detail view shows the specific error message. If auto-remount is enabled, Zerobyte will attempt to recover automatically.
</Step>
</Steps>
@ -225,7 +225,7 @@ Once a volume is mounted, you can browse its contents directly from the Zerobyte
- Explore the directory structure to identify paths you want to include or exclude in your backup jobs
- Confirm that the files and folders you need to protect are accessible
This is a read-only view of the volume's contents -- browsing does not modify any files.
This is a read-only view of the volume's contents, browsing does not modify any files.
## Read-only mode
@ -237,12 +237,12 @@ All six volume types support mounting in read-only mode. When enabled, Zerobyte
## Credential security
Sensitive fields -- passwords, private keys, and other secrets -- are encrypted before they are stored. Zerobyte never saves credentials in plain text.
Sensitive fields, such as passwords, private keys, and other secrets, are encrypted before they are stored. Zerobyte never saves credentials in plain text.
Provisioned volumes also support secret references:
- **`env://VARIABLE_NAME`** -- Resolves the value from an environment variable set in your `docker-compose.yml` during provisioning
- **`file://secret_name`** -- Resolves the value from a Docker secrets file at `/run/secrets/secret_name` during provisioning
- **`env://VARIABLE_NAME`**, resolves the value from an environment variable set in your `docker-compose.yml` during provisioning
- **`file://secret_name`**, resolves the value from a Docker secrets file at `/run/secrets/secret_name` during provisioning
During provisioning, Zerobyte resolves these references on startup and stores the resolved value encrypted in the database.
@ -262,7 +262,7 @@ The regular volume form in the UI currently expects the actual credential value.
- `customer-uploads-nfs`
- `accounting-smb-share`
Avoid generic names like `volume1` or `backup` -- they become confusing as you add more volumes.
Avoid generic names like `volume1` or `backup`, they become confusing as you add more volumes.
</Accordion>
<Accordion title="Enable auto-remount for network volumes">
@ -278,7 +278,7 @@ The regular volume form in the UI currently expects the actual credential value.
</Accordion>
<Accordion title="Monitor volume health">
A volume in error state will cause its associated backup jobs to fail. Check the Volumes list regularly, or set up notifications to alert you when a volume loses its connection. Catching mount issues early prevents gaps in your backup coverage.
A volume in error state will cause its associated backup jobs to fail. Check the Volumes list regularly. Catching mount issues early prevents gaps in your backup coverage.
</Accordion>
</Accordions>

View file

@ -121,9 +121,9 @@ The `BASE_URL` determines how authentication cookies behave:
| BASE_URL | Cookie Behavior |
|----------|----------------|
| `http://192.168.1.50:4096` | Secure cookies **disabled** allows login over HTTP |
| `http://localhost:4096` | Secure cookies **disabled** allows local development |
| `https://zerobyte.example.com` | Secure cookies **enabled** requires HTTPS |
| `http://192.168.1.50:4096` | Secure cookies **disabled**, allows login over HTTP |
| `http://localhost:4096` | Secure cookies **disabled**, allows local development |
| `https://zerobyte.example.com` | Secure cookies **enabled**, requires HTTPS |
<Callout type="info">
If `BASE_URL` starts with `https://`, browsers will only send auth cookies over HTTPS connections. Plain HTTP access may show the login page but authentication will fail.

View file

@ -7,10 +7,10 @@ Zerobyte can sync operator-managed repositories and volumes from a JSON configur
## Why Use Provisioning?
- **Infrastructure as code** — Define repositories and volumes in version-controlled config files
- **Secret management** — Keep credentials in environment variables or Docker secrets, not in the UI
- **Easy rotation** — Rotate secrets by updating env vars or secret files and restarting
- **Consistent deployments** — Same configuration across staging and production
- **Infrastructure as code**, define repositories and volumes in version-controlled config files
- **Secret management**, keep credentials in environment variables or Docker secrets, not in the UI
- **Easy rotation**, rotate secrets by updating env vars or secret files and restarting
- **Consistent deployments**, use the same configuration across staging and production
Provisioned resources appear in the normal UI alongside manually created ones, marked as managed entries.
@ -120,7 +120,7 @@ Provisioned resources support two types of secret references for sensitive field
`file://` references always resolve from `/run/secrets/` and must be a single filename, not a nested path.
</Callout>
Resolved values are encrypted before Zerobyte stores them in the database the plaintext never persists on disk.
Resolved values are encrypted before Zerobyte stores them in the database, and the plaintext never persists on disk.
## Rotating Secrets

View file

@ -5,8 +5,8 @@ description: Use rclone with Zerobyte to connect to 40+ cloud storage providers
Rclone is a command-line tool that connects to over 40 cloud storage providers, including Google Drive, Dropbox, OneDrive, Box, pCloud, Mega, and many more. Zerobyte leverages rclone in two ways:
- **Repositories** — Store your encrypted backups on any rclone-supported cloud provider
- **Volumes** — Mount cloud storage as a data source so you can back it up
- **Repositories**, store your encrypted backups on any rclone-supported cloud provider
- **Volumes**, mount cloud storage as a data source so you can back it up
This guide covers installing rclone, connecting it to Zerobyte, and using it for both repositories and volumes.
@ -39,7 +39,7 @@ Run the interactive configuration wizard:
rclone config
```
Follow the prompts to add a new remote. Each provider has its own setup flow rclone will walk you through authentication, API keys, or OAuth as needed.
Follow the prompts to add a new remote. Each provider has its own setup flow, and rclone will walk you through authentication, API keys, or OAuth as needed.
</Step>

View file

@ -27,8 +27,8 @@ Zerobyte uses `BASE_URL` to determine whether authentication cookies should be m
| BASE_URL value | Cookie behavior |
|---|---|
| `http://` or IP address (e.g., `http://192.168.1.100:4096`) | Secure cookies **disabled** cookies sent over HTTP. Suitable for local network access. |
| `https://` with domain (e.g., `https://zerobyte.example.com`) | Secure cookies **enabled** cookies only sent over HTTPS. Required for production. |
| `http://` or IP address (e.g., `http://192.168.1.100:4096`) | Secure cookies **disabled**, cookies sent over HTTP. Suitable for local network access. |
| `https://` with domain (e.g., `https://zerobyte.example.com`) | Secure cookies **enabled**, cookies only sent over HTTPS. Required for production. |
<Callout type="warn">
If `BASE_URL` is set to an `https://` address, browsers will **only** send authentication cookies over HTTPS connections. Accessing Zerobyte over plain HTTP will fail with login loops or session errors. Make sure your reverse proxy terminates TLS before forwarding to Zerobyte.
@ -87,7 +87,7 @@ Reload Caddy after saving:
sudo systemctl reload caddy
```
Caddy automatically handles `X-Forwarded-For`, `X-Forwarded-Proto`, and TLS no extra configuration needed.
Caddy automatically handles `X-Forwarded-For`, `X-Forwarded-Proto`, and TLS, with no extra configuration needed.
</Tab>
@ -149,7 +149,7 @@ This ensures all traffic goes through your reverse proxy, which handles TLS and
The `TRUSTED_ORIGINS` environment variable allows you to add additional CORS origins for cross-origin requests. It does **not** make HTTP work when `BASE_URL` is set to HTTPS. If your `BASE_URL` uses `https://`, all access must go through HTTPS regardless of what is listed in `TRUSTED_ORIGINS`.
```yaml
# TRUSTED_ORIGINS only adds allowed CORS origins it does NOT downgrade HTTPS to HTTP
# TRUSTED_ORIGINS only adds allowed CORS origins, it does NOT downgrade HTTPS to HTTP
environment:
- BASE_URL=https://zerobyte.example.com
- TRUSTED_ORIGINS=https://other-app.example.com

View file

@ -38,7 +38,7 @@ Zerobyte simplifies backup management by providing an intuitive web interface on
- **Snapshot browsing and restore** directly from the web interface
<Callout type="warn">
Zerobyte is still in version 0.x.x and is subject to major changes between versions. Core features are under active development. Expect bugs and breaking changes.
Zerobyte is still in version 0.x.x and is subject to major changes between versions. Core features are under active development
</Callout>
## Explore the Docs

View file

@ -3,7 +3,7 @@ title: Installation
description: Deploy Zerobyte with Docker and Docker Compose
---
import { Rocket, Settings, LifeBuoy } from "lucide-react";
import { Check, LifeBuoy, Rocket, Settings, X } from "lucide-react";
import { Step, Steps } from "fumadocs-ui/components/steps";
Zerobyte runs as a Docker container and requires Docker and Docker Compose to be installed on your server.
@ -196,10 +196,24 @@ services:
**Trade-offs:**
* ✅ Improved security by removing `SYS_ADMIN` capability
* ✅ Support for local directories mounted into the container
* ✅ All repository types still supported (local, S3, GCS, Azure, rclone)
* ❌ Cannot mount remote shares (NFS, SMB, WebDAV, SFTP) from within Zerobyte
<ul className="my-4 list-none space-y-2 pl-0">
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Improved security by removing `SYS_ADMIN` capability</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Support for local directories mounted into the container</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>All repository types still supported (local, S3, GCS, Azure, rclone)</span>
</li>
<li className="flex items-start gap-2">
<X className="mt-1.5 h-4 w-4 shrink-0 text-red-600" />
<span>Cannot mount remote shares (NFS, SMB, WebDAV, SFTP) from within Zerobyte</span>
</li>
</ul>
<Callout type="info">
If you need remote mount capabilities later, you can update your `docker-compose.yml` to add back the `cap_add: SYS_ADMIN` and `devices: /dev/fuse:/dev/fuse` directives.
@ -213,13 +227,13 @@ To back up directories from your host system, mount them into the container:
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
- /path/to/your/photos:/photos:ro
- /path/to/your/documents:/documents:ro
- /path/to/your/media:/media:ro
- /path/to/your/photos:/photos
- /path/to/your/documents:/documents
- /path/to/your/media:/media
```
<Callout type="info">
Use read-only mounts (`:ro`) when possible to prevent accidental modifications during backup operations.
Use read-only mounts (`:ro`) if you want to prevent Zerobyte from modifying the source data. But you won't be able to restore files back to the original location if you use read-only mounts.
</Callout>
After adding volume mounts, restart the container:

View file

@ -6,7 +6,7 @@ description: Learn about Zerobyte, a powerful backup automation platform built o
Zerobyte is a backup automation tool that helps you protect your data across multiple storage backends. Built on top of [Restic](https://restic.net/), it provides a modern web interface to schedule, manage, and monitor encrypted backups.
<Callout type="warn">
Zerobyte is still in version 0.x.x and is subject to major changes between versions. Core features are under active development. Expect bugs and breaking changes.
Zerobyte is still in version 0.x.x and is subject to major changes between versions. Core features are under active development
</Callout>
## Key Features
@ -35,25 +35,25 @@ Zerobyte is a backup automation tool that helps you protect your data across mul
Volumes represent the data you want to protect:
- **Local directories** — Directories mounted into the container
- **NFS** Network File System shares (v3, v4, v4.1)
- **SMB/CIFS** Windows and Samba shares
- **WebDAV** WebDAV-compatible storage (Nextcloud, ownCloud, etc.)
- **SFTP** SSH File Transfer Protocol servers
- **Rclone** 40+ cloud storage providers via rclone (Google Drive, Dropbox, OneDrive, etc.)
- **Local directories**, directories mounted into the container
- **NFS**, Network File System shares (v3, v4, v4.1)
- **SMB/CIFS**, Windows and Samba shares
- **WebDAV**, WebDAV-compatible storage (Nextcloud, ownCloud, etc.)
- **SFTP**, SSH File Transfer Protocol servers
- **Rclone**, 40+ cloud storage providers via rclone (Google Drive, Dropbox, OneDrive, etc.)
### Repository Destinations (Where to Store Backups)
Repositories are encrypted storage locations for your backup snapshots:
- **Local directories** — Store backups on local disk
- **S3-compatible storage** Amazon S3, MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces, and more
- **Cloudflare R2** S3-compatible with zero egress fees
- **Google Cloud Storage** Google's cloud storage service
- **Azure Blob Storage** Microsoft Azure storage
- **SFTP** — Remote servers accessible via SSH
- **REST server** Restic REST server protocol
- **Rclone remotes** 40+ cloud storage providers via rclone
- **Local directories**, store backups on local disk
- **S3-compatible storage**, Amazon S3, MinIO, Wasabi, Backblaze B2, DigitalOcean Spaces, and more
- **Cloudflare R2**, S3-compatible with zero egress fees
- **Google Cloud Storage**, Google's cloud storage service
- **Azure Blob Storage**, Microsoft Azure storage
- **SFTP**, remote servers accessible via SSH
- **REST server**, Restic REST server protocol
- **Rclone remotes**, 40+ cloud storage providers via rclone
## How It Works
@ -113,12 +113,12 @@ Configure **backup jobs** that connect volumes to repositories with scheduling r
Zerobyte is built on [Restic](https://restic.net/) because it offers:
- **Fast and efficient** — Incremental backups with content-defined chunking
- **Secure by design** — Strong encryption and authenticated snapshots
- **Deduplication** — Only unique data is stored, saving space
- **Verification** — Built-in integrity checking for peace of mind
- **Cross-platform** — Works across different operating systems
- **Well-maintained** — Active open-source project with regular updates
- **Fast and efficient**, incremental backups with content-defined chunking
- **Secure by design**, strong encryption and authenticated snapshots
- **Deduplication**, only unique data is stored, saving space
- **Verification**, built-in integrity checking for peace of mind
- **Cross-platform**, works across different operating systems
- **Well-maintained**, an active open-source project with regular updates
## Next Steps

View file

@ -50,7 +50,7 @@ On a brand new Zerobyte install with no users yet, the app starts with onboardin
### Open Zerobyte
Navigate to the URL you configured in `BASE_URL` during installation. In local development, this is usually `http://localhost:3000`.
Navigate to the URL you configured in `BASE_URL` during installation. This is usually `http://<server-ip>:4096`.
</Step>
@ -135,7 +135,7 @@ docker compose up -d
### Navigate to Volumes
After downloading the recovery key, you are already on **Volumes**. If you navigate away, click **Volumes** in the sidebar.
After logging in, you are already on **Volumes**. If you navigate away, click **Volumes** in the sidebar.
</Step>
@ -549,7 +549,7 @@ You should see snapshot details such as:
Use the inline file browser to inspect the snapshot contents. You can:
- Navigate the directory structure
- View file sizes and modification times
- View file sizes
- Confirm the expected files are present
</Step>
@ -578,7 +578,7 @@ The UI exposes two related status views:
- In the **Backups** list, the status dot shows **Active**, **Paused**, **Error**, **Warning**, or **Backup in progress**
- In the backup job details page, the last run status shows **✓ Success**, **✗ Error**, **! Warning**, or **⟳ in progress...**
- If a backup job has not completed a run yet, the details page shows `—`
- If a backup job has not completed a run yet, the details page shows no last run value
<Callout type="info">
Click any backup job to view its snapshot history, restore actions, schedule summary, and repository links. If a run fails and the UI does not show enough detail, check your container logs with `docker compose logs -f zerobyte`.
@ -792,14 +792,31 @@ If you encounter issues:
You've successfully:
- ✅ Created an admin account and downloaded the recovery key
- ✅ Added a volume to backup
- ✅ Created a repository for encrypted storage
- ✅ Configured and ran your first backup job
- ✅ Verified your backup was successful
<ul className="my-4 list-none space-y-2 pl-0">
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Created an admin account and downloaded the recovery key</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Added a volume to backup</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Created a repository for encrypted storage</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Configured and ran your first backup job</span>
</li>
<li className="flex items-start gap-2">
<Check className="mt-1.5 h-4 w-4 shrink-0 text-green-600" />
<span>Verified your backup was successful</span>
</li>
</ul>
Your data is now protected with encrypted, deduplicated backups. Zerobyte will continue to run backups automatically according to your schedule.
import { FolderPlus, Cloud, Bell, History, FileText, Github, BookOpen, Users } from "lucide-react";
import { FolderPlus, Cloud, Bell, History, FileText, Github, BookOpen, Users, Check } from "lucide-react";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
import { Accordion, Accordions } from "fumadocs-ui/components/accordion";

View file

@ -140,7 +140,7 @@ docker exec zerobyte ls -la /dev/fuse
```
<Callout type="info">
`/dev/fuse` is **not required** for SMB/CIFS or NFS mounts only for SFTP and rclone volumes.
`/dev/fuse` is **not required** for SMB/CIFS or NFS mounts, only for SFTP and rclone volumes.
</Callout>
## Rclone Issues
@ -161,7 +161,7 @@ rclone ls myremote:path/to/test
```
**If these commands fail on the host, fix your rclone configuration first.** Common causes:
- Expired OAuth tokens run `rclone config` to re-authenticate
- Expired OAuth tokens, run `rclone config` to re-authenticate
- Incorrect credentials
- Missing permissions on the cloud provider side
- Network or firewall issues

View file

@ -0,0 +1,13 @@
import type { ComponentProps } from "react";
import Link from "fumadocs-core/link";
import { usePathname } from "fumadocs-core/framework";
export function DocsMdxLink({ href, ...props }: ComponentProps<"a">) {
const pathname = usePathname();
if (href?.startsWith("#")) {
return <a {...props} href={`${pathname}${href}`} />;
}
return <Link {...props} href={href} />;
}

View file

@ -11,6 +11,7 @@ import { baseOptions } from "@/lib/layout.shared";
import { useFumadocsLoader } from "fumadocs-core/source/client";
import { Suspense } from "react";
import { Card, Cards } from "@/components/DocsCard";
import { DocsMdxLink } from "@/components/DocsMdxLink";
export const Route = createFileRoute("/docs/$")({
component: Page,
@ -59,6 +60,7 @@ const clientLoader = browserCollections.docs.createClientLoader({
<MDX
components={{
...defaultMdxComponents,
a: DocsMdxLink,
Accordion,
Accordions,
Card,