heroku2dokku 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: