smartmachine 1.1.1 → 1.2.0.dev
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/commands/grid.rb +4 -0
- data/lib/smart_machine/commands/grid_commands/phpmyadmin.rb +65 -0
- data/lib/smart_machine/commands/machine.rb +6 -0
- data/lib/smart_machine/commands/machine_commands/network.rb +65 -0
- data/lib/smart_machine/commands/machine_commands/sub_thor.rb +15 -0
- data/lib/smart_machine/configuration.rb +24 -2
- data/lib/smart_machine/grids/mysql.rb +8 -0
- data/lib/smart_machine/grids/phpmyadmin.rb +104 -0
- data/lib/smart_machine/grids/terminal/init.el +70 -140
- data/lib/smart_machine/machines/network.rb +37 -0
- data/lib/smart_machine/syncer.rb +4 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/mysql.yml +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/network.yml +8 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/phpmyadmin/phpmyadminone/config.user.inc.php +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/phpmyadmin.yml +11 -0
- data/lib/smart_machine/version.rb +3 -3
- data/lib/smart_machine.rb +3 -0
- metadata +15 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d02cc8e054d7716fda6e487f5964c2c0e47a604e664be9cbcc77436ac1b8cc3
|
4
|
+
data.tar.gz: e476480bd9b755c84f4996e86dbc99e1d24d96b1139a9fd7bb14c4ab7b24cc29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06ad0c9df3fde28ce64a629d2caa597cd84838eed893a3ce7b835bc29715f8b4f2d0764b8e32bb6593f255010519d342f60593ae5caf4417802953ea4e47d287
|
7
|
+
data.tar.gz: 6eadb0a1ba55a868f738dd7cb5ccfedda02247406d9d0fadc8f8b18918a43a9859164fd9844921bd377f0e4a4e4b4ba6c9890ca68bbbd494c25459b93c53c063
|
@@ -4,6 +4,7 @@ require 'smart_machine/commands/grid_commands/minio'
|
|
4
4
|
require 'smart_machine/commands/grid_commands/mysql'
|
5
5
|
require 'smart_machine/commands/grid_commands/nextcloud'
|
6
6
|
require 'smart_machine/commands/grid_commands/nginx'
|
7
|
+
require 'smart_machine/commands/grid_commands/phpmyadmin'
|
7
8
|
require 'smart_machine/commands/grid_commands/prereceiver'
|
8
9
|
require 'smart_machine/commands/grid_commands/redis'
|
9
10
|
require 'smart_machine/commands/grid_commands/terminal'
|
@@ -28,6 +29,9 @@ module SmartMachine
|
|
28
29
|
desc "nginx", "Run nginx grid commands"
|
29
30
|
subcommand "nginx", GridCommands::Nginx
|
30
31
|
|
32
|
+
desc "phpmyadmin", "Run phpmyadmin grid commands"
|
33
|
+
subcommand "phpmyadmin", GridCommands::Phpmyadmin
|
34
|
+
|
31
35
|
desc "prereceiver", "Run prereceiver grid commands"
|
32
36
|
subcommand "prereceiver", GridCommands::Prereceiver
|
33
37
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module GridCommands
|
4
|
+
class Phpmyadmin < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "up", "Take UP the phpmyadmin 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 phpmyadmin uper#{name_option}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "down", "Take DOWN the phpmyadmin 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 phpmyadmin downer#{name_option}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "uper", "Phpmyadmin grid uper", hide: true
|
32
|
+
option :name, type: :string
|
33
|
+
def uper
|
34
|
+
inside_engine_machine_dir do
|
35
|
+
if options[:name]
|
36
|
+
phpmyadmin = SmartMachine::Grids::Phpmyadmin.new(name: options[:name])
|
37
|
+
phpmyadmin.uper
|
38
|
+
else
|
39
|
+
SmartMachine.config.grids.phpmyadmin.each do |name, config|
|
40
|
+
phpmyadmin = SmartMachine::Grids::Phpmyadmin.new(name: name.to_s)
|
41
|
+
phpmyadmin.uper
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "downer", "Phpmyadmin grid downer", hide: true
|
48
|
+
option :name, type: :string
|
49
|
+
def downer
|
50
|
+
inside_engine_machine_dir do
|
51
|
+
if options[:name]
|
52
|
+
phpmyadmin = SmartMachine::Grids::Phpmyadmin.new(name: options[:name])
|
53
|
+
phpmyadmin.downer
|
54
|
+
else
|
55
|
+
SmartMachine.config.grids.phpmyadmin.each do |name, config|
|
56
|
+
phpmyadmin = SmartMachine::Grids::Phpmyadmin.new(name: name.to_s)
|
57
|
+
phpmyadmin.downer
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'smart_machine/commands/machine_commands/sub_thor'
|
2
|
+
require 'smart_machine/commands/machine_commands/network'
|
3
|
+
|
1
4
|
module SmartMachine
|
2
5
|
module Commands
|
3
6
|
class Machine < Thor
|
@@ -27,6 +30,9 @@ module SmartMachine
|
|
27
30
|
machine.run_on_machine(commands: "#{args.join(' ')}")
|
28
31
|
end
|
29
32
|
end
|
33
|
+
|
34
|
+
desc "network", "Run machine network commands"
|
35
|
+
subcommand "network", MachineCommands::Network
|
30
36
|
end
|
31
37
|
end
|
32
38
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module MachineCommands
|
4
|
+
class Network < SubThor
|
5
|
+
include Utilities
|
6
|
+
|
7
|
+
desc "up", "Take UP the machine network"
|
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 machine network uper#{name_option}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "down", "Take DOWN the machine network"
|
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 machine network downer#{name_option}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "uper", "Machine network uper", hide: true
|
32
|
+
option :name, type: :string
|
33
|
+
def uper
|
34
|
+
inside_engine_machine_dir do
|
35
|
+
if options[:name]
|
36
|
+
network = SmartMachine::Machines::Network.new(name: options[:name])
|
37
|
+
network.uper
|
38
|
+
else
|
39
|
+
SmartMachine.config.network.each do |name, config|
|
40
|
+
network = SmartMachine::Machines::Network.new(name: name.to_s)
|
41
|
+
network.uper
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "downer", "Machine network downer", hide: true
|
48
|
+
option :name, type: :string
|
49
|
+
def downer
|
50
|
+
inside_engine_machine_dir do
|
51
|
+
if options[:name]
|
52
|
+
network = SmartMachine::Machines::Network.new(name: options[:name])
|
53
|
+
network.downer
|
54
|
+
else
|
55
|
+
SmartMachine.config.network.each do |name, config|
|
56
|
+
network = SmartMachine::Machines::Network.new(name: name.to_s)
|
57
|
+
network.downer
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
module Commands
|
3
|
+
module MachineCommands
|
4
|
+
class SubThor < Thor
|
5
|
+
def self.banner(command, namespace = nil, subcommand = false)
|
6
|
+
"#{basename} machine #{subcommand_prefix} #{command.usage}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.subcommand_prefix
|
10
|
+
self.name.gsub(%r{.*::}, '').gsub(%r{^[A-Z]}) { |match| match[0].downcase }.gsub(%r{[A-Z]}) { |match| "-#{match[0].downcase}" }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -8,13 +8,13 @@ module SmartMachine
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def config
|
11
|
-
@config ||= OpenStruct.new(grids: grids)
|
11
|
+
@config ||= OpenStruct.new(grids: grids, network: network)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def grids
|
17
|
-
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, nextcloud: nextcloud, prereceiver: prereceiver, redis: redis, terminal: terminal)
|
17
|
+
@grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, nextcloud: nextcloud, phpmyadmin: phpmyadmin, prereceiver: prereceiver, redis: redis, terminal: terminal)
|
18
18
|
end
|
19
19
|
|
20
20
|
def elasticsearch
|
@@ -61,6 +61,17 @@ module SmartMachine
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
def phpmyadmin
|
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/phpmyadmin.yml always exists
|
66
|
+
if File.exist? "config/phpmyadmin.yml"
|
67
|
+
deserialize(IO.binread("config/phpmyadmin.yml")).deep_symbolize_keys
|
68
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/phpmyadmin.yml"
|
69
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/phpmyadmin.yml")).deep_symbolize_keys
|
70
|
+
else
|
71
|
+
{}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
64
75
|
def prereceiver
|
65
76
|
# 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
|
66
77
|
if File.exist? "config/prereceiver.yml"
|
@@ -94,6 +105,17 @@ module SmartMachine
|
|
94
105
|
end
|
95
106
|
end
|
96
107
|
|
108
|
+
def network
|
109
|
+
# 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/network.yml always exists
|
110
|
+
if File.exist? "config/network.yml"
|
111
|
+
deserialize(IO.binread("config/network.yml")).deep_symbolize_keys
|
112
|
+
elsif File.exist? "#{File.expand_path('~')}/machine/config/network.yml"
|
113
|
+
deserialize(IO.binread("#{File.expand_path('~')}/machine/config/network.yml")).deep_symbolize_keys
|
114
|
+
else
|
115
|
+
{}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
97
119
|
def deserialize(config)
|
98
120
|
YAML.load(ERB.new(config).result).presence || {}
|
99
121
|
end
|
@@ -6,6 +6,7 @@ module SmartMachine
|
|
6
6
|
raise "mysql config for #{name} not found." unless config
|
7
7
|
|
8
8
|
@port = config.dig(:port)
|
9
|
+
@networks = Array(config.dig(:networks))
|
9
10
|
@root_password = config.dig(:root_password)
|
10
11
|
@username = config.dig(:username)
|
11
12
|
@password = config.dig(:password)
|
@@ -48,6 +49,9 @@ module SmartMachine
|
|
48
49
|
puts "done"
|
49
50
|
puts "-----> Starting container #{@name} ... "
|
50
51
|
if system("docker start #{@name}", out: File::NULL)
|
52
|
+
@networks.each do |network|
|
53
|
+
raise "Error: Could not connect container: #{network} - #{@name}" unless system("docker network connect #{network} #{@name}", out: File::NULL)
|
54
|
+
end
|
51
55
|
puts "done"
|
52
56
|
else
|
53
57
|
raise "Error: Could not start the created #{@name} container"
|
@@ -59,6 +63,10 @@ module SmartMachine
|
|
59
63
|
|
60
64
|
# Stopping & Removing containers - in reverse order
|
61
65
|
def downer
|
66
|
+
@networks.each do |network|
|
67
|
+
raise "Error: Could not disconnect container: #{network} - #{@name}" unless system("docker network disconnect #{network} #{@name}", out: File::NULL)
|
68
|
+
end
|
69
|
+
|
62
70
|
puts "-----> Stopping container #{@name} ... "
|
63
71
|
if system("docker stop '#{@name}'", out: File::NULL)
|
64
72
|
puts "done"
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
class Grids
|
3
|
+
class Phpmyadmin < SmartMachine::Base
|
4
|
+
def initialize(name:)
|
5
|
+
config = SmartMachine.config.grids.phpmyadmin.dig(name.to_sym)
|
6
|
+
raise "phpmyadmin config for #{name} not found." unless config
|
7
|
+
|
8
|
+
@image = config.dig(:image)
|
9
|
+
@command = config.dig(:command)
|
10
|
+
@host = config.dig(:host)
|
11
|
+
@networks = Array(config.dig(:networks))
|
12
|
+
|
13
|
+
@pma_controlhost = config.dig(:pma_controlhost)
|
14
|
+
mysql_config = SmartMachine.config.grids.mysql.dig(@pma_controlhost&.to_sym)
|
15
|
+
raise "phpmyadmin | mysql config for #{@pma_controlhost} not found." unless mysql_config
|
16
|
+
@mysql_config_root_password = mysql_config.dig(:root_password)
|
17
|
+
@pma_controlport = mysql_config.dig(:port)
|
18
|
+
@pma_controluser = mysql_config.dig(:username)
|
19
|
+
@pma_controlpass = mysql_config.dig(:password)
|
20
|
+
@pma_pmadb = "phpmyadmin"
|
21
|
+
|
22
|
+
@name = name.to_s
|
23
|
+
@home_dir = File.expand_path('~')
|
24
|
+
end
|
25
|
+
|
26
|
+
def uper
|
27
|
+
raise "Error: Could not create container: #{@name}" unless system(command.compact.join(' '), out: File::NULL)
|
28
|
+
raise "Error: Could not start container: #{@name}" unless system("docker start #{@name}", out: File::NULL)
|
29
|
+
@networks.each do |network|
|
30
|
+
raise "Error: Could not connect container: #{network} - #{@name}" unless system("docker network connect #{network} #{@name}", out: File::NULL)
|
31
|
+
end
|
32
|
+
|
33
|
+
raise "Error: Could not setup database: #{@name}" unless system(command_db_setup.compact.join(' '), out: File::NULL)
|
34
|
+
raise "Error: Could not setup tables: #{@name}" unless system(command_db_tables_setup.compact.join(' '), out: File::NULL)
|
35
|
+
|
36
|
+
puts "Created, Started & Connected container: #{@name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def downer
|
40
|
+
@networks.each do |network|
|
41
|
+
raise "Error: Could not disconnect container: #{network} - #{@name}" unless system("docker network disconnect #{network} #{@name}", out: File::NULL)
|
42
|
+
end
|
43
|
+
raise "Error: Could not stop container: #{@name}" unless system("docker stop '#{@name}'", out: File::NULL)
|
44
|
+
raise "Error: Could not remove container: #{@name}" unless system("docker rm '#{@name}'", out: File::NULL)
|
45
|
+
|
46
|
+
puts "Disconnected, Stopped & Removed container: #{@name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def command
|
52
|
+
[
|
53
|
+
'docker create',
|
54
|
+
"--name='#{@name}'",
|
55
|
+
"--env VIRTUAL_HOST=#{@host}",
|
56
|
+
"--env LETSENCRYPT_HOST=#{@host}",
|
57
|
+
"--env LETSENCRYPT_EMAIL=#{SmartMachine.config.sysadmin_email}",
|
58
|
+
'--env LETSENCRYPT_TEST=false',
|
59
|
+
"--env PMA_CONTROLHOST=#{@pma_controlhost}",
|
60
|
+
"--env PMA_CONTROLPORT=#{@pma_controlport}",
|
61
|
+
"--env PMA_CONTROLUSER=#{@pma_controluser}",
|
62
|
+
"--env PMA_CONTROLPASS=#{@pma_controlpass}",
|
63
|
+
"--env PMA_PMADB=#{@pma_pmadb}",
|
64
|
+
'--env PMA_QUERYHISTORYDB=true',
|
65
|
+
'--env HIDE_PHP_VERSION=true',
|
66
|
+
'--env PMA_ARBITRARY=1',
|
67
|
+
volumes,
|
68
|
+
"--restart='always'",
|
69
|
+
"--network='#{@networks.shift}'",
|
70
|
+
@image,
|
71
|
+
@command
|
72
|
+
]
|
73
|
+
end
|
74
|
+
|
75
|
+
def volumes
|
76
|
+
volumes = []
|
77
|
+
|
78
|
+
if File.exist?("#{@home_dir}/machine/config/phpmyadmin/#{@name}/config.user.inc.php")
|
79
|
+
volumes.push("--volume='#{@home_dir}/smartmachine/config/phpmyadmin/#{@name}/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php'")
|
80
|
+
end
|
81
|
+
|
82
|
+
volumes.join(" ")
|
83
|
+
end
|
84
|
+
|
85
|
+
def command_db_setup
|
86
|
+
[
|
87
|
+
"docker exec -i #{@pma_controlhost}",
|
88
|
+
"bash -c \"exec mysql --defaults-extra-file=<(echo $'[client]\npassword='\"#{@mysql_config_root_password}\") -uroot --execute \\\"",
|
89
|
+
"CREATE DATABASE IF NOT EXISTS #{@pma_pmadb};",
|
90
|
+
"GRANT ALL PRIVILEGES ON #{@pma_pmadb}.* TO #{@pma_controluser}@'%';",
|
91
|
+
"\\\"\""
|
92
|
+
]
|
93
|
+
end
|
94
|
+
|
95
|
+
def command_db_tables_setup
|
96
|
+
[
|
97
|
+
"docker cp #{@name}:/var/www/html/sql/create_tables.sql - | tar -xO |",
|
98
|
+
"docker exec -i #{@pma_controlhost} bash -c",
|
99
|
+
"\"exec mysql --defaults-extra-file=<(echo $'[client]\npassword='\"#{@mysql_config_root_password}\") -uroot\""
|
100
|
+
]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,58 +1,29 @@
|
|
1
|
-
|
2
|
-
;; custom-set-variables was added by Custom.
|
3
|
-
;; If you edit it by hand, you could mess it up, so be careful.
|
4
|
-
;; Your init file should contain only one such instance.
|
5
|
-
;; If there is more than one, they won't work right.
|
6
|
-
'(package-selected-packages
|
7
|
-
'(polymode ruby-electric ruby-electric-mode ruby-mode dockerfile-mode expand-region flycheck zenburn-theme multi-vterm vterm yaml-mode web-mode use-package undo-tree typescript-mode smartparens robe rbenv rainbow-delimiters projectile-rails osx-trash magit logview indent-guide diredfl dired-sidebar dired-narrow dired-git-info diff-hl company clipetty bundler)))
|
8
|
-
(custom-set-faces
|
9
|
-
;; custom-set-faces was added by Custom.
|
10
|
-
;; If you edit it by hand, you could mess it up, so be careful.
|
11
|
-
;; Your init file should contain only one such instance.
|
12
|
-
;; If there is more than one, they won't work right.
|
13
|
-
'(diff-hl-change ((t (:foreground "#f7ca88" :background "#f7ca88"))))
|
14
|
-
'(diff-hl-delete ((t (:foreground "#ab4642" :background "#ab4642"))))
|
15
|
-
'(diff-hl-insert ((t (:foreground "#a1b56c" :background "#a1b56c")))))
|
1
|
+
;;; init.el --- Emacs Init: Initial file that emacs loads at startup.
|
16
2
|
|
17
|
-
|
18
|
-
|
19
|
-
(add-to-list 'package-archives
|
20
|
-
'("melpa" . "http://melpa.org/packages/") t)
|
3
|
+
;;; Commentary:
|
4
|
+
;; This file includes the basic setup necessary to get started with Emacs.
|
21
5
|
|
22
|
-
|
23
|
-
;; Ensure use-package is installed.
|
24
|
-
(unless (package-installed-p 'use-package)
|
25
|
-
(package-refresh-contents)
|
26
|
-
(package-install 'use-package))
|
27
|
-
;; Configure and load use-package.
|
28
|
-
(setq use-package-always-ensure t)
|
29
|
-
(eval-when-compile
|
30
|
-
(defvar use-package-verbose t)
|
31
|
-
(require 'use-package))
|
6
|
+
;;; Code:
|
32
7
|
|
33
|
-
;; Disable menu bar in
|
8
|
+
;; Disable menu bar in Emacs.
|
34
9
|
(menu-bar-mode -1)
|
35
10
|
|
36
|
-
;;
|
11
|
+
;; Change backup file directory for emacs.
|
37
12
|
(setq backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))
|
38
13
|
|
39
|
-
;;
|
40
|
-
|
41
|
-
|
42
|
-
(when (string= system-type "darwin")
|
43
|
-
(setq dired-use-ls-dired t
|
44
|
-
insert-directory-program "/usr/local/bin/gls"
|
45
|
-
dired-listing-switches "-aBhl --ignore=.DS_Store --ignore=.git --ignore=.bundle --ignore=.byebug_history --group-directories-first"))
|
14
|
+
;; This lists the directories first and ignores some files and directories in dired.
|
15
|
+
(setq dired-use-ls-dired t)
|
16
|
+
(setq dired-listing-switches "-aBhl --ignore=.git --ignore=.bundle --ignore=.byebug_history --group-directories-first")
|
46
17
|
|
47
|
-
;; Hide dired details on startup
|
18
|
+
;; Hide dired details on startup.
|
48
19
|
(add-hook 'dired-mode-hook
|
49
20
|
(lambda ()
|
50
21
|
(dired-hide-details-mode)))
|
51
22
|
|
52
|
-
;; Setup initial screen
|
23
|
+
;; Setup initial screen.
|
53
24
|
(setq initial-buffer-choice (expand-file-name "."))
|
54
25
|
|
55
|
-
;; Org mode key bindings
|
26
|
+
;; Org mode key bindings.
|
56
27
|
(global-set-key (kbd "C-c l") 'org-store-link)
|
57
28
|
(global-set-key (kbd "C-c a") 'org-agenda)
|
58
29
|
(global-set-key (kbd "C-c c") 'org-capture)
|
@@ -64,7 +35,7 @@
|
|
64
35
|
;; Highlight current line.
|
65
36
|
(global-hl-line-mode +1)
|
66
37
|
|
67
|
-
;; Revert buffers if they've changed on disk
|
38
|
+
;; Revert buffers if they've changed on disk.
|
68
39
|
(global-auto-revert-mode 1)
|
69
40
|
(setq auto-revert-verbose nil)
|
70
41
|
|
@@ -80,31 +51,31 @@
|
|
80
51
|
(add-to-list 'grep-find-ignored-directories "auto")
|
81
52
|
(add-to-list 'grep-find-ignored-directories "elpa")))
|
82
53
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
(zenburn-with-color-variables
|
88
|
-
(custom-theme-set-faces
|
89
|
-
'zenburn
|
90
|
-
`(hl-line-face ((t (:background ,zenburn-bg+05 ))))
|
91
|
-
`(hl-line ((t (:background ,zenburn-bg+05 ))))
|
92
|
-
`(region ((nil (:background ,zenburn-bg+2))))
|
93
|
-
)))
|
54
|
+
;; Add melpa to package-archives list.
|
55
|
+
(require 'package)
|
56
|
+
(add-to-list 'package-archives
|
57
|
+
'("melpa" . "http://melpa.org/packages/") t)
|
94
58
|
|
95
|
-
|
96
|
-
|
59
|
+
;; use-package
|
60
|
+
;; Ensure use-package is installed.
|
61
|
+
(unless (package-installed-p 'use-package)
|
62
|
+
(package-refresh-contents)
|
63
|
+
(package-install 'use-package))
|
64
|
+
;; Configure and load use-package.
|
65
|
+
(setq use-package-always-ensure t)
|
66
|
+
(eval-when-compile
|
67
|
+
(defvar use-package-verbose t)
|
68
|
+
(require 'use-package))
|
69
|
+
|
70
|
+
(use-package logview)
|
97
71
|
|
98
|
-
(use-package dired-hacks-utils
|
99
|
-
:ensure t)
|
72
|
+
(use-package dired-hacks-utils)
|
100
73
|
|
101
74
|
(use-package dired-narrow
|
102
|
-
:ensure t
|
103
75
|
:bind (:map dired-mode-map
|
104
76
|
("/" . dired-narrow)))
|
105
77
|
|
106
78
|
(use-package dired-subtree
|
107
|
-
:ensure t
|
108
79
|
:after dired
|
109
80
|
:bind (:map dired-mode-map
|
110
81
|
("TAB" . dired-subtree-toggle)
|
@@ -113,33 +84,21 @@
|
|
113
84
|
(setq dired-subtree-use-backgrounds nil))
|
114
85
|
|
115
86
|
(use-package dired-git-info
|
116
|
-
:ensure t
|
117
87
|
:bind (:map dired-mode-map
|
118
88
|
(")" . dired-git-info-mode)))
|
119
89
|
|
120
|
-
|
121
|
-
|
122
|
-
:
|
123
|
-
|
124
|
-
:init
|
125
|
-
(setq dired-sidebar-use-term-integration t)
|
126
|
-
(setq dired-sidebar-use-custom-font t))
|
127
|
-
|
128
|
-
(use-package typescript-mode
|
129
|
-
:ensure t)
|
90
|
+
;; Extra font lock rules for a more colourful dired.
|
91
|
+
(use-package diredfl
|
92
|
+
:config
|
93
|
+
(diredfl-global-mode))
|
130
94
|
|
131
95
|
(use-package clipetty
|
132
|
-
:ensure t
|
133
96
|
:bind ("M-w" . clipetty-kill-ring-save))
|
134
97
|
|
135
|
-
(use-package osx-trash
|
136
|
-
:config
|
137
|
-
(when (eq system-type 'darwin)
|
138
|
-
(osx-trash-setup))
|
139
|
-
(setq delete-by-moving-to-trash t))
|
140
|
-
|
141
98
|
(use-package undo-tree
|
142
99
|
:config
|
100
|
+
;; Prevent undo tree files from polluting your git repo
|
101
|
+
(setq undo-tree-history-directory-alist `(("." . ,(concat user-emacs-directory "backups/undotree"))))
|
143
102
|
(global-undo-tree-mode))
|
144
103
|
|
145
104
|
(use-package indent-guide
|
@@ -156,17 +115,6 @@
|
|
156
115
|
(require 'smartparens-config))
|
157
116
|
(add-hook 'prog-mode-hook #'smartparens-mode)
|
158
117
|
|
159
|
-
(use-package ruby-mode
|
160
|
-
:config
|
161
|
-
(add-to-list 'auto-mode-alist
|
162
|
-
'("\\.\\(?:cap\\|gemspec\\|irbrc\\|gemrc\\|rake\\|rb\\|ru\\|thor\\)\\'" . ruby-mode))
|
163
|
-
(add-to-list 'auto-mode-alist
|
164
|
-
'("\\(?:Brewfile\\|Capfile\\|Gemfile\\(?:\\.[a-zA-Z0-9._-]+\\)?\\|[rR]akefile\\)\\'" . ruby-mode)))
|
165
|
-
|
166
|
-
(use-package ruby-electric
|
167
|
-
:config
|
168
|
-
(add-hook 'ruby-mode-hook 'ruby-electric-mode))
|
169
|
-
|
170
118
|
(use-package robe
|
171
119
|
:config
|
172
120
|
(eval-after-load 'company '(push 'company-robe company-backends))
|
@@ -176,33 +124,6 @@
|
|
176
124
|
:config
|
177
125
|
(add-hook 'after-init-hook 'global-company-mode))
|
178
126
|
|
179
|
-
(use-package bundler)
|
180
|
-
|
181
|
-
(use-package rbenv
|
182
|
-
:config
|
183
|
-
(global-rbenv-mode))
|
184
|
-
|
185
|
-
(use-package yaml-mode
|
186
|
-
:config
|
187
|
-
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
|
188
|
-
(add-hook 'yaml-mode-hook '(lambda () (define-key yaml-mode-map "\C-m" 'newline-and-indent))))
|
189
|
-
|
190
|
-
(use-package web-mode
|
191
|
-
:config
|
192
|
-
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
|
193
|
-
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
|
194
|
-
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
|
195
|
-
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
|
196
|
-
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
|
197
|
-
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
|
198
|
-
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
|
199
|
-
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
|
200
|
-
(add-to-list 'auto-mode-alist '("\\.js?\\'" . web-mode))
|
201
|
-
(add-to-list 'auto-mode-alist '("\\.jsx?\\'" . web-mode))
|
202
|
-
(add-to-list 'auto-mode-alist '("\\.css?\\'" . web-mode))
|
203
|
-
(add-to-list 'auto-mode-alist '("\\.scss?\\'" . web-mode))
|
204
|
-
(add-to-list 'auto-mode-alist '("\\.xml?\\'" . web-mode)))
|
205
|
-
|
206
127
|
(use-package projectile
|
207
128
|
:config
|
208
129
|
(projectile-mode +1)
|
@@ -214,12 +135,6 @@
|
|
214
135
|
(projectile-rails-global-mode)
|
215
136
|
(define-key projectile-rails-mode-map (kbd "C-c r") 'projectile-rails-command-map))
|
216
137
|
|
217
|
-
;; Extra font lock rules for a more colourful dired.
|
218
|
-
(use-package diredfl
|
219
|
-
:ensure t
|
220
|
-
:config
|
221
|
-
(diredfl-global-mode))
|
222
|
-
|
223
138
|
(use-package diff-hl
|
224
139
|
:custom-face
|
225
140
|
;; Change colors for insert, delete and change indicators in diff-hl
|
@@ -244,8 +159,6 @@
|
|
244
159
|
|
245
160
|
;; A Git porcelain inside Emacs.
|
246
161
|
(use-package magit
|
247
|
-
:ensure t
|
248
|
-
|
249
162
|
:commands (magit-add-section-hook magit-section-initial-visibility-alist)
|
250
163
|
|
251
164
|
:init
|
@@ -261,36 +174,53 @@
|
|
261
174
|
(magit-add-section-hook 'magit-status-sections-hook 'magit-insert-tags nil t)
|
262
175
|
(add-to-list 'magit-section-initial-visibility-alist '(tags . hide)))
|
263
176
|
|
264
|
-
;; Emacs-libvterm (vterm) is fully-fledged terminal emulator inside GNU Emacs based on libvterm, a C library.
|
265
|
-
(use-package vterm
|
266
|
-
:ensure t
|
267
|
-
:config
|
268
|
-
(define-key vterm-mode-map (kbd "C-q") #'vterm-send-next-key)
|
269
|
-
:custom
|
270
|
-
(vterm-always-compile-module t))
|
271
|
-
;; Managing multiple vterm buffers in Emacs.
|
272
|
-
(use-package multi-vterm
|
273
|
-
:ensure t)
|
274
|
-
|
275
177
|
;; Flycheck is a modern on-the-fly syntax checking extension for GNU Emacs.
|
276
178
|
(use-package flycheck
|
277
|
-
:ensure t
|
278
179
|
:init
|
279
180
|
(global-flycheck-mode))
|
280
181
|
|
281
182
|
;; Expand region increases the selected region by semantic units. Just keep pressing the key until it selects what you want.
|
282
183
|
(use-package expand-region
|
283
|
-
:ensure t
|
284
184
|
:bind
|
285
185
|
("C-=" . er/expand-region))
|
286
186
|
|
287
|
-
|
288
|
-
|
187
|
+
;; ruby-mode - comes included in latest emacs.
|
188
|
+
(add-to-list 'auto-mode-alist
|
189
|
+
'("\\.\\(?:cap\\|gemspec\\|irbrc\\|gemrc\\|rake\\|rb\\|ru\\|thor\\|god\\)\\'" . ruby-mode))
|
190
|
+
(add-to-list 'auto-mode-alist
|
191
|
+
'("\\(?:Brewfile\\|Capfile\\|Gemfile\\(?:\\.[a-zA-Z0-9._-]+\\)?\\|[rR]akefile\\)\\'" . ruby-mode))
|
192
|
+
(use-package ruby-electric
|
193
|
+
:config
|
194
|
+
(eval-after-load "ruby-mode"
|
195
|
+
'(add-hook 'ruby-mode-hook 'ruby-electric-mode)))
|
196
|
+
|
197
|
+
(use-package yaml-mode
|
198
|
+
:config
|
199
|
+
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
|
200
|
+
(add-hook 'yaml-mode-hook '(lambda () (define-key yaml-mode-map "\C-m" 'newline-and-indent))))
|
201
|
+
|
202
|
+
(use-package typescript-mode)
|
203
|
+
|
204
|
+
(use-package web-mode
|
205
|
+
:config
|
206
|
+
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
|
207
|
+
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
|
208
|
+
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
|
209
|
+
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
|
210
|
+
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
|
211
|
+
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
|
212
|
+
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
|
213
|
+
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
|
214
|
+
(add-to-list 'auto-mode-alist '("\\.js?\\'" . web-mode))
|
215
|
+
(add-to-list 'auto-mode-alist '("\\.jsx?\\'" . web-mode))
|
216
|
+
(add-to-list 'auto-mode-alist '("\\.css?\\'" . web-mode))
|
217
|
+
(add-to-list 'auto-mode-alist '("\\.scss?\\'" . web-mode))
|
218
|
+
(add-to-list 'auto-mode-alist '("\\.xml?\\'" . web-mode)))
|
219
|
+
|
220
|
+
(use-package dockerfile-mode)
|
289
221
|
|
290
222
|
;; Polymode is a framework for multiple major modes (MMM) inside a single Emacs buffer.
|
291
223
|
(use-package polymode
|
292
|
-
:ensure t
|
293
|
-
|
294
224
|
:config
|
295
225
|
(with-eval-after-load "polymode"
|
296
226
|
(eieio-oset-default pm-inner-chunkmode :adjust-face -2))
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmartMachine
|
2
|
+
class Machines
|
3
|
+
class Network < SmartMachine::Base
|
4
|
+
def initialize(name:)
|
5
|
+
config = SmartMachine.config.network.dig(name.to_sym)
|
6
|
+
raise "network config for #{name} not found." unless config
|
7
|
+
|
8
|
+
@driver = config.dig(:driver)
|
9
|
+
|
10
|
+
@name = name.to_s
|
11
|
+
@home_dir = File.expand_path('~')
|
12
|
+
end
|
13
|
+
|
14
|
+
def uper
|
15
|
+
raise "Error: Could not create network: #{@name}" unless system(command.compact.join(' '), out: File::NULL)
|
16
|
+
|
17
|
+
puts "Created network: #{@name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def downer
|
21
|
+
raise "Error: Could not remove network: #{@name}" unless system("docker network rm '#{@name}'", out: File::NULL)
|
22
|
+
|
23
|
+
puts "Removed network: #{@name}"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def command
|
29
|
+
[
|
30
|
+
'docker network create',
|
31
|
+
"--driver=#{@driver}",
|
32
|
+
@name
|
33
|
+
]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/smart_machine/syncer.rb
CHANGED
@@ -103,12 +103,16 @@ module SmartMachine
|
|
103
103
|
'config',
|
104
104
|
'config/mysql',
|
105
105
|
'config/mysql/schedule.rb',
|
106
|
+
'config/phpmyadmin',
|
107
|
+
'config/phpmyadmin/***',
|
106
108
|
'config/credentials.yml.enc',
|
107
109
|
'config/environment.rb',
|
108
110
|
'config/elasticsearch.yml',
|
109
111
|
'config/minio.yml',
|
110
112
|
'config/mysql.yml',
|
113
|
+
'config/network.yml',
|
111
114
|
'config/nextcloud.yml',
|
115
|
+
'config/phpmyadmin.yml',
|
112
116
|
'config/prereceiver.yml',
|
113
117
|
'config/redis.yml',
|
114
118
|
'config/terminal.yml',
|
@@ -1,5 +1,6 @@
|
|
1
1
|
mysqlone:
|
2
2
|
port: 3306
|
3
|
+
networks: networkone
|
3
4
|
root_password: <%= SmartMachine.credentials.dig(:mysqlone, :root_password) %>
|
4
5
|
username: <%= SmartMachine.credentials.dig(:mysqlone, :username) %>
|
5
6
|
password: <%= SmartMachine.credentials.dig(:mysqlone, :password) %>
|
@@ -7,6 +8,7 @@ mysqlone:
|
|
7
8
|
|
8
9
|
# mysqltwo:
|
9
10
|
# port: 3307
|
11
|
+
# networks: networkone
|
10
12
|
# root_password: <%= SmartMachine.credentials.dig(:mysqltwo, :root_password) %>
|
11
13
|
# username: <%= SmartMachine.credentials.dig(:mysqltwo, :username) %>
|
12
14
|
# password: <%= SmartMachine.credentials.dig(:mysqltwo, :password) %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
phpmyadminone:
|
2
|
+
image: "phpmyadmin:5.2.1"
|
3
|
+
host: "yourphpmyadminone.yourdomain.com"
|
4
|
+
networks: ["networkone", "nginx-network"]
|
5
|
+
pma_controlhost: mysqlone
|
6
|
+
|
7
|
+
# phpmyadmintwo:
|
8
|
+
# image: "phpmyadmin:5.2.1"
|
9
|
+
# host: "yourphpmyadmintwo.yourdomain.com"
|
10
|
+
# networks: ["networkone", "nginx-network"]
|
11
|
+
# pma_controlhost: mysqlone
|
data/lib/smart_machine.rb
CHANGED
@@ -27,12 +27,15 @@ require 'smart_machine/grids/minio'
|
|
27
27
|
require 'smart_machine/grids/mysql'
|
28
28
|
require 'smart_machine/grids/nextcloud'
|
29
29
|
require 'smart_machine/grids/nginx'
|
30
|
+
require 'smart_machine/grids/phpmyadmin'
|
30
31
|
require 'smart_machine/grids/prereceiver'
|
31
32
|
require 'smart_machine/grids/redis'
|
32
33
|
# require 'smart_machine/grids/solr'
|
33
34
|
require 'smart_machine/grids/terminal/wetty'
|
34
35
|
require 'smart_machine/grids/terminal'
|
35
36
|
|
37
|
+
require 'smart_machine/machines/network'
|
38
|
+
|
36
39
|
module SmartMachine
|
37
40
|
class Error < StandardError; end
|
38
41
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0.dev
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- plainsource
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -185,11 +185,14 @@ files:
|
|
185
185
|
- lib/smart_machine/commands/grid_commands/mysql.rb
|
186
186
|
- lib/smart_machine/commands/grid_commands/nextcloud.rb
|
187
187
|
- lib/smart_machine/commands/grid_commands/nginx.rb
|
188
|
+
- lib/smart_machine/commands/grid_commands/phpmyadmin.rb
|
188
189
|
- lib/smart_machine/commands/grid_commands/prereceiver.rb
|
189
190
|
- lib/smart_machine/commands/grid_commands/redis.rb
|
190
191
|
- lib/smart_machine/commands/grid_commands/sub_thor.rb
|
191
192
|
- lib/smart_machine/commands/grid_commands/terminal.rb
|
192
193
|
- lib/smart_machine/commands/machine.rb
|
194
|
+
- lib/smart_machine/commands/machine_commands/network.rb
|
195
|
+
- lib/smart_machine/commands/machine_commands/sub_thor.rb
|
193
196
|
- lib/smart_machine/commands/syncer.rb
|
194
197
|
- lib/smart_machine/commands/utilities.rb
|
195
198
|
- lib/smart_machine/configuration.rb
|
@@ -202,6 +205,7 @@ files:
|
|
202
205
|
- lib/smart_machine/grids/mysql/docker-entrypoint-initdb.d/.keep
|
203
206
|
- lib/smart_machine/grids/nextcloud.rb
|
204
207
|
- lib/smart_machine/grids/nginx.rb
|
208
|
+
- lib/smart_machine/grids/phpmyadmin.rb
|
205
209
|
- lib/smart_machine/grids/prereceiver.rb
|
206
210
|
- lib/smart_machine/grids/prereceiver/Dockerfile
|
207
211
|
- lib/smart_machine/grids/prereceiver/pre-receive
|
@@ -378,6 +382,7 @@ files:
|
|
378
382
|
- lib/smart_machine/grids/terminal/wetty.rb
|
379
383
|
- lib/smart_machine/logger.rb
|
380
384
|
- lib/smart_machine/machine.rb
|
385
|
+
- lib/smart_machine/machines/network.rb
|
381
386
|
- lib/smart_machine/scp.rb
|
382
387
|
- lib/smart_machine/ssh.rb
|
383
388
|
- lib/smart_machine/syncer.rb
|
@@ -389,7 +394,10 @@ files:
|
|
389
394
|
- lib/smart_machine/templates/dotsmartmachine/config/minio.yml
|
390
395
|
- lib/smart_machine/templates/dotsmartmachine/config/mysql.yml
|
391
396
|
- lib/smart_machine/templates/dotsmartmachine/config/mysql/schedule.rb
|
397
|
+
- lib/smart_machine/templates/dotsmartmachine/config/network.yml
|
392
398
|
- lib/smart_machine/templates/dotsmartmachine/config/nextcloud.yml
|
399
|
+
- lib/smart_machine/templates/dotsmartmachine/config/phpmyadmin.yml
|
400
|
+
- lib/smart_machine/templates/dotsmartmachine/config/phpmyadmin/phpmyadminone/config.user.inc.php
|
393
401
|
- lib/smart_machine/templates/dotsmartmachine/config/prereceiver.yml
|
394
402
|
- lib/smart_machine/templates/dotsmartmachine/config/redis.yml
|
395
403
|
- lib/smart_machine/templates/dotsmartmachine/config/terminal.yml
|
@@ -409,9 +417,9 @@ licenses:
|
|
409
417
|
metadata:
|
410
418
|
homepage_uri: https://github.com/plainsource/smartmachine
|
411
419
|
bug_tracker_uri: https://github.com/plainsource/smartmachine/issues
|
412
|
-
changelog_uri: https://github.com/plainsource/smartmachine/releases/tag/v1.
|
413
|
-
source_code_uri: https://github.com/plainsource/smartmachine/tree/v1.
|
414
|
-
post_install_message:
|
420
|
+
changelog_uri: https://github.com/plainsource/smartmachine/releases/tag/v1.2.0.dev
|
421
|
+
source_code_uri: https://github.com/plainsource/smartmachine/tree/v1.2.0.dev
|
422
|
+
post_install_message:
|
415
423
|
rdoc_options: []
|
416
424
|
require_paths:
|
417
425
|
- lib
|
@@ -427,7 +435,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
427
435
|
version: 1.8.11
|
428
436
|
requirements: []
|
429
437
|
rubygems_version: 3.1.6
|
430
|
-
signing_key:
|
438
|
+
signing_key:
|
431
439
|
specification_version: 4
|
432
440
|
summary: Full-stack deployment framework for Rails.
|
433
441
|
test_files: []
|