diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index de29e554..16e8d9a0 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -54,7 +54,7 @@ jobs:
id: meta
uses: docker/metadata-action@v5
with:
- images: ghcr.io/${{ github.repository_owner }}/ironmount
+ images: ghcr.io/${{ github.repository_owner }}/zerobyte
tags: |
type=semver,pattern={{version}},prefix=v
type=semver,pattern={{major}},prefix=v,enable=${{ needs.determine-release-type.outputs.release_type == 'release' }}
@@ -62,8 +62,8 @@ jobs:
type=semver,pattern={{major}}.{{minor}}.{{patch}},prefix=v,enable=${{ needs.determine-release-type.outputs.release_type == 'release' }}
flavor: |
latest=${{ needs.determine-release-type.outputs.release_type == 'release' }}
- cache-from: type=registry,ref=ghcr.io/nicotsx/ironmount:buildcache
- cache-to: type=registry,ref=ghcr.io/nicotsx/ironmount:buildcache,mode=max
+ cache-from: type=registry,ref=ghcr.io/nicotsx/zerobyte:buildcache
+ cache-to: type=registry,ref=ghcr.io/nicotsx/zerobyte:buildcache,mode=max
- name: Build and push images
uses: docker/build-push-action@v6
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..29b746aa
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,167 @@
+# Contributing to Zerobyte
+
+Thank you for your interest in contributing to Zerobyte! We welcome contributions from the community and are grateful for your support in making this project better.
+
+## Table of Contents
+
+- [Getting Started](#getting-started)
+- [Contributor License Agreement (CLA)](#contributor-license-agreement-cla)
+- [How to Contribute](#how-to-contribute)
+- [Development Setup](#development-setup)
+- [Submission Guidelines](#submission-guidelines)
+- [Code Standards](#code-standards)
+- [Community Guidelines](#community-guidelines)
+
+## Getting Started
+
+Before you begin:
+
+1. Check the [issues](https://github.com/nicotsx/zerobyte/issues) to see if someone is already working on what you have in mind
+2. For major changes, please open an issue first to discuss what you would like to change
+3. Make sure you have read and agreed to our Contributor License Agreement (CLA)
+
+## Contributor License Agreement (CLA)
+
+### What is a CLA?
+
+A Contributor License Agreement (CLA) is a legal document in which you state you are entitled to contribute the code/documentation/translation to the project you're contributing to and are willing to have it used in distributions and derivative works. This means you grant us permission to use your contributions under our project's license terms.
+
+### Why do we need a CLA?
+
+We require a CLA for several important reasons:
+
+1. **License Flexibility**: It allows the project to evolve its licensing model if needed in the future without requiring re-approval from all past contributors, ensuring Zerobyte can continue to operate and adapt to changing needs of the community.
+
+2. **Patent Protection**: The CLA includes a patent license grant, which protects the project and its users from potential patent claims related to your contributions.
+
+3. **Protecting Your Rights**: While you grant us rights to use your contributions, you retain ownership of your work and can use it for any other purpose.
+
+### How to Sign the CLA
+
+When you submit your first pull request, our CLA Assistant will automatically prompt you to sign the agreement via GitHub. The process is simple:
+
+1. Create your pull request
+2. The CLA Assistant bot will comment on your PR
+3. Follow the link provided to review and sign the CLA electronically
+4. Once signed, the bot will update your PR status
+
+You only need to sign the CLA once, and it will cover all your future contributions to Zerobyte.
+
+### Key Points of Our CLA
+
+- You grant us a non-exclusive, royalty-free license to use your contributions
+- You retain ownership and all rights to your contributions
+- You confirm that you have the right to make the contribution (it's your original work or you have permission)
+- You're not required to provide support for your contributions
+- The CLA does not guarantee that your contribution will be accepted or kept into the project
+
+For the complete CLA text, please see the [CLA document](https://cla-assistant.io/nicotsx/zerobyte).
+
+## How to Contribute
+
+There are many ways to contribute to Zerobyte:
+
+### Reporting Bugs
+
+If you find a bug, please open an issue with:
+- A clear, descriptive title
+- Steps to reproduce the issue
+- Expected vs. actual behavior
+- Your environment (OS, Docker version, Zerobyte version)
+- Any relevant logs or screenshots
+
+### Suggesting Features
+
+When suggesting a feature:
+- Check if it's already been suggested
+- Clearly describe the feature and its use case
+- Explain why it would be valuable to other users
+- Consider the scope and complexity
+
+### Contributing Code
+
+1. **Fork the repository** and create your branch from `main`
+2. **Make your changes** following our code standards
+3. **Test your changes** thoroughly
+4. **Update documentation** if needed
+5. **Commit your changes** with clear, descriptive commit messages
+6. **Push to your fork** and submit a pull request
+
+### Improving Documentation
+
+Documentation improvements are always welcome! This includes:
+- Fixing typos or clarifying existing docs
+- Adding examples or use cases
+- Writing guides or tutorials
+- Improving README or other documentation files
+
+### Translations
+
+We welcome translations to make Zerobyte accessible to more users worldwide. Please open an issue to discuss translation efforts before starting.
+
+## Development Setup
+
+1. **Clone your fork**:
+ ```bash
+ git clone https://github.com/your-username/zerobyte.git
+ cd zerobyte
+ ```
+
+2. **Set up your development environment**:
+ ```bash
+ bun run start:dev
+ ```
+
+3. **Create a feature branch**:
+ ```bash
+ git checkout -b feature/your-feature-name
+ ```
+
+4. **Make your changes and test them**
+
+5. **Commit your changes**:
+ ```bash
+ git add .
+ git commit -m "Add your descriptive commit message"
+ ```
+
+## Submission Guidelines
+
+### Pull Request Process
+
+1. **Update your branch** with the latest changes from main before submitting
+2. **Ensure all tests pass** and your code builds successfully
+3. **Write a clear PR description** that explains:
+ - What changes you made
+ - Why you made them
+ - Any breaking changes or migration notes
+ - Link to related issues
+
+4. **Be responsive** to feedback and review comments
+5. **Keep PRs focused** - one feature or fix per PR when possible
+
+## Code Standards
+
+- Follow the existing code style and conventions
+- Write clear, self-documenting code. No unless comments are necessary
+- Ensure your code is properly formatted
+- Keep security in mind - never commit sensitive data like passwords or API keys
+
+## Community Guidelines
+
+- Be respectful and constructive in all interactions
+- Welcome newcomers and help them get started
+- Assume good intentions
+- Focus on what is best for the community and the project
+- Show empathy towards other community members
+
+## Questions?
+
+If you have questions about contributing, feel free to:
+- Open an issue with your question
+- Check existing issues and discussions
+- Reach out to the maintainers
+
+---
+
+Thank you for contributing to Zerobyte!
diff --git a/Dockerfile b/Dockerfile
index ae9ea489..96545a80 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,12 +2,7 @@ ARG BUN_VERSION="1.3.1"
FROM oven/bun:${BUN_VERSION}-alpine AS base
-RUN apk add --no-cache \
- davfs2=1.6.1-r2 \
- mariadb-client \
- mysql-client \
- postgresql-client \
- sqlite
+RUN apk add --no-cache davfs2=1.6.1-r2 openssh-client mariadb-client mysql-client postgresql-client
# ------------------------------
# DEPENDENCIES
diff --git a/README.md b/README.md
index 2ea629ac..da176a8d 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
-
Ironmount
+
Zerobyte
Powerful backup automation for your remote storage Encrypt, compress, and protect your data with ease
Backup management with scheduling and monitoring
@@ -16,11 +16,11 @@
> [!WARNING]
-> Ironmount 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. Expect bugs! Please open issues or feature requests
## Intro
-Ironmount 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.
+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.
### Features
@@ -31,13 +31,13 @@ Ironmount is a backup automation tool that helps you save your data across multi
## Installation
-In order to run Ironmount, you need to have Docker and Docker Compose installed on your server. Then, you can use the provided `docker-compose.yml` file to start the application.
+In order to run Zerobyte, you need to have Docker and Docker Compose installed on your server. Then, you can use the provided `docker-compose.yml` file to start the application.
```yaml
services:
- ironmount:
- image: ghcr.io/nicotsx/ironmount:v0.10
- container_name: ironmount
+ zerobyte:
+ image: ghcr.io/nicotsx/zerobyte:v0.12
+ container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
@@ -47,13 +47,13 @@ services:
- /dev/fuse:/dev/fuse
volumes:
- /etc/localtime:/etc/localtime:ro
- - /var/lib/ironmount:/var/lib/ironmount
+ - /var/lib/zerobyte:/var/lib/zerobyte
```
> [!WARNING]
-> Do not try to change the location of the bind mount `/var/lib/ironmount` on your host or store it on a network share. You will likely face permission issues and strong performance degradation.
+> Do not try to change the location of the bind mount `/var/lib/zerobyte` on your host or store it on a network share. You will likely face permission issues and strong performance degradation.
-Then, run the following command to start Ironmount:
+Then, run the following command to start Zerobyte:
```bash
docker compose up -d
@@ -63,17 +63,17 @@ Once the container is running, you can access the web interface at `http://`
+- **Local directories** - Store backups on local disk at `/var/lib/zerobyte/repositories/`
- **S3-compatible storage** - Amazon S3, MinIO, Wasabi, DigitalOcean Spaces, etc.
- **Google Cloud Storage** - Google's cloud storage service
- **Azure Blob Storage** - Microsoft Azure storage
@@ -114,7 +114,7 @@ To create a repository, navigate to the "Repositories" section in the web interf
### Using rclone for cloud storage
-Ironmount can use [rclone](https://rclone.org/) to support 40+ cloud storage providers including Google Drive, Dropbox, OneDrive, Box, pCloud, Mega, and many more. This gives you the flexibility to store your backups on virtually any cloud storage service.
+Zerobyte can use [rclone](https://rclone.org/) to support 40+ cloud storage providers including Google Drive, Dropbox, OneDrive, Box, pCloud, Mega, and many more. This gives you the flexibility to store your backups on virtually any cloud storage service.
**Setup instructions:**
@@ -134,12 +134,12 @@ Ironmount can use [rclone](https://rclone.org/) to support 40+ cloud storage pro
rclone listremotes
```
-4. **Mount the rclone config into the Ironmount container** by updating your `docker-compose.yml`:
+4. **Mount the rclone config into the Zerobyte container** by updating your `docker-compose.yml`:
```diff
services:
- ironmount:
- image: ghcr.io/nicotsx/ironmount:v0.10
- container_name: ironmount
+ zerobyte:
+ image: ghcr.io/nicotsx/zerobyte:v0.12
+ container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
@@ -149,20 +149,20 @@ Ironmount can use [rclone](https://rclone.org/) to support 40+ cloud storage pro
- /dev/fuse:/dev/fuse
volumes:
- /etc/localtime:/etc/localtime:ro
- - /var/lib/ironmount:/var/lib/ironmount
+ - /var/lib/zerobyte:/var/lib/zerobyte
+ - ~/.config/rclone:/root/.config/rclone
```
-5. **Restart the Ironmount container**:
+5. **Restart the Zerobyte container**:
```bash
docker compose down
docker compose up -d
```
-6. **Create a repository** in Ironmount:
+6. **Create a repository** in Zerobyte:
- Select "rclone" as the repository type
- Choose your configured remote from the dropdown
- - Specify the path within your remote (e.g., `backups/ironmount`)
+ - Specify the path within your remote (e.g., `backups/zerobyte`)
For a complete list of supported providers, see the [rclone documentation](https://rclone.org/).
@@ -175,28 +175,28 @@ When creating a backup job, you can specify the following settings:
- **Retention Policy**: Set rules for how long backups should be retained (e.g., keep daily backups for 7 days, weekly backups for 4 weeks)
- **Paths**: Specify which files or directories to include in the backup
-After configuring the backup job, save it and Ironmount will automatically execute the backup according to the defined schedule.
+After configuring the backup job, save it and Zerobyte will automatically execute the backup according to the defined schedule.
You can monitor the progress and status of your backup jobs in the "Backups" section of the web interface.
-
+
## Restoring data
-Ironmount allows you to easily restore your data from backups. To restore data, navigate to the "Backups" section and select the backup job from which you want to restore data. You can then choose a specific backup snapshot and select the files or directories you wish to restore. The data you select will be restored to their original location.
+Zerobyte allows you to easily restore your data from backups. To restore data, navigate to the "Backups" section and select the backup job from which you want to restore data. You can then choose a specific backup snapshot and select the files or directories you wish to restore. The data you select will be restored to their original location.
-
+
## Propagating mounts to host
-Ironmount is capable of propagating mounted volumes from within the container to the host system. This is particularly useful when you want to access the mounted data directly from the host to use it with other applications or services.
+Zerobyte is capable of propagating mounted volumes from within the container to the host system. This is particularly useful when you want to access the mounted data directly from the host to use it with other applications or services.
-In order to enable this feature, you need to change your bind mount `/var/lib/ironmount` to use the `:rshared` flag. Here is an example of how to set this up in your `docker-compose.yml` file:
+In order to enable this feature, you need to change your bind mount `/var/lib/zerobyte` to use the `:rshared` flag. Here is an example of how to set this up in your `docker-compose.yml` file:
```diff
services:
- ironmount:
- image: ghcr.io/nicotsx/ironmount:v0.10
- container_name: ironmount
+ zerobyte:
+ image: ghcr.io/nicotsx/zerobyte:v0.12
+ container_name: zerobyte
restart: unless-stopped
ports:
- "4096:4096"
@@ -204,11 +204,11 @@ services:
- /dev/fuse:/dev/fuse
volumes:
- /etc/localtime:/etc/localtime:ro
-- - /var/lib/ironmount:/var/lib/ironmount
-+ - /var/lib/ironmount:/var/lib/ironmount:rshared
+- - /var/lib/zerobyte:/var/lib/zerobyte
++ - /var/lib/zerobyte:/var/lib/zerobyte:rshared
```
-Restart the Ironmount container to apply the changes:
+Restart the Zerobyte container to apply the changes:
```bash
docker compose down
@@ -217,15 +217,15 @@ docker compose up -d
## Docker plugin
-Ironmount can also be used as a Docker volume plugin, allowing you to mount your volumes directly into other Docker containers. This enables seamless integration with your containerized applications.
+Zerobyte can also be used as a Docker volume plugin, allowing you to mount your volumes directly into other Docker containers. This enables seamless integration with your containerized applications.
-In order to enable this feature, you need to run Ironmount with several items shared from the host. Here is an example of how to set this up in your `docker-compose.yml` file:
+In order to enable this feature, you need to run Zerobyte with several items shared from the host. Here is an example of how to set this up in your `docker-compose.yml` file:
```diff
services:
- ironmount:
- image: ghcr.io/nicotsx/ironmount:v0.10
- container_name: ironmount
+ zerobyte:
+ image: ghcr.io/nicotsx/zerobyte:v0.12
+ container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
@@ -235,20 +235,20 @@ services:
- /dev/fuse:/dev/fuse
volumes:
- /etc/localtime:/etc/localtime:ro
-- - /var/lib/ironmount:/var/lib/ironmount
-+ - /var/lib/ironmount:/var/lib/ironmount:rshared
+- - /var/lib/zerobyte:/var/lib/zerobyte
++ - /var/lib/zerobyte:/var/lib/zerobyte:rshared
+ - /run/docker/plugins:/run/docker/plugins
+ - /var/run/docker.sock:/var/run/docker.sock
```
-Restart the Ironmount container to apply the changes:
+Restart the Zerobyte container to apply the changes:
```bash
docker compose down
docker compose up -d
```
-Your Ironmount volumes will now be available as Docker volumes that you can mount into other containers using the `--volume` flag:
+Your Zerobyte volumes will now be available as Docker volumes that you can mount into other containers using the `--volume` flag:
```bash
docker run -v im-nfs:/path/in/container nginx:latest
@@ -267,7 +267,7 @@ volumes:
external: true
```
-The volume name format is `im-` where `` is the name you assigned to the volume in Ironmount. You can verify that the volume is available by running:
+The volume name format is `im-` where `` is the name you assigned to the volume in Zerobyte. You can verify that the volume is available by running:
```bash
docker volume ls
@@ -279,7 +279,7 @@ This project includes the following third-party software components:
### Restic
-Ironmount includes [Restic](https://github.com/restic/restic) for backup functionality.
+Zerobyte includes [Restic](https://github.com/restic/restic) for backup functionality.
- **License**: BSD 2-Clause License
- **Copyright**: Copyright (c) 2014, Alexander Neumann
@@ -287,3 +287,7 @@ Ironmount includes [Restic](https://github.com/restic/restic) for backup functio
- **License Text**: See [LICENSES/BSD-2-Clause-Restic.txt](LICENSES/BSD-2-Clause-Restic.txt)
For a complete list of third-party software licenses and attributions, please refer to the [NOTICES.md](NOTICES.md) file.
+
+## Contributing
+
+Contributions by anyone are welcome! If you find a bug or have a feature request, please open an issue on GitHub. If you want to contribute code, feel free to fork the repository and submit a pull request. We require that all contributors sign a Contributor License Agreement (CLA) before we can accept your contributions. This is to protect both you and the project. Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more details.
diff --git a/app/client/api-client/types.gen.ts b/app/client/api-client/types.gen.ts
index 5a3de70b..a36e74b6 100644
--- a/app/client/api-client/types.gen.ts
+++ b/app/client/api-client/types.gen.ts
@@ -741,12 +741,21 @@ export type ListRepositoriesResponses = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
createdAt: number;
id: string;
@@ -754,7 +763,7 @@ export type ListRepositoriesResponses = {
lastError: string | null;
name: string;
status: 'error' | 'healthy' | 'unknown' | null;
- type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 's3';
+ type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 'rest' | 's3';
updatedAt: number;
}>;
};
@@ -799,12 +808,21 @@ export type CreateRepositoryData = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
name: string;
compressionMode?: 'auto' | 'better' | 'fastest' | 'max' | 'off';
@@ -919,12 +937,21 @@ export type GetRepositoryResponses = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
createdAt: number;
id: string;
@@ -932,7 +959,7 @@ export type GetRepositoryResponses = {
lastError: string | null;
name: string;
status: 'error' | 'healthy' | 'unknown' | null;
- type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 's3';
+ type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 'rest' | 's3';
updatedAt: number;
};
};
@@ -1166,12 +1193,21 @@ export type ListBackupSchedulesResponses = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
createdAt: number;
id: string;
@@ -1179,7 +1215,7 @@ export type ListBackupSchedulesResponses = {
lastError: string | null;
name: string;
status: 'error' | 'healthy' | 'unknown' | null;
- type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 's3';
+ type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 'rest' | 's3';
updatedAt: number;
};
repositoryId: string;
@@ -1379,12 +1415,21 @@ export type GetBackupScheduleResponses = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
createdAt: number;
id: string;
@@ -1392,7 +1437,7 @@ export type GetBackupScheduleResponses = {
lastError: string | null;
name: string;
status: 'error' | 'healthy' | 'unknown' | null;
- type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 's3';
+ type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 'rest' | 's3';
updatedAt: number;
};
repositoryId: string;
@@ -1573,12 +1618,21 @@ export type GetBackupScheduleForVolumeResponses = {
name: string;
customPassword?: string;
isExistingRepository?: boolean;
+ path?: string;
} | {
backend: 'rclone';
path: string;
remote: string;
customPassword?: string;
isExistingRepository?: boolean;
+ } | {
+ backend: 'rest';
+ url: string;
+ customPassword?: string;
+ isExistingRepository?: boolean;
+ password?: string;
+ path?: string;
+ username?: string;
};
createdAt: number;
id: string;
@@ -1586,7 +1640,7 @@ export type GetBackupScheduleForVolumeResponses = {
lastError: string | null;
name: string;
status: 'error' | 'healthy' | 'unknown' | null;
- type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 's3';
+ type: 'azure' | 'gcs' | 'local' | 'r2' | 'rclone' | 'rest' | 's3';
updatedAt: number;
};
repositoryId: string;
diff --git a/app/client/components/app-sidebar.tsx b/app/client/components/app-sidebar.tsx
index 19ef8549..8710b682 100644
--- a/app/client/components/app-sidebar.tsx
+++ b/app/client/components/app-sidebar.tsx
@@ -1,4 +1,4 @@
-import { CalendarClock, Database, HardDrive, Mountain, Settings } from "lucide-react";
+import { CalendarClock, Database, HardDrive, Settings } from "lucide-react";
import { Link, NavLink } from "react-router";
import {
Sidebar,
@@ -46,13 +46,17 @@ export function AppSidebar() {
-
+
- Ironmount
+ Zerobyte
diff --git a/app/client/components/auth-layout.tsx b/app/client/components/auth-layout.tsx
index 2435a41e..87c5b7ed 100644
--- a/app/client/components/auth-layout.tsx
+++ b/app/client/components/auth-layout.tsx
@@ -1,4 +1,3 @@
-import { Mountain } from "lucide-react";
import type { ReactNode } from "react";
type AuthLayoutProps = {
@@ -13,8 +12,8 @@ export function AuthLayout({ title, description, children }: AuthLayoutProps) {
-
- Ironmount
+
+ Zerobyte
diff --git a/app/client/components/create-repository-form.tsx b/app/client/components/create-repository-form.tsx
index 724eda8f..fd1cfaaa 100644
--- a/app/client/components/create-repository-form.tsx
+++ b/app/client/components/create-repository-form.tsx
@@ -10,12 +10,24 @@ import { Input } from "./ui/input";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
import { useQuery } from "@tanstack/react-query";
import { Alert, AlertDescription } from "./ui/alert";
-import { ExternalLink } from "lucide-react";
+import { ExternalLink, AlertTriangle } from "lucide-react";
import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip";
import { useSystemInfo } from "~/client/hooks/use-system-info";
import { COMPRESSION_MODES, repositoryConfigSchema } from "~/schemas/restic";
import { listRcloneRemotesOptions } from "../api-client/@tanstack/react-query.gen";
import { Checkbox } from "./ui/checkbox";
+import { DirectoryBrowser } from "./directory-browser";
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+} from "./ui/alert-dialog";
+import { Textarea } from "./ui/textarea";
export const formSchema = type({
name: "2<=string<=32",
@@ -42,6 +54,7 @@ const defaultValuesForType = {
azure: { backend: "azure" as const, compressionMode: "auto" as const },
rclone: { backend: "rclone" as const, compressionMode: "auto" as const },
rest: { backend: "rest" as const, compressionMode: "auto" as const },
+ sftp: { backend: "sftp" as const, compressionMode: "auto" as const, port: 22 },
};
export const CreateRepositoryForm = ({
@@ -67,6 +80,8 @@ export const CreateRepositoryForm = ({
const watchedIsExistingRepository = watch("isExistingRepository");
const [passwordMode, setPasswordMode] = useState<"default" | "custom">("default");
+ const [showPathBrowser, setShowPathBrowser] = useState(false);
+ const [showPathWarning, setShowPathWarning] = useState(false);
const { capabilities } = useSystemInfo();
@@ -128,6 +143,7 @@ export const CreateRepositoryForm = ({
Google Cloud StorageAzure Blob StorageREST Server
+ SFTP
@@ -216,12 +232,12 @@ export const CreateRepositoryForm = ({
- Use Ironmount's password
+ Use Zerobyte's passwordEnter password manually
- Choose whether to use Ironmount's master password or enter a custom password for the existing
+ Choose whether to use Zerobyte's master password or enter a custom password for the existing
repository.
@@ -247,6 +263,76 @@ export const CreateRepositoryForm = ({
>
)}
+ {watchedBackend === "local" && (
+ <>
+
+ Repository Directory
+