meroku 2.0.27 → 2.0.28
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/.travis.yml +7 -1
- data/README.md +11 -0
- data/data/etc_nginx_sites-enabled_template +2 -2
- data/lib/meroku.rb +2 -0
- data/lib/meroku/app.rb +1 -1
- data/lib/meroku/aws.rb +5 -0
- data/lib/meroku/backup.rb +19 -0
- data/lib/meroku/cli.rb +5 -1
- data/lib/meroku/node.rb +49 -38
- data/lib/meroku/options.rb +11 -2
- data/lib/meroku/sshable.rb +29 -0
- data/lib/meroku/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dabc528fecbd5f25852370d305840e8bf9c489b
|
4
|
+
data.tar.gz: 1f1c527c6650c50003fae5d8c4c11152bd3af170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9723f339500f41aaa9932d472ae4bec04f2c1f08f8c84178dac5655e5518df11a47e26ed928ad0ba0ad1f720b6490905d3afec7dea57d75f7bc861686ddb5118
|
7
|
+
data.tar.gz: beff83ed3c1dc71c155b4f50fd571f05d2f09c7318f857fd3832600bba56ee0a95e0a6d80baaee40f4c9e2e30bb68a652bee061a88f0ec3eff20216d3ec3fa84
|
data/.travis.yml
CHANGED
@@ -7,12 +7,18 @@ before_install: gem install bundler -v 1.15.4
|
|
7
7
|
env:
|
8
8
|
global:
|
9
9
|
- CC_TEST_REPORTER_ID=61d42f990728bb450857fbd8b1f09d650f929f086d0d2d7d0c13ead9d33b77e2
|
10
|
-
- COVERAGE_PATH="coverage/"
|
11
10
|
|
12
11
|
before_script:
|
12
|
+
- echo $(env)
|
13
13
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
14
14
|
- chmod +x ./cc-test-reporter
|
15
15
|
- ./cc-test-reporter before-build
|
16
16
|
|
17
17
|
after_script:
|
18
18
|
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
19
|
+
|
20
|
+
after_success:
|
21
|
+
- if [ $TRAVIS_EVENT_TYPE == "cron" ]; then gem install meroku; fi
|
22
|
+
- if [ $TRAVIS_EVENT_TYPE == "cron" ]; then meroku --backup $SECRET; fi
|
23
|
+
- if [ $TRAVIS_EVENT_TYPE == "cron" ]; then meroku --despawn $SECRET; fi
|
24
|
+
- if [ $TRAVIS_EVENT_TYPE == "cron" ]; then meroku --spawn $SECRET; fi
|
data/README.md
CHANGED
@@ -63,6 +63,17 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
63
63
|
|
64
64
|
$ ./guard # keeps an eye on test fails and rubocop warnings
|
65
65
|
|
66
|
+
External / api dependencies
|
67
|
+
|
68
|
+
If you were to set up a meroku clone for your personal use, you would need
|
69
|
+
|
70
|
+
- A secret ( a 12 charactor hex string )
|
71
|
+
- An s3 bucket with the name $secret
|
72
|
+
- Your Ec2 default security group should allow all traffic
|
73
|
+
- An elastic ip allocation. Usually has a name like "eipalloc-..."
|
74
|
+
- A free certificate for your domain from letsencrypt
|
75
|
+
- You would also need a wildcard certificate so that consumer apps work without warnings in https:// mode
|
76
|
+
|
66
77
|
## Contributing
|
67
78
|
|
68
79
|
Bug reports and pull requests are welcome on GitHub at https://github.com/meroku/meroku.
|
@@ -10,8 +10,8 @@ server {
|
|
10
10
|
#ssl on;
|
11
11
|
# ssl on; tells NGINX to server ANY content through SSL.
|
12
12
|
|
13
|
-
ssl_certificate /home/ubuntu
|
14
|
-
ssl_certificate_key /home/ubuntu
|
13
|
+
ssl_certificate /home/ubuntu/letsencrypt_fullchain.pem;
|
14
|
+
ssl_certificate_key /home/ubuntu/letsencrypt_privkey.pem;
|
15
15
|
|
16
16
|
root /home/REPLACEMEUSERNAME/REPLACEMEAPPNAME/public;
|
17
17
|
|
data/lib/meroku.rb
CHANGED
data/lib/meroku/app.rb
CHANGED
@@ -44,7 +44,7 @@ module Meroku
|
|
44
44
|
appname = JSON.parse(result).dig('data', 'name')
|
45
45
|
remote_uri = "#{username}@www.meroku.com:#{appname}.git"
|
46
46
|
Kernel.system('git remote remove meroku 2>/dev/null')
|
47
|
-
Kernel.system("git remote add meroku #{remote_uri}")
|
47
|
+
puts Kernel.system("git remote add meroku #{remote_uri}")
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
data/lib/meroku/aws.rb
CHANGED
@@ -33,6 +33,11 @@ module Meroku
|
|
33
33
|
Meroku::Shared.ec2_client.associate_address(
|
34
34
|
allocation_id: allocation_id, instance_id: instance_id
|
35
35
|
)
|
36
|
+
# TODO: stub this in tests
|
37
|
+
print '*'
|
38
|
+
TCPSocket.new '34.239.241.218', 22
|
39
|
+
# Socket.tcp("www.meroku.com", 22, connect_timeout: 60) {}
|
40
|
+
puts '*'
|
36
41
|
end
|
37
42
|
|
38
43
|
# Private S3 Bucket
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Meroku
|
4
|
+
# Logic related to backup of production server
|
5
|
+
class Backup
|
6
|
+
include Meroku::Sshable
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@connection = Net::SSH.start('34.239.241.218', 'ubuntu', sshopts)
|
10
|
+
execute_script <<~HEREDOC
|
11
|
+
SECRET=#{Meroku::Shared.secrets.meroku_secret} ~/backend_api/script/backup_db
|
12
|
+
SECRET=#{Meroku::Shared.secrets.meroku_secret} ~/backend_api/script/backup_etc
|
13
|
+
SECRET=#{Meroku::Shared.secrets.meroku_secret} ~/backend_api/script/backup_nginxconfs
|
14
|
+
SECRET=#{Meroku::Shared.secrets.meroku_secret} ~/backend_api/script/backup_homedirs
|
15
|
+
HEREDOC
|
16
|
+
puts 'OK'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/meroku/cli.rb
CHANGED
@@ -49,8 +49,12 @@ module Meroku
|
|
49
49
|
Meroku::Shared.secrets.meroku_secret = @options[:meroku_secret] \
|
50
50
|
if @options[:meroku_secret]
|
51
51
|
|
52
|
-
|
52
|
+
if @options[:spawn]
|
53
|
+
Node.new
|
54
|
+
puts 'Node created'
|
55
|
+
end
|
53
56
|
Meroku::Aws.terminate_all(tag: 'node') if @options[:despawn]
|
57
|
+
Meroku::Backup.new if @options[:backup]
|
54
58
|
end
|
55
59
|
|
56
60
|
def act_on_user_options
|
data/lib/meroku/node.rb
CHANGED
@@ -5,51 +5,28 @@ module Meroku
|
|
5
5
|
class Node
|
6
6
|
include Meroku::Shared
|
7
7
|
include Meroku::Aws
|
8
|
-
|
8
|
+
include Meroku::Sshable
|
9
|
+
attr_reader :instance_id
|
9
10
|
|
10
11
|
def initialize
|
11
12
|
make_instance && associate_address
|
12
|
-
start_ssh && configure_keys
|
13
|
-
install_packages
|
13
|
+
start_ssh && user_creations && configure_keys
|
14
|
+
install_packages && homedir_creations
|
14
15
|
database_inits && git_clone
|
15
|
-
nginx_configs
|
16
|
-
|
16
|
+
nginx_configs
|
17
|
+
start_rails
|
18
|
+
close_ssh
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
script.each_line do |line|
|
21
|
-
puts line
|
22
|
-
execute(line)
|
23
|
-
end
|
24
|
-
end
|
21
|
+
private
|
25
22
|
|
26
23
|
def start_ssh
|
27
24
|
@connection = Net::SSH.start(ip_address, 'ubuntu', sshopts)
|
28
25
|
end
|
29
26
|
|
30
|
-
def close_ssh
|
31
|
-
@connection.close
|
32
|
-
end
|
33
|
-
|
34
|
-
def execute(command)
|
35
|
-
@connection.exec(command) { |_ch, _stream, data| puts data }
|
36
|
-
@connection.loop
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def sshopts
|
42
|
-
{
|
43
|
-
verify_host_key: false,
|
44
|
-
key_data: Meroku::Shared.secrets.private_key
|
45
|
-
}
|
46
|
-
end
|
47
|
-
|
48
27
|
def configure_keys
|
28
|
+
configure_host_keys
|
49
29
|
execute_script <<~HEREDOC
|
50
|
-
sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key #{bucket}ssh_host_ecdsa_key
|
51
|
-
sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key.pub #{bucket}ssh_host_ecdsa_key.pub
|
52
|
-
sudo service ssh restart
|
53
30
|
curl -s -o /home/ubuntu/letsencrypt_fullchain.pem #{bucket}letsencrypt_fullchain.pem
|
54
31
|
curl -s -o /home/ubuntu/letsencrypt_privkey.pem #{bucket}letsencrypt_privkey.pem
|
55
32
|
curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
@@ -57,6 +34,12 @@ module Meroku
|
|
57
34
|
HEREDOC
|
58
35
|
end
|
59
36
|
|
37
|
+
def configure_host_keys
|
38
|
+
execute_script <<~HEREDOC
|
39
|
+
sudo sh -c 'curl -s #{bucket}ssh_host_.tar | tar xvf - -C /etc/ssh/'
|
40
|
+
HEREDOC
|
41
|
+
end
|
42
|
+
|
60
43
|
def install_packages
|
61
44
|
ubuntu_site = 'http://archive.ubuntu.com/ubuntu/'
|
62
45
|
postgres_site = 'http://apt.postgresql.org/pub/repos/apt/'
|
@@ -68,7 +51,22 @@ module Meroku
|
|
68
51
|
echo "deb #{postgres_site} trusty-pgdg main" | sudo tee -a /etc/apt/sources.list
|
69
52
|
DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq
|
70
53
|
DEBIAN_FRONTEND=noninteractive sudo apt-get upgrade -yqq --force-yes 2>/dev/null >/dev/null
|
71
|
-
DEBIAN_PRIORITY=critical DEBIAN_FRONTEND=noninteractive sudo apt-get install -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" autoconf bind9-host bison build-essential coreutils curl daemontools dnsutils ed git imagemagick iputils-tracepath language-pack-en libbz2-dev libcurl4-openssl-dev libev-dev libevent-dev libglib2.0-dev libjpeg-dev libmagickwand-dev libmysqlclient-dev libncurses5-dev librdkafka-dev libreadline6-dev libssl-dev libuv-dev libxml2-dev libxslt-dev netcat-openbsd openjdk-7-jdk openjdk-7-jre-headless openssh-client openssh-server python python-dev socat stunnel syslinux tar telnet zip zlib1g-dev ruby2.4 ruby2.4-dev nginx libsqlite3-dev nodejs libpq-dev postgresql-9.6 2>/dev/null >/dev/null
|
54
|
+
DEBIAN_PRIORITY=critical DEBIAN_FRONTEND=noninteractive sudo apt-get install -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" autoconf bind9-host bison build-essential coreutils curl daemontools dnsutils ed git imagemagick iputils-tracepath language-pack-en libbz2-dev libcurl4-openssl-dev libev-dev libevent-dev libglib2.0-dev libjpeg-dev libmagickwand-dev libmysqlclient-dev libncurses5-dev librdkafka-dev libreadline6-dev libssl-dev libuv-dev libxml2-dev libxslt-dev netcat-openbsd openjdk-7-jdk openjdk-7-jre-headless openssh-client openssh-server python python-dev socat stunnel syslinux tar telnet zip zlib1g-dev ruby2.4 ruby2.4-dev nginx libsqlite3-dev nodejs libpq-dev postgresql-9.6 awscli 2>/dev/null >/dev/null
|
55
|
+
HEREDOC
|
56
|
+
end
|
57
|
+
|
58
|
+
def homedir_creations
|
59
|
+
execute_script <<~HEREDOC
|
60
|
+
curl -s -o /tmp/latest #{bucket}homedir_backups/latest
|
61
|
+
tar -tvf /tmp/latest | tail
|
62
|
+
sudo tar -xvf /tmp/latest -C /home/
|
63
|
+
sudo rm -f /tmp/latest
|
64
|
+
HEREDOC
|
65
|
+
end
|
66
|
+
|
67
|
+
def user_creations
|
68
|
+
execute_script <<~HEREDOC
|
69
|
+
sudo sh -c 'curl -s #{bucket}etc_backups/latest | tar xvf - -C /'
|
72
70
|
HEREDOC
|
73
71
|
end
|
74
72
|
|
@@ -76,7 +74,10 @@ module Meroku
|
|
76
74
|
execute_script <<~HEREDOC
|
77
75
|
sudo -u postgres createuser -e meroku
|
78
76
|
sudo -u postgres createdb meroku
|
79
|
-
sudo -u postgres psql -c "ALTER ROLE meroku WITH PASSWORD '#{Meroku::Shared.secrets.meroku_secret}';"
|
77
|
+
#sudo -u postgres psql -c "ALTER ROLE meroku WITH PASSWORD '#{Meroku::Shared.secrets.meroku_secret}';"
|
78
|
+
curl -s -o /tmp/latest #{bucket}db_backups/latest
|
79
|
+
sudo -u postgres psql -f /tmp/latest
|
80
|
+
sudo rm -f /tmp/latest
|
80
81
|
sudo perl -pi -e "s#local.*all.*all.*peer#local all all md5#" /etc/postgresql/9.6/main/pg_hba.conf
|
81
82
|
sudo service postgresql restart
|
82
83
|
HEREDOC
|
@@ -93,21 +94,31 @@ module Meroku
|
|
93
94
|
execute_script <<~HEREDOC
|
94
95
|
sudo rm -f /etc/nginx/sites-enabled/* /etc/nginx/sites-available/*
|
95
96
|
# Place vhost config for backend_api
|
96
|
-
sudo cp ~/backend_api/config/etc_nginx_sites-enabled_default /etc/nginx/
|
97
|
+
sudo cp ~/backend_api/config/etc_nginx_sites-enabled_default /etc/nginx/conf.d/backend_api.conf
|
98
|
+
|
97
99
|
# Place vhost config template for end-user apps
|
98
100
|
sudo mkdir /world_readable && sudo chmod 777 /world_readable
|
99
101
|
sudo cp /home/ubuntu/meroku/data/etc_nginx_sites-enabled_template /world_readable
|
100
102
|
sudo chmod a+r /world_readable/etc_nginx_sites-enabled_template
|
103
|
+
|
104
|
+
# consumer apps nginx config folder
|
105
|
+
sudo mkdir /owner_writable/
|
106
|
+
sudo chmod 777 /owner_writable/
|
107
|
+
sudo sh -c 'echo "include /owner_writable/*.conf;" > /etc/nginx/conf.d/include_owner_writable.conf'
|
108
|
+
sudo curl -s -o /tmp/latest #{bucket}nginxconfs_backups/latest
|
109
|
+
sudo tar -xvz -f /tmp/latest -C /owner_writable/
|
110
|
+
sudo chmod a+w /owner_writable/* # TODO fix this
|
111
|
+
sudo rm -f /tmp/latest
|
101
112
|
HEREDOC
|
102
113
|
end
|
103
114
|
|
104
115
|
def start_rails
|
105
116
|
execute_script <<~HEREDOC
|
106
|
-
cd ~/backend_api; sudo gem install bundler; bundle;
|
107
|
-
cd ~/backend_api; SECRET=#{Meroku::Shared.secrets.meroku_secret} RAILS_ENV=production bundle exec rake db:migrate
|
117
|
+
cd ~/backend_api; sudo gem install bundler; NOKOGIRI_USE_SYSTEM_LIBRARIES=true bundle;
|
118
|
+
cd ~/backend_api; SECRET=#{Meroku::Shared.secrets.meroku_secret} RAILS_ENV=production bundle exec rake db:migrate
|
108
119
|
cd ~/backend_api; SECRET=#{Meroku::Shared.secrets.meroku_secret} SECRET_KEY_BASE=#{Meroku::Shared.secrets.meroku_secret} RAILS_ENV=production bundle exec unicorn -D -l unix:///home/ubuntu/backend_api/tmp/backend_api.sock -c config/unicorn.rb
|
109
|
-
sudo /usr/sbin/nginx -s reload
|
110
120
|
HEREDOC
|
121
|
+
execute_script 'sudo /home/ubuntu/backend_api/script/start_user_apps'
|
111
122
|
end
|
112
123
|
end
|
113
124
|
end
|
data/lib/meroku/options.rb
CHANGED
@@ -22,6 +22,7 @@ module Meroku
|
|
22
22
|
add_key_options(opts)
|
23
23
|
add_app_options(opts)
|
24
24
|
opts.separator ''
|
25
|
+
add_maintainer_spawn_options(opts)
|
25
26
|
add_maintainer_options(opts)
|
26
27
|
end
|
27
28
|
end
|
@@ -76,7 +77,7 @@ module Meroku
|
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
|
-
def
|
80
|
+
def add_maintainer_spawn_options(opts)
|
80
81
|
option(opts, '--spawn MEROKU_SECRET') do |meroku_secret|
|
81
82
|
@options[:spawn] = true
|
82
83
|
@options[:meroku_secret] = meroku_secret
|
@@ -87,6 +88,13 @@ module Meroku
|
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
91
|
+
def add_maintainer_options(opts)
|
92
|
+
option(opts, '--backup MEROKU_SECRET') do |meroku_secret|
|
93
|
+
@options[:backup] = true
|
94
|
+
@options[:meroku_secret] = meroku_secret
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
90
98
|
# Sets a value in the @options hash, based on the given long option and its
|
91
99
|
# value, in addition to calling the block if a block is given.
|
92
100
|
def option(opts, *args)
|
@@ -112,7 +120,8 @@ module Meroku
|
|
112
120
|
version: 'Display version.',
|
113
121
|
spawn: 'Spawn infrastructure',
|
114
122
|
keys: 'List already uploaded keys',
|
115
|
-
create: 'Create an app'
|
123
|
+
create: 'Create an app',
|
124
|
+
backup: 'Take a backup, before despawing'
|
116
125
|
}.freeze
|
117
126
|
end
|
118
127
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Meroku
|
4
|
+
# Mix in to objects that can be sshed in to
|
5
|
+
module Sshable
|
6
|
+
attr_reader :connection
|
7
|
+
|
8
|
+
def execute(command)
|
9
|
+
@connection.exec(command) { |_ch, _stream, data| puts data }
|
10
|
+
@connection.loop
|
11
|
+
end
|
12
|
+
|
13
|
+
def sshopts
|
14
|
+
{ verify_host_key: false, key_data: Meroku::Shared.secrets.private_key, \
|
15
|
+
timeout: 60 }
|
16
|
+
end
|
17
|
+
|
18
|
+
def close_ssh
|
19
|
+
@connection.close
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute_script(script)
|
23
|
+
script.each_line do |line|
|
24
|
+
puts line
|
25
|
+
execute(line)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/meroku/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meroku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Meroku System
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -180,6 +180,7 @@ files:
|
|
180
180
|
- lib/meroku.rb
|
181
181
|
- lib/meroku/app.rb
|
182
182
|
- lib/meroku/aws.rb
|
183
|
+
- lib/meroku/backup.rb
|
183
184
|
- lib/meroku/cli.rb
|
184
185
|
- lib/meroku/error.rb
|
185
186
|
- lib/meroku/key.rb
|
@@ -188,6 +189,7 @@ files:
|
|
188
189
|
- lib/meroku/response_handler.rb
|
189
190
|
- lib/meroku/secrets.rb
|
190
191
|
- lib/meroku/shared.rb
|
192
|
+
- lib/meroku/sshable.rb
|
191
193
|
- lib/meroku/user.rb
|
192
194
|
- lib/meroku/version.rb
|
193
195
|
- meroku.gemspec
|