Skip to content

Commit

Permalink
Passing a full duration as retention period is more flexible
Browse files Browse the repository at this point in the history
  • Loading branch information
m90 committed Feb 6, 2025
1 parent 2375607 commit 378217e
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 7 deletions.
1 change: 1 addition & 0 deletions cmd/backup/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type Config struct {
BackupArchive string `split_words:"true" default:"/archive"`
BackupCronExpression string `split_words:"true" default:"@daily"`
BackupRetentionDays int32 `split_words:"true" default:"-1"`
BackupRetentionPeriod time.Duration `split_words:"true"`
BackupPruningLeeway time.Duration `split_words:"true" default:"1m"`
BackupPruningPrefix string `split_words:"true"`
BackupStopContainerLabel string `split_words:"true"`
Expand Down
11 changes: 9 additions & 2 deletions cmd/backup/prune_backups.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,18 @@ import (
// the given configuration. In case the given configuration would delete all
// backups, it does nothing instead and logs a warning.
func (s *script) pruneBackups() error {
if s.c.BackupRetentionDays < 0 {
if s.c.BackupRetentionDays < 0 && s.c.BackupRetentionPeriod == 0 {
return nil
}

deadline := time.Now().AddDate(0, 0, -int(s.c.BackupRetentionDays)).Add(s.c.BackupPruningLeeway)
var deadline time.Time
if s.c.BackupRetentionPeriod != 0 {
deadline = time.Now().Add(-s.c.BackupRetentionPeriod)
} else {
s.logger.Warn("Using BACKUP_RETENTION_DAYS has been deprecated and will be removed in the next major version. Please use BACKUP_RETENTION_PERIOD instead.")
deadline = time.Now().AddDate(0, 0, -int(s.c.BackupRetentionDays))
}
deadline = deadline.Add(s.c.BackupPruningLeeway)

eg := errgroup.Group{}
for _, backend := range s.storages {
Expand Down
4 changes: 4 additions & 0 deletions cmd/backup/script.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,10 @@ func (s *script) init() error {
s.storages = append(s.storages, dropboxBackend)
}

if s.c.BackupRetentionDays > 0 && s.c.BackupRetentionPeriod > 0 {
return errwrap.Wrap(nil, "both BACKUP_RETENTION_DAYS and BACKUP_RETENTION_PERIOD were configured, which are mutually exclusive")
}

if s.c.EmailNotificationRecipient != "" {
emailURL := fmt.Sprintf(
"smtp://%s:%s@%s:%d/?from=%s&to=%s",
Expand Down
7 changes: 5 additions & 2 deletions docs/how-tos/automatically-prune-old-backups.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ nav_order: 3

# Automatically prune old backups

When `BACKUP_RETENTION_DAYS` is configured, the command will check if there are any archives in the remote storage backend(s) or local archive that are older than the given retention value and rotate these backups away.
When `BACKUP_RETENTION_PERIOD` is configured, the command will check if there are any archives in the remote storage backend(s) or local archive that are older than the given retention value and rotate these backups away.
The value is a duration as per Go's [`time.ParseDuration`][duration].

{: .note }
Be aware that this mechanism looks at __all files in the target bucket or archive__, which means that other files that are older than the given deadline are deleted as well.
Expand All @@ -23,7 +24,7 @@ services:
environment:
BACKUP_FILENAME: backup-%Y-%m-%dT%H-%M-%S.tar.gz
BACKUP_PRUNING_PREFIX: backup-
BACKUP_RETENTION_DAYS: '7'
BACKUP_RETENTION_PERIOD: '168h'
volumes:
- ${HOME}/backups:/archive
- data:/backup/my-app-backup:ro
Expand All @@ -32,3 +33,5 @@ services:
volumes:
data:
```
[duration]: https://pkg.go.dev/time#ParseDuration
2 changes: 1 addition & 1 deletion docs/recipes/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ services:
AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
BACKUP_FILENAME: backup-%Y-%m-%dT%H-%M-%S.tar.gz
BACKUP_PRUNING_PREFIX: backup-
BACKUP_RETENTION_DAYS: 7
BACKUP_RETENTION_PERIOD: 168h
volumes:
- data:/backup/my-app-backup:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
Expand Down
5 changes: 3 additions & 2 deletions docs/reference/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,9 +312,10 @@ You can populate below template according to your requirements and use it as you
# removal to certain files.
# Define this value to enable automatic rotation of old backups. The value
# declares the number of days for which a backup is kept.
# declares the duration for which a backup is kept. It is formatted as per
# https://pkg.go.dev/time#ParseDuration
# BACKUP_RETENTION_DAYS="7"
# BACKUP_RETENTION_PERIOD="168h"
# In case the duration a backup takes fluctuates noticeably in your setup
# you can adjust this setting to make sure there are no race conditions
Expand Down

0 comments on commit 378217e

Please sign in to comment.