kamal-backup 0.3.0.beta2 → 0.3.0.beta4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55945234709fcf743588fe6fadf7873ff43dcc832a2bc8303e42ba67e15c13db
4
- data.tar.gz: a3e05e3428bdcceafa37d2dc2f0cdea53d50e204f7c9345e38308be0085ba9ea
3
+ metadata.gz: 78778951b0506ad5ef03f4e644f19a76ab1f7a882512f2a65cf23e1e53557669
4
+ data.tar.gz: 24c346091e522d02a9233bdffec2b86e7acc3e704485498039d6506fc9780f77
5
5
  SHA512:
6
- metadata.gz: f23ce66cf13a8b420d6171e16489f2c4e2bc44c522b222637eac0ac809e1092e8634396589a1ea4b58c9f01e3ef446f57e4b8f38a157be3423e482cbe8bd2e9a
7
- data.tar.gz: 103ff0d7ffb950b7f6927a8c22591e7f91c8cc06d5456bb04a6b119eda21f7198aa949375d19e3689040db34c8c2a4dc8ed4b2ab6e59911672e4b9033b700fe5
6
+ metadata.gz: a7642dd936a98360f3fb2230a7886878342ba4bb5c68df5ee250bb11ad6d917cfafcc72f86a9d5759edba35d928c298d4639eabab0b252ed54bf2f1e7fad67af
7
+ data.tar.gz: 24bd2e79792381abf43a3f9f846eb2665596d1b67e4a47cd687717009c119ab51a830447ee52dc37ce40ae10da19bc08ce0d75ce2dccf1d1cf3e289c910ecdc3
@@ -592,6 +592,8 @@ module KamalBackup
592
592
  end
593
593
  end
594
594
 
595
+ env.merge!(normalize_yaml_restic_rest(hash["rest"], raw_env: raw_env, path: path)) if hash.key?("rest")
596
+
595
597
  {
596
598
  "init_if_missing" => "RESTIC_INIT_IF_MISSING",
597
599
  "check_after_backup" => "RESTIC_CHECK_AFTER_BACKUP",
@@ -635,6 +637,16 @@ module KamalBackup
635
637
  end
636
638
  end
637
639
 
640
+ def normalize_yaml_restic_rest(raw_value, raw_env:, path:)
641
+ hash = require_mapping(raw_value, "#{path} restic.rest")
642
+ env = {}
643
+ username = hash.key?("username") ? hash["username"] : hash["user"]
644
+
645
+ env["RESTIC_REST_USERNAME"] = resolve_yaml_value(username, raw_env: raw_env, context: "#{path} restic.rest.username") if username
646
+ env["RESTIC_REST_PASSWORD"] = resolve_yaml_value(hash["password"], raw_env: raw_env, context: "#{path} restic.rest.password") if hash.key?("password")
647
+ env.compact
648
+ end
649
+
638
650
  def normalize_yaml_backup(raw_value, path:)
639
651
  hash = require_mapping(raw_value, "#{path} backup")
640
652
  env = {}
@@ -75,9 +75,11 @@ module KamalBackup
75
75
  end
76
76
 
77
77
  def forget_after_success
78
- args = ["forget", "--prune"] + config.retention_args + tag_args(common_tags)
79
- log("running restic forget/prune with retention policy")
80
- run(args)
78
+ retention_tag_sets.each do |tags|
79
+ args = ["forget", "--prune", "--group-by", "host"] + config.retention_args + filter_tag_args(tags)
80
+ log("running restic forget/prune with retention policy for #{retention_scope(tags)}")
81
+ run(args)
82
+ end
81
83
  end
82
84
 
83
85
  def check
@@ -93,11 +95,11 @@ module KamalBackup
93
95
  end
94
96
 
95
97
  def snapshots(tags: common_tags)
96
- run(["snapshots"] + tag_args(tags))
98
+ run(["snapshots"] + filter_tag_args(tags))
97
99
  end
98
100
 
99
101
  def snapshots_json(tags: common_tags)
100
- output = run(["snapshots", "--json"] + tag_args(tags)).stdout
102
+ output = run(["snapshots", "--json"] + filter_tag_args(tags)).stdout
101
103
  snapshots = JSON.parse(output)
102
104
  required_tags = tags.compact
103
105
  snapshots.select do |snapshot|
@@ -181,10 +183,41 @@ module KamalBackup
181
183
  end
182
184
 
183
185
  private
186
+ def retention_tag_sets
187
+ database_retention_tag_sets + file_retention_tag_sets
188
+ end
189
+
190
+ def database_retention_tag_sets
191
+ config.databases.group_by(&:database_adapter).flat_map do |adapter, databases|
192
+ if databases.one?
193
+ # Pre-0.3 database snapshots did not include database:<name>, so keep
194
+ # the single-database filter broad enough for retention to prune them.
195
+ [common_tags + ["type:database", "adapter:#{adapter}"]]
196
+ else
197
+ databases.map do |database|
198
+ common_tags + ["type:database", "database:#{database.database_name}", "adapter:#{adapter}"]
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ def file_retention_tag_sets
205
+ config.backup_paths.any? ? [common_tags + ["type:files"]] : []
206
+ end
207
+
208
+ def retention_scope(tags)
209
+ tags.reject { |tag| tag == "kamal-backup" || tag.start_with?("app:") }.join(", ")
210
+ end
211
+
184
212
  def tag_args(tags)
185
213
  tags.compact.each_with_object([]) { |tag, args| args.concat(["--tag", tag]) }
186
214
  end
187
215
 
216
+ def filter_tag_args(tags)
217
+ tags = tags.compact
218
+ tags.empty? ? [] : ["--tag", tags.join(",")]
219
+ end
220
+
188
221
  def restic_env
189
222
  config.env.each_with_object({}) do |(key, value), env|
190
223
  env[key] = value if key.to_s.match?(RESTIC_ENV_PATTERN)
@@ -1,3 +1,3 @@
1
1
  module KamalBackup
2
- VERSION = "0.3.0.beta2"
2
+ VERSION = "0.3.0.beta4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamal-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.beta2
4
+ version: 0.3.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - crmne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-05-27 00:00:00.000000000 Z
11
+ date: 2026-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor