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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/README.md +69 -0
- data/Rakefile +10 -0
- data/bin/heroku2dokku +4 -0
- data/heroku2dokku.gemspec +25 -0
- data/lib/heroku2dokku.rb +135 -0
- data/lib/heroku2dokku/version.rb +3 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -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
|
+
```
|
data/Rakefile
ADDED
data/bin/heroku2dokku
ADDED
@@ -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
|
data/lib/heroku2dokku.rb
ADDED
@@ -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
|
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:
|