smartmachine 1.2.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/smart_machine/buildpackers/buildpacker.rb +0 -42
- data/lib/smart_machine/buildpackers/rails.rb +60 -0
- data/lib/smart_machine/commands/grid.rb +8 -0
- data/lib/smart_machine/commands/grid_commands/emailer.rb +107 -0
- data/lib/smart_machine/commands/grid_commands/roundcube.rb +65 -0
- data/lib/smart_machine/configuration.rb +35 -2
- data/lib/smart_machine/credentials.rb +10 -0
- data/lib/smart_machine/engine.rb +6 -0
- data/lib/smart_machine/grids/adminer.rb +1 -0
- data/lib/smart_machine/grids/certbot.rb +1 -0
- data/lib/smart_machine/grids/emailer/.keep +0 -0
- data/lib/smart_machine/grids/emailer.rb +188 -0
- data/lib/smart_machine/grids/haproxy.rb +1 -0
- data/lib/smart_machine/grids/mariadb.rb +1 -0
- data/lib/smart_machine/grids/postgresql.rb +1 -0
- data/lib/smart_machine/grids/roundcube.rb +114 -0
- data/lib/smart_machine/machine.rb +49 -0
- data/lib/smart_machine/syncer.rb +10 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/command.rb +50 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/entrypoint.rb +196 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/logtailer.rb +75 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-auth.conf +132 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-mail.conf +427 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-master.conf +153 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-ssl.conf +87 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/15-mailboxes.conf +94 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-imap.conf +102 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-lmtp.conf +43 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-quota.conf +114 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-sieve.conf +229 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/dovecot-sql.conf.ext +163 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sh +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sieve +5 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sh +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sieve +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve-after/spam-to-folder.sieve +6 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/haproxy/haproxy.cfg +58 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/conf.d/services.cfg +70 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/monitrc +344 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/opendkim.conf +71 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/main.cf +123 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/master.cf +149 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-sender-login-maps.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-masters.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-users.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-maps.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix-policyd-spf-python/policyd-spf.conf +12 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/spamassassin/local.cf +124 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/usr/local/bin/quota-warning.sh +22 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer.yml +37 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/engine.yml +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf +35 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini +4 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/var/roundcube/config/config.custom.inc.php +25 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube.yml +41 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/users.yml +1 -1
- data/lib/smart_machine/version.rb +2 -2
- data/lib/smart_machine.rb +2 -0
- metadata +55 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5103e5b3902c6f7cf9e295547ff6a5fd43682c9ca11f4d740a5b193fc09a2090
|
4
|
+
data.tar.gz: c99f47d9287341f7960223dfcbd44feeacdfdaed16cbf15215865d370706c3f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93e8261b8739b1cc1a2fa3d0400ea8c2e4bbf0b10ec3ce697ef5597b61177fd0de253dbd47e49cd5411f172c4edfd87d73e9e40ea520569d74a8c7086444b1d0
|
7
|
+
data.tar.gz: 35abb8c1171082c17b76d277d2f77f9404c6888910b00be89cfb775ea702cec73085c017f3a8c70515c80b837c7c20bbc0f681a405247e25ad46d5ffd3ca9741
|
@@ -80,13 +80,9 @@ module SmartMachine
|
|
80
80
|
libdb-dev \
|
81
81
|
uuid-dev && \
|
82
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
83
|
apt-get update && \
|
86
84
|
apt-get install -y --no-install-recommends \
|
87
85
|
tzdata \
|
88
|
-
nodejs \
|
89
|
-
yarn \
|
90
86
|
libmariadb-dev \
|
91
87
|
libvips42 \
|
92
88
|
ffmpeg \
|
@@ -109,44 +105,6 @@ module SmartMachine
|
|
109
105
|
|
110
106
|
format(file)
|
111
107
|
end
|
112
|
-
|
113
|
-
# These swapfile methods can be used (after required modification), when you need to make swapfile for more memory.
|
114
|
-
# def self.create_swapfile
|
115
|
-
# # Creating swapfile for bundler to work properly
|
116
|
-
# unless system("sudo swapon -s | grep -ci '/swapfile'", out: File::NULL)
|
117
|
-
# print "-----> Creating swap swapfile ... "
|
118
|
-
# system("sudo install -o root -g root -m 0600 /dev/null /swapfile", out: File::NULL)
|
119
|
-
# system("sudo dd if=/dev/zero of=/swapfile bs=1k count=2048k", [:out, :err] => File::NULL)
|
120
|
-
# system("sudo mkswap /swapfile", out: File::NULL)
|
121
|
-
# system("sudo sh -c 'echo \"/swapfile none swap sw 0 0\" >> /etc/fstab'", out: File::NULL)
|
122
|
-
# system("echo 10 | sudo tee /proc/sys/vm/swappiness", out: File::NULL)
|
123
|
-
# system("sudo sed -i '/^vm.swappiness = /d' /etc/sysctl.conf", out: File::NULL)
|
124
|
-
# system("echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf", out: File::NULL)
|
125
|
-
# puts "done"
|
126
|
-
#
|
127
|
-
# print "-----> Starting swap swapfile ... "
|
128
|
-
# if system("sudo swapon /swapfile", out: File::NULL)
|
129
|
-
# puts "done"
|
130
|
-
# end
|
131
|
-
# end
|
132
|
-
# end
|
133
|
-
#
|
134
|
-
# def self.destroy_swapfile
|
135
|
-
# if system("sudo swapon -s | grep -ci '/swapfile'", out: File::NULL)
|
136
|
-
# print "-----> Stopping swap swapfile ... "
|
137
|
-
# if system("sudo swapoff /swapfile", out: File::NULL)
|
138
|
-
# system("sudo sed -i '/^vm.swappiness = /d' /etc/sysctl.conf", out: File::NULL)
|
139
|
-
# system("echo 60 | sudo tee /proc/sys/vm/swappiness", out: File::NULL)
|
140
|
-
# puts "done"
|
141
|
-
#
|
142
|
-
# print "-----> Removing swap swapfile ... "
|
143
|
-
# system("sudo sed -i '/^\\/swapfile/d' /etc/fstab", out: File::NULL)
|
144
|
-
# if system("sudo rm /swapfile", out: File::NULL)
|
145
|
-
# puts "done"
|
146
|
-
# end
|
147
|
-
# end
|
148
|
-
# end
|
149
|
-
# end
|
150
108
|
end
|
151
109
|
end
|
152
110
|
end
|
@@ -173,6 +173,66 @@ module SmartMachine
|
|
173
173
|
system("alias bundler='bundler _#{bundler_version}_'")
|
174
174
|
logger.info "Using bundler v" + bundler_version + "\n"
|
175
175
|
|
176
|
+
# Install nodejs
|
177
|
+
nodejs_version = `sed -n '/node/{p;n}' package.json`.strip.split(":").last&.strip&.delete_prefix('"')&.delete_suffix(',')&.delete_suffix('"')
|
178
|
+
if nodejs_version.nil? || nodejs_version.empty?
|
179
|
+
logger.error "Could not find nodejs version. Have you specified it explicitly in package.json with engines field and run yarn install?\n"
|
180
|
+
return false
|
181
|
+
end
|
182
|
+
|
183
|
+
unless system(user_bash("node -v"), [:out, :err] => File::NULL) && `#{user_bash('node -v')}`.strip&.delete_prefix('v') == nodejs_version
|
184
|
+
logger.info "Installing nodejs v#{nodejs_version}\n"
|
185
|
+
|
186
|
+
Open3.popen2e(user_bash("asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git")) do |stdin, stdout_and_stderr, wait_thr|
|
187
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
188
|
+
end
|
189
|
+
Open3.popen2e(user_bash("asdf plugin update nodejs")) do |stdin, stdout_and_stderr, wait_thr|
|
190
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
191
|
+
end
|
192
|
+
Open3.popen2e(user_bash("asdf install nodejs #{nodejs_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
193
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
194
|
+
end
|
195
|
+
Open3.popen2e(user_bash("asdf local nodejs #{nodejs_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
196
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
197
|
+
end
|
198
|
+
|
199
|
+
unless `#{user_bash('node -v')}`.strip&.delete_prefix('v') == nodejs_version
|
200
|
+
logger.error "Could not install nodejs with version #{nodejs_version}. Please try another valid version that asdf supports.\n"
|
201
|
+
return false
|
202
|
+
end
|
203
|
+
end
|
204
|
+
logger.info "Using nodejs v" + `#{user_bash('node -v')}`.strip&.delete_prefix('v') + "\n"
|
205
|
+
|
206
|
+
# Install yarn
|
207
|
+
yarn_version = `sed -n '/yarn/{p;n}' package.json`.strip.split(":").last&.strip&.delete_prefix('"')&.delete_suffix(',')&.delete_suffix('"')
|
208
|
+
if yarn_version.nil? || yarn_version.empty?
|
209
|
+
logger.error "Could not find yarn version. Have you specified it explicitly in package.json with engines field and run yarn install?\n"
|
210
|
+
return false
|
211
|
+
end
|
212
|
+
|
213
|
+
unless system(user_bash("yarn -v"), [:out, :err] => File::NULL) && `#{user_bash('yarn -v')}`.strip == yarn_version
|
214
|
+
logger.info "Installing yarn v#{yarn_version}\n"
|
215
|
+
|
216
|
+
Open3.popen2e(user_bash("asdf plugin add yarn https://github.com/twuni/asdf-yarn.git")) do |stdin, stdout_and_stderr, wait_thr|
|
217
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
218
|
+
end
|
219
|
+
Open3.popen2e(user_bash("asdf plugin update yarn")) do |stdin, stdout_and_stderr, wait_thr|
|
220
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
221
|
+
end
|
222
|
+
Open3.popen2e(user_bash("asdf install yarn #{yarn_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
223
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
224
|
+
end
|
225
|
+
Open3.popen2e(user_bash("asdf local yarn #{yarn_version}")) do |stdin, stdout_and_stderr, wait_thr|
|
226
|
+
stdout_and_stderr.each { |line| logger.info "#{line}" }
|
227
|
+
end
|
228
|
+
|
229
|
+
unless `#{user_bash('yarn -v')}`.strip == yarn_version
|
230
|
+
logger.error "Could not install yarn with version #{yarn_version}. Please try another valid version that asdf supports.\n"
|
231
|
+
return false
|
232
|
+
end
|
233
|
+
end
|
234
|
+
logger.info "Using yarn v" + `#{user_bash('yarn -v')}`.strip + "\n"
|
235
|
+
|
176
236
|
set_logger_formatter_arrow
|
177
237
|
|
178
238
|
return true
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'smart_machine/commands/grid_commands/sub_thor'
|
2
2
|
require 'smart_machine/commands/grid_commands/elasticsearch'
|
3
|
+
require 'smart_machine/commands/grid_commands/emailer'
|
3
4
|
require 'smart_machine/commands/grid_commands/minio'
|
4
5
|
require 'smart_machine/commands/grid_commands/mysql'
|
5
6
|
require 'smart_machine/commands/grid_commands/nextcloud'
|
@@ -7,6 +8,7 @@ require 'smart_machine/commands/grid_commands/nginx'
|
|
7
8
|
require 'smart_machine/commands/grid_commands/phpmyadmin'
|
8
9
|
require 'smart_machine/commands/grid_commands/prereceiver'
|
9
10
|
require 'smart_machine/commands/grid_commands/redis'
|
11
|
+
require 'smart_machine/commands/grid_commands/roundcube'
|
10
12
|
require 'smart_machine/commands/grid_commands/terminal'
|
11
13
|
|
12
14
|
module SmartMachine
|
@@ -17,6 +19,9 @@ module SmartMachine
|
|
17
19
|
desc "elasticsearch", "Run elasticsearch grid commands"
|
18
20
|
subcommand "elasticsearch", GridCommands::Elasticsearch
|
19
21
|
|
22
|
+
desc "emailer", "Run emailer grid commands"
|
23
|
+
subcommand "emailer", GridCommands::Emailer
|
24
|
+
|
20
25
|
desc "minio", "Run minio grid commands"
|
21
26
|
subcommand "minio", GridCommands::Minio
|
22
27
|
|
@@ -38,6 +43,9 @@ module SmartMachine
|
|
38
43
|
desc "redis", "Run redis grid commands"
|
39
44
|
subcommand "redis", GridCommands::Redis
|
40
45
|
|
46
|
+
desc "roundcube", "Run roundcube grid commands"
|
47
|
+
subcommand "roundcube", GridCommands::Roundcube
|
48
|
+
|
41
49
|
desc "terminal", "Run terminal grid commands"
|
42
50
|
subcommand "terminal", GridCommands::Terminal
|
43
51
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module GridCommands
|
4
|
+
class Emailer < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "install", "Install emailer grid"
|
8
|
+
def install
|
9
|
+
inside_machine_dir do
|
10
|
+
with_docker_running do
|
11
|
+
puts "-----> Installing Emailer"
|
12
|
+
machine = SmartMachine::Machine.new
|
13
|
+
machine.run_on_machine commands: "smartengine grid emailer installer"
|
14
|
+
puts "-----> Emailer Installation Complete"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "uninstall", "Uninstall emailer grid"
|
20
|
+
def uninstall
|
21
|
+
inside_machine_dir do
|
22
|
+
with_docker_running do
|
23
|
+
puts "-----> Uninstalling Emailer"
|
24
|
+
machine = SmartMachine::Machine.new
|
25
|
+
machine.run_on_machine commands: "smartengine grid emailer uninstaller"
|
26
|
+
puts "-----> Emailer Uninstallation Complete"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "up", "Take UP the emailer 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 emailer uper#{name_option}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "down", "Take DOWN the emailer 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 emailer downer#{name_option}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "installer", "Emailer grid installer", hide: true
|
56
|
+
def installer
|
57
|
+
inside_engine_machine_dir do
|
58
|
+
name, config = SmartMachine.config.grids.emailer.first
|
59
|
+
emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
|
60
|
+
emailer.installer
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "uninstaller", "Emailer grid uninstaller", hide: true
|
65
|
+
def uninstaller
|
66
|
+
inside_engine_machine_dir do
|
67
|
+
name, config = SmartMachine.config.grids.emailer.first
|
68
|
+
emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
|
69
|
+
emailer.uninstaller
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "uper", "Emailer grid uper", hide: true
|
74
|
+
option :name, type: :string
|
75
|
+
def uper
|
76
|
+
inside_engine_machine_dir do
|
77
|
+
if options[:name]
|
78
|
+
emailer = SmartMachine::Grids::Emailer.new(name: options[:name])
|
79
|
+
emailer.uper
|
80
|
+
else
|
81
|
+
SmartMachine.config.grids.emailer.each do |name, config|
|
82
|
+
emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
|
83
|
+
emailer.uper
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
desc "downer", "Emailer grid downer", hide: true
|
90
|
+
option :name, type: :string
|
91
|
+
def downer
|
92
|
+
inside_engine_machine_dir do
|
93
|
+
if options[:name]
|
94
|
+
emailer = SmartMachine::Grids::Emailer.new(name: options[:name])
|
95
|
+
emailer.downer
|
96
|
+
else
|
97
|
+
SmartMachine.config.grids.emailer.each do |name, config|
|
98
|
+
emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
|
99
|
+
emailer.downer
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module GridCommands
|
4
|
+
class Roundcube < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "up", "Take UP the roundcube 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 roundcube uper#{name_option}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "down", "Take DOWN the roundcube 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 roundcube downer#{name_option}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "uper", "Roundcube grid uper", hide: true
|
32
|
+
option :name, type: :string
|
33
|
+
def uper
|
34
|
+
inside_engine_machine_dir do
|
35
|
+
if options[:name]
|
36
|
+
roundcube = SmartMachine::Grids::Roundcube.new(name: options[:name])
|
37
|
+
roundcube.uper
|
38
|
+
else
|
39
|
+
SmartMachine.config.grids.roundcube.each do |name, config|
|
40
|
+
roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
|
41
|
+
roundcube.uper
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "downer", "Roundcube grid downer", hide: true
|
48
|
+
option :name, type: :string
|
49
|
+
def downer
|
50
|
+
inside_engine_machine_dir do
|
51
|
+
if options[:name]
|
52
|
+
roundcube = SmartMachine::Grids::Roundcube.new(name: options[:name])
|
53
|
+
roundcube.downer
|
54
|
+
else
|
55
|
+
SmartMachine.config.grids.roundcube.each do |name, config|
|
56
|
+
roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
|
57
|
+
roundcube.downer
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -8,13 +8,24 @@ module SmartMachine
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def config
|
11
|
-
@config ||= OpenStruct.new(grids: grids, network: network)
|
11
|
+
@config ||= OpenStruct.new(engine: engine, grids: grids, network: network)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
+
def engine
|
17
|
+
# 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/engine.yml always exists
|
18
|
+
if File.exist? "config/engine.yml"
|
19
|
+
deserialize(IO.binread("config/engine.yml")).deep_symbolize_keys
|
20
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/engine.yml"
|
21
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/engine.yml")).deep_symbolize_keys
|
22
|
+
else
|
23
|
+
{}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
16
27
|
def grids
|
17
|
-
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, nextcloud: nextcloud, phpmyadmin: phpmyadmin, prereceiver: prereceiver, redis: redis, terminal: terminal)
|
28
|
+
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, emailer: emailer, minio: minio, mysql: mysql, nextcloud: nextcloud, phpmyadmin: phpmyadmin, prereceiver: prereceiver, redis: redis, roundcube: roundcube, terminal: terminal)
|
18
29
|
end
|
19
30
|
|
20
31
|
def elasticsearch
|
@@ -28,6 +39,17 @@ module SmartMachine
|
|
28
39
|
end
|
29
40
|
end
|
30
41
|
|
42
|
+
def emailer
|
43
|
+
# 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/emailer.yml always exists
|
44
|
+
if File.exist? "config/emailer.yml"
|
45
|
+
deserialize(IO.binread("config/emailer.yml")).deep_symbolize_keys
|
46
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/emailer.yml"
|
47
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/emailer.yml")).deep_symbolize_keys
|
48
|
+
else
|
49
|
+
{}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
31
53
|
def minio
|
32
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/minio.yml always exists
|
33
55
|
if File.exist? "config/minio.yml"
|
@@ -94,6 +116,17 @@ module SmartMachine
|
|
94
116
|
end
|
95
117
|
end
|
96
118
|
|
119
|
+
def roundcube
|
120
|
+
# 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/roundcube.yml always exists
|
121
|
+
if File.exist? "config/roundcube.yml"
|
122
|
+
deserialize(IO.binread("config/roundcube.yml")).deep_symbolize_keys
|
123
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/roundcube.yml"
|
124
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/roundcube.yml")).deep_symbolize_keys
|
125
|
+
else
|
126
|
+
{}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
97
130
|
def terminal
|
98
131
|
# 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
|
99
132
|
if File.exist? "config/terminal.yml"
|
@@ -56,6 +56,12 @@ module SmartMachine
|
|
56
56
|
root_password: #{SecureRandom.hex(16)}
|
57
57
|
username: #{SecureRandom.hex(8)}
|
58
58
|
password: #{SecureRandom.hex(16)}
|
59
|
+
emailerone:
|
60
|
+
mysql_user: #{SecureRandom.hex(8)}
|
61
|
+
mysql_password: #{SecureRandom.hex(16)}
|
62
|
+
mysql_database_name: #{SecureRandom.hex(8)}
|
63
|
+
monit_smtp_username: yourmachineemailerone@yourdomain.com
|
64
|
+
monit_smtp_password: #{SecureRandom.hex(16)}
|
59
65
|
minioone:
|
60
66
|
access_key: #{SecureRandom.hex(8)}
|
61
67
|
secret_key: #{SecureRandom.hex(16)}
|
@@ -66,6 +72,10 @@ module SmartMachine
|
|
66
72
|
database_name: #{SecureRandom.hex(8)}
|
67
73
|
redisone:
|
68
74
|
password: #{SecureRandom.hex(16)}
|
75
|
+
roundcubeone:
|
76
|
+
database_user: #{SecureRandom.hex(8)}
|
77
|
+
database_pass: #{SecureRandom.hex(16)}
|
78
|
+
database_name: #{SecureRandom.hex(8)}
|
69
79
|
nextcloudone:
|
70
80
|
admin_user: #{SecureRandom.hex(8)}
|
71
81
|
admin_password: #{SecureRandom.hex(16)}
|
data/lib/smart_machine/engine.rb
CHANGED
@@ -29,6 +29,7 @@ module SmartMachine
|
|
29
29
|
puts "-----> Creating image for Engine ... "
|
30
30
|
command = [
|
31
31
|
"docker image build --quiet --tag #{engine_image_name_with_version}",
|
32
|
+
"--build-arg TZDATA_TIMEZONE='#{SmartMachine.config.engine.dig(:engineone).dig(:timezone)}'",
|
32
33
|
"--build-arg SMARTMACHINE_MASTER_KEY=#{SmartMachine::Credentials.new.read_key}",
|
33
34
|
"--build-arg USER_NAME=`id -un`",
|
34
35
|
"--build-arg USER_UID=`id -u`",
|
@@ -102,6 +103,11 @@ module SmartMachine
|
|
102
103
|
FROM ruby:%<smartmachine_ruby_version>s-bullseye
|
103
104
|
LABEL maintainer="plainsource <plainsource@humanmind.me>"
|
104
105
|
|
106
|
+
# Setting Localtime & Timezone using tzdata
|
107
|
+
ARG TZDATA_TIMEZONE
|
108
|
+
RUN ln -sf /usr/share/zoneinfo/$TZDATA_TIMEZONE /etc/localtime && \
|
109
|
+
dpkg-reconfigure -f noninteractive tzdata
|
110
|
+
|
105
111
|
# User
|
106
112
|
# --- Fix to change docker gid to 998 (if it is in use) so that addgroup is free to create a group with docker gid.
|
107
113
|
ARG USER_NAME
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: Add adminer as an alternative for phpmyadmin.
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: Add certbot for SSL certificates.
|
File without changes
|
@@ -0,0 +1,188 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
class Grids
|
3
|
+
class Emailer < SmartMachine::Base
|
4
|
+
def initialize(name:)
|
5
|
+
config = SmartMachine.config.grids.emailer.dig(name.to_sym)
|
6
|
+
raise "emailer config for #{name} not found." unless config
|
7
|
+
|
8
|
+
@image = "smartmachine/emailer:#{SmartMachine.version}"
|
9
|
+
@fqdn = config.dig(:fqdn)
|
10
|
+
@mailname = config.dig(:mailname)
|
11
|
+
@sysadmin_email = config.dig(:sysadmin_email)
|
12
|
+
@networks = config.dig(:networks)
|
13
|
+
@mysql_host = config.dig(:mysql_host)
|
14
|
+
@mysql_port = config.dig(:mysql_port)
|
15
|
+
@mysql_user = config.dig(:mysql_user)
|
16
|
+
@mysql_password = config.dig(:mysql_password)
|
17
|
+
@mysql_database_name = config.dig(:mysql_database_name)
|
18
|
+
@monit_smtp_email_name = config.dig(:monit_smtp_email_name)
|
19
|
+
@monit_smtp_email_address = config.dig(:monit_smtp_email_address)
|
20
|
+
@monit_smtp_host = config.dig(:monit_smtp_host)
|
21
|
+
@monit_smtp_port = config.dig(:monit_smtp_port)
|
22
|
+
@monit_smtp_username = config.dig(:monit_smtp_username)
|
23
|
+
@monit_smtp_password = config.dig(:monit_smtp_password)
|
24
|
+
@oracle_ips_allowed = config.dig(:oracle_ips_allowed)
|
25
|
+
@oracle_deflect_url = config.dig(:oracle_deflect_url)
|
26
|
+
|
27
|
+
@name = name.to_s
|
28
|
+
@home_dir = File.expand_path('~')
|
29
|
+
end
|
30
|
+
|
31
|
+
def installer
|
32
|
+
unless system("docker image inspect #{@image}", [:out, :err] => File::NULL)
|
33
|
+
puts "-----> Creating image #{@image} ... "
|
34
|
+
command = [
|
35
|
+
"docker image build -t #{@image}",
|
36
|
+
"--build-arg SMARTMACHINE_VERSION=#{SmartMachine.version}",
|
37
|
+
"-f- #{SmartMachine.config.gem_dir}/lib/smart_machine/grids/emailer",
|
38
|
+
"<<'EOF'\n#{dockerfile}EOF"
|
39
|
+
]
|
40
|
+
if system(command.join(" "), out: File::NULL)
|
41
|
+
puts "done"
|
42
|
+
else
|
43
|
+
raise "Error: Could not install image: #{@image}"
|
44
|
+
end
|
45
|
+
else
|
46
|
+
raise "Error: Image already installed: #{@image}. Please uninstall using 'smartmachine grids emailer uninstall' and try installing again."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def uninstaller
|
51
|
+
unless system("docker inspect -f '{{.State.Running}}' '#{@name}'", [:out, :err] => File::NULL)
|
52
|
+
if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
|
53
|
+
puts "-----> Removing image #{@image} ... "
|
54
|
+
if system("docker image rm #{@image}", out: File::NULL)
|
55
|
+
puts "done"
|
56
|
+
end
|
57
|
+
else
|
58
|
+
raise "Error: Emailer already uninstalled. Please install using 'smartmachine grids emailer install' and try uninstalling again."
|
59
|
+
end
|
60
|
+
else
|
61
|
+
raise "Error: Emailer is currently running. Please stop the emailer using 'smartmachine grids emailer down' and try uninstalling again."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def uper
|
66
|
+
if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
|
67
|
+
FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/backups")
|
68
|
+
FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/data/vmail")
|
69
|
+
FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/data/opendkim")
|
70
|
+
|
71
|
+
# Setting entrypoint permission.
|
72
|
+
system("chmod +x #{@home_dir}/machine/config/emailer/docker/entrypoint.rb")
|
73
|
+
|
74
|
+
# Creating & Starting containers
|
75
|
+
print "-----> Creating container #{@name} ... "
|
76
|
+
|
77
|
+
command = [
|
78
|
+
"docker create",
|
79
|
+
"--name='#{@name}'",
|
80
|
+
"--env VIRTUAL_HOST=#{@fqdn}",
|
81
|
+
"--env VIRTUAL_PATH='/'",
|
82
|
+
"--env LETSENCRYPT_HOST=#{@fqdn}",
|
83
|
+
"--env LETSENCRYPT_EMAIL=#{@sysadmin_email}",
|
84
|
+
"--env LETSENCRYPT_TEST=false",
|
85
|
+
"--env CONTAINER_NAME='#{@name}'",
|
86
|
+
"--env FQDN='#{@fqdn}'",
|
87
|
+
"--env MAILNAME='#{@mailname}'",
|
88
|
+
"--env SYSADMIN_EMAIL='#{@sysadmin_email}'",
|
89
|
+
"--env MYSQL_HOST='#{@mysql_host}'",
|
90
|
+
"--env MYSQL_PORT='#{@mysql_port}'",
|
91
|
+
"--env MYSQL_USER='#{@mysql_user}'",
|
92
|
+
"--env MYSQL_PASSWORD='#{@mysql_password}'",
|
93
|
+
"--env MYSQL_DATABASE_NAME='#{@mysql_database_name}'",
|
94
|
+
"--env MONIT_SMTP_EMAIL_NAME='#{@monit_smtp_email_name}'",
|
95
|
+
"--env MONIT_SMTP_EMAIL_ADDRESS='#{@monit_smtp_email_address}'",
|
96
|
+
"--env MONIT_SMTP_HOST='#{@monit_smtp_host}'",
|
97
|
+
"--env MONIT_SMTP_PORT='#{@monit_smtp_port}'",
|
98
|
+
"--env MONIT_SMTP_USERNAME='#{@monit_smtp_username}'",
|
99
|
+
"--env MONIT_SMTP_PASSWORD='#{@monit_smtp_password}'",
|
100
|
+
"--env ORACLE_IPS_ALLOWED='#{@oracle_ips_allowed.join(' ')}'",
|
101
|
+
"--env ORACLE_DEFLECT_URL='#{@oracle_deflect_url}'",
|
102
|
+
"--expose='80'",
|
103
|
+
"--publish='25:25'",
|
104
|
+
# "--publish='465:465'",
|
105
|
+
"--publish='587:587'",
|
106
|
+
# "--publish='110:110'",
|
107
|
+
"--publish='995:995'",
|
108
|
+
# "--publish='143:143'",
|
109
|
+
"--publish='993:993'",
|
110
|
+
"--volume='#{@home_dir}/smartmachine/grids/nginx/certificates/#{@fqdn}:/etc/letsencrypt/live/#{@fqdn}:ro'",
|
111
|
+
"--volume='#{@home_dir}/smartmachine/config/emailer:/smartmachine/config/emailer:ro'",
|
112
|
+
"--volume='#{@home_dir}/smartmachine/grids/emailer/#{@name}/data/vmail:/var/vmail'",
|
113
|
+
"--volume='#{@home_dir}/smartmachine/grids/emailer/#{@name}/data/opendkim:/etc/opendkim'",
|
114
|
+
"--entrypoint='/smartmachine/config/emailer/docker/entrypoint.rb'",
|
115
|
+
"--tmpfs /run/tmpfs",
|
116
|
+
"--init",
|
117
|
+
"--restart='always'",
|
118
|
+
"--network='nginx-network'",
|
119
|
+
"#{@image}"
|
120
|
+
]
|
121
|
+
if system(command.compact.join(" "), out: File::NULL)
|
122
|
+
@networks.each do |network|
|
123
|
+
system("docker network connect --alias #{@fqdn} #{network} #{@name}")
|
124
|
+
end
|
125
|
+
|
126
|
+
puts "done"
|
127
|
+
puts "-----> Starting container #{@name} ... "
|
128
|
+
if system("docker start #{@name}", out: File::NULL)
|
129
|
+
puts "done"
|
130
|
+
else
|
131
|
+
raise "Error: Could not start container: #{@name}"
|
132
|
+
end
|
133
|
+
else
|
134
|
+
raise "Error: Could not create container: #{@name}"
|
135
|
+
end
|
136
|
+
else
|
137
|
+
raise "Error: Could not find image: #{@image}"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def downer
|
142
|
+
# Disconnecting networks
|
143
|
+
@networks.reverse.each do |network|
|
144
|
+
system("docker network disconnect #{network} #{@name}")
|
145
|
+
end
|
146
|
+
|
147
|
+
# Stopping & Removing containers - in reverse order
|
148
|
+
print "-----> Stopping container #{@name} ... "
|
149
|
+
if system("docker stop '#{@name}'", out: File::NULL)
|
150
|
+
puts "done"
|
151
|
+
print "-----> Removing container #{@name} ... "
|
152
|
+
if system("docker rm '#{@name}'", out: File::NULL)
|
153
|
+
puts "done"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
def dockerfile
|
161
|
+
file = <<~'DOCKERFILE'
|
162
|
+
ARG SMARTMACHINE_VERSION
|
163
|
+
|
164
|
+
FROM smartmachine/smartengine:$SMARTMACHINE_VERSION
|
165
|
+
LABEL maintainer="plainsource <plainsource@humanmind.me>"
|
166
|
+
|
167
|
+
SHELL ["/bin/bash", "-c"]
|
168
|
+
|
169
|
+
RUN apt-get update && \
|
170
|
+
\
|
171
|
+
debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'" && \
|
172
|
+
debconf-set-selections <<< "postfix postfix/mailname string %<mailname>s" && \
|
173
|
+
apt-get install -y --no-install-recommends \
|
174
|
+
rsyslog \
|
175
|
+
postfix postfix-mysql \
|
176
|
+
dovecot-managesieved dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql \
|
177
|
+
spamassassin spamc \
|
178
|
+
opendkim opendkim-tools \
|
179
|
+
postfix-policyd-spf-python postfix-pcre \
|
180
|
+
haproxy monit && \
|
181
|
+
rm -rf /var/lib/apt/lists/*
|
182
|
+
DOCKERFILE
|
183
|
+
|
184
|
+
format(file, "mailname": @mailname)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: Add haproxy as an alternative to nginx.
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: Add mariadb as an alternative for mysql.
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: Add postgresql as an alternative for mariadb & mysql.
|