Browse Source

heroku setup script

Andrew Cantino 10 năm trước cách đây
mục cha
commit
f0697b6db2
2 tập tin đã thay đổi với 130 bổ sung2 xóa
  1. 127 0
      bin/setup_heroku
  2. 3 2
      deployment/heroku/unicorn.rb

+ 127 - 0
bin/setup_heroku

@@ -0,0 +1,127 @@
+#!/usr/bin/env ruby
+require 'open3'
+
+unless `which heroku` =~ /heroku/
+  puts "It looks like the heroku command line tool hasn't been installed yet.  Please install"
+  puts "the Heroku Toolback from https://toolbelt.heroku.com, run 'heroku auth:login', and then"
+  puts "run this script again."
+  exit 1
+end
+
+def capture(cmd, opts = {})
+  o, s = Open3.capture2e(cmd, opts)
+  o
+end
+
+def ask(question)
+  print question + " "
+  STDOUT.flush
+  gets.strip
+end
+
+def nag(question)
+  answer = ''
+  while answer.length == 0
+    answer = ask(question)
+  end
+  answer
+end
+
+def yes?(question)
+  ask(question) =~ /^y/i
+end
+
+def grab_heroku_config
+  config_data = capture("heroku config -s")
+  config = {}
+  if config_data !~ /has no config vars/
+    config_data.split("\n").map do |line|
+      next if line =~ /^\s*(#|$)/ # skip comments and empty lines
+      first_equal_sign = line.index('=')
+      config[line.slice(0, first_equal_sign)] = line.slice(first_equal_sign + 1, line.length)
+    end
+  end
+  config
+end
+
+puts "Welcome #{`heroku auth:whoami`.strip}!  It looks like you're logged into Heroku."
+puts
+
+info = capture("heroku info")
+if info =~ /No app specified/i
+  puts "It looks like you don't have a Heroku app set up yet for this repo."
+  puts "You can either exit now and run 'heroku create', or I can do it for you."
+  if yes?("Would you like me to create a heroku app for you now in this repo? (y/n)")
+    puts `heroku create`
+    info = capture("heroku info")
+  else
+    puts "Okay, exiting so you can do it."
+    exit 0
+  end
+end
+
+app_name = info.scan(/http:\/\/([\w\d-]+)\.herokuapp\.com/).flatten.first
+
+unless yes?("Your Heroku app name is #{app_name}.  Is this correct?")
+  puts "Well, then I'm not sure what to do here, sorry."
+end
+
+config = grab_heroku_config
+
+if config.length > 0
+  puts
+  puts "Your current Heroku config:"
+  config.each do |key, value|
+    puts '  ' + key + ' ' * (20 - key.length) + '= ' + value
+  end
+end
+
+unless config['APP_SECRET_TOKEN']
+  puts "Setting up APP_SECRET_TOKEN..."
+  puts capture("heroku config:set APP_SECRET_TOKEN=`rake secret`")
+end
+
+unless config['FORCE_SSL']
+  puts "Setting FORCE_SSL to true..."
+  puts capture("heroku config:set FORCE_SSL=true")
+end
+
+unless config['DOMAIN']
+  puts "Setting DOMAIN to #{app_name}.herokuapp.com..."
+  puts capture("heroku config:set DOMAIN=#{app_name}.herokuapp.com")
+end
+
+unless config['INVITATION_CODE']
+  puts "You need to set an invitation code for your Huginn instance.  If you plan to share this instance, you will"
+  puts "tell this code to anyone who you'd like to invite.  If you won't share it, then just set this to something"
+  puts "that people will not guess."
+
+  invitation_code = nag("What code would you like to use?")
+  puts "Setting INVITATION_CODE to #{invitation_code}..."
+  puts capture("heroku config:set INVITATION_CODE=#{invitation_code}")
+end
+
+unless config['SMTP_DOMAIN'] && config['SMTP_USER_NAME'] && config['SMTP_PASSWORD'] && config['SMTP_SERVER'] && config['EMAIL_FROM_ADDRESS']
+  puts "Okay, let's setup outgoing email settings.  The simplest solution is to use the free sendgrid Heroku addon."
+  puts "If you'd like to use your own server, or your Gmail account, please see .env.example and set"
+  puts "SMTP_DOMAIN, SMTP_USER_NAME, SMTP_PASSWORD, and SMTP_SERVER with 'heroku config:set'."
+  if yes?("Should I enable the free sendgrid addon? (y/n)")
+    puts capture("heroku addons:add sendgrid")
+    puts capture("heroku config:set SMTP_SERVER=smtp.sendgrid.net")
+    puts capture("heroku config:set SMTP_DOMAIN=heroku.com")
+
+    config = grab_heroku_config
+    puts capture("heroku config:set SMTP_USER_NAME=#{config['SENDGRID_USERNAME']}")
+    puts capture("heroku config:set SMTP_PASSWORD=#{config['SENDGRID_PASSWORD']}")
+  else
+    puts "Okay, you'll need to set SMTP_DOMAIN, SMTP_USER_NAME, SMTP_PASSWORD, and SMTP_SERVER with 'heroku config:set' manually."
+  end
+
+  unless config['EMAIL_FROM_ADDRESS']
+    email = nag("What email address would you like email to appear to be sent from?")
+    puts "Setting EMAIL_FROM_ADDRESS to #{email}..."
+    puts capture("heroku config:set EMAIL_FROM_ADDRESS=#{email}")
+  end
+end
+
+puts "Done!"

+ 3 - 2
deployment/heroku/unicorn.rb

@@ -16,8 +16,9 @@ Thread.new do
 
     sleep 30
 
-    if ENV['PING_URL']
-      Net::HTTP.get_response(URI(ENV['PING_URL']))
+    if ENV['DOMAIN']
+      force_ssl = ENV['FORCE_SSL'].present? && ENV['FORCE_SSL'] == 'true'
+      Net::HTTP.get_response(URI((force_ssl ? "https://" : "http://") + ENV['DOMAIN']))
     end
 
     begin