kamal-backup 0.3.0.beta4 → 0.3.0.beta5

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: 78778951b0506ad5ef03f4e644f19a76ab1f7a882512f2a65cf23e1e53557669
4
- data.tar.gz: 24c346091e522d02a9233bdffec2b86e7acc3e704485498039d6506fc9780f77
3
+ metadata.gz: 0b92197e0f2d480ca2cebd5e2505304686b739ca0ed4c61c24b4b4caca39054d
4
+ data.tar.gz: ff2b00e495d6690956d1ed8070bc43989ca1a9e4b9846b6503ababa26adbd01f
5
5
  SHA512:
6
- metadata.gz: a7642dd936a98360f3fb2230a7886878342ba4bb5c68df5ee250bb11ad6d917cfafcc72f86a9d5759edba35d928c298d4639eabab0b252ed54bf2f1e7fad67af
7
- data.tar.gz: 24bd2e79792381abf43a3f9f846eb2665596d1b67e4a47cd687717009c119ab51a830447ee52dc37ce40ae10da19bc08ce0d75ce2dccf1d1cf3e289c910ecdc3
6
+ metadata.gz: c8f93d59add03f4bf66b48ae0ea61cf46c7682c527ac604fcbd98a8c0790e6cc77d9d45759fabbfb5d6fcbce25da0e82b421f56cc8771820c57b1933539634c2
7
+ data.tar.gz: ebd54357f4bdc1829a71cb76fcef4e60000661ce7eb8f4d1a974fb22438b1054fe96bfa26095509d74fd50e5a13d5e234fa0c845440c8f33ddfd49e798b307f4
data/README.md CHANGED
@@ -141,7 +141,7 @@ Run the release helper from a clean `master` checkout:
141
141
  bin/release 0.2.9
142
142
  ```
143
143
 
144
- It updates `lib/kamal_backup/version.rb`, runs the test suite and docs build, commits `Release 0.2.9`, and pushes `master`. CI publishes the RubyGem and Docker image tags first, then creates `v0.2.9`, the GitHub release, and the docs deployment from the release commit.
144
+ It updates `lib/kamal_backup/version.rb`, syncs `Gemfile.lock`, commits `Release 0.2.9`, and pushes `master`. CI runs the test suite and docs build, publishes the RubyGem and Docker image tags, then creates `v0.2.9`, the GitHub release, and the docs deployment from the release commit.
145
145
 
146
146
  Use `bin/release 0.2.9 --no-push` to prepare the commit locally without publishing.
147
147
 
@@ -31,10 +31,9 @@ module KamalBackup
31
31
  config.validate_backup
32
32
  require_restic!
33
33
 
34
- timestamp = current_timestamp
35
34
  restic.ensure_repository
36
- databases.each { |database| database.backup(restic, timestamp) }
37
- restic.backup_paths(config.backup_paths, tags: ["type:files", "run:#{timestamp}"])
35
+ databases.each { |database| database.backup(restic) }
36
+ restic.backup_paths(config.backup_paths, tags: ["type:files"])
38
37
 
39
38
  if config.forget_after_backup?
40
39
  restic.forget_after_success
@@ -135,10 +134,6 @@ module KamalBackup
135
134
  end
136
135
 
137
136
  private
138
- def current_timestamp
139
- Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
140
- end
141
-
142
137
  def build_restore_result(scope, snapshot)
143
138
  started_at = Time.now.utc
144
139
  result = Schema.record(
@@ -24,11 +24,11 @@ module KamalBackup
24
24
  @redactor = redactor
25
25
  end
26
26
 
27
- def backup(restic, timestamp)
27
+ def backup(restic)
28
28
  restic.backup_stream(
29
29
  dump_command,
30
- filename: database_filename(timestamp),
31
- tags: backup_tags(timestamp)
30
+ filename: database_filename,
31
+ tags: backup_tags
32
32
  )
33
33
  end
34
34
 
@@ -41,14 +41,14 @@ module KamalBackup
41
41
  restic.pipe_dump_to_command(snapshot, filename, scratch_restore_command(target))
42
42
  end
43
43
 
44
- def database_filename(timestamp)
44
+ def database_filename
45
45
  app = config.app_name.gsub(/[^A-Za-z0-9_.-]+/, "-")
46
46
  database = config.database_name.gsub(/[^A-Za-z0-9_.-]+/, "-")
47
- "databases-#{app}-#{database}-#{adapter_name}-#{timestamp}.#{dump_extension}"
47
+ "databases/#{app}/#{database}/#{adapter_name}.#{dump_extension}"
48
48
  end
49
49
 
50
- def backup_tags(timestamp)
51
- ["type:database", "database:#{config.database_name}", "adapter:#{adapter_name}", "run:#{timestamp}"]
50
+ def backup_tags
51
+ ["type:database", "database:#{config.database_name}", "adapter:#{adapter_name}"]
52
52
  end
53
53
 
54
54
  def adapter_name
@@ -13,7 +13,7 @@ module KamalBackup
13
13
  "sqlite3"
14
14
  end
15
15
 
16
- def backup(restic, timestamp)
16
+ def backup(restic)
17
17
  source = sqlite_source
18
18
  Tempfile.create(["kamal-backup-", ".sqlite3"]) do |tempfile|
19
19
  tempfile.close
@@ -23,8 +23,8 @@ module KamalBackup
23
23
  )
24
24
  restic.backup_file(
25
25
  tempfile.path,
26
- filename: database_filename(timestamp),
27
- tags: backup_tags(timestamp)
26
+ filename: database_filename,
27
+ tags: backup_tags
28
28
  )
29
29
  end
30
30
  end
@@ -28,7 +28,7 @@ module KamalBackup
28
28
 
29
29
  def backup_stream(command, filename:, tags:)
30
30
  restic_command = CommandSpec.new(
31
- argv: ["restic", "backup", "--stdin", "--stdin-filename", filename] + tag_args(common_tags + tags),
31
+ argv: ["restic", "backup"] + host_args + ["--stdin", "--stdin-filename", filename] + tag_args(common_tags + tags),
32
32
  env: restic_env
33
33
  )
34
34
  log("backing up stream as #{filename}")
@@ -37,7 +37,7 @@ module KamalBackup
37
37
 
38
38
  def backup_file(path, filename:, tags:)
39
39
  command = CommandSpec.new(
40
- argv: ["restic", "backup", "--stdin", "--stdin-filename", filename] + tag_args(common_tags + tags),
40
+ argv: ["restic", "backup"] + host_args + ["--stdin", "--stdin-filename", filename] + tag_args(common_tags + tags),
41
41
  env: restic_env
42
42
  )
43
43
  log("backing up file content as #{filename}")
@@ -66,7 +66,7 @@ module KamalBackup
66
66
  if paths.any?
67
67
  path_tags = paths.map { |path| "path:#{config.backup_path_label(path)}" }
68
68
  log("backing up #{paths.size} file path(s): #{paths.join(", ")}")
69
- run(["backup"] + paths + tag_args(common_tags + tags + path_tags))
69
+ run(["backup"] + host_args + paths + tag_args(common_tags + tags + path_tags))
70
70
  end
71
71
  end
72
72
 
@@ -128,13 +128,15 @@ module KamalBackup
128
128
  legacy_prefix = "databases/#{config.app_name}/#{adapter}/"
129
129
  app = config.app_name.gsub(/[^A-Za-z0-9_.-]+/, "-")
130
130
  database = database_name.to_s.gsub(/[^A-Za-z0-9_.-]+/, "-")
131
+ stable_prefix = database.empty? ? nil : "databases/#{app}/#{database}/#{adapter}."
131
132
  flat_prefix = "databases-#{app}-#{adapter}-"
132
133
  named_flat_prefix = database.empty? ? nil : "databases-#{app}-#{database}-#{adapter}-"
133
134
  ls_json(snapshot).find do |entry|
134
135
  next false unless entry["type"] == "file"
135
136
 
136
137
  normalized = entry["path"].to_s.sub(%r{\A/+}, "")
137
- normalized.start_with?(legacy_prefix) ||
138
+ (stable_prefix && normalized.start_with?(stable_prefix)) ||
139
+ normalized.start_with?(legacy_prefix) ||
138
140
  File.basename(normalized).start_with?(flat_prefix) ||
139
141
  (named_flat_prefix && File.basename(normalized).start_with?(named_flat_prefix))
140
142
  end&.fetch("path")
@@ -213,6 +215,19 @@ module KamalBackup
213
215
  tags.compact.each_with_object([]) { |tag, args| args.concat(["--tag", tag]) }
214
216
  end
215
217
 
218
+ def host_args
219
+ ["--host", restic_host]
220
+ end
221
+
222
+ def restic_host
223
+ normalize_restic_host([config.app_name, config.accessory_name || "backup"].compact.join("-"))
224
+ end
225
+
226
+ def normalize_restic_host(value)
227
+ normalized = value.to_s.gsub(/[^A-Za-z0-9_.-]+/, "-").gsub(/\A-+|-+\z/, "")
228
+ normalized.empty? ? "kamal-backup" : normalized
229
+ end
230
+
216
231
  def filter_tag_args(tags)
217
232
  tags = tags.compact
218
233
  tags.empty? ? [] : ["--tag", tags.join(",")]
@@ -1,3 +1,3 @@
1
1
  module KamalBackup
2
- VERSION = "0.3.0.beta4"
2
+ VERSION = "0.3.0.beta5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamal-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.beta4
4
+ version: 0.3.0.beta5
5
5
  platform: ruby
6
6
  authors:
7
7
  - crmne