lib/meroku/node.rb in meroku-2.0.22 vs lib/meroku/node.rb in meroku-2.0.23
- old
+ new
@@ -1,113 +1,113 @@
+# frozen_string_literal: true
+
module Meroku
- # At the moment we run on one ec2 node
- # This class represents that node
+ # A node is an ec2 node, that powers meroku
class Node
- include Meroku::Aws::Ec2
- include Meroku::Tunnelable
+ include Meroku::Shared
+ include Meroku::Aws
+ attr_reader :instance_id, :connection
def initialize
- puts "run_instances()"
- @instance = make_instance
- @tunnel_ip = Meroku::Aws::IP
- @tunnel_username = "ubuntu"
- @tunnel_password = "password"
- @tunnel_key_name = Meroku::Aws::KEY_NAME
- print "sleep "
- 30.times { print sleep(1) }
- print "\n"
+ make_instance && associate_address
+ start_ssh && configure_keys
+ install_packages
+ database_inits && git_clone
+ nginx_configs && start_rails && close_ssh
+ puts 'Node created'
end
- def associate_address
- ip = "eipalloc-139f7823"
- Meroku::Aws::Ec2.associate_address(ip, @instance.instance_id)
- self
+ def execute_script(script)
+ script.each_line do |line|
+ puts line
+ execute(line)
+ end
end
- def configure_keys
- str = <<~HEREDOC
- mkdir /home/ubuntu/.meroku
- sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key #{Meroku::Aws.bucket_url}/ssh_host_ecdsa_key
- sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key.pub #{Meroku::Aws.bucket_url}/ssh_host_ecdsa_key.pub
- curl -s -o /home/ubuntu/.meroku/letsencrypt_fullchain.pem #{Meroku::Aws.bucket_url}/letsencrypt_fullchain.pem
- curl -s -o /home/ubuntu/.meroku/letsencrypt_privkey.pem #{Meroku::Aws.bucket_url}/letsencrypt_privkey.pem
- curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
+ def start_ssh
+ @connection = Net::SSH.start(ip_address, 'ubuntu', sshopts)
end
- def add_sources
- str = <<~HEREDOC
- echo "Dpkg::Use-Pty "0";" | sudo tee /etc/apt/apt.conf.d/00usepty
- sudo apt-add-repository ppa:brightbox/ruby-ng --yes 2>/dev/null >/dev/null
- echo "deb http://archive.ubuntu.com/ubuntu/ trusty main universe" | sudo tee -a /etc/apt/sources.list
- echo "deb http://archive.ubuntu.com/ubuntu/ trusty-security main universe" | sudo tee -a /etc/apt/sources.list
- echo "deb http://archive.ubuntu.com/ubuntu/ trusty-updates main universe" | sudo tee -a /etc/apt/sources.list
- echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" | sudo tee -a /etc/apt/sources.list
- HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
+ def close_ssh
+ @connection.close
end
- def ubuntu_updates
- str = <<~HEREDOC
- DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq
- DEBIAN_FRONTEND=noninteractive sudo apt-get upgrade -yqq --force-yes 2>/dev/null >/dev/null
+ def execute(command)
+ @connection.exec(command) { |_ch, _stream, data| puts data }
+ @connection.loop
+ end
+
+ private
+
+ def sshopts
+ {
+ verify_host_key: false,
+ key_data: Meroku::Shared.secrets.private_key
+ }
+ end
+
+ def configure_keys
+ execute_script <<~HEREDOC
+ sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key #{bucket}ssh_host_ecdsa_key
+ sudo curl -s -o /etc/ssh/ssh_host_ecdsa_key.pub #{bucket}ssh_host_ecdsa_key.pub
+ sudo service ssh restart
+ curl -s -o /home/ubuntu/letsencrypt_fullchain.pem #{bucket}letsencrypt_fullchain.pem
+ curl -s -o /home/ubuntu/letsencrypt_privkey.pem #{bucket}letsencrypt_privkey.pem
+ curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
+ echo "Dpkg::Use-Pty "0";" | sudo tee /etc/apt/apt.conf.d/00usepty
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
def install_packages
- str = <<~HEREDOC
+ ubuntu_site = 'http://archive.ubuntu.com/ubuntu/'
+ postgres_site = 'http://apt.postgresql.org/pub/repos/apt/'
+ execute_script <<~HEREDOC
+ sudo apt-add-repository ppa:brightbox/ruby-ng --yes 2>/dev/null >/dev/null
+ echo "deb #{ubuntu_site} trusty main universe" | sudo tee -a /etc/apt/sources.list
+ echo "deb #{ubuntu_site} trusty-security main universe" | sudo tee -a /etc/apt/sources.list
+ echo "deb #{ubuntu_site} trusty-updates main universe" | sudo tee -a /etc/apt/sources.list
+ echo "deb #{postgres_site} trusty-pgdg main" | sudo tee -a /etc/apt/sources.list
+ DEBIAN_FRONTEND=noninteractive sudo apt-get update -qq
+ DEBIAN_FRONTEND=noninteractive sudo apt-get upgrade -yqq --force-yes 2>/dev/null >/dev/null
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
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
def database_inits
- str = <<~HEREDOC
+ execute_script <<~HEREDOC
sudo -u postgres createuser -e meroku
sudo -u postgres createdb meroku
- sudo -u postgres psql -c "ALTER ROLE meroku WITH PASSWORD '#{ENV['SECRET']}';"
+ sudo -u postgres psql -c "ALTER ROLE meroku WITH PASSWORD '#{Meroku::Shared.secrets.meroku_secret}';"
sudo perl -pi -e "s#local.*all.*all.*peer#local all all md5#" /etc/postgresql/9.6/main/pg_hba.conf
sudo service postgresql restart
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
def git_clone
- str = <<~HEREDOC
- cd ~; git clone https://github.com/meroku/meroku;
+ execute_script <<~HEREDOC
+ cd ~ && git clone https://github.com/meroku/meroku
+ cd ~ && git clone https://github.com/meroku/backend_api
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
def nginx_configs
- str = <<~HEREDOC
+ execute_script <<~HEREDOC
sudo rm -f /etc/nginx/sites-enabled/* /etc/nginx/sites-available/*
- sudo cp ~/meroku/frontend/etc_nginx_sites-enabled_default /etc/nginx/sites-enabled/default
- sudo mkdir /sharedro && sudo chmod 777 /sharedro
- sudo cp /home/ubuntu/meroku/frontend/etc_nginx_sites-enabled_template /sharedro
- sudo chmod a+r /sharedro/etc_nginx_sites-enabled_template
+ # Place vhost config for backend_api
+ sudo cp ~/backend_api/config/etc_nginx_sites-enabled_default /etc/nginx/sites-enabled/default
+ # Place vhost config template for end-user apps
+ sudo mkdir /world_readable && sudo chmod 777 /world_readable
+ sudo cp /home/ubuntu/meroku/data/etc_nginx_sites-enabled_template /world_readable
+ sudo chmod a+r /world_readable/etc_nginx_sites-enabled_template
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
def start_rails
- str = <<~HEREDOC
- cd ~/meroku/frontend; sudo gem install bundler; bundle;
- cd ~/meroku/frontend; SECRET=#{ENV['SECRET']} RAILS_ENV=production bundle exec rails assets:precompile
- cd ~/meroku/frontend; SECRET=#{ENV['SECRET']} RAILS_ENV=production bundle exec rake db:migrate
- cd ~/meroku/frontend; SECRET=#{ENV['SECRET']} bundle exec puma -d -b unix:///home/ubuntu/meroku.sock
+ execute_script <<~HEREDOC
+ cd ~/backend_api; sudo gem install bundler; bundle;
+ cd ~/backend_api; SECRET=#{Meroku::Shared.secrets.meroku_secret} RAILS_ENV=production bundle exec rake db:migrate db:seed
+ cd ~/backend_api; SECRET=#{Meroku::Shared.secrets.meroku_secret} SECRET_KEY_BASE=#{Meroku::Shared.secrets.meroku_secret} RAILS_ENV=production bundle exec puma -d -b unix:///home/ubuntu/backend_api/tmp/backend_api.sock
sudo /usr/sbin/nginx -s reload
HEREDOC
- str.split("\n").each { |cmd| tunnel_run(cmd) }
- self
end
end
end