smartmachine 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -14
  3. data/lib/smart_machine/apps/container.rb +1 -0
  4. data/lib/smart_machine/apps/manager.rb +1 -1
  5. data/lib/smart_machine/base.rb +6 -0
  6. data/lib/smart_machine/buildpackers/buildpacker.rb +49 -1
  7. data/lib/smart_machine/buildpackers/rails.rb +87 -12
  8. data/lib/smart_machine/commands/grid.rb +8 -0
  9. data/lib/smart_machine/commands/grid_commands/elasticsearch.rb +0 -3
  10. data/lib/smart_machine/commands/grid_commands/nextcloud.rb +65 -0
  11. data/lib/smart_machine/commands/grid_commands/terminal.rb +107 -0
  12. data/lib/smart_machine/commands/machine.rb +8 -0
  13. data/lib/smart_machine/configuration.rb +23 -1
  14. data/lib/smart_machine/credentials.rb +9 -0
  15. data/lib/smart_machine/docker.rb +10 -9
  16. data/lib/smart_machine/engine.rb +44 -9
  17. data/lib/smart_machine/grids/nextcloud.rb +93 -0
  18. data/lib/smart_machine/grids/prereceiver/Dockerfile +10 -13
  19. data/lib/smart_machine/grids/redis.rb +8 -3
  20. data/lib/smart_machine/grids/redmine.rb +61 -0
  21. data/lib/smart_machine/grids/terminal/entrypoint.rb +95 -0
  22. data/lib/smart_machine/grids/terminal/haproxy.cfg +45 -0
  23. data/lib/smart_machine/grids/terminal/init.el +310 -0
  24. data/lib/smart_machine/grids/terminal/wetty.rb +44 -0
  25. data/lib/smart_machine/grids/terminal.rb +179 -0
  26. data/lib/smart_machine/machine.rb +26 -5
  27. data/lib/smart_machine/syncer.rb +8 -7
  28. data/lib/smart_machine/templates/dotsmartmachine/config/nextcloud.yml +27 -0
  29. data/lib/smart_machine/templates/dotsmartmachine/config/redis.yml +6 -1
  30. data/lib/smart_machine/templates/dotsmartmachine/config/terminal.yml +13 -0
  31. data/lib/smart_machine/templates/dotsmartmachine/grids/nginx/fastcgi.conf +1 -1
  32. data/lib/smart_machine/templates/dotsmartmachine/grids/nginx/nginx.tmpl +448 -314
  33. data/lib/smart_machine/version.rb +3 -3
  34. data/lib/smart_machine.rb +3 -1
  35. metadata +57 -24
  36. data/lib/smart_machine/buildpackers/rails/Dockerfile +0 -21
  37. data/lib/smart_machine/commands/grid_commands/scheduler.rb +0 -15
  38. data/lib/smart_machine/engine/Dockerfile +0 -30
  39. data/lib/smart_machine/grids/elasticsearch/.keep +0 -0
  40. data/lib/smart_machine/grids/minio/.keep +0 -0
  41. data/lib/smart_machine/grids/nginx/.keep +0 -0
  42. data/lib/smart_machine/grids/prereceiver/fcgiwrap/APKBUILD +0 -49
  43. data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.confd +0 -6
  44. data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.initd +0 -43
  45. data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.pre-install +0 -7
  46. data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/APKINDEX.tar.gz +0 -0
  47. data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-1.1.1-r4.apk +0 -0
  48. data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-doc-1.1.1-r4.apk +0 -0
  49. data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-openrc-1.1.1-r4.apk +0 -0
  50. data/lib/smart_machine/grids/redis/.keep +0 -0
  51. data/lib/smart_machine/grids/scheduler/Dockerfile +0 -14
  52. data/lib/smart_machine/grids/scheduler.rb +0 -188
  53. data/lib/smart_machine/templates/dotsmartmachine/grids/scheduler/crontabs/.keep +0 -0
@@ -0,0 +1,310 @@
1
+ (custom-set-variables
2
+ ;; custom-set-variables was added by Custom.
3
+ ;; If you edit it by hand, you could mess it up, so be careful.
4
+ ;; Your init file should contain only one such instance.
5
+ ;; If there is more than one, they won't work right.
6
+ '(package-selected-packages
7
+ '(polymode ruby-electric ruby-electric-mode ruby-mode dockerfile-mode expand-region flycheck zenburn-theme multi-vterm vterm yaml-mode web-mode use-package undo-tree typescript-mode smartparens robe rbenv rainbow-delimiters projectile-rails osx-trash magit logview indent-guide diredfl dired-sidebar dired-narrow dired-git-info diff-hl company clipetty bundler)))
8
+ (custom-set-faces
9
+ ;; custom-set-faces was added by Custom.
10
+ ;; If you edit it by hand, you could mess it up, so be careful.
11
+ ;; Your init file should contain only one such instance.
12
+ ;; If there is more than one, they won't work right.
13
+ '(diff-hl-change ((t (:foreground "#f7ca88" :background "#f7ca88"))))
14
+ '(diff-hl-delete ((t (:foreground "#ab4642" :background "#ab4642"))))
15
+ '(diff-hl-insert ((t (:foreground "#a1b56c" :background "#a1b56c")))))
16
+
17
+ ;; Add melpa to package-archives list.
18
+ (require 'package)
19
+ (add-to-list 'package-archives
20
+ '("melpa" . "http://melpa.org/packages/") t)
21
+
22
+ ;; use-package
23
+ ;; Ensure use-package is installed.
24
+ (unless (package-installed-p 'use-package)
25
+ (package-refresh-contents)
26
+ (package-install 'use-package))
27
+ ;; Configure and load use-package.
28
+ (setq use-package-always-ensure t)
29
+ (eval-when-compile
30
+ (defvar use-package-verbose t)
31
+ (require 'use-package))
32
+
33
+ ;; Disable menu bar in emacs.
34
+ (menu-bar-mode -1)
35
+
36
+ ;; change backup file directory for emacs
37
+ (setq backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))
38
+
39
+ ;; Use gls instead of the default ls on darwain systems like Apple.
40
+ ;; coreutils is needed to be installed for gls. You can get it with brew install coreutils.
41
+ ;; This solves the --dired problem on macOS and lists the directories first in dired.
42
+ (when (string= system-type "darwin")
43
+ (setq dired-use-ls-dired t
44
+ insert-directory-program "/usr/local/bin/gls"
45
+ dired-listing-switches "-aBhl --ignore=.DS_Store --ignore=.git --ignore=.bundle --ignore=.byebug_history --group-directories-first"))
46
+
47
+ ;; Hide dired details on startup
48
+ (add-hook 'dired-mode-hook
49
+ (lambda ()
50
+ (dired-hide-details-mode)))
51
+
52
+ ;; Setup initial screen
53
+ (setq initial-buffer-choice (expand-file-name "."))
54
+
55
+ ;; Org mode key bindings
56
+ (global-set-key (kbd "C-c l") 'org-store-link)
57
+ (global-set-key (kbd "C-c a") 'org-agenda)
58
+ (global-set-key (kbd "C-c c") 'org-capture)
59
+
60
+ ;; Display line numbers.
61
+ (when (version<= "26.0.50" emacs-version)
62
+ (global-display-line-numbers-mode))
63
+
64
+ ;; Highlight current line.
65
+ (global-hl-line-mode +1)
66
+
67
+ ;; Revert buffers if they've changed on disk
68
+ (global-auto-revert-mode 1)
69
+ (setq auto-revert-verbose nil)
70
+
71
+ ;; Exclude directories from grep.
72
+ (eval-after-load 'grep
73
+ '(progn
74
+ (add-to-list 'grep-find-ignored-directories "log")
75
+ (add-to-list 'grep-find-ignored-directories "node_modules")
76
+ (add-to-list 'grep-find-ignored-directories "public/packs")
77
+ (add-to-list 'grep-find-ignored-directories "storage")
78
+ (add-to-list 'grep-find-ignored-directories "tmp")
79
+ (add-to-list 'grep-find-ignored-directories ".bundle")
80
+ (add-to-list 'grep-find-ignored-directories "auto")
81
+ (add-to-list 'grep-find-ignored-directories "elpa")))
82
+
83
+ (use-package zenburn-theme
84
+ :ensure t
85
+ :config
86
+ (load-theme 'zenburn t)
87
+ (zenburn-with-color-variables
88
+ (custom-theme-set-faces
89
+ 'zenburn
90
+ `(hl-line-face ((t (:background ,zenburn-bg+05 ))))
91
+ `(hl-line ((t (:background ,zenburn-bg+05 ))))
92
+ `(region ((nil (:background ,zenburn-bg+2))))
93
+ )))
94
+
95
+ (use-package logview
96
+ :ensure t)
97
+
98
+ (use-package dired-hacks-utils
99
+ :ensure t)
100
+
101
+ (use-package dired-narrow
102
+ :ensure t
103
+ :bind (:map dired-mode-map
104
+ ("/" . dired-narrow)))
105
+
106
+ (use-package dired-subtree
107
+ :ensure t
108
+ :after dired
109
+ :bind (:map dired-mode-map
110
+ ("TAB" . dired-subtree-toggle)
111
+ ("<backtab>" . dired-subtree-remove))
112
+ :config
113
+ (setq dired-subtree-use-backgrounds nil))
114
+
115
+ (use-package dired-git-info
116
+ :ensure t
117
+ :bind (:map dired-mode-map
118
+ (")" . dired-git-info-mode)))
119
+
120
+ (use-package dired-sidebar
121
+ :ensure t
122
+ :commands (dired-sidebar-toggle-sidebar)
123
+ :bind (("C-x C-n" . dired-sidebar-toggle-sidebar))
124
+ :init
125
+ (setq dired-sidebar-use-term-integration t)
126
+ (setq dired-sidebar-use-custom-font t))
127
+
128
+ (use-package typescript-mode
129
+ :ensure t)
130
+
131
+ (use-package clipetty
132
+ :ensure t
133
+ :bind ("M-w" . clipetty-kill-ring-save))
134
+
135
+ (use-package osx-trash
136
+ :config
137
+ (when (eq system-type 'darwin)
138
+ (osx-trash-setup))
139
+ (setq delete-by-moving-to-trash t))
140
+
141
+ (use-package undo-tree
142
+ :config
143
+ (global-undo-tree-mode))
144
+
145
+ (use-package indent-guide
146
+ :config
147
+ (setq indent-guide-delay 0.3)
148
+ (indent-guide-global-mode))
149
+
150
+ (use-package rainbow-delimiters
151
+ :config
152
+ (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
153
+
154
+ (use-package smartparens
155
+ :config
156
+ (require 'smartparens-config))
157
+ (add-hook 'prog-mode-hook #'smartparens-mode)
158
+
159
+ (use-package ruby-mode
160
+ :config
161
+ (add-to-list 'auto-mode-alist
162
+ '("\\.\\(?:cap\\|gemspec\\|irbrc\\|gemrc\\|rake\\|rb\\|ru\\|thor\\)\\'" . ruby-mode))
163
+ (add-to-list 'auto-mode-alist
164
+ '("\\(?:Brewfile\\|Capfile\\|Gemfile\\(?:\\.[a-zA-Z0-9._-]+\\)?\\|[rR]akefile\\)\\'" . ruby-mode)))
165
+
166
+ (use-package ruby-electric
167
+ :config
168
+ (add-hook 'ruby-mode-hook 'ruby-electric-mode))
169
+
170
+ (use-package robe
171
+ :config
172
+ (eval-after-load 'company '(push 'company-robe company-backends))
173
+ (global-robe-mode))
174
+
175
+ (use-package company
176
+ :config
177
+ (add-hook 'after-init-hook 'global-company-mode))
178
+
179
+ (use-package bundler)
180
+
181
+ (use-package rbenv
182
+ :config
183
+ (global-rbenv-mode))
184
+
185
+ (use-package yaml-mode
186
+ :config
187
+ (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
188
+ (add-hook 'yaml-mode-hook '(lambda () (define-key yaml-mode-map "\C-m" 'newline-and-indent))))
189
+
190
+ (use-package web-mode
191
+ :config
192
+ (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
193
+ (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
194
+ (add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
195
+ (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
196
+ (add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
197
+ (add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
198
+ (add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
199
+ (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
200
+ (add-to-list 'auto-mode-alist '("\\.js?\\'" . web-mode))
201
+ (add-to-list 'auto-mode-alist '("\\.jsx?\\'" . web-mode))
202
+ (add-to-list 'auto-mode-alist '("\\.css?\\'" . web-mode))
203
+ (add-to-list 'auto-mode-alist '("\\.scss?\\'" . web-mode))
204
+ (add-to-list 'auto-mode-alist '("\\.xml?\\'" . web-mode)))
205
+
206
+ (use-package projectile
207
+ :config
208
+ (projectile-mode +1)
209
+ (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map)
210
+ (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
211
+
212
+ (use-package projectile-rails
213
+ :config
214
+ (projectile-rails-global-mode)
215
+ (define-key projectile-rails-mode-map (kbd "C-c r") 'projectile-rails-command-map))
216
+
217
+ ;; Extra font lock rules for a more colourful dired.
218
+ (use-package diredfl
219
+ :ensure t
220
+ :config
221
+ (diredfl-global-mode))
222
+
223
+ (use-package diff-hl
224
+ :custom-face
225
+ ;; Change colors for insert, delete and change indicators in diff-hl
226
+ (diff-hl-insert ((t (:foreground "#a1b56c" :background "#a1b56c"))))
227
+ (diff-hl-delete ((t (:foreground "#ab4642" :background "#ab4642"))))
228
+ (diff-hl-change ((t (:foreground "#f7ca88" :background "#f7ca88"))))
229
+
230
+ :hook
231
+ ;; To enable in all Dired buffers.
232
+ (dired-mode . diff-hl-dired-mode)
233
+ ;; diff-hl integration with magit.
234
+ (magit-pre-refresh . diff-hl-magit-pre-refresh)
235
+ (magit-post-refresh . diff-hl-magit-post-refresh)
236
+
237
+ :config
238
+ ;; it modifies 'diff-hl-mode' to use the margin instead of the fringe. The unless condition does this only for terminal.
239
+ (unless (window-system) (diff-hl-margin-mode))
240
+ ;; This mode enables diffing on-the-fly.
241
+ (diff-hl-flydiff-mode)
242
+ ;; Highlight uncommitted changes using VCHighlight uncommitted changes using VC.
243
+ (global-diff-hl-mode))
244
+
245
+ ;; A Git porcelain inside Emacs.
246
+ (use-package magit
247
+ :ensure t
248
+
249
+ :commands (magit-add-section-hook magit-section-initial-visibility-alist)
250
+
251
+ :init
252
+ (setq magit-diff-refine-hunk 'all)
253
+ (setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
254
+
255
+ :config
256
+ ;; To list branches and tags directly in your Magit status buffer.
257
+ (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-local-branches nil t)
258
+ (add-to-list 'magit-section-initial-visibility-alist '(local . hide))
259
+ (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-remote-branches nil t)
260
+ (add-to-list 'magit-section-initial-visibility-alist '(remote . hide))
261
+ (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-tags nil t)
262
+ (add-to-list 'magit-section-initial-visibility-alist '(tags . hide)))
263
+
264
+ ;; Emacs-libvterm (vterm) is fully-fledged terminal emulator inside GNU Emacs based on libvterm, a C library.
265
+ (use-package vterm
266
+ :ensure t
267
+ :config
268
+ (define-key vterm-mode-map (kbd "C-q") #'vterm-send-next-key)
269
+ :custom
270
+ (vterm-always-compile-module t))
271
+ ;; Managing multiple vterm buffers in Emacs.
272
+ (use-package multi-vterm
273
+ :ensure t)
274
+
275
+ ;; Flycheck is a modern on-the-fly syntax checking extension for GNU Emacs.
276
+ (use-package flycheck
277
+ :ensure t
278
+ :init
279
+ (global-flycheck-mode))
280
+
281
+ ;; Expand region increases the selected region by semantic units. Just keep pressing the key until it selects what you want.
282
+ (use-package expand-region
283
+ :ensure t
284
+ :bind
285
+ ("C-=" . er/expand-region))
286
+
287
+ (use-package dockerfile-mode
288
+ :ensure t)
289
+
290
+ ;; Polymode is a framework for multiple major modes (MMM) inside a single Emacs buffer.
291
+ (use-package polymode
292
+ :ensure t
293
+
294
+ :config
295
+ (with-eval-after-load "polymode"
296
+ (eieio-oset-default pm-inner-chunkmode :adjust-face -2))
297
+ (define-innermode poly-dockerfile-innermode
298
+ :mode 'dockerfile-mode
299
+ :head-matcher "<<[~-]?\'?DOCKERFILE_?\'?.*\r?\n"
300
+ :tail-matcher "[ \t]*DOCKERFILE_?.*\r?\n")
301
+ (define-polymode poly-ruby-mode
302
+ :hostmode 'poly-ruby-hostmode
303
+ :innermodes '(poly-dockerfile-innermode))
304
+ (add-to-list 'auto-mode-alist '("\\.rb" . poly-ruby-mode))
305
+
306
+ :hook
307
+ (poly-ruby-mode . (lambda ()
308
+ (setq dockerfile-enable-auto-indent nil))))
309
+
310
+ ;;; init.el ends here
@@ -0,0 +1,44 @@
1
+ module SmartMachine
2
+ class Grids
3
+ class Terminal < SmartMachine::Base
4
+ class Wetty
5
+ def initialize(name:, host:, ssh_host:)
6
+ @name = name
7
+ @host = host
8
+ @ssh_host = ssh_host
9
+ end
10
+
11
+ def uper
12
+ raise "Error: Could not create container: #{@name}" unless system(command.compact.join(' '), out: File::NULL)
13
+ raise "Error: Could not start container: #{@name}" unless system("docker start #{@name}", out: File::NULL)
14
+
15
+ puts "Created & Started container: #{@name}"
16
+ end
17
+
18
+ def downer
19
+ raise "Error: Could not stop container: #{@name}" unless system("docker stop '#{@name}'", out: File::NULL)
20
+ raise "Error: Could not remove container: #{@name}" unless system("docker rm '#{@name}'", out: File::NULL)
21
+
22
+ puts "Stopped & Removed container: #{@name}"
23
+ end
24
+
25
+ private
26
+
27
+ def command
28
+ [
29
+ 'docker create',
30
+ "--name='#{@name}'",
31
+ "--env VIRTUAL_HOST=#{@host}",
32
+ "--env VIRTUAL_PATH=/",
33
+ "--env LETSENCRYPT_HOST=#{@host}",
34
+ "--env LETSENCRYPT_EMAIL=#{SmartMachine.config.sysadmin_email}",
35
+ '--env LETSENCRYPT_TEST=false',
36
+ "--restart='always'",
37
+ "--network='nginx-network'",
38
+ "wettyoss/wetty --base=/ --ssh-host=#{@ssh_host} --ssh-port=2223 --force-ssh=true --title=Terminal"
39
+ ]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,179 @@
1
+ module SmartMachine
2
+ class Grids
3
+ class Terminal < SmartMachine::Base
4
+ def initialize(name:)
5
+ config = SmartMachine.config.grids.terminal.dig(name.to_sym)
6
+ raise "terminal config for #{name} not found." unless config
7
+
8
+ @image = "smartmachine/terminal:#{SmartMachine.version}"
9
+ @host = config.dig(:host)
10
+ @frontend = config.dig(:frontend)
11
+ @packages = config.dig(:packages)
12
+ @username = config.dig(:username)
13
+ @password = config.dig(:password)
14
+
15
+ @name = name.to_s
16
+ @home_dir = File.expand_path('~')
17
+
18
+ @wetty = Wetty.new(name: "#{@name}-wetty", host: @host, ssh_host: @name)
19
+ end
20
+
21
+ def installer
22
+ unless system("docker image inspect #{@image}", [:out, :err] => File::NULL)
23
+ puts "-----> Creating image #{@image} ... "
24
+ command = [
25
+ "docker image build -t #{@image}",
26
+ "--build-arg SMARTMACHINE_VERSION=#{SmartMachine.version}",
27
+ "-f- #{SmartMachine.config.gem_dir}/lib/smart_machine/grids/terminal",
28
+ "<<'EOF'\n#{dockerfile}EOF"
29
+ ]
30
+ if system(command.join(" "), out: File::NULL)
31
+ puts "done"
32
+ else
33
+ raise "Error: Could not install image: #{@image}"
34
+ end
35
+ else
36
+ raise "Error: Image already installed: #{@image}. Please uninstall using 'smartmachine grids terminal uninstall' and try installing again."
37
+ end
38
+ end
39
+
40
+ def uninstaller
41
+ unless system("docker inspect -f '{{.State.Running}}' '#{@name}'", [:out, :err] => File::NULL)
42
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
43
+ puts "-----> Removing image #{@image} ... "
44
+ if system("docker image rm #{@image}", out: File::NULL)
45
+ puts "done"
46
+ end
47
+ else
48
+ raise "Error: Terminal already uninstalled. Please install using 'smartmachine grids terminal install' and try uninstalling again."
49
+ end
50
+ else
51
+ raise "Error: Terminal is currently running. Please stop the terminal using 'smartmachine grids terminal down' and try uninstalling again."
52
+ end
53
+ end
54
+
55
+ def uper
56
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
57
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/terminal/#{@name}/backups")
58
+
59
+ # Creating & Starting containers
60
+ print "-----> Creating container #{@name} ... "
61
+
62
+ command = [
63
+ "docker create",
64
+ "--name='#{@name}'",
65
+ "--env VIRTUAL_HOST=#{@host}",
66
+ "--env VIRTUAL_PATH=#{@frontend}",
67
+ "--env VIRTUAL_PORT=80",
68
+ "--env LETSENCRYPT_HOST=#{@host}",
69
+ "--env LETSENCRYPT_EMAIL=#{SmartMachine.config.sysadmin_email}",
70
+ "--env LETSENCRYPT_TEST=false",
71
+ "--env CONTAINER_NAME='#{@name}'",
72
+ "--env PACKAGES='#{@packages.join(' ')}'",
73
+ "--env USERNAME=#{@username}",
74
+ "--env PASSWORD=#{@password}",
75
+ "--publish='2223:2223'", # TODO: Remove this published port and move it behind the reverse proxy when ready.
76
+ "--volume='#{@name}-home:/home'",
77
+ "--volume='#{@home_dir}/smartmachine/grids/terminal/#{@name}/backups:/root/backups'",
78
+ "--init",
79
+ "--restart='always'",
80
+ "--network='nginx-network'",
81
+ "#{@image}"
82
+ ]
83
+ if system(command.compact.join(" "), out: File::NULL)
84
+ puts "done"
85
+ puts "-----> Starting container #{@name} ... "
86
+ if system("docker start #{@name}", out: File::NULL)
87
+ puts "done"
88
+
89
+ @wetty.uper
90
+ else
91
+ raise "Error: Could not start container: #{@name}"
92
+ end
93
+ else
94
+ raise "Error: Could not create container: #{@name}"
95
+ end
96
+ else
97
+ raise "Error: Could not find image: #{@image}"
98
+ end
99
+ end
100
+
101
+ def downer
102
+ # Stopping & Removing containers - in reverse order
103
+
104
+ @wetty.downer
105
+
106
+ print "-----> Stopping container #{@name} ... "
107
+ if system("docker stop '#{@name}'", out: File::NULL)
108
+ puts "done"
109
+ print "-----> Removing container #{@name} ... "
110
+ if system("docker rm '#{@name}'", out: File::NULL)
111
+ puts "done"
112
+ end
113
+ end
114
+ end
115
+
116
+ private
117
+
118
+ # openssh-server
119
+ # sshd needs rsyslog to output /var/log/auth.log.
120
+ # imklog module is commented in rsyslog.conf because rsyslog does not
121
+ # have privileges to run it and hence throws error on startup.
122
+ #
123
+ # fail2ban
124
+ # fail2ban needs sshd to output /var/log/auth.log.
125
+ # Otherwise it cannot start the sshd jail.
126
+ def dockerfile
127
+ file = <<~'DOCKERFILE'
128
+ ARG SMARTMACHINE_VERSION
129
+
130
+ FROM smartmachine/smartengine:$SMARTMACHINE_VERSION
131
+ LABEL maintainer="plainsource <plainsource@humanmind.me>"
132
+
133
+ RUN apt-get update && \
134
+ \
135
+ apt-get install -y --no-install-recommends sudo && \
136
+ \
137
+ apt-get install -y --no-install-recommends rsyslog openssh-server && \
138
+ mkdir -p /run/sshd && \
139
+ sed -i'.original' '/#Port 22/a Port 2223' /etc/ssh/sshd_config && \
140
+ sed -i '/#AddressFamily any/a AddressFamily inet' /etc/ssh/sshd_config && \
141
+ sed -i '/#PermitRootLogin prohibit-password/a PermitRootLogin no' /etc/ssh/sshd_config && \
142
+ sed -i '/imklog/s/^/#/' /etc/rsyslog.conf && \
143
+ \
144
+ apt-get install -y --no-install-recommends fail2ban sendmail-bin sendmail && \
145
+ cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local && \
146
+ cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
147
+ sed -i'.original' 's/destemail = root@localhost/#destemail = root@localhost\ndestemail = %<sysadmin_email>s/' /etc/fail2ban/jail.local && \
148
+ sed -i 's/action = %<percent>s(action_)s/#action = %<percent>s(action_)s\naction = %<percent>s(action_mwl)s/' /etc/fail2ban/jail.local && \
149
+ sed -i 's/port = ssh/#port = ssh\nport = 2223/' /etc/fail2ban/jail.local && \
150
+ \
151
+ apt-get install -y --no-install-recommends haproxy && \
152
+ mkdir -p /run/haproxy && \
153
+ mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.original && \
154
+ \
155
+ apt-get install -y --no-install-recommends cmake libtool libtool-bin emacs-nox && \
156
+ mkdir -p /root/.emacs.d && \
157
+ \
158
+ apt-get install -y --no-install-recommends vim && \
159
+ \
160
+ rm -rf /var/lib/apt/lists/* && \
161
+ gem install bundler -v 2.1.4
162
+
163
+ COPY haproxy.cfg /etc/haproxy
164
+ COPY init.el /root/.emacs.d/init.el
165
+
166
+ COPY entrypoint.rb /usr/local/bin/entrypoint.rb
167
+ RUN chmod +x /usr/local/bin/entrypoint.rb
168
+ ENTRYPOINT ["entrypoint.rb"]
169
+
170
+ EXPOSE 2223 80
171
+ STOPSIGNAL SIGUSR1
172
+ CMD ["haproxy", "-W", "-db", "-f", "/etc/haproxy/haproxy.cfg"]
173
+ DOCKERFILE
174
+
175
+ format(file, "sysadmin_email": SmartMachine.config.sysadmin_email, "percent": '%')
176
+ end
177
+ end
178
+ end
179
+ end
@@ -49,11 +49,6 @@ module SmartMachine
49
49
  puts "New machine #{name} has been created."
50
50
  end
51
51
 
52
- def initial_setup
53
- getting_started
54
- securing_your_server
55
- end
56
-
57
52
  def run_on_machine(commands:)
58
53
  commands = Array(commands).flatten
59
54
  ssh = SmartMachine::SSH.new
@@ -62,9 +57,35 @@ module SmartMachine
62
57
  status[:exit_code] == 0
63
58
  end
64
59
 
60
+ def setup
61
+ getting_started
62
+ securing_your_server
63
+ end
64
+
65
65
  private
66
66
 
67
67
  def getting_started
68
+ run_on_machine(commands: "sudo apt update && sudo apt upgrade")
69
+
70
+ sysctl_lines = []
71
+ # sysctl_lines.push('# KVM uses this.')
72
+ # sysctl_lines.push('# These lines should only be activated for VM hosts and not for VM guests.')
73
+ # sysctl_lines.push('# When getting a VM from a service provider, you will usually get a VM guest and not a VM host and hence these lines should not be added.')
74
+ # sysctl_lines.push('# Prevent bridged traffic from being processed by iptables rules.')
75
+ # sysctl_lines.push('net.bridge.bridge-nf-call-ip6tables=0')
76
+ # sysctl_lines.push('net.bridge.bridge-nf-call-iptables=0')
77
+ # sysctl_lines.push('net.bridge.bridge-nf-call-arptables=0')
78
+ sysctl_lines.push('# Redis uses this.')
79
+ sysctl_lines.push('vm.overcommit_memory=1')
80
+ sysctl_lines.push('# Elasticsearch uses this.')
81
+ sysctl_lines.push('vm.max_map_count=262144')
82
+ commands = [
83
+ "sudo touch /etc/sysctl.d/99-smartmachine.conf",
84
+ "echo -e '#{sysctl_lines.join('\n')}' | sudo tee /etc/sysctl.d/99-smartmachine.conf",
85
+ "sudo sysctl -p /etc/sysctl.d/99-smartmachine.conf"
86
+ ]
87
+ run_on_machine(commands: commands)
88
+
68
89
  # apt install locales-all
69
90
 
70
91
  # puts 'You may be prompted to make a menu selection when the Grub package is updated on Ubuntu. If prompted, select keep the local version currently installed.'
@@ -68,6 +68,9 @@ module SmartMachine
68
68
  'grids/mysql',
69
69
  'grids/mysql/***',
70
70
 
71
+ 'grids/nextcloud',
72
+ 'grids/nextcloud/***',
73
+
71
74
  'grids/nginx',
72
75
  'grids/nginx/certificates/***',
73
76
 
@@ -77,11 +80,11 @@ module SmartMachine
77
80
  'grids/redis',
78
81
  'grids/redis/***',
79
82
 
80
- 'grids/scheduler',
81
- 'grids/scheduler/crontabs/***',
82
-
83
83
  'grids/solr',
84
84
  'grids/solr/solr/***',
85
+
86
+ 'grids/terminal',
87
+ 'grids/terminal/***',
85
88
  ]
86
89
  files.join(',')
87
90
  end
@@ -105,8 +108,10 @@ module SmartMachine
105
108
  'config/elasticsearch.yml',
106
109
  'config/minio.yml',
107
110
  'config/mysql.yml',
111
+ 'config/nextcloud.yml',
108
112
  'config/prereceiver.yml',
109
113
  'config/redis.yml',
114
+ 'config/terminal.yml',
110
115
 
111
116
  'grids',
112
117
 
@@ -117,10 +122,6 @@ module SmartMachine
117
122
  'grids/nginx/fastcgi.conf',
118
123
  'grids/nginx/nginx.tmpl',
119
124
 
120
- 'grids/scheduler',
121
- 'grids/scheduler/crontabs',
122
- 'grids/scheduler/crontabs/.keep',
123
-
124
125
  'grids/solr',
125
126
  'grids/solr/solr',
126
127
  'grids/solr/solr/.keep',
@@ -0,0 +1,27 @@
1
+ nextcloudone:
2
+ image: "nextcloud:25.0.1-apache"
3
+ host: "yournextcloudone.yourdomain.com"
4
+ admin_user: <%= SmartMachine.credentials.dig(:nextcloudone, :admin_user) %>
5
+ admin_password: <%= SmartMachine.credentials.dig(:nextcloudone, :admin_password) %>
6
+ mysql_host: mysqlone
7
+ mysql_port: 3306
8
+ mysql_user: <%= SmartMachine.credentials.dig(:nextcloudone, :mysql_user) %>
9
+ mysql_password: <%= SmartMachine.credentials.dig(:nextcloudone, :mysql_password) %>
10
+ mysql_database_name: <%= SmartMachine.credentials.dig(:nextcloudone, :mysql_database_name) %>
11
+ redis_host: redisone
12
+ redis_port: 6379
13
+ redis_password: <%= SmartMachine.credentials.dig(:redisone, :password) %>
14
+
15
+ # nextcloudtwo:
16
+ # image: "nextcloud:25.0.1-apache"
17
+ # host: "yournextcloudtwo.yourdomain.com"
18
+ # admin_user: <%= SmartMachine.credentials.dig(:nextcloudtwo, :admin_user) %>
19
+ # admin_password: <%= SmartMachine.credentials.dig(:nextcloudtwo, :admin_password) %>
20
+ # mysql_host: mysqlone
21
+ # mysql_port: 3306
22
+ # mysql_user: <%= SmartMachine.credentials.dig(:nextcloudtwo, :mysql_user) %>
23
+ # mysql_password: <%= SmartMachine.credentials.dig(:nextcloudtwo, :mysql_password) %>
24
+ # mysql_database_name: <%= SmartMachine.credentials.dig(:nextcloudtwo, :mysql_database_name) %>
25
+ # redis_host: redistwo
26
+ # redis_port: 6380
27
+ # redis_password: <%= SmartMachine.credentials.dig(:redistwo, :password) %>
@@ -1,12 +1,17 @@
1
+ # For redis modules you need to use the image redislabs/redismod:latest
2
+ # https://hub.docker.com/r/redislabs/redismod
3
+
1
4
  redisone:
5
+ image: "redis:6.2.6-alpine3.15"
2
6
  port: 6379
3
7
  password: <%= SmartMachine.credentials.dig(:redisone, :password) %>
4
8
  appendonly: "yes"
5
9
  maxmemory: 250MB
6
10
  maxmemory_policy: allkeys-lfu
7
- modules: []
11
+ # modules: []
8
12
 
9
13
  # redistwo:
14
+ # image: "redis:6.2.6-alpine3.15"
10
15
  # port: 6380
11
16
  # password: <%= SmartMachine.credentials.dig(:redistwo, :password) %>
12
17
  # appendonly: "yes"
@@ -0,0 +1,13 @@
1
+ terminalone:
2
+ host: "yourterminalone.yourdomain.com"
3
+ frontend: "/frontend"
4
+ username: <%= SmartMachine.credentials.dig(:terminalone, :username) %>
5
+ password: <%= SmartMachine.credentials.dig(:terminalone, :password) %>
6
+ packages: []
7
+
8
+ # terminaltwo:
9
+ # host: "yourterminaltwo.yourdomain.com"
10
+ # frontend: "/frontend"
11
+ # username: <%= SmartMachine.credentials.dig(:terminaltwo, :username) %>
12
+ # password: <%= SmartMachine.credentials.dig(:terminaltwo, :password) %>
13
+ # packages: []