smartmachine 1.0.1 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -14
- data/lib/smart_machine/apps/container.rb +1 -0
- data/lib/smart_machine/apps/manager.rb +1 -1
- data/lib/smart_machine/base.rb +6 -0
- data/lib/smart_machine/buildpackers/buildpacker.rb +49 -1
- data/lib/smart_machine/buildpackers/rails.rb +87 -12
- data/lib/smart_machine/commands/grid.rb +8 -0
- data/lib/smart_machine/commands/grid_commands/elasticsearch.rb +0 -3
- data/lib/smart_machine/commands/grid_commands/nextcloud.rb +65 -0
- data/lib/smart_machine/commands/grid_commands/terminal.rb +107 -0
- data/lib/smart_machine/commands/machine.rb +8 -0
- data/lib/smart_machine/configuration.rb +23 -1
- data/lib/smart_machine/credentials.rb +9 -0
- data/lib/smart_machine/docker.rb +10 -9
- data/lib/smart_machine/engine.rb +44 -9
- data/lib/smart_machine/grids/nextcloud.rb +93 -0
- data/lib/smart_machine/grids/prereceiver/Dockerfile +10 -13
- data/lib/smart_machine/grids/redis.rb +8 -3
- data/lib/smart_machine/grids/redmine.rb +61 -0
- data/lib/smart_machine/grids/terminal/entrypoint.rb +95 -0
- data/lib/smart_machine/grids/terminal/haproxy.cfg +45 -0
- data/lib/smart_machine/grids/terminal/init.el +310 -0
- data/lib/smart_machine/grids/terminal/wetty.rb +44 -0
- data/lib/smart_machine/grids/terminal.rb +179 -0
- data/lib/smart_machine/machine.rb +26 -5
- data/lib/smart_machine/syncer.rb +11 -10
- data/lib/smart_machine/templates/dotsmartmachine/config/nextcloud.yml +27 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/redis.yml +6 -1
- data/lib/smart_machine/templates/dotsmartmachine/config/terminal.yml +13 -0
- data/lib/smart_machine/templates/dotsmartmachine/grids/nginx/fastcgi.conf +1 -1
- data/lib/smart_machine/templates/dotsmartmachine/grids/nginx/nginx.tmpl +448 -314
- data/lib/smart_machine/version.rb +2 -2
- data/lib/smart_machine.rb +3 -1
- metadata +57 -24
- data/lib/smart_machine/buildpackers/rails/Dockerfile +0 -21
- data/lib/smart_machine/commands/grid_commands/scheduler.rb +0 -15
- data/lib/smart_machine/engine/Dockerfile +0 -30
- data/lib/smart_machine/grids/elasticsearch/.keep +0 -0
- data/lib/smart_machine/grids/minio/.keep +0 -0
- data/lib/smart_machine/grids/nginx/.keep +0 -0
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/APKBUILD +0 -49
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.confd +0 -6
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.initd +0 -43
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/fcgiwrap.pre-install +0 -7
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/APKINDEX.tar.gz +0 -0
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-1.1.1-r4.apk +0 -0
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-doc-1.1.1-r4.apk +0 -0
- data/lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-openrc-1.1.1-r4.apk +0 -0
- data/lib/smart_machine/grids/redis/.keep +0 -0
- data/lib/smart_machine/grids/scheduler/Dockerfile +0 -14
- data/lib/smart_machine/grids/scheduler.rb +0 -188
- data/lib/smart_machine/templates/dotsmartmachine/grids/scheduler/crontabs/.keep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7216722bfdaa3eefae5c9de4eaa5b21c684b281226a917923ba3d09801471bc8
|
4
|
+
data.tar.gz: 1b9e007c73ec297eb4c27d61de76e21ea612f81e4252a65f18a835f8ed1c2326
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e5ebde0903f967e19f36d238e767ae189de377ff3c404adc721b2f28c588a51a9165b38938098bb2c533c9320e7dc0188d91f2cb0a01848b3f789e52adc8866
|
7
|
+
data.tar.gz: 9b70003e202c55ae5f85ef1866b43804bfd226ed853ad01d99fdf2b9df66d457912f17959f6ed32df3998ddb2159b5720049cf0ea10668955fba7189c3ce7397
|
data/README.md
CHANGED
@@ -50,13 +50,9 @@ Add your credentials using:
|
|
50
50
|
|
51
51
|
$ smartmachine credentials:edit
|
52
52
|
|
53
|
-
Add your
|
53
|
+
Add your config details with your favourite editor (here emacs is shown):
|
54
54
|
|
55
|
-
$
|
56
|
-
|
57
|
-
Add your users using:
|
58
|
-
|
59
|
-
$ smartmachine grid nginx users:edit
|
55
|
+
$ emacs ./config
|
60
56
|
|
61
57
|
Install docker, and add UFW rules for Docker if specified at the end of installation.
|
62
58
|
|
@@ -111,14 +107,6 @@ Lets you run redis server instance for cache storage and job queueing.
|
|
111
107
|
$ smartmachine grid redis up
|
112
108
|
$ smartmachine grid redis down
|
113
109
|
|
114
|
-
#### 6. Scheduler Grid - Coming Soon
|
115
|
-
Lets you setup scheduling services like database backups, etc.
|
116
|
-
|
117
|
-
$ smartmachine grid scheduler install
|
118
|
-
$ smartmachine grid scheduler up
|
119
|
-
$ smartmachine grid scheduler down
|
120
|
-
$ smartmachine grid scheduler uninstall
|
121
|
-
|
122
110
|
### Setup Your Apps
|
123
111
|
|
124
112
|
Create your apps and manage them.
|
@@ -26,6 +26,7 @@ module SmartMachine
|
|
26
26
|
"--workdir /app",
|
27
27
|
"--expose='3000'",
|
28
28
|
"--volume='#{@home_dir}/smartmachine/config/environment.rb:#{@home_dir}/machine/config/environment.rb'",
|
29
|
+
"--volume='#{@home_dir}/smartmachine/apps/containers/#{@appname}/asdf:#{@home_dir}/.asdf'",
|
29
30
|
"--volume='#{@home_dir}/smartmachine/apps/containers/#{@appname}/releases/#{@appversion}:/app'",
|
30
31
|
"--volume='#{@home_dir}/smartmachine/apps/containers/#{@appname}/app/vendor/bundle:/app/vendor/bundle'",
|
31
32
|
"--volume='#{@home_dir}/smartmachine/apps/containers/#{@appname}/app/public/assets:/app/public/assets'",
|
@@ -105,7 +105,7 @@ module SmartMachine
|
|
105
105
|
|
106
106
|
def containerize_process!(name:, config:)
|
107
107
|
container = SmartMachine::Apps::Container.new(name: name, appname: @appname, appversion: @appversion)
|
108
|
-
if container.create!(using_command: config.dig(:command))
|
108
|
+
if container.create!(using_command: user_bash(config.dig(:command)))
|
109
109
|
networks = config.dig(:networks)&.split(" ")
|
110
110
|
networks.each do |network|
|
111
111
|
container.connect_to_network!(network_name: network)
|
data/lib/smart_machine/base.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'smart_machine/logger'
|
2
2
|
require "active_support/inflector"
|
3
|
+
require 'active_support/core_ext/string/filters'
|
3
4
|
|
4
5
|
module SmartMachine
|
5
6
|
class Base
|
@@ -25,5 +26,10 @@ module SmartMachine
|
|
25
26
|
machine = SmartMachine::Machine.new
|
26
27
|
machine.run_on_machine(commands: ["which smartengine | grep -q '/smartengine'"])
|
27
28
|
end
|
29
|
+
|
30
|
+
def user_bash(command)
|
31
|
+
remove_envs = %w(RUBY_MAJOR RUBY_VERSION RUBY_DOWNLOAD_SHA256 GEM_HOME BUNDLE_APP_CONFIG BUNDLE_SILENCE_ROOT_WARNING)
|
32
|
+
'env -u ' + remove_envs.join(' -u ') + ' bash --login -c \'' + command + '\''
|
33
|
+
end
|
28
34
|
end
|
29
35
|
end
|
@@ -14,7 +14,7 @@ module SmartMachine
|
|
14
14
|
"--build-arg SMARTMACHINE_VERSION=#{SmartMachine.version}",
|
15
15
|
"--build-arg USER_UID=`id -u`",
|
16
16
|
"--build-arg USER_NAME=`id -un`",
|
17
|
-
"#{
|
17
|
+
"-<<'EOF'\n#{dockerfile_rails}EOF"
|
18
18
|
]
|
19
19
|
if system(command.join(" "), out: File::NULL)
|
20
20
|
puts "done"
|
@@ -53,6 +53,54 @@ module SmartMachine
|
|
53
53
|
"smartmachine/buildpackers/rails:#{SmartMachine.version}"
|
54
54
|
end
|
55
55
|
|
56
|
+
def dockerfile_rails
|
57
|
+
file = <<~'DOCKERFILE'
|
58
|
+
ARG SMARTMACHINE_VERSION
|
59
|
+
|
60
|
+
FROM smartmachine/smartengine:$SMARTMACHINE_VERSION
|
61
|
+
LABEL maintainer="plainsource <plainsource@humanmind.me>"
|
62
|
+
|
63
|
+
RUN apt-get update && \
|
64
|
+
apt-get install -y --no-install-recommends \
|
65
|
+
# dependencies for ruby from https://github.com/rbenv/ruby-build/wiki#ubuntudebianmint
|
66
|
+
autoconf \
|
67
|
+
bison \
|
68
|
+
patch \
|
69
|
+
build-essential \
|
70
|
+
rustc \
|
71
|
+
libssl-dev \
|
72
|
+
libyaml-dev \
|
73
|
+
libreadline6-dev \
|
74
|
+
zlib1g-dev \
|
75
|
+
libgmp-dev \
|
76
|
+
libncurses5-dev \
|
77
|
+
libffi-dev \
|
78
|
+
libgdbm6 \
|
79
|
+
libgdbm-dev \
|
80
|
+
libdb-dev \
|
81
|
+
uuid-dev && \
|
82
|
+
# ruby on rails
|
83
|
+
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
|
84
|
+
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
|
85
|
+
apt-get update && \
|
86
|
+
apt-get install -y --no-install-recommends \
|
87
|
+
tzdata \
|
88
|
+
nodejs \
|
89
|
+
yarn \
|
90
|
+
libmariadb-dev \
|
91
|
+
libvips42 \
|
92
|
+
ffmpeg \
|
93
|
+
mupdf \
|
94
|
+
mupdf-tools \
|
95
|
+
poppler-utils && \
|
96
|
+
rm -rf /var/lib/apt/lists/*
|
97
|
+
|
98
|
+
CMD ["smartmachine", "buildpacker", "packer", "rails"]
|
99
|
+
DOCKERFILE
|
100
|
+
|
101
|
+
format(file)
|
102
|
+
end
|
103
|
+
|
56
104
|
# These swapfile methods can be used (after required modification), when you need to make swapfile for more memory.
|
57
105
|
# def self.create_swapfile
|
58
106
|
# # Creating swapfile for bundler to work properly
|
@@ -42,6 +42,7 @@ module SmartMachine
|
|
42
42
|
FileUtils.mkdir_p("#{@container_path}/app/public/packs")
|
43
43
|
FileUtils.mkdir_p("#{@container_path}/app/node_modules")
|
44
44
|
FileUtils.mkdir_p("#{@container_path}/app/storage")
|
45
|
+
FileUtils.mkdir_p("#{@container_path}/asdf")
|
45
46
|
FileUtils.mkdir_p("#{@container_path}/releases/#{@appversion}/vendor/bundle")
|
46
47
|
FileUtils.mkdir_p("#{@container_path}/releases/#{@appversion}/public/assets")
|
47
48
|
FileUtils.mkdir_p("#{@container_path}/releases/#{@appversion}/public/packs")
|
@@ -62,13 +63,15 @@ module SmartMachine
|
|
62
63
|
def packer
|
63
64
|
set_logger_formatter_arrow
|
64
65
|
|
66
|
+
# TODO: The exec of final process should be done only in the Manager#containerize_process! and should be removed from here.
|
67
|
+
# This method should only pack a fully functioning container and do nothing else.
|
65
68
|
if File.exist? "tmp/smartmachine/packed"
|
66
69
|
begin
|
67
70
|
pid = File.read('tmp/smartmachine/packed').to_i
|
68
71
|
Process.kill('QUIT', pid)
|
69
72
|
rescue Errno::ESRCH # No such process
|
70
73
|
end
|
71
|
-
exec
|
74
|
+
exec(user_bash("bundle exec puma --config config/puma.rb"))
|
72
75
|
else
|
73
76
|
if initial_setup? && bundle_install? && precompile_assets? && db_migrate? && test_web_server?
|
74
77
|
logger.formatter = nil
|
@@ -89,18 +92,90 @@ module SmartMachine
|
|
89
92
|
def initial_setup?
|
90
93
|
logger.info "Performing initial setup ..."
|
91
94
|
|
92
|
-
|
95
|
+
set_logger_formatter_tabs
|
93
96
|
|
94
97
|
# Fix for mysql2 gem to support sha256_password, until it is fixed in main mysql2 gem.
|
95
98
|
# https://github.com/brianmario/mysql2/issues/1023
|
96
|
-
|
99
|
+
unless system("mkdir -p ./lib/mariadb && ln -s /usr/lib/mariadb/plugin ./lib/mariadb/plugin")
|
100
|
+
logger.error "Could not setup fix for mysql2 mariadb folders."
|
101
|
+
return false
|
102
|
+
end
|
97
103
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
104
|
+
# Install asdf
|
105
|
+
system("echo '\n# asdf version manager\nif [ -f \"$HOME/.asdf/asdf.sh\" ]; then\n . \"$HOME/.asdf/asdf.sh\"\nfi\nif [ -f \"$HOME/.asdf/completions/asdf.bash\" ]; then\n . \"$HOME/.asdf/completions/asdf.bash\"\nfi' >> ~/.profile", out: File::NULL)
|
106
|
+
unless system(user_bash("asdf --version"), [:out, :err] => File::NULL)
|
107
|
+
asdf_version = `git -c 'versionsort.suffix=-' ls-remote --exit-code --refs --sort='version:refname' --tags https://github.com/asdf-vm/asdf.git '*.*.*' | tail --lines=1 | cut --delimiter='/' --fields=3`.strip
|
108
|
+
logger.info "Installing asdf #{asdf_version}...\n"
|
109
|
+
|
110
|
+
# Clear all files inside .asdf dir including dot files.
|
111
|
+
system("rm -rf ~/.asdf/..?* ~/.asdf/.[!.]* ~/.asdf/*")
|
112
|
+
Open3.popen2e(user_bash("git -c advice.detachedHead=false clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch #{asdf_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
113
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
114
|
+
end
|
115
|
+
|
116
|
+
unless system(user_bash("asdf --version"), [:out, :err] => File::NULL)
|
117
|
+
logger.error "Could not install asdf.\n"
|
118
|
+
return false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
logger.info "Using asdf " + `#{user_bash("asdf --version")}`.strip + "\n"
|
122
|
+
|
123
|
+
# Install ruby
|
124
|
+
ruby_version = `sed -n '/RUBY VERSION/{n;p}' Gemfile.lock`.strip.split(" ").last&.split("p")&.first
|
125
|
+
if ruby_version.nil? || ruby_version.empty?
|
126
|
+
logger.error "Could not find ruby version. Have you specified it explicitly in Gemfile and run bundle install?\n"
|
127
|
+
return false
|
128
|
+
end
|
129
|
+
|
130
|
+
unless `#{user_bash('ruby -e "puts RUBY_VERSION"')}`.strip == ruby_version
|
131
|
+
logger.info "Installing ruby v#{ruby_version}\n"
|
132
|
+
|
133
|
+
Open3.popen2e(user_bash("asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git")) do |stdin, stdout_and_stderr, wait_thr|
|
134
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
135
|
+
end
|
136
|
+
Open3.popen2e(user_bash("asdf plugin update ruby")) do |stdin, stdout_and_stderr, wait_thr|
|
137
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
138
|
+
end
|
139
|
+
Open3.popen2e(user_bash("asdf install ruby #{ruby_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
140
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
141
|
+
end
|
142
|
+
Open3.popen2e(user_bash("asdf local ruby #{ruby_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
143
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
144
|
+
end
|
145
|
+
|
146
|
+
unless `#{user_bash('ruby -e "puts RUBY_VERSION"')}`.strip == ruby_version
|
147
|
+
logger.error "Could not install ruby with version #{ruby_version}. Please try another valid version that asdf supports.\n"
|
148
|
+
return false
|
149
|
+
end
|
150
|
+
end
|
151
|
+
logger.info "Using ruby v" + `#{user_bash('ruby -e "puts RUBY_VERSION"')}`.strip + "\n"
|
152
|
+
|
153
|
+
# Install bundler
|
154
|
+
bundler_version = `sed -n '/BUNDLED WITH/{n;p}' Gemfile.lock`.strip
|
155
|
+
if bundler_version.nil? || bundler_version.empty?
|
156
|
+
logger.error "Could not find bundler version. Please ensure BUNDLED_WITH section is present in your Gemfile.lock.\n"
|
102
157
|
return false
|
103
158
|
end
|
159
|
+
|
160
|
+
unless system(user_bash("gem list -i '^bundler$' --version #{bundler_version}"), out: File::NULL)
|
161
|
+
logger.info "Installing bundler v#{bundler_version}\n"
|
162
|
+
|
163
|
+
Open3.popen2e(user_bash("gem install --no-document bundler -v #{bundler_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
164
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
165
|
+
end
|
166
|
+
|
167
|
+
unless system(user_bash("gem list -i '^bundler$' --version #{bundler_version}"), out: File::NULL)
|
168
|
+
logger.error "Could not install bundler with version #{bundler_version}.\n"
|
169
|
+
return false
|
170
|
+
end
|
171
|
+
end
|
172
|
+
system("alias bundle='bundle _#{bundler_version}_'")
|
173
|
+
system("alias bundler='bundler _#{bundler_version}_'")
|
174
|
+
logger.info "Using bundler v" + bundler_version + "\n"
|
175
|
+
|
176
|
+
set_logger_formatter_arrow
|
177
|
+
|
178
|
+
return true
|
104
179
|
end
|
105
180
|
|
106
181
|
# Perform bundle install
|
@@ -109,13 +184,13 @@ module SmartMachine
|
|
109
184
|
|
110
185
|
set_logger_formatter_tabs
|
111
186
|
|
112
|
-
unless system("bundle config set deployment 'true' && bundle config set clean 'true'")
|
187
|
+
unless system(user_bash("bundle config set --local deployment 'true' && bundle config set --local clean 'true'"))
|
113
188
|
logger.error "Could not complete bundle config setting."
|
114
189
|
return false
|
115
190
|
end
|
116
191
|
|
117
192
|
exit_status = nil
|
118
|
-
Open3.popen2e("bundle
|
193
|
+
Open3.popen2e(user_bash("bundle install")) do |stdin, stdout_and_stderr, wait_thr|
|
119
194
|
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
120
195
|
exit_status = wait_thr.value.success?
|
121
196
|
end
|
@@ -135,7 +210,7 @@ module SmartMachine
|
|
135
210
|
|
136
211
|
set_logger_formatter_tabs
|
137
212
|
exit_status = nil
|
138
|
-
Open3.popen2e("bundle
|
213
|
+
Open3.popen2e(user_bash("bundle exec rails assets:precompile")) do |stdin, stdout_and_stderr, wait_thr|
|
139
214
|
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
140
215
|
exit_status = wait_thr.value.success?
|
141
216
|
end
|
@@ -157,7 +232,7 @@ module SmartMachine
|
|
157
232
|
|
158
233
|
set_logger_formatter_tabs
|
159
234
|
exit_status = nil
|
160
|
-
Open3.popen2e("bundle
|
235
|
+
Open3.popen2e(user_bash("bundle exec rails db:migrate")) do |stdin, stdout_and_stderr, wait_thr|
|
161
236
|
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
162
237
|
exit_status = wait_thr.value.success?
|
163
238
|
end
|
@@ -181,7 +256,7 @@ module SmartMachine
|
|
181
256
|
FileUtils.rm_f("tmp/smartmachine/packed")
|
182
257
|
|
183
258
|
# Spawn Process
|
184
|
-
pid = Process.spawn("bundle
|
259
|
+
pid = Process.spawn(user_bash("bundle exec puma --config config/puma.rb"), out: File::NULL)
|
185
260
|
Process.detach(pid)
|
186
261
|
|
187
262
|
# Sleep
|
@@ -2,9 +2,11 @@ require 'smart_machine/commands/grid_commands/sub_thor'
|
|
2
2
|
require 'smart_machine/commands/grid_commands/elasticsearch'
|
3
3
|
require 'smart_machine/commands/grid_commands/minio'
|
4
4
|
require 'smart_machine/commands/grid_commands/mysql'
|
5
|
+
require 'smart_machine/commands/grid_commands/nextcloud'
|
5
6
|
require 'smart_machine/commands/grid_commands/nginx'
|
6
7
|
require 'smart_machine/commands/grid_commands/prereceiver'
|
7
8
|
require 'smart_machine/commands/grid_commands/redis'
|
9
|
+
require 'smart_machine/commands/grid_commands/terminal'
|
8
10
|
|
9
11
|
module SmartMachine
|
10
12
|
module Commands
|
@@ -20,6 +22,9 @@ module SmartMachine
|
|
20
22
|
desc "mysql", "Run mysql grid commands"
|
21
23
|
subcommand "mysql", GridCommands::Mysql
|
22
24
|
|
25
|
+
desc "nextcloud", "Run nextcloud grid commands"
|
26
|
+
subcommand "nextcloud", GridCommands::Nextcloud
|
27
|
+
|
23
28
|
desc "nginx", "Run nginx grid commands"
|
24
29
|
subcommand "nginx", GridCommands::Nginx
|
25
30
|
|
@@ -28,6 +33,9 @@ module SmartMachine
|
|
28
33
|
|
29
34
|
desc "redis", "Run redis grid commands"
|
30
35
|
subcommand "redis", GridCommands::Redis
|
36
|
+
|
37
|
+
desc "terminal", "Run terminal grid commands"
|
38
|
+
subcommand "terminal", GridCommands::Terminal
|
31
39
|
end
|
32
40
|
end
|
33
41
|
end
|
@@ -11,7 +11,6 @@ module SmartMachine
|
|
11
11
|
with_docker_running do
|
12
12
|
machine = SmartMachine::Machine.new
|
13
13
|
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
14
|
-
machine.run_on_machine commands: "echo 'vm.max_map_count=262144' | sudo tee /etc/sysctl.d/60-smartmachine-elasticsearch.conf && sudo sysctl --system"
|
15
14
|
machine.run_on_machine commands: "smartengine grid elasticsearch uper#{name_option}"
|
16
15
|
end
|
17
16
|
end
|
@@ -25,8 +24,6 @@ module SmartMachine
|
|
25
24
|
machine = SmartMachine::Machine.new
|
26
25
|
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
27
26
|
machine.run_on_machine commands: "smartengine grid elasticsearch downer#{name_option}"
|
28
|
-
# NOTE: sysctl does not reset this setting until restart of system even after sudo sysctl --system is run.
|
29
|
-
machine.run_on_machine commands: "test $(docker ps -aq --filter label=smartmachine.elasticsearch.name | wc -l) -eq 0 && test -f /etc/sysctl.d/60-smartmachine-elasticsearch.conf && sudo rm /etc/sysctl.d/60-smartmachine-elasticsearch.conf && sudo sysctl --system"
|
30
27
|
end
|
31
28
|
end
|
32
29
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module GridCommands
|
4
|
+
class Nextcloud < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "up", "Take UP the nextcloud grid"
|
8
|
+
option :name, type: :string
|
9
|
+
def up
|
10
|
+
inside_machine_dir do
|
11
|
+
with_docker_running do
|
12
|
+
machine = SmartMachine::Machine.new
|
13
|
+
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
14
|
+
machine.run_on_machine commands: "smartengine grid nextcloud uper#{name_option}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "down", "Take DOWN the nextcloud grid"
|
20
|
+
option :name, type: :string
|
21
|
+
def down
|
22
|
+
inside_machine_dir do
|
23
|
+
with_docker_running do
|
24
|
+
machine = SmartMachine::Machine.new
|
25
|
+
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
26
|
+
machine.run_on_machine commands: "smartengine grid nextcloud downer#{name_option}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "uper", "Nextcloud grid uper", hide: true
|
32
|
+
option :name, type: :string
|
33
|
+
def uper
|
34
|
+
inside_engine_machine_dir do
|
35
|
+
if options[:name]
|
36
|
+
nextcloud = SmartMachine::Grids::Nextcloud.new(name: options[:name])
|
37
|
+
nextcloud.uper
|
38
|
+
else
|
39
|
+
SmartMachine.config.grids.nextcloud.each do |name, config|
|
40
|
+
nextcloud = SmartMachine::Grids::Nextcloud.new(name: name.to_s)
|
41
|
+
nextcloud.uper
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "downer", "Nextcloud grid downer", hide: true
|
48
|
+
option :name, type: :string
|
49
|
+
def downer
|
50
|
+
inside_engine_machine_dir do
|
51
|
+
if options[:name]
|
52
|
+
nextcloud = SmartMachine::Grids::Nextcloud.new(name: options[:name])
|
53
|
+
nextcloud.downer
|
54
|
+
else
|
55
|
+
SmartMachine.config.grids.nextcloud.each do |name, config|
|
56
|
+
nextcloud = SmartMachine::Grids::Nextcloud.new(name: name.to_s)
|
57
|
+
nextcloud.downer
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module GridCommands
|
4
|
+
class Terminal < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "install", "Install terminal grid"
|
8
|
+
def install
|
9
|
+
inside_machine_dir do
|
10
|
+
with_docker_running do
|
11
|
+
puts "-----> Installing Terminal"
|
12
|
+
machine = SmartMachine::Machine.new
|
13
|
+
machine.run_on_machine commands: "smartengine grid terminal installer"
|
14
|
+
puts "-----> Terminal Installation Complete"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "uninstall", "Uninstall terminal grid"
|
20
|
+
def uninstall
|
21
|
+
inside_machine_dir do
|
22
|
+
with_docker_running do
|
23
|
+
puts "-----> Uninstalling Terminal"
|
24
|
+
machine = SmartMachine::Machine.new
|
25
|
+
machine.run_on_machine commands: "smartengine grid terminal uninstaller"
|
26
|
+
puts "-----> Terminal Uninstallation Complete"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "up", "Take UP the terminal grid"
|
32
|
+
option :name, type: :string
|
33
|
+
def up
|
34
|
+
inside_machine_dir do
|
35
|
+
with_docker_running do
|
36
|
+
machine = SmartMachine::Machine.new
|
37
|
+
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
38
|
+
machine.run_on_machine commands: "smartengine grid terminal uper#{name_option}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "down", "Take DOWN the terminal grid"
|
44
|
+
option :name, type: :string
|
45
|
+
def down
|
46
|
+
inside_machine_dir do
|
47
|
+
with_docker_running do
|
48
|
+
machine = SmartMachine::Machine.new
|
49
|
+
name_option = options[:name] ? " --name=#{options[:name]}" : ""
|
50
|
+
machine.run_on_machine commands: "smartengine grid terminal downer#{name_option}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "installer", "Terminal grid installer", hide: true
|
56
|
+
def installer
|
57
|
+
inside_engine_machine_dir do
|
58
|
+
name, config = SmartMachine.config.grids.terminal.first
|
59
|
+
terminal = SmartMachine::Grids::Terminal.new(name: name.to_s)
|
60
|
+
terminal.installer
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "uninstaller", "Terminal grid uninstaller", hide: true
|
65
|
+
def uninstaller
|
66
|
+
inside_engine_machine_dir do
|
67
|
+
name, config = SmartMachine.config.grids.terminal.first
|
68
|
+
terminal = SmartMachine::Grids::Terminal.new(name: name.to_s)
|
69
|
+
terminal.uninstaller
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "uper", "Terminal grid uper", hide: true
|
74
|
+
option :name, type: :string
|
75
|
+
def uper
|
76
|
+
inside_engine_machine_dir do
|
77
|
+
if options[:name]
|
78
|
+
terminal = SmartMachine::Grids::Terminal.new(name: options[:name])
|
79
|
+
terminal.uper
|
80
|
+
else
|
81
|
+
SmartMachine.config.grids.terminal.each do |name, config|
|
82
|
+
terminal = SmartMachine::Grids::Terminal.new(name: name.to_s)
|
83
|
+
terminal.uper
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
desc "downer", "Terminal grid downer", hide: true
|
90
|
+
option :name, type: :string
|
91
|
+
def downer
|
92
|
+
inside_engine_machine_dir do
|
93
|
+
if options[:name]
|
94
|
+
terminal = SmartMachine::Grids::Terminal.new(name: options[:name])
|
95
|
+
terminal.downer
|
96
|
+
else
|
97
|
+
SmartMachine.config.grids.terminal.each do |name, config|
|
98
|
+
terminal = SmartMachine::Grids::Terminal.new(name: name.to_s)
|
99
|
+
terminal.downer
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -3,6 +3,14 @@ module SmartMachine
|
|
3
3
|
class Machine < Thor
|
4
4
|
include Utilities
|
5
5
|
|
6
|
+
desc "setup", "Initial setup of the machine"
|
7
|
+
def setup
|
8
|
+
inside_machine_dir do
|
9
|
+
machine = SmartMachine::Machine.new
|
10
|
+
machine.setup
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
6
14
|
desc "ssh", "SSH into the machine"
|
7
15
|
def ssh
|
8
16
|
inside_machine_dir do
|
@@ -14,7 +14,7 @@ module SmartMachine
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def grids
|
17
|
-
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, prereceiver: prereceiver, redis: redis)
|
17
|
+
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, nextcloud: nextcloud, prereceiver: prereceiver, redis: redis, terminal: terminal)
|
18
18
|
end
|
19
19
|
|
20
20
|
def elasticsearch
|
@@ -50,6 +50,17 @@ module SmartMachine
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
def nextcloud
|
54
|
+
# Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/nextcloud.yml always exists
|
55
|
+
if File.exist? "config/nextcloud.yml"
|
56
|
+
deserialize(IO.binread("config/nextcloud.yml")).deep_symbolize_keys
|
57
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/nextcloud.yml"
|
58
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/nextcloud.yml")).deep_symbolize_keys
|
59
|
+
else
|
60
|
+
{}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
53
64
|
def prereceiver
|
54
65
|
# Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/prereceiver.yml always exists
|
55
66
|
if File.exist? "config/prereceiver.yml"
|
@@ -72,6 +83,17 @@ module SmartMachine
|
|
72
83
|
end
|
73
84
|
end
|
74
85
|
|
86
|
+
def terminal
|
87
|
+
# Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/terminal.yml always exists
|
88
|
+
if File.exist? "config/terminal.yml"
|
89
|
+
deserialize(IO.binread("config/terminal.yml")).deep_symbolize_keys
|
90
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/terminal.yml"
|
91
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/terminal.yml")).deep_symbolize_keys
|
92
|
+
else
|
93
|
+
{}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
75
97
|
def deserialize(config)
|
76
98
|
YAML.load(ERB.new(config).result).presence || {}
|
77
99
|
end
|
@@ -66,6 +66,15 @@ module SmartMachine
|
|
66
66
|
database_name: #{SecureRandom.hex(8)}
|
67
67
|
redisone:
|
68
68
|
password: #{SecureRandom.hex(16)}
|
69
|
+
nextcloudone:
|
70
|
+
admin_user: #{SecureRandom.hex(8)}
|
71
|
+
admin_password: #{SecureRandom.hex(16)}
|
72
|
+
mysql_user: #{SecureRandom.hex(8)}
|
73
|
+
mysql_password: #{SecureRandom.hex(16)}
|
74
|
+
mysql_database_name: #{SecureRandom.hex(8)}
|
75
|
+
terminalone:
|
76
|
+
username: #{SecureRandom.hex(8)}
|
77
|
+
password: #{SecureRandom.hex(16)}
|
69
78
|
YAML
|
70
79
|
end
|
71
80
|
|
data/lib/smart_machine/docker.rb
CHANGED
@@ -47,13 +47,14 @@ module SmartMachine
|
|
47
47
|
def install_on_linuxos(distro_name:, arch:)
|
48
48
|
|
49
49
|
commands = [
|
50
|
-
"sudo apt-get
|
51
|
-
"sudo apt-get
|
52
|
-
"
|
53
|
-
"sudo
|
54
|
-
"
|
55
|
-
"
|
56
|
-
"sudo apt-get
|
50
|
+
"sudo apt-get update",
|
51
|
+
"sudo apt-get install -y ca-certificates curl gnupg lsb-release",
|
52
|
+
"sudo mkdir -p /etc/apt/keyrings",
|
53
|
+
"sudo rm -f /etc/apt/keyrings/docker.gpg",
|
54
|
+
"curl -fsSL https://download.docker.com/linux/#{distro_name}/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg",
|
55
|
+
"echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/#{distro_name} $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null",
|
56
|
+
"sudo apt-get update",
|
57
|
+
"sudo apt-get install -y docker-ce docker-ce-cli containerd.io",
|
57
58
|
"sudo usermod -aG docker $USER",
|
58
59
|
"docker run --rm hello-world",
|
59
60
|
"docker rmi hello-world"
|
@@ -95,8 +96,8 @@ module SmartMachine
|
|
95
96
|
def uninstall_on_linuxos(distro_name:, arch:)
|
96
97
|
|
97
98
|
commands = [
|
98
|
-
"sudo apt-get purge docker-ce docker-ce-cli containerd.io",
|
99
|
-
"sudo apt-get autoremove",
|
99
|
+
"sudo apt-get purge -y docker-ce docker-ce-cli containerd.io",
|
100
|
+
"sudo apt-get autoremove -y",
|
100
101
|
"sudo rm -rf /var/lib/docker",
|
101
102
|
"sudo rm -rf /var/lib/containerd"
|
102
103
|
]
|