heroku2dokku 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b39bbe9644bd8d3c30f29f3d432de12615de749
4
+ data.tar.gz: d8ecdebee3d76e9cfc6419dce2a6b387bb158bf8
5
+ SHA512:
6
+ metadata.gz: d48f70db6629419ac4e0721c308cad2acffabdcbcc4c491482e1d0dac1d766d89d4a53e7984b917a8852ab875ac1b545b07c454db4e0ee47aaadd32d4d079905
7
+ data.tar.gz: 8e0afebeb9280de4fcdc250d764376f658490e2495391cd2583eeee8bdf9ee39482dd3b30a905da9b01fd40d107c59e0478f55c28f94cffb86c72d10b5428ffb
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in heroku2dokku.gemspec
4
+ gemspec
@@ -0,0 +1,69 @@
1
+ # heroku2dokku
2
+
3
+ Heroku -> Dokku in minutes
4
+
5
+ ## Installation
6
+
7
+ *You should already have Dokku set up on a server*
8
+
9
+ Install the official Dokku client
10
+
11
+ ```sh
12
+ git clone git@github.com:progrium/dokku.git ~/.dokku
13
+
14
+ # add the following to either your
15
+ # .bashrc, .bash_profile, or .profile file
16
+ alias dokku='$HOME/.dokku/contrib/dokku_client.sh'
17
+ ```
18
+
19
+ And run:
20
+
21
+ ```sh
22
+ gem install heroku2dokku
23
+ ```
24
+
25
+ ## How to Use
26
+
27
+ In your app directory, run:
28
+
29
+ ```sh
30
+ git remote add dokku dokku@dokkuhost:myapp
31
+ heroku2dokku all
32
+ ```
33
+
34
+ This:
35
+
36
+ 1. creates app
37
+ 2. copies config
38
+ 3. copies custom domains
39
+ 3. adds a [CHECKS file](http://progrium.viewdocs.io/dokku/checks-examples.md) for zero-downtime deploys
40
+
41
+ Commit the `CHECKS` file and deploy away!
42
+
43
+ ```sh
44
+ git add CHECKS
45
+ git commit -m "Added checks"
46
+ git push dokku master
47
+ ```
48
+
49
+ ## Database
50
+
51
+ To transfer your database, export your data
52
+
53
+ ```sh
54
+ heroku maintenance:on
55
+ heroku pg:backups capture
56
+ curl -o latest.dump `heroku pg:backups public-url`
57
+ ```
58
+
59
+ Import to a new database
60
+
61
+ ```sh
62
+ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
63
+ ```
64
+
65
+ And update your config
66
+
67
+ ```
68
+ dokku config:set DATABASE_URL=postgres://...
69
+ ```
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task default: :test
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "heroku2dokku"
4
+ Heroku2Dokku::Client.new.run(ARGV)
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "heroku2dokku/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "heroku2dokku"
8
+ spec.version = Heroku2Dokku::VERSION
9
+ spec.authors = ["Andrew Kane"]
10
+ spec.email = ["andrew@chartkick.com"]
11
+
12
+ spec.summary = "Heroku -> Dokku in minutes"
13
+ spec.homepage = "https://github.com/ankane/heroku2dokku"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "git"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.10"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "minitest"
25
+ end
@@ -0,0 +1,135 @@
1
+ require "heroku2dokku/version"
2
+ require "shellwords"
3
+ require "set"
4
+ require "git"
5
+
6
+ module Heroku2Dokku
7
+ class Client
8
+ def run(args)
9
+ case args[0]
10
+ when "all"
11
+ app
12
+ config
13
+ domains
14
+ checks
15
+ when "app"
16
+ app
17
+ when "checks"
18
+ checks
19
+ when "config"
20
+ config
21
+ when "domains"
22
+ domains
23
+ else
24
+ puts %(Usage: heroku2dokku COMMAND
25
+
26
+ Options:
27
+ all
28
+ app
29
+ checks
30
+ config
31
+ domains
32
+
33
+ )
34
+ exit 2
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def dokku_run(command, log = false)
41
+ log_info "dokku #{command}" if log
42
+ ret = `~/.dokku/contrib/dokku_client.sh #{command} 2> /dev/null`
43
+ # puts ret
44
+ ret
45
+ end
46
+
47
+ def heroku_run(command)
48
+ `heroku #{command}`
49
+ end
50
+
51
+ def log(message)
52
+ puts "-----> #{message}..."
53
+ end
54
+
55
+ def log_info(message)
56
+ puts " #{message}"
57
+ end
58
+
59
+ def checks
60
+ log "Creating checks"
61
+
62
+ if File.exist?("CHECKS")
63
+ log_info "CHECKS exists"
64
+ else
65
+ doc = "WAIT=5\nATTEMPTS=6\n/\n"
66
+ File.open("CHECKS", "w") { |f| f.write(doc) }
67
+ end
68
+ end
69
+
70
+ def config
71
+ log "Adding config"
72
+
73
+ lines = heroku_run("config").lines.map(&:chomp)[1..-1]
74
+ dokku_lines = dokku_run("config").lines.map(&:chomp)[1..-1]
75
+ existing_keys = Set.new
76
+ dokku_lines.each do |line|
77
+ key, value = line.split(/:\s+/, 2)
78
+ existing_keys << key
79
+ end
80
+ command = "config:set"
81
+ env = {}
82
+ lines.each do |line|
83
+ key, value = line.split(/:\s+/, 2)
84
+
85
+ unless existing_keys.include?(key) || key == "PGBACKUPS_URL" || key =~ /\AHEROKU_POSTGRESQL_.+_URL\z/
86
+ env[key] = value
87
+ end
88
+ end
89
+
90
+ env.each do |key, value|
91
+ command << " \\\n #{Shellwords.escape(key)}=#{Shellwords.escape(value)}"
92
+ end
93
+
94
+ if env.any?
95
+ dokku_run command, true
96
+ else
97
+ log_info "No config to sync"
98
+ end
99
+ end
100
+
101
+ def domains
102
+ log "Adding domains"
103
+ heroku_domains = heroku_run("domains").lines.map(&:chomp)[1..-1].reject { |s| s.empty? || s =~ /\.herokuapp\.com\z/ }
104
+ dokku_domains = dokku_run("domains").lines.map(&:chomp)[1..-1].reject(&:empty?)
105
+ sync_domains = heroku_domains - dokku_domains
106
+ if sync_domains.empty?
107
+ log_info "No domains to sync"
108
+ end
109
+ sync_domains.each do |domain|
110
+ dokku_run "domains:add #{domain}", true
111
+ end
112
+ end
113
+
114
+ def app
115
+ log "Creating app"
116
+ dokku_apps = dokku_run("apps").lines.map(&:chomp)[1..-1]
117
+ g = Git.open(".")
118
+ app = g.remotes.find { |r| r.name == "dokku" }
119
+ if app
120
+ app = app.url.split(":").last
121
+ end
122
+
123
+ unless app
124
+ log_info "First run: git remote add dokku dokku@dokkuhost:app"
125
+ abort
126
+ end
127
+
128
+ if dokku_apps.include?(app)
129
+ log_info "App exists: #{app}"
130
+ else
131
+ dokku_run "apps:create #{app}", true
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,3 @@
1
+ module Heroku2Dokku
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: heroku2dokku
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Kane
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: git
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - andrew@chartkick.com
72
+ executables:
73
+ - heroku2dokku
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - Gemfile
79
+ - README.md
80
+ - Rakefile
81
+ - bin/heroku2dokku
82
+ - heroku2dokku.gemspec
83
+ - lib/heroku2dokku.rb
84
+ - lib/heroku2dokku/version.rb
85
+ homepage: https://github.com/ankane/heroku2dokku
86
+ licenses: []
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.4.5
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Heroku -> Dokku in minutes
108
+ test_files: []
109
+ has_rdoc: