smartmachine 1.0.1 → 1.1.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.
- 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 +8 -7
- 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 +3 -3
- 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: 5f4220956064ccc882a0f4bce3a90921b42e7904a1b46c93b5a5786e9b384a01
|
4
|
+
data.tar.gz: fa860c7a78280a2b0db69ff3acbdd133ce426efffd52583ad1cdf887ab910bc7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b40194c50f6137985819f3fe5b190ed2fe08104f9e9a6149358ba5e4653c1f3ade8e8ac406c583515d4c50b16603aec0fa745b623d6e1a1bdf175fbdf584a97
|
7
|
+
data.tar.gz: c7cb2b875385bf57215ac80f19ae326c9af54e6a2870eefd2016b74a37b0cad410595efbbd1698811cf8d9ed70bba9a0d235308eb8d00988803e42603eea1fff
|
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
|
]
|