Compare commits
4 Commits
a11e6c7254
...
v1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
| be3746e1c3 | |||
| f5473495ce | |||
| 3694184674 | |||
| a0fc91a700 |
+7
-1
@@ -11,7 +11,10 @@ Each heading starts with that `<version>`, once: the app store shows a release t
|
|||||||
whose heading starts with its `x.y.z` and ignores anything after it, so `## [1.0.0-rc.6]` would be
|
whose heading starts with its `x.y.z` and ignores anything after it, so `## [1.0.0-rc.6]` would be
|
||||||
shown under 1.0.0. The git tag of a release candidate goes after the date.
|
shown under 1.0.0. The git tag of a release candidate goes after the date.
|
||||||
|
|
||||||
## [Unreleased]
|
## [1.0.1] - 2026-11-01
|
||||||
|
|
||||||
|
Fixes for what was reported after 1.0.0 (#22, #24) and small improvements. Nothing changes in
|
||||||
|
your backups or settings.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- `occ backup:user:list [location] [user]` shows the user exports on a location, with the manifest
|
- `occ backup:user:list [location] [user]` shows the user exports on a location, with the manifest
|
||||||
@@ -53,6 +56,8 @@ shown under 1.0.0. The git tag of a release candidate goes after the date.
|
|||||||
- A restore that was stopped (a crash, a timeout, a restart) left its half-written temporary file
|
- A restore that was stopped (a crash, a timeout, a restart) left its half-written temporary file
|
||||||
(`<name>.ngb-restore-<id>`) next to the file it was restoring, and a `files:scan` then showed it
|
(`<name>.ngb-restore-<id>`) next to the file it was restoring, and a `files:scan` then showed it
|
||||||
in Files. A restore now removes such leftovers in each folder it writes to.
|
in Files. A restore now removes such leftovers in each folder it writes to.
|
||||||
|
- The app store showed the notes of every release candidate under 1.0.0, because their headings
|
||||||
|
started with "1.0.0-rc". Each heading now starts with the app version of that release.
|
||||||
|
|
||||||
## [1.0.0] - 2026-10-29
|
## [1.0.0] - 2026-10-29
|
||||||
|
|
||||||
@@ -469,6 +474,7 @@ and not implemented yet.
|
|||||||
- See the "Storage backend experiences" section of the README for provider-specific quirks found
|
- See the "Storage backend experiences" section of the README for provider-specific quirks found
|
||||||
so far (e.g. Hetzner Storage Box sub-accounts).
|
so far (e.g. Hetzner Storage Box sub-accounts).
|
||||||
|
|
||||||
|
[1.0.1]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.1
|
||||||
[1.0.0]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0
|
[1.0.0]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0
|
||||||
[0.9.12]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0-rc.6
|
[0.9.12]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0-rc.6
|
||||||
[0.9.11]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0-rc.5
|
[0.9.11]: https://github.com/dillardblom/ng_backup/releases/tag/v1.0.0-rc.5
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ in README "Known limitations":
|
|||||||
gids (SFTP, Storage Box) → rc4 uitbrengen en om tests vragen → zelf een volledige DR van een
|
gids (SFTP, Storage Box) → rc4 uitbrengen en om tests vragen → zelf een volledige DR van een
|
||||||
productie-instantie van ~250 GB via S3 en via SMB. Drie volledige DR-restores vóór 1.0.0.
|
productie-instantie van ~250 GB via S3 en via SMB. Drie volledige DR-restores vóór 1.0.0.
|
||||||
Problemen of meldingen van gebruikers: rc5.
|
Problemen of meldingen van gebruikers: rc5.
|
||||||
- **1.0.1:** alleen de kleine punten (besluit 2026-10-30): 4, 6–13. Punten 1, 2 en 5 gaan naar
|
- **1.0.1** (klaar voor release 2026-11-01): alleen de kleine punten (besluit 2026-10-30): 4, 6–13. Punten 1, 2 en 5 gaan naar
|
||||||
1.0.2 (README-roadmap aangepast); punt 3 is een test, ingepland voor de week van 2 november,
|
1.0.2 (README-roadmap aangepast); punt 3 is een test, ingepland voor de week van 2 november,
|
||||||
niet aangekondigd en los van de release.
|
niet aangekondigd en los van de release.
|
||||||
1. **Naar 1.0.2.** (Naar rc4: herstelsnelheid over SFTP.) S3 leest al 16 tegelijk bij index en tree, maar een
|
1. **Naar 1.0.2.** (Naar rc4: herstelsnelheid over SFTP.) S3 leest al 16 tegelijk bij index en tree, maar een
|
||||||
|
|||||||
@@ -7,11 +7,14 @@ installations and hosted Nextcloud. (Choosing SMB as a storage backend is the on
|
|||||||
see "Storage backend experiences" below — that requirement comes from files_external, not from
|
see "Storage backend experiences" below — that requirement comes from files_external, not from
|
||||||
ng_backup, and applies to any Nextcloud app that writes to an SMB share.)
|
ng_backup, and applies to any Nextcloud app that writes to an SMB share.)
|
||||||
|
|
||||||
**Status: 1.0.0, stable.** Disaster recovery has been tested on real installations (see "Tested
|
**Status: 1.0.1, stable.** Disaster recovery has been tested on real installations (see "Tested
|
||||||
disaster recoveries" below). See "Known limitations" below, `PLAN.md` for the design and
|
disaster recoveries" below). See "Known limitations" below, `PLAN.md` for the design and
|
||||||
`docs/HOWTO.md` for a step-by-step guide from setup to a tested restore. Server lost? See
|
`docs/HOWTO.md` for a step-by-step guide from setup to a tested restore. Server lost? See
|
||||||
`docs/DISASTER-RECOVERY.md`.
|
`docs/DISASTER-RECOVERY.md`.
|
||||||
|
|
||||||
|
If you like NG Backup, don't forget to give the app a star in the
|
||||||
|
[app store](https://apps.nextcloud.com/apps/ng_backup) and this repository a star on GitHub!
|
||||||
|
|
||||||
License: AGPL-3.0-or-later. Developed and sponsored by [Ensembia](https://www.ensembia.com).
|
License: AGPL-3.0-or-later. Developed and sponsored by [Ensembia](https://www.ensembia.com).
|
||||||
Need help restoring a backup after a crash? Ensembia offers paid restore assistance:
|
Need help restoring a backup after a crash? Ensembia offers paid restore assistance:
|
||||||
[www.ensembia.com](https://www.ensembia.com).
|
[www.ensembia.com](https://www.ensembia.com).
|
||||||
@@ -260,15 +263,6 @@ What is planned, without dates. Ideas and votes are welcome in the
|
|||||||
[issues](https://github.com/dillardblom/ng_backup/issues); if something you need is listed here,
|
[issues](https://github.com/dillardblom/ng_backup/issues); if something you need is listed here,
|
||||||
a 👍 on its issue helps decide what comes first.
|
a 👍 on its issue helps decide what comes first.
|
||||||
|
|
||||||
**1.0.1**
|
|
||||||
- An optional label for a backup started with "Back up now".
|
|
||||||
- An explanation in the trash of restore points of what "removed by retention policy" means and
|
|
||||||
until when a restore point can be brought back.
|
|
||||||
- A "Docs" tab on the admin page with links to the how-to, the disaster recovery guide and this
|
|
||||||
roadmap.
|
|
||||||
- Times in `occ` in the administrator's time zone, as on the admin page; restoring a single file
|
|
||||||
with `occ backup:restore --to-directory`.
|
|
||||||
|
|
||||||
**1.0.2**
|
**1.0.2**
|
||||||
- A warning on the admin page and in `occ backup:status` when background jobs do not run on a
|
- A warning on the admin page and in `occ backup:status` when background jobs do not run on a
|
||||||
system cron, with how to set one up. Without cron, a backup started with "Back up now" moves on
|
system cron, with how to set one up. Without cron, a backup started with "Back up now" moves on
|
||||||
|
|||||||
+7
-4
@@ -40,9 +40,12 @@ NG Backup needs Nextcloud's background jobs on system cron (a real cron line, no
|
|||||||
Read "Known limitations" in the README before you rely on it, and test a restore. Feedback is very
|
Read "Known limitations" in the README before you rely on it, and test a restore. Feedback is very
|
||||||
welcome: use the "Share your experience" link on the admin page.
|
welcome: use the "Share your experience" link on the admin page.
|
||||||
|
|
||||||
|
If you like NG Backup, don't forget to give the app a star in the app store and the
|
||||||
|
[repository](https://github.com/dillardblom/ng_backup) a star on GitHub!
|
||||||
|
|
||||||
Developed and sponsored by [Ensembia](https://www.ensembia.com). We can offer (paid) assistance if
|
Developed and sponsored by [Ensembia](https://www.ensembia.com). We can offer (paid) assistance if
|
||||||
you need help with restoring a backup after a crash.]]></description>
|
you need help with restoring a backup after a crash.]]></description>
|
||||||
<version>1.0.0</version>
|
<version>1.0.1</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author mail="dillard.blom@ensembia.com">Dillard Blom</author>
|
<author mail="dillard.blom@ensembia.com">Dillard Blom</author>
|
||||||
<namespace>NgBackup</namespace>
|
<namespace>NgBackup</namespace>
|
||||||
@@ -53,9 +56,9 @@ you need help with restoring a backup after a crash.]]></description>
|
|||||||
<website>https://github.com/dillardblom/ng_backup</website>
|
<website>https://github.com/dillardblom/ng_backup</website>
|
||||||
<bugs>https://github.com/dillardblom/ng_backup/issues</bugs>
|
<bugs>https://github.com/dillardblom/ng_backup/issues</bugs>
|
||||||
<repository type="git">https://github.com/dillardblom/ng_backup</repository>
|
<repository type="git">https://github.com/dillardblom/ng_backup</repository>
|
||||||
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.0/screenshots/1-backups.png</screenshot>
|
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.1/screenshots/1-backups.png</screenshot>
|
||||||
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.0/screenshots/2-restore.png</screenshot>
|
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.1/screenshots/2-restore.png</screenshot>
|
||||||
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.0/screenshots/3-settings.png</screenshot>
|
<screenshot>https://raw.githubusercontent.com/dillardblom/ng_backup/v1.0.1/screenshots/3-settings.png</screenshot>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<php min-version="8.1"/>
|
<php min-version="8.1"/>
|
||||||
<lib>sodium</lib>
|
<lib>sodium</lib>
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ OUT=$(run_on ngb-frt-restore backup:restore:full offsite "$SNAP" "${RESTORE_OPTS
|
|||||||
fail "restore:full"
|
fail "restore:full"
|
||||||
}
|
}
|
||||||
printf '%s\n' "$OUT" | grep -q "maintenance mode while the restore runs" || fail "the restore did not say it runs in maintenance mode"
|
printf '%s\n' "$OUT" | grep -q "maintenance mode while the restore runs" || fail "the restore did not say it runs in maintenance mode"
|
||||||
run_on ngb-frt-restore status 2>&1 | grep -q "maintenance: false" || fail "maintenance mode is still on after the restore"
|
run_on ngb-frt-restore status 2>&1 | grep "maintenance: false" >/dev/null || fail "maintenance mode is still on after the restore"
|
||||||
run_on ngb-frt-restore config:app:get ng_backup restore_full_started >/dev/null 2>&1 && fail "the restore left its 'started' marker behind"
|
run_on ngb-frt-restore config:app:get ng_backup restore_full_started >/dev/null 2>&1 && fail "the restore left its 'started' marker behind"
|
||||||
ok "backup:restore:full completed, in maintenance mode and out of it again"
|
ok "backup:restore:full completed, in maintenance mode and out of it again"
|
||||||
if [ "$DB" = sqlite ]; then
|
if [ "$DB" = sqlite ]; then
|
||||||
@@ -209,7 +209,8 @@ fi
|
|||||||
# Everything below must work in a FRESH occ process (a new PHP process per docker exec), since
|
# Everything below must work in a FRESH occ process (a new PHP process per docker exec), since
|
||||||
# earlier bugs here only showed up after config.php's secret was rewritten mid-restore.
|
# earlier bugs here only showed up after config.php's secret was rewritten mid-restore.
|
||||||
run_on ngb-frt-restore backup:status >/dev/null || fail "backup:status fails after restore (own key/target undecryptable?)"
|
run_on ngb-frt-restore backup:status >/dev/null || fail "backup:status fails after restore (own key/target undecryptable?)"
|
||||||
run_on ngb-frt-restore user:list | grep -q frtest || fail "the backed-up user is missing from the restored database"
|
# not grep -q: it stops reading at the first match, and occ, still writing, then fails (pipefail)
|
||||||
|
run_on ngb-frt-restore user:list | grep frtest >/dev/null || fail "the backed-up user is missing from the restored database"
|
||||||
docker exec ngb-frt-restore test -f /var/www/html/data/frtest/files/Docs/note.txt || fail "restored file is missing"
|
docker exec ngb-frt-restore test -f /var/www/html/data/frtest/files/Docs/note.txt || fail "restored file is missing"
|
||||||
[ "$(docker exec ngb-frt-restore cat /var/www/html/data/frtest/files/Docs/note.txt)" = "hello disaster recovery" ] || fail "restored file content differs"
|
[ "$(docker exec ngb-frt-restore cat /var/www/html/data/frtest/files/Docs/note.txt)" = "hello disaster recovery" ] || fail "restored file content differs"
|
||||||
run_on ngb-frt-restore files:scan frtest >/dev/null || fail "files:scan fails after restore"
|
run_on ngb-frt-restore files:scan frtest >/dev/null || fail "files:scan fails after restore"
|
||||||
|
|||||||
@@ -52,16 +52,17 @@ ok "restore new-folder and replace: files identical, extra file in the trash"
|
|||||||
# One file to a local directory, where a restore that was stopped left its temporary.
|
# One file to a local directory, where a restore that was stopped left its temporary.
|
||||||
ONE=/tmp/ngb-rt-one/data/$U/files/Docs
|
ONE=/tmp/ngb-rt-one/data/$U/files/Docs
|
||||||
$X sh -c "mkdir -p $ONE && echo partial > $ONE/f2.bin.ngb-restore-0123456789ab"
|
$X sh -c "mkdir -p $ONE && echo partial > $ONE/f2.bin.ngb-restore-0123456789ab"
|
||||||
occ backup:restore ci "$SNAP" "data/$U/files/Docs/f2.bin" -d /tmp/ngb-rt-one | grep -q "Restored 1 files" || fail "restore of one file to a directory"
|
occ backup:restore ci "$SNAP" "data/$U/files/Docs/f2.bin" -d /tmp/ngb-rt-one | grep "Restored 1 files" >/dev/null || fail "restore of one file to a directory"
|
||||||
$X sh -c "cmp -s $ONE/f2.bin $DATA/$U/files/Docs/f2.bin" || fail "the file restored to a directory differs"
|
$X sh -c "cmp -s $ONE/f2.bin $DATA/$U/files/Docs/f2.bin" || fail "the file restored to a directory differs"
|
||||||
$X sh -c "ls -A $ONE | grep -q ngb-restore" && fail "the temporary of a stopped restore was left"
|
$X sh -c "ls -A $ONE | grep -q ngb-restore" && fail "the temporary of a stopped restore was left"
|
||||||
ok "restore of one file to a directory; the temporary of a stopped restore removed"
|
ok "restore of one file to a directory; the temporary of a stopped restore removed"
|
||||||
occ backup:status | grep -q "started (" || fail "backup:status does not name the time zone"
|
# not grep -q: it stops reading at the first match, and occ, still writing, then fails (pipefail)
|
||||||
|
occ backup:status | grep "started (" >/dev/null || fail "backup:status does not name the time zone"
|
||||||
ok "backup:status names the time zone of its times"
|
ok "backup:status names the time zone of its times"
|
||||||
|
|
||||||
# Checksum audit: shallow (index presence) and deep (download, decrypt, verify every blob).
|
# Checksum audit: shallow (index presence) and deep (download, decrypt, verify every blob).
|
||||||
occ backup:verify ci "$SNAP" | grep -q "^OK$" || fail "shallow verify"
|
occ backup:verify ci "$SNAP" | grep "^OK$" >/dev/null || fail "shallow verify"
|
||||||
occ backup:verify ci "$SNAP" --deep | grep -q "^OK$" || fail "deep verify"
|
occ backup:verify ci "$SNAP" --deep | grep "^OK$" >/dev/null || fail "deep verify"
|
||||||
ok "shallow and deep checksum audit"
|
ok "shallow and deep checksum audit"
|
||||||
|
|
||||||
# Database dump/restore round trip (all tables, checksums, sequences on PostgreSQL).
|
# Database dump/restore round trip (all tables, checksums, sequences on PostgreSQL).
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ MANIFEST=$(occ backup:user:backup ci "$U" | sed -n 's/.* to \(.*\)\.$/\1/p')
|
|||||||
[ -n "$MANIFEST" ] || fail "backup:user:backup printed no manifest path"
|
[ -n "$MANIFEST" ] || fail "backup:user:backup printed no manifest path"
|
||||||
ok "backed up $U to $MANIFEST"
|
ok "backed up $U to $MANIFEST"
|
||||||
|
|
||||||
occ backup:user:list ci "$U" | grep -qF "$MANIFEST" || fail "backup:user:list does not show $MANIFEST"
|
# not grep -q: it stops reading at the first match, and occ, still writing, then fails (pipefail)
|
||||||
|
occ backup:user:list ci "$U" | grep -F "$MANIFEST" >/dev/null || fail "backup:user:list does not show $MANIFEST"
|
||||||
ok "backup:user:list shows the export"
|
ok "backup:user:list shows the export"
|
||||||
|
|
||||||
# as-backup: restore into <uid>-bak; the original account must stay untouched. $U has one export,
|
# as-backup: restore into <uid>-bak; the original account must stay untouched. $U has one export,
|
||||||
|
|||||||
Reference in New Issue
Block a user