diff --git a/AGENTS.md b/AGENTS.md index 136692d0..6ba3fcd9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -19,7 +19,6 @@ Zerobyte is a backup automation tool built on top of Restic that provides a web - **Styling**: Tailwind CSS v4 + Radix UI components - **Architecture**: Unified application structure (not a monorepo) - **Code Quality**: Biome (formatter & linter) -- **Containerization**: Docker with multi-stage builds ## Repository Structure @@ -84,9 +83,7 @@ The server follows a modular service-oriented architecture: **Entry Point**: `app/server/index.ts` -- Initializes servers using `react-router-hono-server`: - 1. Main API server on port 4096 (REST API + serves static frontend) - 2. Docker volume plugin server on Unix socket `/run/docker/plugins/zerobyte.sock` (optional, if Docker is available) +- Initializes main API server on port 4096 (REST API + serves static frontend) **Modules** (`app/server/modules/`): Each module follows a controller � service � database pattern: @@ -116,7 +113,7 @@ Cron-based background jobs managed by the Scheduler: **Core** (`app/server/core/`): - `scheduler.ts` - Job scheduling system using node-cron -- `capabilities.ts` - Detects available system features (Docker support, etc.) +- `capabilities.ts` - Detects available system features - `constants.ts` - Application-wide constants **Utils** (`app/server/utils/`): @@ -188,17 +185,6 @@ Zerobyte is a wrapper around Restic for backup operations. Key integration point - Dynamically generates rclone config and passes via environment variables - Supports backends like Dropbox, Google Drive, OneDrive, Backblaze B2, etc. -## Docker Volume Plugin - -When Docker socket is available (`/var/run/docker.sock`), Zerobyte registers as a Docker volume plugin: - -**Plugin Location**: `/run/docker/plugins/zerobyte.sock` -**Implementation**: `app/server/modules/driver/driver.controller.ts` - -This allows other containers to mount Zerobyte volumes using Docker. - -The plugin implements the Docker Volume Plugin API v1. - ## Environment & Configuration **Runtime Environment Variables**: @@ -212,7 +198,7 @@ The plugin implements the Docker Volume Plugin API v1. **Capabilities Detection**: On startup, the server detects available capabilities (see `core/capabilities.ts`): -- **Docker**: Requires `/var/run/docker.sock` access +- **rclone**: Requires `/root/.config/rclone` directory access - System will gracefully degrade if capabilities are unavailable ## Common Workflows @@ -252,16 +238,3 @@ On startup, the server detects available capabilities (see `core/capabilities.ts - **Security**: Restic password file has 0600 permissions - never expose it - **Mounting**: Requires privileged container or CAP_SYS_ADMIN for FUSE mounts - **API Documentation**: OpenAPI spec auto-generated at `/api/v1/openapi.json`, docs at `/api/v1/docs` - -## Docker Development Setup - -The `docker-compose.yml` defines two services: - -- `zerobyte-dev` - Development with hot reload (uses `development` stage) -- `zerobyte-prod` - Production build (uses `production` stage) - -Both mount: - -- `/var/lib/zerobyte` for persistent data -- `/dev/fuse` device for FUSE mounting -- Optionally `/var/run/docker.sock` for Docker plugin functionality diff --git a/README.md b/README.md index 226a38f9..87289812 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,34 @@ docker compose up -d Once the container is running, you can access the web interface at `http://:4096`. +### Simplified setup (No remote mounts) + +If you only need to back up locally mounted folders and don't require remote share mounting capabilities, you can remove the `SYS_ADMIN` capability and FUSE device from your `docker-compose.yml`: + +```yaml +services: + zerobyte: + image: ghcr.io/nicotsx/zerobyte:v0.18 + container_name: zerobyte + restart: unless-stopped + ports: + - "4096:4096" + environment: + - TZ=Europe/Paris # Set your timezone here + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/lib/zerobyte:/var/lib/zerobyte + - /path/to/your/directory:/mydata +``` + +**Trade-offs:** +- ✅ Improved security by reducing container capabilities +- ✅ Support for local directories +- ✅ Keep support all repository types (local, S3, GCS, Azure, rclone) +- ❌ Cannot mount NFS, SMB, or WebDAV shares directly from Zerobyte + +If you need remote mount capabilities, keep the original configuration with `cap_add: SYS_ADMIN` and `devices: /dev/fuse:/dev/fuse`. + ## Adding your first volume Zerobyte supports multiple volume backends including NFS, SMB, WebDAV, and local directories. A volume represents the source data you want to back up and monitor. @@ -196,115 +224,6 @@ Zerobyte allows you to easily restore your data from backups. To restore data, n ![Preview](https://github.com/nicotsx/zerobyte/blob/main/screenshots/restoring.png?raw=true) -## Exporting configuration - -Zerobyte allows you to export your configuration for backup, migration, or documentation purposes. - -To export, click the "Export" button on any list page or detail page. A dialog will appear with options to: - -- **Include metadata** - Include IDs, timestamps, and runtime state of entities -- **Secrets handling**: - - **Exclude** - Remove sensitive fields like passwords and API keys - - **Keep encrypted** - Export secrets in encrypted form (requires the same recovery key to decrypt on import) - - **Decrypt** - Export secrets as plaintext (use with caution) -- **Include recovery key** - Include the master encryption key for all repositories -- **Include password hash** - Include the hashed user passwords for seamless migration - -Export requires password verification for security. You must enter your password to confirm your identity before any configuration can be exported. - -Export is downloaded as JSON file that can be used for reference or future import functionality. - -## Propagating mounts to host - -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/zerobyte` to use the `:rshared` flag. Here is an example of how to set this up in your `docker-compose.yml` file: - -```diff -services: - zerobyte: - image: ghcr.io/nicotsx/zerobyte:v0.18 - container_name: zerobyte - restart: unless-stopped - ports: - - "4096:4096" - devices: - - /dev/fuse:/dev/fuse - environment: - - TZ=Europe/Paris - volumes: - - /etc/localtime:/etc/localtime:ro -- - /var/lib/zerobyte:/var/lib/zerobyte -+ - /var/lib/zerobyte:/var/lib/zerobyte:rshared -``` - -Restart the Zerobyte container to apply the changes: - -```bash -docker compose down -docker compose up -d -``` - -## Docker plugin - -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 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: - zerobyte: - image: ghcr.io/nicotsx/zerobyte:v0.18 - container_name: zerobyte - restart: unless-stopped - cap_add: - - SYS_ADMIN - ports: - - "4096:4096" - devices: - - /dev/fuse:/dev/fuse - environment: - - TZ=Europe/Paris - volumes: - - /etc/localtime:/etc/localtime:ro -- - /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 Zerobyte container to apply the changes: - -```bash -docker compose down -docker compose up -d -``` - -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 zb-abc12:/path/in/container nginx:latest -``` - -Or using Docker Compose: - -```yaml -services: - myservice: - image: nginx:latest - volumes: - - zb-abc12:/path/in/container -volumes: - zb-abc12: - external: true -``` - -The volume name format is `zb-` where `` is the unique identifier shown on the volume's Docker tab in Zerobyte. This short ID remains stable even if you rename the volume. You can verify that the volume is available by running: - -```bash -docker volume ls -``` - ## Third-Party Software This project includes the following third-party software components: diff --git a/app/client/api-client/@tanstack/react-query.gen.ts b/app/client/api-client/@tanstack/react-query.gen.ts index 83ae179c..9ac74633 100644 --- a/app/client/api-client/@tanstack/react-query.gen.ts +++ b/app/client/api-client/@tanstack/react-query.gen.ts @@ -3,8 +3,8 @@ import { type DefaultError, queryOptions, type UseMutationOptions } from '@tanstack/react-query'; import { client } from '../client.gen'; -import { browseFilesystem, changePassword, createBackupSchedule, createNotificationDestination, createRepository, createVolume, deleteBackupSchedule, deleteNotificationDestination, deleteRepository, deleteSnapshot, deleteVolume, doctorRepository, downloadResticPassword, exportFullConfig, getBackupSchedule, getBackupScheduleForVolume, getContainersUsingVolume, getMe, getMirrorCompatibility, getNotificationDestination, getRepository, getScheduleMirrors, getScheduleNotifications, getSnapshotDetails, getStatus, getSystemInfo, getVolume, healthCheckVolume, listBackupSchedules, listFiles, listNotificationDestinations, listRcloneRemotes, listRepositories, listSnapshotFiles, listSnapshots, listVolumes, login, logout, mountVolume, type Options, register, restoreSnapshot, runBackupNow, runForget, stopBackup, testConnection, testNotificationDestination, unmountVolume, updateBackupSchedule, updateNotificationDestination, updateRepository, updateScheduleMirrors, updateScheduleNotifications, updateVolume } from '../sdk.gen'; -import type { BrowseFilesystemData, BrowseFilesystemResponse, ChangePasswordData, ChangePasswordResponse, CreateBackupScheduleData, CreateBackupScheduleResponse, CreateNotificationDestinationData, CreateNotificationDestinationResponse, CreateRepositoryData, CreateRepositoryResponse, CreateVolumeData, CreateVolumeResponse, DeleteBackupScheduleData, DeleteBackupScheduleResponse, DeleteNotificationDestinationData, DeleteNotificationDestinationResponse, DeleteRepositoryData, DeleteRepositoryResponse, DeleteSnapshotData, DeleteSnapshotResponse, DeleteVolumeData, DeleteVolumeResponse, DoctorRepositoryData, DoctorRepositoryResponse, DownloadResticPasswordData, DownloadResticPasswordResponse, ExportFullConfigData, ExportFullConfigError, ExportFullConfigResponse, GetBackupScheduleData, GetBackupScheduleForVolumeData, GetBackupScheduleForVolumeResponse, GetBackupScheduleResponse, GetContainersUsingVolumeData, GetContainersUsingVolumeResponse, GetMeData, GetMeResponse, GetMirrorCompatibilityData, GetMirrorCompatibilityResponse, GetNotificationDestinationData, GetNotificationDestinationResponse, GetRepositoryData, GetRepositoryResponse, GetScheduleMirrorsData, GetScheduleMirrorsResponse, GetScheduleNotificationsData, GetScheduleNotificationsResponse, GetSnapshotDetailsData, GetSnapshotDetailsResponse, GetStatusData, GetStatusResponse, GetSystemInfoData, GetSystemInfoResponse, GetVolumeData, GetVolumeResponse, HealthCheckVolumeData, HealthCheckVolumeResponse, ListBackupSchedulesData, ListBackupSchedulesResponse, ListFilesData, ListFilesResponse, ListNotificationDestinationsData, ListNotificationDestinationsResponse, ListRcloneRemotesData, ListRcloneRemotesResponse, ListRepositoriesData, ListRepositoriesResponse, ListSnapshotFilesData, ListSnapshotFilesResponse, ListSnapshotsData, ListSnapshotsResponse, ListVolumesData, ListVolumesResponse, LoginData, LoginResponse, LogoutData, LogoutResponse, MountVolumeData, MountVolumeResponse, RegisterData, RegisterResponse, RestoreSnapshotData, RestoreSnapshotResponse, RunBackupNowData, RunBackupNowResponse, RunForgetData, RunForgetResponse, StopBackupData, StopBackupResponse, TestConnectionData, TestConnectionResponse, TestNotificationDestinationData, TestNotificationDestinationResponse, UnmountVolumeData, UnmountVolumeResponse, UpdateBackupScheduleData, UpdateBackupScheduleResponse, UpdateNotificationDestinationData, UpdateNotificationDestinationResponse, UpdateRepositoryData, UpdateRepositoryResponse, UpdateScheduleMirrorsData, UpdateScheduleMirrorsResponse, UpdateScheduleNotificationsData, UpdateScheduleNotificationsResponse, UpdateVolumeData, UpdateVolumeResponse } from '../types.gen'; +import { browseFilesystem, changePassword, createBackupSchedule, createNotificationDestination, createRepository, createVolume, deleteBackupSchedule, deleteNotificationDestination, deleteRepository, deleteSnapshot, deleteVolume, doctorRepository, downloadResticPassword, exportFullConfig, getBackupSchedule, getBackupScheduleForVolume, getMe, getMirrorCompatibility, getNotificationDestination, getRepository, getScheduleMirrors, getScheduleNotifications, getSnapshotDetails, getStatus, getSystemInfo, getVolume, healthCheckVolume, listBackupSchedules, listFiles, listNotificationDestinations, listRcloneRemotes, listRepositories, listSnapshotFiles, listSnapshots, listVolumes, login, logout, mountVolume, type Options, register, restoreSnapshot, runBackupNow, runForget, stopBackup, testConnection, testNotificationDestination, unmountVolume, updateBackupSchedule, updateNotificationDestination, updateRepository, updateScheduleMirrors, updateScheduleNotifications, updateVolume } from '../sdk.gen'; +import type { BrowseFilesystemData, BrowseFilesystemResponse, ChangePasswordData, ChangePasswordResponse, CreateBackupScheduleData, CreateBackupScheduleResponse, CreateNotificationDestinationData, CreateNotificationDestinationResponse, CreateRepositoryData, CreateRepositoryResponse, CreateVolumeData, CreateVolumeResponse, DeleteBackupScheduleData, DeleteBackupScheduleResponse, DeleteNotificationDestinationData, DeleteNotificationDestinationResponse, DeleteRepositoryData, DeleteRepositoryResponse, DeleteSnapshotData, DeleteSnapshotResponse, DeleteVolumeData, DeleteVolumeResponse, DoctorRepositoryData, DoctorRepositoryResponse, DownloadResticPasswordData, DownloadResticPasswordResponse, ExportFullConfigData, ExportFullConfigError, ExportFullConfigResponse, GetBackupScheduleData, GetBackupScheduleForVolumeData, GetBackupScheduleForVolumeResponse, GetBackupScheduleResponse, GetMeData, GetMeResponse, GetMirrorCompatibilityData, GetMirrorCompatibilityResponse, GetNotificationDestinationData, GetNotificationDestinationResponse, GetRepositoryData, GetRepositoryResponse, GetScheduleMirrorsData, GetScheduleMirrorsResponse, GetScheduleNotificationsData, GetScheduleNotificationsResponse, GetSnapshotDetailsData, GetSnapshotDetailsResponse, GetStatusData, GetStatusResponse, GetSystemInfoData, GetSystemInfoResponse, GetVolumeData, GetVolumeResponse, HealthCheckVolumeData, HealthCheckVolumeResponse, ListBackupSchedulesData, ListBackupSchedulesResponse, ListFilesData, ListFilesResponse, ListNotificationDestinationsData, ListNotificationDestinationsResponse, ListRcloneRemotesData, ListRcloneRemotesResponse, ListRepositoriesData, ListRepositoriesResponse, ListSnapshotFilesData, ListSnapshotFilesResponse, ListSnapshotsData, ListSnapshotsResponse, ListVolumesData, ListVolumesResponse, LoginData, LoginResponse, LogoutData, LogoutResponse, MountVolumeData, MountVolumeResponse, RegisterData, RegisterResponse, RestoreSnapshotData, RestoreSnapshotResponse, RunBackupNowData, RunBackupNowResponse, RunForgetData, RunForgetResponse, StopBackupData, StopBackupResponse, TestConnectionData, TestConnectionResponse, TestNotificationDestinationData, TestNotificationDestinationResponse, UnmountVolumeData, UnmountVolumeResponse, UpdateBackupScheduleData, UpdateBackupScheduleResponse, UpdateNotificationDestinationData, UpdateNotificationDestinationResponse, UpdateRepositoryData, UpdateRepositoryResponse, UpdateScheduleMirrorsData, UpdateScheduleMirrorsResponse, UpdateScheduleNotificationsData, UpdateScheduleNotificationsResponse, UpdateVolumeData, UpdateVolumeResponse } from '../types.gen'; /** * Register a new user @@ -249,24 +249,6 @@ export const updateVolumeMutation = (options?: Partial return mutationOptions; }; -export const getContainersUsingVolumeQueryKey = (options: Options) => createQueryKey("getContainersUsingVolume", options); - -/** - * Get containers using a volume by name - */ -export const getContainersUsingVolumeOptions = (options: Options) => queryOptions>({ - queryFn: async ({ queryKey, signal }) => { - const { data } = await getContainersUsingVolume({ - ...options, - ...queryKey[0], - signal, - throwOnError: true - }); - return data; - }, - queryKey: getContainersUsingVolumeQueryKey(options) -}); - /** * Mount a volume */ diff --git a/app/client/api-client/sdk.gen.ts b/app/client/api-client/sdk.gen.ts index 6d83b761..33f82659 100644 --- a/app/client/api-client/sdk.gen.ts +++ b/app/client/api-client/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { BrowseFilesystemData, BrowseFilesystemResponses, ChangePasswordData, ChangePasswordResponses, CreateBackupScheduleData, CreateBackupScheduleResponses, CreateNotificationDestinationData, CreateNotificationDestinationResponses, CreateRepositoryData, CreateRepositoryResponses, CreateVolumeData, CreateVolumeResponses, DeleteBackupScheduleData, DeleteBackupScheduleResponses, DeleteNotificationDestinationData, DeleteNotificationDestinationErrors, DeleteNotificationDestinationResponses, DeleteRepositoryData, DeleteRepositoryResponses, DeleteSnapshotData, DeleteSnapshotResponses, DeleteVolumeData, DeleteVolumeResponses, DoctorRepositoryData, DoctorRepositoryResponses, DownloadResticPasswordData, DownloadResticPasswordResponses, ExportFullConfigData, ExportFullConfigErrors, ExportFullConfigResponses, GetBackupScheduleData, GetBackupScheduleForVolumeData, GetBackupScheduleForVolumeResponses, GetBackupScheduleResponses, GetContainersUsingVolumeData, GetContainersUsingVolumeErrors, GetContainersUsingVolumeResponses, GetMeData, GetMeResponses, GetMirrorCompatibilityData, GetMirrorCompatibilityResponses, GetNotificationDestinationData, GetNotificationDestinationErrors, GetNotificationDestinationResponses, GetRepositoryData, GetRepositoryResponses, GetScheduleMirrorsData, GetScheduleMirrorsResponses, GetScheduleNotificationsData, GetScheduleNotificationsResponses, GetSnapshotDetailsData, GetSnapshotDetailsResponses, GetStatusData, GetStatusResponses, GetSystemInfoData, GetSystemInfoResponses, GetVolumeData, GetVolumeErrors, GetVolumeResponses, HealthCheckVolumeData, HealthCheckVolumeErrors, HealthCheckVolumeResponses, ListBackupSchedulesData, ListBackupSchedulesResponses, ListFilesData, ListFilesResponses, ListNotificationDestinationsData, ListNotificationDestinationsResponses, ListRcloneRemotesData, ListRcloneRemotesResponses, ListRepositoriesData, ListRepositoriesResponses, ListSnapshotFilesData, ListSnapshotFilesResponses, ListSnapshotsData, ListSnapshotsResponses, ListVolumesData, ListVolumesResponses, LoginData, LoginResponses, LogoutData, LogoutResponses, MountVolumeData, MountVolumeResponses, RegisterData, RegisterResponses, RestoreSnapshotData, RestoreSnapshotResponses, RunBackupNowData, RunBackupNowResponses, RunForgetData, RunForgetResponses, StopBackupData, StopBackupErrors, StopBackupResponses, TestConnectionData, TestConnectionResponses, TestNotificationDestinationData, TestNotificationDestinationErrors, TestNotificationDestinationResponses, UnmountVolumeData, UnmountVolumeResponses, UpdateBackupScheduleData, UpdateBackupScheduleResponses, UpdateNotificationDestinationData, UpdateNotificationDestinationErrors, UpdateNotificationDestinationResponses, UpdateRepositoryData, UpdateRepositoryErrors, UpdateRepositoryResponses, UpdateScheduleMirrorsData, UpdateScheduleMirrorsResponses, UpdateScheduleNotificationsData, UpdateScheduleNotificationsResponses, UpdateVolumeData, UpdateVolumeErrors, UpdateVolumeResponses } from './types.gen'; +import type { BrowseFilesystemData, BrowseFilesystemResponses, ChangePasswordData, ChangePasswordResponses, CreateBackupScheduleData, CreateBackupScheduleResponses, CreateNotificationDestinationData, CreateNotificationDestinationResponses, CreateRepositoryData, CreateRepositoryResponses, CreateVolumeData, CreateVolumeResponses, DeleteBackupScheduleData, DeleteBackupScheduleResponses, DeleteNotificationDestinationData, DeleteNotificationDestinationErrors, DeleteNotificationDestinationResponses, DeleteRepositoryData, DeleteRepositoryResponses, DeleteSnapshotData, DeleteSnapshotResponses, DeleteVolumeData, DeleteVolumeResponses, DoctorRepositoryData, DoctorRepositoryResponses, DownloadResticPasswordData, DownloadResticPasswordResponses, ExportFullConfigData, ExportFullConfigErrors, ExportFullConfigResponses, GetBackupScheduleData, GetBackupScheduleForVolumeData, GetBackupScheduleForVolumeResponses, GetBackupScheduleResponses, GetMeData, GetMeResponses, GetMirrorCompatibilityData, GetMirrorCompatibilityResponses, GetNotificationDestinationData, GetNotificationDestinationErrors, GetNotificationDestinationResponses, GetRepositoryData, GetRepositoryResponses, GetScheduleMirrorsData, GetScheduleMirrorsResponses, GetScheduleNotificationsData, GetScheduleNotificationsResponses, GetSnapshotDetailsData, GetSnapshotDetailsResponses, GetStatusData, GetStatusResponses, GetSystemInfoData, GetSystemInfoResponses, GetVolumeData, GetVolumeErrors, GetVolumeResponses, HealthCheckVolumeData, HealthCheckVolumeErrors, HealthCheckVolumeResponses, ListBackupSchedulesData, ListBackupSchedulesResponses, ListFilesData, ListFilesResponses, ListNotificationDestinationsData, ListNotificationDestinationsResponses, ListRcloneRemotesData, ListRcloneRemotesResponses, ListRepositoriesData, ListRepositoriesResponses, ListSnapshotFilesData, ListSnapshotFilesResponses, ListSnapshotsData, ListSnapshotsResponses, ListVolumesData, ListVolumesResponses, LoginData, LoginResponses, LogoutData, LogoutResponses, MountVolumeData, MountVolumeResponses, RegisterData, RegisterResponses, RestoreSnapshotData, RestoreSnapshotResponses, RunBackupNowData, RunBackupNowResponses, RunForgetData, RunForgetResponses, StopBackupData, StopBackupErrors, StopBackupResponses, TestConnectionData, TestConnectionResponses, TestNotificationDestinationData, TestNotificationDestinationErrors, TestNotificationDestinationResponses, UnmountVolumeData, UnmountVolumeResponses, UpdateBackupScheduleData, UpdateBackupScheduleResponses, UpdateNotificationDestinationData, UpdateNotificationDestinationErrors, UpdateNotificationDestinationResponses, UpdateRepositoryData, UpdateRepositoryErrors, UpdateRepositoryResponses, UpdateScheduleMirrorsData, UpdateScheduleMirrorsResponses, UpdateScheduleNotificationsData, UpdateScheduleNotificationsResponses, UpdateVolumeData, UpdateVolumeErrors, UpdateVolumeResponses } from './types.gen'; export type Options = Options2 & { /** @@ -162,16 +162,6 @@ export const updateVolume = (options: Opti }); }; -/** - * Get containers using a volume by name - */ -export const getContainersUsingVolume = (options: Options) => { - return (options.client ?? client).get({ - url: '/api/v1/volumes/{name}/containers', - ...options - }); -}; - /** * Mount a volume */ diff --git a/app/client/api-client/types.gen.ts b/app/client/api-client/types.gen.ts index 3b0fb9bb..9c04340a 100644 --- a/app/client/api-client/types.gen.ts +++ b/app/client/api-client/types.gen.ts @@ -570,36 +570,6 @@ export type UpdateVolumeResponses = { export type UpdateVolumeResponse = UpdateVolumeResponses[keyof UpdateVolumeResponses]; -export type GetContainersUsingVolumeData = { - body?: never; - path: { - name: string; - }; - query?: never; - url: '/api/v1/volumes/{name}/containers'; -}; - -export type GetContainersUsingVolumeErrors = { - /** - * Volume not found - */ - 404: unknown; -}; - -export type GetContainersUsingVolumeResponses = { - /** - * List of containers using the volume - */ - 200: Array<{ - id: string; - image: string; - name: string; - state: string; - }>; -}; - -export type GetContainersUsingVolumeResponse = GetContainersUsingVolumeResponses[keyof GetContainersUsingVolumeResponses]; - export type MountVolumeData = { body?: never; path: { @@ -2884,8 +2854,8 @@ export type GetSystemInfoResponses = { */ 200: { capabilities: { - docker: boolean; rclone: boolean; + sysAdmin: boolean; }; }; }; diff --git a/app/client/hooks/use-system-info.ts b/app/client/hooks/use-system-info.ts index 852a9015..762d228c 100644 --- a/app/client/hooks/use-system-info.ts +++ b/app/client/hooks/use-system-info.ts @@ -10,7 +10,7 @@ export function useSystemInfo() { }); return { - capabilities: data?.capabilities ?? { docker: false, rclone: false }, + capabilities: data?.capabilities ?? { rclone: false, sysAdmin: false }, isLoading, error, systemInfo: data, diff --git a/app/client/modules/repositories/tabs/info.tsx b/app/client/modules/repositories/tabs/info.tsx index bd198ea8..ac56cbd7 100644 --- a/app/client/modules/repositories/tabs/info.tsx +++ b/app/client/modules/repositories/tabs/info.tsx @@ -87,7 +87,7 @@ export const RepositoryInfoTabContent = ({ repository }: Props) => {

Unique identifier for the repository.

- + field.onChange(v)}> +