kitsune-kit 0.4.1 → 0.6.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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +143 -2
  3. data/CONTRIBUTING.md +83 -0
  4. data/README.md +112 -135
  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/decisions/0007-compose-customization.md +30 -0
  14. data/docs/architecture/provider-adapters.md +49 -0
  15. data/docs/architecture.md +93 -0
  16. data/docs/commands.md +224 -0
  17. data/docs/configuration.md +226 -0
  18. data/docs/getting-started.md +133 -0
  19. data/docs/providers/digitalocean.md +52 -0
  20. data/docs/releasing.md +43 -0
  21. data/docs/roadmap.md +46 -0
  22. data/docs/security-audit.md +130 -0
  23. data/docs/security.md +116 -0
  24. data/docs/services/compose.md +164 -0
  25. data/docs/services/postgres.md +78 -0
  26. data/docs/services/redis.md +53 -0
  27. data/docs/testing.md +200 -0
  28. data/docs/troubleshooting.md +123 -0
  29. data/docs/tui.md +57 -0
  30. data/lib/kitsune/kit/adapters/confirming_host_key_verifier.rb +42 -0
  31. data/lib/kitsune/kit/adapters/digitalocean_provider.rb +217 -0
  32. data/lib/kitsune/kit/adapters/fake_clock.rb +34 -0
  33. data/lib/kitsune/kit/adapters/fake_provider.rb +107 -0
  34. data/lib/kitsune/kit/adapters/fake_reporter.rb +34 -0
  35. data/lib/kitsune/kit/adapters/fake_secret_store.rb +35 -0
  36. data/lib/kitsune/kit/adapters/fake_state_store.rb +91 -0
  37. data/lib/kitsune/kit/adapters/fake_transport.rb +56 -0
  38. data/lib/kitsune/kit/adapters/net_ssh_transport.rb +155 -0
  39. data/lib/kitsune/kit/adapters/provider.rb +34 -0
  40. data/lib/kitsune/kit/adapters/transport.rb +22 -0
  41. data/lib/kitsune/kit/adapters/transport_factory.rb +116 -0
  42. data/lib/kitsune/kit/application.rb +170 -0
  43. data/lib/kitsune/kit/cancellation.rb +21 -0
  44. data/lib/kitsune/kit/cli.rb +879 -64
  45. data/lib/kitsune/kit/clock.rb +11 -0
  46. data/lib/kitsune/kit/configuration.rb +577 -0
  47. data/lib/kitsune/kit/errors.rb +98 -0
  48. data/lib/kitsune/kit/events.rb +55 -0
  49. data/lib/kitsune/kit/operations/ensure_dns_records.rb +165 -0
  50. data/lib/kitsune/kit/operations/ensure_server.rb +135 -0
  51. data/lib/kitsune/kit/operations/ensure_service.rb +302 -0
  52. data/lib/kitsune/kit/operations/remote_script.rb +214 -0
  53. data/lib/kitsune/kit/operations/service_backup.rb +71 -0
  54. data/lib/kitsune/kit/operations/service_files.rb +131 -0
  55. data/lib/kitsune/kit/operations/service_firewall.rb +190 -0
  56. data/lib/kitsune/kit/operations/service_state.rb +59 -0
  57. data/lib/kitsune/kit/plan.rb +72 -0
  58. data/lib/kitsune/kit/reporters/human.rb +89 -0
  59. data/lib/kitsune/kit/reporters/json.rb +65 -0
  60. data/lib/kitsune/kit/reporters/reporter.rb +11 -0
  61. data/lib/kitsune/kit/result.rb +28 -0
  62. data/lib/kitsune/kit/run_journal.rb +102 -0
  63. data/lib/kitsune/kit/run_logger.rb +37 -0
  64. data/lib/kitsune/kit/scripts/docker.sh +142 -0
  65. data/lib/kitsune/kit/scripts/firewall.sh +210 -0
  66. data/lib/kitsune/kit/scripts/metrics.sh +59 -0
  67. data/lib/kitsune/kit/scripts/ssh.sh +95 -0
  68. data/lib/kitsune/kit/scripts/swap.sh +86 -0
  69. data/lib/kitsune/kit/scripts/unattended.sh +86 -0
  70. data/lib/kitsune/kit/scripts/user.sh +114 -0
  71. data/lib/kitsune/kit/secret_filter.rb +54 -0
  72. data/lib/kitsune/kit/secret_store.rb +32 -0
  73. data/lib/kitsune/kit/secret_stores/store.rb +12 -0
  74. data/lib/kitsune/kit/service_compose.rb +272 -0
  75. data/lib/kitsune/kit/state_store.rb +158 -0
  76. data/lib/kitsune/kit/state_stores/store.rb +15 -0
  77. data/lib/kitsune/kit/tui/actions.rb +72 -0
  78. data/lib/kitsune/kit/tui/application.rb +35 -0
  79. data/lib/kitsune/kit/tui/controller.rb +162 -0
  80. data/lib/kitsune/kit/tui/renderer.rb +134 -0
  81. data/lib/kitsune/kit/tui/state.rb +18 -0
  82. data/lib/kitsune/kit/tui/store.rb +88 -0
  83. data/lib/kitsune/kit/tui/terminal.rb +95 -0
  84. data/lib/kitsune/kit/version.rb +1 -1
  85. data/lib/kitsune/kit/workflows/apply_plan.rb +145 -0
  86. data/lib/kitsune/kit/workflows/base.rb +31 -0
  87. data/lib/kitsune/kit/workflows/build_plan.rb +33 -0
  88. data/lib/kitsune/kit/workflows/destroy_server.rb +84 -0
  89. data/lib/kitsune/kit/workflows/doctor.rb +225 -0
  90. data/lib/kitsune/kit/workflows/eject_compose.rb +82 -0
  91. data/lib/kitsune/kit/workflows/environment_selection.rb +70 -0
  92. data/lib/kitsune/kit/workflows/import_server.rb +100 -0
  93. data/lib/kitsune/kit/workflows/initialize_project.rb +129 -0
  94. data/lib/kitsune/kit/workflows/inspect_environment.rb +44 -0
  95. data/lib/kitsune/kit/workflows/rollback.rb +54 -0
  96. data/lib/kitsune/kit/workflows/support_bundle.rb +82 -0
  97. data/lib/kitsune/kit.rb +42 -2
  98. metadata +125 -79
  99. data/.rspec +0 -3
  100. data/Rakefile +0 -8
  101. data/kitsune-kit-logo.jpg +0 -0
  102. data/lib/kitsune/blueprints/.env.template +0 -31
  103. data/lib/kitsune/blueprints/docker/postgres.yml +0 -27
  104. data/lib/kitsune/blueprints/docker/redis.yml +0 -23
  105. data/lib/kitsune/blueprints/kit.env.template +0 -1
  106. data/lib/kitsune/kit/ansi_color.rb +0 -78
  107. data/lib/kitsune/kit/commands/bootstrap.rb +0 -134
  108. data/lib/kitsune/kit/commands/bootstrap_docker.rb +0 -66
  109. data/lib/kitsune/kit/commands/dns.rb +0 -112
  110. data/lib/kitsune/kit/commands/init.rb +0 -148
  111. data/lib/kitsune/kit/commands/install_docker_engine.rb +0 -146
  112. data/lib/kitsune/kit/commands/postinstall_docker.rb +0 -142
  113. data/lib/kitsune/kit/commands/provision.rb +0 -43
  114. data/lib/kitsune/kit/commands/setup_do_metrics.rb +0 -123
  115. data/lib/kitsune/kit/commands/setup_docker_prereqs.rb +0 -151
  116. data/lib/kitsune/kit/commands/setup_firewall.rb +0 -132
  117. data/lib/kitsune/kit/commands/setup_postgres_docker.rb +0 -246
  118. data/lib/kitsune/kit/commands/setup_redis_docker.rb +0 -241
  119. data/lib/kitsune/kit/commands/setup_swap.rb +0 -151
  120. data/lib/kitsune/kit/commands/setup_unattended.rb +0 -132
  121. data/lib/kitsune/kit/commands/setup_user.rb +0 -189
  122. data/lib/kitsune/kit/commands/ssh.rb +0 -46
  123. data/lib/kitsune/kit/commands/switch_env.rb +0 -42
  124. data/lib/kitsune/kit/defaults.rb +0 -91
  125. data/lib/kitsune/kit/env_loader.rb +0 -41
  126. data/lib/kitsune/kit/options_builder.rb +0 -26
  127. data/lib/kitsune/kit/provisioner.rb +0 -107
  128. data/sig/kitsune/kit.rbs +0 -6
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.1
4
+ version: 0.6.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-06-02 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,104 @@ 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/decisions/0007-compose-customization.md
162
+ - docs/architecture/provider-adapters.md
163
+ - docs/commands.md
164
+ - docs/configuration.md
165
+ - docs/getting-started.md
166
+ - docs/providers/digitalocean.md
167
+ - docs/releasing.md
168
+ - docs/roadmap.md
169
+ - docs/security-audit.md
170
+ - docs/security.md
171
+ - docs/services/compose.md
172
+ - docs/services/postgres.md
173
+ - docs/services/redis.md
174
+ - docs/testing.md
175
+ - docs/troubleshooting.md
176
+ - docs/tui.md
175
177
  - lib/kitsune/kit.rb
176
- - lib/kitsune/kit/ansi_color.rb
178
+ - lib/kitsune/kit/adapters/confirming_host_key_verifier.rb
179
+ - lib/kitsune/kit/adapters/digitalocean_provider.rb
180
+ - lib/kitsune/kit/adapters/fake_clock.rb
181
+ - lib/kitsune/kit/adapters/fake_provider.rb
182
+ - lib/kitsune/kit/adapters/fake_reporter.rb
183
+ - lib/kitsune/kit/adapters/fake_secret_store.rb
184
+ - lib/kitsune/kit/adapters/fake_state_store.rb
185
+ - lib/kitsune/kit/adapters/fake_transport.rb
186
+ - lib/kitsune/kit/adapters/net_ssh_transport.rb
187
+ - lib/kitsune/kit/adapters/provider.rb
188
+ - lib/kitsune/kit/adapters/transport.rb
189
+ - lib/kitsune/kit/adapters/transport_factory.rb
190
+ - lib/kitsune/kit/application.rb
191
+ - lib/kitsune/kit/cancellation.rb
177
192
  - 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
193
+ - lib/kitsune/kit/clock.rb
194
+ - lib/kitsune/kit/configuration.rb
195
+ - lib/kitsune/kit/errors.rb
196
+ - lib/kitsune/kit/events.rb
197
+ - lib/kitsune/kit/operations/ensure_dns_records.rb
198
+ - lib/kitsune/kit/operations/ensure_server.rb
199
+ - lib/kitsune/kit/operations/ensure_service.rb
200
+ - lib/kitsune/kit/operations/remote_script.rb
201
+ - lib/kitsune/kit/operations/service_backup.rb
202
+ - lib/kitsune/kit/operations/service_files.rb
203
+ - lib/kitsune/kit/operations/service_firewall.rb
204
+ - lib/kitsune/kit/operations/service_state.rb
205
+ - lib/kitsune/kit/plan.rb
206
+ - lib/kitsune/kit/reporters/human.rb
207
+ - lib/kitsune/kit/reporters/json.rb
208
+ - lib/kitsune/kit/reporters/reporter.rb
209
+ - lib/kitsune/kit/result.rb
210
+ - lib/kitsune/kit/run_journal.rb
211
+ - lib/kitsune/kit/run_logger.rb
212
+ - lib/kitsune/kit/scripts/docker.sh
213
+ - lib/kitsune/kit/scripts/firewall.sh
214
+ - lib/kitsune/kit/scripts/metrics.sh
215
+ - lib/kitsune/kit/scripts/ssh.sh
216
+ - lib/kitsune/kit/scripts/swap.sh
217
+ - lib/kitsune/kit/scripts/unattended.sh
218
+ - lib/kitsune/kit/scripts/user.sh
219
+ - lib/kitsune/kit/secret_filter.rb
220
+ - lib/kitsune/kit/secret_store.rb
221
+ - lib/kitsune/kit/secret_stores/store.rb
222
+ - lib/kitsune/kit/service_compose.rb
223
+ - lib/kitsune/kit/state_store.rb
224
+ - lib/kitsune/kit/state_stores/store.rb
225
+ - lib/kitsune/kit/tui/actions.rb
226
+ - lib/kitsune/kit/tui/application.rb
227
+ - lib/kitsune/kit/tui/controller.rb
228
+ - lib/kitsune/kit/tui/renderer.rb
229
+ - lib/kitsune/kit/tui/state.rb
230
+ - lib/kitsune/kit/tui/store.rb
231
+ - lib/kitsune/kit/tui/terminal.rb
199
232
  - lib/kitsune/kit/version.rb
200
- - sig/kitsune/kit.rbs
233
+ - lib/kitsune/kit/workflows/apply_plan.rb
234
+ - lib/kitsune/kit/workflows/base.rb
235
+ - lib/kitsune/kit/workflows/build_plan.rb
236
+ - lib/kitsune/kit/workflows/destroy_server.rb
237
+ - lib/kitsune/kit/workflows/doctor.rb
238
+ - lib/kitsune/kit/workflows/eject_compose.rb
239
+ - lib/kitsune/kit/workflows/environment_selection.rb
240
+ - lib/kitsune/kit/workflows/import_server.rb
241
+ - lib/kitsune/kit/workflows/initialize_project.rb
242
+ - lib/kitsune/kit/workflows/inspect_environment.rb
243
+ - lib/kitsune/kit/workflows/rollback.rb
244
+ - lib/kitsune/kit/workflows/support_bundle.rb
201
245
  homepage: https://github.com/omarhrra/kitsune-kit
202
246
  licenses:
203
247
  - MIT
@@ -206,7 +250,8 @@ metadata:
206
250
  homepage_uri: https://github.com/omarhrra/kitsune-kit
207
251
  source_code_uri: https://github.com/omarhrra/kitsune-kit
208
252
  changelog_uri: https://github.com/omarhrra/kitsune-kit/blob/main/CHANGELOG.md
209
- post_install_message:
253
+ bug_tracker_uri: https://github.com/omarhrra/kitsune-kit/issues
254
+ rubygems_mfa_required: 'true'
210
255
  rdoc_options: []
211
256
  require_paths:
212
257
  - lib
@@ -214,16 +259,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
259
  requirements:
215
260
  - - ">="
216
261
  - !ruby/object:Gem::Version
217
- version: 3.0.0
262
+ version: 3.2.0
263
+ - - "<"
264
+ - !ruby/object:Gem::Version
265
+ version: '4.0'
218
266
  required_rubygems_version: !ruby/object:Gem::Requirement
219
267
  requirements:
220
268
  - - ">="
221
269
  - !ruby/object:Gem::Version
222
270
  version: '0'
223
271
  requirements: []
224
- rubygems_version: 3.5.22
225
- signing_key:
272
+ rubygems_version: 3.6.9
226
273
  specification_version: 4
227
- summary: Provision and setup DigitalOcean VPSs with Docker and PostgreSQL, ideal for
228
- Kamal deployments.
274
+ summary: Plan, provision, and configure secure Ubuntu servers for Docker and Kamal.
229
275
  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
@@ -1,134 +0,0 @@
1
- require "thor"
2
- require "stringio"
3
- require_relative "../defaults"
4
- require_relative "../options_builder"
5
- require_relative "../provisioner"
6
-
7
- module Kitsune
8
- module Kit
9
- module Commands
10
- class Bootstrap < Thor
11
- namespace "bootstrap"
12
-
13
- class_option :rollback, type: :boolean, default: false, desc: "Rollback the setup"
14
- class_option :keep_server, type: :boolean, default: false, desc: "Keep server after rollback"
15
- class_option :ssh_port, type: :string, desc: "SSH port for server"
16
- class_option :ssh_key_path, type: :string, desc: "SSH private key path"
17
-
18
- desc "execute", "Run the full bootstrap process or rollback"
19
- def execute
20
- filled_options = Kitsune::Kit::OptionsBuilder.build(
21
- options,
22
- defaults: Kitsune::Kit::Defaults.ssh
23
- )
24
-
25
- if filled_options[:rollback]
26
- say "šŸ”„ Rolling back server configurations...", :yellow
27
- rollback_sequence(filled_options)
28
- else
29
- say "šŸ—ļø Setting up server from scratch...", :green
30
- setup_sequence(filled_options)
31
- end
32
-
33
- say "šŸŽ‰ Done!", :green
34
- end
35
-
36
- no_commands do
37
- def setup_sequence(filled_options)
38
- droplet_ip = fetch_droplet_ip
39
-
40
- say "→ Droplet IP: #{droplet_ip}", :cyan
41
-
42
- run_cli("setup_user create", droplet_ip, filled_options)
43
- run_cli("setup_firewall create", droplet_ip, filled_options)
44
- run_cli("setup_unattended create", droplet_ip, filled_options)
45
- run_cli("setup_swap create", droplet_ip, filled_options)
46
- run_cli("setup_do_metrics create", droplet_ip, filled_options)
47
- run_cli("dns link", droplet_ip, filled_options.merge(domains: ENV["DOMAIN_NAMES"]))
48
- end
49
-
50
- def rollback_sequence(filled_options)
51
- provision_options = Kitsune::Kit::OptionsBuilder.build(
52
- {},
53
- defaults: Kitsune::Kit::Defaults::infra
54
- )
55
-
56
- provisioner = Kitsune::Kit::Provisioner.new(provision_options)
57
-
58
- if (droplet = provisioner.find_droplet).nil?
59
- say "šŸ’” Nothing to rollback.", :green
60
- return
61
- end
62
-
63
- droplet_ip = provisioner.send(:public_ip, droplet)
64
- say "→ Using Droplet IP: #{droplet_ip}", :cyan
65
-
66
- run_cli("setup_do_metrics rollback", droplet_ip, filled_options)
67
-
68
- if ssh_accessible?(droplet_ip, filled_options)
69
- run_cli("setup_unattended rollback", droplet_ip, filled_options)
70
- run_cli("setup_firewall rollback", droplet_ip, filled_options)
71
- else
72
- say "ā­ļø Skipping unattended-upgrades and firewall rollback (no deploy user)", :yellow
73
- end
74
-
75
- run_cli("setup_swap rollback", droplet_ip, filled_options)
76
- run_cli("setup_user rollback", droplet_ip, filled_options)
77
-
78
- unless filled_options[:keep_server]
79
- run_cli("dns rollback", droplet_ip, filled_options.merge(domains: ENV["DOMAIN_NAMES"]))
80
- say "ā–¶ļø Running: kitsune kit provision rollback", :blue
81
- Kitsune::Kit::CLI.start(%w[provision rollback])
82
- else
83
- say "ā­ļø Skipping droplet deletion (--keep-server enabled), DNS rollback won't be executed", :yellow
84
- end
85
- end
86
-
87
- def fetch_droplet_ip
88
- out = StringIO.new
89
- $stdout = out
90
- begin
91
- Kitsune::Kit::CLI.start(["provision", "create"])
92
- ensure
93
- $stdout = STDOUT
94
- end
95
-
96
- ip = out.string[/(\d{1,3}\.){3}\d{1,3}/]
97
- abort "āŒ Could not detect droplet IP!" if ip.nil? || ip.empty?
98
- ip
99
- end
100
-
101
- def run_cli(command, droplet_ip, filled_options)
102
- say "\nā–¶ļø Running: kitsune kit #{command} --server-ip #{droplet_ip}", :blue
103
- subcommand, action = command.split(" ", 2)
104
-
105
- args = [subcommand, action, "--server-ip", droplet_ip]
106
-
107
- if subcommand != "dns"
108
- args += ["--ssh-port", filled_options[:ssh_port], "--ssh-key-path", filled_options[:ssh_key_path]]
109
- end
110
-
111
- if subcommand == "dns" && ENV["DOMAIN_NAMES"]
112
- args += ["--domains", ENV["DOMAIN_NAMES"]]
113
- end
114
-
115
- Kitsune::Kit::CLI.start(args)
116
- rescue SystemExit => e
117
- abort "āŒ Command failed: #{command} (exit #{e.status})"
118
- end
119
-
120
- def ssh_accessible?(droplet_ip, filled_options)
121
- system(
122
- "ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new " \
123
- "-p #{filled_options[:ssh_port]} " \
124
- "-i #{File.expand_path(filled_options[:ssh_key_path])} " \
125
- "deploy@#{droplet_ip} true",
126
- out: File::NULL,
127
- err: File::NULL
128
- )
129
- end
130
- end
131
- end
132
- end
133
- end
134
- end