kitsune-kit 0.4.0 → 0.5.0

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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +117 -2
  3. data/CONTRIBUTING.md +83 -0
  4. data/README.md +108 -136
  5. data/SECURITY.md +25 -0
  6. data/bin/kit +4 -1
  7. data/docs/architecture/decisions/0001-product-boundary.md +23 -0
  8. data/docs/architecture/decisions/0002-core-and-interfaces.md +23 -0
  9. data/docs/architecture/decisions/0003-configuration-state-and-secrets.md +23 -0
  10. data/docs/architecture/decisions/0004-supported-platforms.md +19 -0
  11. data/docs/architecture/decisions/0005-operation-semantics.md +19 -0
  12. data/docs/architecture/decisions/0006-tui-backend.md +21 -0
  13. data/docs/architecture/provider-adapters.md +49 -0
  14. data/docs/architecture.md +89 -0
  15. data/docs/commands.md +210 -0
  16. data/docs/configuration.md +210 -0
  17. data/docs/getting-started.md +133 -0
  18. data/docs/providers/digitalocean.md +52 -0
  19. data/docs/releasing.md +43 -0
  20. data/docs/roadmap.md +46 -0
  21. data/docs/security-audit.md +130 -0
  22. data/docs/security.md +116 -0
  23. data/docs/services/postgres.md +78 -0
  24. data/docs/services/redis.md +53 -0
  25. data/docs/testing.md +200 -0
  26. data/docs/troubleshooting.md +123 -0
  27. data/docs/tui.md +57 -0
  28. data/lib/kitsune/kit/adapters/confirming_host_key_verifier.rb +42 -0
  29. data/lib/kitsune/kit/adapters/digitalocean_provider.rb +217 -0
  30. data/lib/kitsune/kit/adapters/fake_clock.rb +34 -0
  31. data/lib/kitsune/kit/adapters/fake_provider.rb +107 -0
  32. data/lib/kitsune/kit/adapters/fake_reporter.rb +34 -0
  33. data/lib/kitsune/kit/adapters/fake_secret_store.rb +35 -0
  34. data/lib/kitsune/kit/adapters/fake_state_store.rb +91 -0
  35. data/lib/kitsune/kit/adapters/fake_transport.rb +56 -0
  36. data/lib/kitsune/kit/adapters/net_ssh_transport.rb +155 -0
  37. data/lib/kitsune/kit/adapters/provider.rb +34 -0
  38. data/lib/kitsune/kit/adapters/transport.rb +22 -0
  39. data/lib/kitsune/kit/adapters/transport_factory.rb +116 -0
  40. data/lib/kitsune/kit/application.rb +170 -0
  41. data/lib/kitsune/kit/cancellation.rb +21 -0
  42. data/lib/kitsune/kit/cli.rb +802 -64
  43. data/lib/kitsune/kit/clock.rb +11 -0
  44. data/lib/kitsune/kit/configuration.rb +493 -0
  45. data/lib/kitsune/kit/errors.rb +98 -0
  46. data/lib/kitsune/kit/events.rb +55 -0
  47. data/lib/kitsune/kit/operations/ensure_dns_records.rb +165 -0
  48. data/lib/kitsune/kit/operations/ensure_server.rb +135 -0
  49. data/lib/kitsune/kit/operations/ensure_service.rb +285 -0
  50. data/lib/kitsune/kit/operations/remote_script.rb +214 -0
  51. data/lib/kitsune/kit/operations/service_backup.rb +71 -0
  52. data/lib/kitsune/kit/operations/service_files.rb +127 -0
  53. data/lib/kitsune/kit/operations/service_firewall.rb +190 -0
  54. data/lib/kitsune/kit/operations/service_state.rb +59 -0
  55. data/lib/kitsune/kit/plan.rb +72 -0
  56. data/lib/kitsune/kit/reporters/human.rb +89 -0
  57. data/lib/kitsune/kit/reporters/json.rb +65 -0
  58. data/lib/kitsune/kit/reporters/reporter.rb +11 -0
  59. data/lib/kitsune/kit/result.rb +28 -0
  60. data/lib/kitsune/kit/run_journal.rb +102 -0
  61. data/lib/kitsune/kit/run_logger.rb +37 -0
  62. data/lib/kitsune/kit/scripts/docker.sh +137 -0
  63. data/lib/kitsune/kit/scripts/firewall.sh +205 -0
  64. data/lib/kitsune/kit/scripts/metrics.sh +54 -0
  65. data/lib/kitsune/kit/scripts/ssh.sh +95 -0
  66. data/lib/kitsune/kit/scripts/swap.sh +86 -0
  67. data/lib/kitsune/kit/scripts/unattended.sh +81 -0
  68. data/lib/kitsune/kit/scripts/user.sh +114 -0
  69. data/lib/kitsune/kit/secret_filter.rb +54 -0
  70. data/lib/kitsune/kit/secret_store.rb +32 -0
  71. data/lib/kitsune/kit/secret_stores/store.rb +12 -0
  72. data/lib/kitsune/kit/service_compose.rb +72 -0
  73. data/lib/kitsune/kit/state_store.rb +158 -0
  74. data/lib/kitsune/kit/state_stores/store.rb +15 -0
  75. data/lib/kitsune/kit/tui/actions.rb +72 -0
  76. data/lib/kitsune/kit/tui/application.rb +35 -0
  77. data/lib/kitsune/kit/tui/controller.rb +162 -0
  78. data/lib/kitsune/kit/tui/renderer.rb +134 -0
  79. data/lib/kitsune/kit/tui/state.rb +18 -0
  80. data/lib/kitsune/kit/tui/store.rb +88 -0
  81. data/lib/kitsune/kit/tui/terminal.rb +95 -0
  82. data/lib/kitsune/kit/version.rb +1 -1
  83. data/lib/kitsune/kit/workflows/apply_plan.rb +145 -0
  84. data/lib/kitsune/kit/workflows/base.rb +31 -0
  85. data/lib/kitsune/kit/workflows/build_plan.rb +33 -0
  86. data/lib/kitsune/kit/workflows/destroy_server.rb +84 -0
  87. data/lib/kitsune/kit/workflows/doctor.rb +225 -0
  88. data/lib/kitsune/kit/workflows/environment_selection.rb +70 -0
  89. data/lib/kitsune/kit/workflows/import_server.rb +100 -0
  90. data/lib/kitsune/kit/workflows/initialize_project.rb +121 -0
  91. data/lib/kitsune/kit/workflows/inspect_environment.rb +44 -0
  92. data/lib/kitsune/kit/workflows/rollback.rb +54 -0
  93. data/lib/kitsune/kit/workflows/support_bundle.rb +82 -0
  94. data/lib/kitsune/kit.rb +41 -2
  95. metadata +122 -79
  96. data/.rspec +0 -3
  97. data/Rakefile +0 -8
  98. data/kitsune-kit-logo.jpg +0 -0
  99. data/lib/kitsune/blueprints/.env.template +0 -31
  100. data/lib/kitsune/blueprints/docker/postgres.yml +0 -27
  101. data/lib/kitsune/blueprints/docker/redis.yml +0 -23
  102. data/lib/kitsune/blueprints/kit.env.template +0 -1
  103. data/lib/kitsune/kit/ansi_color.rb +0 -78
  104. data/lib/kitsune/kit/commands/bootstrap.rb +0 -134
  105. data/lib/kitsune/kit/commands/bootstrap_docker.rb +0 -66
  106. data/lib/kitsune/kit/commands/dns.rb +0 -112
  107. data/lib/kitsune/kit/commands/init.rb +0 -148
  108. data/lib/kitsune/kit/commands/install_docker_engine.rb +0 -146
  109. data/lib/kitsune/kit/commands/postinstall_docker.rb +0 -142
  110. data/lib/kitsune/kit/commands/provision.rb +0 -43
  111. data/lib/kitsune/kit/commands/setup_do_metrics.rb +0 -123
  112. data/lib/kitsune/kit/commands/setup_docker_prereqs.rb +0 -151
  113. data/lib/kitsune/kit/commands/setup_firewall.rb +0 -132
  114. data/lib/kitsune/kit/commands/setup_postgres_docker.rb +0 -246
  115. data/lib/kitsune/kit/commands/setup_redis_docker.rb +0 -241
  116. data/lib/kitsune/kit/commands/setup_swap.rb +0 -151
  117. data/lib/kitsune/kit/commands/setup_unattended.rb +0 -132
  118. data/lib/kitsune/kit/commands/setup_user.rb +0 -189
  119. data/lib/kitsune/kit/commands/ssh.rb +0 -46
  120. data/lib/kitsune/kit/commands/switch_env.rb +0 -42
  121. data/lib/kitsune/kit/defaults.rb +0 -91
  122. data/lib/kitsune/kit/env_loader.rb +0 -41
  123. data/lib/kitsune/kit/options_builder.rb +0 -26
  124. data/lib/kitsune/kit/provisioner.rb +0 -107
  125. data/sig/kitsune/kit.rbs +0 -6
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "json"
5
+ require "pathname"
6
+ require "rbconfig"
7
+ require "securerandom"
8
+ require "time"
9
+
10
+ module Kitsune
11
+ module Kit
12
+ module Workflows
13
+ class SupportBundle
14
+ MAX_LOG_FILES = 5
15
+ MAX_LOG_LINES = 500
16
+
17
+ def initialize(root:, config:, state_store:, doctor:, secret_filter: SecretFilter.new,
18
+ clock: -> { Time.now.utc })
19
+ @root = Pathname(root).expand_path
20
+ @config = config
21
+ @state_store = state_store
22
+ @doctor = doctor
23
+ @secret_filter = secret_filter
24
+ @clock = clock
25
+ end
26
+
27
+ def call
28
+ directory = root.join(".kitsune/support")
29
+ FileUtils.mkdir_p(directory, mode: 0o700)
30
+ path = directory.join("#{clock.call.strftime('%Y%m%dT%H%M%S')}-#{SecureRandom.hex(4)}.json")
31
+ path.write(JSON.pretty_generate(secret_filter.filter(payload)) << "\n")
32
+ File.chmod(0o600, path)
33
+ path.to_s
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :root, :config, :state_store, :doctor, :secret_filter, :clock
39
+
40
+ def payload
41
+ {
42
+ schema_version: 1,
43
+ generated_at: clock.call.iso8601(6),
44
+ kitsune_version: VERSION,
45
+ ruby: { version: RUBY_VERSION, platform: RUBY_PLATFORM, host_os: RbConfig::CONFIG["host_os"] },
46
+ configuration: serialize(config),
47
+ state: state_store.read(config.environment),
48
+ doctor: doctor.call.value.map(&:to_h),
49
+ logs: selected_logs
50
+ }
51
+ end
52
+
53
+ def selected_logs
54
+ directory = root.join(".kitsune/logs")
55
+ return [] unless directory.directory?
56
+
57
+ directory.glob("*.jsonl").sort_by(&:mtime).last(MAX_LOG_FILES).map do |path|
58
+ { file: path.basename.to_s, events: read_log(path) }
59
+ end
60
+ end
61
+
62
+ def read_log(path)
63
+ path.readlines.last(MAX_LOG_LINES).filter_map do |line|
64
+ JSON.parse(line)
65
+ rescue JSON::ParserError
66
+ { "type" => "invalid_log_line", "message" => "A local log line could not be parsed." }
67
+ end
68
+ rescue SystemCallError => e
69
+ [{ "type" => "log_read_error", "message" => e.class.name }]
70
+ end
71
+
72
+ def serialize(value)
73
+ return value.members.to_h { |member| [member, serialize(value.public_send(member))] } if value.is_a?(Data)
74
+ return value.to_h { |key, item| [key, serialize(item)] } if value.is_a?(Hash)
75
+ return value.map { |item| serialize(item) } if value.is_a?(Array)
76
+
77
+ value
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
data/lib/kitsune/kit.rb CHANGED
@@ -1,10 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "kit/version"
4
+ require_relative "kit/errors"
5
+ require_relative "kit/events"
6
+ require_relative "kit/result"
7
+ require_relative "kit/plan"
8
+ require_relative "kit/secret_filter"
9
+ require_relative "kit/secret_store"
10
+ require_relative "kit/clock"
11
+ require_relative "kit/cancellation"
12
+ require_relative "kit/run_logger"
13
+ require_relative "kit/run_journal"
14
+ require_relative "kit/service_compose"
15
+ require_relative "kit/configuration"
16
+ require_relative "kit/state_store"
17
+ require_relative "kit/adapters/fake_state_store"
18
+ require_relative "kit/adapters/fake_reporter"
19
+ require_relative "kit/adapters/fake_secret_store"
20
+ require_relative "kit/adapters/fake_clock"
21
+ require_relative "kit/application"
22
+ require_relative "kit/operations/ensure_dns_records"
23
+ require_relative "kit/operations/remote_script"
24
+ require_relative "kit/operations/ensure_service"
25
+ require_relative "kit/reporters/human"
26
+ require_relative "kit/reporters/json"
27
+ require_relative "kit/workflows/build_plan"
28
+ require_relative "kit/workflows/apply_plan"
29
+ require_relative "kit/workflows/doctor"
30
+ require_relative "kit/workflows/initialize_project"
31
+ require_relative "kit/workflows/inspect_environment"
32
+ require_relative "kit/workflows/rollback"
33
+ require_relative "kit/workflows/destroy_server"
34
+ require_relative "kit/workflows/import_server"
35
+ require_relative "kit/workflows/environment_selection"
36
+ require_relative "kit/workflows/support_bundle"
37
+ require_relative "kit/tui/state"
38
+ require_relative "kit/tui/store"
39
+ require_relative "kit/tui/renderer"
40
+ require_relative "kit/tui/terminal"
41
+ require_relative "kit/tui/actions"
42
+ require_relative "kit/tui/controller"
43
+ require_relative "kit/tui/application"
4
44
 
5
45
  module Kitsune
6
46
  module Kit
7
- class Error < StandardError; end
8
- # Your code goes here...
47
+ Error = Errors::Error
9
48
  end
10
49
  end
metadata CHANGED
@@ -1,43 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitsune-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Omar Herrera
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-05-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: net-ssh
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '7.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '7.2'
27
- - !ruby/object:Gem::Dependency
28
- name: ed25519
13
+ name: base64
29
14
  requirement: !ruby/object:Gem::Requirement
30
15
  requirements:
31
16
  - - "~>"
32
17
  - !ruby/object:Gem::Version
33
- version: '1.3'
18
+ version: '0.3'
34
19
  type: :runtime
35
20
  prerelease: false
36
21
  version_requirements: !ruby/object:Gem::Requirement
37
22
  requirements:
38
23
  - - "~>"
39
24
  - !ruby/object:Gem::Version
40
- version: '1.3'
25
+ version: '0.3'
41
26
  - !ruby/object:Gem::Dependency
42
27
  name: bcrypt_pbkdf
43
28
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +38,19 @@ dependencies:
53
38
  - !ruby/object:Gem::Version
54
39
  version: '1.1'
55
40
  - !ruby/object:Gem::Dependency
56
- name: dotenv
41
+ name: bigdecimal
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - "~>"
60
45
  - !ruby/object:Gem::Version
61
- version: '3.0'
46
+ version: '4.1'
62
47
  type: :runtime
63
48
  prerelease: false
64
49
  version_requirements: !ruby/object:Gem::Requirement
65
50
  requirements:
66
51
  - - "~>"
67
52
  - !ruby/object:Gem::Version
68
- version: '3.0'
53
+ version: '4.1'
69
54
  - !ruby/object:Gem::Dependency
70
55
  name: droplet_kit
71
56
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +66,7 @@ dependencies:
81
66
  - !ruby/object:Gem::Version
82
67
  version: '3.17'
83
68
  - !ruby/object:Gem::Dependency
84
- name: thor
69
+ name: ed25519
85
70
  requirement: !ruby/object:Gem::Requirement
86
71
  requirements:
87
72
  - - "~>"
@@ -95,64 +80,63 @@ dependencies:
95
80
  - !ruby/object:Gem::Version
96
81
  version: '1.3'
97
82
  - !ruby/object:Gem::Dependency
98
- name: pry
83
+ name: net-ssh
99
84
  requirement: !ruby/object:Gem::Requirement
100
85
  requirements:
101
86
  - - "~>"
102
87
  - !ruby/object:Gem::Version
103
- version: '0.14'
104
- type: :development
88
+ version: '7.2'
89
+ type: :runtime
105
90
  prerelease: false
106
91
  version_requirements: !ruby/object:Gem::Requirement
107
92
  requirements:
108
93
  - - "~>"
109
94
  - !ruby/object:Gem::Version
110
- version: '0.14'
95
+ version: '7.2'
111
96
  - !ruby/object:Gem::Dependency
112
- name: pry-stack_explorer
97
+ name: ostruct
113
98
  requirement: !ruby/object:Gem::Requirement
114
99
  requirements:
115
100
  - - "~>"
116
101
  - !ruby/object:Gem::Version
117
- version: 0.6.0
118
- type: :development
102
+ version: '0.6'
103
+ type: :runtime
119
104
  prerelease: false
120
105
  version_requirements: !ruby/object:Gem::Requirement
121
106
  requirements:
122
107
  - - "~>"
123
108
  - !ruby/object:Gem::Version
124
- version: 0.6.0
109
+ version: '0.6'
125
110
  - !ruby/object:Gem::Dependency
126
- name: rspec
111
+ name: public_suffix
127
112
  requirement: !ruby/object:Gem::Requirement
128
113
  requirements:
129
114
  - - "~>"
130
115
  - !ruby/object:Gem::Version
131
- version: '3.12'
132
- type: :development
116
+ version: '6.0'
117
+ type: :runtime
133
118
  prerelease: false
134
119
  version_requirements: !ruby/object:Gem::Requirement
135
120
  requirements:
136
121
  - - "~>"
137
122
  - !ruby/object:Gem::Version
138
- version: '3.12'
123
+ version: '6.0'
139
124
  - !ruby/object:Gem::Dependency
140
- name: aruba
125
+ name: thor
141
126
  requirement: !ruby/object:Gem::Requirement
142
127
  requirements:
143
128
  - - "~>"
144
129
  - !ruby/object:Gem::Version
145
- version: '2.2'
146
- type: :development
130
+ version: '1.3'
131
+ type: :runtime
147
132
  prerelease: false
148
133
  version_requirements: !ruby/object:Gem::Requirement
149
134
  requirements:
150
135
  - - "~>"
151
136
  - !ruby/object:Gem::Version
152
- version: '2.2'
153
- description: Kitsune Kit is a CLI toolkit that automates the provisioning, configuration,
154
- and Docker setup of remote servers, especially tailored for Ruby developers using
155
- Kamal. Includes rollback features and multi-environment support.
137
+ version: '1.3'
138
+ description: Kitsune Kit is an inspectable infrastructure CLI for provisioning DigitalOcean
139
+ servers, configuring Ubuntu and Docker, and managing private application services.
156
140
  email:
157
141
  - contact@omarherrera.me
158
142
  executables:
@@ -160,44 +144,101 @@ executables:
160
144
  extensions: []
161
145
  extra_rdoc_files: []
162
146
  files:
163
- - ".rspec"
164
147
  - CHANGELOG.md
165
148
  - CODE_OF_CONDUCT.md
149
+ - CONTRIBUTING.md
166
150
  - LICENSE.txt
167
151
  - README.md
168
- - Rakefile
152
+ - SECURITY.md
169
153
  - bin/kit
170
- - kitsune-kit-logo.jpg
171
- - lib/kitsune/blueprints/.env.template
172
- - lib/kitsune/blueprints/docker/postgres.yml
173
- - lib/kitsune/blueprints/docker/redis.yml
174
- - lib/kitsune/blueprints/kit.env.template
154
+ - docs/architecture.md
155
+ - docs/architecture/decisions/0001-product-boundary.md
156
+ - docs/architecture/decisions/0002-core-and-interfaces.md
157
+ - docs/architecture/decisions/0003-configuration-state-and-secrets.md
158
+ - docs/architecture/decisions/0004-supported-platforms.md
159
+ - docs/architecture/decisions/0005-operation-semantics.md
160
+ - docs/architecture/decisions/0006-tui-backend.md
161
+ - docs/architecture/provider-adapters.md
162
+ - docs/commands.md
163
+ - docs/configuration.md
164
+ - docs/getting-started.md
165
+ - docs/providers/digitalocean.md
166
+ - docs/releasing.md
167
+ - docs/roadmap.md
168
+ - docs/security-audit.md
169
+ - docs/security.md
170
+ - docs/services/postgres.md
171
+ - docs/services/redis.md
172
+ - docs/testing.md
173
+ - docs/troubleshooting.md
174
+ - docs/tui.md
175
175
  - lib/kitsune/kit.rb
176
- - lib/kitsune/kit/ansi_color.rb
176
+ - lib/kitsune/kit/adapters/confirming_host_key_verifier.rb
177
+ - lib/kitsune/kit/adapters/digitalocean_provider.rb
178
+ - lib/kitsune/kit/adapters/fake_clock.rb
179
+ - lib/kitsune/kit/adapters/fake_provider.rb
180
+ - lib/kitsune/kit/adapters/fake_reporter.rb
181
+ - lib/kitsune/kit/adapters/fake_secret_store.rb
182
+ - lib/kitsune/kit/adapters/fake_state_store.rb
183
+ - lib/kitsune/kit/adapters/fake_transport.rb
184
+ - lib/kitsune/kit/adapters/net_ssh_transport.rb
185
+ - lib/kitsune/kit/adapters/provider.rb
186
+ - lib/kitsune/kit/adapters/transport.rb
187
+ - lib/kitsune/kit/adapters/transport_factory.rb
188
+ - lib/kitsune/kit/application.rb
189
+ - lib/kitsune/kit/cancellation.rb
177
190
  - lib/kitsune/kit/cli.rb
178
- - lib/kitsune/kit/commands/bootstrap.rb
179
- - lib/kitsune/kit/commands/bootstrap_docker.rb
180
- - lib/kitsune/kit/commands/dns.rb
181
- - lib/kitsune/kit/commands/init.rb
182
- - lib/kitsune/kit/commands/install_docker_engine.rb
183
- - lib/kitsune/kit/commands/postinstall_docker.rb
184
- - lib/kitsune/kit/commands/provision.rb
185
- - lib/kitsune/kit/commands/setup_do_metrics.rb
186
- - lib/kitsune/kit/commands/setup_docker_prereqs.rb
187
- - lib/kitsune/kit/commands/setup_firewall.rb
188
- - lib/kitsune/kit/commands/setup_postgres_docker.rb
189
- - lib/kitsune/kit/commands/setup_redis_docker.rb
190
- - lib/kitsune/kit/commands/setup_swap.rb
191
- - lib/kitsune/kit/commands/setup_unattended.rb
192
- - lib/kitsune/kit/commands/setup_user.rb
193
- - lib/kitsune/kit/commands/ssh.rb
194
- - lib/kitsune/kit/commands/switch_env.rb
195
- - lib/kitsune/kit/defaults.rb
196
- - lib/kitsune/kit/env_loader.rb
197
- - lib/kitsune/kit/options_builder.rb
198
- - lib/kitsune/kit/provisioner.rb
191
+ - lib/kitsune/kit/clock.rb
192
+ - lib/kitsune/kit/configuration.rb
193
+ - lib/kitsune/kit/errors.rb
194
+ - lib/kitsune/kit/events.rb
195
+ - lib/kitsune/kit/operations/ensure_dns_records.rb
196
+ - lib/kitsune/kit/operations/ensure_server.rb
197
+ - lib/kitsune/kit/operations/ensure_service.rb
198
+ - lib/kitsune/kit/operations/remote_script.rb
199
+ - lib/kitsune/kit/operations/service_backup.rb
200
+ - lib/kitsune/kit/operations/service_files.rb
201
+ - lib/kitsune/kit/operations/service_firewall.rb
202
+ - lib/kitsune/kit/operations/service_state.rb
203
+ - lib/kitsune/kit/plan.rb
204
+ - lib/kitsune/kit/reporters/human.rb
205
+ - lib/kitsune/kit/reporters/json.rb
206
+ - lib/kitsune/kit/reporters/reporter.rb
207
+ - lib/kitsune/kit/result.rb
208
+ - lib/kitsune/kit/run_journal.rb
209
+ - lib/kitsune/kit/run_logger.rb
210
+ - lib/kitsune/kit/scripts/docker.sh
211
+ - lib/kitsune/kit/scripts/firewall.sh
212
+ - lib/kitsune/kit/scripts/metrics.sh
213
+ - lib/kitsune/kit/scripts/ssh.sh
214
+ - lib/kitsune/kit/scripts/swap.sh
215
+ - lib/kitsune/kit/scripts/unattended.sh
216
+ - lib/kitsune/kit/scripts/user.sh
217
+ - lib/kitsune/kit/secret_filter.rb
218
+ - lib/kitsune/kit/secret_store.rb
219
+ - lib/kitsune/kit/secret_stores/store.rb
220
+ - lib/kitsune/kit/service_compose.rb
221
+ - lib/kitsune/kit/state_store.rb
222
+ - lib/kitsune/kit/state_stores/store.rb
223
+ - lib/kitsune/kit/tui/actions.rb
224
+ - lib/kitsune/kit/tui/application.rb
225
+ - lib/kitsune/kit/tui/controller.rb
226
+ - lib/kitsune/kit/tui/renderer.rb
227
+ - lib/kitsune/kit/tui/state.rb
228
+ - lib/kitsune/kit/tui/store.rb
229
+ - lib/kitsune/kit/tui/terminal.rb
199
230
  - lib/kitsune/kit/version.rb
200
- - sig/kitsune/kit.rbs
231
+ - lib/kitsune/kit/workflows/apply_plan.rb
232
+ - lib/kitsune/kit/workflows/base.rb
233
+ - lib/kitsune/kit/workflows/build_plan.rb
234
+ - lib/kitsune/kit/workflows/destroy_server.rb
235
+ - lib/kitsune/kit/workflows/doctor.rb
236
+ - lib/kitsune/kit/workflows/environment_selection.rb
237
+ - lib/kitsune/kit/workflows/import_server.rb
238
+ - lib/kitsune/kit/workflows/initialize_project.rb
239
+ - lib/kitsune/kit/workflows/inspect_environment.rb
240
+ - lib/kitsune/kit/workflows/rollback.rb
241
+ - lib/kitsune/kit/workflows/support_bundle.rb
201
242
  homepage: https://github.com/omarhrra/kitsune-kit
202
243
  licenses:
203
244
  - MIT
@@ -206,7 +247,8 @@ metadata:
206
247
  homepage_uri: https://github.com/omarhrra/kitsune-kit
207
248
  source_code_uri: https://github.com/omarhrra/kitsune-kit
208
249
  changelog_uri: https://github.com/omarhrra/kitsune-kit/blob/main/CHANGELOG.md
209
- post_install_message:
250
+ bug_tracker_uri: https://github.com/omarhrra/kitsune-kit/issues
251
+ rubygems_mfa_required: 'true'
210
252
  rdoc_options: []
211
253
  require_paths:
212
254
  - lib
@@ -214,16 +256,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
256
  requirements:
215
257
  - - ">="
216
258
  - !ruby/object:Gem::Version
217
- version: 3.0.0
259
+ version: 3.2.0
260
+ - - "<"
261
+ - !ruby/object:Gem::Version
262
+ version: '4.0'
218
263
  required_rubygems_version: !ruby/object:Gem::Requirement
219
264
  requirements:
220
265
  - - ">="
221
266
  - !ruby/object:Gem::Version
222
267
  version: '0'
223
268
  requirements: []
224
- rubygems_version: 3.5.22
225
- signing_key:
269
+ rubygems_version: 3.6.9
226
270
  specification_version: 4
227
- summary: Provision and setup DigitalOcean VPSs with Docker and PostgreSQL, ideal for
228
- Kamal deployments.
271
+ summary: Plan, provision, and configure secure Ubuntu servers for Docker and Kamal.
229
272
  test_files: []
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
data/kitsune-kit-logo.jpg DELETED
Binary file
@@ -1,31 +0,0 @@
1
- # DigitalOcean Droplet
2
- DO_API_TOKEN=
3
- DROPLET_NAME=
4
- REGION=
5
- SIZE=
6
- IMAGE=
7
- SSH_KEY_ID=
8
- TAG_NAME=
9
- ENABLE_DO_METRICS=true
10
- # If you want DNS records to be created automatically, set the following variables:
11
- # DOMAIN_NAMES=example.com,test.example.org # (optional, comma-separated list of domain names to add to the droplet)
12
- # DNS_TTL=3600 # (optional, time-to-live for DNS records in seconds, default is 3600)
13
- # Check the DigitalOcean documentation for more information on domain names:
14
- # https://docs.digitalocean.com/products/networking/dns/getting-started/dns-registrars/
15
-
16
- # SSH
17
- SSH_KEY_PATH=
18
- # SSH_PORT=22 (optional)
19
-
20
- # System
21
- SWAP_SIZE_GB=2
22
- DISABLE_SWAP=false
23
-
24
- # PostgreSQL Docker
25
- POSTGRES_DB=myapp_db
26
- POSTGRES_USER=postgres
27
- POSTGRES_PASSWORD=secret
28
-
29
- # Redis Docker
30
- REDIS_PORT=6379
31
- REDIS_PASSWORD=secret
@@ -1,27 +0,0 @@
1
- services:
2
- postgres:
3
- image: postgres:17
4
- restart: always
5
- environment:
6
- POSTGRES_DB: ${POSTGRES_DB}
7
- POSTGRES_USER: ${POSTGRES_USER}
8
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
9
- ports:
10
- - "${POSTGRES_PORT:-5432}:5432"
11
- command: postgres -c listen_addresses='*'
12
- networks:
13
- - private
14
- volumes:
15
- - pgdata:/var/lib/postgresql/data
16
- healthcheck:
17
- test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER}"]
18
- interval: 30s
19
- timeout: 10s
20
- retries: 5
21
-
22
- volumes:
23
- pgdata:
24
-
25
- networks:
26
- private:
27
- driver: bridge
@@ -1,23 +0,0 @@
1
- services:
2
- redis:
3
- image: redis:7.2
4
- restart: always
5
- ports:
6
- - "${REDIS_PORT:-6379}:6379"
7
- command: redis-server --requirepass ${REDIS_PASSWORD}
8
- networks:
9
- - private
10
- volumes:
11
- - redisdata:/data
12
- healthcheck:
13
- test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
14
- interval: 30s
15
- timeout: 10s
16
- retries: 5
17
-
18
- volumes:
19
- redisdata:
20
-
21
- networks:
22
- private:
23
- driver: bridge
@@ -1 +0,0 @@
1
- KIT_ENV=development
@@ -1,78 +0,0 @@
1
- module AnsiColor
2
- COLORS = {
3
- black: 30,
4
- red: 31,
5
- green: 32,
6
- yellow: 33,
7
- blue: 34,
8
- magenta: 35,
9
- cyan: 36,
10
- white: 37,
11
-
12
- light_black: 90,
13
- light_red: 91,
14
- light_green: 92,
15
- light_yellow: 93,
16
- light_blue: 94,
17
- light_magenta: 95,
18
- light_cyan: 96,
19
- light_white: 97
20
- }
21
-
22
- BACKGROUNDS = {
23
- black: 40,
24
- red: 41,
25
- green: 42,
26
- yellow: 43,
27
- blue: 44,
28
- magenta: 45,
29
- cyan: 46,
30
- white: 47,
31
-
32
- light_black: 100,
33
- light_red: 101,
34
- light_green: 102,
35
- light_yellow: 103,
36
- light_blue: 104,
37
- light_magenta: 105,
38
- light_cyan: 106,
39
- light_white: 107
40
- }
41
-
42
- STYLES = {
43
- bold: 1,
44
- italic: 3,
45
- underline: 4
46
- }
47
-
48
- def self.colorize(text, color: nil, background: nil, style: nil)
49
- codes = []
50
- codes << COLORS[color] if color
51
- codes << BACKGROUNDS[background] if background
52
- codes << STYLES[style] if style
53
-
54
- raise ArgumentError, "No valid formatting options given" if codes.empty?
55
-
56
- "\e[#{codes.join(';')}m#{text}\e[0m"
57
- end
58
-
59
- def self.demo
60
- puts "Text Colors:"
61
- COLORS.each_key do |color|
62
- puts colorize(" #{color.to_s.ljust(15)}", color: color)
63
- end
64
-
65
- puts "\nBackground Colors:"
66
- BACKGROUNDS.each_key do |bg|
67
- puts colorize(" #{bg.to_s.ljust(15)}", background: bg)
68
- end
69
-
70
- puts "\nStyles:"
71
- STYLES.each_key do |style|
72
- puts colorize(" #{style.to_s.ljust(15)}", color: :white, style: style)
73
- end
74
-
75
- puts "\nCombined Example:"
76
- puts colorize(" bold green on light_black ", color: :green, background: :light_black, style: :bold)
77
- end
78
- end