97 Commits

Author SHA1 Message Date
Nico
e506047415 test: add property-based tests with fast-check (#832) 2026-04-25 09:35:28 +02:00
Nico
e2c9ef0518 chore: fixed unused types (#824) 2026-04-22 22:04:46 +02:00
Nico
a0c34ee48d chore: cleanup un-used exports (#823) 2026-04-22 21:14:37 +02:00
Nico
63b08a4b71 feat(backups): ensure volume readiness before backup (#815)
* feat(backups): ensure volume readiness before backup

Backup preflight checks were relying on a db cached status. Now a real
volume healthcheck is performed before backing up. Closes #811 #695

* chore: fix ci
2026-04-20 21:18:29 +02:00
Eric Hess
d2f65716fe feat(mirrors): add selective snapshot sync to mirror repositories (#755)
* feat(mirrors): add selective snapshot sync to mirror repositories

Allow users to sync missing snapshots from the source repository to a
mirror. A new sync button per mirror opens a dialog showing which
snapshots are missing, with checkboxes to select which ones to copy.

- Add GET /:shortId/mirrors/:mirrorShortId/status endpoint to compare
  snapshots between source and mirror repositories
- Add POST /:shortId/mirrors/:mirrorShortId/sync endpoint accepting
  selected snapshotIds in the request body
- Extend restic copy command to accept multiple snapshotIds
- Add sync preview dialog with snapshot selection to the frontend

* refactor: stylistic changes

---------

Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-04-16 21:28:48 +02:00
Nico
33601dde24 feat(agent): add standalone agent runtime (#776)
* feat(agent): add standalone agent runtime

* fix(agent): add Bun and DOM types to agent tsconfig

* refactor: wrap backup error in a tagged effect error

* feat(controller): add agent manager and session handling

* feat(backups): execute backups through the agent

* fix(agent): harden disconnect and send-failure handling

* fix: rebase conflicts

* test: simplify mocks

* refactor: split agent runtime state

* fix(backup): keep old path when agent is disabled

* fix: pr feedbacks
2026-04-13 23:29:10 +02:00
Nicolas Meienberger
76ac78c40c chore: fix ts issues in test files 2026-04-12 11:39:06 +02:00
Nicolas Meienberger
832425025f refactor(backup): move retry delay minutes conversion at the contract level 2026-04-12 11:28:39 +02:00
Nicolas Meienberger
ed046f284d fix(backup): reset failure count on cancel 2026-04-12 10:39:14 +02:00
DerPenz
8765c5e705 feature(backup): do not trigger retry on manual backup 2026-04-12 09:49:35 +02:00
DerPenz
11bb95db92 fix(backup): retry wont be scheduled if it is after the next scheduled backup 2026-04-12 09:49:35 +02:00
DerPenz
5d8c2925d8 fix(backup): resetting failureRetryCount if backup is not retried 2026-04-12 09:49:35 +02:00
DerPenz
61396625f1 fix(backup): added limits in zod schema 2026-04-12 09:49:35 +02:00
DerPenz
b2728cb09a fix(backup): removed useless null checks 2026-04-12 09:49:35 +02:00
DerPenz
0476dcebb8 fix(backup): updating new settings correctly in the db 2026-04-12 09:49:35 +02:00
DerPenz
79b7733e1e fix(backup): updated types gen 2026-04-12 09:49:35 +02:00
DerPenz
7e9b1fafa3 feat(backup): added retry policy into job settings 2026-04-12 09:49:35 +02:00
DerPenz
feb69ef7a7 feat(backup): retry backup on failure 2026-04-12 09:49:35 +02:00
Nico
c371676ad0 feat(agent): add standalone agent runtime (#761)
* feat(agent): add standalone agent runtime

* fix(backups): bridge local executor to Effect restic API

* fix(agent): add Bun and DOM types to agent tsconfig

* refactor: wrap backup error in a tagged effect error

* fix: pr feedbacks
2026-04-08 20:47:15 +02:00
Nico
a4e54ac527 fix: serialize mirror copy operations per destination repository (#747)
* fix: serialize mirror copy operations per destination repository

* refactor(copy-mirror): implement acquireMany to avoid deadlock cycles
2026-04-04 17:12:45 +02:00
Nico
4305057185 test: move test runner from Bun to Vitest (#727)
* chore: migrate to vitest

* test: speed up some suites by sharing sessions and mocking expensive non-tested actions

* test: refactor some tests to verify behavior instead of implementation details

* chore: fix linting issues
2026-04-01 20:05:54 +02:00
Nicolas Meienberger
e265f7d478 test: fix flaky test depending on mutex timing 2026-04-01 09:27:13 +02:00
Nico
2a219ac042 refactor(backups): consolidate execution into service helpers (#717) 2026-03-29 12:57:47 +02:00
Nico
866a3c63e8 feat: manual backup option (#713)
Closes #710
2026-03-26 19:35:18 +01:00
Nico
05dd440dea fix(restic): separate error summary from diagnostic details (#694) 2026-03-21 20:50:23 +01:00
Nico
a039bb478e fix: separate raw include paths and patterns (#683)
Separate include patters and included path cleanly to avoid path with special characters to be expanded. Closes https://github.com/nicotsx/zerobyte/discussions/680

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **New Features**
  * Added ability to select specific directories and paths for inclusion in backup schedules, separate from pattern-based rules.

* **Bug Fixes & Improvements**
  * Automatically migrates existing backup configurations to work with the new path selection system.
  * Enhanced backup restoration to properly handle both selected paths and pattern-based inclusions.

* **Chores**
  * Updated database schema to support path selections in backup schedules.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-20 19:27:54 +01:00
Nico
f6f17cd61c fix: backup progress use simple polling & cache (#678)
#593
2026-03-18 20:25:30 +01:00
Nico
429b69ec92 fix: show back warnings logs and surface in UI (#677)
fix: show back warnings logs and surface in UI

#544

chore: fix dev login issue
2026-03-18 20:21:14 +01:00
Nico
e39220c024 fix: allow quoted urls in env variables (#676) 2026-03-17 22:09:22 +01:00
Nicolas Meienberger
66f95dcd8e fix: reject include patterns that are not in the volume root 2026-03-12 20:17:40 +01:00
Nico
332e5bffda refactor: extract restic in core package (#651)
* refactor: extract restic in core package

* chore: add turbo task runner

* refactor: split server utils

* chore: simplify withDeps signature and fix non-null assertion
2026-03-11 21:56:07 +01:00
Nico
df312cd419 refactor: move from arktype to zod (#637)
chore: gen api-client
2026-03-09 18:27:03 +01:00
Nicolas Meienberger
3d2900ab69 refactor: harden cron validation and fail early in case of wrong pattern 2026-03-08 12:47:19 +01:00
Nico
6769f5fa6c fix: run repo stats in background (#620)
Closes #614
2026-03-05 20:18:34 +01:00
Nicolas Meienberger
157be2d6ab feat: custom flags allowlist 2026-03-04 19:42:08 +01:00
Nicolas Meienberger
5f6409e0a5 test: increase coverage for existing controllers 2026-03-04 18:48:47 +01:00
Nico
c606099104 test: use better-auth built-in test plugin (#599)
test: use better-auth built-in test plugin

refactor: map auth errors server side

refactor: native trusted providers callback usage

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

## Release Notes

* **New Features**
  * Enhanced SSO authentication error messaging with specific guidance for different failure scenarios (account linking required, email verification needed, banned accounts, invite-only access).

* **Chores**
  * Updated authentication dependencies to version 1.5.0.

* **Tests**
  * Extended test coverage for SSO error code handling and authentication scenarios.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-04 18:48:47 +01:00
Nico
12454ee401 fix: restic glob pattern in include (#594)
Closes #590

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

* **Tests**
  * Enhanced test coverage for backup pattern handling and anchoring
  * Added end-to-end scenarios validating include patterns, exclusion patterns, and exclude-if-present functionality

* **Refactor**
  * Updated pattern processing logic to improve relative path resolution for backup patterns
  * Improved asynchronous handling in backup initialization workflow

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-04 18:48:47 +01:00
bcrooker
ef51d665c8 feat(backups): add custom restic params to backup schedules
Allows users to pass arbitrary restic flags via a new advanced section in the create/edit schedule form. Includes DB migration, schema update, DTO, service, and restic command changes.
2026-02-27 14:46:47 -05:00
Nico
942bf2b31b refactor: tests (#585)
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **Tests**
  * Improved test infrastructure and organization across backup, repository, volume, and utility modules with streamlined mock setup and cleaner test patterns.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-26 19:54:25 +01:00
Nico
4a812a884b refactor(restic): split each command into its own file (#584)
refactor(restic): split each command into its own file

refactor: add missing await before promise expects

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

## Release Notes

* **Tests**
  * Improved async assertion handling across test suites for enhanced test reliability
  * Expanded test coverage for backup, restore, and other core operations

* **Refactor**
  * Reorganized internal utility structure for improved code maintainability

* **Chores**
  * Updated linting configuration and TypeScript dependencies

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-26 19:51:24 +01:00
Nico
c4f3300e9b fix(backups): correctly resolve paths when folder name matches volume name (#576)
When a selected subfolder had the exact same name as its parent volume
mount, the `path.relative` check falsely identified the subfolder path
as an absolute path already inside the volume. This caused the entire
volume root to be backed up instead of the intended subfolder.

Closes #250

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **Bug Fixes**
  * Improved handling of backup patterns when folder names match volume names.
  * Enhanced error handling for snapshot deletion operations.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-25 19:09:32 +01:00
Nico
cb92d36c95 feat: cache backup progress (#571)
Closes #412
2026-02-25 18:20:08 +01:00
Nico
a0a813ed09 refactor: short id branded type (#552)
* refactor: short id branded type

* chore: pr feedbacks
2026-02-21 11:16:15 +01:00
Nico
45fd9f9de1 feat: repository used space (#551)
* feat: repository used space

refactor: use a smarter cache key logic for easier invalidations

* chore: pr feedbacks
2026-02-21 10:52:55 +01:00
Nico
8681ebc0c0 refactor: always use short id in api calls (#545) 2026-02-19 20:08:40 +01:00
Nico
8fcd446926 refactor: snapshot strip out base path (#542)
* refactor: strip out volume path in snapshot list / restore

chore: lint issue

* test: backups new include patterns
2026-02-18 21:45:19 +01:00
Nico
ebfafa4143 fix(repositories): append short id when using the default path for local repos (#536) 2026-02-17 18:28:33 +01:00
Nicolas Meienberger
0bbdbc85ad Reapply "chore(deps): bump drizzle-orm from 1.0.0-beta.9-e89174b to 1.0.0-beta.15-859cf75 (#501)"
This reverts commit db163a1bb5.
2026-02-17 17:52:25 +01:00
Nicolas Meienberger
7bcf380198 test: fix impossible test scenarios 2026-02-16 23:20:33 +01:00