Compare commits
1496 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a5504574d | ||
|
|
8ac35766f3 | ||
|
|
5fd5e235d8 | ||
|
|
8d526b964b | ||
|
|
084906d684 | ||
|
|
79d4f4578d | ||
|
|
785d9b4937 | ||
|
|
0e03c82139 | ||
|
|
84e33f2c57 | ||
|
|
a6408c0c56 | ||
|
|
915ef6a8d5 | ||
|
|
684f9fd175 | ||
|
|
e276ebbc27 | ||
|
|
0988e62418 | ||
|
|
bbc8c8a533 | ||
|
|
082e9458e5 | ||
|
|
0a17358352 | ||
|
|
3a2bdd83f8 | ||
|
|
625424de68 | ||
|
|
0d71293fca | ||
|
|
b6128dc54e | ||
|
|
919ba7ed93 | ||
|
|
f80788147c | ||
|
|
eb7deedd65 | ||
|
|
eb8347bcc1 | ||
|
|
48752a762c | ||
|
|
42a405355f | ||
|
|
b921aed073 | ||
|
|
73b8c3df55 | ||
|
|
1b92f4a97e | ||
|
|
c8a491ed7f | ||
|
|
da4361583b | ||
|
|
0087296bd3 | ||
|
|
6221b7bf4a | ||
|
|
f977edabb2 | ||
|
|
980ffab600 | ||
|
|
a34d36c5d2 | ||
|
|
b2a0b69ed5 | ||
|
|
2315a127ea | ||
|
|
1c1ff64c67 | ||
|
|
9e2a129854 | ||
|
|
a475af1974 | ||
|
|
4264380e15 | ||
|
|
676aa1a05b | ||
|
|
94c06bbdd2 | ||
|
|
1c600b8846 | ||
|
|
7dd9007607 | ||
|
|
e71ad53b0e | ||
|
|
a92687d3e8 | ||
|
|
2aac9c71fc | ||
|
|
ceac86b58f | ||
|
|
3fb8a576a0 | ||
|
|
c786b9e45e | ||
|
|
68fcd67327 | ||
|
|
a54fa57136 | ||
|
|
343a6a159f | ||
|
|
dc2a680a29 | ||
|
|
72fce08e87 | ||
|
|
b60934629e | ||
|
|
e59f115311 | ||
|
|
19dd92e6c7 | ||
|
|
aab390edb6 | ||
|
|
0c11068129 | ||
|
|
ad804f6d3f | ||
|
|
de43eb1e3d | ||
|
|
5d9daa9367 | ||
|
|
0d9e424ede | ||
|
|
603dc0fad6 | ||
|
|
0cf03baa78 | ||
|
|
ba3af25423 | ||
|
|
a084c62e3f | ||
|
|
b429af8ff2 | ||
|
|
287f383f6c | ||
|
|
aefb24082d | ||
|
|
dee0144c7c | ||
|
|
6ca4813247 | ||
|
|
a717cb99a3 | ||
|
|
8551dfb297 | ||
|
|
6a5bbd63a3 | ||
|
|
ca0b2937b9 | ||
|
|
948d507909 | ||
|
|
037324d850 | ||
|
|
6006303409 | ||
|
|
d1b1841034 | ||
|
|
bc70a24e1d | ||
|
|
acc2e84eda | ||
|
|
4f23dd2dd6 | ||
|
|
3a5f68e4d1 | ||
|
|
d30a948be0 | ||
|
|
c44db3f2cf | ||
|
|
1272287d62 | ||
|
|
f4b96cc688 | ||
|
|
65fb016bc3 | ||
|
|
2eccb95477 | ||
|
|
b9152ee77e | ||
|
|
99ec1c0606 | ||
|
|
5373cf2989 | ||
|
|
b85b4c6e99 | ||
|
|
7be4a3ee48 | ||
|
|
2f83b29f1a | ||
|
|
7709a3a2ec | ||
|
|
06d0b07f36 | ||
|
|
0275c65b8a | ||
|
|
1617796bc6 | ||
|
|
6869fda75b | ||
|
|
06017d17ae | ||
|
|
9fc26aeb41 | ||
|
|
dad5db4e9b | ||
|
|
d356cef183 | ||
|
|
c49d849917 | ||
|
|
b36a2a9154 | ||
|
|
252092c73a | ||
|
|
f6cc77bc3a | ||
|
|
cb16cae09b | ||
|
|
bb494b69ea | ||
|
|
f13a660698 | ||
|
|
ce1ca5cc17 | ||
|
|
e700ad32a3 | ||
|
|
0fd829ed3b | ||
|
|
f9a59180f2 | ||
|
|
04c9fe974e | ||
|
|
4b63c96434 | ||
|
|
ef55ce8919 | ||
|
|
0ba6e26788 | ||
|
|
1b481d214c | ||
|
|
d33ea360ac | ||
|
|
8e07d70070 | ||
|
|
06b4585a62 | ||
|
|
dbc5182193 | ||
|
|
46c023e73d | ||
|
|
f39d0fc0cf | ||
|
|
277429db5a | ||
|
|
9a447c16f2 | ||
|
|
c4c7d0d82d | ||
|
|
e5c76d3795 | ||
|
|
662c8c2831 | ||
|
|
3ec67073ce | ||
|
|
322dd2246f | ||
|
|
13e3950f4a | ||
|
|
d03d5bc40c | ||
|
|
5038050968 | ||
|
|
97fe3f56b7 | ||
|
|
887c0ebdd6 | ||
|
|
99869c520f | ||
|
|
65e82bcea1 | ||
|
|
bf8b67b35d | ||
|
|
8a56740a7c | ||
|
|
3a7bac6218 | ||
|
|
5b9e8ddb7d | ||
|
|
97649e86dd | ||
|
|
f8e3518aa6 | ||
|
|
ef5f7fe03e | ||
|
|
286c6ed39d | ||
|
|
f04fd6f218 | ||
|
|
75239ae8b5 | ||
|
|
b120a9cc57 | ||
|
|
6b71b66f8d | ||
|
|
ecd88fbeeb | ||
|
|
929c98ee90 | ||
|
|
642c293d5a | ||
|
|
f05247226d | ||
|
|
a4c30c2ba9 | ||
|
|
b24697443a | ||
|
|
a4114bb29d | ||
|
|
c41753c747 | ||
|
|
4a6d3c25a4 | ||
|
|
beef464cc1 | ||
|
|
6cc6d5a33f | ||
|
|
ff945c64fe | ||
|
|
d7c7511ea9 | ||
|
|
0af8b2421d | ||
|
|
71be7026d7 | ||
|
|
1683095233 | ||
|
|
c2898ec040 | ||
|
|
243d5ecc43 | ||
|
|
3f0126a471 | ||
|
|
8db3b8e333 | ||
|
|
00c9e5a5e9 | ||
|
|
e8134f9c2c | ||
|
|
c9bbddcfcb | ||
|
|
278a80cc25 | ||
|
|
3ab271f756 | ||
|
|
982895ff71 | ||
|
|
9acb9e527d | ||
|
|
ab9f516c08 | ||
|
|
c5717510ee | ||
|
|
8d23556831 | ||
|
|
04a6e30e45 | ||
|
|
bdfde9a481 | ||
|
|
9808ecde81 | ||
|
|
b36ab54b87 | ||
|
|
ff35e95924 | ||
|
|
49e44ce59b | ||
|
|
ab88dbb03d | ||
|
|
2e895286cf | ||
|
|
5b2d4b3559 | ||
|
|
8ad74d0814 | ||
|
|
9486576add | ||
|
|
2a353a9ca5 | ||
|
|
2d1f241677 | ||
|
|
d6f122bfda | ||
|
|
54ef6514d5 | ||
|
|
abf7addaa6 | ||
|
|
e831b786f0 | ||
|
|
c6074baad5 | ||
|
|
7cb0d11b95 | ||
|
|
87c77b1aa0 | ||
|
|
7d2f5b84c8 | ||
|
|
8dcbfe5542 | ||
|
|
f9023402ad | ||
|
|
c658d60dc2 | ||
|
|
c1781c39ca | ||
|
|
5f75b24fb2 | ||
|
|
3db5de1a9e | ||
|
|
520a72078e | ||
|
|
ef5a45c7cb | ||
|
|
c6a1c0dcbf | ||
|
|
c701429a05 | ||
|
|
7f1fe3ccfd | ||
|
|
6797971016 | ||
|
|
dc6abe691a | ||
|
|
7333a630a1 | ||
|
|
2edbc3fe39 | ||
|
|
50357eb682 | ||
|
|
1203146ab9 | ||
|
|
fc8637a0f5 | ||
|
|
f3ace60a98 | ||
|
|
8fe87358e1 | ||
|
|
297a26aa20 | ||
|
|
2da16265cb | ||
|
|
25a65add4a | ||
|
|
a721abd972 | ||
|
|
acbe8fa805 | ||
|
|
57a1c68aba | ||
|
|
83104bf919 | ||
|
|
7574c407fa | ||
|
|
f67a38864c | ||
|
|
f632795904 | ||
|
|
0cf43b8623 | ||
|
|
d3d426a8d9 | ||
|
|
6cae92e1f1 | ||
|
|
3670d7efcd | ||
|
|
887c1d4254 | ||
|
|
a56ae22614 | ||
|
|
884c45de0c | ||
|
|
8d6a1773a3 | ||
|
|
6f1e964c9f | ||
|
|
4db7ebd743 | ||
|
|
83f5e380d4 | ||
|
|
34f5eaeaa2 | ||
|
|
726f96089c | ||
|
|
6428b57775 | ||
|
|
e3f0e09a4a | ||
|
|
e839c29916 | ||
|
|
42b6876f2c | ||
|
|
d439518f13 | ||
|
|
f4be5adae0 | ||
|
|
4b77a97148 | ||
|
|
dd92e9db1a | ||
|
|
ead82cdcf3 | ||
|
|
9cce80d679 | ||
|
|
f43451de36 | ||
|
|
5d1cd5ed47 | ||
|
|
de948e4d2b | ||
|
|
db69f0cafa | ||
|
|
c97ab482fb | ||
|
|
17ec77073a | ||
|
|
0967f3f7bf | ||
|
|
86351724ff | ||
|
|
a97b3d1ed3 | ||
|
|
c7b71b5d92 | ||
|
|
67ae374e60 | ||
|
|
b72deb2b2a | ||
|
|
c368cc0855 | ||
|
|
33800e226a | ||
|
|
4539535c8c | ||
|
|
76bdac9747 | ||
|
|
d6b909adf4 | ||
|
|
39a0e89a24 | ||
|
|
d35042066b | ||
|
|
9a690ba042 | ||
|
|
11f90a1112 | ||
|
|
954684f5b5 | ||
|
|
39c0c316fc | ||
|
|
3285cacc97 | ||
|
|
7ac9c33112 | ||
|
|
f5c45b99ad | ||
|
|
af35de509b | ||
|
|
0798841f83 | ||
|
|
8d577b275e | ||
|
|
35e04d58fe | ||
|
|
af8718cebe | ||
|
|
b7e5bbed08 | ||
|
|
6b0cdae3d3 | ||
|
|
e423676b11 | ||
|
|
1757bc0207 | ||
|
|
e7fb6007d3 | ||
|
|
2e446fc3be | ||
|
|
173b87928c | ||
|
|
1edb734df9 | ||
|
|
6da8a54f86 | ||
|
|
eea863e556 | ||
|
|
db0df4e4ca | ||
|
|
b9b4693e20 | ||
|
|
699d205060 | ||
|
|
5579fe0006 | ||
|
|
0375bc3e97 | ||
|
|
49af2d8062 | ||
|
|
745f680899 | ||
|
|
e46e2f01f1 | ||
|
|
12b82b67e7 | ||
|
|
a418cf6a25 | ||
|
|
01e6f378bd | ||
|
|
2e11804ec9 | ||
|
|
efca23c22e | ||
|
|
6772c001dd | ||
|
|
058646c9f9 | ||
|
|
32896debcf | ||
|
|
4ae280528e | ||
|
|
924287c04f | ||
|
|
4b4119e52b | ||
|
|
ca621129e2 | ||
|
|
0d8d43d4dd | ||
|
|
74e1cbd27d | ||
|
|
9d45b0e2fb | ||
|
|
a5a66dd916 | ||
|
|
14a2699ac4 | ||
|
|
dfefdab67c | ||
|
|
952db832d9 | ||
|
|
1a36c77c46 | ||
|
|
5c0b350cff | ||
|
|
093fafe0b7 | ||
|
|
86795ddacc | ||
|
|
fb7c73a7e3 | ||
|
|
360cca08ef | ||
|
|
2dd9ff3ac8 | ||
|
|
f8766708c7 | ||
|
|
fba44b63a5 | ||
|
|
51add20a53 | ||
|
|
85bf4dd5cd | ||
|
|
57766597ae | ||
|
|
f33784cbc9 | ||
|
|
5f3b4640e8 | ||
|
|
d67f719fe4 | ||
|
|
c4f1ef26c0 | ||
|
|
73eabec039 | ||
|
|
287a3c3542 | ||
|
|
afacf32ba7 | ||
|
|
12d3f112e3 | ||
|
|
74b36bd66d | ||
|
|
bb8d0324b5 | ||
|
|
8b67d36c88 | ||
|
|
0909052816 | ||
|
|
2c002177e4 | ||
|
|
dbf21d6b8c | ||
|
|
7ad493c263 | ||
|
|
d1d9c57892 | ||
|
|
bccfa8a3a0 | ||
|
|
68309d5659 | ||
|
|
95aeb27f0b | ||
|
|
d2f116f958 | ||
|
|
c344efdd8d | ||
|
|
dece1b52e0 | ||
|
|
fbab5d2313 | ||
|
|
10c56efdf7 | ||
|
|
56967ef950 | ||
|
|
fc5f0c6685 | ||
|
|
9f05bd0dc3 | ||
|
|
682c6256bc | ||
|
|
de89dd7319 | ||
|
|
480b8ce42e | ||
|
|
dec181be6e | ||
|
|
c20826efa7 | ||
|
|
10b6cd5b83 | ||
|
|
7ed7202c67 | ||
|
|
a54f672b5c | ||
|
|
03ed58600c | ||
|
|
95469f472e | ||
|
|
4a3707d36d | ||
|
|
4990a1cdda | ||
|
|
df1987e6c4 | ||
|
|
81542ef089 | ||
|
|
51dea4a220 | ||
|
|
26ad2320cb | ||
|
|
29bad6b635 | ||
|
|
39fad96b0d | ||
|
|
1bcf91895b | ||
|
|
fd5aa596d1 | ||
|
|
c5143cb722 | ||
|
|
a9d46ada5d | ||
|
|
f3a33e74d7 | ||
|
|
cfd8f237df | ||
|
|
34d248a28c | ||
|
|
0498a707c8 | ||
|
|
86cc15d285 | ||
|
|
f25f45b67e | ||
|
|
a7c5e74c91 | ||
|
|
47462fcb6f | ||
|
|
077f5c1281 | ||
|
|
54990ebf83 | ||
|
|
af742f70c6 | ||
|
|
2fc51bcf53 | ||
|
|
3656651cb9 | ||
|
|
a9920e7cf9 | ||
|
|
ba8037b4bd | ||
|
|
92ae1b678a | ||
|
|
fbf19daff8 | ||
|
|
53d66246d8 | ||
|
|
90105e3c6a | ||
|
|
53ad759da8 | ||
|
|
72f531001e | ||
|
|
f49754de7a | ||
|
|
8bc87ee656 | ||
|
|
e838fe7b96 | ||
|
|
a688a23d1a | ||
|
|
ccfaeb0e36 | ||
|
|
f3c0c70b22 | ||
|
|
f5bb99c145 | ||
|
|
f61fcbc3b5 | ||
|
|
73fb626618 | ||
|
|
7a81f89442 | ||
|
|
ba157867c1 | ||
|
|
4f1cd2d30c | ||
|
|
803b55c6c2 | ||
|
|
d90e7b68dc | ||
|
|
929f503fa3 | ||
|
|
615119260d | ||
|
|
2f2136af09 | ||
|
|
634a399748 | ||
|
|
325e686b16 | ||
|
|
d702fae491 | ||
|
|
eaaa73e642 | ||
|
|
aa0f7ccfa7 | ||
|
|
b1254b3edc | ||
|
|
887633a3a3 | ||
|
|
e2d7f7ea35 | ||
|
|
513bc74c55 | ||
|
|
5b9eff6114 | ||
|
|
49a9d84342 | ||
|
|
5ca4c769db | ||
|
|
ab6dd96c50 | ||
|
|
b7cc027a04 | ||
|
|
eb804bfbbd | ||
|
|
366a3cee81 | ||
|
|
cb3b5bdc28 | ||
|
|
6b35cc3131 | ||
|
|
0fbbb10307 | ||
|
|
82bf74d7c9 | ||
|
|
dd30525c27 | ||
|
|
ae8f614a81 | ||
|
|
cf834f8ac8 | ||
|
|
ea2e9fe348 | ||
|
|
4b8e70075f | ||
|
|
068d83629f | ||
|
|
54d577a038 | ||
|
|
2e41cb36de | ||
|
|
a468b3b17b | ||
|
|
07d64909a9 | ||
|
|
769cff23fd | ||
|
|
cf996b4a87 | ||
|
|
34efbbd570 | ||
|
|
f83aba565f | ||
|
|
c1b47dd248 | ||
|
|
ec47b1bcc7 | ||
|
|
deeaf6dc41 | ||
|
|
8a9c77a061 | ||
|
|
d9fca6ac47 | ||
|
|
38ed9bff39 | ||
|
|
14a1050a26 | ||
|
|
48842fc2f6 | ||
|
|
ba4db261ba | ||
|
|
1c24585093 | ||
|
|
e16a7b5fe3 | ||
|
|
ea2443a7c2 | ||
|
|
15a2b7cbce | ||
|
|
44d8eb4cb7 | ||
|
|
fd8d27d837 | ||
|
|
059d3dc159 | ||
|
|
05240c56b6 | ||
|
|
6f2e2d6aad | ||
|
|
f992156dcf | ||
|
|
aee8b8b659 | ||
|
|
5e06583055 | ||
|
|
cb0ad13278 | ||
|
|
d63f1cc158 | ||
|
|
64c6437e4e | ||
|
|
2ec99bc853 | ||
|
|
81935a8f31 | ||
|
|
01a4440f39 | ||
|
|
0abc40ecca | ||
|
|
7f6688c01a | ||
|
|
0d776ec2c8 | ||
|
|
95292bfcba | ||
|
|
0292c4ee3b | ||
|
|
afd101034d | ||
|
|
b6fe31f9cb | ||
|
|
c924bdef04 | ||
|
|
2db8f93507 | ||
|
|
aeeb2e138f | ||
|
|
d156cff7e4 | ||
|
|
2d1b11bd8c | ||
|
|
58fcb01e08 | ||
|
|
66948b9de4 | ||
|
|
9aeee8189b | ||
|
|
b67a695e9e | ||
|
|
c84304b33c | ||
|
|
c441e7ec2c | ||
|
|
7e990963f1 | ||
|
|
ed190527ce | ||
|
|
fabb18c55c | ||
|
|
31adb13bde | ||
|
|
2102160cdb | ||
|
|
5ddb7eb983 | ||
|
|
b904895a61 | ||
|
|
be0c315a12 | ||
|
|
c55bfb650c | ||
|
|
84227b972b | ||
|
|
9d15ef9395 | ||
|
|
16e4bc8f60 | ||
|
|
a0cb2d932a | ||
|
|
70f522ecdd | ||
|
|
be941a7375 | ||
|
|
b812637fe1 | ||
|
|
194d5c995b | ||
|
|
7a8dd39ee8 | ||
|
|
09762cb35a | ||
|
|
e2e263c783 | ||
|
|
7349c30cd9 | ||
|
|
53c5d548f1 | ||
|
|
aec7b6f7fb | ||
|
|
1831848f89 | ||
|
|
f80b152c9b | ||
|
|
db29029653 | ||
|
|
87ee233636 | ||
|
|
cf99ac9a2c | ||
|
|
1538dc5dcb | ||
|
|
ec34b35a7f | ||
|
|
f7169bf417 | ||
|
|
f173c2f1c2 | ||
|
|
78f467852e | ||
|
|
8b932971df | ||
|
|
66b2fb602f | ||
|
|
df834f41f3 | ||
|
|
b0ac10bc11 | ||
|
|
b75547cff8 | ||
|
|
e8265ac642 | ||
|
|
029de873d7 | ||
|
|
2679bf3709 | ||
|
|
6fb4adf87f | ||
|
|
c9de100dd9 | ||
|
|
f6fc32a074 | ||
|
|
019e80d60a | ||
|
|
06f8237196 | ||
|
|
8fa869fab2 | ||
|
|
ed744d05e1 | ||
|
|
0023b6135a | ||
|
|
2b709fb8e8 | ||
|
|
3bc5e780da | ||
|
|
2fa7a1ab5f | ||
|
|
f34a16846f | ||
|
|
a2177ef57f | ||
|
|
28619164c4 | ||
|
|
ab376f0f1a | ||
|
|
44cb90eff1 | ||
|
|
2584d958e9 | ||
|
|
161d877e8b | ||
|
|
b98154e410 | ||
|
|
7cb0d7fb58 | ||
|
|
c77d323f1f | ||
|
|
3ae416955f | ||
|
|
7480fd51ee | ||
|
|
730e8f73d4 | ||
|
|
d3118b4d07 | ||
|
|
fb79d0f2e8 | ||
|
|
1bbde8fd94 | ||
|
|
ee8bdd4886 | ||
|
|
e36db73864 | ||
|
|
a3a50f193c | ||
|
|
7d917589a4 | ||
|
|
aad283a981 | ||
|
|
047626909c | ||
|
|
5ab170a60a | ||
|
|
ddd5526fed | ||
|
|
b716b61099 | ||
|
|
cadf876d37 | ||
|
|
088608d160 | ||
|
|
4f9b00dfcb | ||
|
|
1d9479e532 | ||
|
|
93eb8be806 | ||
|
|
31d4851089 | ||
|
|
e98d54f0bc | ||
|
|
f7474347b6 | ||
|
|
640f78a23c | ||
|
|
136c868904 | ||
|
|
1587b32a30 | ||
|
|
cb7b1f4ebd | ||
|
|
6df62d052a | ||
|
|
c7ce9dc89c | ||
|
|
5da8bcc3b5 | ||
|
|
aca8df1b09 | ||
|
|
87e9bea6da | ||
|
|
aed99f6193 | ||
|
|
f115815ced | ||
|
|
900e4ac94d | ||
|
|
855090c9e7 | ||
|
|
9b41f7a74e | ||
|
|
8d07ffe775 | ||
|
|
e47f6e5803 | ||
|
|
436574a9ad | ||
|
|
8ac04392f0 | ||
|
|
5bfb43222b | ||
|
|
7ee87c7aa5 | ||
|
|
172779f3d6 | ||
|
|
75ea7862cc | ||
|
|
6ea86f2714 | ||
|
|
a6b047805c | ||
|
|
3ce148dacd | ||
|
|
67dcf34f7a | ||
|
|
db635841f5 | ||
|
|
970b6806c7 | ||
|
|
1dfa02924d | ||
|
|
380e8affba | ||
|
|
725dd8b2a6 | ||
|
|
ff27908dfd | ||
|
|
e6762f2439 | ||
|
|
954d20bd1e | ||
|
|
792b36d5cc | ||
|
|
3f4278ec1d | ||
|
|
a185142170 | ||
|
|
24a30c8d4b | ||
|
|
3c7e5730ec | ||
|
|
c1c1cdd25f | ||
|
|
beea394822 | ||
|
|
1ad89bf53b | ||
|
|
28f76c5ae0 | ||
|
|
94a1f895d0 | ||
|
|
6ad694653a | ||
|
|
724c059721 | ||
|
|
6b78375cdc | ||
|
|
9087664667 | ||
|
|
418ecf67c2 | ||
|
|
dc2bdbc366 | ||
|
|
08a43c1604 | ||
|
|
f5f1eebf63 | ||
|
|
0117cbffaa | ||
|
|
4187a80ff6 | ||
|
|
eb3866c636 | ||
|
|
10fed6ecf0 | ||
|
|
9c5cb7d0f0 | ||
|
|
9b72c93a57 | ||
|
|
8cb95063d2 | ||
|
|
5f9a91aac1 | ||
|
|
02af8398c4 | ||
|
|
23a53b5034 | ||
|
|
e5aec5b141 | ||
|
|
4e88c534b7 | ||
|
|
93dd5c72ec | ||
|
|
aa5561b781 | ||
|
|
13bd5864b3 | ||
|
|
6f2cf34f10 | ||
|
|
57cc3ccefe | ||
|
|
aa5600271a | ||
|
|
ea0089b207 | ||
|
|
8d90477d44 | ||
|
|
eaed0b78cf | ||
|
|
cf6fed82fb | ||
|
|
72f53f9f1b | ||
|
|
13ffd960d9 | ||
|
|
5b4d6dc6eb | ||
|
|
b3f7db6d95 | ||
|
|
b10bfc62d7 | ||
|
|
85f180d43a | ||
|
|
d65cea7d47 | ||
|
|
dae4c211f2 | ||
|
|
7e84725b55 | ||
|
|
c7004c3ff9 | ||
|
|
8cec6ee318 | ||
|
|
83c39cee30 | ||
|
|
7661116858 | ||
|
|
2bf67dff96 | ||
|
|
4078995eeb | ||
|
|
a9e8890fe1 | ||
|
|
313c41e2d1 | ||
|
|
4aac1fd936 | ||
|
|
09fddd11c4 | ||
|
|
a21761d48d | ||
|
|
c90486547f | ||
|
|
69ce54626a | ||
|
|
3ca8f3c3dc | ||
|
|
39d6bb554a | ||
|
|
a95a69e6fc | ||
|
|
94fcabea15 | ||
|
|
e8972ff5a0 | ||
|
|
78503ed178 | ||
|
|
867e3317aa | ||
|
|
85b00385a4 | ||
|
|
c621b3ed69 | ||
|
|
894984a002 | ||
|
|
b92dc14b68 | ||
|
|
00f4fa0aed | ||
|
|
d6e474f451 | ||
|
|
0b9d4b2580 | ||
|
|
a8d42ea8be | ||
|
|
7a6d771689 | ||
|
|
3f1de1fd10 | ||
|
|
46f912659f | ||
|
|
06a5ac9fc7 | ||
|
|
8474c72a10 | ||
|
|
da1ea2dda8 | ||
|
|
50a98db8e6 | ||
|
|
331d58c62b | ||
|
|
5cada188d4 | ||
|
|
56b89ad07a | ||
|
|
b01d9e9a87 | ||
|
|
293b7fd482 | ||
|
|
52bb7c1c6a | ||
|
|
cf45ccb040 | ||
|
|
f48a6e1834 | ||
|
|
61f1060c69 | ||
|
|
f054b30086 | ||
|
|
71bc198cec | ||
|
|
dc0404dbf1 | ||
|
|
d3c9e80fcb | ||
|
|
85a7956876 | ||
|
|
4c3a0801f7 | ||
|
|
7095eac052 | ||
|
|
2165686059 | ||
|
|
3d4d82ff4e | ||
|
|
83f320ac8e | ||
|
|
72674e5c6c | ||
|
|
c352f463f7 | ||
|
|
db5b077354 | ||
|
|
23c25a44ec | ||
|
|
0d5a77fcd6 | ||
|
|
d67e883e13 | ||
|
|
0d1594e6fb | ||
|
|
e055d6876e | ||
|
|
42c4d7f338 | ||
|
|
e4e7c91767 | ||
|
|
2cfcea3479 | ||
|
|
b4cf7abcca | ||
|
|
da0041299b | ||
|
|
80eb3bf8b9 | ||
|
|
7a4ff80525 | ||
|
|
8a1ab4005d | ||
|
|
275b6e70cf | ||
|
|
f2693ec536 | ||
|
|
89584907f2 | ||
|
|
b31895baa9 | ||
|
|
776226d0d8 | ||
|
|
be2cd9acd2 | ||
|
|
550dbef8b0 | ||
|
|
a2d3a6087c | ||
|
|
e794568ae5 | ||
|
|
b4663e2034 | ||
|
|
c94b938b10 | ||
|
|
11f8cdf29a | ||
|
|
47dff5b2e8 | ||
|
|
65540b3417 | ||
|
|
eba3f71ced | ||
|
|
330b826d39 | ||
|
|
42ab9ec39f | ||
|
|
3e1649a8a7 | ||
|
|
0e4b7d7e7c | ||
|
|
afe1d715e1 | ||
|
|
4e7c325292 | ||
|
|
f476a12226 | ||
|
|
c8daf2ac5b | ||
|
|
e645336640 | ||
|
|
bd2948be6d | ||
|
|
8c9a1ea995 | ||
|
|
512878f629 | ||
|
|
eb6872d533 | ||
|
|
212ef01f7a | ||
|
|
b417508c98 | ||
|
|
71b578bf10 | ||
|
|
510b039e07 | ||
|
|
2e793fde8e | ||
|
|
8844c2ab67 | ||
|
|
0d3a64c4b9 | ||
|
|
7a0f527336 | ||
|
|
0b14c2b541 | ||
|
|
527515f1a0 | ||
|
|
5eb95dd6ab | ||
|
|
fa3755454a | ||
|
|
40b0bdd6e8 | ||
|
|
cc0687ec0f | ||
|
|
b5ecdfc0c5 | ||
|
|
db7cc94939 | ||
|
|
86f917db79 | ||
|
|
e9638a4d92 | ||
|
|
165b6ff46f | ||
|
|
bed573ebe8 | ||
|
|
7917072941 | ||
|
|
c53ebb66d0 | ||
|
|
770a8f8812 | ||
|
|
c3dba49007 | ||
|
|
9a1dd41e9f | ||
|
|
726c1571eb | ||
|
|
2b0d34d0db | ||
|
|
ed4aa60420 | ||
|
|
c9d9750afe | ||
|
|
be79060d7e | ||
|
|
4891599d13 | ||
|
|
63616796cb | ||
|
|
81feac7617 | ||
|
|
9e6a099735 | ||
|
|
eb0f49f08c | ||
|
|
15747612cd | ||
|
|
25982e961d | ||
|
|
4b3de76f94 | ||
|
|
3f1fe17977 | ||
|
|
6d91a32f3d | ||
|
|
af19e5e453 | ||
|
|
1025c7679f | ||
|
|
12efcd02b1 | ||
|
|
34dda8917b | ||
|
|
e3cca57762 | ||
|
|
3d7f03611f | ||
|
|
1c62a055d3 | ||
|
|
1201b05dfa | ||
|
|
6d43931e17 | ||
|
|
b2ca01eea0 | ||
|
|
399073f77b | ||
|
|
86a0ae1dde | ||
|
|
745a5b1e45 | ||
|
|
9641aa88e7 | ||
|
|
5b683ec4af | ||
|
|
2f5ed8c591 | ||
|
|
748c43fcfd | ||
|
|
5242eeeb86 | ||
|
|
d80a280fc2 | ||
|
|
227606d94a | ||
|
|
21bdfa0e43 | ||
|
|
8a29f63f73 | ||
|
|
bf84f13938 | ||
|
|
aaa55802b7 | ||
|
|
cd674d3cb3 | ||
|
|
376284381e | ||
|
|
7d8c80f0cc | ||
|
|
46d63dfd0c | ||
|
|
e1d1135ef1 | ||
|
|
2271badaf5 | ||
|
|
b5e2b82248 | ||
|
|
43592174e6 | ||
|
|
7fd1c7f89d | ||
|
|
930094b45e | ||
|
|
1429c2d174 | ||
|
|
3a8ecff3ca | ||
|
|
251b781ecd | ||
|
|
3491d9eff2 | ||
|
|
d43f9f730f | ||
|
|
a55fb34a77 | ||
|
|
c4ba380627 | ||
|
|
9b1849e816 | ||
|
|
98a20e36cd | ||
|
|
cad4cec050 | ||
|
|
6c76038bfc | ||
|
|
54079714c8 | ||
|
|
77c63b8d98 | ||
|
|
8eb4246040 | ||
|
|
eddd518718 | ||
|
|
38e039ab08 | ||
|
|
16b8f2682b | ||
|
|
5eddb260f4 | ||
|
|
cd32180f1a | ||
|
|
00a3ca856f | ||
|
|
a80bd92f40 | ||
|
|
d8878fdfe2 | ||
|
|
124072df95 | ||
|
|
dbdefd972d | ||
|
|
26c533fde3 | ||
|
|
faf284809b | ||
|
|
a9927c24e2 | ||
|
|
ff14323fdc | ||
|
|
e7f8aeff8a | ||
|
|
6a9583b176 | ||
|
|
2475b9e7ea | ||
|
|
fe1275d4e7 | ||
|
|
236f388aec | ||
|
|
ee864e4ff8 | ||
|
|
2c0a7a687e | ||
|
|
a932a421ce | ||
|
|
6efac356f3 | ||
|
|
ef027c0e5f | ||
|
|
bc8f2be582 | ||
|
|
afeb521f07 | ||
|
|
22a0ffd98d | ||
|
|
800fd928ca | ||
|
|
e5d473f494 | ||
|
|
ed275d479b | ||
|
|
b5c1646b50 | ||
|
|
c09e102692 | ||
|
|
463c5b8120 | ||
|
|
d79a4d1b5c | ||
|
|
57d4c93d2d | ||
|
|
30922fc818 | ||
|
|
59ca40f368 | ||
|
|
25bd4c8785 | ||
|
|
41dd72dd3e | ||
|
|
59abb1c161 | ||
|
|
5ee42f876e | ||
|
|
af158d945a | ||
|
|
28c409509c | ||
|
|
19806636ad | ||
|
|
b90bb0cd38 | ||
|
|
b83f351a3e | ||
|
|
95243b1757 | ||
|
|
b250fe6aeb | ||
|
|
7a4ab91ecf | ||
|
|
f0ee6288fb | ||
|
|
7330a849a5 | ||
|
|
226a3da87d | ||
|
|
58332d707b | ||
|
|
652530a4b4 | ||
|
|
b6e7fb5839 | ||
|
|
0db55bc6af | ||
|
|
9fb5dc9759 | ||
|
|
b4ebd3bd75 | ||
|
|
52b586e8d2 | ||
|
|
cc2ca2aee0 | ||
|
|
63bced7679 | ||
|
|
76dd0252ee | ||
|
|
ae1b0b3510 | ||
|
|
693ec111b1 | ||
|
|
e10e62b1e9 | ||
|
|
f425e23bdf | ||
|
|
4c86c7bd26 | ||
|
|
fa605b6a83 | ||
|
|
1f08853fc7 | ||
|
|
40421b32a4 | ||
|
|
f3d6190e18 | ||
|
|
46377071ea | ||
|
|
5fbe28f672 | ||
|
|
302d82a192 | ||
|
|
061ea9bfd7 | ||
|
|
f8e3bdc56b | ||
|
|
92d7e8ce65 | ||
|
|
e7faec3e26 | ||
|
|
72a847a6f1 | ||
|
|
0e007a1196 | ||
|
|
af626a51cc | ||
|
|
4bb221d89a | ||
|
|
984388d191 | ||
|
|
f0ef1daa15 | ||
|
|
3d065bf35c | ||
|
|
f1c0432375 | ||
|
|
21645247fb | ||
|
|
1a350796e5 | ||
|
|
5522cf63f7 | ||
|
|
52d6143d97 | ||
|
|
0fe5c645d6 | ||
|
|
85d04ee11a | ||
|
|
343c5fb5ca | ||
|
|
4ae56cf01c | ||
|
|
8336247cc1 | ||
|
|
3fe0b56fb8 | ||
|
|
329e849894 | ||
|
|
70cee2df86 | ||
|
|
2a30f45177 | ||
|
|
6528c4511a | ||
|
|
fe6f339890 | ||
|
|
c46efa54b4 | ||
|
|
3ef3f0218f | ||
|
|
59414fe231 | ||
|
|
052a14f13c | ||
|
|
050fa7edf3 | ||
|
|
e9db130b38 | ||
|
|
39aefb95c2 | ||
|
|
f1baa1f6a5 | ||
|
|
cd9c2d7dbe | ||
|
|
2e0939702a | ||
|
|
fc4903c1c9 | ||
|
|
3f408f1304 | ||
|
|
e3eab48e4a | ||
|
|
39abbdc5dd | ||
|
|
5d5ede2b85 | ||
|
|
64252b282a | ||
|
|
b449227467 | ||
|
|
228eb9ed7a | ||
|
|
a999f9d4e5 | ||
|
|
9b431321fa | ||
|
|
a96c1d644a | ||
|
|
6bd6cad8fd | ||
|
|
58cc088445 | ||
|
|
1d46208ac2 | ||
|
|
465c6e9a62 | ||
|
|
7a8cc2687d | ||
|
|
96ad5e8e5d | ||
|
|
4cc215ea02 | ||
|
|
c10c58a1cd | ||
|
|
099653ca02 | ||
|
|
84a6c6017d | ||
|
|
1ddef4183d | ||
|
|
9fcd9b0065 | ||
|
|
dc9ebf867c | ||
|
|
3684c10a78 | ||
|
|
10492587c2 | ||
|
|
bc93007c74 | ||
|
|
0e91a5bd0b | ||
|
|
75c7c2ebf0 | ||
|
|
6c57f1a08b | ||
|
|
59e5036456 | ||
|
|
158f10d321 | ||
|
|
4a3047b170 | ||
|
|
64a1c91b76 | ||
|
|
39b879058d | ||
|
|
5ae9067750 | ||
|
|
2af312ac03 | ||
|
|
172bc87f32 | ||
|
|
83ef992155 | ||
|
|
0df3f8d12d | ||
|
|
23ee740c04 | ||
|
|
54d731aeee | ||
|
|
9481e7031d | ||
|
|
70ba60e9e8 | ||
|
|
04a5e8bedf | ||
|
|
9706f7a298 | ||
|
|
cdd2b2028e | ||
|
|
3eb7a13006 | ||
|
|
71763e18f6 | ||
|
|
e9506e80cb | ||
|
|
33a540502a | ||
|
|
b8575a33f5 | ||
|
|
a3cd6f6e63 | ||
|
|
85fa7a5bb0 | ||
|
|
72d702a522 | ||
|
|
90ee5d58c5 | ||
|
|
ffac858566 | ||
|
|
0f10c94839 | ||
|
|
0581b38adf | ||
|
|
576ec05a9e | ||
|
|
6f4720adca | ||
|
|
ab3249c76b | ||
|
|
2f7daad200 | ||
|
|
6780d53c77 | ||
|
|
36fc689a5d | ||
|
|
98c45b55b7 | ||
|
|
1be66bd1bc | ||
|
|
91c2164e49 | ||
|
|
9876b9e588 | ||
|
|
58e36fee10 | ||
|
|
03830562c2 | ||
|
|
430cc2b4ca | ||
|
|
3f497908b5 | ||
|
|
3422866909 | ||
|
|
b84635baf7 | ||
|
|
ad8bcecb5b | ||
|
|
c896ca700c | ||
|
|
ecf67d3cdd | ||
|
|
e9b9091de5 | ||
|
|
62b27d4007 | ||
|
|
cc3ccda90a | ||
|
|
dc79152fe0 | ||
|
|
6b340c69b5 | ||
|
|
f2ec959598 | ||
|
|
b16c2876c4 | ||
|
|
3f50097619 | ||
|
|
28ca39266c | ||
|
|
6dcf695822 | ||
|
|
aeba3f2269 | ||
|
|
1fb0e737c3 | ||
|
|
462a648ac8 | ||
|
|
6523163701 | ||
|
|
a9a9d0a898 | ||
|
|
2851f2c63f | ||
|
|
5e82b37147 | ||
|
|
810ebffceb | ||
|
|
adedd3af5d | ||
|
|
722f22e7f0 | ||
|
|
ad732bd42b | ||
|
|
fdbab2c291 | ||
|
|
8654783131 | ||
|
|
b099d2c389 | ||
|
|
c9ea884e5d | ||
|
|
fbf9077075 | ||
|
|
5e32f9a89d | ||
|
|
690c32ceb8 | ||
|
|
7d73577952 | ||
|
|
edfec35177 | ||
|
|
c2ee6e99c6 | ||
|
|
419d687c50 | ||
|
|
3ca5503b74 | ||
|
|
acde3d60a7 | ||
|
|
7a4464a8ae | ||
|
|
096ba83f41 | ||
|
|
04cd5eeb91 | ||
|
|
9d287d0a5d | ||
|
|
af13d1247f | ||
|
|
81ddef04ff | ||
|
|
9ef7c385d4 | ||
|
|
dc00542b6f | ||
|
|
7fe2f8593c | ||
|
|
20dca9fd46 | ||
|
|
647efab2dd | ||
|
|
44282fd857 | ||
|
|
1372522258 | ||
|
|
27f247eabd | ||
|
|
a3abf8016b | ||
|
|
3b9f4ba63f | ||
|
|
92d6e76ea4 | ||
|
|
350efd8d53 | ||
|
|
6f008d6643 | ||
|
|
6e76831b5d | ||
|
|
31333452c8 | ||
|
|
25759bcbb4 | ||
|
|
72eb8a06f0 | ||
|
|
1e8831d9a0 | ||
|
|
c788659b63 | ||
|
|
e74346f0dc | ||
|
|
5b592575e7 | ||
|
|
c43a3edfc6 | ||
|
|
94149c8445 | ||
|
|
7fd32fb3e8 | ||
|
|
006eb452f1 | ||
|
|
2c5190bf63 | ||
|
|
0cc9e42c59 | ||
|
|
b409af602a | ||
|
|
b0afa778fb | ||
|
|
b8a4152e10 | ||
|
|
4949d1e33e | ||
|
|
06a7cb2a3d | ||
|
|
aee88d081d | ||
|
|
f71d147a8f | ||
|
|
dfad37ba23 | ||
|
|
1a2ed28e5b | ||
|
|
054a1328f7 | ||
|
|
901ec7c213 | ||
|
|
6fbd148597 | ||
|
|
d7d5d373c9 | ||
|
|
a9e0f8b7be | ||
|
|
f668bec210 | ||
|
|
1835b04809 | ||
|
|
ec9b8be5f8 | ||
|
|
8be92d9739 | ||
|
|
bbb38031f0 | ||
|
|
c25ef5dc4c | ||
|
|
093414b846 | ||
|
|
f664ad1cde | ||
|
|
5e9306ad40 | ||
|
|
c9af7e4cfa | ||
|
|
5d72f145df | ||
|
|
5b3506584a | ||
|
|
27748f9576 | ||
|
|
e6f7d4a732 | ||
|
|
32b18a8a5c | ||
|
|
160a5c9760 | ||
|
|
dde1531f42 | ||
|
|
60e3b37d39 | ||
|
|
a8563489e7 | ||
|
|
a86c037a91 | ||
|
|
523429b47f | ||
|
|
a13722eec1 | ||
|
|
8e8b6d60f0 | ||
|
|
4808c047ee | ||
|
|
be5e81b246 | ||
|
|
a137ed64dc | ||
|
|
fc1129c728 | ||
|
|
a22594b891 | ||
|
|
4f5c747c99 | ||
|
|
e7a81a8f8b | ||
|
|
32414b343a | ||
|
|
eeb6e78fa4 | ||
|
|
08aa2b9fa4 | ||
|
|
8b90d4ebf9 | ||
|
|
133fdc1f0a | ||
|
|
e7e01ee838 | ||
|
|
12c9536a7b | ||
|
|
c20fbfccf6 | ||
|
|
fd27d90303 | ||
|
|
686428a41a | ||
|
|
73e85b7df5 | ||
|
|
dfa241d6a9 | ||
|
|
dd8e1fdf45 | ||
|
|
21b091ab14 | ||
|
|
416b499670 | ||
|
|
dc90a889d7 | ||
|
|
14757ca925 | ||
|
|
7d865ccb1f | ||
|
|
294d4b1f29 | ||
|
|
5e3184b61d | ||
|
|
e57e1408b2 | ||
|
|
ef95d2bcd4 | ||
|
|
d8602c52af | ||
|
|
657bb1d2a1 | ||
|
|
0bd6b041c8 | ||
|
|
28077dff67 | ||
|
|
68917f12fb | ||
|
|
bb1b657ac9 | ||
|
|
07c83d4d32 | ||
|
|
264109360b | ||
|
|
2278290b91 | ||
|
|
23bcb4127a | ||
|
|
8004f0962c | ||
|
|
689f0443f3 | ||
|
|
441e864ea1 | ||
|
|
4f17392bf1 | ||
|
|
deace7a03a | ||
|
|
c49f81cd8b | ||
|
|
bada02a122 | ||
|
|
3d785360e1 | ||
|
|
3a81c8f279 | ||
|
|
9f64fdb9b6 | ||
|
|
e9873c58a8 | ||
|
|
a4a3bfc556 | ||
|
|
235115af9c | ||
|
|
aa82042db2 | ||
|
|
e8f1ce501a | ||
|
|
a4f4bef1f6 | ||
|
|
6aa315f815 | ||
|
|
15494d85a9 | ||
|
|
787e2f106a | ||
|
|
4db991c891 | ||
|
|
ab11453fc8 | ||
|
|
1a5bea6dde | ||
|
|
5e0ea9c734 | ||
|
|
68e628d384 | ||
|
|
0babde74f3 | ||
|
|
42cee30187 | ||
|
|
c50f1c8830 | ||
|
|
1db9e16006 | ||
|
|
3bf3bb433b | ||
|
|
fa0b4b26ac | ||
|
|
ec9f81b323 | ||
|
|
c400bc8f03 | ||
|
|
fc2fb71396 | ||
|
|
e8287b839f | ||
|
|
fcd713b23c | ||
|
|
294f82c327 | ||
|
|
0cc8ee6669 | ||
|
|
e7a2284226 | ||
|
|
64162a0bfd | ||
|
|
c2f92e07d9 | ||
|
|
29e44260a0 | ||
|
|
e2bebe078a | ||
|
|
d025a00d18 | ||
|
|
db0b2bc93e | ||
|
|
0b2bea3fa9 | ||
|
|
9156dea8b7 | ||
|
|
1f93169c43 | ||
|
|
65990068cb | ||
|
|
4008919a3c | ||
|
|
52b45d74cb | ||
|
|
ee27ea76a6 | ||
|
|
a85159425b | ||
|
|
ab69be6665 | ||
|
|
68ca119ae0 | ||
|
|
a0e05eaef0 | ||
|
|
34d80a18dc | ||
|
|
1a38b5533d | ||
|
|
7df06fb2f6 | ||
|
|
0efb690992 | ||
|
|
5af42dc678 | ||
|
|
2b929a98e7 | ||
|
|
9aa3721aa3 | ||
|
|
5ee257304a | ||
|
|
4497a54b12 | ||
|
|
13ff7f7b96 | ||
|
|
0147d55302 | ||
|
|
2169fb3859 | ||
|
|
8f9e23a59d | ||
|
|
9735f73c38 | ||
|
|
a8d60e13e1 | ||
|
|
b843716113 | ||
|
|
f442e6fabf | ||
|
|
e8e6660b2a | ||
|
|
6dd4e61e04 | ||
|
|
98fa428386 | ||
|
|
a145333fbd | ||
|
|
72491257c3 | ||
|
|
b009da2710 | ||
|
|
def60a510c | ||
|
|
4ac68cfbaa | ||
|
|
433a35fac2 | ||
|
|
6c9746c55e | ||
|
|
efa99d02b2 | ||
|
|
5269975753 | ||
|
|
0bdc6e443e | ||
|
|
b1ac7ac991 | ||
|
|
4f6e714a9d | ||
|
|
85f7f22520 | ||
|
|
79f8c1581c | ||
|
|
191ae25f63 | ||
|
|
484f3f8299 | ||
|
|
da748b1170 | ||
|
|
5835dbd9a4 | ||
|
|
f49405d4cf | ||
|
|
e6103cc49b | ||
|
|
40001b7287 | ||
|
|
0e08134a7c | ||
|
|
1c6eacd756 | ||
|
|
bec6c6bd66 | ||
|
|
f459745402 | ||
|
|
65ebd90903 | ||
|
|
ea30cd8cd2 | ||
|
|
e6a1a27516 | ||
|
|
79fea59713 | ||
|
|
e0b03aafe8 | ||
|
|
5b782c1ff4 | ||
|
|
fd0a6905dd | ||
|
|
1e18299364 | ||
|
|
b937f57a72 | ||
|
|
3fe65fd3fb | ||
|
|
460af1885a | ||
|
|
370e656209 | ||
|
|
337bc9d10e | ||
|
|
8fa40b7a70 | ||
|
|
af71b1b4b3 | ||
|
|
4f60297630 | ||
|
|
11aa78a5f9 | ||
|
|
f4be4ad28d | ||
|
|
cd4ebf5ffc | ||
|
|
584d4a4619 | ||
|
|
5061f1e2c8 | ||
|
|
8602fa9e01 | ||
|
|
ea10d23133 | ||
|
|
3d9714446a | ||
|
|
ee14acf735 | ||
|
|
7d9f133824 | ||
|
|
07f6a26c3e | ||
|
|
653d6ca1eb | ||
|
|
e1263bf55c | ||
|
|
ac96217ac3 | ||
|
|
d747e146a6 | ||
|
|
58512b2dea | ||
|
|
3d24f376ec | ||
|
|
954a5dba0b | ||
|
|
e7e44d431a | ||
|
|
9865908163 | ||
|
|
ff99cfe3f7 | ||
|
|
944d2c6ac4 | ||
|
|
3b28f0103f | ||
|
|
5d72c7f714 | ||
|
|
92c8ca50d1 | ||
|
|
fb918af050 | ||
|
|
ff536c58df | ||
|
|
9ff3ae9860 | ||
|
|
75fe75f7a9 | ||
|
|
79bfd0fd12 | ||
|
|
41bbf0a62b | ||
|
|
6f1206e8a9 | ||
|
|
74ca540c18 | ||
|
|
36fb3aef22 | ||
|
|
694ae52d64 | ||
|
|
ed48542fd8 | ||
|
|
4ab147a8a5 | ||
|
|
9d57baf5a9 | ||
|
|
a5b1412d43 | ||
|
|
6e16a1b76a | ||
|
|
d468572bf7 | ||
|
|
cc08da9600 | ||
|
|
f9f333ca0a | ||
|
|
02aca5aac5 | ||
|
|
e719da300f | ||
|
|
a7b929a80e | ||
|
|
c05ceb0aff | ||
|
|
4194702442 | ||
|
|
04dda5e347 | ||
|
|
cde90620b0 | ||
|
|
dea195df26 | ||
|
|
6a441d8ed5 | ||
|
|
7c6c8feb95 | ||
|
|
18957dcf39 | ||
|
|
7d825f8be0 | ||
|
|
518757c47d | ||
|
|
593f7d42d8 | ||
|
|
39c117a3cc | ||
|
|
4700104303 | ||
|
|
bc4b9dc5f3 | ||
|
|
6d21ab20bd | ||
|
|
dea1c86a9b | ||
|
|
15021d05c9 | ||
|
|
4639f3c930 | ||
|
|
42860dd2a9 | ||
|
|
df6ac90812 | ||
|
|
53fbaec1fa | ||
|
|
2f819d1d1c | ||
|
|
c74bd93c58 | ||
|
|
9f9ecca59c | ||
|
|
9e021f889f | ||
|
|
1c5896c3e3 | ||
|
|
4abad29b3a | ||
|
|
3fab901097 | ||
|
|
6e0adaead0 | ||
|
|
55afe3a760 | ||
|
|
a61f7f44d6 | ||
|
|
f0e0e20496 | ||
|
|
3e4f91a78d | ||
|
|
fb68a6f4b6 | ||
|
|
5a611b73d0 | ||
|
|
7e36d74959 | ||
|
|
442d2cc414 | ||
|
|
8cac7ee63f | ||
|
|
ab29554f3f | ||
|
|
2803c39fb5 | ||
|
|
0ba9393285 | ||
|
|
6cb8b108db | ||
|
|
9aef43d5a0 | ||
|
|
8dadc4cf50 | ||
|
|
45518fce6c | ||
|
|
b21f4b6470 | ||
|
|
c52f60f9d7 | ||
|
|
c815d732eb | ||
|
|
18849c085a | ||
|
|
cb62958095 | ||
|
|
4fcfad5df5 | ||
|
|
5101096518 | ||
|
|
afef3b94d5 | ||
|
|
73a84f90c5 | ||
|
|
918bc9efe8 | ||
|
|
98619733b2 | ||
|
|
2fb712c3a2 | ||
|
|
0fa6503034 | ||
|
|
fab97a377f | ||
|
|
811bf2f9c4 | ||
|
|
20497dabb4 | ||
|
|
0b430af077 | ||
|
|
e42e7c3694 | ||
|
|
eeef120433 | ||
|
|
8950571acb | ||
|
|
a72a82e29b | ||
|
|
b6adc23bdd | ||
|
|
8677aadad7 | ||
|
|
a4b8e59c3f | ||
|
|
3a5d0716d4 | ||
|
|
b54a5b3f67 | ||
|
|
5b33bd5eda | ||
|
|
6d55dd8884 | ||
|
|
0fae350256 | ||
|
|
90015ab594 | ||
|
|
28281ae4d4 | ||
|
|
4723b27f2c | ||
|
|
de338f4da5 | ||
|
|
d52eac7b35 | ||
|
|
4d01e677ee | ||
|
|
33daa88197 | ||
|
|
607a3d88ae | ||
|
|
be082e2fe0 | ||
|
|
27bd578405 | ||
|
|
0962ebeadb | ||
|
|
95d9ca8945 | ||
|
|
e71cd7a939 | ||
|
|
4bf301c913 | ||
|
|
0ea9e398bb | ||
|
|
2a6ea5d979 | ||
|
|
b8cde503c2 | ||
|
|
89c8e1c6a5 | ||
|
|
6c66e9850c | ||
|
|
fbcc8d8d6c | ||
|
|
e2bbdc968d | ||
|
|
ed7d5623ad | ||
|
|
217e491e59 | ||
|
|
101414dcd3 | ||
|
|
edda1e6567 | ||
|
|
dd7439095a | ||
|
|
9e3ae9c37c | ||
|
|
b1bd2c17a0 | ||
|
|
a939296981 | ||
|
|
23cfccf424 | ||
|
|
071e746c45 | ||
|
|
eae2876187 | ||
|
|
8730bbf0a9 | ||
|
|
1f5e5e5c14 | ||
|
|
e8b6e33934 | ||
|
|
9ee6c7aab6 | ||
|
|
22a8b914d2 | ||
|
|
dfab96c72e | ||
|
|
7c8fba8fc1 | ||
|
|
85f4023965 | ||
|
|
e9ee47a7c7 | ||
|
|
a7c6127f2b | ||
|
|
4e6a699140 | ||
|
|
f71644faf6 | ||
|
|
9a6306c53b | ||
|
|
83d98fb6fb | ||
|
|
c501574753 | ||
|
|
f0efdd2ed4 | ||
|
|
177b45c49b | ||
|
|
fc31b28ab6 | ||
|
|
e61475c7ea | ||
|
|
c92c0fce37 | ||
|
|
1a0c308b65 | ||
|
|
dffbad49b4 | ||
|
|
b6dffaabee | ||
|
|
8d83803763 | ||
|
|
85e5bd7c86 | ||
|
|
7ba063c6bb | ||
|
|
12b44c865b | ||
|
|
58c2ad8e4b | ||
|
|
4c354bdcd6 | ||
|
|
22f670d999 | ||
|
|
e5f3dcaaef | ||
|
|
3f4b1e69c7 | ||
|
|
fa286caca2 | ||
|
|
3b78e65b2b | ||
|
|
62b5ca20df |
34
.circleci/config.yml
Normal file
34
.circleci/config.yml
Normal file
@@ -0,0 +1,34 @@
|
||||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
machine: true
|
||||
parallelism: 4
|
||||
steps:
|
||||
- checkout
|
||||
- run: |
|
||||
make ci-dependencies
|
||||
- run: |
|
||||
./tests/ci/setup.sh
|
||||
- run: |
|
||||
echo 'export DOKKU_SKIP_CLEANUP=true' | sudo tee /home/dokku/.dokkurc/dokku_skip_cleanup
|
||||
- run: |
|
||||
# dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to eth0
|
||||
sudo ip a a 10.0.0.2/24 broadcast 10.0.0.255 dev eth0
|
||||
- run: |
|
||||
case $CIRCLE_NODE_INDEX in
|
||||
0) sudo -E make -e lint go-tests ci-go-coverage ;;
|
||||
1) sudo -E make -e deploy-test-checks-root deploy-test-config ;;
|
||||
2) sudo -E make -e deploy-test-multi ;;
|
||||
3) sudo -E make -e deploy-test-go-fail-predeploy deploy-test-go-fail-postdeploy ;;
|
||||
esac
|
||||
- run:
|
||||
shell: /bin/bash
|
||||
command: sudo -E make -e test-ci
|
||||
no_output_timeout: 60m
|
||||
- store_artifacts:
|
||||
path: ./coverage.out
|
||||
- store_artifacts:
|
||||
path: ./test-results
|
||||
destination: test-results
|
||||
- store_test_results:
|
||||
path: test-results
|
||||
5
.codacy.yml
Normal file
5
.codacy.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
exclude_paths:
|
||||
- vendor/**/*
|
||||
- tests/**/*
|
||||
- "**_test.go"
|
||||
- contrib/*
|
||||
@@ -3,6 +3,11 @@
|
||||
.git
|
||||
.vagrant
|
||||
contrib
|
||||
build
|
||||
docs
|
||||
tests
|
||||
!contrib/dokku-installer.py
|
||||
!contrib/dokku-update
|
||||
!contrib/bash-completion
|
||||
!contrib/docker
|
||||
vendor
|
||||
|
||||
@@ -14,3 +14,8 @@ indent_size = 4
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.go]
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -2,7 +2,12 @@
|
||||
*.rpm
|
||||
.DS_Store
|
||||
.ruby-version
|
||||
.idea/
|
||||
.vagrant
|
||||
build/
|
||||
data/
|
||||
test-results/
|
||||
stack.tgz
|
||||
tmp
|
||||
coverage.out
|
||||
contrib/dokku-update-version
|
||||
|
||||
10
.stickler.yml
Normal file
10
.stickler.yml
Normal file
@@ -0,0 +1,10 @@
|
||||
linters:
|
||||
shellcheck:
|
||||
shell: bash
|
||||
exclude: SC2034,SC1090,SC2191
|
||||
golint:
|
||||
|
||||
files:
|
||||
ignore:
|
||||
- './debian/*'
|
||||
- '*/vendor/*'
|
||||
@@ -11,7 +11,7 @@ several ways to help out:
|
||||
* Contribute to the [documentation](http://dokku.viewdocs.io/dokku/)
|
||||
* Come up with new ways to show off our [lovely logo](https://avatars1.githubusercontent.com/u/13455795)
|
||||
* Blog about different ways you are using dokku
|
||||
* [Sponsor](https://opencollective.com/dokku#support) the Dokku project financially
|
||||
* Sponsor the Dokku project financially on [OpenCollective](https://opencollective.com/dokku#support) or [Patreon](https://www.patreon.com/dokku)
|
||||
|
||||
There are a few guidelines that we need contributors to follow so that we have
|
||||
a chance of keeping on top of things.
|
||||
@@ -55,22 +55,10 @@ doesn't already include that problem or suggestion before submitting an issue.
|
||||
If you find a match, add a quick "+1" or "I have this problem too." Doing this
|
||||
helps prioritize the most common problems and requests.
|
||||
|
||||
When reporting issues, please include your host OS (Ubuntu 14.04, CentOS 7,
|
||||
etc). Please include:
|
||||
|
||||
* The output of `uname -a`.
|
||||
* The output of `free -m`
|
||||
* The output of `docker version`.
|
||||
* The output of `docker -D info`.
|
||||
* The output of `sigil -v`.
|
||||
* The output of `docker run --rm -ti gliderlabs/herokuish:latest herokuish version`
|
||||
* The output of `dokku version`.
|
||||
* The output of `dokku plugin`.
|
||||
|
||||
Please also include the steps required to reproduce the problem if possible and
|
||||
applicable. This information will help us review and fix your issue faster.
|
||||
|
||||
Our Issue Report Template is available [here](https://github.com/dokku/dokku/blob/master/ISSUE_TEMPLATE.md)
|
||||
When reporting issues, please include all the information we ask for in our
|
||||
[issue template](https://github.com/dokku/dokku/blob/master/ISSUE_TEMPLATE.md).
|
||||
Not doing so will prolongue the support period, making it more difficult to support
|
||||
you.
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -126,7 +114,7 @@ Be patient! The Dokku maintainers will review all pull requests and comment as
|
||||
quickly as possible. There may be some back and forth while the details of your
|
||||
pull request are discussed.
|
||||
|
||||
In the unlikely event that your pull request does not get merged, the dokku
|
||||
In the unlikely event that your pull request does not get merged, the Dokku
|
||||
maintainers will either provide an alternative patch or guide you towards a
|
||||
better solution to the problem at hand.
|
||||
|
||||
|
||||
1152
HISTORY.md
1152
HISTORY.md
File diff suppressed because it is too large
Load Diff
@@ -1,20 +1,35 @@
|
||||
Description of problem:
|
||||
> If you're using Dokku - especially for commercial purposes - consider donating to project development via [OpenCollective](https://opencollective.com/dokku) or [Patreon](https://www.patreon.com/dokku). Funds go to general development, support, and infrastructure costs.
|
||||
>
|
||||
> If you need help figuring out how to use a specific buildpack, or are having issues using multiple buildpacks, please see our [irc or slack channels](http://dokku.viewdocs.io/dokku/getting-started/where-to-get-help/#the-irc-and-slack-channels). Issues pertaining to buildpacks may be closed and locked.
|
||||
|
||||
## Description of problem
|
||||
|
||||
Output of the following commands
|
||||
### How reproducible
|
||||
|
||||
<!-- If you're running 0.4.10+ just use dokku report-->
|
||||
### Steps to Reproduce
|
||||
|
||||
- `uname -a`:
|
||||
- `free -m`:
|
||||
- `docker version`:
|
||||
- `docker -D info`:
|
||||
- `sigil -v`:
|
||||
- `docker run -ti gliderlabs/herokuish:latest herokuish version`:
|
||||
- `dokku version`:
|
||||
- `dokku plugin`:
|
||||
- `docker inspect CONTAINER_ID` (if applicable):
|
||||
(BEWARE: `docker inspect` will print environment variables for some commands, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXXX):
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
#### Actual Results
|
||||
|
||||
#### Expected Results
|
||||
|
||||
## Environment Information
|
||||
|
||||
### `dokku report APP_NAME` output
|
||||
|
||||
> This is required! Issues missing this information may be closed.
|
||||
>
|
||||
> For problems affecting all applications, the report output for a broken application is useful for our debugging.
|
||||
> You may also run `dokku report` without any arguments to display the top-level reporting information.
|
||||
|
||||
### How (deb/make/rpm) and where (AWS, VirtualBox, physical, etc.) was Dokku installed?:
|
||||
|
||||
### Additional information
|
||||
|
||||
- Container Inspect Output (if applicable) via `dokku inspect APP_NAME`
|
||||
- `cat /home/dokku/<app>/nginx.conf` (if applicable):
|
||||
- Link to the exact repository being deployed (if possible/applicable):
|
||||
- If a deploy is failing or behaving unexpectedly:
|
||||
@@ -23,25 +38,5 @@ Output of the following commands
|
||||
- If using buildpacks, which custom buildpacks are in use
|
||||
- If using a `Dockerfile`, the contents of that file
|
||||
- If it exists, the contents of your `Procfile`.
|
||||
- Output of failing Dokku commands after running `dokku trace on`
|
||||
(BEWARE: `trace on` will print environment variables for some commands, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXXX):
|
||||
|
||||
Environment details (AWS, VirtualBox, physical, etc.):
|
||||
|
||||
How was Dokku installed?:
|
||||
|
||||
How reproducible:
|
||||
|
||||
|
||||
Steps to Reproduce:
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
Actual Results:
|
||||
|
||||
|
||||
Expected Results:
|
||||
|
||||
|
||||
Additional info:
|
||||
- Output of failing Dokku commands after running `dokku trace:on`
|
||||
(BEWARE: `trace:on` will print environment variables for some commands, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXXX):
|
||||
|
||||
102
Makefile
102
Makefile
@@ -1,13 +1,17 @@
|
||||
DOKKU_VERSION ?= master
|
||||
|
||||
SSHCOMMAND_URL ?= https://raw.githubusercontent.com/dokku/sshcommand/v0.6.0/sshcommand
|
||||
PLUGN_URL ?= https://github.com/dokku/plugn/releases/download/v0.3.0/plugn_0.3.0_linux_x86_64.tgz
|
||||
PROCFILE_VERSION ?= 0.6.0
|
||||
PLUGN_VERSION ?= 0.3.2
|
||||
SSHCOMMAND_URL ?= https://raw.githubusercontent.com/dokku/sshcommand/v0.7.0/sshcommand
|
||||
PROCFILE_UTIL_URL ?= https://github.com/josegonzalez/go-procfile-util/releases/download/v${PROCFILE_VERSION}/procfile-util_${PROCFILE_VERSION}_linux_x86_64.tgz
|
||||
PLUGN_URL ?= https://github.com/dokku/plugn/releases/download/v${PLUGN_VERSION}/plugn_${PLUGN_VERSION}_linux_x86_64.tgz
|
||||
SIGIL_URL ?= https://github.com/gliderlabs/sigil/releases/download/v0.4.0/sigil_0.4.0_Linux_x86_64.tgz
|
||||
STACK_URL ?= https://github.com/gliderlabs/herokuish.git
|
||||
PREBUILT_STACK_URL ?= gliderlabs/herokuish:latest
|
||||
DOKKU_LIB_ROOT ?= /var/lib/dokku
|
||||
PLUGINS_PATH ?= ${DOKKU_LIB_ROOT}/plugins
|
||||
CORE_PLUGINS_PATH ?= ${DOKKU_LIB_ROOT}/core-plugins
|
||||
PLUGIN_MAKE_TARGET ?= build-in-docker
|
||||
|
||||
# If the first argument is "vagrant-dokku"...
|
||||
ifeq (vagrant-dokku,$(firstword $(MAKECMDGOALS)))
|
||||
@@ -23,9 +27,12 @@ else
|
||||
BUILD_STACK_TARGETS = build-in-docker
|
||||
endif
|
||||
|
||||
.PHONY: all apt-update install version copyfiles man-db plugins dependencies sshcommand plugn docker aufs stack count dokku-installer vagrant-acl-add vagrant-dokku
|
||||
include common.mk
|
||||
|
||||
.PHONY: all apt-update install version copyfiles copyplugin man-db plugins dependencies sshcommand procfile-util plugn docker aufs stack count dokku-installer vagrant-acl-add vagrant-dokku go-build
|
||||
|
||||
include tests.mk
|
||||
include package.mk
|
||||
include deb.mk
|
||||
include rpm.mk
|
||||
include arch.mk
|
||||
@@ -35,41 +42,65 @@ all:
|
||||
|
||||
install: dependencies version copyfiles plugin-dependencies plugins
|
||||
|
||||
release: deb-all rpm-all package_cloud packer
|
||||
|
||||
package_cloud:
|
||||
package_cloud push dokku/dokku/ubuntu/trusty herokuish*.deb
|
||||
package_cloud push dokku/dokku/ubuntu/trusty sshcommand*.deb
|
||||
package_cloud push dokku/dokku/ubuntu/trusty plugn*.deb
|
||||
package_cloud push dokku/dokku/ubuntu/trusty dokku*.deb
|
||||
package_cloud push dokku/dokku/el/7 herokuish*.rpm
|
||||
package_cloud push dokku/dokku/el/7 sshcommand*.rpm
|
||||
package_cloud push dokku/dokku/el/7 plugn*.rpm
|
||||
package_cloud push dokku/dokku/el/7 dokku*.rpm
|
||||
|
||||
packer:
|
||||
packer build contrib/packer.json
|
||||
|
||||
go-build:
|
||||
basedir=$(PWD); \
|
||||
for dir in plugins/*; do \
|
||||
if [ -e $$dir/Makefile ]; then \
|
||||
$(MAKE) -e -C $$dir $(PLUGIN_MAKE_TARGET) || exit $$? ;\
|
||||
fi ;\
|
||||
done
|
||||
|
||||
|
||||
go-build-plugin:
|
||||
ifndef PLUGIN_NAME
|
||||
$(error PLUGIN_NAME not specified)
|
||||
endif
|
||||
if [ -e plugins/$(PLUGIN_NAME)/Makefile ]; then \
|
||||
$(MAKE) -e -C plugins/$(PLUGIN_NAME) $(PLUGIN_MAKE_TARGET) || exit $$? ;\
|
||||
fi
|
||||
|
||||
go-clean:
|
||||
basedir=$(PWD); \
|
||||
for dir in plugins/*; do \
|
||||
if [ -e $$dir/Makefile ]; then \
|
||||
$(MAKE) -e -C $$dir clean ;\
|
||||
fi ;\
|
||||
done
|
||||
|
||||
copyfiles:
|
||||
$(MAKE) go-build || exit 1
|
||||
cp dokku /usr/local/bin/dokku
|
||||
mkdir -p ${CORE_PLUGINS_PATH} ${PLUGINS_PATH}
|
||||
rm -rf ${CORE_PLUGINS_PATH}/*
|
||||
test -d ${CORE_PLUGINS_PATH}/enabled || PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn init
|
||||
test -d ${PLUGINS_PATH}/enabled || PLUGIN_PATH=${PLUGINS_PATH} plugn init
|
||||
find plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do \
|
||||
rm -Rf ${CORE_PLUGINS_PATH}/available/$$plugin && \
|
||||
rm -Rf ${PLUGINS_PATH}/available/$$plugin && \
|
||||
rm -rf ${CORE_PLUGINS_PATH}/$$plugin && \
|
||||
rm -rf ${PLUGINS_PATH}/$$plugin && \
|
||||
cp -R plugins/$$plugin ${CORE_PLUGINS_PATH}/available && \
|
||||
ln -s ${CORE_PLUGINS_PATH}/available/$$plugin ${PLUGINS_PATH}/available; \
|
||||
find /var/lib/dokku/ -xtype l -delete;\
|
||||
PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn enable $$plugin ;\
|
||||
PLUGIN_PATH=${PLUGINS_PATH} plugn enable $$plugin ;\
|
||||
done
|
||||
find plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do $(MAKE) copyplugin PLUGIN_NAME=$$plugin; done
|
||||
ifndef SKIP_GO_CLEAN
|
||||
$(MAKE) go-clean
|
||||
endif
|
||||
chown dokku:dokku -R ${PLUGINS_PATH} ${CORE_PLUGINS_PATH} || true
|
||||
$(MAKE) addman
|
||||
|
||||
copyplugin:
|
||||
ifndef PLUGIN_NAME
|
||||
$(error PLUGIN_NAME not specified)
|
||||
endif
|
||||
rm -Rf ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME) && \
|
||||
rm -Rf ${PLUGINS_PATH}/available/$(PLUGIN_NAME) && \
|
||||
rm -rf ${CORE_PLUGINS_PATH}/$(PLUGIN_NAME) && \
|
||||
rm -rf ${PLUGINS_PATH}/$(PLUGIN_NAME) && \
|
||||
cp -R plugins/$(PLUGIN_NAME) ${CORE_PLUGINS_PATH}/available && \
|
||||
rm -rf ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME)/src && \
|
||||
ln -s ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME) ${PLUGINS_PATH}/available; \
|
||||
find /var/lib/dokku/ -xtype l -delete;\
|
||||
PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn enable $(PLUGIN_NAME) ;\
|
||||
PLUGIN_PATH=${PLUGINS_PATH} plugn enable $(PLUGIN_NAME)
|
||||
chown dokku:dokku -R ${PLUGINS_PATH} ${CORE_PLUGINS_PATH} || true
|
||||
|
||||
addman: help2man man-db
|
||||
mkdir -p /usr/local/share/man/man1
|
||||
help2man -Nh help -v version -n "configure and get information from your dokku installation" -o /usr/local/share/man/man1/dokku.1 dokku
|
||||
@@ -77,22 +108,22 @@ addman: help2man man-db
|
||||
|
||||
version:
|
||||
ifeq ($(DOKKU_VERSION),master)
|
||||
git describe --tags > ~dokku/VERSION 2> /dev/null || echo '~${DOKKU_VERSION} ($(shell date -uIminutes))' > ~dokku/VERSION
|
||||
git describe --tags > ~dokku/VERSION 2>/dev/null || echo '~${DOKKU_VERSION} ($(shell date -uIminutes))' > ~dokku/VERSION
|
||||
else
|
||||
echo $(DOKKU_VERSION) > ~dokku/VERSION
|
||||
endif
|
||||
|
||||
plugin-dependencies: plugn
|
||||
plugin-dependencies: plugn procfile-util
|
||||
sudo -E dokku plugin:install-dependencies --core
|
||||
|
||||
plugins: plugn docker
|
||||
plugins: plugn procfile-util docker
|
||||
sudo -E dokku plugin:install --core
|
||||
|
||||
dependencies: apt-update sshcommand plugn docker help2man man-db sigil
|
||||
dependencies: apt-update sshcommand plugn procfile-util docker help2man man-db sigil
|
||||
$(MAKE) -e stack
|
||||
|
||||
apt-update:
|
||||
apt-get update
|
||||
apt-get update -qq
|
||||
|
||||
help2man:
|
||||
apt-get install -qq -y help2man
|
||||
@@ -105,6 +136,10 @@ sshcommand:
|
||||
chmod +x /usr/local/bin/sshcommand
|
||||
sshcommand create dokku /usr/local/bin/dokku
|
||||
|
||||
procfile-util:
|
||||
wget -qO /tmp/procfile-util_latest.tgz ${PROCFILE_UTIL_URL}
|
||||
tar xzf /tmp/procfile-util_latest.tgz -C /usr/local/bin
|
||||
|
||||
plugn:
|
||||
wget -qO /tmp/plugn_latest.tgz ${PLUGN_URL}
|
||||
tar xzf /tmp/plugn_latest.tgz -C /usr/local/bin
|
||||
@@ -113,7 +148,7 @@ sigil:
|
||||
wget -qO /tmp/sigil_latest.tgz ${SIGIL_URL}
|
||||
tar xzf /tmp/sigil_latest.tgz -C /usr/local/bin
|
||||
|
||||
docker: aufs
|
||||
docker:
|
||||
apt-get install -qq -y curl
|
||||
egrep -i "^docker" /etc/group || groupadd docker
|
||||
usermod -aG docker dokku
|
||||
@@ -125,11 +160,6 @@ endif
|
||||
sleep 2 # give docker a moment i guess
|
||||
endif
|
||||
|
||||
aufs:
|
||||
ifndef CI
|
||||
lsmod | grep aufs || modprobe aufs || apt-get install -qq -y linux-image-extra-`uname -r` > /dev/null
|
||||
endif
|
||||
|
||||
stack:
|
||||
ifeq ($(shell test -e /var/run/docker.sock && touch -c /var/run/docker.sock && echo $$?),0)
|
||||
ifdef BUILD_STACK
|
||||
|
||||
1
PULL_REQUEST_TEMPLATE.md
Normal file
1
PULL_REQUEST_TEMPLATE.md
Normal file
@@ -0,0 +1 @@
|
||||
**Note:** If this PR is just doc changes, please put [ci skip] in the body that way tests do not run.
|
||||
13
README.md
13
README.md
@@ -1,5 +1,5 @@
|
||||
# Dokku
|
||||
[](https://circleci.com/gh/dokku/dokku/tree/master)
|
||||
[](https://circleci.com/gh/dokku/dokku/tree/master)
|
||||
[](https://packagecloud.io/dokku/dokku)
|
||||
[](https://aur.archlinux.org/packages/dokku/)
|
||||
[](https://webchat.freenode.net/?channels=dokku)
|
||||
@@ -7,7 +7,7 @@
|
||||
[](http://dokku.viewdocs.io/dokku/)
|
||||
[](#sponsors)
|
||||
[](#backers)
|
||||
[](https://gratipay.com/dokku/)
|
||||
[](https://www.patreon.com/dokku/)
|
||||
|
||||
Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen.
|
||||
|
||||
@@ -88,9 +88,8 @@ Support us with a monthly donation and help us continue our activities. [[Become
|
||||
|
||||
A fresh VM running any of the following operating systems:
|
||||
|
||||
- Ubuntu 16.04 x64
|
||||
- Ubuntu 14.04 x64
|
||||
- Debian 8.2 x64
|
||||
- Ubuntu x64 - Any currently supported release
|
||||
- Debian 8.2+ x64
|
||||
- CentOS 7 x64 *(experimental)*
|
||||
- Arch Linux x64 *(experimental)*
|
||||
|
||||
@@ -99,8 +98,8 @@ A fresh VM running any of the following operating systems:
|
||||
To install the latest stable release, run the following commands as a user who has access to `sudo`:
|
||||
|
||||
```shell
|
||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.8.2/bootstrap.sh
|
||||
sudo DOKKU_TAG=v0.8.2 bash bootstrap.sh
|
||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.17.6/bootstrap.sh
|
||||
sudo DOKKU_TAG=v0.17.6 bash bootstrap.sh
|
||||
```
|
||||
|
||||
You can then proceed to the ip address or domain name associated with your server to complete the web-based installation.
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#Sponsors
|
||||
|
||||
[Deis](http://deis.io)
|
||||
|
||||
[DigitalOcean](https://www.digitalocean.com/)
|
||||
|
||||
[Melvin Lammerts](http://dokku.net)
|
||||
16
Vagrantfile
vendored
16
Vagrantfile
vendored
@@ -1,7 +1,7 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-14.04"
|
||||
BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-18.04"
|
||||
BOX_CPUS = ENV["BOX_CPUS"] || "1"
|
||||
BOX_MEMORY = ENV["BOX_MEMORY"] || "1024"
|
||||
DOKKU_DOMAIN = ENV["DOKKU_DOMAIN"] || "dokku.me"
|
||||
@@ -33,6 +33,10 @@ Vagrant::configure("2") do |config|
|
||||
v.vmx["memsize"] = BOX_MEMORY
|
||||
end
|
||||
|
||||
config.vm.provider :vmware_desktop do |v, override|
|
||||
v.vmx["memsize"] = BOX_MEMORY
|
||||
end
|
||||
|
||||
config.vm.define "empty", autostart: false
|
||||
|
||||
config.vm.define "dokku", primary: true do |vm|
|
||||
@@ -45,9 +49,11 @@ Vagrant::configure("2") do |config|
|
||||
vm.vm.provider :virtualbox do |vb|
|
||||
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
|
||||
vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
|
||||
# enable NAT adapter cable https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838999
|
||||
vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
|
||||
end
|
||||
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update > /dev/null && apt-get -qq -y install git > /dev/null && cd /root/dokku && #{make_cmd}"
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update >/dev/null && apt-get -qq -y install git >/dev/null && cd /root/dokku && #{make_cmd}"
|
||||
vm.vm.provision :shell, :inline => "cd /root/dokku && make dokku-installer"
|
||||
vm.vm.provision :shell do |s|
|
||||
s.inline = <<-EOT
|
||||
@@ -64,8 +70,8 @@ Vagrant::configure("2") do |config|
|
||||
vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
|
||||
vm.vm.hostname = "#{DOKKU_DOMAIN}"
|
||||
vm.vm.network :private_network, ip: DOKKU_IP
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update > /dev/null && apt-get -qq -y install git > /dev/null"
|
||||
vm.vm.provision :shell, :inline => "cd /vagrant/ && export DOKKU_BRANCH=`git symbolic-ref -q --short HEAD 2>/dev/null` && export DOKKU_TAG=`git describe --tags --exact-match 2>/dev/null` && cd /root/ && cp /vagrant/bootstrap.sh ./ && bash bootstrap.sh"
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update >/dev/null && apt-get -qq -y install git dos2unix >/dev/null"
|
||||
vm.vm.provision :shell, :inline => "cd /vagrant/ && export DOKKU_BRANCH=`git symbolic-ref -q --short HEAD 2>/dev/null` && export DOKKU_TAG=`git describe --tags --exact-match 2>/dev/null` && cd /root/ && cp /vagrant/bootstrap.sh ./ && dos2unix bootstrap.sh && bash bootstrap.sh"
|
||||
end
|
||||
|
||||
config.vm.define "dokku-deb", autostart: false do |vm|
|
||||
@@ -90,7 +96,7 @@ Vagrant::configure("2") do |config|
|
||||
vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
|
||||
vm.vm.hostname = "#{DOKKU_DOMAIN}"
|
||||
vm.vm.network :private_network, ip: DOKKU_IP
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update > /dev/null && apt-get -qq -y install git > /dev/null && cd /root/dokku && #{make_cmd}"
|
||||
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update >/dev/null && apt-get -qq -y install git >/dev/null && cd /root/dokku && #{make_cmd}"
|
||||
vm.vm.provision :shell, :inline => "export IS_RELEASE=true && cd /root/dokku && make deb-all rpm-all"
|
||||
end
|
||||
|
||||
|
||||
111
bootstrap.sh
111
bootstrap.sh
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
# A script to bootstrap dokku.
|
||||
# It expects to be run on Ubuntu 14.04 via 'sudo'
|
||||
@@ -15,7 +16,7 @@ ensure-environment() {
|
||||
local FREE_MEMORY
|
||||
echo "Preparing to install $DOKKU_TAG from $DOKKU_REPO..."
|
||||
|
||||
hostname -f > /dev/null 2>&1 || {
|
||||
hostname -f >/dev/null 2>&1 || {
|
||||
echo "This installation script requires that you have a hostname set for the instance. Please set a hostname for 127.0.0.1 in your /etc/hosts"
|
||||
exit 1
|
||||
}
|
||||
@@ -31,12 +32,21 @@ install-requirements() {
|
||||
echo "--> Ensuring we have the proper dependencies"
|
||||
|
||||
case "$DOKKU_DISTRO" in
|
||||
debian|ubuntu)
|
||||
apt-get update -qq > /dev/null
|
||||
if [[ "$DOKKU_DISTRO_VERSION" == "12.04" ]]; then
|
||||
apt-get -qq -y install python-software-properties
|
||||
debian)
|
||||
if ! dpkg -l | grep -q software-properties-common; then
|
||||
apt-get update -qq >/dev/null
|
||||
apt-get -qq -y install software-properties-common
|
||||
fi
|
||||
;;
|
||||
ubuntu)
|
||||
if ! dpkg -l | grep -q software-properties-common; then
|
||||
apt-get update -qq >/dev/null
|
||||
apt-get -qq -y install software-properties-common
|
||||
fi
|
||||
|
||||
add-apt-repository universe >/dev/null
|
||||
apt-get update -qq >/dev/null
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -44,18 +54,25 @@ install-dokku() {
|
||||
if [[ -n $DOKKU_BRANCH ]]; then
|
||||
install-dokku-from-source "origin/$DOKKU_BRANCH"
|
||||
elif [[ -n $DOKKU_TAG ]]; then
|
||||
local DOKKU_SEMVER="${DOKKU_TAG//v}"
|
||||
local DOKKU_SEMVER="${DOKKU_TAG//v/}"
|
||||
major=$(echo "$DOKKU_SEMVER" | awk '{split($0,a,"."); print a[1]}')
|
||||
minor=$(echo "$DOKKU_SEMVER" | awk '{split($0,a,"."); print a[2]}')
|
||||
patch=$(echo "$DOKKU_SEMVER" | awk '{split($0,a,"."); print a[3]}')
|
||||
|
||||
use_plugin=false
|
||||
# 0.4.0 implemented a `plugin` plugin
|
||||
if [[ "$major" -eq "0" ]] && [[ "$minor" -ge "4" ]] && [[ "$patch" -ge "0" ]]; then
|
||||
use_plugin=true
|
||||
elif [[ "$major" -ge "1" ]]; then
|
||||
use_plugin=true
|
||||
fi
|
||||
|
||||
# 0.3.13 was the first version with a debian package
|
||||
if [[ "$major" -eq "0" ]] && [[ "$minor" -eq "3" ]] && [[ "$patch" -ge "13" ]]; then
|
||||
install-dokku-from-package "$DOKKU_SEMVER"
|
||||
echo "--> Running post-install dependency installation"
|
||||
dokku plugins-install-dependencies
|
||||
# 0.4.0 implemented a `plugin` plugin
|
||||
elif [[ "$major" -eq "0" ]] && [[ "$minor" -ge "4" ]] && [[ "$patch" -ge "0" ]]; then
|
||||
elif [[ "$use_plugin" == "true" ]]; then
|
||||
install-dokku-from-package "$DOKKU_SEMVER"
|
||||
echo "--> Running post-install dependency installation"
|
||||
sudo -E dokku plugin:install-dependencies --core
|
||||
@@ -91,10 +108,10 @@ install-dokku-from-source() {
|
||||
|
||||
install-dokku-from-package() {
|
||||
case "$DOKKU_DISTRO" in
|
||||
debian|ubuntu)
|
||||
debian | ubuntu)
|
||||
install-dokku-from-deb-package "$@"
|
||||
;;
|
||||
centos)
|
||||
centos | rhel)
|
||||
install-dokku-from-rpm-package "$@"
|
||||
;;
|
||||
*)
|
||||
@@ -104,37 +121,75 @@ install-dokku-from-package() {
|
||||
esac
|
||||
}
|
||||
|
||||
in-array() {
|
||||
declare desc="return true if value ($1) is in list (all other arguments)"
|
||||
|
||||
local e
|
||||
for e in "${@:2}"; do
|
||||
[[ "$e" == "$1" ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
install-dokku-from-deb-package() {
|
||||
local DOKKU_CHECKOUT="$1"
|
||||
local NO_INSTALL_RECOMMENDS=${DOKKU_NO_INSTALL_RECOMMENDS:=""}
|
||||
local OS_ID
|
||||
|
||||
if [[ -n $DOKKU_DOCKERFILE ]]; then
|
||||
NO_INSTALL_RECOMMENDS=" --no-install-recommends "
|
||||
fi
|
||||
|
||||
echo "--> Initial apt-get update"
|
||||
apt-get update -qq > /dev/null
|
||||
apt-get update -qq >/dev/null
|
||||
apt-get -qq -y install apt-transport-https
|
||||
|
||||
echo "--> Installing docker"
|
||||
if uname -r | grep -q linode; then
|
||||
echo "--> NOTE: Using Linode? Docker might complain about missing AUFS support."
|
||||
echo " See http://dokku.viewdocs.io/dokku/getting-started/install/linode/"
|
||||
echo " Installation will continue in 10 seconds."
|
||||
sleep 10
|
||||
if ! command -v docker &>/dev/null; then
|
||||
echo "--> Installing docker"
|
||||
if uname -r | grep -q linode; then
|
||||
echo "--> NOTE: Using Linode? Docker may complain about missing AUFS support."
|
||||
echo " You can safely ignore this warning."
|
||||
echo " Installation will continue in 10 seconds."
|
||||
sleep 10
|
||||
fi
|
||||
export CHANNEL=stable
|
||||
wget -nv -O - https://get.docker.com/ | sh
|
||||
fi
|
||||
|
||||
if [[ "$DOKKU_DISTRO_VERSION" == "14.04" ]]; then
|
||||
echo "--> Adding nginx PPA"
|
||||
add-apt-repository -y ppa:nginx/stable
|
||||
fi
|
||||
|
||||
OS_ID="$(lsb_release -cs 2>/dev/null || echo "trusty")"
|
||||
if ! in-array "$DOKKU_DISTRO" "debian" "ubuntu"; then
|
||||
DOKKU_DISTRO="ubuntu"
|
||||
OS_ID="trusty"
|
||||
fi
|
||||
|
||||
if [[ "$DOKKU_DISTRO" == "ubuntu" ]]; then
|
||||
OS_IDS=("trusty" "utopic" "vivid" "wily" "xenial" "yakkety" "zesty" "artful" "bionic")
|
||||
if ! in-array "$OS_ID" "${OS_IDS[@]}"; then
|
||||
OS_ID="trusty"
|
||||
fi
|
||||
elif [[ "$DOKKU_DISTRO" == "debian" ]]; then
|
||||
OS_IDS=("wheezy" "jessie" "stretch" "buster")
|
||||
if ! in-array "$OS_ID" "${OS_IDS[@]}"; then
|
||||
OS_ID="stretch"
|
||||
fi
|
||||
fi
|
||||
wget -nv -O - https://get.docker.com/ | sh
|
||||
|
||||
echo "--> Installing dokku"
|
||||
wget -nv -O - https://packagecloud.io/gpg.key | apt-key add -
|
||||
echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ trusty main" | tee /etc/apt/sources.list.d/dokku.list
|
||||
apt-get update -qq > /dev/null
|
||||
wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
|
||||
echo "deb https://packagecloud.io/dokku/dokku/$DOKKU_DISTRO/ $OS_ID main" | tee /etc/apt/sources.list.d/dokku.list
|
||||
apt-get update -qq >/dev/null
|
||||
|
||||
[[ -n $DOKKU_VHOST_ENABLE ]] && echo "dokku dokku/vhost_enable boolean $DOKKU_VHOST_ENABLE" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_WEB_CONFIG ]] && echo "dokku dokku/web_config boolean $DOKKU_WEB_CONFIG" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_HOSTNAME ]] && echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_VHOST_ENABLE ]] && echo "dokku dokku/vhost_enable boolean $DOKKU_VHOST_ENABLE" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_WEB_CONFIG ]] && echo "dokku dokku/web_config boolean $DOKKU_WEB_CONFIG" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_HOSTNAME ]] && echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_SKIP_KEY_FILE ]] && echo "dokku dokku/skip_key_file boolean $DOKKU_SKIP_KEY_FILE" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_KEY_FILE ]] && echo "dokku dokku/key_file string $DOKKU_KEY_FILE" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_KEY_FILE ]] && echo "dokku dokku/key_file string $DOKKU_KEY_FILE" | sudo debconf-set-selections
|
||||
[[ -n $DOKKU_NGINX_ENABLE ]] && echo "dokku dokku/nginx_enable string $DOKKU_NGINX_ENABLE" | sudo debconf-set-selections
|
||||
|
||||
if [[ -n $DOKKU_CHECKOUT ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
@@ -167,6 +222,10 @@ install-dokku-from-rpm-package() {
|
||||
yum -y install herokuish dokku
|
||||
fi
|
||||
|
||||
echo "--> Enabling docker and nginx on system startup"
|
||||
systemctl enable docker
|
||||
systemctl enable nginx
|
||||
|
||||
echo "--> Starting nginx"
|
||||
systemctl start nginx
|
||||
}
|
||||
|
||||
20
circle.yml
20
circle.yml
@@ -1,20 +0,0 @@
|
||||
machine:
|
||||
pre:
|
||||
- echo 'DOCKER_OPTS="-s btrfs -e lxc --userland-proxy=false"' | sudo tee -a /etc/default/docker
|
||||
- sudo curl -L -o /usr/bin/docker 'https://s3-external-1.amazonaws.com/circle-downloads/docker-1.9.1-circleci-cp-workaround'
|
||||
- sudo chmod 0755 /usr/bin/docker
|
||||
services:
|
||||
- docker
|
||||
dependencies:
|
||||
cache_directories:
|
||||
- "~/docker"
|
||||
override:
|
||||
- ./tests/ci/parallel_runner.sh setup: { timeout: 300 }
|
||||
- echo "export DOKKU_SKIP_CLEANUP=true" > /home/dokku/.dokkurc/dokku_skip_cleanup
|
||||
# dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to eth0
|
||||
- sudo ip a a 10.0.0.2/24 broadcast 10.0.0.255 dev eth0
|
||||
post:
|
||||
- sudo -E make -e lint
|
||||
test:
|
||||
override:
|
||||
- ./tests/ci/parallel_runner.sh testing: { parallel: true, timeout: 3600 }
|
||||
4
common.mk
Normal file
4
common.mk
Normal file
@@ -0,0 +1,4 @@
|
||||
GO_REPO_ROOT := /go/src/github.com/dokku/dokku
|
||||
BUILD_IMAGE := golang:1.12
|
||||
|
||||
.PHONY: build-in-docker build clean src-clean
|
||||
31
contrib/bash-completion
Normal file
31
contrib/bash-completion
Normal file
@@ -0,0 +1,31 @@
|
||||
# bash completion for dd -*- shell-script -*-
|
||||
|
||||
_dokku_complete_verify() {
|
||||
declare desc="shows bash completion"
|
||||
declare COMMAND="$1"
|
||||
local COMMANDS=""
|
||||
|
||||
_dokku_complete_goals=$(cat "/var/cache/dokku-completion")
|
||||
|
||||
while read -r fn; do
|
||||
if [[ -z "$COMMAND" ]] || [[ "$fn" == $COMMAND* ]]; then
|
||||
COMMANDS="${COMMANDS};${fn}"
|
||||
fi
|
||||
done <<< "$_dokku_complete_goals"
|
||||
|
||||
echo "${COMMANDS#";"}"
|
||||
}
|
||||
|
||||
_dokku() {
|
||||
local cur prev
|
||||
_get_comp_words_by_ref -n : cur
|
||||
|
||||
if [[ ! -f "/var/cache/dokku-completion" ]] || [[ ! -s "/var/cache/dokku-completion" ]]; then
|
||||
dokku --quiet help --all | awk '/^ /{ print $1 }' | sort > "/var/cache/dokku-completion"
|
||||
fi
|
||||
|
||||
opts=$(_dokku_complete_verify "${cur}")
|
||||
COMPREPLY=($(IFS=";" compgen -W "$opts" -- "$cur"))
|
||||
__ltrim_colon_completions "$cur"
|
||||
} &&
|
||||
complete -F _dokku dokku
|
||||
6
contrib/build-base.Dockerfile
Normal file
6
contrib/build-base.Dockerfile
Normal file
@@ -0,0 +1,6 @@
|
||||
FROM ubuntu:14.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
@@ -1,34 +0,0 @@
|
||||
FROM ubuntu:14.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
|
||||
RUN command -v fpm > /dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
|
||||
WORKDIR /dokku
|
||||
|
||||
COPY Makefile /dokku/
|
||||
|
||||
COPY *.mk /dokku/
|
||||
|
||||
RUN make deb-setup rpm-setup
|
||||
|
||||
COPY . /dokku
|
||||
|
||||
RUN make sshcommand plugn version copyfiles
|
||||
|
||||
ARG DOKKU_VERSION=master
|
||||
ENV DOKKU_VERSION ${DOKKU_VERSION}
|
||||
|
||||
ARG DOKKU_GIT_REV
|
||||
ENV DOKKU_GIT_REV ${DOKKU_GIT_REV}
|
||||
|
||||
ARG IS_RELEASE=false
|
||||
ENV IS_RELEASE ${IS_RELEASE}
|
||||
|
||||
RUN make rpm-herokuish rpm-dokku rpm-plugn rpm-sshcommand rpm-sigil
|
||||
|
||||
RUN mkdir -p /data && cp /tmp/*.rpm /data && ls /data/
|
||||
16
contrib/build-dokku-update.Dockerfile
Normal file
16
contrib/build-dokku-update.Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
FROM dokku/build-base:0.0.1
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
|
||||
ARG WORKDIR=/go/src/github.com/dokku/dokku
|
||||
|
||||
WORKDIR ${WORKDIR}
|
||||
|
||||
COPY . ${WORKDIR}
|
||||
|
||||
RUN make deb-dokku-update rpm-dokku-update
|
||||
|
||||
RUN ls -lha /tmp/
|
||||
42
contrib/build-dokku.Dockerfile
Normal file
42
contrib/build-dokku.Dockerfile
Normal file
@@ -0,0 +1,42 @@
|
||||
FROM dokku/build-base:0.0.1
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
|
||||
ARG GOLANG_VERSION
|
||||
|
||||
RUN wget -qO /tmp/go${GOLANG_VERSION}.linux-amd64.tar.gz https://storage.googleapis.com/golang/go${GOLANG_VERSION}.linux-amd64.tar.gz \
|
||||
&& tar -C /usr/local -xzf /tmp/go${GOLANG_VERSION}.linux-amd64.tar.gz \
|
||||
&& cp /usr/local/go/bin/* /usr/local/bin
|
||||
|
||||
ARG WORKDIR=/go/src/github.com/dokku/dokku
|
||||
|
||||
WORKDIR ${WORKDIR}
|
||||
|
||||
COPY Makefile ${WORKDIR}/
|
||||
COPY *.mk ${WORKDIR}/
|
||||
|
||||
RUN make deb-setup rpm-setup sshcommand plugn
|
||||
|
||||
COPY . ${WORKDIR}
|
||||
|
||||
ARG PLUGIN_MAKE_TARGET
|
||||
ARG DOKKU_VERSION=master
|
||||
ARG DOKKU_GIT_REV
|
||||
ARG IS_RELEASE=false
|
||||
|
||||
ENV GOPATH=/go
|
||||
|
||||
RUN PLUGIN_MAKE_TARGET=${PLUGIN_MAKE_TARGET} \
|
||||
DOKKU_VERSION=${DOKKU_VERSION} \
|
||||
DOKKU_GIT_REV=${DOKKU_GIT_REV} \
|
||||
IS_RELEASE=${IS_RELEASE} \
|
||||
SKIP_GO_CLEAN=true \
|
||||
make version copyfiles \
|
||||
&& rm -rf plugins/common/*.go plugins/common/glide* plugins/common/vendor/ \
|
||||
&& make deb-dokku deb-sshcommand deb-sigil \
|
||||
rpm-dokku rpm-sshcommand rpm-sigil
|
||||
|
||||
RUN ls -lha /tmp/
|
||||
16
contrib/build-herokuish.Dockerfile
Normal file
16
contrib/build-herokuish.Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
FROM dokku/build-base:0.0.1
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
|
||||
ARG WORKDIR=/go/src/github.com/dokku/dokku
|
||||
|
||||
WORKDIR ${WORKDIR}
|
||||
|
||||
COPY . ${WORKDIR}
|
||||
|
||||
RUN make deb-herokuish rpm-herokuish
|
||||
|
||||
RUN ls -lha /tmp/
|
||||
@@ -1,34 +0,0 @@
|
||||
FROM ubuntu:14.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get -y install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
|
||||
|
||||
RUN command -v fpm > /dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
|
||||
WORKDIR /dokku
|
||||
|
||||
COPY Makefile /dokku/
|
||||
|
||||
COPY *.mk /dokku/
|
||||
|
||||
RUN make deb-setup rpm-setup
|
||||
|
||||
COPY . /dokku
|
||||
|
||||
RUN make sshcommand plugn version copyfiles
|
||||
|
||||
ARG DOKKU_VERSION=master
|
||||
ENV DOKKU_VERSION ${DOKKU_VERSION}
|
||||
|
||||
ARG DOKKU_GIT_REV
|
||||
ENV DOKKU_GIT_REV ${DOKKU_GIT_REV}
|
||||
|
||||
ARG IS_RELEASE=false
|
||||
ENV IS_RELEASE ${IS_RELEASE}
|
||||
|
||||
RUN make deb-herokuish deb-dokku deb-plugn deb-sshcommand deb-sigil
|
||||
|
||||
RUN mkdir -p /data && cp /tmp/*.deb /data && ls /data/
|
||||
51
contrib/copy-packages
Normal file
51
contrib/copy-packages
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python2.7
|
||||
import os
|
||||
import requests
|
||||
import shutil
|
||||
import subprocess
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
PACKAGECLOUD_TOKEN = os.getenv('DOKKU_PACKAGECLOUD_TOKEN')
|
||||
|
||||
|
||||
def download_file(filename, url):
|
||||
r = requests.get(url, stream=True)
|
||||
with open(filename, 'wb') as f:
|
||||
shutil.copyfileobj(r.raw, f)
|
||||
|
||||
|
||||
def upload_file(filename):
|
||||
versions = [
|
||||
"bionic",
|
||||
]
|
||||
cmd_template = "package_cloud push dokku/dokku/ubuntu/{0} {1}"
|
||||
for version in versions:
|
||||
cmd = cmd_template.format(version, filename)
|
||||
subprocess.call(cmd, shell=True)
|
||||
|
||||
|
||||
def main():
|
||||
auth = HTTPBasicAuth(PACKAGECLOUD_TOKEN, '')
|
||||
base = requests.get('https://packagecloud.io/api/v1/repos/dokku/dokku/packages/deb/ubuntu/trusty.json',
|
||||
auth=auth)
|
||||
data = base.json()
|
||||
urls = []
|
||||
for package in data:
|
||||
urls.append(package['versions_url'])
|
||||
|
||||
download_urls = {}
|
||||
for url in urls:
|
||||
base = requests.get('https://packagecloud.io{0}'.format(url),
|
||||
auth=auth)
|
||||
data = base.json()
|
||||
for version in data:
|
||||
download_urls['downloads/' + version['filename']] = version['download_url']
|
||||
|
||||
for filename, download_url in download_urls.items():
|
||||
print "downloading", filename
|
||||
download_file(filename, download_url)
|
||||
upload_file(filename)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -10,7 +10,7 @@ import subprocess
|
||||
import sys
|
||||
import threading
|
||||
|
||||
VERSION = 'v0.8.2'
|
||||
VERSION = 'v0.17.6'
|
||||
|
||||
hostname = ''
|
||||
try:
|
||||
@@ -21,7 +21,13 @@ try:
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
key_file = os.getenv('KEY_FILE', '/root/.ssh/authorized_keys')
|
||||
key_file = os.getenv('KEY_FILE', None)
|
||||
if os.path.isfile('/home/ec2-user/.ssh/authorized_keys'):
|
||||
key_file = '/home/ec2-user/.ssh/authorized_keys'
|
||||
elif os.path.isfile('/home/ubuntu/.ssh/authorized_keys'):
|
||||
key_file = '/home/ubuntu/.ssh/authorized_keys'
|
||||
else:
|
||||
key_file = '/root/.ssh/authorized_keys'
|
||||
|
||||
admin_keys = []
|
||||
if os.path.isfile(key_file):
|
||||
@@ -31,6 +37,15 @@ if os.path.isfile(key_file):
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
ufw_display = 'block'
|
||||
try:
|
||||
command = "sudo ufw status"
|
||||
ufw_output = subprocess.check_output(command, shell=True).strip()
|
||||
if "inactive" in ufw_output:
|
||||
ufw_display = 'none'
|
||||
except subprocess.CalledProcessError:
|
||||
ufw_display = 'none'
|
||||
|
||||
|
||||
def check_boot():
|
||||
if 'onboot' not in sys.argv:
|
||||
@@ -71,7 +86,9 @@ def check_boot():
|
||||
class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
content = PAGE.replace('{VERSION}', VERSION)
|
||||
content = content.replace('{UFW_DISPLAY}', ufw_display)
|
||||
content = content.replace('{HOSTNAME}', hostname)
|
||||
content = content.replace('{AUTHORIZED_KEYS_LOCATION}', key_file)
|
||||
content = content.replace('{ADMIN_KEYS}', "\n".join(admin_keys))
|
||||
self.send_response(200)
|
||||
self.end_headers()
|
||||
@@ -120,6 +137,7 @@ class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||
proc.stdin.close()
|
||||
proc.wait()
|
||||
|
||||
set_debconf_selection('boolean', 'nginx_enable', 'true')
|
||||
set_debconf_selection('boolean', 'skip_key_file', 'true')
|
||||
set_debconf_selection('boolean', 'vhost_enable', vhost_enable)
|
||||
set_debconf_selection('boolean', 'web_config', 'false')
|
||||
@@ -210,70 +228,150 @@ def main():
|
||||
PAGE = """
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Dokku Setup</title>
|
||||
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||
<style>
|
||||
.bd-callout {
|
||||
padding: 1.25rem;
|
||||
margin-top: 1.25rem;
|
||||
margin-bottom: 1.25rem;
|
||||
border: 1px solid #eee;
|
||||
border-left-width: .25rem;
|
||||
border-radius: .25rem;
|
||||
}
|
||||
.bd-callout p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.bd-callout-info {
|
||||
border-left-color: #5bc0de;
|
||||
}
|
||||
pre {
|
||||
font-size: 80%;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
h1 small {
|
||||
font-size: 50%;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
.container {
|
||||
width: 640px;
|
||||
}
|
||||
.result {
|
||||
padding-left: 20px;
|
||||
}
|
||||
input.form-control, textarea.form-control {
|
||||
background-color: #fafbfc;
|
||||
font-size: 14px;
|
||||
}
|
||||
input.form-control::placeholder, textarea.form-control::placeholder {
|
||||
color: #adb2b8
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="width: 640px;">
|
||||
<form id="form" role="form">
|
||||
<h1>Dokku Setup <small>{VERSION}</small></h1>
|
||||
<div class="form-group">
|
||||
<h3><small style="text-transform: uppercase;">Admin Access</small></h3>
|
||||
<label for="key">Public Key</label><br />
|
||||
<textarea class="form-control" name="keys" rows="7" id="key">{ADMIN_KEYS}</textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<h3><small style="text-transform: uppercase;">Hostname Configuration</small></h3>
|
||||
<div class="form-group">
|
||||
<label for="hostname">Hostname</label>
|
||||
<input class="form-control" type="text" id="hostname" name="hostname" value="{HOSTNAME}" />
|
||||
<div class="container">
|
||||
<form id="form" role="form">
|
||||
<h1 class="pt-3">Dokku Setup <small class="text-muted">{VERSION}</small></h1>
|
||||
<div class="alert alert-warning small" role="alert">
|
||||
<strong>Warning:</strong> The SSH key filled out here can grant root access to the server. Please complete the setup as soon as possible.
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label><input id="vhost" name="vhost" type="checkbox" value="true"> Use <abbr title="Nginx will be run on port 80 and backend to your apps based on hostname">virtualhost naming</abbr> for apps</label>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>Admin Access</h3>
|
||||
<div class="form-group">
|
||||
<label for="key">Public SSH Keys</label><br />
|
||||
<textarea class="form-control" name="keys" rows="5" id="key" placeholder="Begins with 'ssh-rsa', 'ssh-dss', 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'">{ADMIN_KEYS}</textarea>
|
||||
<small class="form-text text-muted">Public keys allow users to ssh onto the server as the <code>dokku</code> user, as well as remotely execute Dokku commands. They are currently auto-populated from: <code>{AUTHORIZED_KEYS_LOCATION}</code>, and can be changed later via the <a href="http://dokku.viewdocs.io/dokku/deployment/user-management/" target="_blank"><code>dokku ssh-keys</code></a> plugin.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>Your app URLs will look like:</p>
|
||||
<pre id="example">http://hostname:port</pre>
|
||||
</div>
|
||||
<button type="button" onclick="setup()" class="btn btn-primary">Finish Setup</button> <span style="padding-left: 20px;" id="result"></span>
|
||||
</form>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>Hostname Configuration</h3>
|
||||
<div class="form-group">
|
||||
<label for="hostname">Hostname</label>
|
||||
<input class="form-control" type="text" id="hostname" name="hostname" value="{HOSTNAME}" placeholder="A hostname or ip address such as {HOSTNAME}" />
|
||||
<small class="form-text text-muted">This will be used as the default host for all applications, and can be changed later via the <a href="http://dokku.viewdocs.io/dokku/configuration/domains/" target="_blank"><code>dokku domains:set-global</code></a> command.</small>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="vhost" name="vhost" value="true">
|
||||
<label class="form-check-label" for="vhost">Use virtualhost naming for apps</label>
|
||||
<small class="form-text text-muted">When enabled, Nginx will be run on port 80 and proxy requests to apps based on hostname.</small>
|
||||
<small class="form-text text-muted">When disabled, a specific port will be setup for each application on first deploy, and requests to that port will be proxied to the relevant app.</small>
|
||||
</div>
|
||||
<div class="alert alert-warning small mt-3 d-{UFW_DISPLAY}" role="alert">
|
||||
<strong>Warning:</strong> UFW is active. To allow traffic to specific ports, run <code>sudo ufw allow PORT</code> for the port in question.
|
||||
</div>
|
||||
<div class="bd-callout bd-callout-info">
|
||||
<h5>What will app URLs look like?</h5>
|
||||
<pre><code id="example">http://hostname:port</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" onclick="setup()" class="btn btn-primary">Finish Setup</button> <span class="result"></span>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="error-output"></div>
|
||||
<script>
|
||||
var $ = document.querySelector.bind(document)
|
||||
|
||||
function setup() {
|
||||
if ($.trim($("#key").val()) == "") {
|
||||
if ($("#key").value.trim() == "") {
|
||||
alert("Your admin public key cannot be blank.")
|
||||
return
|
||||
}
|
||||
if ($.trim($("#hostname").val()) == "") {
|
||||
if ($("#hostname").value.trim() == "") {
|
||||
alert("Your hostname cannot be blank.")
|
||||
return
|
||||
}
|
||||
data = $("#form").serialize()
|
||||
$("input,textarea,button").prop("disabled", true);
|
||||
$.post('/setup', data)
|
||||
.done(function() {
|
||||
$("#result").html("Success!")
|
||||
window.location.href = "http://progrium.viewdocs.io/dokku/deployment/application-deployment/";
|
||||
var data = new FormData($("#form"))
|
||||
|
||||
var inputs = [].slice.call(document.querySelectorAll("input, textarea, button"))
|
||||
inputs.forEach(function (input) {
|
||||
input.disabled = true
|
||||
})
|
||||
|
||||
var result = $(".result")
|
||||
fetch("/setup", {method: "POST", body: data})
|
||||
.then(function(response) {
|
||||
if (response.ok) {
|
||||
return response.json()
|
||||
} else {
|
||||
throw new Error('Server returned error')
|
||||
}
|
||||
})
|
||||
.then(function(response) {
|
||||
result.classList.add("text-success");
|
||||
result.textContent = "Success! Redirecting in 3 seconds. .."
|
||||
setTimeout(function() {
|
||||
window.location.href = "http://dokku.viewdocs.io/dokku~{VERSION}/deployment/application-deployment/";
|
||||
}, 3000);
|
||||
})
|
||||
.catch(function (error) {
|
||||
result.classList.add("text-danger");
|
||||
result.textContent = "Could not send the request"
|
||||
})
|
||||
.fail(function(data) {
|
||||
$("#result").html("Something went wrong...")
|
||||
$("#error-output").html(data.responseText)
|
||||
});
|
||||
}
|
||||
|
||||
function update() {
|
||||
if ($("#vhost").is(":checked") && $("#hostname").val().match(/^(\d{1,3}\.){3}\d{1,3}$/)) {
|
||||
if ($("#vhost").matches(":checked") && $("#hostname").value.match(/^(\d{1,3}\.){3}\d{1,3}$/)) {
|
||||
alert("In order to use virtualhost naming, the hostname must not be an IP but a valid domain name.")
|
||||
$("#vhost").prop('checked', false);
|
||||
$("#vhost").checked = false;
|
||||
}
|
||||
if ($("#vhost").is(':checked')) {
|
||||
$("#example").html("http://<app-name>."+$("#hostname").val())
|
||||
if ($("#vhost").matches(':checked')) {
|
||||
$("#example").textContent = "http://<app-name>."+$("#hostname").value
|
||||
} else {
|
||||
$("#example").html("http://"+$("#hostname").val()+":<app-port>")
|
||||
$("#example").textContent = "http://"+$("#hostname").value+":<app-port>"
|
||||
}
|
||||
}
|
||||
$("#vhost").change(update);
|
||||
$("#hostname").change(update);
|
||||
$("#vhost").addEventListener("change", update);
|
||||
$("#hostname").addEventListener("input", update);
|
||||
update();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
112
contrib/dokku-update
Executable file
112
contrib/dokku-update
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
shopt -s nullglob
|
||||
|
||||
if [[ -r /etc/default/dokku ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
source /etc/default/dokku
|
||||
fi
|
||||
|
||||
export DOKKU_ROOT=${DOKKU_ROOT:=~dokku}
|
||||
if [[ -f "$DOKKU_ROOT/dokkurc" ]]; then
|
||||
if [[ -r $DOKKU_ROOT/dokkurc ]]; then
|
||||
source "$DOKKU_ROOT/dokkurc"
|
||||
else
|
||||
echo "Unable to read $DOKKU_ROOT/dokkurc for sourcing" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if [[ -d $DOKKU_ROOT/.dokkurc ]]; then
|
||||
for f in $DOKKU_ROOT/.dokkurc/*; do
|
||||
if [[ -r "$f" ]]; then
|
||||
source "$f"
|
||||
else
|
||||
echo "Unable to read $f for sourcing" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
|
||||
export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"}
|
||||
export PLUGIN_PATH=${PLUGIN_PATH:="$DOKKU_LIB_ROOT/plugins"}
|
||||
export PLUGIN_ENABLED_PATH=${PLUGIN_ENABLED_PATH:="$PLUGIN_PATH/enabled"}
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
dokku-log-info() {
|
||||
declare desc="log info formatter"
|
||||
echo "-----> $*"
|
||||
}
|
||||
|
||||
dokku-log-verbose() {
|
||||
declare desc="log verbose formatter"
|
||||
echo " $*"
|
||||
}
|
||||
|
||||
dokku-log-warn() {
|
||||
declare desc="log warning formatter"
|
||||
echo " ! $*" 1>&2
|
||||
}
|
||||
|
||||
dokku-update-plugin() {
|
||||
declare PLUGIN_NAME="$1"
|
||||
if [[ -d "$PLUGIN_ENABLED_PATH/$PLUGIN_NAME/.git" ]]; then
|
||||
dokku-log-verbose "Updating $PLUGIN_NAME"
|
||||
dokku plugin:update "$PLUGIN_NAME"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
declare COMMAND="$1"
|
||||
local DOKKU_DISTRO PLUGIN_NAME VERSION
|
||||
|
||||
if [[ -f "/etc/os-release" ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
DOKKU_DISTRO=$(. /etc/os-release && echo "$ID")
|
||||
fi
|
||||
|
||||
if [[ "$COMMAND" == "version" ]] || [[ "$COMMAND" == "-v" ]]; then
|
||||
VERSION=UNRELEASED
|
||||
if [[ -f "/var/lib/dokku-update/VERSION" ]]; then
|
||||
VERSION="$(cat /var/lib/dokku-update/VERSION)"
|
||||
fi
|
||||
echo "dokku-update ${VERSION}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
dokku-log-info "Running system updates"
|
||||
case "$DOKKU_DISTRO" in
|
||||
arch)
|
||||
yaourt -Syyua
|
||||
;;
|
||||
debian | ubuntu)
|
||||
apt-get update -qq >/dev/null
|
||||
apt-get -qq -y --force-yes dist-upgrade
|
||||
;;
|
||||
centos | opensuse | rhel)
|
||||
dokku-log-warn "Updating this operating system is not supported"
|
||||
;;
|
||||
*)
|
||||
dokku-log-warn "Updating this operating system is not supported"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# update all plugins
|
||||
dokku-log-info "Updating all plugins"
|
||||
for PLUGIN_NAME in $(dokku plugin:list | grep enabled | awk '$1=$1' | cut -d' ' -f1); do
|
||||
dokku-update-plugin "$PLUGIN_NAME"
|
||||
done
|
||||
dokku plugin:install
|
||||
|
||||
# rebuild all applications
|
||||
dokku-log-info "Rebuilding all applications"
|
||||
dokku ps:rebuildall
|
||||
|
||||
dokku-log-info "Waiting for old containers to stop"
|
||||
sleep 120
|
||||
dokku-log-info "Cleaning up"
|
||||
dokku cleanup --global
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
export DOKKU_PORT=${DOKKU_PORT:=22}
|
||||
export DOKKU_HOST=${DOKKU_HOST:=}
|
||||
|
||||
@@ -48,7 +49,7 @@ fn-dokku-host() {
|
||||
declare DOKKU_GIT_REMOTE="$1" DOKKU_HOST="$2"
|
||||
|
||||
if [[ -z "$DOKKU_HOST" ]]; then
|
||||
if [[ -d .git ]] || git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
if [[ -d .git ]] || git rev-parse --git-dir >/dev/null 2>&1; then
|
||||
DOKKU_HOST=$(git remote -v 2>/dev/null | grep -Ei "^${DOKKU_GIT_REMOTE}\s" | head -n 1 | cut -f1 -d' ' | cut -f2 -d '@' | cut -f1 -d':' 2>/dev/null || true)
|
||||
fi
|
||||
fi
|
||||
@@ -56,7 +57,7 @@ fn-dokku-host() {
|
||||
if [[ -z "$DOKKU_HOST" ]]; then
|
||||
fn-client-help-msg
|
||||
fi
|
||||
|
||||
|
||||
echo "$DOKKU_HOST"
|
||||
}
|
||||
|
||||
@@ -67,7 +68,7 @@ main() {
|
||||
|
||||
for arg in "$@"; do
|
||||
if [[ "$skip" == "true" ]]; then
|
||||
next_index=$(( next_index + 1 ))
|
||||
next_index=$((next_index + 1))
|
||||
skip=false
|
||||
continue
|
||||
fi
|
||||
@@ -92,13 +93,13 @@ main() {
|
||||
cmd_set=true
|
||||
fi
|
||||
fi
|
||||
next_index=$(( next_index + 1 ))
|
||||
next_index=$((next_index + 1))
|
||||
done
|
||||
|
||||
DOKKU_REMOTE_HOST="$(fn-dokku-host "$DOKKU_GIT_REMOTE" "$DOKKU_HOST")"
|
||||
|
||||
if [[ -z "$APP" ]]; then
|
||||
if [[ -d .git ]] || git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
if [[ -d .git ]] || git rev-parse --git-dir >/dev/null 2>&1; then
|
||||
set +e
|
||||
APP=$(git remote -v 2>/dev/null | grep -Ei "dokku@$DOKKU_REMOTE_HOST" | head -n 1 | cut -f2 -d'@' | cut -f1 -d' ' | cut -f2 -d':' 2>/dev/null)
|
||||
set -e
|
||||
@@ -112,20 +113,20 @@ main() {
|
||||
if [[ -z "$APP_ARG" ]]; then
|
||||
APP=$(fn-random-name)
|
||||
counter=0
|
||||
while ssh -p "$DOKKU_PORT" "dokku@$DOKKU_REMOTE_HOST" apps 2>/dev/null| grep -q "$APP"; do
|
||||
while ssh -p "$DOKKU_PORT" "dokku@$DOKKU_REMOTE_HOST" apps 2>/dev/null | grep -q "$APP"; do
|
||||
if [[ $counter -ge 100 ]]; then
|
||||
echo "Error: could not reasonably generate a new app name. try cleaning up some apps..."
|
||||
ssh -p "$DOKKU_PORT" "dokku@$DOKKU_REMOTE_HOST" apps
|
||||
exit 1
|
||||
else
|
||||
APP=$(random_name)
|
||||
counter=$((counter+1))
|
||||
counter=$((counter + 1))
|
||||
fi
|
||||
done
|
||||
else
|
||||
APP="$APP_ARG"
|
||||
fi
|
||||
if git remote add dokku "dokku@$DOKKU_REMOTE_HOST:$APP"; then
|
||||
if git remote add "$DOKKU_GIT_REMOTE" "dokku@$DOKKU_REMOTE_HOST:$APP"; then
|
||||
echo "-----> Dokku remote added at ${DOKKU_REMOTE_HOST} called ${DOKKU_GIT_REMOTE}"
|
||||
echo "-----> Application name is ${APP}"
|
||||
else
|
||||
@@ -139,7 +140,7 @@ main() {
|
||||
esac
|
||||
|
||||
[[ " apps certs help ls nginx shell storage trace version " == *" $CMD "* ]] && unset APP
|
||||
[[ " certs:chain domains:add-global domains:remove-global domains:set-global ps:rebuildall ps:restartall ps:restore " == *" $CMD "* ]] && unset APP
|
||||
[[ " certs:chain domains:add-global domains:remove-global domains:set-global ps:rebuildall ps:restartall ps:restore ps:startall ps:stopall " == *" $CMD "* ]] && unset APP
|
||||
[[ "$CMD" =~ events*|plugin*|ssh-keys* ]] && unset APP
|
||||
[[ -n "$APP_ARG" ]] && [[ "$APP_ARG" == "--global" ]] && unset APP
|
||||
[[ -n "$@" ]] && [[ -n "$APP" ]] && app_arg="--app $APP"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"sleep 30",
|
||||
|
||||
"echo '--> Updating apt repositories'",
|
||||
"sudo apt-get update -qq > /dev/null",
|
||||
"sudo apt-get update -qq >/dev/null",
|
||||
|
||||
"echo '--> Installing make requirement'",
|
||||
"sudo apt-get -qq -y install build-essential",
|
||||
|
||||
373
contrib/release-dokku
Executable file
373
contrib/release-dokku
Executable file
@@ -0,0 +1,373 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
readonly ROOT_DIR="$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)"
|
||||
readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-release.XXXX")"
|
||||
readonly DOKKU_GIT_REV="$(git rev-parse HEAD)"
|
||||
|
||||
trap 'rm -rf "$TMP_WORK_DIR" >/dev/null' RETURN INT TERM EXIT
|
||||
|
||||
log-info() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log info formatter"
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
log-error() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log error formatter"
|
||||
echo "! $*" 1>&2
|
||||
}
|
||||
|
||||
log-fail() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log fail formatter"
|
||||
log-error "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
fn-build-dokku() {
|
||||
declare desc="Builds dokku packages within a docker container"
|
||||
declare IS_RELEASE="$1" DOKKU_VERSION="$2"
|
||||
local NAME GOLANG_VERSION
|
||||
|
||||
if [[ -z "$DOKKU_VERSION" ]]; then
|
||||
log-error "Invalid deb file specified"
|
||||
return 1
|
||||
fi
|
||||
|
||||
NAME="dokku:build"
|
||||
[[ "$IS_RELEASE" == "true" ]] && NAME="dokku:build-release"
|
||||
[[ -n "$DOKKU_VERSION" ]] || DOKKU_VERSION="master"
|
||||
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
GOLANG_VERSION="$(grep BUILD_IMAGE common.mk | cut -d' ' -f3 | cut -d':' -f2)"
|
||||
docker build \
|
||||
--build-arg DOKKU_VERSION="$DOKKU_VERSION" \
|
||||
--build-arg DOKKU_GIT_REV="$DOKKU_GIT_REV" \
|
||||
--build-arg IS_RELEASE="$IS_RELEASE" \
|
||||
--build-arg PLUGIN_MAKE_TARGET="build" \
|
||||
--build-arg GOLANG_VERSION="$GOLANG_VERSION" \
|
||||
-f "contrib/build-dokku.Dockerfile" \
|
||||
-t "$NAME" .
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-extract-package() {
|
||||
declare desc="Extract packages from a docker container to the root directory"
|
||||
declare IS_RELEASE="$1" PACKAGE_NAME="$2"
|
||||
local NAME
|
||||
|
||||
if [[ -z "$PACKAGE_NAME" ]]; then
|
||||
log-error "Invalid deb file specified"
|
||||
return 1
|
||||
fi
|
||||
|
||||
NAME="dokku:build"
|
||||
[[ "$IS_RELEASE" == "true" ]] && NAME="dokku:build-release"
|
||||
|
||||
log-info "(extract-package) writing ${PACKAGE_NAME} to correct path"
|
||||
docker run --rm --entrypoint cat "$NAME" "/tmp/${PACKAGE_NAME}" >"${ROOT_DIR}/build/${PACKAGE_NAME}"
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-in-array() {
|
||||
declare desc="return true if value ($1) is in list (all other arguments)"
|
||||
|
||||
local e
|
||||
for e in "${@:2}"; do
|
||||
[[ "$e" == "$1" ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
fn-is-release() {
|
||||
declare desc="Checks if a given run is a release run"
|
||||
declare RELEASE="$1"
|
||||
local IS_RELEASE=false
|
||||
if [[ "$RELEASE" == "major" ]] || [[ "$RELEASE" == "minor" ]] || [[ "$RELEASE" == "patch" ]]; then
|
||||
IS_RELEASE=true
|
||||
fi
|
||||
|
||||
echo "$IS_RELEASE"
|
||||
}
|
||||
|
||||
fn-version-current() {
|
||||
declare desc="Retrieves the current version of dokku"
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
grep Version debian/control | cut -d' ' -f2
|
||||
}
|
||||
|
||||
fn-version-next() {
|
||||
declare desc="Calculates the next version name of dokku"
|
||||
declare CURRENT_VERSION="$1" RELEASE="$2"
|
||||
local major minor patch short_object
|
||||
|
||||
major=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[1]}')
|
||||
minor=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[2]}')
|
||||
patch=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[3]}')
|
||||
|
||||
if [[ "$RELEASE" == "major" ]]; then
|
||||
major=$((major + 1))
|
||||
minor="0"
|
||||
patch="0"
|
||||
elif [[ "$RELEASE" == "minor" ]]; then
|
||||
minor=$((minor + 1))
|
||||
patch="0"
|
||||
elif [[ "$RELEASE" == "patch" ]]; then
|
||||
patch=$((patch + 1))
|
||||
else
|
||||
short_object=$(git log --oneline | tail -n 1 | cut -d' ' -f1)
|
||||
echo "${CURRENT_VERSION}build+$(echo "$DOKKU_GIT_REV" | cut -c1-${#short_object})"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "${major}.${minor}.${patch}"
|
||||
}
|
||||
|
||||
fn-publish-package() {
|
||||
declare desc="Publishes a package to packagecloud"
|
||||
declare IS_RELEASE="$1" RELEASE_TYPE="$2" PACKAGE_NAME="$3"
|
||||
local REPOSITORY=dokku/dokku-betafish DIST=ubuntu EXIT_CODE=0
|
||||
local OS_ID ex
|
||||
|
||||
[[ "$IS_RELEASE" == "true" ]] && REPOSITORY=dokku/dokku
|
||||
[[ "$RELEASE_TYPE" == "rpm" ]] && DIST=el/7
|
||||
|
||||
if [[ "$DIST" == "ubuntu" ]]; then
|
||||
OS_IDS=("trusty" "utopic" "vivid" "wily" "xenial" "yakkety" "zesty" "artful" "bionic")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-dokku) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
|
||||
DIST=debian
|
||||
OS_IDS=("wheezy" "jessie" "stretch" "buster")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-dokku) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log-info "(release-dokku) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}" "$PACKAGE_NAME"
|
||||
EXIT_CODE="$?"
|
||||
fi
|
||||
return "$EXIT_CODE"
|
||||
}
|
||||
|
||||
fn-replace-version() {
|
||||
declare desc="Replaces the version within a file"
|
||||
local CURRENT_VERSION="$1"
|
||||
local NEXT_VERSION="$2"
|
||||
local FILENAME="$3"
|
||||
sed -i.bak "s/${CURRENT_VERSION//./\.}/$NEXT_VERSION/g" "$FILENAME" && rm "$FILENAME.bak"
|
||||
git add "$FILENAME"
|
||||
}
|
||||
|
||||
fn-repo-merged-requests() {
|
||||
declare desc="Retrieves all pull request ids since a given release of dokku"
|
||||
declare TAG="$1"
|
||||
git log "v${TAG}..HEAD" --oneline | grep "Merge pull request" | cut -d' ' -f 5 | cut -d '#' -f2
|
||||
}
|
||||
|
||||
fn-repo-push-tags() {
|
||||
declare desc="Pushes tags and the repository to github"
|
||||
declare IS_RELEASE="$1"
|
||||
|
||||
if [[ "$IS_RELEASE" == "false" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
git push --tags origin master
|
||||
}
|
||||
|
||||
fn-repo-update() {
|
||||
declare desc="Updates files within the repository for a given release"
|
||||
declare IS_RELEASE="$1" CURRENT_VERSION="$2" NEXT_VERSION="$3"
|
||||
|
||||
log-info "(release-dokku) Replacing ${CURRENT_VERSION} with ${NEXT_VERSION}"
|
||||
for f in plugins/*/plugin.toml; do
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" "$f"
|
||||
done
|
||||
|
||||
if [[ "$IS_RELEASE" == "false" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" contrib/dokku-installer.py
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" debian/control
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/advanced-usage/plugin-management.md
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/favicons/browserconfig.xml
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/favicons/manifest.json
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/style.css
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/development/release-process.md
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/home.html
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/getting-started/installation.md
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/template.html
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" README.md
|
||||
|
||||
if [[ "$RELEASE" == 'patch' ]]; then
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/versions.json
|
||||
else
|
||||
versions=$(python -c 'import json,sys;d=json.load(sys.stdin);d["max-versions"].append("'"${NEXT_VERSION}"'"); print(json.dumps(d, indent=2, sort_keys=True))' <docs/assets/versions.json)
|
||||
echo "$versions" >docs/assets/versions.json
|
||||
git add docs/assets/versions.json
|
||||
fi
|
||||
|
||||
if [[ "$IS_RELEASE" == "false" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
log-info "(release-dokku) Adding HISTORY.md, committing and tagging"
|
||||
fn-repo-update-history-and-commit "$CURRENT_VERSION" "$NEXT_VERSION"
|
||||
git tag "v${NEXT_VERSION}"
|
||||
}
|
||||
|
||||
fn-repo-update-history-and-commit() {
|
||||
declare desc="Updates the history file and commits the changes"
|
||||
declare CURRENT_VERSION="$1" NEXT_VERSION="$2"
|
||||
local PULL_REQUEST_ID TITLE AUTHOR TYPE CHANGELOG_TEXT
|
||||
local COMMIT_MESSAGE HISTORY HISTORY_CONTENTS HISTORY_DOCUMENTATION HISTORY_ENHANCEMENT HISTORY_BUG HISTORY_OTHER HISTORY_TESTS ISSUE_FILE
|
||||
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
|
||||
mkdir -p /tmp/github-data
|
||||
|
||||
for PULL_REQUEST_ID in $(fn-repo-merged-requests "$CURRENT_VERSION"); do
|
||||
ISSUE_FILE="/tmp/github-data/${PULL_REQUEST_ID}.json"
|
||||
if [[ ! -f "$ISSUE_FILE" ]]; then
|
||||
curl -sS "https://api.github.com/repos/dokku/dokku/issues/${PULL_REQUEST_ID}" >"$ISSUE_FILE"
|
||||
fi
|
||||
|
||||
TITLE="$(jq -r '.title' "$ISSUE_FILE")"
|
||||
AUTHOR="$(jq -r '.user.login' "$ISSUE_FILE")"
|
||||
TYPE="$(jq -r '.labels[] | select( .name | contains("type") ) | .name' "$ISSUE_FILE" | cut -d' ' -f2)"
|
||||
CHANGELOG_TEXT="- #${PULL_REQUEST_ID}: @${AUTHOR} ${TITLE}"
|
||||
|
||||
if [[ "$TYPE" == "bug" ]]; then
|
||||
HISTORY_BUG="${HISTORY_BUG}"$'\n'"$CHANGELOG_TEXT"
|
||||
elif [[ "$TYPE" == "documentation" ]]; then
|
||||
HISTORY_DOCUMENTATION="${HISTORY_DOCUMENTATION}"$'\n'"$CHANGELOG_TEXT"
|
||||
elif [[ "$TYPE" == "enhancement" ]] || [[ "$TYPE" == "refactor" ]]; then
|
||||
HISTORY_ENHANCEMENT="${HISTORY_ENHANCEMENT}"$'\n'"$CHANGELOG_TEXT"
|
||||
elif [[ "$TYPE" == "tests" ]]; then
|
||||
HISTORY_TESTS="${HISTORY_TESTS}"$'\n'"$CHANGELOG_TEXT"
|
||||
else
|
||||
HISTORY_OTHER="${HISTORY_OTHER}"$'\n'"$CHANGELOG_TEXT"
|
||||
fi
|
||||
done
|
||||
|
||||
HISTORY="# History"
|
||||
HISTORY="${HISTORY}"$'\n\n'"## ${NEXT_VERSION}"
|
||||
HISTORY="${HISTORY}"$'\n\n'"Install/update via the bootstrap script:"
|
||||
HISTORY="${HISTORY}"$'\n\n'"\`\`\`shell"
|
||||
HISTORY="${HISTORY}"$'\n'"wget https://raw.githubusercontent.com/dokku/dokku/v${NEXT_VERSION}/bootstrap.sh"
|
||||
HISTORY="${HISTORY}"$'\n'"sudo DOKKU_TAG=v${NEXT_VERSION} bash bootstrap.sh"
|
||||
HISTORY="${HISTORY}"$'\n'"\`\`\`"
|
||||
|
||||
if [[ "$HISTORY_BUG" ]]; then
|
||||
HISTORY="${HISTORY}"$'\n\n'"### Bug Fixes"
|
||||
HISTORY="${HISTORY}"$'\n'"$HISTORY_BUG"
|
||||
fi
|
||||
|
||||
if [[ "$HISTORY_ENHANCEMENT" ]]; then
|
||||
HISTORY="${HISTORY}"$'\n\n'"### New Features"
|
||||
HISTORY="${HISTORY}"$'\n'"$HISTORY_ENHANCEMENT"
|
||||
fi
|
||||
|
||||
if [[ "$HISTORY_DOCUMENTATION" ]]; then
|
||||
HISTORY="${HISTORY}"$'\n\n'"### Documentation"
|
||||
HISTORY="${HISTORY}"$'\n'"$HISTORY_DOCUMENTATION"
|
||||
fi
|
||||
|
||||
if [[ "$HISTORY_TESTS" ]]; then
|
||||
HISTORY="${HISTORY}"$'\n\n'"### Tests"
|
||||
HISTORY="${HISTORY}"$'\n'"$HISTORY_TESTS"
|
||||
fi
|
||||
|
||||
if [[ "$HISTORY_OTHER" ]]; then
|
||||
HISTORY="${HISTORY}"$'\n\n'"### Other"
|
||||
HISTORY="${HISTORY}"$'\n'"$HISTORY_OTHER"
|
||||
fi
|
||||
|
||||
sed -i.bak '1d' HISTORY.md && rm HISTORY.md.bak
|
||||
HISTORY_CONTENTS="$(cat HISTORY.md)"
|
||||
echo -e "$HISTORY\n$HISTORY_CONTENTS" >HISTORY.md
|
||||
git add HISTORY.md
|
||||
|
||||
COMMIT_MESSAGE="Release ${NEXT_VERSION}"$'\n\n'"${HISTORY}"
|
||||
git commit -m "${COMMIT_MESSAGE}"
|
||||
}
|
||||
|
||||
fn-require-bin() {
|
||||
declare desc="Checks that a binary exists"
|
||||
declare BINARY="$1"
|
||||
if ! command -v "$BINARY" &>/dev/null; then
|
||||
log-fail "Missing ${BINARY}, please install it"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
declare RELEASE="$1"
|
||||
local CURRENT_VERSION NEXT_VERSION IS_RELEASE
|
||||
local VALID_RELEASE_LEVELS=("major" "minor" "patch" "betafish" "build")
|
||||
|
||||
if [[ "$RELEASE" == '--trace' ]]; then
|
||||
shift 1
|
||||
RELEASE="$1"
|
||||
TRACE=1 && set -x
|
||||
fi
|
||||
|
||||
if [[ -z "$RELEASE" ]]; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], none given"
|
||||
fi
|
||||
|
||||
if ! fn-in-array "$RELEASE" "${VALID_RELEASE_LEVELS[@]}"; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], '${RELEASE}' given"
|
||||
fi
|
||||
|
||||
log-info "Creating $RELEASE release"
|
||||
|
||||
mkdir -p "build"
|
||||
fn-require-bin "docker"
|
||||
fn-require-bin "git"
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-require-bin "package_cloud"
|
||||
[[ -n "$PACKAGECLOUD_TOKEN" ]] || log-fail "Missing PACKAGECLOUD_TOKEN environment variable"
|
||||
fi
|
||||
|
||||
CURRENT_VERSION="$(fn-version-current)"
|
||||
NEXT_VERSION="$(fn-version-next "$CURRENT_VERSION" "$RELEASE")"
|
||||
IS_RELEASE="$(fn-is-release "$RELEASE")"
|
||||
|
||||
fn-repo-update "$IS_RELEASE" "$CURRENT_VERSION" "$NEXT_VERSION"
|
||||
fn-build-dokku "$IS_RELEASE" "$NEXT_VERSION" || log-fail "Error building package"
|
||||
fn-extract-package "$IS_RELEASE" "dokku_${NEXT_VERSION}_amd64.deb" || log-fail "Error extracting deb package"
|
||||
fn-extract-package "$IS_RELEASE" "dokku-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error extracting rpm package"
|
||||
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-publish-package "$IS_RELEASE" "deb" "build/dokku_${NEXT_VERSION}_amd64.deb" || log-fail "Error publishing deb package"
|
||||
fn-publish-package "$IS_RELEASE" "rpm" "build/dokku-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error publishing rpm package"
|
||||
fn-repo-push-tags "$IS_RELEASE"
|
||||
fi
|
||||
|
||||
if [[ "$IS_RELEASE" != "true" ]]; then
|
||||
git reset -q HEAD plugins/*/plugin.toml
|
||||
git checkout -- plugins/*/plugin.toml
|
||||
fi
|
||||
|
||||
echo "build/dokku_${NEXT_VERSION}_amd64.deb" >build/deb-filename
|
||||
echo "build/dokku-${NEXT_VERSION}-1.x86_64.rpm" >build/rpm-filename
|
||||
}
|
||||
|
||||
main "$@"
|
||||
160
contrib/release-dokku-update
Executable file
160
contrib/release-dokku-update
Executable file
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
readonly ROOT_DIR="$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)"
|
||||
readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-release.XXXX")"
|
||||
readonly DOKKU_GIT_REV="$(git rev-parse HEAD)"
|
||||
|
||||
trap 'rm -rf "$TMP_WORK_DIR" >/dev/null' RETURN INT TERM EXIT
|
||||
|
||||
log-info() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log info formatter"
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
log-error() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log error formatter"
|
||||
echo "! $*" 1>&2
|
||||
}
|
||||
|
||||
log-fail() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log fail formatter"
|
||||
log-error "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
fn-build-dokku() {
|
||||
declare desc="Builds dokku packages within a docker container"
|
||||
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
docker build \
|
||||
-f "contrib/build-dokku-update.Dockerfile" \
|
||||
-t dokku-update:build .
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-extract-package() {
|
||||
declare desc="Extract packages from a docker container to the root directory"
|
||||
declare PACKAGE_NAME="$1"
|
||||
|
||||
if [[ -z "$PACKAGE_NAME" ]]; then
|
||||
log-error "Invalid deb file specified"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log-info "(extract-package) writing ${PACKAGE_NAME} to correct path"
|
||||
docker run --rm --entrypoint cat dokku-update:build "/tmp/${PACKAGE_NAME}" >"${ROOT_DIR}/build/${PACKAGE_NAME}"
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-publish-package() {
|
||||
declare desc="Publishes a package to packagecloud"
|
||||
declare IS_RELEASE="$1" RELEASE_TYPE="$2" PACKAGE_NAME="$3"
|
||||
local REPOSITORY=dokku/dokku-betafish DIST=ubuntu
|
||||
local OS_ID ex EXIT_CODE=0
|
||||
|
||||
[[ "$IS_RELEASE" == "true" ]] && REPOSITORY=dokku/dokku
|
||||
[[ "$RELEASE_TYPE" == "rpm" ]] && DIST=el/7
|
||||
|
||||
if [[ "$DIST" == "ubuntu" ]]; then
|
||||
OS_IDS=("trusty" "utopic" "vivid" "wily" "xenial" "yakkety" "zesty" "artful" "bionic")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-dokku-update) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
|
||||
DIST=debian
|
||||
OS_IDS=("wheezy" "jessie" "stretch" "buster")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-dokku-update) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log-info "(release-dokku-update) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}" "$PACKAGE_NAME"
|
||||
EXIT_CODE="$?"
|
||||
fi
|
||||
return "$EXIT_CODE"
|
||||
}
|
||||
|
||||
fn-in-array() {
|
||||
declare desc="return true if value ($1) is in list (all other arguments)"
|
||||
|
||||
local e
|
||||
for e in "${@:2}"; do
|
||||
[[ "$e" == "$1" ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
fn-is-release() {
|
||||
declare desc="Checks if a given run is a release run"
|
||||
declare RELEASE="$1"
|
||||
local IS_RELEASE=false
|
||||
if [[ "$RELEASE" == "major" ]] || [[ "$RELEASE" == "minor" ]] || [[ "$RELEASE" == "patch" ]]; then
|
||||
IS_RELEASE=true
|
||||
fi
|
||||
|
||||
echo "$IS_RELEASE"
|
||||
}
|
||||
|
||||
fn-require-bin() {
|
||||
declare desc="Checks that a binary exists"
|
||||
declare BINARY="$1"
|
||||
if ! command -v "$BINARY" &>/dev/null; then
|
||||
log-fail "Missing ${BINARY}, please install it"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
declare RELEASE="$1"
|
||||
local NEXT_VERSION
|
||||
local VALID_RELEASE_LEVELS=("major" "minor" "patch" "betafish" "build")
|
||||
|
||||
if [[ "$RELEASE" == '--trace' ]]; then
|
||||
shift 1
|
||||
RELEASE="$1"
|
||||
TRACE=1 && set -x
|
||||
fi
|
||||
|
||||
if [[ -z "$RELEASE" ]]; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], none given"
|
||||
fi
|
||||
|
||||
if ! fn-in-array "$RELEASE" "${VALID_RELEASE_LEVELS[@]}"; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], '${RELEASE}' given"
|
||||
fi
|
||||
|
||||
mkdir -p "build"
|
||||
fn-require-bin "docker"
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-require-bin "package_cloud"
|
||||
[[ -n "$PACKAGECLOUD_TOKEN" ]] || log-fail "Missing PACKAGECLOUD_TOKEN environment variable"
|
||||
fi
|
||||
|
||||
NEXT_VERSION="$(grep DOKKU_UPDATE_VERSION deb.mk | head -n1 | cut -d'=' -f2 | xargs)"
|
||||
IS_RELEASE="$(fn-is-release "$RELEASE")"
|
||||
|
||||
fn-build-dokku || log-fail "Error building package"
|
||||
fn-extract-package "dokku-update_${NEXT_VERSION}_amd64.deb" || log-fail "Error extracting deb package"
|
||||
fn-extract-package "dokku-update-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error extracting rpm package"
|
||||
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-publish-package "$IS_RELEASE" "deb" "build/dokku-update_${NEXT_VERSION}_amd64.deb" || log-fail "Error publishing deb package"
|
||||
fn-publish-package "$IS_RELEASE" "rpm" "build/dokku-update-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error publishing rpm package"
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
160
contrib/release-herokuish
Executable file
160
contrib/release-herokuish
Executable file
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
readonly ROOT_DIR="$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)"
|
||||
readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-release.XXXX")"
|
||||
readonly DOKKU_GIT_REV="$(git rev-parse HEAD)"
|
||||
|
||||
trap 'rm -rf "$TMP_WORK_DIR" >/dev/null' RETURN INT TERM EXIT
|
||||
|
||||
log-info() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log info formatter"
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
log-error() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log error formatter"
|
||||
echo "! $*" 1>&2
|
||||
}
|
||||
|
||||
log-fail() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log fail formatter"
|
||||
log-error "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
fn-build-dokku() {
|
||||
declare desc="Builds dokku packages within a docker container"
|
||||
|
||||
pushd "$ROOT_DIR" >/dev/null
|
||||
docker build \
|
||||
-f "contrib/build-herokuish.Dockerfile" \
|
||||
-t herokuish:build .
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-extract-package() {
|
||||
declare desc="Extract packages from a docker container to the root directory"
|
||||
declare PACKAGE_NAME="$1"
|
||||
|
||||
if [[ -z "$PACKAGE_NAME" ]]; then
|
||||
log-error "Invalid deb file specified"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log-info "(extract-package) writing ${PACKAGE_NAME} to correct path"
|
||||
docker run --rm --entrypoint cat herokuish:build "/tmp/${PACKAGE_NAME}" >"${ROOT_DIR}/build/${PACKAGE_NAME}"
|
||||
return "$?"
|
||||
}
|
||||
|
||||
fn-publish-package() {
|
||||
declare desc="Publishes a package to packagecloud"
|
||||
declare IS_RELEASE="$1" RELEASE_TYPE="$2" PACKAGE_NAME="$3"
|
||||
local REPOSITORY=dokku/dokku-betafish DIST=ubuntu
|
||||
local OS_ID ex EXIT_CODE=0
|
||||
|
||||
[[ "$IS_RELEASE" == "true" ]] && REPOSITORY=dokku/dokku
|
||||
[[ "$RELEASE_TYPE" == "rpm" ]] && DIST=el/7
|
||||
|
||||
if [[ "$DIST" == "ubuntu" ]]; then
|
||||
OS_IDS=("trusty" "utopic" "vivid" "wily" "xenial" "yakkety" "zesty" "artful" "bionic")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-herokuish) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
|
||||
DIST=debian
|
||||
OS_IDS=("wheezy" "jessie" "stretch" "buster")
|
||||
for OS_ID in "${OS_IDS[@]}"; do
|
||||
log-info "(release-herokuish) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
|
||||
ex="$?"
|
||||
if [[ "$ex" -ne "0" ]]; then
|
||||
EXIT_CODE="$ex"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log-info "(release-herokuish) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
|
||||
package_cloud push "${REPOSITORY}/${DIST}" "$PACKAGE_NAME"
|
||||
EXIT_CODE="$?"
|
||||
fi
|
||||
return "$EXIT_CODE"
|
||||
}
|
||||
|
||||
fn-in-array() {
|
||||
declare desc="return true if value ($1) is in list (all other arguments)"
|
||||
|
||||
local e
|
||||
for e in "${@:2}"; do
|
||||
[[ "$e" == "$1" ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
fn-is-release() {
|
||||
declare desc="Checks if a given run is a release run"
|
||||
declare RELEASE="$1"
|
||||
local IS_RELEASE=false
|
||||
if [[ "$RELEASE" == "major" ]] || [[ "$RELEASE" == "minor" ]] || [[ "$RELEASE" == "patch" ]]; then
|
||||
IS_RELEASE=true
|
||||
fi
|
||||
|
||||
echo "$IS_RELEASE"
|
||||
}
|
||||
|
||||
fn-require-bin() {
|
||||
declare desc="Checks that a binary exists"
|
||||
declare BINARY="$1"
|
||||
if ! command -v "$BINARY" &>/dev/null; then
|
||||
log-fail "Missing ${BINARY}, please install it"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
declare RELEASE="$1"
|
||||
local NEXT_VERSION
|
||||
local VALID_RELEASE_LEVELS=("major" "minor" "patch" "betafish" "build")
|
||||
|
||||
if [[ "$RELEASE" == '--trace' ]]; then
|
||||
shift 1
|
||||
RELEASE="$1"
|
||||
TRACE=1 && set -x
|
||||
fi
|
||||
|
||||
if [[ -z "$RELEASE" ]]; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], none given"
|
||||
fi
|
||||
|
||||
if ! fn-in-array "$RELEASE" "${VALID_RELEASE_LEVELS[@]}"; then
|
||||
log-fail "Argument 1 must be one of [major, minor, patch, betafish, build], '${RELEASE}' given"
|
||||
fi
|
||||
|
||||
mkdir -p "build"
|
||||
fn-require-bin "docker"
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-require-bin "package_cloud"
|
||||
[[ -n "$PACKAGECLOUD_TOKEN" ]] || log-fail "Missing PACKAGECLOUD_TOKEN environment variable"
|
||||
fi
|
||||
|
||||
NEXT_VERSION="$(grep HEROKUISH_VERSION deb.mk | head -n1 | cut -d'=' -f2 | xargs)"
|
||||
IS_RELEASE="$(fn-is-release "$RELEASE")"
|
||||
|
||||
fn-build-dokku || log-fail "Error building package"
|
||||
fn-extract-package "herokuish_${NEXT_VERSION}_amd64.deb" || log-fail "Error extracting deb package"
|
||||
fn-extract-package "herokuish-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error extracting rpm package"
|
||||
|
||||
if [[ "$RELEASE" != "build" ]]; then
|
||||
fn-publish-package "$IS_RELEASE" "deb" "build/herokuish_${NEXT_VERSION}_amd64.deb" || log-fail "Error publishing deb package"
|
||||
fn-publish-package "$IS_RELEASE" "rpm" "build/herokuish-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error publishing rpm package"
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
175
contrib/release-plugin
Executable file
175
contrib/release-plugin
Executable file
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-plugin-release.XXXX")"
|
||||
|
||||
trap 'rm -rf "$TMP_WORK_DIR" >/dev/null' RETURN INT TERM EXIT
|
||||
|
||||
log-info() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log info formatter"
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
log-error() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log error formatter"
|
||||
echo "! $*" 1>&2
|
||||
}
|
||||
|
||||
log-fail() {
|
||||
# shellcheck disable=SC2034
|
||||
declare desc="Log fail formatter"
|
||||
log-error "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
fn-github-download-release() {
|
||||
declare REPO_NAME="$1" VERSION="$2"
|
||||
|
||||
if [[ -n "$DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN" ]]; then
|
||||
curl -L "https://api.github.com/repos/${REPO_NAME}/tarball/${VERSION}?access_token=${DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN}"
|
||||
else
|
||||
curl -L "https://api.github.com/repos/${REPO_NAME}/tarball/${VERSION}"
|
||||
fi
|
||||
}
|
||||
|
||||
fn-replace-version() {
|
||||
declare desc="Replaces the version within a file"
|
||||
local CURRENT_VERSION="$1"
|
||||
local NEXT_VERSION="$2"
|
||||
local FILENAME="$3"
|
||||
sed -i.bak "s/${CURRENT_VERSION//./\.}/$NEXT_VERSION/g" "$FILENAME" && rm "$FILENAME.bak"
|
||||
git add "$FILENAME"
|
||||
}
|
||||
|
||||
fn-require-bin() {
|
||||
declare desc="Checks that a binary exists"
|
||||
declare BINARY="$1"
|
||||
if ! command -v "$BINARY" &>/dev/null; then
|
||||
log-fail "Missing ${BINARY}, please install it"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
local RELEASE="$1" AWS_RELEASE="$2"
|
||||
local CURRENT_VERSION FILENAME NEXT_VERSION ORG_REPO_NAME REPO_NAME major minor patch
|
||||
|
||||
if [[ -z "$RELEASE" ]]; then
|
||||
cat <<'EOF'
|
||||
requirements:
|
||||
|
||||
- this is run in a plugin folder
|
||||
- a `plugin.toml` exists
|
||||
- the plugin is versioned via git
|
||||
|
||||
usage:
|
||||
|
||||
# the following commands make these assumptions
|
||||
# - the plugin's folder name is dokku-example, as is the remote repository
|
||||
# - the current version is `0.0.1` in the `plugin.toml`
|
||||
|
||||
# create the alias
|
||||
alias release-dokku-plugin="path/to/dokku/contrib/release-plugin"
|
||||
|
||||
# make a specific kind of release
|
||||
release-dokku-plugin patch # creates a 0.0.2 release
|
||||
release-dokku-plugin minor # creates a 0.1.0 release
|
||||
release-dokku-plugin major # creates a 1.0.0 release
|
||||
|
||||
# release private plugins as tarballs to S3
|
||||
# note that the plugin *must* exist on github for this to work
|
||||
export DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN="some-github-token"
|
||||
export DOKKU_PLUGIN_S3_BUCKET="example"
|
||||
export DOKKU_PLUGIN_S3_PATH="some/path"
|
||||
# will upload the versioned tarball url to s3://example/some/path/dokku-plugin-name-0.0.1.tar.gz
|
||||
release-dokku-plugin patch
|
||||
EOF
|
||||
return
|
||||
fi
|
||||
|
||||
fn-require-bin "git"
|
||||
|
||||
if [[ "$AWS_RELEASE" != "true" ]] && [[ "$AWS_RELEASE" != "false" ]]; then
|
||||
local AWS_RELEASE=true
|
||||
fi
|
||||
|
||||
if [[ "$CI" != "true" ]] && [[ -z "$DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN" ]]; then
|
||||
log-info "You are running this without a DOKKU_PLUGIN_GITHUB_ACCESS_TOKEN environment variable."
|
||||
log-info "Doing so disables uploading releases to S3, which may be necessary for installing private plugins."
|
||||
while true; do
|
||||
read -rp "Do you wish to continue? " yn
|
||||
case $yn in
|
||||
[Yy]*) break ;;
|
||||
[Nn]*) exit ;;
|
||||
*) echo "Please answer yes or no." ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "$AWS_RELEASE" == "true" ]]; then
|
||||
fn-require-bin "aws"
|
||||
fn-require-bin "curl"
|
||||
if [[ -z "$DOKKU_PLUGIN_S3_BUCKET" ]]; then
|
||||
log-fail "No DOKKU_PLUGIN_S3_BUCKET environment variable set"
|
||||
fi
|
||||
if [[ -z "$DOKKU_PLUGIN_S3_PATH" ]]; then
|
||||
log-fail "No DOKKU_PLUGIN_S3_PATH environment variable set"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -f plugin.toml ]]; then
|
||||
log-error "No plugin.toml found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ ! -d .git ]]; then
|
||||
log-error "No git repository found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
CURRENT_VERSION=$(grep version plugin.toml | cut -d '"' -f2)
|
||||
major=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[1]}')
|
||||
minor=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[2]}')
|
||||
patch=$(echo "$CURRENT_VERSION" | awk '{split($0,a,"."); print a[3]}')
|
||||
|
||||
if [[ "$RELEASE" == "major" ]]; then
|
||||
major=$((major + 1))
|
||||
minor="0"
|
||||
patch="0"
|
||||
elif [[ "$RELEASE" == "minor" ]]; then
|
||||
minor=$((minor + 1))
|
||||
patch="0"
|
||||
elif [[ "$RELEASE" == "patch" ]]; then
|
||||
patch=$((patch + 1))
|
||||
else
|
||||
log-error "Invalid release type specified"
|
||||
return 1
|
||||
fi
|
||||
NEXT_VERSION="${major}.${minor}.${patch}"
|
||||
|
||||
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" plugin.toml
|
||||
git add plugin.toml
|
||||
git commit -m "Release ${NEXT_VERSION}"
|
||||
git tag "${NEXT_VERSION}"
|
||||
git push --tags origin master
|
||||
git fetch
|
||||
|
||||
ORG_REPO_NAME="$(git remote -v | grep origin | HEAD -n1 | cut -d':' -f2 | cut -d'.' -f1)"
|
||||
REPO_NAME="$(echo "$ORG_REPO_NAME" | cut -d'/' -f2)"
|
||||
FILENAME="${REPO_NAME}-${NEXT_VERSION}.tar.gz"
|
||||
|
||||
if [[ "$AWS_RELEASE" == "true" ]]; then
|
||||
DOKKU_PLUGIN_S3_BUCKET="${DOKKU_PLUGIN_S3_BUCKET%/}"
|
||||
DOKKU_PLUGIN_S3_PATH="${DOKKU_PLUGIN_S3_PATH%/}"
|
||||
if [[ "$DOKKU_PLUGIN_S3_PATH" != "/" ]]; then
|
||||
DOKKU_PLUGIN_S3_PATH="${DOKKU_PLUGIN_S3_PATH}/"
|
||||
fi
|
||||
|
||||
fn-github-download-release "$ORG_REPO_NAME" "$NEXT_VERSION" >"${TMP_WORK_DIR}/${FILENAME}"
|
||||
aws s3 cp "${TMP_WORK_DIR}/${FILENAME}" "s3://${DOKKU_PLUGIN_S3_BUCKET}/${DOKKU_PLUGIN_S3_PATH}${FILENAME}" --acl public-read
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
164
deb.mk
164
deb.mk
@@ -1,6 +1,8 @@
|
||||
BUILD_DIRECTORY ?= /tmp
|
||||
|
||||
HEROKUISH_DESCRIPTION = 'Herokuish uses Docker and Buildpacks to build applications like Heroku'
|
||||
HEROKUISH_REPO_NAME ?= gliderlabs/herokuish
|
||||
HEROKUISH_VERSION ?= 0.3.26
|
||||
HEROKUISH_VERSION ?= 0.5.0
|
||||
HEROKUISH_ARCHITECTURE = amd64
|
||||
HEROKUISH_PACKAGE_NAME = herokuish_$(HEROKUISH_VERSION)_$(HEROKUISH_ARCHITECTURE).deb
|
||||
|
||||
@@ -8,17 +10,11 @@ DOKKU_DESCRIPTION = 'Docker powered PaaS that helps you build and manage the lif
|
||||
DOKKU_REPO_NAME ?= dokku/dokku
|
||||
DOKKU_ARCHITECTURE = amd64
|
||||
|
||||
define PLUGN_DESCRIPTION
|
||||
Hook system that lets users extend your application with plugins
|
||||
Plugin triggers are simply scripts that are executed by the system.
|
||||
You can use any language you want, so long as the script is
|
||||
executable and has the proper language requirements installed
|
||||
endef
|
||||
PLUGN_REPO_NAME ?= dokku/plugn
|
||||
PLUGN_VERSION ?= 0.3.0
|
||||
PLUGN_ARCHITECTURE = amd64
|
||||
PLUGN_PACKAGE_NAME = plugn_$(PLUGN_VERSION)_$(PLUGN_ARCHITECTURE).deb
|
||||
PLUGN_URL = https://github.com/dokku/plugn/releases/download/v$(PLUGN_VERSION)/plugn_$(PLUGN_VERSION)_linux_x86_64.tgz
|
||||
DOKKU_UPDATE_DESCRIPTION = 'Binary that handles updating Dokku and related systems'
|
||||
DOKKU_UPDATE_REPO_NAME ?= dokku/dokku
|
||||
DOKKU_UPDATE_VERSION ?= 0.1.0
|
||||
DOKKU_UPDATE_ARCHITECTURE = amd64
|
||||
DOKKU_UPDATE_PACKAGE_NAME = dokku-update_$(DOKKU_UPDATE_VERSION)_$(DOKKU_UPDATE_ARCHITECTURE).deb
|
||||
|
||||
define SSHCOMMAND_DESCRIPTION
|
||||
Turn SSH into a thin client specifically for your app
|
||||
@@ -26,7 +22,7 @@ Simplifies running a single command over SSH, and
|
||||
manages authorized keys (ACL) and users in order to do so.
|
||||
endef
|
||||
SSHCOMMAND_REPO_NAME ?= dokku/sshcommand
|
||||
SSHCOMMAND_VERSION ?= 0.6.0
|
||||
SSHCOMMAND_VERSION ?= 0.7.0
|
||||
SSHCOMMAND_ARCHITECTURE = amd64
|
||||
SSHCOMMAND_PACKAGE_NAME = sshcommand_$(SSHCOMMAND_VERSION)_$(SSHCOMMAND_ARCHITECTURE).deb
|
||||
SSHCOMMAND_URL ?= https://raw.githubusercontent.com/dokku/sshcommand/v$(SSHCOMMAND_VERSION)/sshcommand
|
||||
@@ -48,35 +44,34 @@ ifndef IS_RELEASE
|
||||
IS_RELEASE = true
|
||||
endif
|
||||
|
||||
export PLUGN_DESCRIPTION
|
||||
export SIGIL_DESCRIPTION
|
||||
export SSHCOMMAND_DESCRIPTION
|
||||
|
||||
.PHONY: install-from-deb deb-all deb-herokuish deb-dokku deb-plugn deb-setup deb-sshcommand deb-sigil
|
||||
.PHONY: install-from-deb deb-all deb-herokuish deb-dokku deb-dokku-update deb-setup deb-sshcommand deb-sigil
|
||||
|
||||
install-from-deb:
|
||||
@echo "--> Initial apt-get update"
|
||||
sudo apt-get update -qq > /dev/null
|
||||
sudo apt-get update -qq >/dev/null
|
||||
sudo apt-get install -qq -y apt-transport-https
|
||||
|
||||
@echo "--> Installing docker"
|
||||
wget -nv -O - https://get.docker.com/ | sh
|
||||
|
||||
@echo "--> Installing dokku"
|
||||
wget -nv -O - https://packagecloud.io/gpg.key | apt-key add -
|
||||
@echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ trusty main" | sudo tee /etc/apt/sources.list.d/dokku.list
|
||||
sudo apt-get update -qq > /dev/null
|
||||
wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
|
||||
@echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ $(shell lsb_release -cs 2>/dev/null || echo "trusty") main" | sudo tee /etc/apt/sources.list.d/dokku.list
|
||||
sudo apt-get update -qq >/dev/null
|
||||
sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -yy dokku
|
||||
|
||||
deb-all: deb-setup deb-herokuish deb-dokku deb-plugn deb-sshcommand deb-sigil
|
||||
mv /tmp/*.deb .
|
||||
deb-all: deb-setup deb-herokuish deb-dokku deb-sshcommand deb-sigil deb-dokku-update
|
||||
mv $(BUILD_DIRECTORY)/*.deb .
|
||||
@echo "Done"
|
||||
|
||||
deb-setup:
|
||||
@echo "-> Updating deb repository and installing build requirements"
|
||||
@sudo apt-get update -qq > /dev/null
|
||||
@sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -qq -y gcc git build-essential wget ruby-dev ruby1.9.1 lintian > /dev/null 2>&1
|
||||
@command -v fpm > /dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
@sudo apt-get update -qq >/dev/null
|
||||
@sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -qq -y gcc git build-essential wget ruby-dev ruby1.9.1 lintian >/dev/null 2>&1
|
||||
@command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
|
||||
@ssh -o StrictHostKeyChecking=no git@github.com || true
|
||||
|
||||
deb-herokuish:
|
||||
@@ -86,94 +81,53 @@ deb-herokuish:
|
||||
@echo "-> Creating deb files"
|
||||
@echo "#!/usr/bin/env bash" >> /tmp/tmp/post-install
|
||||
@echo "sleep 5" >> /tmp/tmp/post-install
|
||||
@echo "count=\`sudo docker images | grep gliderlabs/herokuish | wc -l\`" >> /tmp/tmp/post-install
|
||||
@echo 'if [ "$$count" -ne 0 ]; then' >> /tmp/tmp/post-install
|
||||
@echo " echo 'Removing old herokuish image'" >> /tmp/tmp/post-install
|
||||
@echo " sudo docker rmi gliderlabs/herokuish" >> /tmp/tmp/post-install
|
||||
@echo "fi" >> /tmp/tmp/post-install
|
||||
@echo "echo 'Importing herokuish into docker (around 5 minutes)'" >> /tmp/tmp/post-install
|
||||
@echo 'if [[ ! -z $${http_proxy+x} ]]; then BUILDARGS="--build-args http_proxy=$$http_proxy"; fi' >> /tmp/tmp/post-install
|
||||
@echo 'if [[ ! -z $${https_proxy+x} ]]; then BUILDARGS="$$BUILDARGS --build-args https_proxy=$$https_proxy"; fi' >> /tmp/tmp/post-install
|
||||
@echo 'if [[ ! -z $${BUILDARGS+x} ]]; then echo Adding proxy settings to docker build: $$BUILDARGS; fi' >> /tmp/tmp/post-install
|
||||
@echo 'sudo docker build $$BUILDARGS -t gliderlabs/herokuish /var/lib/herokuish 1> /dev/null' >> /tmp/tmp/post-install
|
||||
|
||||
@echo "-> Cloning repository"
|
||||
git clone -q "https://github.com/$(HEROKUISH_REPO_NAME).git" --branch "v$(HEROKUISH_VERSION)" /tmp/tmp/herokuish > /dev/null
|
||||
rm -rf /tmp/tmp/herokuish/.git /tmp/tmp/herokuish/.gitignore
|
||||
|
||||
@echo "-> Copying files into place"
|
||||
mkdir -p "/tmp/build/var/lib"
|
||||
cp -rf /tmp/tmp/herokuish /tmp/build/var/lib/herokuish
|
||||
@echo 'if [[ -n $${http_proxy+x} ]]; then echo "See the docker pull docs for proxy configuration"; fi' >> /tmp/tmp/post-install
|
||||
@echo 'if [[ -n $${https_proxy+x} ]]; then echo "See the docker pull docs for proxy configuration"; fi' >> /tmp/tmp/post-install
|
||||
@echo 'if [[ -n $${BUILDARGS+x} ]]; then echo "See the docker pull docs for proxy configuration"; fi' >> /tmp/tmp/post-install
|
||||
@echo "sudo docker pull gliderlabs/herokuish:v${HEROKUISH_VERSION} && sudo docker tag gliderlabs/herokuish:v${HEROKUISH_VERSION} gliderlabs/herokuish:latest" >> /tmp/tmp/post-install
|
||||
|
||||
@echo "-> Creating $(HEROKUISH_PACKAGE_NAME)"
|
||||
sudo fpm -t deb -s dir -C /tmp/build -n herokuish -v $(HEROKUISH_VERSION) -a $(HEROKUISH_ARCHITECTURE) -p $(HEROKUISH_PACKAGE_NAME) --deb-pre-depends 'docker-engine-cs (>= 1.9.1) | docker-engine (>= 1.9.1)' --deb-pre-depends sudo --after-install /tmp/tmp/post-install --url "https://github.com/$(HEROKUISH_REPO_NAME)" --description $(HEROKUISH_DESCRIPTION) --license 'MIT License' .
|
||||
mv *.deb /tmp
|
||||
sudo fpm -t deb -s dir -C /tmp/build -n herokuish \
|
||||
--version $(HEROKUISH_VERSION) \
|
||||
--architecture $(HEROKUISH_ARCHITECTURE) \
|
||||
--package $(BUILD_DIRECTORY)/$(HEROKUISH_PACKAGE_NAME) \
|
||||
--deb-pre-depends 'docker-engine-cs (>= 1.9.1) | docker-engine (>= 1.9.1) | docker-ce | docker-ee' \
|
||||
--deb-pre-depends sudo \
|
||||
--after-install /tmp/tmp/post-install \
|
||||
--url "https://github.com/$(HEROKUISH_REPO_NAME)" \
|
||||
--description $(HEROKUISH_DESCRIPTION) \
|
||||
--license 'MIT License' \
|
||||
.
|
||||
|
||||
deb-dokku:
|
||||
rm -rf /tmp/tmp /tmp/build dokku_*_$(DOKKU_ARCHITECTURE).deb
|
||||
mkdir -p /tmp/tmp /tmp/build
|
||||
deb-dokku: /tmp/build-dokku/var/lib/dokku/GIT_REV
|
||||
rm -f $(BUILD_DIRECTORY)/dokku_*_$(DOKKU_ARCHITECTURE).deb
|
||||
|
||||
cp -r debian /tmp/build/DEBIAN
|
||||
mkdir -p /tmp/build/usr/bin
|
||||
mkdir -p /tmp/build/usr/share/doc/dokku
|
||||
mkdir -p /tmp/build/usr/share/dokku/contrib
|
||||
mkdir -p /tmp/build/usr/share/lintian/overrides
|
||||
mkdir -p /tmp/build/usr/share/man/man1
|
||||
mkdir -p /tmp/build/var/lib/dokku/core-plugins/available
|
||||
|
||||
cp dokku /tmp/build/usr/bin
|
||||
cp LICENSE /tmp/build/usr/share/doc/dokku/copyright
|
||||
find . -name ".DS_Store" -depth -exec rm {} \;
|
||||
cp -r plugins/* /tmp/build/var/lib/dokku/core-plugins/available
|
||||
find plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do touch /tmp/build/var/lib/dokku/core-plugins/available/$$plugin/.core; done
|
||||
$(MAKE) help2man
|
||||
$(MAKE) addman
|
||||
cp /usr/local/share/man/man1/dokku.1 /tmp/build/usr/share/man/man1/dokku.1
|
||||
gzip -9 /tmp/build/usr/share/man/man1/dokku.1
|
||||
cp contrib/dokku-installer.py /tmp/build/usr/share/dokku/contrib
|
||||
ifeq ($(DOKKU_VERSION),master)
|
||||
git describe --tags > /tmp/build/var/lib/dokku/VERSION
|
||||
else
|
||||
echo $(DOKKU_VERSION) > /tmp/build/var/lib/dokku/VERSION
|
||||
endif
|
||||
cat /tmp/build/var/lib/dokku/VERSION | cut -d '-' -f 1 | cut -d 'v' -f 2 > /tmp/build/var/lib/dokku/STABLE_VERSION
|
||||
cat /tmp/build-dokku/var/lib/dokku/VERSION | cut -d '-' -f 1 | cut -d 'v' -f 2 > /tmp/build-dokku/var/lib/dokku/STABLE_VERSION
|
||||
ifneq (,$(findstring false,$(IS_RELEASE)))
|
||||
sed -i.bak -e "s/^/`date +%s`:/" /tmp/build/var/lib/dokku/STABLE_VERSION && rm /tmp/build/var/lib/dokku/STABLE_VERSION.bak
|
||||
sed -i.bak -e "s/^/`date +%s`:/" /tmp/build-dokku/var/lib/dokku/STABLE_VERSION && rm /tmp/build-dokku/var/lib/dokku/STABLE_VERSION.bak
|
||||
endif
|
||||
rm /tmp/build/DEBIAN/lintian-overrides
|
||||
mv debian/lintian-overrides /tmp/build/usr/share/lintian/overrides/dokku
|
||||
ifdef DOKKU_GIT_REV
|
||||
echo "$(DOKKU_GIT_REV)" > /tmp/build/var/lib/dokku/GIT_REV
|
||||
else
|
||||
git rev-parse HEAD > /tmp/build/var/lib/dokku/GIT_REV
|
||||
endif
|
||||
sed -i "s/^Version: .*/Version: `cat /tmp/build/var/lib/dokku/STABLE_VERSION`/g" /tmp/build/DEBIAN/control
|
||||
dpkg-deb --build /tmp/build "/tmp/dokku_`cat /tmp/build/var/lib/dokku/STABLE_VERSION`_$(DOKKU_ARCHITECTURE).deb"
|
||||
lintian "/tmp/dokku_`cat /tmp/build/var/lib/dokku/STABLE_VERSION`_$(DOKKU_ARCHITECTURE).deb"
|
||||
|
||||
deb-plugn:
|
||||
rm -rf /tmp/tmp /tmp/build $(PLUGN_PACKAGE_NAME)
|
||||
mkdir -p /tmp/tmp /tmp/build /tmp/build/usr/bin
|
||||
cp -r debian /tmp/build-dokku/DEBIAN
|
||||
rm -f /tmp/build-dokku/DEBIAN/lintian-overrides
|
||||
cp debian/lintian-overrides /tmp/build-dokku/usr/share/lintian/overrides/dokku
|
||||
sed -i.bak "s/^Version: .*/Version: `cat /tmp/build-dokku/var/lib/dokku/STABLE_VERSION`/g" /tmp/build-dokku/DEBIAN/control && rm /tmp/build-dokku/DEBIAN/control.bak
|
||||
dpkg-deb --build /tmp/build-dokku "$(BUILD_DIRECTORY)/dokku_`cat /tmp/build-dokku/var/lib/dokku/VERSION`_$(DOKKU_ARCHITECTURE).deb"
|
||||
lintian "$(BUILD_DIRECTORY)/dokku_`cat /tmp/build-dokku/var/lib/dokku/VERSION`_$(DOKKU_ARCHITECTURE).deb"
|
||||
|
||||
@echo "-> Downloading package"
|
||||
wget -q -O /tmp/tmp/plugn-$(PLUGN_VERSION).tgz $(PLUGN_URL)
|
||||
cd /tmp/tmp/ && tar zxf /tmp/tmp/plugn-$(PLUGN_VERSION).tgz
|
||||
|
||||
@echo "-> Copying files into place"
|
||||
cp /tmp/tmp/plugn /tmp/build/usr/bin/plugn && chmod +x /tmp/build/usr/bin/plugn
|
||||
|
||||
@echo "-> Creating $(PLUGN_PACKAGE_NAME)"
|
||||
sudo fpm -t deb -s dir -C /tmp/build -n plugn \
|
||||
--version $(PLUGN_VERSION) \
|
||||
--architecture $(PLUGN_ARCHITECTURE) \
|
||||
--package $(PLUGN_PACKAGE_NAME) \
|
||||
--url "https://github.com/$(PLUGN_REPO_NAME)" \
|
||||
--maintainer "Jose Diaz-Gonzalez <dokku@josediazgonzalez.com>" \
|
||||
--category utils \
|
||||
--description "$$PLUGN_DESCRIPTION" \
|
||||
deb-dokku-update:
|
||||
rm -rf /tmp/dokku-update*.deb dokku-update*.deb
|
||||
echo "${DOKKU_UPDATE_VERSION}" > contrib/dokku-update-version
|
||||
sudo fpm -t deb -s dir -n dokku-update \
|
||||
--version $(DOKKU_UPDATE_VERSION) \
|
||||
--architecture $(DOKKU_UPDATE_ARCHITECTURE) \
|
||||
--package $(BUILD_DIRECTORY)/$(DOKKU_UPDATE_PACKAGE_NAME) \
|
||||
--depends 'dokku' \
|
||||
--url "https://github.com/$(DOKKU_UPDATE_REPO_NAME)" \
|
||||
--description $(DOKKU_UPDATE_DESCRIPTION) \
|
||||
--license 'MIT License' \
|
||||
.
|
||||
mv *.deb /tmp
|
||||
contrib/dokku-update=/usr/local/bin/dokku-update \
|
||||
contrib/dokku-update-version=/var/lib/dokku-update/VERSION
|
||||
|
||||
deb-sshcommand:
|
||||
rm -rf /tmp/tmp /tmp/build $(SSHCOMMAND_PACKAGE_NAME)
|
||||
@@ -191,14 +145,13 @@ deb-sshcommand:
|
||||
sudo fpm -t deb -s dir -C /tmp/build -n sshcommand \
|
||||
--version $(SSHCOMMAND_VERSION) \
|
||||
--architecture $(SSHCOMMAND_ARCHITECTURE) \
|
||||
--package $(SSHCOMMAND_PACKAGE_NAME) \
|
||||
--package $(BUILD_DIRECTORY)/$(SSHCOMMAND_PACKAGE_NAME) \
|
||||
--url "https://github.com/$(SSHCOMMAND_REPO_NAME)" \
|
||||
--maintainer "Jose Diaz-Gonzalez <dokku@josediazgonzalez.com>" \
|
||||
--category admin \
|
||||
--description "$$SSHCOMMAND_DESCRIPTION" \
|
||||
--license 'MIT License' \
|
||||
.
|
||||
mv *.deb /tmp
|
||||
|
||||
deb-sigil:
|
||||
rm -rf /tmp/tmp /tmp/build $(SIGIL_PACKAGE_NAME)
|
||||
@@ -215,11 +168,10 @@ deb-sigil:
|
||||
sudo fpm -t deb -s dir -C /tmp/build -n gliderlabs-sigil \
|
||||
--version $(SIGIL_VERSION) \
|
||||
--architecture $(SIGIL_ARCHITECTURE) \
|
||||
--package $(SIGIL_PACKAGE_NAME) \
|
||||
--package $(BUILD_DIRECTORY)/$(SIGIL_PACKAGE_NAME) \
|
||||
--url "https://github.com/$(SIGIL_REPO_NAME)" \
|
||||
--maintainer "Jose Diaz-Gonzalez <dokku@josediazgonzalez.com>" \
|
||||
--category utils \
|
||||
--description "$$SIGIL_DESCRIPTION" \
|
||||
--license 'MIT License' \
|
||||
.
|
||||
mv *.deb /tmp
|
||||
|
||||
6
debian/config
vendored
6
debian/config
vendored
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
if [[ -e /usr/share/debconf/confmodule ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
@@ -14,9 +15,10 @@ db_go || true
|
||||
|
||||
db_get "dokku/web_config"
|
||||
if [ $RET = "true" ]; then
|
||||
exit 0
|
||||
exit 0
|
||||
fi
|
||||
|
||||
db_input "high" "dokku/nginx_enable" || true
|
||||
db_input "high" "dokku/hostname" || true
|
||||
db_input "high" "dokku/vhost_enable" || true
|
||||
if [ "$ACTION" != "reconfigure" ]; then
|
||||
|
||||
8
debian/control
vendored
8
debian/control
vendored
@@ -1,11 +1,11 @@
|
||||
Package: dokku
|
||||
Version: 0.8.2
|
||||
Version: 0.17.6
|
||||
Section: web
|
||||
Priority: optional
|
||||
Architecture: amd64
|
||||
Depends: locales, git, make, curl, gcc, man-db, sshcommand (>= 0.6.0), gliderlabs-sigil, docker-engine-cs (>= 1.9.1) | docker-engine (>= 1.9.1) | docker-ce | docker-ee, software-properties-common, python-software-properties
|
||||
Recommends: herokuish (>= 0.3.4), parallel
|
||||
Pre-Depends: nginx, dnsutils, cgroupfs-mount | cgroup-lite, plugn (>= 0.3.0), sudo, python2.7, debconf
|
||||
Depends: locales, git, make, curl, gcc, man-db, netcat, sshcommand (>= 0.6.0), gliderlabs-sigil, docker-engine-cs (>= 1.7.1) | docker-engine (>= 1.7.1) | docker-io (>= 1.7.1) | docker.io (>= 1.7.1) | docker-ce | docker-ee, net-tools, software-properties-common, procfile-util, python-software-properties | python3-software-properties, rsyslog
|
||||
Recommends: herokuish (>= 0.3.4), parallel, dokku-update
|
||||
Pre-Depends: nginx (>= 1.8.0) | openresty, dnsutils, cgroupfs-mount | cgroup-lite, plugn (>= 0.3.0), sudo, python2.7, debconf
|
||||
Maintainer: Jose Diaz-Gonzalez <dokku@josediazgonzalez.com>
|
||||
Description: Docker-powered PaaS that helps build and manage the lifecycle of applications
|
||||
Dokku is an extensible, open source Platform as a Service
|
||||
|
||||
9
debian/lintian-overrides
vendored
9
debian/lintian-overrides
vendored
@@ -1,3 +1,12 @@
|
||||
dokku: command-with-path-in-maintainer-script postinst:16 /usr/bin/sshcommand
|
||||
dokku: maintainer-script-calls-systemctl postinst:87
|
||||
dokku: changelog-file-missing-in-native-package
|
||||
dokku: statically-linked-binary
|
||||
dokku: unstripped-binary-or-object
|
||||
|
||||
# The Go compiler is currently unable to produce read-only relocations
|
||||
# (it produces static binaries).
|
||||
dokku: hardening-no-relro
|
||||
|
||||
# Built golang binaries link to libc
|
||||
dokku: missing-dependency-on-libc
|
||||
|
||||
49
debian/postinst
vendored
49
debian/postinst
vendored
@@ -1,11 +1,17 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
if [[ -e /usr/share/debconf/confmodule ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
. /usr/share/debconf/confmodule
|
||||
fi
|
||||
|
||||
if [[ -r /etc/default/dokku ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
source /etc/default/dokku
|
||||
fi
|
||||
|
||||
readonly DOKKU_ROOT="${DOKKU_ROOT:-/home/dokku}"
|
||||
readonly DOKKU_LIB_ROOT="${DOKKU_LIB_PATH:-/var/lib/dokku}"
|
||||
|
||||
@@ -21,10 +27,10 @@ call-sshcommand() {
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
;;
|
||||
abort-upgrade | abort-remove | abort-deconfigure) ;;
|
||||
|
||||
configure)
|
||||
\
|
||||
configure)
|
||||
mandb
|
||||
[ ! -x /usr/bin/docker.io ] || ln -sf /usr/bin/docker.io /usr/local/bin/docker
|
||||
modprobe aufs || echo "WARNING: Restart server to finish installing dokku!"
|
||||
@@ -35,7 +41,7 @@ case "$1" in
|
||||
|
||||
echo "Setting up storage directories"
|
||||
mkdir -p ${DOKKU_LIB_ROOT}/data ${DOKKU_LIB_ROOT}/data/storage
|
||||
chown dokku:dokku -R ${DOKKU_LIB_ROOT}/data
|
||||
chown dokku:dokku ${DOKKU_LIB_ROOT}/data ${DOKKU_LIB_ROOT}/data/storage
|
||||
|
||||
echo "Setting up plugin directories"
|
||||
# should be replaced by `plugn init`
|
||||
@@ -50,14 +56,18 @@ case "$1" in
|
||||
elif [ -f ${DOKKU_LIB_ROOT}/plugins/$plugin/.core ]; then
|
||||
rm -rf ${DOKKU_LIB_ROOT}/plugins/$plugin
|
||||
elif [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then
|
||||
mv ${DOKKU_LIB_ROOT}/plugins/$plugin ${DOKKU_LIB_ROOT}/plugins/available;
|
||||
mv ${DOKKU_LIB_ROOT}/plugins/$plugin ${DOKKU_LIB_ROOT}/plugins/available
|
||||
fi
|
||||
done
|
||||
|
||||
db_get "dokku/nginx_enable"
|
||||
echo "Enabling all core plugins"
|
||||
find ${DOKKU_LIB_ROOT}/core-plugins/available -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
|
||||
if [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then
|
||||
ln -s ${DOKKU_LIB_ROOT}/core-plugins/available/$plugin ${DOKKU_LIB_ROOT}/plugins/available/$plugin;
|
||||
if [ "$plugin" = "nginx-vhosts" ] && [ "$RET" = "false" ]; then
|
||||
echo "Skipping enable of nginx-vhosts plugin"
|
||||
continue
|
||||
elif [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then
|
||||
ln -s ${DOKKU_LIB_ROOT}/core-plugins/available/$plugin ${DOKKU_LIB_ROOT}/plugins/available/$plugin
|
||||
PLUGIN_PATH=${DOKKU_LIB_ROOT}/core-plugins plugn enable $plugin
|
||||
PLUGIN_PATH=${DOKKU_LIB_ROOT}/plugins plugn enable $plugin
|
||||
fi
|
||||
@@ -66,7 +76,7 @@ case "$1" in
|
||||
chown dokku:dokku -R ${DOKKU_LIB_ROOT}/plugins ${DOKKU_LIB_ROOT}/core-plugins
|
||||
|
||||
echo "Ensure proper sshcommand path"
|
||||
echo '/usr/bin/dokku' > "${DOKKU_ROOT}/.sshcommand"
|
||||
echo '/usr/bin/dokku' >"${DOKKU_ROOT}/.sshcommand"
|
||||
if [[ -f .ssh/authorized_keys ]]; then
|
||||
sed -i.bak 's#/usr/local/bin/dokku#/usr/bin/dokku#' "${DOKKU_ROOT}/.ssh/authorized_keys"
|
||||
rm "${DOKKU_ROOT}/.ssh/authorized_keys"
|
||||
@@ -87,8 +97,8 @@ case "$1" in
|
||||
systemctl enable dokku-installer
|
||||
fi
|
||||
|
||||
installer_status="$(service dokku-installer status 2> /dev/null || true)"
|
||||
if echo $installer_status | grep -Eq "(inactive|waiting)" > /dev/null; then
|
||||
installer_status="$(service dokku-installer status 2>/dev/null || true)"
|
||||
if echo $installer_status | grep -Eq "(inactive|waiting)" >/dev/null; then
|
||||
echo "Starting dokku-installer"
|
||||
service dokku-installer start || echo "Unable to start dokku-installer"
|
||||
fi
|
||||
@@ -100,21 +110,24 @@ case "$1" in
|
||||
exit 0
|
||||
fi
|
||||
|
||||
db_get "dokku/vhost_enable"
|
||||
if [ "$RET" = "true" ]; then
|
||||
db_get "dokku/hostname"
|
||||
echo "$RET" > "${DOKKU_ROOT}/VHOST"
|
||||
if [ -f "${DOKKU_ROOT}/VHOST" ]; then
|
||||
echo "VHOST file detected, skipping modification"
|
||||
else
|
||||
rm -f "${DOKKU_ROOT}/VHOST"
|
||||
db_get "dokku/vhost_enable"
|
||||
if [ "$RET" = "true" ]; then
|
||||
db_get "dokku/hostname"
|
||||
echo "Setting VHOST contents to $RET"
|
||||
echo "$RET" >"${DOKKU_ROOT}/VHOST"
|
||||
fi
|
||||
fi
|
||||
|
||||
db_get "dokku/hostname"
|
||||
echo "$RET" > "${DOKKU_ROOT}/HOSTNAME"
|
||||
echo "$RET" >"${DOKKU_ROOT}/HOSTNAME"
|
||||
|
||||
if [ -z "${DEBCONF_RECONFIGURE}" ]; then
|
||||
db_get "dokku/key_file"
|
||||
if [ -f "$RET" ]; then
|
||||
call-sshcommand acl-add dokku default < "$RET" || true
|
||||
call-sshcommand acl-add dokku default <"$RET" || true
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
10
debian/postrm
vendored
10
debian/postrm
vendored
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
if [[ -e /usr/share/debconf/confmodule ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
@@ -21,9 +22,14 @@ main() {
|
||||
rm -f /etc/systemd/system/dokku-redeploy.service
|
||||
rm -f /etc/update-motd.d/99-dokku
|
||||
|
||||
(nginx -t && service nginx reload) || true
|
||||
db_get "dokku/nginx_enable"
|
||||
if [ "$RET" = "true" ]; then
|
||||
(nginx -t && service nginx reload) || true
|
||||
fi
|
||||
|
||||
if [[ "$1" == "purge" ]]; then
|
||||
rm -f /etc/nginx/conf.d/dokku.conf
|
||||
rm -f /etc/nginx/conf.d/dokku-installer.conf
|
||||
rm -f ${DOKKU_ROOT}/.dokkurc ${DOKKU_ROOT}/dokkurc ${DOKKU_ROOT}/tls
|
||||
rm -f ${DOKKU_ROOT}/.ssh/authorized_keys ${DOKKU_ROOT}/.sshcommand
|
||||
rm -f ${DOKKU_ROOT}/ENV ${DOKKU_ROOT}/HOSTNAME ${DOKKU_ROOT}/VERSION
|
||||
|
||||
38
debian/preinst
vendored
38
debian/preinst
vendored
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
if [[ -e /usr/share/debconf/confmodule ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
@@ -23,10 +24,23 @@ case "$1" in
|
||||
echo ' proxy_pass http://dokku-installer;'
|
||||
echo ' }'
|
||||
echo '}'
|
||||
} >> $NGINX_CONF
|
||||
} >>$NGINX_CONF
|
||||
|
||||
rm -f /etc/nginx/sites-enabled/*
|
||||
service nginx reload || /etc/init.d/nginx reload
|
||||
DOKKU_DISTRO="$(
|
||||
. /etc/os-release >/dev/null 2>&1 || true
|
||||
echo "$ID"
|
||||
)"
|
||||
case "$DOKKU_DISTRO" in
|
||||
debian)
|
||||
NGINX_INIT="/usr/sbin/invoke-rc.d"
|
||||
"$NGINX_INIT" nginx reload || "$NGINX_INIT" nginx start
|
||||
;;
|
||||
ubuntu)
|
||||
NGINX_INIT="/etc/init.d/nginx"
|
||||
"$NGINX_INIT" reload || "$NGINX_INIT" start
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -34,21 +48,21 @@ case "$1" in
|
||||
if [ -z "${DEBCONF_RECONFIGURE}" ] && [ "$RET" != "true" ]; then
|
||||
db_get "dokku/key_file"
|
||||
if [ ! -f "$RET" ]; then
|
||||
echo "Error: keyfile '$RET' not found."
|
||||
echo " you can enter a new keyfile path when you restart the installation."
|
||||
db_reset "dokku/key_file"
|
||||
exit 1
|
||||
echo "Error: keyfile '$RET' not found."
|
||||
echo " you can enter a new keyfile path when you restart the installation."
|
||||
db_reset "dokku/key_file"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
upgrade)
|
||||
;;
|
||||
upgrade) ;;
|
||||
|
||||
abort-upgrade)
|
||||
;;
|
||||
\
|
||||
abort-upgrade) ;;
|
||||
|
||||
*)
|
||||
\
|
||||
*)
|
||||
echo "preinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
|
||||
33
debian/prerm
vendored
33
debian/prerm
vendored
@@ -1,34 +1,35 @@
|
||||
#!/bin/bash
|
||||
set -eo pipefail; [[ $TRACE ]] && set -x
|
||||
set -eo pipefail
|
||||
[[ $TRACE ]] && set -x
|
||||
|
||||
readonly DOKKU_ROOT="${DOKKU_ROOT:-/home/dokku}"
|
||||
readonly DOKKU_LIB_ROOT="${DOKKU_LIB_PATH:-/var/lib/dokku}"
|
||||
|
||||
ps_backtrace() {
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Usage: $0 PID" > /dev/stderr
|
||||
echo "Usage: $0 PID" >/dev/stderr
|
||||
exit 1
|
||||
fi
|
||||
|
||||
declare -i pid=$1;
|
||||
ppid=0;
|
||||
header_modifier="";
|
||||
while : ; do
|
||||
declare -i pid=$1
|
||||
ppid=0
|
||||
header_modifier=""
|
||||
while :; do
|
||||
if [ $ppid -ne 0 ]; then
|
||||
header_modifier=h;
|
||||
fi;
|
||||
ppid=$(ps -o ppid= $pid);
|
||||
ps uww $header_modifier -p $pid;
|
||||
header_modifier=h
|
||||
fi
|
||||
ppid=$(ps -o ppid= $pid)
|
||||
ps uww $header_modifier -p $pid
|
||||
if [ $pid -eq 1 ]; then
|
||||
break;
|
||||
fi;
|
||||
pid=$ppid;
|
||||
done;
|
||||
break
|
||||
fi
|
||||
pid=$ppid
|
||||
done
|
||||
}
|
||||
|
||||
main() {
|
||||
# HACK: Ensure that we only delete data when purging dokku from the system
|
||||
if ps_backtrace $BASHPID 2> /dev/null | grep dpkg | grep -- "--purge" > /dev/null; then
|
||||
if ps_backtrace $BASHPID 2>/dev/null | grep dpkg | grep -- "--purge" >/dev/null; then
|
||||
echo "Processing purge"
|
||||
|
||||
echo "Destroying deployed applications"
|
||||
@@ -40,7 +41,7 @@ main() {
|
||||
echo "Disabling all core plugins"
|
||||
find ${DOKKU_LIB_ROOT}/core-plugins/available -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
|
||||
if [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then
|
||||
rm ${DOKKU_LIB_ROOT}/plugins/available/$plugin;
|
||||
rm ${DOKKU_LIB_ROOT}/plugins/available/$plugin
|
||||
PLUGIN_PATH=${DOKKU_LIB_ROOT}/core-plugins plugn disable $plugin
|
||||
PLUGIN_PATH=${DOKKU_LIB_ROOT}/plugins plugn disable $plugin
|
||||
fi
|
||||
|
||||
5
debian/templates
vendored
5
debian/templates
vendored
@@ -22,3 +22,8 @@ Template: dokku/key_file
|
||||
Description: Keyfile for initial user:
|
||||
Type: string
|
||||
Default: /root/.ssh/id_rsa.pub
|
||||
|
||||
Template: dokku/nginx_enable
|
||||
Description: Enable nginx-vhosts plugin?
|
||||
Type: boolean
|
||||
Default: true
|
||||
|
||||
@@ -26,7 +26,7 @@ dokku postgres:import [db_name] < [db_name].dump
|
||||
|
||||
Dokku doesn't enforce a [300mb](https://devcenter.heroku.com/articles/slug-compiler#slug-size) limit on apps, but it's best practice to keep binary assets outside of git. Since containers are considered volatile in Dokku, external stores like s3 or storage mounts should be used for non-volatile items like user uploads. The Dokku storage core plugin can be used to mount local directories / volumes inside the docker container.
|
||||
|
||||
See the [persistent storage documentation](/dokku/advanced-usage/persistent-storage/) for more details.
|
||||
See the [persistent storage documentation](/docs/advanced-usage/persistent-storage.md) for more details.
|
||||
|
||||
|
||||
## Disaster Recovery
|
||||
|
||||
@@ -2,58 +2,76 @@
|
||||
|
||||
> New as of 0.5.0
|
||||
|
||||
Sometimes you need to run a command on at deployment time, but before an app is completely deployed.
|
||||
Common use cases include:
|
||||
Sometimes you need to run a command on at deployment time, but before an app is completely deployed. Common use cases include:
|
||||
|
||||
* Checking a database is initialized
|
||||
* Running database migrations
|
||||
* Any commands required to set up the server (e.g. something like a Django `collectstatic`)
|
||||
|
||||
## `app.json` and `scripts.dokku`
|
||||
To support this, Dokku provides support for a special `release` command within your app's `Procfile`, as well as a special `scripts.dokku` key inside of your app's `app.json` file. Be aware that all commands are run within the context of the built docker image - no commands affect the host unless there are volume mounts attached to your app.
|
||||
|
||||
Dokku accomplishes this by using an `app.json` file. The format in use is similar to format of Heroku's [app.json](https://devcenter.heroku.com/articles/app-json-schema).
|
||||
However, Dokku currently only supports the nodes `scripts.dokku.predeploy` and `scripts.dokku.postdeploy`.
|
||||
For buildpack apps, simply place an `app.json` file in the root of your repository.
|
||||
For dockerfile apps, place `app.json` in the configured `WORKDIR` directory; otherwise Dokku defaults to the buildpack app behavior of looking in `/app`.
|
||||
Each "phase" has different expectations and limitations:
|
||||
|
||||
> NOTE: postdeploy changes are *NOT* committed to the app image.
|
||||
- `app.json`: `scripts.dokku.predeploy`
|
||||
- When to use: This should be used if your app does not support arbitrary build commands and you need to make changes to the built image.
|
||||
- Are changes committed to the image at this phase: Yes
|
||||
- Example use-cases
|
||||
- Bundling assets in a slightly different way
|
||||
- Installing a custom package from source or copying a binary into place
|
||||
- `app.json`: `scripts.dokku.postdeploy`
|
||||
- When to use: This should be used in conjunction with external systems to signal the completion of your deploy.
|
||||
- Are changes committed to the image at this phase: No
|
||||
- Example use-cases
|
||||
- Notifying slack that your app is deployed
|
||||
- Coordinating traffic routing with a central load balancer
|
||||
- `Procfile`: `release`
|
||||
- When to use: This should be used in conjunction with external systems to signal the completion of your app image build.
|
||||
- Are changes committed to the image at this phase: No
|
||||
- Example use-cases
|
||||
- Sending CSS, JS, and other assets from your app’s slug to a CDN or S3 bucket
|
||||
- Priming or invalidating cache stores
|
||||
- Running database migrations
|
||||
|
||||
### Example app.json
|
||||
Please keep the above in mind when utilizing deployment tasks.
|
||||
|
||||
> To execute commands on the host during a release phase, see the [plugin creation documentation](/docs/development/plugin-creation) docs for more information on building your own custom plugin.
|
||||
|
||||
## `app.json` deployment tasks
|
||||
|
||||
Dokku provides limited support for the `app.json` manifest from Heroku (documentation available [here](https://devcenter.heroku.com/articles/app-json-schema)). The keys available for use with Deployment Tasks are:
|
||||
|
||||
- `scripts.dokku.predeploy`: This is run _after_ an app's docker image is built, but _before_ any containers are scheduled. Changes made to your image are committed at this phase.
|
||||
- `scripts.dokku.postdeploy`: This is run _after_ an app's containers are scheduled. Changes made to your image are *not* committed at this phase.
|
||||
|
||||
For buildpack-based deployments, the location of the `app.json` file should be at the root of your repository. Dockerfile-based app deploys should have the `app.json` in the configured `WORKDIR` directory; otherwise Dokku defaults to the buildpack app behavior of looking in `/app`.
|
||||
|
||||
> Warning: Any failed `app.json` deployment task will fail the deploy. In the case of either phase, a failure will not affect any running containers.
|
||||
|
||||
The following is an example `app.json` file. Please note that only the `scripts.dokku.predeploy` and `scripts.dokku.postdeploy` tasks are supported by Dokku at this time. All other fields will be ignored and can be omitted.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "barebones nodejs",
|
||||
"description": "A barebones Node.js app using Express 4.",
|
||||
"keywords": [
|
||||
"nodejs",
|
||||
"express"
|
||||
],
|
||||
"repository": "https://github.com/michaelshobbs/node-js-sample",
|
||||
"scripts": {
|
||||
"dokku": {
|
||||
"predeploy": "touch /app/predeploy.test",
|
||||
"postdeploy": "curl https://some.external.api.service.com/deployment?state=success"
|
||||
}
|
||||
},
|
||||
"env": {
|
||||
"SECRET_TOKEN": {
|
||||
"description": "A secret key for verifying the integrity of signed cookies.",
|
||||
"value": "secret"
|
||||
},
|
||||
"WEB_CONCURRENCY": {
|
||||
"description": "The number of processes to run.",
|
||||
"generator": "echo 5"
|
||||
}
|
||||
},
|
||||
"image": "gliderlabs/herokuish",
|
||||
"addons": [
|
||||
"dokku-postgres",
|
||||
"dokku-redis"
|
||||
],
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "https://github.com/heroku/heroku-buildpack-nodejs"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Procfile Release command
|
||||
|
||||
> New as of 0.14.0
|
||||
|
||||
The `Procfile` also supports a special `release` command which acts in a similar way to the [Heroku Release Phase](https://devcenter.heroku.com/articles/release-phase). This command is executed _after_ an app's docker image is built, but _before_ any containers are scheduled. This is also run _after_ any command executed by `scripts.dokku.predeploy`.
|
||||
|
||||
To use the `release` command, simply add a `release` stanza to your Procfile.
|
||||
|
||||
```Procfile
|
||||
release: curl https://some.external.api.service.com/deployment?state=built
|
||||
```
|
||||
|
||||
Unlike the `scripts.dokku.predeploy` command, changes made during by the `release` command are *not* persisted to disk.
|
||||
|
||||
> Warning: scaling the release command up will likely result in unspecified issues within your deployment, and is highly discouraged.
|
||||
|
||||
@@ -28,7 +28,7 @@ Dokku deploys your application in multiple "phases" and the `docker-options` plu
|
||||
|
||||
### Add Docker options
|
||||
|
||||
Add some options for the deployed/running app and when executing [`dokku run`](/dokku/deployment/one-off-processes/):
|
||||
Add some options for the deployed/running app and when executing [`dokku run`](/docs/deployment/one-off-processes.md):
|
||||
|
||||
```shell
|
||||
# Mount a host volume in a Docker container: "-v /host/path:/container/path"
|
||||
@@ -44,7 +44,7 @@ dokku docker-options:add node-js-app run "-v /var/log/node-js-app:/app/logs"
|
||||
dokku docker-options:remove node-js-app run "-v /var/log/node-js-app:/app/logs"
|
||||
```
|
||||
|
||||
### Displaying docker-options reports about an app
|
||||
### Displaying docker-options reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -77,9 +77,9 @@ dokku docker-options:report node-js-app
|
||||
|
||||
```
|
||||
=====> node-js-app docker options information
|
||||
Storage build mounts:
|
||||
Storage deploy mounts: -v /var/log/node-js-app:/app/logs
|
||||
Storage run mounts: -v /var/log/node-js-app:/app/logs
|
||||
Docker options build:
|
||||
Docker options deploy: -v /var/log/node-js-app:/app/logs
|
||||
Docker options run: -v /var/log/node-js-app:/app/logs
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
@@ -88,7 +88,6 @@ You can pass flags which will output only the value of the specific information
|
||||
dokku docker-options:report node-js-app --docker-options-build
|
||||
```
|
||||
|
||||
|
||||
## Advanced usage
|
||||
|
||||
In your applications folder `/home/dokku/app_name` create a file called `DOCKER_OPTIONS_RUN` (or `DOCKER_OPTIONS_BUILD` or `DOCKER_OPTIONS_DEPLOY`).
|
||||
|
||||
@@ -36,10 +36,8 @@ Jul 3 16:10:02 dokku.me dokku[128114]: INVOKED: docker-args-run( nhl )
|
||||
Jul 3 16:10:03 dokku.me dokku[128136]: INVOKED: post-release-buildpack( pythonapp )
|
||||
Jul 3 16:10:03 dokku.me dokku[128195]: INVOKED: pre-deploy( pythonapp )
|
||||
Jul 3 16:10:23 dokku.me dokku[129253]: INVOKED: docker-args-deploy( pythonapp )
|
||||
Jul 3 16:10:24 dokku.me dokku[129337]: INVOKED: bind-external-ip( pythonapp )
|
||||
Jul 3 16:10:24 dokku.me dokku[129451]: INVOKED: check-deploy( pythonapp 6274ced0d4be11af4490cd18abaf77cdd593f025133f403d984e80d86a39acec web 5000 10.0.16.80 )
|
||||
Jul 3 16:10:35 dokku.me dokku[129561]: INVOKED: docker-args-deploy( pythonapp )
|
||||
Jul 3 16:10:35 dokku.me dokku[129649]: INVOKED: bind-external-ip( pythonapp )
|
||||
Jul 3 16:10:36 dokku.me dokku[129760]: INVOKED: check-deploy( pythonapp ac88a56ee4161ff37e4b92d1498c3eadc91f0aa7c8b81b44fc077e2a51d54cc0 worker )
|
||||
Jul 3 16:10:46 dokku.me dokku[129851]: INVOKED: post-deploy( pythonapp )
|
||||
Jul 3 16:10:46 dokku.me dokku[129945]: INVOKED: nginx-pre-reload( pythonapp )
|
||||
@@ -56,29 +54,28 @@ dokku events:list
|
||||
|
||||
```
|
||||
=====> Events currently logged
|
||||
docker-args-build
|
||||
pre-delete
|
||||
post-deploy
|
||||
receive-app
|
||||
pre-release-buildpack
|
||||
nginx-pre-reload
|
||||
docker-args-deploy
|
||||
post-build-buildpack
|
||||
post-domains-update
|
||||
post-release-dockerfile
|
||||
check-deploy
|
||||
git-pre-pull
|
||||
git-post-pull
|
||||
nginx-hostname
|
||||
bind-external-ip
|
||||
pre-deploy
|
||||
post-delete
|
||||
dependencies
|
||||
pre-build-buildpack
|
||||
docker-args-build
|
||||
docker-args-deploy
|
||||
docker-args-run
|
||||
pre-build-dockerfile
|
||||
post-release-buildpack
|
||||
git-post-pull
|
||||
git-pre-pull
|
||||
nginx-hostname
|
||||
nginx-pre-reload
|
||||
post-build-buildpack
|
||||
post-build-dockerfile
|
||||
post-delete
|
||||
post-deploy
|
||||
post-domains-update
|
||||
post-release-buildpack
|
||||
post-release-dockerfile
|
||||
pre-build-buildpack
|
||||
pre-build-dockerfile
|
||||
pre-delete
|
||||
pre-deploy
|
||||
pre-release-buildpack
|
||||
pre-release-dockerfile
|
||||
receive-app
|
||||
update
|
||||
```
|
||||
```
|
||||
@@ -14,9 +14,19 @@ storage:unmount <app> <host-dir:container-dir> # Remove an existing bind mount
|
||||
|
||||
> The storage plugin is compatible with storage mounts created with the docker-options. The storage plugin will only list mounts from the deploy/run phase.
|
||||
|
||||
## Ideology and Background
|
||||
The storage plugin supports the following mount points:
|
||||
|
||||
The storage plugin requires explicit paths on the host side. This is intentional to ensure that new users avoid running into unexpected results with implicit paths that may not exist (a feature deprecate in [Docker 1.9.0](https://github.com/docker/docker/releases/tag/v1.9.0])). The container directory is created for the mount point in the container. Any existing directory contents are not accessible after a mount is added to the container. Dokku creates a new directory `/var/lib/dokku/data/storage` during installation, it's the general consensus that new users should use this directory. Mounts are only available at run and deploy times, you must redeploy (restart) an app to mount or unmount to an existing app's container.
|
||||
- explicit paths that exist on the host
|
||||
- docker volumes
|
||||
|
||||
There are a few caveats to using the persistent storage plugin:
|
||||
|
||||
- Using implicit paths that do not exist are no longer supported, and actually deprecated in [Docker 1.9.0](https://github.com/docker/docker/releases/tag/v1.9.0). When you specify a persistent storage mount, the host directory is **not** autocreated by either Dokku or Docker.
|
||||
- We recommend using the directory `/var/lib/dokku/data/storage` directory as the root host path for mounts, and we create this on Dokku installation.
|
||||
- Mounts are only available at run and deploy times, and you **must** redeploy (restart) an app to mount or unmount to an existing app's container.
|
||||
- When a directory is mounted, any existing files within the container will be overwritten. If you are writing assets during the build process and then replace the directory with a mount, those files will no longer exist. This is a Docker limitation.
|
||||
- Paths are mounted within the container at the root of the disk - `/` - and are **not** relative to `/app` (for buildpacks deploys) or the `WORKDIR` (for Dockerfile/Docker images).
|
||||
- For applications using buildpack deploys, the host directory should be owned by the user and group id `32767`. This is due to how permissions within Herokuish - which builds the Docker images - works. For Dockerfile or Docker image deployments, please use the user and group id which corresponds to the one running the process within the container.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -29,11 +39,11 @@ dokku storage:mount node-js-app /var/lib/dokku/data/storage/node-js-app:/storage
|
||||
|
||||
Dokku will then mount the shared contents of `/var/lib/dokku/data/storage` to `/storage` inside the container.
|
||||
|
||||
Once you have mounted persistent storage, you will also need to restart the application. See the
|
||||
[process scaling documentation](/dokku/deployment/process-management) for more information.
|
||||
Once you have mounted persistent storage, you will also need to restart the application. See the
|
||||
[process scaling documentation](/docs/deployment/process-management.md) for more information.
|
||||
|
||||
```shell
|
||||
dokku ps:rebuild app-name
|
||||
dokku ps:restart app-name
|
||||
```
|
||||
|
||||
A more complete workflow may require making a custom directory for your application and mounting it within your `/app/storage` directory instead. The mount point is *not* relative to your application's working directory, and is instead relative to the root of the container.
|
||||
@@ -45,7 +55,8 @@ mkdir -p /var/lib/dokku/data/storage/node-js-app
|
||||
# ensure the proper user has access to this directory
|
||||
chown -R dokku:dokku /var/lib/dokku/data/storage/node-js-app
|
||||
|
||||
# as of 0.7.x, you should chown using the `32767` user and group id
|
||||
# as of 0.7.x, you should chown using the `32767` user and group id for buildpack deploys
|
||||
# For dockerfile deploys, substitute the user and group id in use within the image
|
||||
chown -R 32767:32767 /var/lib/dokku/data/storage/node-js-app
|
||||
|
||||
# mount the directory into your container's /app/storage directory, relative to root
|
||||
@@ -54,7 +65,7 @@ dokku storage:mount app-name /var/lib/dokku/data/storage/node-js-app:/app/storag
|
||||
|
||||
You can mount one or more directories as desired by following the above pattern.
|
||||
|
||||
### Displaying storage reports about an app
|
||||
### Displaying storage reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -121,7 +132,7 @@ Your app may have services that are running in memory and need to be backed up l
|
||||
By default, Dokku will only bind storage mounts during the deploy and run phases. Under certain conditions, one might want to bind a storage mount during the build phase. This can be accomplished by using the `docker-options` plugin directly.
|
||||
|
||||
```shell
|
||||
dokku docker-options:add <app> build "-v /tmp/python-test:/opt/test"
|
||||
dokku docker-options:add node-js-app build "-v /tmp/python-test:/opt/test"
|
||||
```
|
||||
|
||||
You cannot use mounted volumes during the build phase of a Dockerfile deploy. This is because Docker does not support volumes when executing `docker build`.
|
||||
@@ -136,4 +147,4 @@ By default, Dokku will execute your buildpack application processes as the `hero
|
||||
|
||||
> NOTE: this user must exist in your herokuish image.
|
||||
|
||||
Additionally, Dokku will ensure your storage mounts are owned by either `herokuishuser` or the overridden value you have set in `DOKKU_APP_USER`.
|
||||
Additionally, the default `docker-local` scheduler that comes with Dokku will ensure your storage mounts are owned by either `herokuishuser` or the overridden value you have set in `DOKKU_APP_USER`. See the [scheduler-docker-local documentation](/docs/advanced-usage/schedulers/docker-local.md#disabling-chown-of-persistent-storage) docs for more information.
|
||||
|
||||
@@ -8,6 +8,7 @@ plugin:enable <name> # Enable a previously disabled plugin
|
||||
plugin:install [--core|git-url [--committish tag|branch|commit|--name custom-plugin-name]] # Optionally download git-url (with custom tag/committish) & run install trigger for active plugins (or only core ones)
|
||||
plugin:install-dependencies [--core] # Run install-dependencies trigger for active plugins (or only core ones)
|
||||
plugin:list # Print active plugins
|
||||
plugin:trigger <args...>. # Trigger an arbitrary plugin hook
|
||||
plugin:uninstall <name> # Uninstall a plugin (third-party only)
|
||||
plugin:update [name [committish]] # Optionally update named plugin from git (with custom tag/committish) & run update trigger for active plugins
|
||||
```
|
||||
@@ -31,30 +32,31 @@ dokku plugin
|
||||
|
||||
```
|
||||
plugn: dev
|
||||
00_dokku-standard 0.8.2 enabled dokku core standard plugin
|
||||
20_events 0.8.2 enabled dokku core events logging plugin
|
||||
apps 0.8.2 enabled dokku core apps plugin
|
||||
build-env 0.8.2 enabled dokku core build-env plugin
|
||||
certs 0.8.2 enabled dokku core certificate management plugin
|
||||
checks 0.8.2 enabled dokku core checks plugin
|
||||
common 0.8.2 enabled dokku core common plugin
|
||||
config 0.8.2 enabled dokku core config plugin
|
||||
docker-options 0.8.2 enabled dokku core docker-options plugin
|
||||
domains 0.8.2 enabled dokku core domains plugin
|
||||
enter 0.8.2 enabled dokku core enter plugin
|
||||
git 0.8.2 enabled dokku core git plugin
|
||||
logs 0.8.2 enabled dokku core logs plugin
|
||||
named-containers 0.8.2 enabled dokku core named containers plugin
|
||||
nginx-vhosts 0.8.2 enabled dokku core nginx-vhosts plugin
|
||||
plugin 0.8.2 enabled dokku core plugin plugin
|
||||
proxy 0.8.2 enabled dokku core proxy plugin
|
||||
ps 0.8.2 enabled dokku core ps plugin
|
||||
repo 0.8.2 enabled dokku core repo plugin
|
||||
shell 0.8.2 enabled dokku core shell plugin
|
||||
ssh-keys 0.8.2 enabled dokku core ssh-keys plugin
|
||||
storage 0.8.2 enabled dokku core storage plugin
|
||||
tags 0.8.2 enabled dokku core tags plugin
|
||||
tar 0.8.2 enabled dokku core tar plugin
|
||||
00_dokku-standard 0.17.6 enabled dokku core standard plugin
|
||||
20_events 0.17.6 enabled dokku core events logging plugin
|
||||
apps 0.17.6 enabled dokku core apps plugin
|
||||
build-env 0.17.6 enabled dokku core build-env plugin
|
||||
certs 0.17.6 enabled dokku core certificate management plugin
|
||||
checks 0.17.6 enabled dokku core checks plugin
|
||||
common 0.17.6 enabled dokku core common plugin
|
||||
config 0.17.6 enabled dokku core config plugin
|
||||
docker-options 0.17.6 enabled dokku core docker-options plugin
|
||||
domains 0.17.6 enabled dokku core domains plugin
|
||||
enter 0.17.6 enabled dokku core enter plugin
|
||||
git 0.17.6 enabled dokku core git plugin
|
||||
logs 0.17.6 enabled dokku core logs plugin
|
||||
named-containers 0.17.6 enabled dokku core named containers plugin
|
||||
network 0.17.6 enabled dokku core network plugin
|
||||
nginx-vhosts 0.17.6 enabled dokku core nginx-vhosts plugin
|
||||
plugin 0.17.6 enabled dokku core plugin plugin
|
||||
proxy 0.17.6 enabled dokku core proxy plugin
|
||||
ps 0.17.6 enabled dokku core ps plugin
|
||||
repo 0.17.6 enabled dokku core repo plugin
|
||||
shell 0.17.6 enabled dokku core shell plugin
|
||||
ssh-keys 0.17.6 enabled dokku core ssh-keys plugin
|
||||
storage 0.17.6 enabled dokku core storage plugin
|
||||
tags 0.17.6 enabled dokku core tags plugin
|
||||
tar 0.17.6 enabled dokku core tar plugin
|
||||
```
|
||||
|
||||
Installing a plugin is easy as well using the `plugin:install` command. This command will also trigger the `install` pluginhook on all existing plugins.
|
||||
|
||||
@@ -1,206 +0,0 @@
|
||||
# Proxy Management
|
||||
|
||||
> New as of 0.5.0, Enhanced in 0.6.0
|
||||
|
||||
```
|
||||
proxy:disable <app> # Disable proxy for app
|
||||
proxy:enable <app> # Enable proxy for app
|
||||
proxy:ports <app> # List proxy port mappings for app
|
||||
proxy:ports-add <app> <scheme>:<host-port>:<container-port> [<scheme>:<host-port>:<container-port>...] # Set proxy port mappings for app
|
||||
proxy:ports-clear <app> # Clear all proxy port mappings for app
|
||||
proxy:ports-remove <app> <host-port> [<host-port>|<scheme>:<host-port>:<container-port>...] # Unset proxy port mappings for app
|
||||
proxy:report [<app>] [<flag>] # Displays a proxy report for one or more apps
|
||||
proxy:set <app> <proxy-type> # Set proxy type for app
|
||||
```
|
||||
|
||||
In Dokku 0.5.0, port proxying was decoupled from the `nginx-vhosts` plugin into the proxy plugin. Dokku 0.6.0 introduced the ability to map host ports to specific container ports. In the future this will allow other proxy software - such as HAProxy or Caddy - to be used in place of nginx.
|
||||
|
||||
## Usage
|
||||
|
||||
### Container network interface binding
|
||||
|
||||
> New as of 0.5.0
|
||||
|
||||
By default, the deployed docker container running your app's web process will bind to the internal docker network interface (i.e. `docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID`). This behavior can be modified per app by disabling the proxy (i.e. `dokku proxy:disable <app>`). In this case, the container will bind to an external interface (i.e. `0.0.0.0`) and your app container will be directly accessible by other hosts on your network.
|
||||
|
||||
> If a proxy is disabled, Dokku will bind your container's port to a random port on the host for every deploy, e.g. `0.0.0.0:32771->5000/tcp`.
|
||||
|
||||
By way of example, in the default case, each container is bound to the docker interface:
|
||||
|
||||
```shell
|
||||
docker ps
|
||||
```
|
||||
|
||||
```
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
1b88d8aec3d1 dokku/node-js-app:latest "/bin/bash -c '/star About a minute ago Up About a minute node-js-app.web.1
|
||||
```
|
||||
|
||||
As such, the container's IP address will be an internal IP, and thus it is only accessible on the host itself:
|
||||
|
||||
```
|
||||
docker inspect --format '{{ .NetworkSettings.IPAddress }}' node-js-app.web.1
|
||||
```
|
||||
|
||||
```
|
||||
172.17.0.6
|
||||
```
|
||||
|
||||
However, you can disable the internal proxying via the `proxy:disable` command so that it will listen on the host's IP address:
|
||||
|
||||
```shell
|
||||
dokku proxy:disable node-js-app
|
||||
|
||||
# container bound to all interfaces
|
||||
docker ps
|
||||
```
|
||||
|
||||
```
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
d6499edb0edb dokku/node-js-app:latest "/bin/bash -c '/star About a minute ago Up About a minute 0.0.0.0:49153->5000/tcp node-js-app.web.1
|
||||
```
|
||||
|
||||
### Displaying proxy reports about an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
You can get a report about the app's proxy status using the `proxy:report` command:
|
||||
|
||||
```shell
|
||||
dokku proxy:report
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app proxy information
|
||||
Proxy enabled: true
|
||||
Proxy type: nginx
|
||||
Proxy port map: http:80:5000 https:443:5000
|
||||
=====> python-sample proxy information
|
||||
Proxy enabled: true
|
||||
Proxy type: nginx
|
||||
Proxy port map: http:80:5000
|
||||
=====> ruby-sample proxy information
|
||||
Proxy enabled: true
|
||||
Proxy type: nginx
|
||||
Proxy port map: http:80:5000
|
||||
```
|
||||
|
||||
You can run the command for a specific app also.
|
||||
|
||||
```shell
|
||||
dokku proxy:report node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app proxy information
|
||||
Proxy enabled: true
|
||||
Proxy type: nginx
|
||||
Proxy port map: http:80:5000 https:443:5000
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
```shell
|
||||
dokku proxy:report node-js-app --proxy-type
|
||||
```
|
||||
|
||||
### Proxy port mapping
|
||||
|
||||
> New as of 0.6.0
|
||||
|
||||
You can now configure `host -> container` port mappings with the `proxy:ports-*` commands. This mapping is currently supported by the built-in nginx-vhosts plugin.
|
||||
|
||||
To inspect the port mapping for a given application, use the `proxy:ports` command:
|
||||
|
||||
```shell
|
||||
dokku proxy:ports node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
-----> Port mappings for node-js-app
|
||||
-----> scheme host port container port
|
||||
http 80 5000
|
||||
```
|
||||
|
||||
The above application is listening on the host's port `80`, which we can test via curl:
|
||||
|
||||
```shell
|
||||
curl http://node-js-app.dokku.me
|
||||
```
|
||||
|
||||
```
|
||||
Hello World!
|
||||
```
|
||||
|
||||
There are cases where we may wish for the service to be listening on more than one port, such as port 8080. Normally, this would not be possible:
|
||||
|
||||
```shell
|
||||
curl http://node-js-app.dokku.me:8080
|
||||
```
|
||||
|
||||
```
|
||||
curl: (7) Failed to connect to node-js-app.dokku.me port 8080: Connection refused
|
||||
```
|
||||
|
||||
However, we can use the `proxy:ports-add` command to add a second external port mapping - `8080` - to our application's port `5000`.
|
||||
|
||||
```shell
|
||||
dokku proxy:ports-add node-js-app http:8080:5000
|
||||
```
|
||||
|
||||
```
|
||||
-----> Setting config vars
|
||||
DOKKU_PROXY_PORT_MAP: http:80:5000 http:8080:5000
|
||||
-----> Configuring node-js-app.dokku.me...(using built-in template)
|
||||
-----> Creating http nginx.conf
|
||||
-----> Running nginx-pre-reload
|
||||
Reloading nginx
|
||||
```
|
||||
|
||||
We can now test that port 80 still responds properly:
|
||||
|
||||
```shell
|
||||
curl http://node-js-app.dokku.me
|
||||
```
|
||||
|
||||
```
|
||||
Hello World!
|
||||
```
|
||||
|
||||
And our new listening port of `8080` also works:
|
||||
|
||||
```shell
|
||||
curl http://node-js-app.dokku.me:8080
|
||||
```
|
||||
|
||||
```
|
||||
Hello World!
|
||||
```
|
||||
|
||||
You can also remove a port mapping that is no longer necessary:
|
||||
|
||||
```shell
|
||||
dokku proxy:ports-remove node-js-app http:80:5000
|
||||
```
|
||||
|
||||
By default, buildpack apps and dockerfile apps **without** explicitly exposed ports (i.e. using the `EXPOSE` directive) will be configured with a listener on port `80` (and additionally a listener on 443 if ssl is enabled) that will proxy to the application container on port `5000`. Dockerfile apps **with** explicitly exposed ports will be configured with a listener on each exposed port and will proxy to that same port of the deployed application container.
|
||||
|
||||
> Note: This default behavior **will not** be automatically changed on subsequent pushes and must be manipulated with the `proxy:ports-*` syntax detailed above.
|
||||
|
||||
#### Proxy Port Scheme
|
||||
|
||||
The proxy port scheme is as follows:
|
||||
|
||||
- `SCHEME:HOST_PORT:CONTAINER_PORT`
|
||||
|
||||
The scheme metadata can be used by proxy implementations in order to properly handle proxying of requests. For example, the built-in `nginx-vhosts` proxy implementation supports both the `http` and `https` schemes.
|
||||
|
||||
Developers of proxy implementations are encouraged to use whatever schemes make the most sense, and ignore configurations which they do not support. For instance, a `udp` proxy implementation can safely ignore `http` and `https` port mappings.
|
||||
|
||||
To change the proxy implementation in use for an application, use the `proxy:set` command:
|
||||
|
||||
```shell
|
||||
# no validation will be performed against
|
||||
# the specified proxy implementation
|
||||
dokku proxy:set node-js-app nginx
|
||||
```
|
||||
304
docs/advanced-usage/resource-management.md
Normal file
304
docs/advanced-usage/resource-management.md
Normal file
@@ -0,0 +1,304 @@
|
||||
# Resource Management
|
||||
|
||||
> New as of 0.15.0
|
||||
|
||||
```
|
||||
resource:limit [--process-type <process-type>] [RESOURCE_OPTS...] <app> # Limit resources for a given app/process-type combination
|
||||
resource:limit-clear [--process-type <process-type>] <app> # Limit resources for a given app/process-type combination
|
||||
resource:report [<app>] [<flag>] # Displays a resource report for one or more apps
|
||||
resource:reserve [--process-type <process-type>] [RESOURCE_OPTS...] <app> # Reserve resources for a given app/process-type combination
|
||||
resource:reserve-clear [--process-type <process-type>] <app> # Reserve resources for a given app/process-type combination
|
||||
```
|
||||
|
||||
The resource plugin is meant to allow users to limit or reserve resources for a given app/process-type combination.
|
||||
|
||||
## Usage
|
||||
|
||||
By default, Dokku allows unlimited resource access to apps deployed on a server. In some cases, it may be desirable to limit this on a per-app or per-process-type basis. The `resource` plugin allows management of both resource "limits" and resource "reservations", where each resource request type has specific meaning to the scheduler in use for a given app.
|
||||
|
||||
> The meaning of a values and it's units are specific to the scheduler in use for a given app. If a scheduler does not support a given resource type combination, it will be ignored. All resource commands require an app rebuild or deploy in order to take effect.
|
||||
|
||||
Valid resource options include:
|
||||
|
||||
- `--cpu`
|
||||
- `--memory`
|
||||
- `--memory-swap`
|
||||
- `--network`
|
||||
- `--network-ingress`
|
||||
- `--network-egress`
|
||||
|
||||
Resource limits and reservations are applied only during the `run` and `deploy` phases of an application, and will not impact the `build` phase of an application.
|
||||
|
||||
### Resource Limits
|
||||
|
||||
When specified and supported, a resource limit will ensure that your app does not go _over_ the specified value. If this occurs, the underlying scheduler may either cap resource utilization, or it may decide to terminate and reschedule your process.
|
||||
|
||||
Resource limits may be set via the `resource:limit` command:
|
||||
|
||||
```shell
|
||||
dokku resource:limit --memory 100 node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource limits for node-js-app
|
||||
memory: 100
|
||||
```
|
||||
|
||||
Multiple resources can be limited in a single call:
|
||||
|
||||
```shell
|
||||
dokku resource:limit --cpu 100 --memory 100 node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource limits for node-js-app
|
||||
cpu: 100
|
||||
memory: 100
|
||||
```
|
||||
|
||||
Resources can also be limited on a per-process type basis. If specified, this will override any generic limits set for the app.
|
||||
|
||||
```shell
|
||||
dokku resource:limit --cpu 100 --memory 100 --process-type worker node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource limits for node-js-app (worker)
|
||||
cpu: 100
|
||||
memory: 100
|
||||
```
|
||||
|
||||
#### Displaying Resource Limits
|
||||
|
||||
Running the `resource:limit` command without any flags will display the currently configured default app limits.
|
||||
|
||||
```shell
|
||||
dokku resource:limit node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> resource limits node-js-app information [defaults]
|
||||
cpu:
|
||||
memory:
|
||||
memory-swap: 100
|
||||
network: 100
|
||||
network-ingress:
|
||||
network-egress:
|
||||
```
|
||||
|
||||
This may also be combined with the `--process-type` flag to see app limits on a process-type level. Note that the displayed values are not merged with the defaults.
|
||||
|
||||
|
||||
```shell
|
||||
dokku resource:limit --process-type web node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> resource limits node-js-app information (web)
|
||||
cpu: 100
|
||||
memory: 100
|
||||
memory-swap:
|
||||
network:
|
||||
network-ingress:
|
||||
network-egress:
|
||||
```
|
||||
|
||||
#### Clearing Resource Limits
|
||||
|
||||
In cases where the values are incorrect - or there is no desire to limit resources - resource limits may be cleared using the `resource:limit-clear` command.
|
||||
|
||||
```shell
|
||||
dokku resource:limit-clear node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
-----> Clearing resource limit for node-js-app
|
||||
```
|
||||
|
||||
Defaults can also be cleared by leaving the app unspecified.
|
||||
|
||||
```shell
|
||||
dokku resource:limit-clear
|
||||
```
|
||||
|
||||
```
|
||||
-----> Clearing default resource limits
|
||||
```
|
||||
|
||||
### Resource Reservations
|
||||
|
||||
When specified and supported, a resource reservation will ensure that your server has _at least_ the specified resources before placing a given app's process. If there a resource exhaustion, future rebuilds and deploys may fail.
|
||||
|
||||
Resource reservations may be set via the `resource:reserve` command:
|
||||
|
||||
```shell
|
||||
dokku resource:reserve --memory 100 node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource reservation for node-js-app
|
||||
memory: 100
|
||||
```
|
||||
|
||||
Multiple resources can be limited in a single call:
|
||||
|
||||
```shell
|
||||
dokku resource:reserve --cpu 100 --memory 100 node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource reservation for node-js-app
|
||||
cpu: 100
|
||||
memory: 100
|
||||
```
|
||||
|
||||
Resources can also be limited on a per-process type basis. If specified, this will override any generic limits set for the app.
|
||||
|
||||
```shell
|
||||
dokku resource:reserve --cpu 100 --memory 100 --process-type worker node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> Setting resource reservation for node-js-app (worker)
|
||||
cpu: 100
|
||||
memory: 100
|
||||
```
|
||||
|
||||
#### Displaying Resource Reservations
|
||||
|
||||
Running the `resource:reserve` command without any flags will display the currently configured default app reservations.
|
||||
|
||||
```shell
|
||||
dokku resource:reserve node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> resource reservation node-js-app information [defaults]
|
||||
cpu: 100
|
||||
memory: 100
|
||||
memory-swap:
|
||||
network:
|
||||
network-ingress:
|
||||
network-egress:
|
||||
```
|
||||
|
||||
This may also be combined with the `--process-type` flag to see app reservations on a process-type level. Note that the displayed values are not merged with the defaults.
|
||||
|
||||
```shell
|
||||
dokku resource:reserve --process-type web node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> resource reservation node-js-app information (web)
|
||||
cpu: 100
|
||||
memory: 100
|
||||
memory-swap:
|
||||
network:
|
||||
network-ingress:
|
||||
network-egress:
|
||||
```
|
||||
|
||||
#### Clearing Resource Reservations
|
||||
|
||||
In cases where the values are incorrect - or there is no desire to reserve resources - resource reservations may be cleared using the `resource:reserve-clear` command.
|
||||
|
||||
```shell
|
||||
dokku resource:reserve-clear node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
-----> Clearing resource reservation for node-js-app
|
||||
```
|
||||
|
||||
Defaults can also be cleared by leaving the app unspecified.
|
||||
|
||||
```shell
|
||||
dokku resource:reserve-clear
|
||||
```
|
||||
|
||||
```
|
||||
-----> Clearing default resource reservation
|
||||
```
|
||||
|
||||
### Displaying resource reports for an app
|
||||
|
||||
You can get a report about the app's resource status using the `resource:report` command:
|
||||
|
||||
```shell
|
||||
dokku resource:report
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app resource information
|
||||
web limit cpu:
|
||||
web limit memory: 1024
|
||||
web limit memory swap: 0
|
||||
web limit network: 10
|
||||
web limit network ingress:
|
||||
web limit network egress:
|
||||
web reservation cpu:
|
||||
web reservation memory: 512
|
||||
web reservation memory swap:
|
||||
web reservation network: 8
|
||||
web reservation network ingress:
|
||||
web reservation network egress:
|
||||
=====> python-sample resource information
|
||||
web limit cpu:
|
||||
web limit memory:
|
||||
web limit memory swap:
|
||||
web limit network:
|
||||
web limit network ingress:
|
||||
web limit network egress:
|
||||
web reservation cpu:
|
||||
web reservation memory:
|
||||
web reservation memory swap:
|
||||
web reservation network:
|
||||
web reservation network ingress:
|
||||
web reservation network egress:
|
||||
=====> ruby-sample resource information
|
||||
web limit cpu:
|
||||
web limit memory:
|
||||
web limit memory swap:
|
||||
web limit network:
|
||||
web limit network ingress:
|
||||
web limit network egress:
|
||||
web reservation cpu:
|
||||
web reservation memory:
|
||||
web reservation memory swap:
|
||||
web reservation network:
|
||||
web reservation network ingress:
|
||||
web reservation network egress:
|
||||
```
|
||||
|
||||
You can run the command for a specific app also.
|
||||
|
||||
```shell
|
||||
dokku resource:report node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app resource information
|
||||
web limit cpu:
|
||||
web limit memory: 1024
|
||||
web limit memory swap: 0
|
||||
web limit network: 10
|
||||
web limit network ingress:
|
||||
web limit network egress:
|
||||
web reservation cpu:
|
||||
web reservation memory: 512
|
||||
web reservation memory swap:
|
||||
web reservation network: 8
|
||||
web reservation network ingress:
|
||||
web reservation network egress:
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
```shell
|
||||
# Note the periods in the flag name
|
||||
dokku resource:report node-js-app --resource-web.limit.memory
|
||||
```
|
||||
|
||||
```
|
||||
1024
|
||||
```
|
||||
74
docs/advanced-usage/schedulers/docker-local.md
Normal file
74
docs/advanced-usage/schedulers/docker-local.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# Docker Local Scheduler
|
||||
|
||||
> Subcommands new as of 0.12.12
|
||||
|
||||
```
|
||||
scheduler-docker-local:report [<app>] [<flag>] # Displays a scheduler-docker-local report for one or more apps
|
||||
scheduler-docker-local:set <app> <key> (<value>) # Set or clear a scheduler-docker-local property for an app
|
||||
```
|
||||
|
||||
> New as of 0.12.0
|
||||
|
||||
Dokku natively includes functionality to manage application lifecycles for a single server using the `scheduler-docker-local` plugin. It is the default scheduler, but as with all schedulers, it is set on a per-application basis. The scheduler can currently be overridden by running the following command:
|
||||
|
||||
```shell
|
||||
dokku config:set node-js-app DOCKER_SCHEDULER=docker-local
|
||||
```
|
||||
|
||||
As it is the default, unsetting the `DOCKER_SCHEDULER` config variable is also a valid way to reset the scheduler.
|
||||
|
||||
```shell
|
||||
dokku config:unset node-js-app DOCKER_SCHEDULER
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Disabling chown of persistent storage
|
||||
|
||||
The `scheduler-docker-local` plugin will ensure your storage mounts are owned by either `herokuishuser` or the overridden value you have set in `DOKKU_APP_USER`. You may disable this by running the following `scheduler-docker-local:set` command for your application:
|
||||
|
||||
```shell
|
||||
dokku scheduler-docker-local:set node-js-app disable-chown true
|
||||
```
|
||||
|
||||
Once set, you may re-enable it by setting a blank value for `disable-chown`:
|
||||
|
||||
```shell
|
||||
dokku scheduler-docker-local:set node-js-app disable-chown
|
||||
```
|
||||
|
||||
## Implemented Triggers
|
||||
|
||||
This plugin implements various functionality through `plugn` triggers to integrate with Docker for running apps on a single server. The following functionality is supported by the `scheduler-docker-local` plugin.
|
||||
|
||||
- `check-deploy`
|
||||
- `core-post-deploy`
|
||||
- `post-app-clone-setup`
|
||||
- `post-create`
|
||||
- `post-delete`
|
||||
- `pre-deploy`
|
||||
- `pre-restore`
|
||||
- `scheduler-deploy`
|
||||
- `scheduler-docker-cleanup`
|
||||
- `scheduler-inspect`
|
||||
- `scheduler-logs-failed`
|
||||
- `scheduler-logs`
|
||||
- `scheduler-retire`
|
||||
- `scheduler-run`
|
||||
- `scheduler-stop`
|
||||
- `scheduler-tags-create`
|
||||
- `scheduler-tags-destroy`
|
||||
|
||||
## Supported Resource Management Properties
|
||||
|
||||
The `docker-local` scheduler supports a minimal list of resource _limits_ and _reservations_. The following properties are supported:
|
||||
|
||||
### Resource Limits
|
||||
|
||||
- cpu: (docker option: `--cpus`), and is specified in number of CPUs a process can access.
|
||||
- memory: (docker option: `--memory`) and should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes)
|
||||
- memory-swap: (docker option: `--memory-swap`) and should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes)
|
||||
|
||||
### Resource Reservations
|
||||
|
||||
- memory: (docker option: `--memory-reservation`) and should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes)
|
||||
13
docs/appendices/0.10.0-migration-guide.md
Normal file
13
docs/appendices/0.10.0-migration-guide.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 0.10.0 Migration Guide
|
||||
|
||||
## PCI Compliance
|
||||
|
||||
By default, Dokku will ship a PCI Compliant nginx configuration. For developers whose users are on older browsers or mobile devices, you may need to ship a custom `nginx.conf.sigil` to enable ciphers for older browsers.
|
||||
|
||||
See the [nginx customization](/docs/configuration/nginx/#customizing-the-nginx-configuration) docs for more details.
|
||||
|
||||
## Nginx Error Pages
|
||||
|
||||
We now ship with nicer error pages by default. You are free to customize your Dokku installation via a custom `nginx.conf.sigil` to change what error pages are displayed in different circumstances.
|
||||
|
||||
See the [nginx customization](/docs/configuration/nginx/#customizing-the-nginx-configuration) docs for more details.
|
||||
@@ -5,13 +5,13 @@
|
||||
- The nginx-vhosts template language is now [sigil](https://github.com/gliderlabs/sigil)
|
||||
- No need to escape literal `$` characters (or other "bash-isms")
|
||||
- Template variables are represented as {{ .VARIABLE_NAME }}
|
||||
- A detailed list of template variables can be found [here](/dokku/configuration/nginx/#available-template-variables)
|
||||
- A detailed list of template variables can be found [here](/docs/configuration/nginx.md#available-template-variables)
|
||||
- A custom nginx-vhosts template must be named `nginx.conf.sigil`
|
||||
- The default path for this custom template is the root of your repo (i.e. `/app` in the container or `WORKDIR` if defined in a dockerfile app)
|
||||
- Dokku no longer looks for this file in `/home/dokku/myapp` on the Dokku server
|
||||
- Check out an example template [here](/dokku/configuration/nginx/)
|
||||
- Dokku no longer looks for this file in `/home/dokku/node-js-app` on the Dokku server
|
||||
- Check out an example template [here](/docs/configuration/nginx.md)
|
||||
- Support for server-wide SSL certs have been dropped in favor of using the `certs` plugin
|
||||
- `dokku certs:add myapp < certs.tar`
|
||||
- `dokku certs:add node-js-app < certs.tar`
|
||||
- All domains for an SSL-enabled app will be redirected to https by default
|
||||
- This can be overridden with a custom template
|
||||
- Replaced "magic" `NO_VHOST` variable with `domains:enable/disable`
|
||||
@@ -20,6 +20,6 @@
|
||||
|
||||
## Dockerfile apps with exposed ports
|
||||
|
||||
- Dockerfiles with `EXPOSE` clauses will get [all **tcp** ports proxied by default](/dokku/deployment/methods/dockerfiles/#exposed-ports)
|
||||
- Dockerfiles with `EXPOSE` clauses will get [all **tcp** ports proxied by default](/docs/deployment/methods/dockerfiles.md#exposed-ports)
|
||||
- Note that nginx will proxy the same port numbers to listen publicly
|
||||
- UDP ports can be exposed by disabling the [nginx proxy](/dokku/advanced-usage/proxy-management/) with `dokku proxy:disable myapp`
|
||||
- UDP ports can be exposed by disabling the [nginx proxy](/docs/advanced-usage/proxy-management.md) with `dokku proxy:disable node-js-app`
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
- `DOKKU_CHECKS_ENABLED` has been migrated to `DOKKU_CHECKS_SKIPPED`
|
||||
- `DOKKU_CHECKS_DISABLED` is now a thing
|
||||
- The values for the above can be a comma-separated list of process-types or the literal string `_all_`
|
||||
- See the [updated `checks`](/dokku/deployment/zero-downtime-deploys/) docs for more info
|
||||
- See the [updated `checks`](/docs/deployment/zero-downtime-deploys.md) docs for more info
|
||||
|
||||
## Proxy port mapping
|
||||
|
||||
- You can now configure host -> container proxy port mappings
|
||||
- The UI is handled by the [proxy](/dokku/advanced-usage/proxy-management/) interface plugin by setting the `DOKKU_PROXY_PORT_MAP` config variable in the format of `scheme:host-port:container-port`. The default `nginx-vhosts` proxy plugin supports both the `http` and `https` schemes.
|
||||
- The UI is handled by the [proxy](/docs/advanced-usage/proxy-management.md) interface plugin by setting the `DOKKU_PROXY_PORT_MAP` config variable in the format of `scheme:host-port:container-port`. The default `nginx-vhosts` proxy plugin supports both the `http` and `https` schemes.
|
||||
- Default port mappings
|
||||
- buildpack apps will be set to `http:80:5000` and will also include `https:443:5000` if SSL is enabled.
|
||||
- dockerfile apps with explicitly exposed ports (i.e. using the `EXPOSE` directive) will be configured with a listener on each exposed port that proxies to the same port of the deployed application container.
|
||||
- You may override this behavior with the [`proxy:ports-*` commands](/dokku/advanced-usage/proxy-management/) or by directly setting `DOKKU_PROXY_PORT_MAP` with the `config:set` command
|
||||
- You may override this behavior with the [`proxy:ports-*` commands](/docs/advanced-usage/proxy-management.md) or by directly setting `DOKKU_PROXY_PORT_MAP` with the `config:set` command
|
||||
- dockerfile apps without explicitly exposed ports will behave the same as a buildpack app
|
||||
- NOTE: These defaults **are not** automatically changed on subsequent pushes and must be manipulated with the aforementioned commands
|
||||
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
## Persistent Storage
|
||||
|
||||
We should now properly handle file ownership for mounted directories. This was enhanced in 0.7.1. See the [persistent storage documentation](/dokku/advanced-usage/persistent-storage/) for more details.
|
||||
We should now properly handle file ownership for mounted directories. This was enhanced in 0.7.1. See the [persistent storage documentation](/docs/advanced-usage/persistent-storage.md) for more details.
|
||||
|
||||
## Restart Policies
|
||||
|
||||
If you previously managed container restart policies via docker-options, these can now be managed natively via the built-in `ps` plugin. There is no migration necessary. See the [restart policy documentation](/dokku/deployment/process-management/#restart-policies) for more details.
|
||||
If you previously managed container restart policies via docker-options, these can now be managed natively via the built-in `ps` plugin. There is no migration necessary. See the [restart policy documentation](/docs/deployment/process-management.md#restart-policies) for more details.
|
||||
|
||||
## SSH Keys
|
||||
|
||||
Dokku now has an `ssh-keys` plugin that can be used to manage ssh keys for the `dokku` user on the host operating system. See the [user management documentation](/dokku/deployment/user-management/) for more details.
|
||||
Dokku now has an `ssh-keys` plugin that can be used to manage ssh keys for the `dokku` user on the host operating system. See the [user management documentation](/docs/deployment/user-management.md) for more details.
|
||||
|
||||
19
docs/appendices/0.8.0-migration-guide.md
Normal file
19
docs/appendices/0.8.0-migration-guide.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# 0.8.0 Migration Guide
|
||||
|
||||
## Domain Management
|
||||
|
||||
You can now set global and app domains via `domains:set` and `domains:set-global`. See the [domains documentation](/docs/configuration/domains/) for more details.
|
||||
|
||||
## Plugin Uninstallation
|
||||
|
||||
A new `uninstall` plugin trigger was introduced. This functionality may be in use for newer plugins, so be aware that older Dokku versions may require manual cleanup.
|
||||
|
||||
See the [uninstall trigger documentation](/docs/development/plugin-triggers/#uninstall) for implementation instructions.
|
||||
|
||||
## Deployment Tasks
|
||||
|
||||
Should a pre or post deployment task fail, we now fail the entire deploy.
|
||||
|
||||
## Nginx HTTP2 Support
|
||||
|
||||
Due to bugs in Nginx, the minimum version for HTTP2 is now 1.11.5.
|
||||
12
docs/appendices/0.9.0-migration-guide.md
Normal file
12
docs/appendices/0.9.0-migration-guide.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 0.9.0 Migration Guide
|
||||
|
||||
## Golang Migration
|
||||
|
||||
There is an ongoing migration to rewrite Dokku in Golang. The reasons are beyond the scope of this document, but this may impact any patches you have for Dokku. As of 0.9.0, only the `repo` plugin is in Golang.
|
||||
|
||||
The following shall remain true, regardless of the state of our rewrite:
|
||||
|
||||
- You will be able to write custom plugins in any language.
|
||||
- You will be able to enable or disable core plugins.
|
||||
- `plugn` will continue to be used for executing plugin triggers.
|
||||
- We will provide bash wrappers that can be sourced to execute core functionality that is implemented in golang.
|
||||
@@ -2,10 +2,10 @@
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square70x70logo src="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/mstile-70x70.png"/>
|
||||
<square150x150logo src="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/mstile-150x150.png"/>
|
||||
<square310x310logo src="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/mstile-310x310.png"/>
|
||||
<wide310x150logo src="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/mstile-310x150.png"/>
|
||||
<square70x70logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/mstile-70x70.png"/>
|
||||
<square150x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/mstile-150x150.png"/>
|
||||
<square310x310logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/mstile-310x310.png"/>
|
||||
<wide310x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/mstile-310x150.png"/>
|
||||
<TileColor>#da532c</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
|
||||
@@ -2,37 +2,37 @@
|
||||
"name": "Dokku",
|
||||
"icons": [
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-36x36.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-48x48.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-72x72.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-96x96.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-144x144.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.8.2\/docs\/assets\/favicons\/android-chrome-192x192.png",
|
||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.17.6\/docs\/assets\/favicons\/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 62.5%;
|
||||
font-weight: 400;
|
||||
padding-bottom: 40px;
|
||||
color: #5a5a5a;
|
||||
@@ -19,7 +20,7 @@ h1 {
|
||||
}
|
||||
.header .heading {
|
||||
color: #fff;
|
||||
font-size: 23px;
|
||||
font-size: 2.4em;
|
||||
margin: 7px 0 0 0;
|
||||
padding: 0 0 0 1em;
|
||||
}
|
||||
@@ -34,28 +35,37 @@ h1 {
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.header .nav-item a {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
.header .navbar-brand a {
|
||||
background-image: url(https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/dokku.png);
|
||||
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/dokku.png);
|
||||
text-indent: 40px;
|
||||
}
|
||||
.blurb {
|
||||
color: #424242;
|
||||
background-color: #ededed;
|
||||
background-image: url(https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/gplaypattern.png);
|
||||
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/gplaypattern.png);
|
||||
padding: 45px 0;
|
||||
text-align: center;
|
||||
}
|
||||
.blurb h2 {
|
||||
font-size: 3.5em;
|
||||
}
|
||||
.blurb p {
|
||||
font-size: 17px;
|
||||
font-size: 1.9em;
|
||||
font-weight: 300;
|
||||
margin: 18px 0;
|
||||
text-align: center;
|
||||
}
|
||||
.blurb .btn-lg {
|
||||
font-size: 2.2em;
|
||||
}
|
||||
.quickstart-code {
|
||||
display: block;
|
||||
line-height: 1.3em;
|
||||
margin: 45px auto;
|
||||
max-width: 750px;
|
||||
max-width: 860px;
|
||||
padding: 0;
|
||||
}
|
||||
.quickstart-code .title {
|
||||
@@ -65,6 +75,7 @@ h1 {
|
||||
box-shadow: 0 3px 0 rgba(0, 0, 0, 0.5);
|
||||
color: #444;
|
||||
display: block;
|
||||
font-size: 1.6em;
|
||||
font-weight: 400;
|
||||
margin: 0 20px;
|
||||
padding: 3px 0;
|
||||
@@ -103,6 +114,7 @@ h1 {
|
||||
border-top: 1px solid #bcbcbc;
|
||||
box-shadow: 0 5px 30px rgba(0, 0, 0, 0.3);
|
||||
display: none;
|
||||
font-size: 1.4em;
|
||||
font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
|
||||
margin: 0 20px;
|
||||
padding: 20px;
|
||||
@@ -136,9 +148,10 @@ h1 {
|
||||
}
|
||||
.alternate-instructions {
|
||||
display: block;
|
||||
font-size: 1.6em;
|
||||
line-height: 1.3em;
|
||||
margin: 45px auto;
|
||||
max-width: 750px;
|
||||
max-width: 860px;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -164,12 +177,14 @@ h1 {
|
||||
.featurette img {
|
||||
width: 400px;
|
||||
}
|
||||
.slack-channel {
|
||||
.slack-channel,
|
||||
.sponsors {
|
||||
background-color: #EEF1F7;
|
||||
font-size: 16px;
|
||||
font-size: 1.6em;
|
||||
font-weight: 300;
|
||||
margin-bottom: 2.5em;
|
||||
padding: 2.5em 0;
|
||||
padding-top: 2.5em;
|
||||
padding-bottom: 2.5em;
|
||||
text-align: center
|
||||
}
|
||||
.slack-channel .inline-container {
|
||||
@@ -185,31 +200,38 @@ h1 {
|
||||
.slack-button img {
|
||||
height: 1em;
|
||||
}
|
||||
.team-members img {
|
||||
-moz-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
.sponsors {
|
||||
background-color: #272822;
|
||||
color: #FCFCFC;
|
||||
}
|
||||
.sponsors a {
|
||||
color: #f0ad4e;
|
||||
}
|
||||
.sponsors .backer img,
|
||||
.sponsors .sponsor img {
|
||||
-webkit-border-radius: 3px;
|
||||
-webkit-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
border-radius: 3px;
|
||||
border: 8px solid white;
|
||||
box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
display: block;
|
||||
height: 200px;
|
||||
border: 8px solid gray;
|
||||
margin: 20px auto 20px auto;
|
||||
max-width: 192px;
|
||||
}
|
||||
.team-members .fund-link {
|
||||
.sponsors .backer img {
|
||||
-webkit-border-radius: 50%;
|
||||
border-radius: 50%;
|
||||
border: 0;
|
||||
}
|
||||
.sponsors img:hover {
|
||||
-moz-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
-webkit-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
box-shadow: 0px 0px 32px 0px rgba(0,0,0,0.75);
|
||||
}
|
||||
.sponsors .fund-link {
|
||||
display: block;
|
||||
font-size: 80%;
|
||||
font-size: .8em;
|
||||
}
|
||||
.team-member {
|
||||
min-height: 320px;
|
||||
}
|
||||
.team-member-image img:last-child { display: none }
|
||||
.team-member-image:hover img:first-child { display: none; }
|
||||
.team-member-image:hover img:last-child { display: inline-block; }
|
||||
|
||||
.list-group-item {
|
||||
border: none;
|
||||
font-size: 14px;
|
||||
font-size: 1.1em;
|
||||
font-weight: normal;
|
||||
padding: .2rem .5rem;
|
||||
color: #157577;
|
||||
@@ -230,7 +252,7 @@ a.list-group-item {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.table-of-contents {
|
||||
font-size: 0.8em;
|
||||
font-size: 1.2em;
|
||||
padding: 1em;
|
||||
margin: 0 0 0.5em 0.5em;
|
||||
}
|
||||
@@ -245,6 +267,7 @@ a.list-group-item {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
box-sizing: border-box;
|
||||
color: rgb(71, 74, 84);
|
||||
font-size: 1.6em;
|
||||
font-weight: normal;
|
||||
height: 20px;
|
||||
line-height: 1.5;
|
||||
@@ -253,26 +276,26 @@ a.list-group-item {
|
||||
.markdown-body h1 {
|
||||
border-bottom: 1px solid #dfdfdf;
|
||||
color: #444;
|
||||
font-size: 24px;
|
||||
font-size: 1.6em;
|
||||
padding-bottom: 1em;
|
||||
margin-top: 0;
|
||||
text-rendering: optimizelegibility;
|
||||
}
|
||||
.markdown-body h2 {
|
||||
font-size: 17px;
|
||||
font-size: 1.3em;
|
||||
font-weight: 700;
|
||||
color: #555;
|
||||
margin-top: 2em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.markdown-body h3 {
|
||||
font-size: 15px;
|
||||
font-size: 1.2em;
|
||||
font-weight: 700;
|
||||
color: #555;
|
||||
margin: 1em 0;
|
||||
}
|
||||
.markdown-body h4 {
|
||||
font-size: 14px;
|
||||
font-size: 1.1em;
|
||||
font-weight: 700;
|
||||
color: #555;
|
||||
margin: 1em 0;
|
||||
@@ -294,7 +317,7 @@ a.list-group-item {
|
||||
right: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
font-size: 0.9em;
|
||||
font-size: 1.2em;
|
||||
border-radius: 0 0 0 5px;
|
||||
padding: 0 0.5em;
|
||||
text-shadow: none;
|
||||
@@ -318,7 +341,6 @@ code {
|
||||
padding-top: 0.2em;
|
||||
padding-bottom: 0.2em;
|
||||
margin: 0;
|
||||
font-size: 85%;
|
||||
background-color: #fff;
|
||||
background-color: rgba(0, 0, 0, 0.06);
|
||||
color: #333;
|
||||
@@ -366,6 +388,11 @@ blockquote {
|
||||
border-left: 4px solid #ef5b58;
|
||||
background-color: #f9ad76;
|
||||
}
|
||||
.warning {
|
||||
border-left: 4px solid #cd2512;
|
||||
background-color: #d1675f;
|
||||
color: white;
|
||||
}
|
||||
.fa:before {
|
||||
-webkit-font-smoothing: antialiased
|
||||
}
|
||||
@@ -414,10 +441,9 @@ blockquote {
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
.git-improve {
|
||||
font-size: 20px;
|
||||
vertical-align: -2px;
|
||||
padding-left: 8px;
|
||||
}
|
||||
@@ -432,7 +458,6 @@ blockquote {
|
||||
.icon-improve {
|
||||
color: #bdbdb5;
|
||||
padding: 2px 9px 0 10px;
|
||||
font-size: 14px;
|
||||
}
|
||||
a .fa {
|
||||
display: inline-block;
|
||||
@@ -583,7 +608,7 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
|
||||
background-image: -ms-linear-gradient(-45deg, rgba(0, 0, 0, 0.04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.04) 50%, rgba(0, 0, 0, 0.04) 75%, transparent 75%, transparent);
|
||||
background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.04) 50%, rgba(0, 0, 0, 0.04) 75%, transparent 75%, transparent);
|
||||
font-family: "Roboto", Corbel, Avenir, "Lucida Grande", "Lucida Sans", sans-serif;
|
||||
font-size: 14px;
|
||||
font-size: 1.6em;
|
||||
text-align: center;
|
||||
background-color: #ffe761;
|
||||
}
|
||||
@@ -600,18 +625,20 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
|
||||
height: auto
|
||||
}
|
||||
}
|
||||
|
||||
.button.slack-button > img {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.col-md-offset-right-2 {
|
||||
margin-right: 20.666667%;
|
||||
}
|
||||
.quickstart-code shell {
|
||||
font-size: 14px;
|
||||
}
|
||||
.quickstart-code {
|
||||
line-height: 22px;
|
||||
}
|
||||
.featurette-heading {
|
||||
font-size: 50px;
|
||||
font-size: 5em;
|
||||
}
|
||||
}
|
||||
@media (min-width: 992px) {
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
{
|
||||
"max-versions": [
|
||||
"0.3.26",
|
||||
"0.4.14",
|
||||
"0.5.8",
|
||||
"0.6.5",
|
||||
"0.7.2",
|
||||
"0.8.2"
|
||||
"0.3.26",
|
||||
"0.4.14",
|
||||
"0.5.8",
|
||||
"0.6.5",
|
||||
"0.7.2",
|
||||
"0.8.2",
|
||||
"0.9.4",
|
||||
"0.10.5",
|
||||
"0.11.6",
|
||||
"0.12.13",
|
||||
"0.13.4",
|
||||
"0.14.6",
|
||||
"0.15.5",
|
||||
"0.16.4",
|
||||
"0.17.6"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -12,11 +12,11 @@ Let's take a quick look at the current Dokku nginx plugin that's shipped with Do
|
||||
|
||||
## Installing a plugin
|
||||
|
||||
[See the plugin management documentation](/dokku/advanced-usage/plugin-management/).
|
||||
[See the plugin management documentation](/docs/advanced-usage/plugin-management.md).
|
||||
|
||||
## Creating your own plugin
|
||||
|
||||
[See the full documentation](/dokku/development/plugin-creation/).
|
||||
[See the full documentation](/docs/development/plugin-creation.md).
|
||||
|
||||
## Official Plugins (Beta)
|
||||
|
||||
@@ -44,7 +44,7 @@ The following plugins are available and provided by Dokku maintainers. Where not
|
||||
|
||||
## Community plugins
|
||||
|
||||
Note: The following plugins have been supplied by our community and may not have been tested by Dokku maintainers.
|
||||
> Warning: The following plugins have been supplied by our community and may not have been tested by Dokku maintainers.
|
||||
|
||||
[256dpi]: https://github.com/256dpi
|
||||
[abossard]: https://github.com/dudagroup
|
||||
@@ -57,6 +57,7 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
[Aluxian]: https://github.com/Aluxian
|
||||
[Aomitayo]: https://github.com/Aomitayo
|
||||
[apmorton]: https://github.com/apmorton
|
||||
[artofrawr]: https://github.com/artofrawr
|
||||
[basgys]: https://github.com/basgys
|
||||
[Benjamin-Dobell]: https://github.com/Benjamin-Dobell
|
||||
[blag]: https://github.com/blag
|
||||
@@ -89,15 +90,19 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
[Kloadut]: https://github.com/Kloadut
|
||||
[krisrang]: https://github.com/krisrang
|
||||
[luxifer]: https://github.com/luxifer
|
||||
[m0rth1um]: https://github.com/m0rth1um
|
||||
[Maciej Łebkowski]: https://github.com/mlebkowski
|
||||
[matto1990]: https://github.com/matto1990
|
||||
[mbreit]: https://github.com/mbreit
|
||||
[mbriskar]: https://github.com/mbriskar
|
||||
[michaelshobbs]: https://github.com/michaelshobbs
|
||||
[mikecsh]: https://github.com/mikecsh
|
||||
[mikexstudios]: https://github.com/mikexstudios
|
||||
[mimischi]: https://github.com/mimischi
|
||||
[mixxorz]: https://github.com/mixxorz
|
||||
[mlebkowski]: https://github.com/mlebkowski
|
||||
[motin]: https://github.com/motin
|
||||
[mrname]: https://github.com/mrname
|
||||
[musicglue]: https://github.com/musicglue
|
||||
[neam]: https://github.com/neam
|
||||
[nickcharlton]: https://github.com/nickcharlton
|
||||
@@ -121,6 +126,9 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
[wmluke]: https://github.com/wmluke
|
||||
[Zenedith]: https://github.com/Zenedith
|
||||
[fteychene]: https://github.com/fteychene
|
||||
[sarendsen]: https://github.com/sarendsen
|
||||
[baikunz]: https://github.com/baikunz
|
||||
[lazyatom]: https://github.com/lazyatom
|
||||
|
||||
### Datastores
|
||||
|
||||
@@ -150,6 +158,7 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
| [RabbitMQ](https://github.com/jlachowski/dokku-rabbitmq-plugin) | [jlachowski][] | 0.3.x |
|
||||
| [RabbitMQ (single container)](https://github.com/jlachowski/dokku-rabbitmq-single-plugin) | [jlachowski][] | 0.3.x |
|
||||
| [ElasticMQ (SQS compatible)](https://github.com/cu12/dokku-elasticmq) | [cu12][] | 0.5.0+ |
|
||||
| [VerneMQ (MQTT Broker)](https://github.com/SpinifexGroup/dokku-vernemq) | [mrname][] | 0.4.0+ |
|
||||
|
||||
#### Other
|
||||
|
||||
@@ -159,6 +168,7 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
| [FakeSNS](https://github.com/cu12/dokku-fake_sns) | [cu12][] | 0.5.0+ |
|
||||
| [InfluxDB](https://github.com/basgys/dokku-influxdb) | [basgys][] | 0.4.x |
|
||||
| [RethinkDB](https://github.com/stuartpb/dokku-rethinkdb-plugin) | [stuartpb][] | 0.3.x |
|
||||
| [Headless Chrome](https://github.com/lazyatom/dokku-chrome) | [lazyatom][] | 0.8.1+ |
|
||||
|
||||
[dccee02]: https://github.com/jeffutter/dokku-riakcs-plugin/commit/dccee02702e7001851917b7814e78a99148fb709
|
||||
[c77cbf1]: https://github.com/dokku/dokku/commit/c77cbf1d3ae07f0eafb85082ed7edcae9e836147
|
||||
@@ -172,14 +182,15 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
| [Docker Direct](https://github.com/josegonzalez/dokku-docker-direct) | [josegonzalez][] | 0.4.0+ |
|
||||
| [Dokku Clone](https://github.com/crisward/dokku-clone) | [crisward][] | 0.4.0+ |
|
||||
| [Dokku Copy App Config Files](https://github.com/josegonzalez/dokku-supply-config) | [josegonzalez][] | 0.4.0+ |
|
||||
| [Dockerfile custom path](https://github.com/mimischi/dokku-dockerfile) | [mimischi][] | 0.8.0+ |
|
||||
| [Dokku Registry](https://github.com/agco-adm/dokku-registry)<sup>1</sup> | [agco-adm][] | 0.4.0+ |
|
||||
| [Dokku Require](https://github.com/crisward/dokku-require)<sup>2</sup> | [crisward][] | 0.4.0+ |
|
||||
| [git rev-parse HEAD in env](https://github.com/cjblomqvist/dokku-git-rev) | [cjblomqvist][] | 0.4.0+ |
|
||||
| [Global Certificates](https://github.com/josegonzalez/dokku-global-cert) | [josegonzalez][] | 0.5.0+ |
|
||||
| [Graduate (Environment Management)](https://github.com/glassechidna/dokku-graduate) | [Benjamin-Dobell][] | 0.4.0+ |
|
||||
| [Haproxy tcp load balancer](https://github.com/256dpi/dokku-haproxy) | [256dpi][] | 0.4.0+ |
|
||||
| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
|
||||
| [HTTP Auth Secure Apps](https://github.com/matto1990/dokku-secure-apps) | [matto1990][] | 0.4.0+ |
|
||||
| [Monit (Health Checks)](https://github.com/mbreit/dokku-monit) | [mbreit][] | 0.8.0+ |
|
||||
| [Nuke Containers](https://github.com/josegonzalez/dokku-nuke) | [josegonzalez][] | 0.4.0+ |
|
||||
| [Open App Ports](https://github.com/josegonzalez/dokku-ports) | [josegonzalez][] | 0.3.x |
|
||||
| [Proctype Filter](https://github.com/michaelshobbs/dokku-proctype-filter) | [michaelshobbs][] | 0.4.0+ |
|
||||
@@ -187,6 +198,7 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
| [SSH Deployment Keys](https://github.com/cedricziel/dokku-deployment-keys)<sup>3</sup> | [cedricziel][] | 0.4.0+ |
|
||||
| [SSH Hostkeys](https://github.com/cedricziel/dokku-hostkeys-plugin)<sup>4</sup> | [cedricziel][] | 0.3.x |
|
||||
| [Application build hook](https://github.com/fteychene/dokku-build-hook) | [fteychene][] | 0.4.0+ |
|
||||
| [Post Deploy Script](https://github.com/baikunz/dokku-post-deploy-script) | [baikunz][] | 0.4.0+ |
|
||||
|
||||
[217d00a]: https://github.com/dokku/dokku/commit/217d00a1bc47a7e24d8847617bb08a1633025fc7
|
||||
|
||||
@@ -212,14 +224,18 @@ Note: The following plugins have been supplied by our community and may not have
|
||||
| [Chef cookbook](https://github.com/nickcharlton/dokku-cookbook) | [nickcharlton][] | |
|
||||
| [Docker auto persist volumes](https://github.com/Flink/dokku-docker-auto-volumes) | [Flink][] | 0.4.0+ |
|
||||
| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
|
||||
| [Limit (Resource management)](https://github.com/sarendsen/dokku-limit) | [sarendsen][] | 0.9.0+ |
|
||||
| [Logspout](https://github.com/michaelshobbs/dokku-logspout) | [michaelshobbs][] | 0.4.0+ |
|
||||
| [Syslog](https://github.com/michaelshobbs/dokku-syslog) | [michaelshobbs][] | 0.10.4+ |
|
||||
| [Long Timeout](https://github.com/investtools/dokku-long-timeout-plugin) | [investtools][] | 0.4.0+ |
|
||||
| [Monit](https://github.com/cjblomqvist/dokku-monit) | [cjblomqvist][] | 0.3.x |
|
||||
| [Monorepo](https://github.com/iamale/dokku-monorepo) | [iamale][] | 0.4.0+ |
|
||||
| [Multi Dockerfile](https://github.com/artofrawr/dokku-multi-dockerfile) | [artofrawr][] | 0.4.0+ |
|
||||
| [Node](https://github.com/ademuk/dokku-nodejs) | [ademuk][] | 0.3.x |
|
||||
| [Node](https://github.com/pnegahdar/dokku-node) | [pnegahdar][] | 0.3.x |
|
||||
| [Rollbar](https://github.com/iloveitaly/dokku-rollbar) | [iloveitaly][] | 0.5.0+ |
|
||||
| [Slack Notifications](https://github.com/ribot/dokku-slack) | [ribot][] | 0.4.0+ |
|
||||
| [Telegram Notifications](https://github.com/m0rth1um/dokku-telegram) | [m0rth1um][] | 0.4.0+ |
|
||||
| [Tor](https://github.com/michaelshobbs/dokku-tor) | [michaelshobbs][] | 0.4.0+ |
|
||||
| [User ACL](https://github.com/dokku-community/dokku-acl) | [Maciej Łebkowski][] | 0.4.0+ |
|
||||
| [Webhooks](https://github.com/nickstenning/dokku-webhooks) | [nickstenning][] | 0.3.x |
|
||||
@@ -239,6 +255,7 @@ The following plugins have been removed as their functionality is now in Dokku C
|
||||
| [Docker Options](https://github.com/dyson/dokku-docker-options) | [dyson][] | v0.3.17 (docker-options plugin) |
|
||||
| [Dokku Name](https://github.com/alex-sherwin/dokku-name) | [alex-sherwin][] | v0.4.2 (named containers plugin) |
|
||||
| [Events Logger](https://github.com/alessio/dokku-events) | [alessio][] | v0.3.21 (events plugin) |
|
||||
| [git rev-parse HEAD in env](https://github.com/dokku-community/dokku-git-rev) | [cjblomqvist][] | v0.12.0 (enhanced core git plugin) |
|
||||
| [Host Port binding](https://github.com/stuartpb/dokku-bind-port) | [stuartpb][] | v0.3.17 (docker-options plugin) |
|
||||
| [Link Containers](https://github.com/rlaneve/dokku-link) | [rlaneve][] | v0.3.17 (docker-options plugin) |
|
||||
| [List Containers](https://github.com/josegonzalez/dokku-list) | [josegonzalez][] | v0.3.14 (ps plugin) |
|
||||
|
||||
108
docs/community/tutorials/deploying-with-gitlab-ci.md
Normal file
108
docs/community/tutorials/deploying-with-gitlab-ci.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Deploying with Gitlab CI
|
||||
|
||||
Gitlab-CI can be used to automatically deploy a Dokku application using the [ilyasemenov/gitlab-ci-git-push image](https://github.com/IlyaSemenov/gitlab-ci-git-push) docker image.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Make sure you have a Gitlab account and a Dokku project hosted on Gitlab. This method works whether if you are using buildpacks or Dockerfile.
|
||||
|
||||
Make sure you have set up an app on the remote machine following [these instructions](http://dokku.viewdocs.io/dokku/deployment/application-deployment/) and can successfully deploy to it from the local machine.
|
||||
|
||||
## Deploy automatically to production
|
||||
|
||||
### Add a secret variable
|
||||
|
||||
Browse to the repository in question and visit the following path: `the Gitlab project > Settings > CI/CD.`
|
||||
|
||||
Click on `Secret variables > Expand` and fill in the blanks.
|
||||
|
||||
- Key: `SSH_PRIVATE_KEY`
|
||||
- Value: paste in an SSH private key registered in Dokku:
|
||||
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
...
|
||||
-----END RSA PRIVATE KEY-----
|
||||
|
||||
- Environment scope: `production` (This make sure that `SSH_PRIVATE_KEY` is not available on merge requests or tests)
|
||||
- Protected: Do not check this checkbox unless you know what you are doing
|
||||
|
||||
### Add CI script
|
||||
|
||||
Create a file named `.gitlab-ci.yml` at the root directory of the repository with the following contents:
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
APP_NAME: node-js-app
|
||||
|
||||
deploy:
|
||||
image: ilyasemenov/gitlab-ci-git-push
|
||||
stage: deploy
|
||||
environment:
|
||||
name: production
|
||||
url: https://$APP_NAME.dokku.me/
|
||||
only:
|
||||
- master
|
||||
script:
|
||||
- git-push ssh://dokku@dokku.me:22/$APP_NAME
|
||||
```
|
||||
|
||||
You will need to modify the `APP_NAME` variable to the correct value for your application name.
|
||||
|
||||
Running `git push origin master` will now trigger a gitlab-ci pipeline that will automatically deploy your application to your Dokku server. Go to your project on Gitlab and visit "Project > Pipelines" to see the deployment log.
|
||||
|
||||
|
||||
## Review Applications
|
||||
|
||||
One useful feature of gitlab is to be able to create review applications for non-production branches. This allows teams to review changes _before_ they are pushed to production. First, recreate the `SSH_PRIVATE_KEY` secret - do not delete the existing secret - but scoped to the `review/*` environment. This will allow non-production gitlab environments access to the secret.
|
||||
|
||||
Next, we'll need to create the `review_app` gitlab job in our `.gitlab-ci.yaml`.
|
||||
|
||||
```yaml
|
||||
review_app:
|
||||
image: ilyasemenov/gitlab-ci-git-push
|
||||
stage: deploy
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.dokku.me/
|
||||
on_stop: stop_review_app
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
script:
|
||||
- mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan -H 22 "dokku.me" >> ~/.ssh/known_hosts
|
||||
- ssh -t dokku@dokku.me -- apps:clone --ignore-existing --skip-deploy "$APP_NAME" "$CI_ENVIRONMENT_SLUG"
|
||||
- git-push ssh://dokku@dokku.me:22/$CI_ENVIRONMENT_SLUG
|
||||
```
|
||||
|
||||
The first two lines ensure that Gitlab can talk to the Dokku server. Next, we take advantage of the `apps:clone` command, and clone the existing application and all of it's configuration to a new location. If the new application already exists, the third line of the `script` step will be ignored. We also ignore the first deploy script to speed up the cloning process. Finally, the fourth line of the `script` step will deploy the code as normal.
|
||||
|
||||
The above only runs for non-master branches, and will _also_ trigger an `on_stop` job called `stop_review_app`. When the branch is deleted or the code is merged, the `stop_review_app` job will be triggered.
|
||||
|
||||
```yaml
|
||||
stop_review_app:
|
||||
image: ilyasemenov/gitlab-ci-git-push
|
||||
stage: deploy
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
when: manual
|
||||
script:
|
||||
- mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
|
||||
- ssh-keyscan -H 22 "dokku.me" >> ~/.ssh/known_hosts
|
||||
- ssh -t dokku@dokku.me -- --force apps:destroy "$CI_ENVIRONMENT_SLUG"
|
||||
```
|
||||
|
||||
The `stop_review_app` step will delete the temporary application, cleaning up now unused server resources.
|
||||
|
||||
Going further, the following modifications can be done:
|
||||
|
||||
- Notify via chat whenever a review application is created/destroyed.
|
||||
- Push to a separate, staging server as opposed to a production server.
|
||||
- Clone a "staging" application so that review applications do not affect production datasets.
|
||||
78
docs/community/tutorials/run-on-external-volume.md
Normal file
78
docs/community/tutorials/run-on-external-volume.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# Run Dokku on External Volume
|
||||
|
||||
In order to leverage cloud-provider facilities like _attachable volumes_, (_a.k.a. block storage_)
|
||||
the following is an easy tutorial to achieve Dokku runs on them.
|
||||
|
||||
> Warning: If the block storage is not available and attached on boot it is possible that containers will not correctly start. Please keep this in mind when considering moving Dokku and/or Docker to network attached storage.
|
||||
|
||||
## Tutorial
|
||||
|
||||
The following is intended to be executed on the dokku host machine as `root`.
|
||||
Say, _for instance_, that our volume is mapped into the systems as `/dev/vdb1`.
|
||||
|
||||
Stop docker daemon
|
||||
|
||||
```shell
|
||||
systemctl stop docker
|
||||
```
|
||||
|
||||
Prepare the filesystem:
|
||||
|
||||
```shell
|
||||
mkfs -t ext4 /dev/vdb1
|
||||
mkdir /mnt/volume
|
||||
mount /dev/vdb1 /mnt/volume
|
||||
```
|
||||
|
||||
Move the old data directories:
|
||||
|
||||
```shell
|
||||
mv /home/dokku /home/dokku.OLD
|
||||
mv /var/lib/docker /var/lib/docker.OLD
|
||||
mv /var/lib/dokku /var/lib/dokku.OLD
|
||||
```
|
||||
|
||||
Move the data on the volume
|
||||
|
||||
```shell
|
||||
mkdir /mnt/volume/home/
|
||||
mkdir /mnt/volume/var/lib/
|
||||
mv /home/dokku.OLD /mnt/volume/home/dokku
|
||||
mv /var/lib/dokku.OLD /mnt/volume/var/lib/dokku
|
||||
mv /var/lib/docker.OLD /mnt/volume/var/lib/docker
|
||||
```
|
||||
|
||||
Prepare the mountpoints
|
||||
|
||||
```shell
|
||||
mkdir /home/dokku
|
||||
mkdir /var/lib/dokku
|
||||
mkdir /var/lib/docker
|
||||
chown dokku:dokku /home/dokku # respect the original ownership
|
||||
chmod 711 /var/lib/docker # respect the original permissions
|
||||
```
|
||||
|
||||
Mount bind
|
||||
|
||||
```shell
|
||||
mount -o bind /mnt/volume/home/dokku /home/dokku
|
||||
mount -o bind /mnt/volume/var/lib/dokku /var/lib/dokku
|
||||
mount -o bind /mnt/volume/var/lib/docker /var/lib/docker
|
||||
```
|
||||
|
||||
Start docker daemon
|
||||
|
||||
```shell
|
||||
systemctl start docker
|
||||
```
|
||||
|
||||
At this point all should be working fine, please check it out.
|
||||
|
||||
Then, let the changes be reboot-persistent
|
||||
|
||||
```shell
|
||||
echo '/dev/vdb1 /mnt/volume ext4 defaults 0 2' | sudo tee -a /etc/fstab
|
||||
echo '/mnt/volume/home/dokku /home/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
|
||||
echo '/mnt/volume/var/lib/dokku /var/lib/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
|
||||
echo '/mnt/volume/var/lib/docker /var/lib/docker none defaults,bind 0 0' | sudo tee -a /etc/fstab
|
||||
```
|
||||
@@ -6,16 +6,17 @@
|
||||
domains:add <app> <domain> [<domain> ...] # Add domains to app
|
||||
domains:add-global <domain> [<domain> ...] # Add global domain names
|
||||
domains:clear <app> # Clear all domains for app
|
||||
domains:clear-global # Clear global domain names
|
||||
domains:disable <app> # Disable VHOST support
|
||||
domains:enable <app> # Enable VHOST support
|
||||
domains:remove <app> <domain> [<domain> ...] # Remove domains from app
|
||||
domains:remove-global <domain> [<domain> ...] # Remove global domain names
|
||||
domains:report [<app>] [<flag>] # Displays a domains report for one or more apps
|
||||
domains:report [<app>|--global] [<flag>] # Displays a domains report for one or more apps
|
||||
domains:set <app> <domain> [<domain> ...] # Set domains for app
|
||||
domains:set-global <domain> [<domain> ...] # Set global domain names
|
||||
```
|
||||
|
||||
> Adding a domain before deploying an application will result in port mappings being set. This may cause issues for applications that use non-standard ports, as those will not be automatically detected. Please refer to the [proxy documentation](/dokku/advanced-usage/proxy-management/) for information as to how to reconfigure the mappings.
|
||||
> Adding a domain before deploying an application will result in port mappings being set. This may cause issues for applications that use non-standard ports, as those will not be automatically detected. Please refer to the [proxy documentation](/docs/networking/proxy-management.md) for information as to how to reconfigure the mappings.
|
||||
|
||||
## Customizing hostnames
|
||||
|
||||
@@ -25,57 +26,46 @@ Applications typically have the following structure for their hostname:
|
||||
scheme://subdomain.domain.tld
|
||||
```
|
||||
|
||||
The `subdomain` is inferred from the pushed application name, while the `domain.tld` is set during initial configuration and stored in the `$DOKKU_ROOT/VHOST` file. It can then be modified with `dokku domains:add-global` and `dokku domains:remove-global`. This value is used as a default TLD for all applications on a host.
|
||||
The `subdomain` is inferred from the pushed application name, while the `domain.tld` is set during initial dokku configuration. It can then be modified with `dokku domains:add-global` and `dokku domains:remove-global`. This value is used as a default TLD for all applications on a host.
|
||||
|
||||
If a FQDN such as `other.tld` is used as the application name, the default `$DOKKU_ROOT/VHOST` will be ignored and the resulting vhost URL for that application will be `other.tld`. The exception to this rule being that if the FQDN has the same ending as the default vhost (such as `subdomain.domain.tld`), then the entire FQDN will be treated as a subdomain. The application will therefore be deployed at `subdomain.domain.tld.domain.tld`.
|
||||
If an FQDN such as `dokku.org` is used as the application name, the global virtualhost will be ignored and the resulting vhost URL for that application will be `dokku.org`.
|
||||
|
||||
You can optionally override this in a plugin by implementing the `nginx-hostname` plugin trigger. For example, you can reverse the subdomain with the following sample `nginx-hostname` plugin trigger:
|
||||
You can optionally override this in a plugin by implementing the `nginx-hostname` plugin trigger. If the `nginx-hostname` plugin has no output, the normal hostname algorithm will be executed. See the [plugin trigger documentation](/docs/development/plugin-triggers.md#nginx-hostname) for more information.
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
||||
|
||||
APP="$1"; SUBDOMAIN="$2"; VHOST="$3"
|
||||
|
||||
NEW_SUBDOMAIN=`echo $SUBDOMAIN | rev`
|
||||
echo "$NEW_SUBDOMAIN.$VHOST"
|
||||
```
|
||||
|
||||
If the `nginx-hostname` plugin has no output, the normal hostname algorithm will be executed.
|
||||
|
||||
## Disabling VHOSTS
|
||||
|
||||
If desired, it is possible to disable vhosts with the domains plugin.
|
||||
|
||||
```shell
|
||||
dokku domains:disable myapp
|
||||
dokku domains:disable node-js-app
|
||||
```
|
||||
|
||||
On subsequent deploys, the nginx virtualhost will be discarded. This is useful when deploying internal-facing services that should not be publicly routeable. As of 0.4.0, nginx will still be configured to proxy your app on some random high port. This allows internal services to maintain the same port between deployments. You may change this port by setting `DOKKU_NGINX_PORT` and/or `DOKKU_NGINX_SSL_PORT` (for services configured to use SSL.)
|
||||
On subsequent deploys, the nginx virtualhost will be discarded. This is useful when deploying internal-facing services that should not be publicly routeable. As of 0.4.0, nginx will still be configured to proxy your app on some random high port. This allows internal services to maintain the same port between deployments. You may change this port by setting `DOKKU_PROXY_PORT` and/or `DOKKU_PROXY_SSL_PORT` (for services configured to use SSL.)
|
||||
|
||||
|
||||
The domains plugin allows you to specify custom domains for applications. This plugin is aware of any ssl certificates that are imported via `certs:add`. Be aware that disabling domains (with `domains:disable`) will override any custom domains.
|
||||
|
||||
```shell
|
||||
# where `myapp` is the name of your app
|
||||
# where `node-js-app` is the name of your app
|
||||
|
||||
# add a domain to an app
|
||||
dokku domains:add myapp example.com
|
||||
dokku domains:add node-js-app dokku.me
|
||||
|
||||
# list custom domains for app
|
||||
dokku domains myapp
|
||||
dokku domains node-js-app
|
||||
|
||||
# clear all custom domains for app
|
||||
dokku domains:clear myapp
|
||||
dokku domains:clear node-js-app
|
||||
|
||||
# remove a custom domain from app
|
||||
dokku domains:remove myapp example.com
|
||||
dokku domains:remove node-js-app dokku.me
|
||||
|
||||
# set all custom domains for app
|
||||
dokku domains:set myapp example.com example.org
|
||||
dokku domains:set node-js-app dokku.me dokku.org
|
||||
```
|
||||
|
||||
## Displaying domains reports about an app
|
||||
## Displaying domains reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -88,19 +78,19 @@ dokku domains:report
|
||||
```
|
||||
=====> node-js-app domains information
|
||||
Domains app enabled: true
|
||||
Domains app vhosts: ruby-sample.example.org
|
||||
Domains app vhosts: node-js-app.dokku.org
|
||||
Domains global enabled: true
|
||||
Domains global vhosts: example.org
|
||||
=====> python-sample domains information
|
||||
Domains global vhosts: dokku.org
|
||||
=====> python-app domains information
|
||||
Domains app enabled: true
|
||||
Domains app vhosts: ruby-sample.example.org
|
||||
Domains app vhosts: python-app.dokku.org
|
||||
Domains global enabled: true
|
||||
Domains global vhosts: example.org
|
||||
=====> ruby-sample domains information
|
||||
Domains global vhosts: dokku.org
|
||||
=====> ruby-app domains information
|
||||
Domains app enabled: true
|
||||
Domains app vhosts: ruby-sample.example.org
|
||||
Domains app vhosts: ruby-app.dokku.org
|
||||
Domains global enabled: true
|
||||
Domains global vhosts: example.org
|
||||
Domains global vhosts: dokku.org
|
||||
```
|
||||
|
||||
You can run the command for a specific app also.
|
||||
@@ -112,9 +102,9 @@ dokku domains:report node-js-app
|
||||
```
|
||||
=====> node-js-app domains information
|
||||
Domains app enabled: true
|
||||
Domains app vhosts: node-js-app.example.org
|
||||
Domains app vhosts: node-js-app.dokku.org
|
||||
Domains global enabled: true
|
||||
Domains global vhosts: example.org
|
||||
Domains global vhosts: dokku.org
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
@@ -131,13 +121,29 @@ Create the file at `/etc/nginx/conf.d/00-default-vhost.conf`:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
|
||||
server_name _;
|
||||
return 410;
|
||||
log_not_found off;
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
access_log off;
|
||||
return 410;
|
||||
}
|
||||
|
||||
# To handle HTTPS requests, you can uncomment the following section.
|
||||
#
|
||||
# Please note that in order to let this work as expected, you need a valid
|
||||
# SSL certificate for any domains being served. Browsers will show SSL
|
||||
# errors in all other cases.
|
||||
#
|
||||
# Note that the key and certificate files in the below example need to
|
||||
# be copied into /etc/nginx/ssl/ folder.
|
||||
#
|
||||
# server {
|
||||
# listen 443 ssl;
|
||||
# server_name _;
|
||||
# ssl_certificate /etc/nginx/ssl/cert.crt;
|
||||
# ssl_certificate_key /etc/nginx/ssl/cert.key;
|
||||
# access_log off;
|
||||
# return 410;
|
||||
# }
|
||||
```
|
||||
|
||||
Make sure to reload nginx after creating this file by running `service nginx reload`.
|
||||
|
||||
@@ -5,13 +5,18 @@ Typically an application will require some configuration to run properly. Dokku
|
||||
The `config` plugin provides the following commands to manage your variables:
|
||||
|
||||
```
|
||||
config (<app>|--global) Display all global or app-specific config vars
|
||||
config:get (<app>|--global) KEY Display a global or app-specific config value
|
||||
config:set (<app>|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars
|
||||
config:unset (<app>|--global) KEY1 [KEY2 ...] Unset one or more config vars
|
||||
config (<app>|--global) Pretty-print an app or global environment
|
||||
config:bundle (<app>|--global) [--merged] Bundle environment into tarfile
|
||||
config:clear (<app>|--global) Clears environment variables
|
||||
config:export (<app>|--global) [--envfile] Export a global or app environment
|
||||
config:get (<app>|--global) KEY Display a global or app-specific config value
|
||||
config:keys (<app>|--global) [--merged] Show keys set in environment
|
||||
config:set [--encoded] [--no-restart] (<app>|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars
|
||||
config:unset [--no-restart] (<app>|--global) KEY1 [KEY2 ...] Unset one or more config vars
|
||||
```
|
||||
> For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available *only* during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860).
|
||||
|
||||
The variables are available both at run time and during the application build/compilation step for buildpack-based deploys. For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available *only* during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860).
|
||||
Environment variables are available both at run time and during the application build/compilation step for buildpack-based deploys.
|
||||
|
||||
For buildpack deploys, Dokku will create a `/app/.env` file that can be used for legacy buildpacks. Note that this is *not* updated when `config:set` or `config:unset` is called, and is only written during a `deploy` or `ps:rebuild`. Developers are encouraged to instead read from the application environment directly, as the proper values will be available then.
|
||||
|
||||
@@ -23,10 +28,15 @@ You can set multiple environment variables at once:
|
||||
dokku config:set node-js-app ENV=prod COMPILE_ASSETS=1
|
||||
```
|
||||
|
||||
When setting variables with whitespaces, you need to escape them:
|
||||
> Note: Whitespace and special characters get tricky. If you are using dokku locally you don't need to do any special escaping. If you are using dokku over ssh you will need to backslash-escape spaces:
|
||||
```shell
|
||||
dokku config:set node-js-app KEY="VAL\ WITH\ SPACES"
|
||||
```
|
||||
|
||||
Dokku can also read base64 encoded values. That's the easiest way to set a value with newlines or spaces. To set a value with newlines you need to base64 encode it first and pass the `--encoded` flag:
|
||||
|
||||
```shell
|
||||
dokku config:set node-js-app KEY=\"VAL\ WITH\ SPACES\"
|
||||
dokku config:set --encoded node-js-app KEY="$(base64 ~/.ssh/id_rsa)"
|
||||
```
|
||||
|
||||
When setting or unsetting environment variables, you may wish to avoid an application restart. This is useful when developing plugins or when setting multiple environment variables in a scripted manner. To do so, use the `--no-restart` flag:
|
||||
@@ -35,25 +45,82 @@ When setting or unsetting environment variables, you may wish to avoid an applic
|
||||
dokku config:set --no-restart node-js-app ENV=prod
|
||||
```
|
||||
|
||||
If you wish to have the variables output in an `eval`-compatible form, you can use the `--export` flag:
|
||||
If you wish to have the variables output in an `eval`-compatible form, you can use the `config:export` command
|
||||
|
||||
```shell
|
||||
dokku config node-js-app --export
|
||||
dokku config:export node-js-app
|
||||
# outputs variables in the form:
|
||||
#
|
||||
# export ENV='prod'
|
||||
# export COMPILE_ASSETS='1'
|
||||
|
||||
# source in all the node-js-app app environment variables
|
||||
eval $(dokku config node-js-app --export)
|
||||
eval $(dokku config:export node-js-app)
|
||||
```
|
||||
|
||||
You can also output the variables in a single-line for usage in command-line utilities with the `--shell` flag:
|
||||
You can control the format of the exported variables with the `--format` flag.
|
||||
`--format=shell` will output the variables in a single-line for usage in command-line utilities:
|
||||
|
||||
```shell
|
||||
dokku config node-js-app --shell
|
||||
dokku config:export --format shell node-js-app
|
||||
|
||||
# outputs variables in the form:
|
||||
#
|
||||
# ENV='prod' COMPILE_ASSETS='1'
|
||||
```
|
||||
|
||||
## Special Config Variables
|
||||
|
||||
The following list config variables have special meaning and can be set in a variety of ways.
|
||||
|
||||
> Warning: This list is not exhaustive, and may vary from version to version.
|
||||
|
||||
| Name | Default | How to modify | Description |
|
||||
| ------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||
| `DOKKU_ROOT` | `~dokku` | `/etc/environment` | The root directory where dokku will store application repositories, as well as certain configuration files. |
|
||||
| `DOKKU_IMAGE` | `gliderlabs/herokuish` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The default image to use when building herokuish containers. |
|
||||
| `DOKKU_LIB_ROOT` | `/var/lib/dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory where plugins, certain data, and general configuration is stored. |
|
||||
| `PLUGIN_PATH` | `$DOKKU_LIB_ROOT/plugins"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The top-level directory where plugins are stored. |
|
||||
| `PLUGIN_AVAILABLE_PATH` | `$PLUGIN_PATH/available"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that holds all available plugins, including core. |
|
||||
| `PLUGIN_ENABLED_PATH` | `$PLUGIN_PATH/enabled"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that holds all enabled plugins, including core. |
|
||||
| `PLUGIN_CORE_PATH` | `$DOKKU_LIB_ROOT/core-plugins"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that stores all core plugins. |
|
||||
| `PLUGIN_CORE_AVAILABLE_PATH` | `$PLUGIN_CORE_PATH/available"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that stores all available core plugins. |
|
||||
| `PLUGIN_CORE_ENABLED_PATH` | `$PLUGIN_CORE_PATH/enabled"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that stores all enabled core plugins. |
|
||||
| `DOKKU_LOGS_DIR` | `/var/log/dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | Where dokku logs should be written to. |
|
||||
| `DOKKU_EVENTS_LOGFILE` | `$DOKKU_LOGS_DIR/events.log` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | Where the events log file is written to. |
|
||||
| `DOKKU_APP_NAME` | none | `--app APP` flag | Name of application to work on. Respected by core plugins. |
|
||||
| `DOKKU_APPS_FORCE_DELETE` | none | `--force` flag | Whether to force delete an application. Also used by other plugins for destructive actions. |
|
||||
| `DOKKU_DETACH_CONTAINER` | none | `--detach` flag | Whether to detach a container started via `dokku run`. |
|
||||
| `DOKKU_QUIET_OUTPUT` | none | `--quiet` flag | Silences certain header output for `dokku` commands. |
|
||||
| `DOKKU_RM_CONTAINER` | none | `dokku config:set` <br /> `--rm-container` flag <br /> `--rm` flag | Whether to keep `dokku run` containers around or not. |
|
||||
| `DOKKU_TRACE` | none | `dokku trace:on` <br /> `dokku trace:off` <br /> `--trace` flag | Turn on very verbose debugging. |
|
||||
| `DOKKU_APP_PROXY_TYPE` | `nginx` | `dokku proxy:set` | |
|
||||
| `DOKKU_APP_RESTORE` | `1` | `dokku config:set` <br /> `dokku ps:stop` | |
|
||||
| `DOKKU_APP_SHELL` | `/bin/bash` | `dokku config:set` | Allows users to change the default shell used by Dokku for `dokku enter` and execution of deployment tasks. |
|
||||
| `DOKKU_APP_TYPE` | `herokuish` | Auto-detected by using buildpacks or dockerfile | |
|
||||
| `DOKKU_CHECKS_DISABLED` | none | `dokku checks:disable` | |
|
||||
| `DOKKU_CHECKS_ENABLED` | none | `dokku checks:enable` | |
|
||||
| `DOKKU_CHECKS_SKIPPED` | none | `dokku checks:skip` | |
|
||||
| `DOKKU_CHECKS_WAIT` | `5` | `dokku config:set` | Wait this many seconds for the container to start before running checks.
|
||||
| `DOKKU_CHECKS_TIMEOUT` | `30` | `dokku config:set` | Wait this many seconds for each response before marking it as a failure.
|
||||
| `DOKKU_CHECKS_ATTEMPTS` | `5` | `dokku config:set` | Number of retries for to run for a specific check before marking it as a failure
|
||||
| `DOKKU_DEFAULT_CHECKS_WAIT` | `10` | `dokku config:set` | If no user-defined checks are specified - or if the process being checked is not a `web` process - this is the period of time Dokku will wait before checking that a container is still running. |
|
||||
| `DOKKU_DISABLE_PROXY` | none | `dokku proxy:disable` <br /> `dokku proxy:enable` | Disables the proxy in front of your application, resulting in publicly routing the docker container. |
|
||||
| `DOKKU_DISABLE_ANSI_PREFIX_REMOVAL` | none | `dokku config:set` <br /> `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | Disables removal of the ANSI prefix during deploys. Can be used in cases where the client deployer does not understand ansi escape codes. |
|
||||
| `DOKKU_DISABLE_APP_AUTOCREATION` | none | `dokku config:set` | Disables automatic creation of a non-existent app on deploy. |
|
||||
| `DOKKU_DOCKER_STOP_TIMEOUT` | `10` | `dokku config:set` | Configurable grace period given to the `docker stop` command. If a container has not stopped by this time, a `kill -9` signal or equivalent is sent in order to force-terminate the container. Both the `ps:stop` and `apps:destroy` commands _also_ respect this value. If not specified, the docker defaults for the [docker stop command](https://docs.docker.com/engine/reference/commandline/stop/) will be used.|
|
||||
| `DOKKU_DOCKERFILE_CMD` | dockerfile cmd | `dokku config:set` | |
|
||||
| `DOKKU_DOCKERFILE_CACHE_BUILD` | none | `dokku config:set` | |
|
||||
| `DOKKU_DOCKERFILE_ENTRYPOINT` | dockerfile entrypoint | `dokku config:set` | |
|
||||
| `DOKKU_DOCKERFILE_PORTS` | dockerfile ports | `dokku config:set` | |
|
||||
| `DOKKU_DOCKERFILE_START_CMD` | none | `dokku config:set` | |
|
||||
| `DOKKU_PROXY_PORT` | automatically assigned | `dokku config:set` | |
|
||||
| `DOKKU_PROXY_SSL_PORT` | automatically assigned | `dokku config:set` | |
|
||||
| `DOKKU_PROXY_PORT_MAP` | automatically assigned | `dokku proxy:ports-add` <br /> `dokku proxy:ports-remove`, `dokku proxy:ports-clear` | |
|
||||
| `DOKKU_SKIP_ALL_CHECKS` | none | `dokku config:set` | |
|
||||
| `DOKKU_SKIP_CLEANUP` | | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | When a deploy is triggered, if this is set to a non-empty value, then old docker containers and images will not be removed. |
|
||||
| `DOKKU_SKIP_DEFAULT_CHECKS` | | `dokku config:set` | |
|
||||
| `DOKKU_SKIP_DEPLOY` | | `dokku config:set` | |
|
||||
| `DOKKU_SYSTEM_GROUP` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System group to chown files as. |
|
||||
| `DOKKU_SYSTEM_USER` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System user to chown files as. |
|
||||
| `DOKKU_WAIT_TO_RETIRE` | `60` | `dokku config:set` | After a successful deploy, the grace period given to old containers before they are stopped/terminated. This is useful for ensuring completion of long-running http connections. |
|
||||
|
||||
@@ -6,6 +6,67 @@ Dokku uses nginx as its server for routing requests to specific applications. By
|
||||
nginx:access-logs <app> [-t] # Show the nginx access logs for an application (-t follows)
|
||||
nginx:build-config <app> # (Re)builds nginx config for given app
|
||||
nginx:error-logs <app> [-t] # Show the nginx error logs for an application (-t follows)
|
||||
nginx:validate [<app>] [--clean] # Validates and optionally cleans up invalid nginx configurations
|
||||
```
|
||||
|
||||
## Checking access logs
|
||||
|
||||
You may check nginx access logs via the `nginx:access-logs` command. This assumes that app access logs are being stored in `/var/log/nginx/$APP-access.log`, as is the default in the generated `nginx.conf`.
|
||||
|
||||
```shell
|
||||
dokku nginx:access-logs node-js-app
|
||||
```
|
||||
|
||||
You may also follow the logs by specifying the `-t` flag.
|
||||
|
||||
```shell
|
||||
dokku nginx:access-logs node-js-app -t
|
||||
```
|
||||
|
||||
## Checking error logs
|
||||
|
||||
You may check nginx error logs via the `nginx:access-logs` command. This assumes that app error logs are being stored in `/var/log/nginx/$APP-error.log`, as is the default in the generated `nginx.conf`.
|
||||
|
||||
```shell
|
||||
dokku nginx:error-logs node-js-app
|
||||
```
|
||||
|
||||
You may also follow the logs by specifying the `-t` flag.
|
||||
|
||||
```shell
|
||||
dokku nginx:error-logs node-js-app -t
|
||||
```
|
||||
|
||||
## Regenerating nginx config
|
||||
|
||||
In certain cases, your app nginx configs may drift from the correct config for your app. You may regenerate the config at any point via the `nginx:build-config` command. This may fail if there are no current web listeners for your app.
|
||||
|
||||
```shell
|
||||
dokku nginx:build-config node-js-app
|
||||
```
|
||||
|
||||
## Validating nginx configs
|
||||
|
||||
It may be desired to validate an nginx config outside of the deployment process. To do so, run the `nginx:validate` command. With no arguments, this will validate all app nginx configs, one at a time. A minimal wrapper nginx config is generated for each app's nginx config, upon which `nginx -t` will be run.
|
||||
|
||||
```shell
|
||||
dokku nginx:validate
|
||||
```
|
||||
|
||||
As app nginx configs are actually executed within a shared context, it is possible for an individual config to be invalid when being validated standalone but _also_ be valid within the global server context. As such, the exit code for the `nginx:validate` command is the exit code of `nginx -t` against the server's real nginx config.
|
||||
|
||||
The `nginx:validate` command also takes an optional `--clean` flag. If specified, invalid nginx configs will be removed.
|
||||
|
||||
> Warning: Invalid app nginx config's will be removed _even if_ the config is valid in the global server context.
|
||||
|
||||
```shell
|
||||
dokku nginx:validate --clean
|
||||
```
|
||||
|
||||
The `--clean` flag may also be specified for a given app:
|
||||
|
||||
```shell
|
||||
dokku nginx:validate node-js-app --clean
|
||||
```
|
||||
|
||||
## Customizing the nginx configuration
|
||||
@@ -15,54 +76,13 @@ nginx:error-logs <app> [-t] # Show the nginx error logs for an appl
|
||||
Dokku uses a templating library by the name of [sigil](https://github.com/gliderlabs/sigil) to generate nginx configuration for each app. You may also provide a custom template for your application as follows:
|
||||
|
||||
- Copy the following example template to a file named `nginx.conf.sigil` and either:
|
||||
- check it into the root of your app repo for buildpack applications
|
||||
- If using a buildpack application, you __must__ check it into the root of your app repo.
|
||||
- `ADD` it to your dockerfile `WORKDIR`
|
||||
- if your dockerfile has no `WORKDIR`, `ADD` it to the `/app` folder
|
||||
|
||||
> When using a custom `nginx.conf.sigil` file, depending upon your application configuration, you *may* be exposing the file externally. As this file is extracted before the container is run, you can, safely delete it in a custom `entrypoint.sh` configured in a Dockerfile `ENTRYPOINT`.
|
||||
|
||||
### Example Custom Template
|
||||
|
||||
Use case: add an `X-Served-By` header to requests
|
||||
|
||||
```go
|
||||
server {
|
||||
listen [::]:{{ .NGINX_PORT }};
|
||||
listen {{ .NGINX_PORT }};
|
||||
server_name {{ .NOSSL_SERVER_NAME }};
|
||||
access_log /var/log/nginx/{{ .APP }}-access.log;
|
||||
error_log /var/log/nginx/{{ .APP }}-error.log;
|
||||
|
||||
# set a custom header for requests
|
||||
add_header X-Served-By www-ec2-01;
|
||||
|
||||
gzip on;
|
||||
gzip_min_length 1100;
|
||||
gzip_buffers 4 32k;
|
||||
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
|
||||
gzip_vary on;
|
||||
gzip_comp_level 6;
|
||||
|
||||
location / {
|
||||
proxy_pass http://{{ .APP }};
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Request-Start $msec;
|
||||
}
|
||||
include {{ .DOKKU_ROOT }}/{{ .APP }}/nginx.conf.d/*.conf;
|
||||
}
|
||||
|
||||
upstream {{ .APP }} {
|
||||
{{ range .DOKKU_APP_LISTENERS | split " " }}
|
||||
server {{ . }};
|
||||
{{ end }}
|
||||
}
|
||||
```
|
||||
> The default template is available [here](https://github.com/dokku/dokku/blob/master/plugins/nginx-vhosts/templates/nginx.conf.sigil), and can be used as a guide for your own, custom `nginx.conf.sigil` file. Please refer to the appropriate template file version for your Dokku version.
|
||||
|
||||
### Available template variables
|
||||
|
||||
@@ -71,8 +91,8 @@ upstream {{ .APP }} {
|
||||
{{ .APP_SSL_PATH }} Path to SSL certificate and key
|
||||
{{ .DOKKU_ROOT }} Global Dokku root directory (ex: app dir would be `{{ .DOKKU_ROOT }}/{{ .APP }}`)
|
||||
{{ .DOKKU_APP_LISTENERS }} List of IP:PORT pairs of app containers
|
||||
{{ .NGINX_PORT }} Non-SSL nginx listener port (same as `DOKKU_NGINX_PORT` config var)
|
||||
{{ .NGINX_SSL_PORT }} SSL nginx listener port (same as `DOKKU_NGINX_SSL_PORT` config var)
|
||||
{{ .PROXY_PORT }} Non-SSL nginx listener port (same as `DOKKU_PROXY_PORT` config var)
|
||||
{{ .PROXY_SSL_PORT }} SSL nginx listener port (same as `DOKKU_PROXY_SSL_PORT` config var)
|
||||
{{ .NOSSL_SERVER_NAME }} List of non-SSL VHOSTS
|
||||
{{ .PROXY_PORT_MAP }} List of port mappings (same as `DOKKU_PROXY_PORT_MAP` config var)
|
||||
{{ .PROXY_UPSTREAM_PORTS }} List of configured upstream ports (derived from `DOKKU_PROXY_PORT_MAP` config var)
|
||||
@@ -83,155 +103,81 @@ upstream {{ .APP }} {
|
||||
|
||||
> Note: Application config variables are available for use in custom templates. To do so, use the form of `{{ var "FOO" }}` to access a variable named `FOO`.
|
||||
|
||||
|
||||
### Example HTTP to HTTPS Custom Template
|
||||
Use case: a simple dockerfile app that includes `EXPOSE 80`
|
||||
|
||||
```go
|
||||
server {
|
||||
listen [::]:80;
|
||||
listen 80;
|
||||
server_name {{ .NOSSL_SERVER_NAME }};
|
||||
|
||||
access_log /var/log/nginx/{{ .APP }}-access.log;
|
||||
error_log /var/log/nginx/{{ .APP }}-error.log;
|
||||
|
||||
return 301 https://$host:443$request_uri;
|
||||
}
|
||||
server {
|
||||
listen [::]:443 ssl spdy;
|
||||
listen 443 ssl spdy;
|
||||
{{ if .SSL_SERVER_NAME }}server_name {{ .SSL_SERVER_NAME }}; {{ end }}
|
||||
|
||||
access_log /var/log/nginx/{{ .APP }}-access.log;
|
||||
error_log /var/log/nginx/{{ .APP }}-error.log;
|
||||
|
||||
ssl_certificate {{ .APP_SSL_PATH }}/server.crt;
|
||||
ssl_certificate_key {{ .APP_SSL_PATH }}/server.key;
|
||||
|
||||
keepalive_timeout 70;
|
||||
add_header Alternate-Protocol 443:npn-spdy/2;
|
||||
location / {
|
||||
proxy_pass http://{{ .APP }};
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Request-Start $msec;
|
||||
}
|
||||
include {{ .DOKKU_ROOT }}/{{ .APP }}/nginx.conf.d/*.conf;
|
||||
}
|
||||
|
||||
upstream {{ .APP }} {
|
||||
{{ range .DOKKU_APP_LISTENERS | split " " }}
|
||||
server {{ . }};
|
||||
{{ end }}
|
||||
}
|
||||
```
|
||||
|
||||
### Example using new proxy port mapping
|
||||
|
||||
```go
|
||||
{{ range $port_map := .PROXY_PORT_MAP | split " " }}
|
||||
{{ $port_map_list := $port_map | split ":" }}
|
||||
{{ $scheme := index $port_map_list 0 }}
|
||||
{{ $listen_port := index $port_map_list 1 }}
|
||||
{{ $upstream_port := index $port_map_list 2 }}
|
||||
|
||||
server {
|
||||
listen [::]:{{ $listen_port }};
|
||||
listen {{ $listen_port }};
|
||||
server_name {{ $.NOSSL_SERVER_NAME }};
|
||||
access_log /var/log/nginx/{{ $.APP }}-access.log;
|
||||
error_log /var/log/nginx/{{ $.APP }}-error.log;
|
||||
|
||||
location / {
|
||||
|
||||
gzip on;
|
||||
gzip_min_length 1100;
|
||||
gzip_buffers 4 32k;
|
||||
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
|
||||
gzip_vary on;
|
||||
gzip_comp_level 6;
|
||||
|
||||
proxy_pass http://{{ $.APP }}-{{ $upstream_port }};
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Request-Start $msec;
|
||||
}
|
||||
include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
|
||||
}
|
||||
|
||||
{{ range $upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }}
|
||||
upstream {{ $.APP }}-{{ $upstream_port }} {
|
||||
{{ range $listeners := $.DOKKU_APP_LISTENERS | split " " }}
|
||||
{{ $listener_list := $listeners | split ":" }}
|
||||
{{ $listener_ip := index $listener_list 0 }}
|
||||
{{ $listener_port := index $listener_list 1 }}
|
||||
server {{ $listener_ip }}:{{ $upstream_port }};{{ end }}
|
||||
}
|
||||
{{ end }}
|
||||
```
|
||||
|
||||
### Customizing via configuration files included by the default templates
|
||||
|
||||
The default nginx.conf template will include everything from your apps `nginx.conf.d/` subdirectory in the main `server {}` block (see above):
|
||||
|
||||
```go
|
||||
```
|
||||
include {{ .DOKKU_ROOT }}/{{ .APP }}/nginx.conf.d/*.conf;
|
||||
```
|
||||
|
||||
That means you can put additional configuration in separate files, for example to limit the uploaded body size to 50 megabytes, do
|
||||
|
||||
```shell
|
||||
mkdir /home/dokku/myapp/nginx.conf.d/
|
||||
echo 'client_max_body_size 50M;' > /home/dokku/myapp/nginx.conf.d/upload.conf
|
||||
chown dokku:dokku /home/dokku/myapp/nginx.conf.d/upload.conf
|
||||
mkdir /home/dokku/node-js-app/nginx.conf.d/
|
||||
echo 'client_max_body_size 50m;' > /home/dokku/node-js-app/nginx.conf.d/upload.conf
|
||||
chown dokku:dokku /home/dokku/node-js-app/nginx.conf.d/upload.conf
|
||||
service nginx reload
|
||||
```
|
||||
|
||||
The example above uses additional configuration files directly on the Dokku host. Unlike the `nginx.conf.sigil` file, these additional files will not be copied over from your application repo, and thus need to be placed in the `/home/dokku/myapp/nginx.conf.d/` directory manually.
|
||||
The example above uses additional configuration files directly on the Dokku host. Unlike the `nginx.conf.sigil` file, these additional files will not be copied over from your application repo, and thus need to be placed in the `/home/dokku/node-js-app/nginx.conf.d/` directory manually.
|
||||
|
||||
For PHP Buildpack users, you will also need to provide a `Procfile` and an accompanying `nginx.conf` file to customize the nginx config *within* the container. The following are example contents for your `Procfile`
|
||||
|
||||
web: vendor/bin/heroku-php-nginx -C nginx.conf -i php.ini php/
|
||||
|
||||
Your `nginx.conf` file - not to be confused with Dokku's `nginx.conf.sigil` - would also need to be configured as shown in this example:
|
||||
|
||||
client_max_body_size 50m;
|
||||
location / {
|
||||
index index.php;
|
||||
try_files $uri $uri/ /index.php$is_args$args;
|
||||
}
|
||||
|
||||
Please adjust the `Procfile` and `nginx.conf` file as appropriate.
|
||||
|
||||
## Custom Error Pages
|
||||
|
||||
By default, Dokku provides custom error pages for the following three categories of errors:
|
||||
|
||||
- 4xx: For all non-404 errors with a 4xx response code.
|
||||
- 404: For "404 Not Found" errors.
|
||||
- 5xx: For all 5xx error responses
|
||||
|
||||
These are provided as an alternative to the generic Nginx error page, are shared for _all_ applications, and their contents are located on disk at `/var/lib/dokku/data/nginx-vhosts/dokku-errors`. To customize them for a specific app, create a custom `nginx.conf.sigil` as described above and change the paths to point elsewhere.
|
||||
|
||||
## Domains plugin
|
||||
|
||||
See the [domain configuration documentation](/dokku/configuration/domains/).
|
||||
See the [domain configuration documentation](/docs/configuration/domains.md).
|
||||
|
||||
## Customizing hostnames
|
||||
|
||||
See the [customizing hostnames documentation](/dokku/configuration/domains/#customizing-hostnames).
|
||||
See the [customizing hostnames documentation](/docs/configuration/domains.md#customizing-hostnames).
|
||||
|
||||
## Disabling VHOSTS
|
||||
|
||||
See the [disabling vhosts documentation](/dokku/configuration/domains/#disabling-vhosts).
|
||||
See the [disabling vhosts documentation](/docs/configuration/domains.md#disabling-vhosts).
|
||||
|
||||
## Default site
|
||||
|
||||
See the [default site documentation](/dokku/configuration/domains/#default-site).
|
||||
See the [default site documentation](/docs/configuration/domains.md#default-site).
|
||||
|
||||
## Running behind a load balancer
|
||||
|
||||
See the [load balancer documentation](/dokku/configuration/ssl/#running-behind-a-load-balancer).
|
||||
See the [load balancer documentation](/docs/configuration/ssl.md#running-behind-a-load-balancer).
|
||||
|
||||
## HSTS Header
|
||||
|
||||
See the [HSTS documentation](/dokku/configuration/ssl/#hsts-header).
|
||||
See the [HSTS documentation](/docs/configuration/ssl.md#hsts-header).
|
||||
|
||||
## SSL Configuration
|
||||
|
||||
See the [ssl documentation](/dokku/configuration/ssl/).
|
||||
See the [ssl documentation](/docs/configuration/ssl.md).
|
||||
|
||||
## Disabling Nginx
|
||||
|
||||
See the [proxy documentation](/dokku/advanced-usage/proxy-management/).
|
||||
See the [proxy documentation](/docs/advanced-usage/proxy-management.md).
|
||||
|
||||
## Managing Proxy Port mappings
|
||||
|
||||
See the [proxy documentation](/dokku/advanced-usage/proxy-management/#proxy-port-mapping).
|
||||
See the [proxy documentation](/docs/advanced-usage/proxy-management.md#proxy-port-mapping).
|
||||
|
||||
@@ -17,7 +17,7 @@ certs:update <app> CRT KEY # Update an SSL Endpoint on an app. Can
|
||||
dokku nginx:import-ssl <app> < certs.tar
|
||||
```
|
||||
|
||||
> Adding an ssl certificate before deploying an application will result in port mappings being updated. This may cause issues for applications that use non-standard ports, as those may not be automatically detected. Please refer to the [proxy documentation](/dokku/advanced-usage/proxy-management/) for information as to how to reconfigure the mappings.
|
||||
> Adding an ssl certificate before deploying an application will result in port mappings being updated. This may cause issues for applications that use non-standard ports, as those may not be automatically detected. Please refer to the [proxy documentation](/docs/advanced-usage/proxy-management.md) for information as to how to reconfigure the mappings.
|
||||
|
||||
## Per-application certificate management
|
||||
|
||||
@@ -40,9 +40,9 @@ cat yourdomain_com.crt yourdomain_com.ca-bundle > server.crt
|
||||
|
||||
#### SSL and Multiple Domains
|
||||
|
||||
When an SSL certificate is associated to an application, the certificate will be associated with *all* domains currently associated with said application. Your certificate _should_ be associated with all of those domains, otherwise accessing the application will result in SSL errors. If you wish to remove one of the domains from the application, refer to the [domain configuration documentation](/dokku/configuration/domains/).
|
||||
When an SSL certificate is associated to an application, the certificate will be associated with *all* domains currently associated with said application. Your certificate _should_ be associated with all of those domains, otherwise accessing the application will result in SSL errors. If you wish to remove one of the domains from the application, refer to the [domain configuration documentation](/docs/configuration/domains.md).
|
||||
|
||||
Note that with the default nginx template, requests will be redirected to the `https` version of the domain. If this is not the desired state of request resolution, you may customize the nginx template in use. For more details, see the [nginx documentation](/dokku/configuration/nginx/).
|
||||
Note that with the default nginx template, requests will be redirected to the `https` version of the domain. If this is not the desired state of request resolution, you may customize the nginx template in use. For more details, see the [nginx documentation](/docs/configuration/nginx.md).
|
||||
|
||||
### Certificate generation
|
||||
|
||||
@@ -56,7 +56,7 @@ If you decide to obtain a CA signed certificate, you can import that certificate
|
||||
|
||||
The `certs:remove` command only works on app-specific certificates. It will `rm` the app-specific tls directory, rebuild the nginx configuration, and reload nginx.
|
||||
|
||||
### Displaying certificate reports about an app
|
||||
### Displaying certificate reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -67,17 +67,17 @@ dokku certs:report
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-sample
|
||||
Ssl dir: /home/dokku/node-js-sample/tls
|
||||
=====> node-js-app
|
||||
Ssl dir: /home/dokku/node-js-app/tls
|
||||
Ssl enabled: true
|
||||
Ssl hostnames: *.node-js-sample.org node-js-sample.org
|
||||
Ssl hostnames: *.node-js-app.org node-js-app.org
|
||||
Ssl expires at: Oct 5 23:59:59 2019 GMT
|
||||
Ssl issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Domain Validation Secure Server CA
|
||||
Ssl starts at: Oct 5 00:00:00 2016 GMT
|
||||
Ssl subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.node-js-sample.org
|
||||
Ssl subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.node-js-app.org
|
||||
Ssl verified: self signed.
|
||||
=====> python-sample
|
||||
Ssl dir: /home/dokku/python-sample/tls
|
||||
=====> python-app
|
||||
Ssl dir: /home/dokku/python-app/tls
|
||||
Ssl enabled: false
|
||||
Ssl hostnames:
|
||||
Ssl expires at:
|
||||
@@ -90,25 +90,25 @@ dokku certs:report
|
||||
You can run the command for a specific app also.
|
||||
|
||||
```shell
|
||||
dokku certs:report node-js-sample
|
||||
dokku certs:report node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-sample ssl information
|
||||
Ssl dir: /home/dokku/node-js-sample/tls
|
||||
=====> node-js-app ssl information
|
||||
Ssl dir: /home/dokku/node-js-app/tls
|
||||
Ssl enabled: true
|
||||
Ssl hostnames: *.example.org example.org
|
||||
Ssl hostnames: *.dokku.org dokku.org
|
||||
Ssl expires at: Oct 5 23:59:59 2019 GMT
|
||||
Ssl issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Domain Validation Secure Server CA
|
||||
Ssl starts at: Oct 5 00:00:00 2016 GMT
|
||||
Ssl subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.example.org
|
||||
Ssl subject: OU=Domain Control Validated; OU=PositiveSSL Wildcard; CN=*.dokku.org
|
||||
Ssl verified: self signed.
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
```shell
|
||||
dokku certs:report node-js-sample --ssl-enabled
|
||||
dokku certs:report node-js-app --ssl-enabled
|
||||
```
|
||||
|
||||
## HSTS Header
|
||||
@@ -117,16 +117,20 @@ The [HSTS header](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security)
|
||||
|
||||
Beware that if you enable the header and a subsequent deploy of your application results in an HTTP deploy (for whatever reason), the way the header works means that a browser will not attempt to request the HTTP version of your site if the HTTPS version fails.
|
||||
|
||||
## HTTP/2 support
|
||||
|
||||
Certain versions of nginx have bugs that prevent [HTTP/2](https://nginx.org/en/docs/http/ngx_http_v2_module.html) from properly responding to all clients, thus causing applications to be unavailable. For HTTP/2 to be enabled in your applications' nginx configs, you need to have installed nginx 1.11.5 or higher. See [issue 2435](https://github.com/dokku/dokku/issues/2435) for more details.
|
||||
|
||||
## Running behind a load balancer
|
||||
|
||||
Your application has access to the HTTP headers `X-Forwarded-Proto`, `X-Forwarded-Port` and `X-Forwarded-For`. These headers indicate the protocol of the original request (HTTP or HTTPS), the port number, and the IP address of the client making the request, respectively. The default configuration is for Nginx to set these headers.
|
||||
|
||||
If your server runs behind an HTTP/S load balancer, then Nginx will see all requests as coming from the load balancer. If your load balancer sets the `X-Forwarded-` headers, you can tell Nginx to pass these headers from load balancer to your application by using the following [nginx custom template](/dokku/configuration/nginx/#customizing-the-nginx-configuration)
|
||||
If your server runs behind an HTTP/S load balancer, then Nginx will see all requests as coming from the load balancer. If your load balancer sets the `X-Forwarded-` headers, you can tell Nginx to pass these headers from load balancer to your application by using the following [nginx custom template](/docs/configuration/nginx.md#customizing-the-nginx-configuration)
|
||||
|
||||
```go
|
||||
server {
|
||||
listen [::]:{{ .NGINX_PORT }};
|
||||
listen {{ .NGINX_PORT }};
|
||||
listen [::]:{{ .PROXY_PORT }};
|
||||
listen {{ .PROXY_PORT }};
|
||||
server_name {{ .NOSSL_SERVER_NAME }};
|
||||
access_log /var/log/nginx/{{ .APP }}-access.log;
|
||||
error_log /var/log/nginx/{{ .APP }}-error.log;
|
||||
@@ -162,4 +166,4 @@ This could result in security issue, for example, if your application looks at t
|
||||
|
||||
### SSL Port Exposure
|
||||
|
||||
When your app is served from port `80` then the `/home/dokku/APP/nginx.conf` file will automatically be updated to instruct nginx to respond to ssl on port 443 as a new cert is added. If your app uses a non-standard port (perhaps you have a dockerfile deploy exposing port `99999`) you may need to manually expose an ssl port via `dokku proxy:ports-add <APP> https:443:99999`.
|
||||
When your app is served from port `80` then the `/home/dokku/APP/nginx.conf` file will automatically be updated to instruct nginx to respond to ssl on port 443 as a new cert is added. If your app uses a non-standard port (perhaps you have a dockerfile deploy exposing port `99999`) you may need to manually expose an ssl port via `dokku proxy:ports-add <APP> https:443:99999`.
|
||||
|
||||
@@ -1,64 +1,78 @@
|
||||
# Deploying to Dokku
|
||||
|
||||
> Note: This walkthrough uses the hostname `dokku.me` in commands. When deploying to your own server, you should set the `DOKKU_DOMAIN` value in the `Vagrantfile` before you initialize the Vagrant VM.
|
||||
|
||||
## Deploy tutorial
|
||||
|
||||
Once Dokku has been configured with at least one user, applications can be deployed via a `git push` command. To quickly see Dokku deployment in action, you can use the Heroku Ruby on Rails example app.
|
||||
Once you have configured Dokku with at least one user, you can deploy applications using `git push`. To quickly see Dokku deployment in action, try using [the Heroku Ruby on Rails "Getting Started" app](https://github.com/heroku/ruby-getting-started).
|
||||
|
||||
```shell
|
||||
# from your local machine
|
||||
# SSH access to github must be enabled on this host
|
||||
git clone git@github.com:heroku/ruby-rails-sample.git
|
||||
git clone git@github.com:heroku/ruby-getting-started.git
|
||||
```
|
||||
|
||||
### Create the app
|
||||
|
||||
Create the application on the Dokku host. You will need to ssh onto the host to run this command.
|
||||
SSH into the Dokku host and create the application as follows:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
dokku apps:create ruby-rails-sample
|
||||
# on the Dokku host
|
||||
dokku apps:create ruby-getting-started
|
||||
```
|
||||
|
||||
### Create the backing services
|
||||
|
||||
When you create a new app, Dokku by default *does not* provide any datastores such as MySQL or PostgreSQL. You will need to install plugins to handle that, but fortunately [Dokku has official plugins](/dokku/community/plugins/#official-plugins-beta) for common datastores. Our sample app requires a PostgreSQL service:
|
||||
Dokku by default **does not** provide datastores (e.g. MySQL, PostgreSQL) on a newly created app. You can add datastore support by installing plugins, and the Dokku project [provides official plugins](/docs/community/plugins.md#official-plugins-beta) for common datastores.
|
||||
|
||||
The Getting Started app requires a PostgreSQL service, so install the plugin and create the related service as follows:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
# on the Dokku host
|
||||
# install the postgres plugin
|
||||
# plugin installation requires root, hence the user change
|
||||
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git
|
||||
|
||||
# create a postgres service with the name rails-database
|
||||
dokku postgres:create rails-database
|
||||
# create a postgres service with the name railsdatabase
|
||||
dokku postgres:create railsdatabase
|
||||
```
|
||||
|
||||
> Each services may take a few moments to create.
|
||||
Each service may take a few moments to create.
|
||||
|
||||
### Linking backing services to applications
|
||||
|
||||
Once the service creation is complete, set the `POSTGRES_URL` environment variable by linking the service.
|
||||
Once the services have been created, you then set the `DATABASE_URL` environment variable by linking the service, as follows:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
# on the Dokku host
|
||||
# each official datastore offers a `link` method to link a service to any application
|
||||
dokku postgres:link rails-database ruby-rails-sample
|
||||
dokku postgres:link railsdatabase ruby-getting-started
|
||||
```
|
||||
|
||||
> You can link a single service to multiple applications or use one service per application.
|
||||
Dokku supports linking a single service to multiple applications as well as linking only one service per application.
|
||||
|
||||
### Deploy the app
|
||||
|
||||
Now you can deploy the `ruby-rails-sample` app to your Dokku server. All you have to do is add a remote to name the app. Applications are created on-the-fly on the Dokku server.
|
||||
> Warning: Your app should respect the `PORT` environment variable, otherwise it may not respond to web requests. You can find more information in the [port management documentation](/docs/networking/port-management.md).**
|
||||
|
||||
Now you can deploy the `ruby-getting-started` app to your Dokku server. All you have to do is add a remote to name the app. Applications are created on-the-fly on the Dokku server.
|
||||
|
||||
```shell
|
||||
# from your local machine
|
||||
# the remote username *must* be dokku or pushes will fail
|
||||
cd ruby-rails-sample
|
||||
git remote add dokku dokku@dokku.me:ruby-rails-sample
|
||||
cd ruby-getting-started
|
||||
git remote add dokku dokku@dokku.me:ruby-getting-started
|
||||
git push dokku master
|
||||
```
|
||||
|
||||
> Note: Some tools may not support the short-upstream syntax referenced above, and you may need to prefix
|
||||
> the upstream with the scheme `ssh://` like so: `ssh://dokku@dokku.me:ruby-getting-started`
|
||||
> Please see the [Git](https://git-scm.com/docs/git-clone#_git_urls_a_id_urls_a) documentation for more details.
|
||||
|
||||
> Note: Your private key should be registered with `ssh-agent` in your local development environment. If you get a `permission denied` error when pushing, you can register your private key as follows: `ssh-add -k ~/<your private key>`.
|
||||
|
||||
After running `git push dokku master`, you should have output similar to this in your terminal:
|
||||
|
||||
```
|
||||
Counting objects: 231, done.
|
||||
Delta compression using up to 8 threads.
|
||||
@@ -66,7 +80,7 @@ Compressing objects: 100% (162/162), done.
|
||||
Writing objects: 100% (231/231), 36.96 KiB | 0 bytes/s, done.
|
||||
Total 231 (delta 93), reused 147 (delta 53)
|
||||
-----> Cleaning up...
|
||||
-----> Building ruby-rails-sample from herokuish...
|
||||
-----> Building ruby-getting-started from herokuish...
|
||||
-----> Adding BUILD_ENV to build environment...
|
||||
-----> Ruby app detected
|
||||
-----> Compiling Ruby/Rails
|
||||
@@ -81,82 +95,64 @@ Total 231 (delta 93), reused 147 (delta 53)
|
||||
...
|
||||
|
||||
=====> Application deployed:
|
||||
http://ruby-rails-sample.dokku.me
|
||||
http://ruby-getting-started.dokku.me
|
||||
```
|
||||
|
||||
When the deploy finishes, the application's URL will be shown as seen above.
|
||||
Once the deploy is complete, the application's web URL will be generated as above.
|
||||
|
||||
Dokku supports deploying applications via [Heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) with [Herokuish](https://github.com/gliderlabs/herokuish#buildpacks) or using a project's [dockerfile](https://docs.docker.com/reference/builder/).
|
||||
Dokku supports deploying applications via [Heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) with [Herokuish](https://github.com/gliderlabs/herokuish#buildpacks), as well as by using a project's [Dockerfile](https://docs.docker.com/reference/builder/).
|
||||
|
||||
|
||||
### Deploying non-master branch
|
||||
|
||||
Dokku only supports deploying from its master branch, so if you'd like to deploy a different local branch use: ```git push dokku <local branch>:master```
|
||||
|
||||
An alternative is to use the `DOKKU_DEPLOY_BRANCH` application config value to specify a branch that should be deployed. The implicit default is master, and this can be modified both at the app and global level:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
|
||||
# set it globally
|
||||
dokku config:set --global DOKKU_DEPLOY_BRANCH=some-branch
|
||||
|
||||
# override for a specific app
|
||||
dokku config:set ruby-rails-sample DOKKU_DEPLOY_BRANCH=some-branch
|
||||
```
|
||||
|
||||
You can also support pushing multiple branches using the [receive-branch](/dokku/development/plugin-triggers/#receive-branch) plugin trigger in a custom plugin.
|
||||
|
||||
### Skipping deployment
|
||||
|
||||
If you only want to rebuild and tag a container, you can skip the deployment phase by setting `$DOKKU_SKIP_DEPLOY` to `true` by running:
|
||||
|
||||
``` shell
|
||||
# on your Dokku host
|
||||
dokku config:set ruby-rails-sample DOKKU_SKIP_DEPLOY=true
|
||||
# on the Dokku host
|
||||
dokku config:set ruby-getting-started DOKKU_SKIP_DEPLOY=true
|
||||
```
|
||||
|
||||
### Re-Deploying / restarting
|
||||
### Redeploying or restarting
|
||||
|
||||
If you need to re-deploy (or restart) your app:
|
||||
If you need to redeploy or restart your app:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
dokku ps:rebuild ruby-rails-sample
|
||||
# on the Dokku host
|
||||
dokku ps:rebuild ruby-getting-started
|
||||
```
|
||||
|
||||
See the [process scaling documentation](/dokku/deployment/process-management) for more information.
|
||||
See the [process scaling documentation](/docs/deployment/process-management.md) for more information.
|
||||
|
||||
### Deploying with private git submodules
|
||||
### Deploying with private Git submodules
|
||||
|
||||
Dokku uses git locally (i.e. not a docker image) to build its own copy of your app repo, including submodules. This is done as the `dokku` user. Therefore, in order to deploy private git submodules, you'll need to drop your deploy key in `/home/dokku/.ssh/` and potentially add github.com (or your VCS host key) into `/home/dokku/.ssh/known_hosts`. The following test should help confirm you've done it correctly.
|
||||
Dokku uses Git locally (i.e. not a Docker image) to build its own copy of your app repo, including submodules, as the `dokku` user. This means that in order to deploy private Git submodules, you need to put your deploy key in `/home/dokku/.ssh/` and potentially add `github.com` (or your VCS host key) into `/home/dokku/.ssh/known_hosts`. You can use the following test to confirm your setup is correct:
|
||||
|
||||
```shell
|
||||
# on your Dokku host
|
||||
# on the Dokku host
|
||||
su - dokku
|
||||
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
|
||||
ssh -T git@github.com
|
||||
```
|
||||
|
||||
Note that if the buildpack or dockerfile build process require ssh key access for other reasons, the above may not always apply.
|
||||
> Warning: if the buildpack or Dockerfile build process require SSH key access for other reasons, the above may not always apply.
|
||||
|
||||
## Deploying to subdomains
|
||||
|
||||
The name of remote repository is used as the name of application to be deployed, as for example above:
|
||||
If you do not enter a fully qualified domain name when pushing your app, Dokku deploys the app to `<remotename>.yourdomain.tld` as follows:
|
||||
|
||||
```shell
|
||||
# from your local machine
|
||||
# the remote username *must* be dokku or pushes will fail
|
||||
git remote add dokku dokku@dokku.me:ruby-rails-sample
|
||||
git remote add dokku dokku@dokku.me:ruby-getting-started
|
||||
git push dokku master
|
||||
```
|
||||
|
||||
```
|
||||
remote: -----> Application deployed:
|
||||
remote: http://ruby-rails-sample.dokku.me
|
||||
remote: http://ruby-getting-started.dokku.me
|
||||
```
|
||||
|
||||
You can also specify fully qualified names, say `app.dokku.me`, as
|
||||
You can also specify the fully qualified name as follows:
|
||||
|
||||
```shell
|
||||
# from your local machine
|
||||
@@ -170,7 +166,7 @@ remote: -----> Application deployed:
|
||||
remote: http://app.dokku.me
|
||||
```
|
||||
|
||||
This is in particular useful, then you want to deploy to root domain, as
|
||||
This is useful when you want to deploy to the root domain:
|
||||
|
||||
```shell
|
||||
# from your local machine
|
||||
@@ -184,40 +180,44 @@ git push dokku master
|
||||
remote: -----> Application deployed:
|
||||
remote: http://dokku.me
|
||||
|
||||
## Dokku/Docker Container Management Compatibility
|
||||
## Dokku/Docker container management compatibility
|
||||
|
||||
Dokku is, at its core, a docker container manager. Thus, it does not necessarily play well with other out-of-band processes interacting with the docker daemon. One thing to note as in [issue #1220](https://github.com/dokku/dokku/issues/1220), dokku executes a cleanup function prior to every deployment.
|
||||
Dokku is, at its core, a Docker container manager. Thus, it does not necessarily play well with other out-of-band processes interacting with the Docker daemon.
|
||||
|
||||
As of 0.5.x, this function removes all containers with the label `dokku` where the status is either `dead` or `exited`, as well as all `dangling` images. Previous versions would remove `dead` or `exited` containers, regardless of their label.
|
||||
Prior to every deployment, Dokku will execute a cleanup function. As of 0.5.x, the cleanup removes all containers with the `dokku` label where the status is either `dead` or `exited` (previous versions would remove _all_ `dead` or `exited` containers). The cleanup function also removes all images with `dangling` status.
|
||||
|
||||
## Adding deploy users
|
||||
|
||||
See the [user management documentation](/dokku/deployment/user-management).
|
||||
See the [user management documentation](/docs/deployment/user-management.md).
|
||||
|
||||
## Default vhost
|
||||
|
||||
See the [nginx documentation](/dokku/configuration/nginx/#default-site).
|
||||
See the [nginx documentation](/docs/configuration/nginx.md#default-site).
|
||||
|
||||
## Deploying non-master branch
|
||||
|
||||
See the [Git documentation](/docs/deployment/methods/git.md#changing-the-deploy-branch).
|
||||
|
||||
## Dockerfile deployment
|
||||
|
||||
See the [dockerfile documentation](/dokku/deployment/methods/dockerfiles/).
|
||||
|
||||
## Specifying a custom buildpack
|
||||
|
||||
See the [buildpack documentation](/dokku/deployment/methods/buildpacks/).
|
||||
See the [Dockerfile documentation](/docs/deployment/methods/dockerfiles.md).
|
||||
|
||||
## Image tagging
|
||||
|
||||
See the [image tagging documentation](/dokku/deployment/methods/images/).
|
||||
See the [image tagging documentation](/docs/deployment/methods/images.md).
|
||||
|
||||
## Specifying a custom buildpack
|
||||
|
||||
See the [buildpack documentation](/docs/deployment/methods/buildpacks.md).
|
||||
|
||||
## Removing a deployed app
|
||||
|
||||
See the [application management documentation](/dokku/deployment/application-management/#removing-a-deployed-app).
|
||||
See the [application management documentation](/docs/deployment/application-management.md#removing-a-deployed-app).
|
||||
|
||||
### Renaming a deployed app
|
||||
## Renaming a deployed app
|
||||
|
||||
See the [application management documentation](/dokku/deployment/application-management/#renaming-a-deployed-app).
|
||||
See the [application management documentation](/docs/deployment/application-management.md#renaming-a-deployed-app).
|
||||
|
||||
## Zero downtime deploy
|
||||
|
||||
See the [zero-downtime deploy documentation](/dokku/deployment/zero-downtime-deploys/).
|
||||
See the [zero-downtime deploy documentation](/docs/deployment/zero-downtime-deploys.md).
|
||||
|
||||
@@ -6,14 +6,18 @@
|
||||
apps:clone <old-app> <new-app> # Clones an app
|
||||
apps:create <app> # Create a new app
|
||||
apps:destroy <app> # Permanently destroy an app
|
||||
apps:exists <app> # Checks if an app exists
|
||||
apps:list # List your apps
|
||||
apps:lock <app> # Locks an app for deployment
|
||||
apps:locked <app> # Checks if an app is locked for deployment
|
||||
apps:rename <old-app> <new-app> # Rename an app
|
||||
apps:report [<app>] [<flag>] # Display report about an app
|
||||
apps:unlock <app> # Unlocks an app for deployment
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Listing Applications
|
||||
### Listing applications
|
||||
|
||||
> New as of 0.8.1. Use the `apps` command for older versions.
|
||||
|
||||
@@ -29,7 +33,7 @@ node-js-app
|
||||
python-app
|
||||
```
|
||||
|
||||
Note that you can easily hide extra output from Dokku commands by using the `--quiet` flag, which makes it easier to parse on the command-line.
|
||||
Note that you can easily hide extra output from Dokku commands by using the `--quiet` flag, which makes it easier to parse on the command line.
|
||||
|
||||
```shell
|
||||
dokku --quiet apps:list
|
||||
@@ -40,6 +44,20 @@ node-js-app
|
||||
python-app
|
||||
```
|
||||
|
||||
### Checking if an application exists
|
||||
|
||||
For CI/CD pipelines, it may be useful to see if an application exists before creating a "review" application for a specific branch. You can do so via the `apps:exists` command:
|
||||
|
||||
```shell
|
||||
dokku apps:exists node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
App does not exist
|
||||
```
|
||||
|
||||
The `apps:exists` command will return non-zero if the application does not exist, and zero if it does.
|
||||
|
||||
### Manually creating an application
|
||||
|
||||
A common pattern for deploying applications to Dokku is to configure an application before deploying it. You can do so via the `apps:create` command:
|
||||
@@ -54,9 +72,9 @@ Creating node-js-app... done
|
||||
|
||||
Once created, you can configure the application as normal, and deploy the application whenever ready. This is useful for cases where you may wish to do any of the following kinds of tasks:
|
||||
|
||||
- configure domain names and ssl certificates
|
||||
- create and link datastores
|
||||
- set environment variables
|
||||
- Configure domain names and SSL certificates.
|
||||
- Create and link datastores.
|
||||
- Set environment variables.
|
||||
|
||||
### Removing a deployed app
|
||||
|
||||
@@ -85,7 +103,6 @@ dokku --force apps:destroy node-js-app
|
||||
Destroying node-js-app (including all add-ons)
|
||||
```
|
||||
|
||||
|
||||
Destroying an application will unlink all linked services and destroy any config related to the application. Note that linked services will retain their data for later use (or removal).
|
||||
|
||||
### Renaming a deployed app
|
||||
@@ -119,9 +136,9 @@ This will copy all of your app's contents into a new app directory with the name
|
||||
|
||||
### Cloning an existing app
|
||||
|
||||
> New as of 0.8.1
|
||||
> New as of 0.11.5
|
||||
|
||||
You can clone an existing app using the `apps:clone` command. Note that the application *must* have been deployed at least once, or the rename will not complete successfully:
|
||||
You can clone an existing app using the `apps:clone` command. Note that the application *must* have been deployed at least once, or cloning will not complete successfully:
|
||||
|
||||
```shell
|
||||
dokku apps:clone node-js-app io-js-app
|
||||
@@ -131,9 +148,14 @@ dokku apps:clone node-js-app io-js-app
|
||||
Cloning node-js-app to io-js-app... done
|
||||
```
|
||||
|
||||
This will copy all of your app's contents into a new app directory with the name of your choice and then rebuild the new version of the app and deploy it. All of your config variables, including database urls, will be preserved.
|
||||
This will copy all of your app's contents into a new app directory with the name of your choice and then rebuild the new version of the app and deploy it with the following caveats:
|
||||
|
||||
> Warning: If you have exposed specific ports via docker-options, added generic domains, or performed anything that cannot be done against multiple applications, `apps:clone` may result in errors.
|
||||
- All of your environment variables, including database urls, will be preserved.
|
||||
- Custom domains are not applied to the new app.
|
||||
- SSL certificates will not be copied to the new app.
|
||||
- Port mappings with the scheme `https` and host-port `443` will be skipped.
|
||||
|
||||
> Warning: If you have exposed specific ports via `docker-options` plugin, or performed anything that cannot be done against multiple applications, `apps:clone` may result in errors.
|
||||
|
||||
By default, Dokku will deploy this new application, though you can skip the deploy by using the `--skip-deploy` flag:
|
||||
|
||||
@@ -141,7 +163,61 @@ By default, Dokku will deploy this new application, though you can skip the depl
|
||||
dokku apps:clone --skip-deploy node-js-app io-js-app
|
||||
```
|
||||
|
||||
### Displaying reports about an app
|
||||
Finally, if the application already exists, you may wish to ignore errors resulting from attempting to clone over it. To do so, you can use the `--ignore-existing` flag. A warning will be emitted, but the command will return `0`.
|
||||
|
||||
```shell
|
||||
dokku apps:clone --ignore-existing node-js-app io-js-app
|
||||
```
|
||||
|
||||
### Locking app deploys
|
||||
|
||||
> New as of 0.11.6
|
||||
|
||||
If you wish to disable deploying for a period of time, this can be done via deploy locks. Normally, deploy locks exist only for the duration of a deploy so as to avoid deploys from colliding, but a deploy lock can be created by running the `apps:lock` command.
|
||||
|
||||
|
||||
```shell
|
||||
dokku apps:lock node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
-----> Deploy lock created
|
||||
```
|
||||
|
||||
### Unlocking app deploys
|
||||
|
||||
> New as of 0.11.6
|
||||
|
||||
In some cases, it may be necessary to remove an existing deploy lock. This can be performed via the `apps:unlock` command.
|
||||
|
||||
> Warning: Removing the deploy lock *will not* stop in progress deploys. At this time, in progress deploys will need to be manually terminated by someone with server access.
|
||||
|
||||
```shell
|
||||
dokku apps:unlock node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
! A deploy may be in progress.
|
||||
! Removing the app lock will not stop in progress deploys.
|
||||
-----> Deploy lock removed.
|
||||
```
|
||||
|
||||
### Checking lock status
|
||||
|
||||
> New as of 0.13.0
|
||||
|
||||
In some cases, you may wish to inspect the state of an app lock. To do so, you can issue an `apps:lock` command. This will exit non-zero if there is no app lock in place.
|
||||
|
||||
|
||||
```shell
|
||||
dokku apps:locked node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
Deploy lock does not exist
|
||||
```
|
||||
|
||||
### Displaying reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -154,16 +230,16 @@ dokku apps:report
|
||||
```
|
||||
=====> node-js-app
|
||||
App dir: /home/dokku/node-js-app
|
||||
Git sha: dbddc3f
|
||||
App cid: 7b18489c98be
|
||||
Status: running
|
||||
Git sha: dbddc3f
|
||||
Deploy source: git
|
||||
Locked: false
|
||||
=====> python-sample
|
||||
not deployed
|
||||
=====> ruby-sample
|
||||
App dir: /home/dokku/ruby-sample
|
||||
Git sha: a2d477c
|
||||
App cid: 78a44d71012a
|
||||
Status: running
|
||||
Deploy source: git
|
||||
Locked: false
|
||||
```
|
||||
|
||||
You can run the command for a specific app also.
|
||||
@@ -175,9 +251,9 @@ dokku apps:report node-js-app
|
||||
```
|
||||
=====> node-js-app
|
||||
App dir: /home/dokku/node-js-app
|
||||
Git sha: dbddc3f
|
||||
App cid: 7b18489c98be
|
||||
Status: running
|
||||
Git sha: dbddc3f
|
||||
Deploy source: git
|
||||
Locked: false
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
# Log Management
|
||||
|
||||
```
|
||||
logs <app> # display recent log output
|
||||
logs <app> [-h] [-t] [-n num] [-q] [-p process] # Display recent log output
|
||||
logs:failed [<app>] # Shows the last failed deploy logs
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Application Logs
|
||||
You can easily get logs of an application using the `logs` command:
|
||||
### Application logs
|
||||
|
||||
You can easily get logs of an app using the `logs` command:
|
||||
|
||||
```shell
|
||||
dokku logs node-js-app
|
||||
```
|
||||
|
||||
## Behavioral modifiers
|
||||
#### Behavioral modifiers
|
||||
|
||||
Dokku also supports certain command-line arguments that augment the `log` command's behavior.
|
||||
|
||||
@@ -26,8 +28,26 @@ Dokku also supports certain command-line arguments that augment the `log` comman
|
||||
|
||||
You can use these modifiers as follows:
|
||||
|
||||
|
||||
```shell
|
||||
dokku logs node-js-app -t -p web
|
||||
```
|
||||
|
||||
will show logs continually from the web process.
|
||||
|
||||
### Failed deploy logs
|
||||
|
||||
> Warning: The default `docker-local` scheduler will "store" these until the next deploy or until the old containers are garbage collected - whichever runs first. If you require the logs beyond this point in time, please ship the logs to a centralized log server.
|
||||
|
||||
In some cases, it may be useful to retrieve the logs from a previously failed deploy.
|
||||
|
||||
You can retrieve these logs by using the `logs:failed` command
|
||||
|
||||
```shell
|
||||
dokku logs:failed node-js-app
|
||||
```
|
||||
|
||||
You can also retrieve the failed logs for each app:
|
||||
|
||||
```shell
|
||||
dokku logs:failed node-js-app
|
||||
```
|
||||
|
||||
@@ -1,62 +1,193 @@
|
||||
# Buildpack Deployment
|
||||
|
||||
Dokku normally defaults to using [heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) for deployment, though this may be overridden by committing a valid `Dockerfile` to the root of your repository and pushing the repository to your Dokku installation. To avoid this automatic `Dockerfile` deployment detection, you may do one of the following:
|
||||
> Subcommands new as of 0.15.0
|
||||
|
||||
- Use `dokku config:set` to set the `BUILDPACK_URL` environment variable.
|
||||
- Add `BUILDPACK_URL` to a committed `.env` file in the root of your repository.
|
||||
- See the [environment variable documentation](/dokku/configuration/environment-variables/) for more details.
|
||||
```
|
||||
buildpacks:add [--index 1] <app> <buildpack> # Add new app buildpack while inserting into list of buildpacks if necessary
|
||||
buildpacks:clear <app> # Clear all buildpacks set on the app
|
||||
buildpacks:list <app> # List all buildpacks for an app
|
||||
buildpacks:remove <app> <buildpack> # Remove a buildpack set on the app
|
||||
buildpacks:report [<app>] [<flag>] # Displays a buildpack report for one or more apps
|
||||
buildpacks:set [--index 1] <app> <buildpack> # Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
|
||||
```
|
||||
|
||||
> Warning: If using the `buildpacks` plugin, be sure to unset any `BUILDPACK_URL` and remove any such entries from a committed `.env` file. A specified `BUILDPACK_URL` will always override a `.buildpacks` file or the buildpacks plugin.
|
||||
|
||||
Dokku normally defaults to using [Heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) for deployment, though this may be overridden by committing a valid `Dockerfile` to the root of your repository and pushing the repository to your Dokku installation. To avoid this automatic `Dockerfile` deployment detection, you may do one of the following:
|
||||
|
||||
- Set a `BUILDPACK_URL` environment variable
|
||||
- This can be done via `dokku config:set` or via a committed `.env` file in the root of the repository. See the [environment variable documentation](/docs/configuration/environment-variables.md) for more details.
|
||||
- Create a `.buildpacks` file in the root of your repository.
|
||||
- This can be via a committed `.buildpacks` file or managed via the `buildpacks` plugin commands.
|
||||
|
||||
## Specifying a custom buildpack
|
||||
This page will cover usage of the `buildpacks` plugin.
|
||||
|
||||
In certain cases you may want to specify a custom buildpack. While Dokku uses herokuish to support all the [official heroku buildpacks](https://github.com/gliderlabs/herokuish#buildpacks), it is possible that the buildpack detection does not work well for your application. As well, you may wish to use a custom buildpack to handle specific application logic.
|
||||
## Usage
|
||||
|
||||
To use a specific buildpack, you can run the following Dokku command:
|
||||
### Listing Buildpacks in Use
|
||||
|
||||
The `buildpacks:list` command can be used to show buildpacks that have been set for an app. This will omit any auto-detected buildpacks.
|
||||
|
||||
```shell
|
||||
# replace REPOSITORY_URL with your buildpack's url
|
||||
dokku config:set node-js-app BUILDPACK_URL=REPOSITORY_URL
|
||||
|
||||
# example: using a specific ruby buildpack version
|
||||
dokku config:set node-js-app BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-ruby.git#v142
|
||||
# running for an app with no buildpacks specified
|
||||
dokku buildpacks:list node-js-app
|
||||
```
|
||||
|
||||
Please check the documentation for your particular buildpack as you may need to include configuration files (such as a Procfile) in your project root.
|
||||
```
|
||||
-----> test buildpack urls
|
||||
```
|
||||
|
||||
## Using multiple buildpacks
|
||||
|
||||
You can only set a single buildpack using the `BUILDPACK_URL`, though there may be times when you wish to use multiple buildpacks. To do so, simply create a `.buildpacks` file in the base of your repository. This file should list all the buildpacks, one-per-line. For instance, if you wish to use both the `nodejs` and `ruby` buildpacks, your `.buildpacks` file should contain the following:
|
||||
|
||||
```shell
|
||||
https://github.com/heroku/heroku-buildpack-nodejs.git#v87
|
||||
https://github.com/heroku/heroku-buildpack-ruby.git#v142
|
||||
# running for an app with two buildpacks specified
|
||||
dokku buildpacks:list node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
-----> test buildpack urls
|
||||
https://github.com/heroku/heroku-buildpack-python.git
|
||||
https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||
```
|
||||
|
||||
### Adding custom buildpacks
|
||||
|
||||
> Please check the documentation for your particular buildpack as you may need to include configuration files (such as a Procfile) in your project root.
|
||||
|
||||
To add a custom buildpack, use the `buildpacks:add` command:
|
||||
|
||||
```shell
|
||||
dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||
```
|
||||
|
||||
When no buildpacks are currently specified, the specified buildpack will be the only one executed for detection and compilation.
|
||||
|
||||
Multiple buildpacks may be specified by using the `buildpacks:add` command multiple times.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||
```
|
||||
|
||||
Buildpacks are executed in order, may be inserted at a specified index via the `--index` flag. This flag is specified starting at a 1-index value.
|
||||
|
||||
```shell
|
||||
# will add the golang buildpack at the second position, bumping all proceeding ones by 1 position
|
||||
dokku buildpacks:add --index 2 node-js-app https://github.com/heroku/heroku-buildpack-golang.git
|
||||
```
|
||||
|
||||
### Overwriting a buildpack position
|
||||
|
||||
In some cases, it may be necessary to swap out a given buildpack. Rather than needing to re-specify each buildpack, the `buildpacks:set` command can be used to overwrite a buildpack at a given position.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
```
|
||||
|
||||
By default, this will overwrite the _first_ buildpack specified. To specify an index, the `--index` flag may be used. This flag is specified starting at a 1-index value, and defaults to `1`.
|
||||
|
||||
```shell
|
||||
# the following are equivalent commands
|
||||
dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
dokku buildpacks:set --index 1 node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
```
|
||||
|
||||
If the index specified is larger than the number of buildpacks currently configured, the buildpack will be appended to the end of the list.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:set --index 99 node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
```
|
||||
|
||||
### Removing a buildpack
|
||||
|
||||
> At least one of a buildpack or index must be specified
|
||||
|
||||
A single buildpack can be removed by name via the `buildpacks:remove` command.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:remove node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
|
||||
```
|
||||
|
||||
Buildpacks can also be removed by index via the `--index` flag. This flag is specified starting at a 1-index value.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:remove node-js-app --index 1
|
||||
```
|
||||
|
||||
### Clearing all buildpacks
|
||||
|
||||
> This does not affect automatically detected buildpacks, nor does it impact any specified `BUILDPACK_URL` environment variable.
|
||||
|
||||
The `buildpacks:clear` command can be used to clear all configured buildpacks for a specified app.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:clear node-js-app
|
||||
```
|
||||
|
||||
### Displaying buildpack reports for an app
|
||||
|
||||
You can get a report about the app's buildpacks status using the `buildpacks:report` command:
|
||||
|
||||
```shell
|
||||
dokku buildpacks:report
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app buildpacks information
|
||||
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||
=====> python-sample buildpacks information
|
||||
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git,https://github.com/heroku/heroku-buildpack-python.git
|
||||
=====> ruby-sample buildpacks information
|
||||
Buildpacks list:
|
||||
```
|
||||
|
||||
You can run the command for a specific app also.
|
||||
|
||||
```shell
|
||||
dokku buildpacks:report node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-app buildpacks information
|
||||
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||
```
|
||||
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
```shell
|
||||
dokku buildpacks:report node-js-app --buildpacks-list
|
||||
```
|
||||
|
||||
## Errata
|
||||
|
||||
### Switching from Dockerfile deployments
|
||||
|
||||
If an application was previously deployed via Dockerfile, the following commands should be run before a buildpack deploy will succeed:
|
||||
|
||||
```shell
|
||||
dokku config:unset --no-restart node-js-app DOKKU_DOCKERFILE_CMD DOKKU_DOCKERFILE_ENTRYPOINT DOKKU_PROXY_PORT_MAP
|
||||
```
|
||||
|
||||
### Using a specific buildpack version
|
||||
|
||||
> Always remember to pin your buildpack versions when using the multi-buildpacks method, or you may find deploys changing your deployed environment.
|
||||
|
||||
You may also choose to set just a single buildpack in this file, though that is up to you.
|
||||
|
||||
Please check the documentation for your particular buildpack(s) as you may need to include configuration files (such as a Procfile) in your project root.
|
||||
|
||||
## Using a specific buildpack version
|
||||
|
||||
As Dokku pins all buildpacks via herokuish releases, there may be occasions where a local buildpack version is out of date. If you wish to use a more recent version of the buildpack, you may use any of the above methods to specify a buildpack **without** the git sha attached like so:
|
||||
By default, Dokku uses the [gliderlabs/herokuish](https://github.com/gliderlabs/herokuish/) project, which pins all of it's vendored buildpacks. There may be occasions where the pinned version results in a broken deploy, or does not have a particular feature that is required to build your project. To use a more recent version of a given buildpack, the buildpack may be specified *without* a Git commit SHA like so:
|
||||
|
||||
```shell
|
||||
# using the latest nodejs buildpack
|
||||
dokku config:set node-js-app BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs
|
||||
dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-nodejs
|
||||
```
|
||||
|
||||
You may also wish to use a **specific** version of a buildpack, which is also simple
|
||||
This will use the latest commit on the `master` branch of the specified buildpack. To pin to a newer version of a buildpack, a sha may also be specified by using the form `REPOSITORY_URL#COMMIT_SHA`, where `COMMIT_SHA` is any tree-ish git object - usually a git tag.
|
||||
|
||||
```shell
|
||||
# using v87 of the nodejs buildpack
|
||||
dokku config:set node-js-app BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs#v87
|
||||
dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-nodejs#v87
|
||||
```
|
||||
|
||||
## Specifying commands via Procfile
|
||||
### Specifying commands via Procfile
|
||||
|
||||
While many buildpacks have a default command that is run when a detected repository is pushed, it is possible to override this command via a Procfile. A Procfile can also be used to specify multiple commands, each of which is subject to process scaling. See the [process scaling documentation](/dokku/deployment/process-management/) for more details around scaling individual processes.
|
||||
While many buildpacks have a default command that is run when a detected repository is pushed, it is possible to override this command via a Procfile. A Procfile can also be used to specify multiple commands, each of which is subject to process scaling. See the [process scaling documentation](/docs/deployment/process-management.md) for more details around scaling individual processes.
|
||||
|
||||
A Procfile is a file named `Procfile`. It should be named `Procfile` exactly, and not anything else. For example, `Procfile.txt` is not valid. The file should be a simple text file.
|
||||
|
||||
@@ -77,19 +208,20 @@ worker: env QUEUE=* bundle exec rake resque:work
|
||||
importantworker: env QUEUE=important bundle exec rake resque:work
|
||||
```
|
||||
|
||||
The `web` process type holds some significance in that it is the only process type that is automatically scaled to `1` on the initial application deploy. See the [process scaling documentation](/dokku/deployment/process-management/) for more details around scaling individual processes.
|
||||
The `web` process type holds some significance in that it is the only process type that is automatically scaled to `1` on the initial application deploy. See the [process scaling documentation](/docs/deployment/process-management.md) for more details around scaling individual processes.
|
||||
|
||||
## Curl Build Timeouts
|
||||
|
||||
Certain buildpacks may time out in retrieving dependencies via curl. This can happen when your network connection is poor or if there is significant network congestion. You may see a message similar to `gzip: stdin: unexpected end of file` after a curl command.
|
||||
### `curl` build timeouts
|
||||
|
||||
If you see output similar this when deploying , you may need to override the curl timeouts to increase the length of time allotted to those tasks. You can do so via the `config` plugin:
|
||||
Certain buildpacks may time out in retrieving dependencies via `curl`. This can happen when your network connection is poor or if there is significant network congestion. You may see a message similar to `gzip: stdin: unexpected end of file` after a `curl` command.
|
||||
|
||||
If you see output similar this when deploying , you may need to override the `curl` timeouts to increase the length of time allotted to those tasks. You can do so via the `config` plugin:
|
||||
|
||||
```shell
|
||||
dokku config:set --global CURL_TIMEOUT=600
|
||||
dokku config:set --global CURL_CONNECT_TIMEOUT=30
|
||||
dokku config:set --global CURL_TIMEOUT=1200
|
||||
dokku config:set --global CURL_CONNECT_TIMEOUT=180
|
||||
```
|
||||
|
||||
## Clearing buildpack cache
|
||||
### Clearing buildpack cache
|
||||
|
||||
See the [repository management documentation](/dokku/advanced-usage/repository-management/#clearing-app-cache).
|
||||
See the [repository management documentation](/docs/advanced-usage/repository-management.md#clearing-app-cache).
|
||||
|
||||
@@ -2,30 +2,72 @@
|
||||
|
||||
> New as of 0.3.15
|
||||
|
||||
While Dokku normally defaults to using [heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) for deployment, you can also use docker's native `Dockerfile` system to define a container.
|
||||
While Dokku normally defaults to using [Heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) for deployment, you can also use Docker's native `Dockerfile` system to define a container.
|
||||
|
||||
> Dockerfile support is considered a **Power User** feature. By using Dockerfile-based deployment, you agree that you will not have the same comfort as that enjoyed by Buildpack users, and Dokku features may work differently. Differences between the two systems will be documented here.
|
||||
> Dockerfile support is considered a *power user* feature. By using Dockerfile-based deployment, you agree that you will not have the same comfort as that enjoyed by buildpack users, and Dokku features may work differently. Differences between the two systems will be documented here.
|
||||
|
||||
To use a dockerfiles for deployment, commit a valid `Dockerfile` to the root of your repository and push the repository to your Dokku installation. If this file is detected, Dokku will default to using it to construct containers **except** in the following two cases:
|
||||
To use a Dockerfile for deployment, commit a valid `Dockerfile` to the root of your repository and push the repository to your Dokku installation. If this file is detected, Dokku will default to using it to construct containers *except* in the following two cases:
|
||||
|
||||
- The application has a `BUILDPACK_URL` environment variable set via the `dokku config:set` command or in a committed `.env` file. In this case, Dokku will use your specified buildpack.
|
||||
- The application has a `.buildpacks` file in the root of the repository. In this case, Dokku will use your specified buildpack(s).
|
||||
|
||||
## Exposed ports
|
||||
## Switching from buildpack deployments
|
||||
|
||||
> Changed as of 0.5.0
|
||||
If an application was previously deployed via buildpacks, the following commands should be run before a Dockerfile deploy will succeed:
|
||||
|
||||
Dokku will extract all tcp ports exposed using the `EXPOSE` directive (one port per line) and setup nginx to proxy the same port numbers to listen publicly. If you would like to change the exposed port, you should do so within your `Dockerfile` and app.
|
||||
```shell
|
||||
dokku config:unset --no-restart node-js-app DOKKU_PROXY_PORT_MAP
|
||||
```
|
||||
|
||||
> Note: Nginx does not support proxying UDP. UDP ports can be exposed by disabling the nginx proxy with `dokku proxy:disable myapp`
|
||||
## Build-time configuration variables
|
||||
|
||||
If you do not explicitly `EXPOSE` a port in your `Dockerfile`, Dokku will configure the nginx proxy to listen on port 80 (and 443 for TLS) and forward traffic to your app listening on port 5000 inside the container. Just like buildpack apps, you can also use the `$PORT` environment variable in your app to maintain portability.
|
||||
For security reasons - and as per [Docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available only during runtime.
|
||||
|
||||
When ports are exposed through the default nginx proxy, they are proxied externally as HTTP ports. At this time, in no case do we proxy plain TCP or UDP ports. If you would like to investigate alternative proxy methods, please refer to our [proxy management documentation](/dokku/advanced-usage/proxy-management/).
|
||||
For users that require customization in the `build` phase, you may use build arguments via the [docker-options plugin](docs/advanced-usage/docker-options.md):
|
||||
|
||||
```shell
|
||||
dokku docker-options:add node-js-app build '--build-arg NODE_ENV=production'
|
||||
```
|
||||
|
||||
The location of the `Dockerfile` may also be specified. If the location is changed, the repository **must also** have a `Dockerfile` in the root directory in order to trigger a dockerfile-based deploy.
|
||||
|
||||
```shell
|
||||
dokku docker-options:add node-js-app build '--file Dockerfile.dokku'
|
||||
```
|
||||
|
||||
Once set, the Dockerfile usage would be as follows:
|
||||
|
||||
```Dockerfile
|
||||
FROM debian:jessie
|
||||
|
||||
# set the argument default
|
||||
ARG NODE_ENV=production
|
||||
|
||||
# use the argument
|
||||
RUN echo $NODE_ENV
|
||||
```
|
||||
|
||||
You may also set the argument as an environment variable
|
||||
|
||||
```Dockerfile
|
||||
FROM debian:jessie
|
||||
|
||||
# set the argument default
|
||||
ARG NODE_ENV=production
|
||||
|
||||
# assign it to an environment variable
|
||||
# we can wrap the variable in brackets
|
||||
ENV NODE_ENV ${NODE_ENV}
|
||||
|
||||
# or omit them completely
|
||||
|
||||
# use the argument
|
||||
RUN echo $NODE_ENV
|
||||
```
|
||||
|
||||
## Customizing the run command
|
||||
|
||||
By default no arguments are passed to `docker run` when deploying the container and the `CMD` or `ENTRYPOINT` defined in the `Dockerfile` are executed. You can take advantage of docker ability of overriding the `CMD` or passing parameters to your `ENTRYPOINT` setting `$DOKKU_DOCKERFILE_START_CMD`. Let's say for example you are deploying a base nodejs image, with the following `ENTRYPOINT`:
|
||||
By default no arguments are passed to `docker run` when deploying the container and the `CMD` or `ENTRYPOINT` defined in the `Dockerfile` are executed. You can take advantage of docker ability of overriding the `CMD` or passing parameters to your `ENTRYPOINT` setting `$DOKKU_DOCKERFILE_START_CMD`. Let's say for example you are deploying a base Node.js image, with the following `ENTRYPOINT`:
|
||||
|
||||
```Dockerfile
|
||||
ENTRYPOINT ["node"]
|
||||
@@ -37,18 +79,17 @@ You can do:
|
||||
dokku config:set node-js-app DOKKU_DOCKERFILE_START_CMD="--harmony server.js"
|
||||
```
|
||||
|
||||
To tell docker what to run.
|
||||
To tell Docker what to run.
|
||||
|
||||
Setting `$DOKKU_DOCKERFILE_CACHE_BUILD` to `true` or `false` will enable or disable docker's image layer cache. Lastly, for more granular build control, you may also pass any `docker build` option to `docker`, by setting `$DOKKU_DOCKER_BUILD_OPTS`.
|
||||
Setting `$DOKKU_DOCKERFILE_CACHE_BUILD` to `true` or `false` will enable or disable Docker's image layer cache. Lastly, for more granular build control, you may also pass any `docker build` option to `docker`, by setting `$DOKKU_DOCKER_BUILD_OPTS`.
|
||||
|
||||
### Procfiles and Multiple Processes
|
||||
### Procfiles and multiple processes
|
||||
|
||||
> New as of 0.5.0
|
||||
|
||||
You can also customize the run command using a `Procfile`, much like you would on Heroku or
|
||||
with a buildpack deployed app. The `Procfile` should contain one or more lines defining [process
|
||||
types and associated commands](https://devcenter.heroku.com/articles/procfile#declaring-process-types).
|
||||
When you deploy your app a Docker image will be built, the `Procfile` will be extracted from the image
|
||||
with a buildpack deployed app. The `Procfile` should contain one or more lines defining [process types and associated commands](https://devcenter.heroku.com/articles/procfile#declaring-process-types).
|
||||
When you deploy your app, a Docker image will be built. The `Procfile` will be extracted from the image
|
||||
(it must be in the folder defined in your `Dockerfile` as `WORKDIR` or `/app`) and the commands
|
||||
in it will be passed to `docker run` to start your process(es). Here's an example `Procfile`:
|
||||
|
||||
@@ -72,3 +113,7 @@ a worker container for this app, you can run `dokku ps:scale worker=1` and a new
|
||||
started by running `docker run bin/run-worker.sh` (the actual `docker run` commands are a bit more
|
||||
complex, but this is the basic idea). If you use an `ENTRYPOINT` in your `Dockerfile`, the lines
|
||||
in your `Procfile` will be passed as arguments to the `ENTRYPOINT` script instead of being executed.
|
||||
|
||||
## Exposed ports
|
||||
|
||||
See the [port management documentation](/docs/networking/port-management.md).
|
||||
|
||||
78
docs/deployment/methods/git.md
Normal file
78
docs/deployment/methods/git.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# Git Deployment
|
||||
|
||||
> Subcommands new as of 0.12.0
|
||||
|
||||
```
|
||||
git:initialize <app> # Initialize a git repository for an app
|
||||
git:report [<app>] [<flag>] # Displays a git report for one or more apps
|
||||
git:set <app> <key> (<value>) # Set or clear a git property for an app
|
||||
```
|
||||
|
||||
Git-based deployment has been the traditional method of deploying applications in Dokku. As of v0.12.0, Dokku introduces a few ways to customize the experience of deploying via `git push`. A Git-based deployment currently supports building applications via both [Buildpack](/docs/deployment/methods/buildpacks.md) and [Dockerfile](/docs/deployment/methods/dockerfiles.md).
|
||||
|
||||
## Usage
|
||||
|
||||
### Initializing an application
|
||||
|
||||
When an application is created via `git push`, Dokku will create the proper `pre-receive` hook in order to execute the build pipeline. In certain cases - such as when fronting deploys with the [`git-http-backend`](https://git-scm.com/docs/git-http-backend) - this may not be correctly created. As an alternative, the `git:initialize` command can be used to trigger this creation:
|
||||
|
||||
```shell
|
||||
# on the Dokku host
|
||||
|
||||
# overrides any existing pre-receive hook
|
||||
dokku git:initialize node-js-app
|
||||
```
|
||||
|
||||
In order for the above command to succeed, the application *must* already exist.
|
||||
|
||||
> Warning: If the `pre-receive` hook was customized in any way, this will overwrite that hook with the current defaults for Dokku.
|
||||
|
||||
### Changing the deploy branch
|
||||
|
||||
By default, Dokku will deploy code pushed to the `master` branch. In order to quickly deploy a different local branch, the following Git command can be used:
|
||||
|
||||
```shell
|
||||
# on the local machine
|
||||
|
||||
# where `SOME_BRANCH_NAME` is the name of the branch
|
||||
git push dokku SOME_BRANCH_NAME:master
|
||||
```
|
||||
|
||||
In `0.12.0`, the correct way to change the deploy branch is to use the `git:set` Dokku command.
|
||||
|
||||
```shell
|
||||
# on the Dokku host
|
||||
|
||||
# override for all applications
|
||||
dokku git:set --global deploy-branch SOME_BRANCH_NAME
|
||||
|
||||
# override for a specific app
|
||||
# where `SOME_BRANCH_NAME` is the name of the branch
|
||||
dokku git:set node-js-app deploy-branch SOME_BRANCH_NAME
|
||||
```
|
||||
|
||||
Pushing multiple branches can also be supported by creating a [receive-branch](/docs/development/plugin-triggers.md#receive-branch) plugin trigger in a custom plugin.
|
||||
|
||||
### Configuring the `GIT_REV` environment variable
|
||||
|
||||
> New as of 0.12.0
|
||||
|
||||
Application deployments will include a special `GIT_REV` environment variable containing the current deployment sha being deployed. For rebuilds, this SHA will remain the same.
|
||||
|
||||
To configure the name of the `GIT_REV` environment variable, run the `git:set` command as follows:
|
||||
|
||||
```shell
|
||||
# on the Dokku host
|
||||
|
||||
# override for a specific app
|
||||
dokku git:set node-js-app rev-env-var DOKKU_GIT_REV
|
||||
```
|
||||
|
||||
This behavior can be disabled entirely on a per-app basis by setting the `rev-env-var` value to an empty string:
|
||||
|
||||
```shell
|
||||
# on the Dokku host
|
||||
|
||||
# override for a specific app
|
||||
dokku git:set node-js-app rev-env-var ""
|
||||
```
|
||||
@@ -1,4 +1,4 @@
|
||||
# Image Tag Deployment
|
||||
# Docker Image Tag Deployment
|
||||
|
||||
> New as of 0.4.0
|
||||
|
||||
@@ -9,17 +9,21 @@ tags:deploy <app> <tag> # Deploy tagged app image
|
||||
tags:destroy <app> <tag> # Remove app image tag
|
||||
```
|
||||
|
||||
The Dokku tags plugin allows you to add docker image tags to the currently deployed app image for versioning and subsequent deployment.
|
||||
The Dokku tags plugin allows you to add Docker image tags to the currently deployed app image for versioning and subsequent deployment.
|
||||
|
||||
> When triggering `dokku ps:rebuild APP` on an application deployed via the `tags` plugin, the following may occur:
|
||||
>
|
||||
> - Applications previously deployed via another method (`git`/`tar`): The application may revert to a state before the latest custom image tag was deployed.
|
||||
> - Applications that were only ever deployed via the `tags` plugin: No action will be taken against your application.
|
||||
>
|
||||
> Please use the `tags:deploy` command when redeploying an application deployed via docker image.
|
||||
> Please use the `tags:deploy` command when redeploying an application deployed via Docker image.
|
||||
|
||||
## Usage
|
||||
|
||||
### Exposed ports
|
||||
|
||||
See the [port management documentation](/docs/networking/port-management.md).
|
||||
|
||||
### Listing tags for an application
|
||||
|
||||
For example, you can list all tags for a given application:
|
||||
@@ -36,7 +40,7 @@ dokku/node-js-app latest 936a42f25901 About a minute ago
|
||||
|
||||
### Creating a tag
|
||||
|
||||
You can also create new tags for that app using the `tags:create` function. Tags should conform to the docker tagging specification for your docker version. As of 1.10, that specification is available [here](https://github.com/docker/docker/blob/master/image/spec/v1.1.md), while users of older versions can check the documentation [here](https://github.com/docker/docker/blob/master/image/spec/v1.md).
|
||||
You can also create new tags for that app using the `tags:create` function. Tags should conform to the Docker tagging specification for your Docker version. As of 1.10, that specification is available [here](https://github.com/docker/docker/blob/master/image/spec/v1.1.md), while users of older versions can check the documentation [here](https://github.com/docker/docker/blob/master/image/spec/v1.md).
|
||||
|
||||
```shell
|
||||
dokku tags:create node-js-app v1
|
||||
@@ -61,7 +65,9 @@ dokku/node-js-app v1 936a42f25901 About a minute ago
|
||||
|
||||
### Deploying an image tag
|
||||
|
||||
Finally, you can also deploy a local image using the `tags:deploy` command.
|
||||
Finally, you can also deploy a local image using the `tags:deploy` command. When specifying a tag that is not `latest`, the released image will be retagged as the `latest` image tag for the app.
|
||||
|
||||
> Warning: For images based on Herokuish, using the `tags:deploy` command will reset environment variables written into the image, causing a retag to occur. This will - on average - add two extra layers to your deployed image. Note that this does not affect Dockerfile-based images, which are the majority of images deployed via the `tags` command.
|
||||
|
||||
```shell
|
||||
dokku tags:deploy node-js-app v1
|
||||
@@ -94,39 +100,36 @@ dokku tags:deploy node-js-app v1
|
||||
http://node-js-app.dokku.me
|
||||
```
|
||||
|
||||
## Image Workflows
|
||||
## Image workflows
|
||||
|
||||
### Deploying from a Docker Registry
|
||||
### Deploying from a Docker registry
|
||||
|
||||
You can alternatively add image pulled from a docker Registry and deploy app from it by using tagging feature. In this example, we are deploying from Docker Hub.
|
||||
You can alternatively add image pulled from a Docker registry and deploy from it by using tagging feature. In this example, we are deploying from Docker Hub.
|
||||
|
||||
1. Create Dokku app as usual
|
||||
1. Create Dokku app as usual.
|
||||
|
||||
```shell
|
||||
dokku apps:create test-app
|
||||
```
|
||||
|
||||
2. Pull image from Docker Hub
|
||||
2. Pull image from Docker Hub.
|
||||
|
||||
```shell
|
||||
docker pull demo-repo/some-image:v12
|
||||
```
|
||||
|
||||
3. Retag the image to match the created app
|
||||
3. Retag the image to match the created app.
|
||||
|
||||
```shell
|
||||
docker tag demo-repo/some-image:v12 dokku/test-app:v12
|
||||
```
|
||||
|
||||
4. Deploy tag
|
||||
4. Deploy tag.
|
||||
|
||||
```shell
|
||||
dokku tags:deploy test-app v12
|
||||
```
|
||||
|
||||
> Note: When deploying an image, we will use `docker inspect` to extract the `ExposedPorts` configuration and if defined, use that to populate `DOKKU_DOCKERFILE_PORTS`. If this behavior is not desired, you can override that configuration variable with the `config:set` command.
|
||||
> Example: `dokku config:set test-app DOKKU_DOCKERFILE_PORTS="5984/tcp 80/tcp"`
|
||||
|
||||
### Deploying an image from CI
|
||||
|
||||
To ensure your builds are always reproducible, it's considered bad practice to store build
|
||||
@@ -134,22 +137,22 @@ artifacts in your repository. For some projects however, building artifacts duri
|
||||
to Dokku may affect the performance of running applications.
|
||||
|
||||
One solution is to build a finished Docker image on a CI service (or even locally) and deploy
|
||||
it directly to the host running dokku.
|
||||
it directly to the host running Dokku.
|
||||
|
||||
1. Build image on CI (or locally)
|
||||
1. Build image on CI (or locally).
|
||||
|
||||
```shell
|
||||
docker build -t dokku/test-app:v12 .
|
||||
# Note: The image must be tagged `dokku/<app-name>:<version>`
|
||||
```
|
||||
|
||||
2. Deploy image to Dokku host
|
||||
2. Deploy image to Dokku host.
|
||||
|
||||
```shell
|
||||
docker save dokku/test-app:v12 | ssh my.dokku.host "docker load | dokku tags:deploy test-app v12"
|
||||
```
|
||||
|
||||
> Note: You can also use a Docker Registry to push and pull
|
||||
> Note: You can also use a Docker registry to push and pull
|
||||
> the image rather than uploading it directly.
|
||||
|
||||
Here's a more complete example using the above method:
|
||||
@@ -160,5 +163,10 @@ docker build -t dokku/test-app:v12 .
|
||||
# copy the image to the dokku host
|
||||
docker save dokku/test-app:v12 | bzip2 | ssh my.dokku.host "bunzip2 | docker load"
|
||||
# tag and deploy the image
|
||||
ssh my.dokku.host "dokku tags:create test-app previous; dokku tags:deploy test-app v12 && dokku tags:create test-app latest"
|
||||
ssh my.dokku.host "dokku tags:create test-app previous; dokku tags:deploy test-app v12"
|
||||
```
|
||||
|
||||
## Related articles
|
||||
- [Setting up persistent storage](/docs/advanced-usage/persistent-storage.md)
|
||||
- [Defining environment variables](/docs/configuration/environment-variables.md)
|
||||
- [Setting up the ports](/docs/advanced-usage/proxy-management.md)
|
||||
|
||||
@@ -18,7 +18,7 @@ tar:in <app> # Reads an tarball containing the
|
||||
|
||||
### Deploying from a tarball
|
||||
|
||||
In some cases, it may be useful to deploy an application from a tarball. For instance, if you implemented a non-git based deployment plugin, tarring the generated artifact may be an easier route to interface with the existing Dokku infrastructure.
|
||||
In some cases, it may be useful to deploy an application from a tarball. For instance, if you implemented a non-Git based deployment plugin, tarring the generated artifact may be an easier route to interface with the existing Dokku infrastructure.
|
||||
|
||||
You can place the tarball on an external webserver and deploy via the `tar:from` command.
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Sometimes you need to either inspect running containers or run a one-off command
|
||||
## Run a command in an app environment
|
||||
|
||||
```
|
||||
run <app> <cmd> # Run a command in the environment of an application
|
||||
run [ --env KEY=VALUE | -e KEY=VALUE ] <app> <cmd> # Run a command in a new container using the current application image
|
||||
```
|
||||
|
||||
The `run` command can be used to run a one-off process for a specific command. This will start a new container and run the desired command within that container. Note that this container will be stay around even after command completes. The container will be the same container as was used to start the currently deployed application.
|
||||
@@ -13,6 +13,9 @@ The `run` command can be used to run a one-off process for a specific command. T
|
||||
```shell
|
||||
# runs `ls -lah` in the `/app` directory of the application `node-js-app`
|
||||
dokku run node-js-app ls -lah
|
||||
|
||||
# optionally, run can be passed custom environment variables
|
||||
dokku run --env "NODE_ENV=development" --env "PATH=/custom/path" node-js-app npm run mytask
|
||||
```
|
||||
|
||||
The `run` command can also be used to run a command defined in your Procfile:
|
||||
@@ -61,7 +64,7 @@ dokku --rm run node-js-app some-command
|
||||
dokku --rm-container run node-js-app some-command
|
||||
```
|
||||
|
||||
For tasks that should not be interrupted, run is the **preferred** method of handling cron tasks, as the container will continue running even during a deploy or scaling event. The trade-off is that there will be an increase in memory usage if there are multiple concurrent tasks running.
|
||||
For tasks that should not be interrupted, run is the *preferred* method of handling cron tasks, as the container will continue running even during a deploy or scaling event. The trade-off is that there will be an increase in memory usage if there are multiple concurrent tasks running.
|
||||
|
||||
## Entering existing containers
|
||||
|
||||
@@ -79,7 +82,7 @@ dokku enter node-js-app web.1
|
||||
dokku enter node-js-app --container-id ID
|
||||
```
|
||||
|
||||
Additionally, you can run `enter` with no container-type. If only a single container-type is defined in your app, you will be dropped into the only running container. This behavior is not supported when specifying a custom command; as described below.
|
||||
Additionally, you can run `enter` with no `<container-type>`. If only a single `<container-type>` is defined in your app, you will be dropped into the only running container. This behavior is not supported when specifying a custom command; as described below.
|
||||
|
||||
By default, it runs a `/bin/bash`, but can also be used to run a custom command:
|
||||
|
||||
@@ -93,7 +96,7 @@ dokku enter node-js-app web python script/background-worker.py
|
||||
|
||||
### Using `enter` for cron tasks
|
||||
|
||||
Your procfile can have the following entry:
|
||||
Your Procfile can have the following entry:
|
||||
|
||||
```Procfile
|
||||
cron: sleep infinity
|
||||
@@ -113,34 +116,34 @@ dokku enter node-js-app cron some-command
|
||||
|
||||
Note that you can also run multiple commands at the same time to reduce memory usage, though that may result in polluting the container environment.
|
||||
|
||||
For tasks that will properly resume, you **should** use the above method, as running tasks will be interrupted during deploys and scaling events, and subsequent commands will always run with the latest container. Note that if you scale the cron container down, this may interrupt proper running of the task.
|
||||
For tasks that will properly resume, you *should* use the above method, as running tasks will be interrupted during deploys and scaling events, and subsequent commands will always run with the latest container. Note that if you scale the cron container down, this may interrupt proper running of the task.
|
||||
|
||||
## General Cron Recommendations
|
||||
## General cron recommendations
|
||||
|
||||
Regularly scheduled tasks can be a bit of a pain with dokku. The following are general recommendations to follow to help ensure successful task runs.
|
||||
Regularly scheduled tasks can be a bit of a pain with Dokku. The following are general recommendations to follow to help ensure successful task runs.
|
||||
|
||||
- Use the `dokku` user's crontab
|
||||
- If you do not, the `dokku` binary will attempt to execute with `sudo` dokku, and your cron run with fail with `sudo: no tty present and no askpass program specified`
|
||||
- Use the `dokku` user's crontab.
|
||||
- If you do not, the `dokku` binary will attempt to execute with `sudo`, and your cron run with fail with `sudo: no tty present and no askpass program specified`.
|
||||
- Add a `MAILTO` environment variable to ship cron emails to yourself.
|
||||
- Add a `PATH` environment variable or specify the full path to binaries on the host.
|
||||
- Add a `SHELL` environment variable to specify bash when running commands.
|
||||
- Add a `SHELL` environment variable to specify Bash when running commands.
|
||||
- Keep your cron tasks in time-sorted order.
|
||||
- Keep your server time in UTC so you don't need to translate daylight saving's time when reading the cronfile.
|
||||
- Keep your server time in UTC so you don't need to translate daylight savings time when reading the cronfile.
|
||||
- Run tasks at the lowest traffic times if possible.
|
||||
- Use cron to **trigger** jobs, not run them. Use a real queuing system such as rabbitmq to actually process jobs.
|
||||
- Use cron to *trigger* jobs, not run them. Use a real queuing system such as rabbitmq to actually process jobs.
|
||||
- Try to keep tasks quiet so that mails only send on errors.
|
||||
- Do not silence standard error or standard out. If you silence the former, you will miss failures. Silencing the latter means you should actually make application changes to handle log levels.
|
||||
- Use a service such as [Dead Man's Snitch](https://deadmanssnitch.com) to verify that cron tasks completed successfully.
|
||||
- Add lots of comments to your cronfile, including what a task is doing, so that you don't spend time deciphering the file later.
|
||||
- Place your cronfiles in a pattern such as `/etc/cron.d/APP`.
|
||||
- Do not use non-ascii characters in your cronfile names. Cron is finicky.
|
||||
- Remember to have trailing newlines in your cronfile! Cron is finicky.
|
||||
- Do not use non-ASCII characters in your cronfile names. cron is finicky.
|
||||
- Remember to have trailing newlines in your cronfile! cron is finicky.
|
||||
|
||||
The following is a sample cronfile that you can use for your applications:
|
||||
|
||||
```cron
|
||||
# server cron jobs
|
||||
MAILTO="mail@example.com"
|
||||
MAILTO="mail@dokku.me"
|
||||
PATH=/usr/local/bin:/usr/bin:/bin
|
||||
SHELL=/bin/bash
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
```
|
||||
ps <app> # List processes running in app container(s)
|
||||
ps:inspect <app> # Displays a sanitized version of docker inspect for an app
|
||||
ps:rebuild <app> # Rebuild an app from source
|
||||
ps:rebuildall # Rebuild all apps from source
|
||||
ps:report [<app>] [<flag>] # Displays a process report for one or more apps
|
||||
@@ -13,12 +14,14 @@ ps:restartall # Restart all deployed app contai
|
||||
ps:scale <app> <proc>=<count> [<proc>=<count>] # Get/Set how many instances of a given process to run
|
||||
ps:set-restart-policy <app> <policy> # Sets app restart-policy
|
||||
ps:start <app> # Start app container(s)
|
||||
ps:startall # Start all deployed app containers
|
||||
ps:stop <app> # Stop app container(s)
|
||||
ps:stopall # Stop all app container(s)
|
||||
```
|
||||
|
||||
By default, Dokku will only start a single `web` process - if defined - though process scaling can be managed by the `ps` plugin or [via a custom `DOKKU_SCALE` file](/dokku/deployment/process-management/#manually-managing-process-scaling).
|
||||
By default, Dokku will only start a single `web` process - if defined - though process scaling can be managed by the `ps` plugin or [via a custom `DOKKU_SCALE` file](/docs/deployment/process-management.md#manually-managing-process-scaling).
|
||||
|
||||
> The `web` proctype is the only proctype that will invoke custom checks as defined by a CHECKS file. It is also the only process type that will be launched in a container that is either proxied via nginx or bound to an external port.
|
||||
> The `web` proctype is the only proctype that will invoke custom checks as defined by a `CHECKS` file. It is also the only process type that will be launched in a container that is either proxied via nginx or bound to an external port.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -30,9 +33,21 @@ To find out if your application's containers are running the commands you expect
|
||||
dokku ps node-js-app
|
||||
```
|
||||
|
||||
### Inspecting app containers
|
||||
|
||||
> New as of 0.13.0
|
||||
|
||||
A common administrative task to perform is calling `docker inspect` on the containers that are running for an application. This can be an error-prone task to perform, and may also reveal sensitive environment variables if not done correctly. Dokku provides a wrapper around this command via the `ps:inspect` command:
|
||||
|
||||
```shell
|
||||
dokku ps:inspect node-js-app
|
||||
```
|
||||
|
||||
This command will gather all the running container IDs for your application and call `docker inspect`, sanitizing the output data so it can be copy-pasted elsewhere safely.
|
||||
|
||||
### Rebuilding applications
|
||||
|
||||
There are some Dokku commands which will not automatically rebuild an application's environment, or which can be told to skip a rebuild. For instance, you may wish to run multiple `config:set` commands without a restart so as to speed up configuration. In these cases, you can ultimately trigger an application rebuild using `ps:rebuild`
|
||||
There are some Dokku commands which will not automatically rebuild an application's environment, or which can be told to skip a rebuild. For instance, you may wish to run multiple `config:set` commands without a restart so as to speed up configuration. In these cases, you can ultimately trigger an application rebuild using `ps:rebuild`
|
||||
|
||||
```shell
|
||||
dokku ps:rebuild node-js-app
|
||||
@@ -45,13 +60,13 @@ dokku ps:rebuildall
|
||||
```
|
||||
|
||||
> The `ps:rebuild` and `ps:rebuildall` commands only work for applications for which there is a source, and thus
|
||||
> will only always work deterministically for git-deployed application. Please see
|
||||
> the [images documentation](/dokku/deployment/methods/images/) and [tar documentation](/dokku/deployment/methods/tar/)
|
||||
> will only always work deterministically for Git-deployed application. Please see
|
||||
> the [images documentation](/docs/deployment/methods/images.md) and [tar documentation](/docs/deployment/methods/tar.md)
|
||||
> in for more information concerning rebuilding those applications.
|
||||
|
||||
### Restarting applications
|
||||
|
||||
Applications can be restarted, which is functionally identical to calling the `release_and_deploy` function on an application. Please not that any linked containers *must* be started before the application in order to have a successful boot.
|
||||
Applications can be restarted, which is functionally identical to calling the `release_and_deploy` function on an application. Please note that any linked containers *must* be started before the application in order to have a successful boot.
|
||||
|
||||
```shell
|
||||
dokku ps:restart node-js-app
|
||||
@@ -93,12 +108,18 @@ dokku ps:scale node-js-app
|
||||
|
||||
### Stopping applications
|
||||
|
||||
Deployed applications can be stopped using the `ps:stop` command. This turns all running containers for an application, and will result in a `502 Bad Gateway` response for the default nginx proxy implementation.
|
||||
Deployed applications can be stopped using the `ps:stop` command. This turns off all running containers for an application, and will result in a **502 Bad Gateway** response for the default nginx proxy implementation.
|
||||
|
||||
```shell
|
||||
dokku ps:stop node-js-app
|
||||
```
|
||||
|
||||
You may also stop all applications at once:
|
||||
|
||||
```shell
|
||||
dokku ps:stopall
|
||||
```
|
||||
|
||||
### Starting applications
|
||||
|
||||
All stopped containers can be started using the `ps:start` command. This is similar to running `ps:restart`, except no action will be taken if the application containers are running.
|
||||
@@ -107,7 +128,17 @@ All stopped containers can be started using the `ps:start` command. This is simi
|
||||
dokku ps:start node-js-app
|
||||
```
|
||||
|
||||
## Restart Policies
|
||||
### Starting all applications
|
||||
|
||||
In some cases, it may be necessary to start all applications from scratch - e.g. if all Docker containers have been manually stopped. This can be executed via the `ps:startall` command, which supports parallelism in the same manner `ps:rebuildall`, `ps:restartall`, and `ps:stopall` do.
|
||||
|
||||
Be aware that no action will be taken if the application containers are running.
|
||||
|
||||
```shell
|
||||
dokku ps:startall
|
||||
```
|
||||
|
||||
## Restart policies
|
||||
|
||||
> New as of 0.7.0
|
||||
|
||||
@@ -115,7 +146,7 @@ By default, Dokku will automatically restart containers that exit with a non-zer
|
||||
|
||||
### Showing the current restart policy
|
||||
|
||||
THe `ps:restart-policy` command will show the currently configured restart policy for an application. The default policy is `on-failure:10`
|
||||
The `ps:restart-policy` command will show the currently configured restart policy for an application. The default policy is `on-failure:10`
|
||||
|
||||
```shell
|
||||
dokku ps:restart-policy node-js-app
|
||||
@@ -179,7 +210,7 @@ Restart policies have no bearing on server reboot, and Dokku will always attempt
|
||||
|
||||
## Manually managing process scaling
|
||||
|
||||
You can optionally _commit_ a `DOKKU_SCALE` file to the root of your repository - *not* to the /home/dokku/APP directory. Dokku expects this file to contain one line for every process defined in your Procfile.
|
||||
You can optionally *commit* a `DOKKU_SCALE` file to the root of your repository - *not* to the `/home/dokku/APP` directory. Dokku expects this file to contain one line for every process defined in your Procfile.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -190,4 +221,4 @@ worker=2
|
||||
|
||||
If it is not committed to the repository, the `DOKKU_SCALE` file will otherwise be automatically generated based on your `ps:scale` settings.
|
||||
|
||||
> *NOTE*: Dokku will always use the DOKKU_SCALE file that ships with the repo to override any local settings.
|
||||
> *NOTE*: Dokku will always use the `DOKKU_SCALE` file that ships with the repo to override any local settings.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Remote Commands
|
||||
|
||||
Dokku commands can be run over ssh. Anywhere you would run `dokku <command>`, just run `ssh -t dokku@dokku.me <command>`
|
||||
Dokku commands can be run over SSH. Anywhere you would run `dokku <command>`, just run `ssh -t dokku@dokku.me <command>`
|
||||
The `-t` is used to request a pty. It is highly recommended to do so.
|
||||
To avoid the need to type the `-t` option each time, simply create/modify a section in the `.ssh/config` on the client side, as follows:
|
||||
|
||||
@@ -11,8 +11,8 @@ Host dokku.me
|
||||
|
||||
## Behavioral modifiers
|
||||
|
||||
Dokku also supports certain command-line arguments that augment it's behavior. If using these over ssh, you must use the form `ssh -t dokku@dokku.me -- <command>`
|
||||
in order to avoid ssh interpretting Dokku arguments for itself.
|
||||
Dokku also supports certain command line arguments that augment its behavior. If using these over SSH, you must use the form `ssh -t dokku@dokku.me -- <command>`
|
||||
in order to avoid SSH interpretting Dokku arguments for itself.
|
||||
|
||||
```
|
||||
--quiet suppress output headers
|
||||
@@ -25,4 +25,4 @@ in order to avoid ssh interpretting Dokku arguments for itself.
|
||||
|
||||
You may optionally use a client to connect to your Dokku server. Most clients use the configured `git remote` to locate the Dokku server, though some allow for overriding this via an environment variable or flag.
|
||||
|
||||
Please refer to the [clients](/dokku/community/clients/) list for more details.
|
||||
Please refer to the [clients](/docs/community/clients.md) list for more details.
|
||||
|
||||
@@ -8,17 +8,17 @@ ssh-keys:list # List of all authorized Dokku pu
|
||||
ssh-keys:remove <name> # Remove SSH public key by name
|
||||
```
|
||||
|
||||
When pushing to Dokku, ssh key based authorization is the preferred authentication method, for ease of use and increased security.
|
||||
When pushing to Dokku, SSH key-based authorization is the preferred authentication method, for ease of use and increased security.
|
||||
|
||||
Users in Dokku are managed via the `~/dokku/.ssh/authorized_keys` file. It is **highly** recommended that you follow the steps below to manage users on a Dokku server.
|
||||
Users in Dokku are managed via the `~/dokku/.ssh/authorized_keys` file. It is *highly* recommended that you follow the steps below to manage users on a Dokku server.
|
||||
|
||||
> Users of older versions of Dokku may use the `sshcommand` binary to manage keys instead of the `ssh-keys` plugin. Please refer to the Dokku documentation for your version for more details.
|
||||
|
||||
## Usage
|
||||
|
||||
### Listing SSH Keys
|
||||
### Listing SSH keys
|
||||
|
||||
You can use the `ssh-keys:list` command to show all configured ssh keys. Any key added via the `dokku-installer` will be associated with the `admin` key name.
|
||||
You can use the `ssh-keys:list` command to show all configured SSH keys. Any key added via the `dokku-installer` will be associated with the `admin` key name.
|
||||
|
||||
```shell
|
||||
dokku ssh-keys:list
|
||||
@@ -32,11 +32,11 @@ The output contains the following information:
|
||||
|
||||
- SSH Key Fingerprint.
|
||||
- The `KEY_NAME`.
|
||||
- A comma separated list of ssh options under the `SSHCOMMAND_ALLOWED_KEYS` name.
|
||||
- A comma separated list of SSH options under the `SSHCOMMAND_ALLOWED_KEYS` name.
|
||||
|
||||
### Adding SSH Keys
|
||||
### Adding SSH keys
|
||||
|
||||
You can add your public key to Dokku with the `ssh-keys:add` command. The output will be the fingerprint of the ssh key:
|
||||
You can add your public key to Dokku with the `ssh-keys:add` command. The output will be the fingerprint of the SSH key:
|
||||
|
||||
```shell
|
||||
dokku ssh-keys:add KEY_NAME path/to/id_rsa.pub
|
||||
@@ -46,25 +46,25 @@ dokku ssh-keys:add KEY_NAME path/to/id_rsa.pub
|
||||
b7:76:27:4f:30:90:21:ae:d4:1e:70:20:35:3f:06:d6
|
||||
```
|
||||
|
||||
`KEY_NAME` is the username prefer to use to refer to this particular key. Including the word `admin` in the name will grant the user privileges to add additional keys remotely.
|
||||
`KEY_NAME` is the name you want to use to refer to this particular key. Including the word `admin` in the name will grant the user privileges to add additional keys remotely.
|
||||
|
||||
> `KEY_NAME` is a unique name which is used to identify public keys. Attempting to re-use a key name will result in an error. The ssh (git) user is *always* `dokku`, as this is the system user that the `dokku` binary uses to perform all it's actions.
|
||||
> `KEY_NAME` is a unique name which is used to identify public keys. Attempting to re-use a key name will result in an error. The SSH (Git) user is *always* `dokku`, as this is the system user that the `dokku` binary uses to perform all its actions.
|
||||
|
||||
Admin users and root can also add keys remotely:
|
||||
Admin users and root can add keys remotely by specifying the `dokku` bin on their `ssh` command:
|
||||
|
||||
```shell
|
||||
cat ~/.ssh/id_rsa.pub | ssh dokku@dokku.me ssh-keys:add KEY_NAME
|
||||
cat ~/.ssh/id_rsa.pub | ssh root@dokku.me dokku ssh-keys:add KEY_NAME
|
||||
```
|
||||
|
||||
Finally, if you are using the vagrant installation, you can also use the `make vagrant-acl-add` target to add your public key to Dokku (it will use your host username as the `USER`):
|
||||
If you are using the Vagrant installation, you can also use the `make vagrant-acl-add` target to add your public key to Dokku (it will use your host username as the `USER`):
|
||||
|
||||
```shell
|
||||
cat ~/.ssh/id_rsa.pub | make vagrant-acl-add
|
||||
```
|
||||
|
||||
### Removing SSH Keys
|
||||
### Removing SSH keys
|
||||
|
||||
As key names are unique, they can be used to remove a public ssh key.
|
||||
As key names are unique, they can be used to remove a public SSH key.
|
||||
|
||||
```SHELL
|
||||
dokku ssh-keys:remove KEY_NAME
|
||||
@@ -72,11 +72,11 @@ dokku ssh-keys:remove KEY_NAME
|
||||
|
||||
## Scoping commands to specific users
|
||||
|
||||
Keys are given unique names, which can be used in conjunction with the [user-auth](/dokku/development/plugin-triggers/#user-auth) plugin trigger to handle command authorization. Please see the documentation on that trigger for more information.
|
||||
Keys are given unique names, which can be used in conjunction with the [user-auth](/docs/development/plugin-triggers.md#user-auth) plugin trigger to handle command authorization. Please see the documentation on that trigger for more information.
|
||||
|
||||
## Granting other Unix user accounts Dokku access
|
||||
|
||||
Any Unix user account which belongs to the 'sudo' Unix group can run Dokku. However, you may want to give them Dokku access but not full sudo privileges.
|
||||
Any Unix user account which belongs to the `sudo` Unix group can run Dokku. However, you may want to give them Dokku access but not full sudo privileges.
|
||||
|
||||
To allow other Unix user accounts to be able to run Dokku commands, without giving them full sudo access, modify your sudoers configuration.
|
||||
|
||||
|
||||
@@ -11,17 +11,25 @@ checks:run <app> [process-type(s)] Runs zero-downtime checks for all proce
|
||||
checks:skip <app> [process-type(s)] Skip zero-downtime checks for all processes (or comma-separated process-type list)
|
||||
```
|
||||
|
||||
By default, Dokku will wait `10` seconds after starting each container before assuming it is up and proceeding with the deploy. Once this has occurred for all containers started by for an application, traffic will be switched to point to your new containers. Dokku will also wait a further `60` seconds _after_ the deploy is complete before terminating old containers in order to give time for long running connections to terminate. In either case, you may have more than one container running for a given application.
|
||||
By default, Dokku will wait `10` seconds after starting each container before assuming it is up and proceeding with the deploy. Once this has occurred for all containers started by for an application, traffic will be switched to point to your new containers. Dokku will also wait a further `60` seconds *after* the deploy is complete before terminating old containers in order to give time for long running connections to terminate. In either case, you may have more than one container running for a given application.
|
||||
|
||||
You may both create user-defined checks for web processes using a `CHECKS` file, as well as customize any and all parts of this experience using the checks plugin.
|
||||
|
||||
## Configuring Check Settings using the `config` plugin
|
||||
> Web checks are performed via `curl` on Dokku host. Some application code - such
|
||||
> as the Django framework - checks for specific hostnames or header values, these
|
||||
> checks will fail. To avoid this:
|
||||
>
|
||||
> - Remove such checks from your code: Modify your application to remove the hostname check completely.
|
||||
> - Allow checks from all hostnames: Modify your application to accept a dynamically provided hostname.
|
||||
> - Specify the domain within the check: See below for further documentation.
|
||||
|
||||
## Configuring check settings using the `config` plugin
|
||||
|
||||
There are certain settings that can be configured via environment variables:
|
||||
|
||||
- `DOKKU_DEFAULT_CHECKS_WAIT`: (default: `10`) If no user-defined checks are specified - or if the process being checked is not a `web` process - this is the period of time Dokku will wait before checking that a container is still running.
|
||||
- `DOKKU_DOCKER_STOP_TIMEOUT`: (default: `10`) Configurable grace period given to the `docker stop` command. If a container has not stopped by this time, a `kill -9` signal or equivalent is sent in order to force-terminate the container. Both the `ps:stop` and `apps:destroy` commands _also_ respect this value. If not specified, the docker defaults for the [docker stop command](https://docs.docker.com/engine/reference/commandline/stop/) will be used.
|
||||
- `DOKKU_WAIT_TO_RETIRE`: (default: `60`) After a successful deploy, the grace period given to old containers before they are stopped/terminated. This is useful for ensuring completion of long-running http connections.
|
||||
- `DOKKU_DOCKER_STOP_TIMEOUT`: (default: `10`) Configurable grace period given to the `docker stop` command. If a container has not stopped by this time, a `kill -9` signal or equivalent is sent in order to force-terminate the container. Both the `ps:stop` and `apps:destroy` commands *also* respect this value. If not specified, the Docker defaults for the [`docker stop` command](https://docs.docker.com/engine/reference/commandline/stop/) will be used.
|
||||
- `DOKKU_WAIT_TO_RETIRE`: (default: `60`) After a successful deploy, the grace period given to old containers before they are stopped/terminated. This is useful for ensuring completion of long-running HTTP connections.
|
||||
|
||||
The following settings may also be specified in the `CHECKS` file, though are available as environment variables in order to ease application reuse.
|
||||
|
||||
@@ -48,7 +56,7 @@ dokku checks:skip node-js-app worker,web
|
||||
DOKKU_CHECKS_SKIPPED: worker,web
|
||||
```
|
||||
|
||||
Zero-downtime checks can also be disabled completely. This will stop old containers **before** new ones start, which may result in broken connections and downtime if your application fails to boot properly.
|
||||
Zero downtime checks can also be disabled completely. This will stop old containers *before* new ones start, which may result in broken connections and downtime if your application fails to boot properly.
|
||||
|
||||
```shell
|
||||
dokku checks:disable node-js-app worker
|
||||
@@ -62,7 +70,7 @@ dokku checks:disable node-js-app worker
|
||||
DOKKU_CHECKS_SKIPPED: web
|
||||
```
|
||||
|
||||
### Displaying checks reports about an app
|
||||
### Displaying checks reports for an app
|
||||
|
||||
> New as of 0.8.1
|
||||
|
||||
@@ -73,13 +81,13 @@ dokku checks:report
|
||||
```
|
||||
|
||||
```
|
||||
=====> search checks information
|
||||
=====> node-js-app checks information
|
||||
Checks disabled list: none
|
||||
Checks skipped list: none
|
||||
=====> python-sample checks information
|
||||
=====> python-app checks information
|
||||
Checks disabled list: none
|
||||
Checks skipped list: none
|
||||
=====> ruby-sample checks information
|
||||
=====> ruby-app checks information
|
||||
Checks disabled list: _all_
|
||||
Checks skipped list: none
|
||||
```
|
||||
@@ -87,11 +95,11 @@ dokku checks:report
|
||||
You can run the command for a specific app also.
|
||||
|
||||
```shell
|
||||
dokku checks:report node-js-sample
|
||||
dokku checks:report node-js-app
|
||||
```
|
||||
|
||||
```
|
||||
=====> node-js-sample checks information
|
||||
=====> node-js-app checks information
|
||||
Checks disabled list: none
|
||||
Checks skipped list: none
|
||||
```
|
||||
@@ -99,25 +107,25 @@ dokku checks:report node-js-sample
|
||||
You can pass flags which will output only the value of the specific information you want. For example:
|
||||
|
||||
```shell
|
||||
dokku checks:report node-js-sample --checks-disabled-list
|
||||
dokku checks:report node-js-app --checks-disabled-list
|
||||
```
|
||||
|
||||
## Customizing Checks
|
||||
## Customizing checks
|
||||
|
||||
If your application needs a longer period to boot up - perhaps to load data into memory, or because of slow boot time - you may also use dokku's `checks` functionality to more precisely check whether an application can serve traffic or not.
|
||||
If your application needs a longer period to boot up - perhaps to load data into memory, or because of slow boot time - you may also use Dokku's `checks` functionality to more precisely check whether an application can serve traffic or not.
|
||||
|
||||
Checks are run against the detected `web` process from your application's `Procfile`. For non-web processes, Dokku will fallback to the aforementioned process uptime check.
|
||||
|
||||
To specify checks, add a `CHECKS` file to the root of your project directory. The `CHECKS` file should be plain text and may contain:
|
||||
|
||||
- Check instructions
|
||||
- Settings (NAME=VALUE)
|
||||
- Comments (lines starting with #)
|
||||
- Empty lines
|
||||
- check instructions
|
||||
- settings (NAME=VALUE)
|
||||
- comments (lines starting with #)
|
||||
- empty lines
|
||||
|
||||
> For dockerfile-based deploys, the file *must* be in `/app/CHECKS` within the container. `/app` is used by default as the root container directory for buildpack-based deploys.
|
||||
> For Dockerfile-based deploys, the file *must* be in `/app/CHECKS` within the container. `/app` is used by default as the root container directory for buildpack-based deploys.
|
||||
|
||||
### Check Instructions
|
||||
### Check instructions
|
||||
|
||||
The format of a check instruction is a path or relative URL, optionally followed by the expected content:
|
||||
|
||||
@@ -137,20 +145,20 @@ The `CHECKS` file can contain multiple checks:
|
||||
To check an application that supports multiple hostnames, use relative URLs that include the hostname:
|
||||
|
||||
```
|
||||
//admin.example.com Admin Dashboard
|
||||
//static.example.com/logo.png
|
||||
//admin.dokku.me Admin Dashboard
|
||||
//static.dokku.me/logo.png
|
||||
```
|
||||
|
||||
You can also specify the protocol to explicitly check HTTPS requests:
|
||||
|
||||
```
|
||||
https://admin.example.com Admin Dashboard
|
||||
https://static.example.com/logo.png
|
||||
https://admin.dokku.me Admin Dashboard
|
||||
https://static.dokku.me/logo.png
|
||||
```
|
||||
|
||||
While a full url may be used in order to invoke checks, if you are using relative urls, the port *must* be omitted.
|
||||
While a full URL may be used in order to invoke checks, if you are using relative URLs, the port *must* be omitted.
|
||||
|
||||
### Check Settings
|
||||
### Check settings
|
||||
|
||||
The default behavior is to wait for `5` seconds before running the checks, to timeout the checks after `30` seconds, and to attempt the checks `5` times. If the checks fail `5` times, the deployment is considered failed and the old container will continue serving traffic.
|
||||
|
||||
@@ -164,7 +172,7 @@ ATTEMPTS=10 # Attempt checks 10 times
|
||||
/ My Amazing App
|
||||
```
|
||||
|
||||
## Manually Invoking Checks
|
||||
## Manually invoking checks
|
||||
|
||||
Checks can also be manually invoked via the `checks:run` command. This can be used to check the status of an application via cron to provide integration with external healthchecking software.
|
||||
|
||||
@@ -212,7 +220,7 @@ dokku checks:run node-js-app worker
|
||||
-----> Default container check successful!
|
||||
```
|
||||
|
||||
An app process id may also be specified:
|
||||
An app process ID may also be specified:
|
||||
|
||||
```shell
|
||||
dokku checks:run node-js-app web.2
|
||||
@@ -239,7 +247,7 @@ dokku checks:run node-js-app non-existent
|
||||
Invalid process type specified (APP.non-existent)
|
||||
```
|
||||
|
||||
Non-existent process ids will *also* result in an error
|
||||
Non-existent process IDs will *also* result in an error
|
||||
|
||||
```shell
|
||||
dokku checks:run node-js-app web.3
|
||||
@@ -250,11 +258,11 @@ dokku checks:run node-js-app web.3
|
||||
Invalid container id specified (APP.web.3)
|
||||
```
|
||||
|
||||
## Example: Successful Rails Deployment
|
||||
## Example: Successful Rails deployment
|
||||
|
||||
In this example, a Rails application is successfully deployed to dokku. The initial round of checks fails while the server is starting, but once it starts they succeed and the deployment is successful. `WAIT` is set to `10` because our application takes a while to boot up. `ATTEMPTS` is set to `6`, but the third attempt succeeds.
|
||||
In this example, a Rails application is successfully deployed to Dokku. The initial round of checks fails while the server is starting, but once it starts they succeed and the deployment is successful. `WAIT` is set to `10` because our application takes a while to boot up. `ATTEMPTS` is set to `6`, but the third attempt succeeds.
|
||||
|
||||
### CHECKS file
|
||||
### `CHECKS` file
|
||||
|
||||
```
|
||||
WAIT=10
|
||||
@@ -268,9 +276,9 @@ For this check to work, we've added a line to `config/routes.rb` that simply ret
|
||||
get '/check.txt', to: proc {[200, {}, ['simple_check']]}
|
||||
```
|
||||
|
||||
### Deploy Output
|
||||
### Deploy output
|
||||
|
||||
> Note: The output has been trimmed for brevity
|
||||
> Note: The output has been trimmed for brevity.
|
||||
|
||||
```shell
|
||||
git push dokku master
|
||||
@@ -278,7 +286,7 @@ git push dokku master
|
||||
|
||||
```
|
||||
-----> Cleaning up...
|
||||
-----> Building myapp from herokuish...
|
||||
-----> Building node-js-app from herokuish...
|
||||
-----> Adding BUILD_ENV to build environment...
|
||||
-----> Ruby app detected
|
||||
-----> Compiling Ruby/Rails
|
||||
@@ -288,8 +296,8 @@ git push dokku master
|
||||
|
||||
-----> Discovering process types
|
||||
Procfile declares types -> web
|
||||
-----> Releasing myapp...
|
||||
-----> Deploying myapp...
|
||||
-----> Releasing node-js-app...
|
||||
-----> Deploying node-js-app...
|
||||
-----> Running pre-flight checks
|
||||
-----> Attempt 1/6 Waiting for 10 seconds ...
|
||||
CHECKS expected result:
|
||||
@@ -307,7 +315,7 @@ curl: (7) Failed to connect to 172.17.0.155 port 5000: Connection refused
|
||||
CHECKS expected result:
|
||||
http://localhost/check.txt => "simple_check"
|
||||
-----> All checks successful!
|
||||
=====> myapp container output:
|
||||
=====> node-js-app container output:
|
||||
=> Booting Thin
|
||||
=> Rails 4.2.0 application starting in production on http://0.0.0.0:5000
|
||||
=> Run `rails server -h` for more startup options
|
||||
@@ -315,24 +323,24 @@ curl: (7) Failed to connect to 172.17.0.155 port 5000: Connection refused
|
||||
Thin web server (v1.6.3 codename Protein Powder)
|
||||
Maximum connections set to 1024
|
||||
Listening on 0.0.0.0:5000, CTRL+C to stop
|
||||
=====> end myapp container output
|
||||
=====> end node-js-app container output
|
||||
-----> Running post-deploy
|
||||
-----> Configuring myapp.dokku.example.com...
|
||||
-----> Configuring myapp.dokku.me...
|
||||
-----> Creating http nginx.conf
|
||||
-----> Running nginx-pre-reload
|
||||
Reloading nginx
|
||||
-----> Shutting down old container in 60 seconds
|
||||
=====> Application deployed:
|
||||
http://myapp.dokku.example.com
|
||||
http://myapp.dokku.me
|
||||
```
|
||||
|
||||
## Example: Failing Rails Deployment
|
||||
## Example: Failing Rails deployment
|
||||
|
||||
In this example, a Rails application fails to deploy. The reason for the failure is that the postgres database connection fails. The initial checks will fail while we wait for the server to start up, just like in the above example. However, once the server does start accepting connections, we will see an error 500 due to the postgres database connection failure.
|
||||
In this example, a Rails application fails to deploy. The reason for the failure is that the PostgreSQL database connection fails. The initial checks will fail while we wait for the server to start up, just like in the above example. However, once the server does start accepting connections, we will see an error 500 due to the PostgreSQL database connection failure.
|
||||
|
||||
Once the attempts have been exceeded, the deployment fails and we see the container output, which shows the Postgres connection errors.
|
||||
Once the attempts have been exceeded, the deployment fails and we see the container output, which shows the PostgreSQL connection errors.
|
||||
|
||||
### CHECKS file
|
||||
### `CHECKS` file
|
||||
|
||||
```
|
||||
WAIT=10
|
||||
@@ -340,11 +348,11 @@ ATTEMPTS=6
|
||||
/
|
||||
```
|
||||
|
||||
> The check to the root url '/' would normally access the database.
|
||||
> The check to the root url `/` would normally access the database.
|
||||
|
||||
### Deploy Output
|
||||
### Deploy output
|
||||
|
||||
> Note: The output has been trimmed for brevity
|
||||
> Note: The output has been trimmed for brevity.
|
||||
|
||||
```shell
|
||||
git push dokku master
|
||||
@@ -352,7 +360,7 @@ git push dokku master
|
||||
|
||||
```
|
||||
-----> Cleaning up...
|
||||
-----> Building myapp from herokuish...
|
||||
-----> Building node-js-app from herokuish...
|
||||
-----> Adding BUILD_ENV to build environment...
|
||||
-----> Ruby app detected
|
||||
-----> Compiling Ruby/Rails
|
||||
@@ -362,8 +370,8 @@ git push dokku master
|
||||
|
||||
Discovering process types
|
||||
Procfile declares types -> web
|
||||
Releasing myapp...
|
||||
Deploying myapp...
|
||||
Releasing node-js-app...
|
||||
Deploying node-js-app...
|
||||
Running pre-flight checks
|
||||
-----> Attempt 1/6 Waiting for 10 seconds ...
|
||||
CHECKS expected result:
|
||||
@@ -402,7 +410,7 @@ curl: (22) The requested URL returned error: 500 Internal Server Error
|
||||
curl: (22) The requested URL returned error: 500 Internal Server Error
|
||||
Could not start due to 1 failed checks.
|
||||
! Check attempt 6/6 failed.
|
||||
=====> myapp container output:
|
||||
=====> node-js-app container output:
|
||||
=> Booting Thin
|
||||
=> Rails 4.2.0 application starting in production on http://0.0.0.0:5000
|
||||
=> Run `rails server -h` for more startup options
|
||||
@@ -423,9 +431,9 @@ Could not start due to 1 failed checks.
|
||||
vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:242:in `initialize'
|
||||
vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `new'
|
||||
vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `postgresql_connection
|
||||
=====> end myapp container output
|
||||
=====> end node-js-app container output
|
||||
/usr/bin/dokku: line 49: 23409 Killed dokku deploy "$APP"
|
||||
To dokku@dokku.example.com:myapp
|
||||
To dokku@dokku.me:myapp
|
||||
! [remote rejected] dokku -> master (pre-receive hook declined)
|
||||
error: failed to push some refs to 'dokku@dokku.example.com:myapp'
|
||||
error: failed to push some refs to 'dokku@dokku.me:myapp'
|
||||
```
|
||||
|
||||
@@ -1,18 +1,37 @@
|
||||
# Plugin Creation
|
||||
# Plugin creation
|
||||
|
||||
A plugin can be a simple implementation of [triggers](/docs/development/plugin-triggers.md) or can implement a command structure of its own. Dokku has no restrictions on the language in which a plugin is implemented; it only cares that the plugin implements the appropriate [commands](/docs/development/plugin-creation.md#command-api) or [triggers](/docs/development/plugin-triggers.md) for the API. **NOTE:** any file that implements triggers or uses the command API must be executable.
|
||||
|
||||
If you create your own plugin:
|
||||
|
||||
1. Take a look at the plugins shipped with Dokku and hack away!
|
||||
2. Check out the [list of triggers](/dokku/development/plugin-triggers) your plugin can implement.
|
||||
3. Upload your plugin to github with a repository name in form of `dokku-<name>` (e.g. `dokku-mariadb`)
|
||||
4. Edit [this page](/dokku/community/plugins/) and add a link to it.
|
||||
1. Take a look at [the plugins shipped with Dokku](/docs/community/plugins.md) and hack away!
|
||||
2. Check out the [list of triggers](/docs/development/plugin-triggers.md) your plugin can implement
|
||||
3. Upload your plugin to GitHub with a repository name following the `dokku-<name>` convention (e.g. `dokku-mariadb`)
|
||||
4. Edit [this page](/docs/community/plugins.md) and add a link to your plugin
|
||||
5. Subscribe to the [dokku development blog](http://progrium.com) to be notified about API changes and releases
|
||||
|
||||
|
||||
### Sample plugin
|
||||
## Compilable plugins (Golang, Java(?), C, etc.)
|
||||
When developing a plugin, you must implement the `install` trigger such that it outputs the built executable(s) using a directory structure that implements the plugin's desired command and/or triggers the API. See the [smoke-test-plugin](https://github.com/dokku/smoke-test-plugin) for an example.
|
||||
|
||||
|
||||
## Command API
|
||||
There are 3 main integration points: `commands`, `subcommands/default`, and `subcommands/<command-name>`.
|
||||
|
||||
### `commands`
|
||||
Primarily used to supply the plugin's usage/help output. (i.e. [plugin help](https://github.com/dokku/dokku/tree/master/plugins/plugin/commands)).
|
||||
|
||||
### `subcommands/default`
|
||||
Implements the plugin's default command behavior. (i.e. [`dokku plugin`](https://github.com/dokku/dokku/tree/master/plugins/plugin/subcommands/default)).
|
||||
|
||||
### `subcommands/<command-name>`
|
||||
Implements the additional command interface and will translate to `dokku plugin:cmd` on the command line. (i.e. [`dokku plugin:install`](https://github.com/dokku/dokku/tree/master/plugins/plugin/subcommands/install)).
|
||||
|
||||
|
||||
# Sample plugin
|
||||
The below plugin is a dummy `dokku hello` plugin.
|
||||
|
||||
hello/subcommands/default
|
||||
`hello/subcommands/default`
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
@@ -26,7 +45,7 @@ hello_main_cmd() {
|
||||
# Use the following lines to reorder args into "$cmd $DOKKU_APP_NAME $@""
|
||||
local argv=("$@")
|
||||
[[ ${argv[0]} == "$cmd" ]] && shift 1
|
||||
[[ ! -z $DOKKU_APP_NAME ]] && set -- $DOKKU_APP_NAME $@
|
||||
[[ -n $DOKKU_APP_NAME ]] && set -- $DOKKU_APP_NAME $@
|
||||
set -- $cmd $@
|
||||
##
|
||||
|
||||
@@ -40,7 +59,7 @@ hello_main_cmd() {
|
||||
hello_main_cmd "$@"
|
||||
```
|
||||
|
||||
hello/subcommands/world
|
||||
`hello/subcommands/world`
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
@@ -54,7 +73,7 @@ hello_world_cmd() {
|
||||
# Use the following lines to reorder args into "$cmd $DOKKU_APP_NAME $@""
|
||||
local argv=("$@")
|
||||
[[ ${argv[0]} == "$cmd" ]] && shift 1
|
||||
[[ ! -z $DOKKU_APP_NAME ]] && set -- $DOKKU_APP_NAME $@
|
||||
[[ -n $DOKKU_APP_NAME ]] && set -- $DOKKU_APP_NAME $@
|
||||
set -- $cmd $@
|
||||
##
|
||||
|
||||
@@ -68,7 +87,7 @@ hello_world_cmd() {
|
||||
hello_world_cmd "$@"
|
||||
```
|
||||
|
||||
hello/commands
|
||||
`hello/commands`
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
@@ -117,15 +136,15 @@ version = "0.1.0"
|
||||
[plugin.config]
|
||||
```
|
||||
|
||||
A few notes:
|
||||
# A few notes:
|
||||
|
||||
- Don't forget to `chmod +x` your executable files.
|
||||
- You should always support `DOKKU_TRACE` as specified on the 2nd line of the plugin.
|
||||
- If your command requires that an application exists, ensure you check for it's existence in the manner prescribed above.
|
||||
- A `help` command is required, though it is allowed to be empty. Also, the command syntax will need to separated by `, ` in order to maintain columnar output alignment.
|
||||
- Commands *should* be namespaced.
|
||||
- As of 0.3.3, a catch-all should be implemented which exits with a `DOKKU_NOT_IMPLEMENTED_EXIT` code. This allows Dokku to output a `command not found` message.
|
||||
- Be sure you want the "set -eo pipefail" option. Look at the following example :
|
||||
- Remember to `chmod +x` your executable files
|
||||
- Always support `DOKKU_TRACE` as per the 2nd line of the above example
|
||||
- If your command depends on an application, include a check for whether that application exists (see the above example)
|
||||
- You must implement a `help` command, though you may leave it empty. Also, you must use commas (`,`) in the command syntax to support output in columns
|
||||
- Commands **should** be namespaced
|
||||
- As of 0.3.3, a catch-all should be implemented that exits with a `DOKKU_NOT_IMPLEMENTED_EXIT` code. This allows Dokku to output a `command not found` message.
|
||||
- Consider whether you want to include the `set -eo pipefail` option. Look at the following example :
|
||||
|
||||
```shell
|
||||
IMAGE=$(docker images | grep "user/repo" | awk '{print $3}')
|
||||
@@ -134,10 +153,9 @@ A few notes:
|
||||
fi
|
||||
```
|
||||
|
||||
In the case where the "user/repo" is not installed, Dokku exits just before the awk command,
|
||||
you will never see the message printed with echo. You just want "set -e" in this case.
|
||||
If `user/repo` doesn't exist, Dokku exits just before the `awk` command and the `dokku_log_fail` message will never go to `STDOUT`. printed with echo. You would want to use `set -e` in this case.
|
||||
|
||||
Here is the documentation of the 'set -eo pipefail' option:
|
||||
Here is the `help` entry for `set`:
|
||||
```
|
||||
help set
|
||||
Options:
|
||||
@@ -147,13 +165,19 @@ A few notes:
|
||||
the last command to exit with a non-zero status,
|
||||
or zero if no command exited with a non-zero status
|
||||
```
|
||||
- As some plugins require access to set app config settings and do not want/require the default Heroku-style behavior of a restart, we have the following "internal" commands that provide this functionality :
|
||||
- In the case that your plugin needs to set application configuration settings and you want to avoid having to restart (default Heroku-style behavior) these "internal" commands provide this functionality:
|
||||
|
||||
```shell
|
||||
dokku config:set --no-restart node-js-app KEY1=VALUE1 [KEY2=VALUE2 ...]
|
||||
dokku config:unset --no-restart node-js-app KEY1 [KEY2 ...]
|
||||
```
|
||||
- From time to time you may want to allow other plugins access to (some of) your plugin's functionality. You can expose this by including a `functions` file in your plugin for others to source. Consider all functions in that file to be publicly accessible by other plugins. Any functions not wished to be made "public" should reside within your plugin trigger or commands files.
|
||||
- As of 0.4.0, we allow image tagging and deployment of said tagged images. Therefore, hard-coding of `$IMAGE` as `dokku/$APP` is no longer sufficient. Instead, for non `pre/post-build-*` plugins, use `get_running_image_tag()` & `get_app_image_name()` as sourced from common/functions. See the [plugin triggers](/dokku/development/plugin-triggers) doc for examples.
|
||||
- As of 0.5.0, we use container labels to help cleanup intermediate containers with `dokku cleanup`. If manually calling `docker run`, include `$DOKKU_GLOBAL_RUN_ARGS`. This will ensure you intermediate containers labeled correctly.
|
||||
- As of 0.6.0, we advise you to *not* call the `dokku` binary directly from within plugins. Clients using the `--app` argument are potentially broken, amongst other issues, when doing so. Instead, please source the `functions` file for a given plugin when attempting to call Dokku internal functions
|
||||
- If you want to allow other plugins access to (some of) your plugin's functionality, you can expose this by including a `functions` file in your plugin for others to source
|
||||
- You should consider all functions in that file to be publicly accessible by other plugins
|
||||
- Any functions you want to keep private should reside in your plugin's `trigger/` or `commands/` directories
|
||||
- As of 0.4.0, Dokku allows image tagging and deployment of tagged images
|
||||
- This means hard-coding the `$IMAGE` as `dokku/$APP` is no longer sufficient
|
||||
- You should now use `get_running_image_tag()` and `get_app_image_name()` as sourced from `common/functions` (see the [plugin triggers](/docs/development/plugin-triggers.md) doc for examples). **Note:** This is only for plugins that are not `pre/post-build-*` plugins
|
||||
- As of 0.5.0, we use container labels to help cleanup intermediate containers with `dokku cleanup
|
||||
- This means that if you manually call `docker run`, you should include `$DOKKU_GLOBAL_RUN_ARGS` to ensure your intermediate containers are labeled correctly
|
||||
- As of 0.6.0, you should not **not** call the `dokku` binary directly from within plugins because clients using the `--app` argument are potentially broken when doing so (as well as other issues)
|
||||
- You should instead source the `functions` file for a given plugin when attempting to call Dokku internal functions
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,60 +4,22 @@ Dokku is released in intervals *at most* three weeks apart, though may be releas
|
||||
|
||||
To propose a release, the following tasks need to be performed:
|
||||
|
||||
- Update all blockquote references of `not yet released and only available in master` to point to release version.
|
||||
- The installable version must be changed in the `contrib/dokku-installer.py` file.
|
||||
- The installable version must be changed in the `debian/control` file.
|
||||
- The installable version must be changed in the `docs/home.html` file
|
||||
- The installable version must be changed in the `docs/installation.md` file.
|
||||
- The installable version must be changed in the `docs/template.html` file.
|
||||
- The installable version must be changed in the `README.md` file.
|
||||
- The embedded css should be cleared in the `docs/template.html` file.
|
||||
- The versioned links should be updated in the `docs/assets/favicons/browserconfig.xml` file.
|
||||
- The versioned links should be updated in the `docs/assets/favicons/manifest.json` file.
|
||||
- The versioned links should be updated in the `docs/assets/style.css` file.
|
||||
- The versioned links should be updated in the `docs/home.html` file.
|
||||
- The versioned links should be updated in the `docs/template.html` file.
|
||||
- The versioned links should be updated or added to the `docs/assets/versions.json` file.
|
||||
- A list of changes must be made in the `HISTORY.md`.
|
||||
- A tag must be created locally with your release version
|
||||
- Debian and RPM packages *must* be created via `vagrant up build`
|
||||
- The packages should be uploaded to packagecloud.io
|
||||
- All changes are pushed to master and the tag should be turned into a release which will contain the changelog.
|
||||
- ArchLinux package description *must* be updated via `vagrant up build-arch` (needs to be done after the tag is pushed to GitHub, because it is based on that)
|
||||
```shell
|
||||
export PACKAGECLOUD_TOKEN=SOME_TOKEN
|
||||
# supports major/minor/patch/betafish
|
||||
contrib/release-dokku
|
||||
```
|
||||
|
||||
> If you are a maintainer and need the PACKAGECLOUD_TOKEN in order to make a release, please contact @josegonzalez to get this information.
|
||||
|
||||
As well, the ArchLinux package description *must* be updated via `vagrant up build-arch` (needs to be done after the tag is pushed to GitHub, because it is based on that)
|
||||
|
||||
## Versioning
|
||||
|
||||
Dokku follows semver standards. As we are not yet at a stable release, breaking changes will require *only* a minor release, while all other changes only require a patch release. Once we hit stable, breaking changes will require a major release.
|
||||
|
||||
Tags should be created via the following method:
|
||||
|
||||
```shell
|
||||
git tag v0.9.9
|
||||
```
|
||||
|
||||
At the moment, tags need not be signed, though that may change in the future.
|
||||
|
||||
## Debian and RPM packages
|
||||
|
||||
The `build` target in the Dokku `Vagrantfile` creates debian and rpm packages for Dokku at a point in time. The version will be based upon the latest local tag - you may create your own, internal tags/releases if that is so desired.
|
||||
|
||||
Debian package information is held in the `debian` directory of the Dokku project.
|
||||
|
||||
For the public project, releases should be pushed to packagecloud.io *after* a tag is created but *before* said tag is pushed to github. The following may be the release workflow:
|
||||
|
||||
|
||||
```shell
|
||||
git tag v0.9.9
|
||||
vagrant up build
|
||||
export PACKAGECLOUD_TOKEN=SOME_TOKEN
|
||||
package_cloud push dokku/dokku/ubuntu/trusty dokku_0.9.9_amd64.deb
|
||||
package_cloud push dokku/dokku/el/7 dokku-0.9.9-1.x86_64.rpm
|
||||
```
|
||||
|
||||
If new versions of other packages were created, these should also be pushed at this time.
|
||||
|
||||
> If you are a maintainer and need the PACKAGECLOUD_TOKEN in order to make a release, please contact @josegonzalez to get this information.
|
||||
|
||||
## ArchLinux Packages
|
||||
|
||||
ArchLinux packages are not really build, because all that is needed for an Arch User Repo (AUR) package is the description of how to build the package. To make this process as easy as possible there is a vagrant box called `build-arch` that updates the version of this build description (a file called `PKGBUILD`), then runs some helper scripts to fill all additional information and does test if the package could be build. Then only those changes need to be pushed to the AUR repo and an updated version of the package is ready for usage for our ArchLinux users. For detailed information see the section below.
|
||||
@@ -67,7 +29,7 @@ The workflow looks like this:
|
||||
```shell
|
||||
# having dokku-arch in ../dokku-arch
|
||||
vagrant up build-arch
|
||||
# wait for "==> build-arch: ==> Finished making: dokku 0.8.2-2 (Mon Feb 22 23:20:37 CET 2016)"
|
||||
# wait for "==> build-arch: ==> Finished making: dokku 0.17.6-2 (Mon Feb 22 23:20:37 CET 2016)"
|
||||
cd ../dokku-arch
|
||||
git add PKGBUILD .SRCINFO
|
||||
git commit -m 'Update to dokku 0.9.9'
|
||||
@@ -76,29 +38,7 @@ git push aur master
|
||||
|
||||
> If you are a maintainer and need access to the AUR repositories in order to make a release, please contact @morrisjobke or @josegonzalez to get this co-maintainership.
|
||||
|
||||
## Changelog format
|
||||
|
||||
The `HISTORY.md` should be added to based on the changes made since the previous release. This can be done by reviewing all merged pull requests to the master branch on github. The format is as follows:
|
||||
|
||||
```
|
||||
## 0.9.9
|
||||
|
||||
Some description concerning major changes in this release, or potential incompatibilities.
|
||||
|
||||
### New Features
|
||||
|
||||
- #SOME_ID: @pull-request-creator Description
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- #SOME_ID: @pull-request-creator Description
|
||||
|
||||
### Docs Changes
|
||||
|
||||
- #SOME_ID: @pull-request-creator Description
|
||||
```
|
||||
|
||||
## Detailed information for ArchLinux packages
|
||||
### Detailed information for ArchLinux packages
|
||||
|
||||
All of the information to build the ArchLinux package is in the AUR git repository (see [dokku AUR page](https://aur.archlinux.org/packages/dokku/)). The release of a AUR package only consists of pushing the package information into the AUR git repo. Then users could use that information to build the package on their machines.
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ While we do provide official packages for a variety of platforms, as our test su
|
||||
|
||||
## Local Test Execution
|
||||
|
||||
- Setup Dokku in a [vagrant vm](/dokku/getting-started/install/vagrant)
|
||||
- Setup Dokku in a [vagrant vm](/docs/getting-started/install/vagrant.md)
|
||||
- Run the following to setup tests and execute them:
|
||||
|
||||
```shell
|
||||
@@ -32,6 +32,9 @@ While we do provide official packages for a variety of platforms, as our test su
|
||||
# run linter & update vagrant Dokku install from local git clone
|
||||
make lint copyfiles
|
||||
|
||||
# build a specific plugin
|
||||
make go-build-plugin copyplugin PLUGIN_NAME=apps
|
||||
|
||||
# execute all bats tests
|
||||
make unit-tests
|
||||
|
||||
@@ -46,3 +49,39 @@ make deploy-test-nodejs-express
|
||||
```
|
||||
|
||||
For a full list of test make targets check out `tests.mk` in the root of the Dokku repository.
|
||||
|
||||
## Executing a single test suite
|
||||
|
||||
When working on a particular plugin, it may be useful to run _only_ a particular test suite. This can be done by specifying the test suite path:
|
||||
|
||||
```shell
|
||||
bats tests/unit/10_apps.bats
|
||||
```
|
||||
|
||||
It is also possible to target multiple test suites at a time.
|
||||
|
||||
```shell
|
||||
bats tests/unit/10_apps.bats tests/unit/10_certs.bats
|
||||
```
|
||||
|
||||
## Executing a single test
|
||||
|
||||
In order to increase testing velocity, a wrapper script around bats is available that can be used to run a single testcase within a suite.
|
||||
|
||||
Tests within a suite may be listed by specifying the suite as a parameter to the `tests/bats-exec-test-single` script.
|
||||
|
||||
```shell
|
||||
tests/bats-exec-test-single tests/unit/10_apps.bats
|
||||
```
|
||||
|
||||
A single test can be specified as a second parameter. The test is selected by fuzzy-match, and only the first match is executed.
|
||||
|
||||
```shell
|
||||
tests/bats-exec-test-single tests/unit/10_apps.bats clone
|
||||
```
|
||||
|
||||
Some special characters are translated in the test listing - specifically the characters `( ) :` - while others are not. The fuzzy matching happens on the test names listed when no second character is invoked, so executing a test with a more specific name will work as expected.
|
||||
|
||||
```shell
|
||||
tests/bats-exec-test-single tests/unit/10_apps.bats clone_-2d-2dskip-2ddeploy
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Advanced installation
|
||||
|
||||
You can always install Dokku straight from the latest - potentially unstable - master release via the following bash command:
|
||||
You can always install Dokku straight from the latest - potentially unstable - `master` branch via the following Bash command:
|
||||
|
||||
```shell
|
||||
# using a branch results in installing from source
|
||||
@@ -10,7 +10,7 @@ sudo DOKKU_BRANCH=master bash bootstrap.sh
|
||||
|
||||
## Development
|
||||
|
||||
If you plan on developing dokku, the easiest way to install from your own repository is cloning the repository and calling the install script. Example:
|
||||
If you plan on developing Dokku, the easiest way to install from your own repository is cloning the repository and calling the install script. Example:
|
||||
|
||||
```shell
|
||||
git clone https://github.com/yourusername/dokku.git
|
||||
@@ -34,9 +34,9 @@ chmod +x bootstrap.sh
|
||||
sudo DOKKU_REPO=https://github.com/yourusername/dokku.git DOKKU_BRANCH=master ./bootstrap.sh
|
||||
```
|
||||
|
||||
## Custom herokuish build
|
||||
## Custom Herokuish build
|
||||
|
||||
Dokku ships with a pre-built version of version of the [herokuish](https://github.com/gliderlabs/herokuish) component by default. If you want to build your own version you can specify that with an env variable.
|
||||
Dokku ships with a pre-built version of version of the [Herokuish](https://github.com/gliderlabs/herokuish) component by default. If you want to build your own version you can specify that with an environment variable.
|
||||
|
||||
```shell
|
||||
git clone https://github.com/dokku/dokku.git
|
||||
@@ -44,25 +44,29 @@ cd dokku
|
||||
sudo BUILD_STACK=true STACK_URL=https://github.com/gliderlabs/herokuish.git make install
|
||||
```
|
||||
|
||||
## Configuring
|
||||
## Skipping Herokuish installation
|
||||
|
||||
Once Dokku is installed, if you are not using the web-installer, you'll want to configure a the virtualhost setup as well as the push user. If you do not, your installation will be considered incomplete and you will not be able to deploy applications.
|
||||
The Herokuish package is recommended but not required if not using Heroku buildpacks for deployment. Debian-based OS users can run the bootstrap installer via `sudo DOKKU_NO_INSTALL_RECOMMENDS=true bash bootstrap.sh` to skip the dependency. Please note that this will _also_ skip installation of other recommended dependencies.
|
||||
|
||||
## Configuring an unattended installation
|
||||
|
||||
Once Dokku is installed, if you are not using the web-installer, you'll want to configure the virtualhost setup as well as the push user. If you do not, your installation will be considered incomplete and you will not be able to deploy applications.
|
||||
|
||||
For Debian, unattended installation is described [Debian installation guide](/docs/getting-started/install/debian.md).
|
||||
|
||||
*You should also stop and disable the `dokku-installer` service to remove public access to adding SSH keys.*
|
||||
|
||||
Set up a domain and a wildcard domain pointing to that host. Make sure `/home/dokku/VHOST` is set to this domain. By default it's set to whatever hostname the host has. This file is only created if the hostname can be resolved by dig (`dig +short $(hostname -f)`). Otherwise you have to create the file manually and set it to your preferred domain. If this file still is not present when you push your app, Dokku will publish the app with a port number (i.e. `http://example.com:49154` - note the missing subdomain).
|
||||
Set up a domain using your preferred vendor and a wildcard domain pointing to the host running Dokku. You can manage this global domain using the [domains plugin](/docs/configuration/domains.md).
|
||||
|
||||
Follow the [user management documentation](/dokku/deployment/user-management/) in order to add users to Dokku, or to give other Unix accounts access to Dokku.
|
||||
Follow the [user management documentation](/docs/deployment/user-management.md) in order to add SSH keys for users to Dokku, or to give other Unix accounts access to Dokku.
|
||||
|
||||
That's it!
|
||||
## VMs with less than 1 GB of memory
|
||||
|
||||
## VMs with less than 1GB of memory
|
||||
Having less than 1 GB of system memory available for Dokku and its containers may result in unexpected errors, such as `! [remote rejected] master -> master (pre-receive hook declined)` during installation of NPM dependencies (https://github.com/npm/npm/issues/3867).
|
||||
|
||||
Having less than 1GB of system memory available for Dokku and its containers, for example Digital Ocean's small 512MB machines, might result in unexpected errors, such as **! [remote rejected] master -> master (pre-receive hook declined)** during installation of NPM dependencies (https://github.com/npm/npm/issues/3867).
|
||||
To work around this issue, it might suffice to augment the Linux swap file size to a maximum of twice the physical memory size.
|
||||
|
||||
To work around this issue, it might suffice to augment the linux swap file size to a maximum of twice the physical memory size.
|
||||
|
||||
To resize the swap file of a 512MB machine to 1GB, follow these steps while in SSH within your machine:
|
||||
To resize the swap file of a 512 MB machine to 1 GB, follow these steps while in SSH within your machine:
|
||||
|
||||
```shell
|
||||
cd /var
|
||||
@@ -76,4 +80,5 @@ free
|
||||
|
||||
echo "/var/swap.img none swap sw 0 0" >> /etc/fstab
|
||||
```
|
||||
Reference: https://www.digitalocean.com/community/tutorials/how-to-configure-virtual-memory-swap-file-on-a-vps
|
||||
|
||||
[Reference](https://www.digitalocean.com/community/tutorials/how-to-configure-virtual-memory-swap-file-on-a-vps)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Microsoft Azure
|
||||
|
||||
- If you don't already have one [generate an SSH key pair](https://help.github.com/articles/generating-ssh-keys/).
|
||||
1. If you don't already have one [generate an SSH key pair](https://help.github.com/articles/generating-ssh-keys/).
|
||||
|
||||
- Go to the [Dokku on azure deployment page](https://github.com/azure/azure-quickstart-templates/tree/master/dokku-vm) and click **Deploy to Azure**.
|
||||
2. Go to the [Dokku on Azure deployment page](https://github.com/azure/azure-quickstart-templates/tree/master/dokku-vm) and click **Deploy to Azure**.
|
||||
|
||||
- You'll be prompted to enter a few parameters, including a unique storage account name and a unique name for the sub-domain used for your public IP address. For the `sshKeyData` parameter, copy and paste the contents of the **public** key file you just created. After a few minutes the Dokku instance will be deployed.
|
||||
3. You'll be prompted to enter a few parameters, including a unique storage account name and a unique name for the subdomain used for your public IP address. For the `sshKeyData` parameter, copy and paste the contents of the *public* key file you just created. After a few minutes the Dokku instance will be deployed.
|
||||
|
||||
- In your browser of choice, navigate to `http://[[dnsNameForPublicIP]].[[location]].cloudapp.azure.com`. Where `[[dnsNameForPublicIP]]` and `[[location]]` are template parameters you used to deploy the template.
|
||||
4. In your browser of choice, navigate to `http://[dnsNameForPublicIP].[location].cloudapp.azure.com`. Where `[dnsNameForPublicIP]` and `[location]` are template parameters you used to deploy the template.
|
||||
|
||||
- Finish your Dokku setup like you normally would by creating a **new** public/private key pair for your deployments using `ssh-keygen` (don't use the same one as you created in the first step). You should select 'Use Virtual Host Naming' and set the `Hostname` to a **public dns name** that you own such as one you would purchase from [namecheap](http://namecheap.com). Alternatively thanks to [xip.io]( http://xip.io/) you can just use yourAzurePublicIP.xip.io for free. For example, if your public IP is `44.44.44.44` then you would set it to `44.44.44.44.xip.io`.
|
||||
5. Finish your Dokku setup like you normally would by creating a *new* public/private key pair for your deployments using `ssh-keygen` (don't use the same one as you created in the first step). You should select **Use Virtual Host Naming** and set the **Hostname** to a *public DNS name* that you own such as one you would purchase from [Namecheap](http://namecheap.com). Alternatively thanks to [xip.io](http://xip.io/) you can just use `[yourAzurePublicIP].xip.io` for free. For example, if your public IP is `44.44.44.44` then you would set it to `44.44.44.44.xip.io`.
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
# Debian Package Installation Notes
|
||||
|
||||
As of 0.3.18, Dokku defaults to being installed via debian package. While certain hosts may require extra work to get running, you may optionally wish to automate the installation of Dokku without the use of our `bootstrap.sh` bash script. The following are the steps run by said script:
|
||||
As of 0.3.18, Dokku defaults to being installed via Debian package. While certain hosts may require extra work to get running, you may optionally wish to automate the installation of Dokku without the use of our `bootstrap.sh` Bash script. The following are the steps run by said script:
|
||||
|
||||
```shell
|
||||
# install prerequisites
|
||||
sudo apt-get update -qq > /dev/null
|
||||
sudo apt-get update -qq >/dev/null
|
||||
sudo apt-get install -qq -y apt-transport-https
|
||||
|
||||
# install docker
|
||||
wget -nv -O - https://get.docker.com/ | sh
|
||||
|
||||
# install dokku
|
||||
wget -nv -O - https://packagecloud.io/gpg.key | apt-key add -
|
||||
echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ trusty main" | sudo tee /etc/apt/sources.list.d/dokku.list
|
||||
sudo apt-get update -qq > /dev/null
|
||||
wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
|
||||
OS_ID="$(lsb_release -cs 2>/dev/null || echo "trusty")"
|
||||
echo "trusty utopic vivid wily xenial yakkety zesty artful bionic" | grep -q "$OS_ID" || OS_ID="trusty"
|
||||
echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ ${OS_ID} main" | sudo tee /etc/apt/sources.list.d/dokku.list
|
||||
sudo apt-get update -qq >/dev/null
|
||||
sudo apt-get install -qq -y dokku
|
||||
sudo dokku plugin:install-dependencies --core
|
||||
```
|
||||
|
||||
## Unattended installation
|
||||
|
||||
In case you want to perform an unattended installation of dokku, this is made possible through [debconf](https://en.wikipedia.org/wiki/Debconf_%28software_package%29), which allows you to configure a package before installing it.
|
||||
In case you want to perform an unattended installation of Dokku, this is made possible through [debconf](https://en.wikipedia.org/wiki/Debconf_%28software_package%29), which allows you to configure a package before installing it.
|
||||
|
||||
You can set any of the below options through the `debconf-set-selections` command, for example to enable vhost-based deployments:
|
||||
|
||||
@@ -35,7 +37,8 @@ After setting the desired options, proceed with the installation as described ab
|
||||
| Name | Type | Default | Description |
|
||||
| ------------------ | ------- | --------------------- | ------------------------------------------------------------------------ |
|
||||
| dokku/web_config | boolean | true | Use web-based config for below options |
|
||||
| dokku/vhost_enable | boolean | false | Use vhost-based deployments (e.g. <app>.dokku.me) |
|
||||
| dokku/vhost_enable | boolean | false | Use vhost-based deployments (e.g. `[yourapp].dokku.me`) |
|
||||
| dokku/hostname | string | dokku.me | Hostname, used as vhost domain and for showing app URL after deploy |
|
||||
| dokku/skip_key_file| boolean | false | Don't check for the existence of the dokku/key_file. Warning: This setting this to true, will require you to manually add an SSH key later on. |
|
||||
| dokku/skip_key_file| boolean | false | Don't check for the existence of the dokku/key_file. Warning: Setting this to true, will require you to manually add an SSH key later on. |
|
||||
| dokku/key_file | string | /root/.ssh/id_rsa.pub | Path on disk to an SSH key to add to the Dokku user (Will be ignored on `dpkg-reconfigure`) |
|
||||
| dokku/nginx_enable | boolean | true | Enable nginx-vhosts plugin |
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
# Digital Ocean
|
||||
# DigitalOcean Droplet
|
||||
|
||||
On Digital Ocean, there is a pre-made image that can be run for Dokku. You can choose to run this image on any sized droplet, though larger droplets will allow you to run larger applications.
|
||||
[DigitalOcean](https://www.digitalocean.com/products/compute/) offers a pre-installed Dokku image. You can run this image on any sized Droplet, although larger Droplets will allow you to run larger applications.
|
||||
|
||||
When choosing your Droplet configuration, please disable IPv6 on the droplet. There are known issues with IPv6 on Digital Ocean and Docker, and many have been reported to the Dokku issue tracker.
|
||||
> **Please disable IPv6**. There are known issues with IPv6 on DigitalOcean and Docker. If you would like to run Dokku on an IPv6 DigitalOcean Droplet, please consult [this guide](https://jeffloughridge.wordpress.com/2015/01/17/native-ipv6-functionality-in-docker/).
|
||||
|
||||
If you would like to run Dokku on an IPv6 Digital Ocean Droplet, please consult [this guide](https://jeffloughridge.wordpress.com/2015/01/17/native-ipv6-functionality-in-docker/) for modifying Docker to run under the Digital Ocean IPv6 configuration.
|
||||
|
||||
Once Dokku is installed, you can then proceed to the ip address or domain name associated with your server to complete the web-based installation.
|
||||
|
||||
If you wish for a more unattended installation method, see [these](http://dokku.viewdocs.io/dokku/getting-started/install/debian/#unattended-installation) docs.
|
||||
1. Login to your [DigitalOcean](https://m.do.co/c/fe06b043a083) account.
|
||||
2. Click **Create a Droplet**.
|
||||
3. Under **Choose an image > One-click apps**, choose the latest **Dokku** release for 16.04 _(version numbers may vary)_.
|
||||
4. Under **Choose a size**, select your machine spec.
|
||||
5. Under **Choose a datacenter region**, select your region.
|
||||
6. Add an SSH Key.
|
||||
* New Keys
|
||||
1. Under **Add your SSH keys** click **New SSH Key** _(this opens a dialog)_.
|
||||
2. From your terminal, execute `cat $HOME/.ssh/id_rsa.pub`.
|
||||
3. Copy the output and paste it into the **New SSH Key** dialog, provide a name and click **Add SSH Key**.
|
||||
* Existing Keys
|
||||
1. Simply add a checkmark next to the existing keys you'd like to add.
|
||||
7. Under **Finalize and create**, give your Droplet a hostname _(not required)_ and click **Create**.
|
||||
8. Once created, copy the IP address to your clipboard.
|
||||
9. In a browser, go to the IP address you copied above and fill out the presented form to complete configuration. _Failure to do so may allow others to reconfigure SSH access on your server._
|
||||
10. Once the web UI has been submitted, you will be redirected to our [application deployment tutorial](/docs/deployment/application-deployment.md), which will guide you through deploying a sample application to your Dokku server.
|
||||
|
||||
@@ -5,9 +5,9 @@ Dreamhost (or any other OpenStack-compatible cloud with minimal
|
||||
changes).
|
||||
|
||||
A new server instance can be created on DreamHost Cloud from the command line
|
||||
using openstack client or from the web UI and with the same command
|
||||
use a cloud-init script to install Dokku. Install the [openstack
|
||||
cli](https://help.dreamhost.com/hc/en-us/articles/216185658-How-to-Install-the-OpenStack-command-line-clients),
|
||||
using OpenStack client or from the web UI and with the same command
|
||||
use a cloud-init script to install Dokku. Install the [OpenStack
|
||||
CLI](https://help.dreamhost.com/hc/en-us/articles/216185658-How-to-Install-the-OpenStack-command-line-clients),
|
||||
download the [DreamHost Cloud credentials
|
||||
file](https://iad2.dreamcompute.com/project/access_and_security/api_access/openrc/)
|
||||
before proceeding and make sure your public SSH key is added to the
|
||||
@@ -17,10 +17,10 @@ cloud.
|
||||
source openrc.sh # Set the environment variables for DreamHost Cloud
|
||||
```
|
||||
|
||||
This allows openstack client to connect to DreamHost API endpoints.
|
||||
This allows OpenStack client to connect to DreamHost API endpoints.
|
||||
The command below creates a new server instance named `my-dokku-instance`
|
||||
based on Ubuntu 14.04, with 2GB RAM and 1CPU (the flavor called
|
||||
`supersonic`), opening network port access to http and ssh (the
|
||||
based on Ubuntu 14.04, with 2 GB RAM and 1 CPU (the flavor called
|
||||
`supersonic`), opening network port access to HTTP and SSH (the
|
||||
`default` security group), and the name of the chosen SSH key. This
|
||||
key will be automatically added to the new server in the
|
||||
`authorized_keys` for the default SSH user (`ubuntu`), and it will
|
||||
@@ -185,13 +185,11 @@ packages:
|
||||
```
|
||||
|
||||
Shortly after running the create command you will get a confirmation that the
|
||||
instance has been created, and after about a minute it should be ready to login.
|
||||
Check the IP of the instance through the web UI or by running:
|
||||
instance has been created, and after about a minute it should be ready to login. Check the IP of the instance through the web UI or by running:
|
||||
|
||||
```sh
|
||||
nova list
|
||||
```
|
||||
|
||||
SSH with the `ubuntu` username and the public key previously added.
|
||||
Keep in mind that if you logged in quick enough dokku might still be installing
|
||||
in the background, and not be ready. The installation takes a few minutes.
|
||||
Keep in mind that if you logged in quick enough Dokku might still be installing in the background, and not be ready. The installation takes a few minutes.
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
# Installing on Linode
|
||||
|
||||
## Enable AUFS Storage Driver
|
||||
|
||||
When installing Dokku on a newly-created Linode server, you'll likely see an error during Docker installation:
|
||||
|
||||
> Warning: current kernel is not supported by the linux-image-extra-virtual package. We have no AUFS support. Consider installing the packages linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.
|
||||
|
||||
After 10 seconds, the installation will continue as normal.
|
||||
|
||||
This warning is the result of Linode using its own kernel, which does not support AUFS, instead of using the kernel supplied by Debian/Ubuntu. If you ignore the warning, Docker will fall back to using the DeviceMapper storage backend and Dokku will work normally. However, AUFS is better tested and will perform better.
|
||||
|
||||
To avoid this error message and use AUFS, follow the steps below to select the GRUB 2 kernel.
|
||||
|
||||
|
||||
### Select the GRUB 2 kernel instead of the default Linode kernel:
|
||||
|
||||
1. Login to your [Linode Manager](http://manager.linode.com), open the `Dashboard` associated with your new server.
|
||||
2. Click `Edit` for the `Configuration Profile`. You should now be on the `Edit Configuration Profile` page.
|
||||
3. Scroll down to `Boot Settings` > `Kernel menu`. Change the "Kernel" option to "GRUB 2" and save your changes.
|
||||
4. If you have already pushed the `Boot` button and your server is running, you will need to reboot it before continuing. Otherwise, you can now push the `Boot` button to start your server and proceed with the normal Dokku installation.
|
||||
|
||||
Once your server comes back online, you'll be running Ubuntu's default kernel. You can now follow Dokku's [normal installation instructions](/dokku/getting-started/installation/) and `bootstrap.sh` will take care of everything else.
|
||||
|
||||
|
||||
### Verify that you are using AUFS:
|
||||
|
||||
Once you have fully installed Dokku and rebooted your server, you can verify that AUFS is being used with the terminal command: `docker info`. If AUFS is being used, you should see `Storage Driver: aufs` in the output.
|
||||
@@ -2,21 +2,26 @@
|
||||
|
||||
> New as of 0.8.0 *(experimental)*
|
||||
|
||||
>**Warning:** Web installer is not available on CentOS. You will need to configure [SSH keys](/dokku/deployment/user-management/#adding-ssh-keys) and [virtual hosts](/dokku/configuration/domains/#customizing-hostnames) using dokku command line interface.
|
||||
>**Warning:** Web installer is not available on CentOS. You will need to configure [SSH keys](/docs/deployment/user-management.md#adding-ssh-keys) and [virtual hosts](/docs/configuration/domains.md#customizing-hostnames) using dokku command line interface.
|
||||
|
||||
Dokku defaults to being installed via RPM package on CentOS 7. While certain hosts may require extra work to get running, you may optionally wish to automate the installation of Dokku without the use of our `bootstrap.sh` bash script. The following are the steps run by said script:
|
||||
Dokku defaults to being installed via RPM package on CentOS 7. While certain hosts may require extra work to get running, you may optionally wish to automate the installation of Dokku without the use of our `bootstrap.sh` Bash script. The following are the steps run by said script:
|
||||
|
||||
```shell
|
||||
# install docker
|
||||
# Install docker
|
||||
curl -fsSL https://get.docker.com/ | sh
|
||||
|
||||
# install epel for nginx packages to be available
|
||||
# Install epel for nginx packages to be available
|
||||
sudo yum install -y epel-release
|
||||
|
||||
# install dokku
|
||||
# Install dokku
|
||||
curl -s https://packagecloud.io/install/repositories/dokku/dokku/script.rpm.sh | sudo bash
|
||||
sudo yum install -y herokuish dokku
|
||||
sudo dokku plugin:install-dependencies --core
|
||||
systemctl start nginx
|
||||
|
||||
# Enable docker and nginx on system startup
|
||||
systemctl enable docker
|
||||
systemctl enable nginx
|
||||
```
|
||||
|
||||
The [devicemapper](https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/) is the default Docker storage driver on CentOS 7 and defaults to a configuration mode known as `loop-lvm`. This mode is designed to work out-of-the-box with no additional configuration. However, production deployments should not run under `loop-lvm` mode. The preferred configuration for production deployments is [`direct-lvm`](https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#/configure-direct-lvm-mode-for-production).
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
# Install Dokku using Vagrant
|
||||
|
||||
- Download and install [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
|
||||
- Download and install [Vagrant](http://www.vagrantup.com/downloads.html)
|
||||
- Clone Dokku
|
||||
1. Download and install [VirtualBox](https://www.virtualbox.org/wiki/Downloads).
|
||||
|
||||
2. Download and install [Vagrant](http://www.vagrantup.com/downloads.html).
|
||||
|
||||
3. Clone Dokku.
|
||||
|
||||
```shell
|
||||
git clone https://github.com/dokku/dokku.git
|
||||
```
|
||||
|
||||
- Create VM
|
||||
4. Create VM.
|
||||
|
||||
```shell
|
||||
# Optional ENV arguments:
|
||||
@@ -19,20 +21,25 @@
|
||||
# - `DOKKU_IP`
|
||||
# - `FORWARDED_PORT`.
|
||||
cd path/to/dokku
|
||||
|
||||
# for most users
|
||||
vagrant up
|
||||
|
||||
# windows users must instead use the following in an elevated command prompt
|
||||
vagrant up dokku-windows
|
||||
```
|
||||
- Setup SSH Config in `~/.ssh/config`.
|
||||
|
||||
5. Setup SSH Config in `~/.ssh/config`.
|
||||
|
||||
```ini
|
||||
Host dokku.me
|
||||
Port 22
|
||||
```
|
||||
|
||||
> For users that have customized the IP address of their VM - either in a custom `Vagrantfile` or via the `DOKKU_IP` environment variable - and are not using `10.0.0.2` for the Vagrant IP, you'll need to instead use the output of `vagrant ssh-config dokku` for your ~/.ssh/config entry.
|
||||
> For users that have customized the IP address of their VM - either in a custom `Vagrantfile` or via the `DOKKU_IP` environment variable - and are not using `10.0.0.2` for the Vagrant IP, you'll need to instead use the output of `vagrant ssh-config dokku` for your `~/.ssh/config` entry.
|
||||
|
||||
- Copy your SSH key via `cat ~/.ssh/id_rsa.pub | pbcopy` and paste it into the dokku-installer at http://dokku.me . Change the `Hostname` field on the Dokku Setup screen to your domain and then check the box that says `Use virtualhost naming`. Then click *Finish Setup* to install your key. You'll be directed to application deployment instructions from here.
|
||||
6. Copy your SSH key via `cat ~/.ssh/id_rsa.pub | pbcopy` and paste it into the dokku-installer at http://dokku.me . Change the `Hostname` field on the Dokku Setup screen to your domain and then check the box that says **Use virtualhost naming**. Then click **Finish Setup** to install your key. You'll be directed to application deployment instructions from here.
|
||||
|
||||
Please note, the `dokku.me` domain is setup to point to `10.0.0.2` along with all subdomains (ie yourapp.dokku.me). If you change the `DOKKU_IP` in your vagrant setup you'll need to update your `/etc/hosts` file to point your reconfigured ip address.
|
||||
Please note, the `dokku.me` domain is setup to point to `10.0.0.2` along with all subdomains (i.e. `yourapp.dokku.me`). If you change the `DOKKU_IP` in your Vagrant setup you'll need to update your `/etc/hosts` file to point your reconfigured IP address.
|
||||
|
||||
You are now ready to deploy an app or install plugins.
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ Dokku is an extensible, open source Platform as a Service that runs on a single
|
||||
|
||||
To start using Dokku, you'll need a system that meets the following minimum requirements:
|
||||
|
||||
- A fresh installation of [Ubuntu 16.04 x64](https://www.ubuntu.com/download), [Ubuntu 14.04 x64](https://www.ubuntu.com/download), [Debian 8.2 x64](https://www.debian.org/distrib/) or [CentOS 7 x64](https://www.centos.org/download/) *(experimental)* with the FQDN set <sup>[1]</sup>
|
||||
- At least `1GB` of system memory <sup>[2]</sup>
|
||||
- A fresh installation of [Ubuntu x64 - Any currently supported release](https://www.ubuntu.com/download), [Debian 8.2 x64](https://www.debian.org/distrib/) or [CentOS 7 x64](https://www.centos.org/download/) *(experimental)* with the FQDN set <sup>[1]</sup>
|
||||
- At least 1 GB of system memory <sup>[2]</sup>
|
||||
|
||||
You can *optionally* have a domain name pointed at the host's IP, though this is not necessary.
|
||||
|
||||
@@ -15,46 +15,51 @@ Dokku is designed for usage on a fresh VM installation, and should install all n
|
||||
|
||||
### Installing the latest stable version
|
||||
|
||||
#### 1. Install dokku
|
||||
#### 1. Install Dokku
|
||||
|
||||
To install the latest stable version of dokku, you can run the following shell commands:
|
||||
To install the latest stable version of Dokku, you can run the following shell commands:
|
||||
|
||||
```shell
|
||||
# for debian systems, installs Dokku via apt-get
|
||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.8.2/bootstrap.sh;
|
||||
sudo DOKKU_TAG=v0.8.2 bash bootstrap.sh
|
||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.17.6/bootstrap.sh;
|
||||
sudo DOKKU_TAG=v0.17.6 bash bootstrap.sh
|
||||
```
|
||||
|
||||
The installation process takes about 5-10 minutes, depending upon internet connection speed.
|
||||
|
||||
If you're using Debian 8 or Ubuntu 14.04, make sure your package manager is configured to install a sufficiently recent version of nginx<sup>[3]</sup>, otherwise, the installation may fail due to `unmet dependencies` relating nginx.
|
||||
|
||||
#### 2. Setup SSH key and Virtualhost Settings
|
||||
|
||||
Once the installation is complete, you can open a browser to setup your SSH key and virtualhost settings. Open your browser of choice and navigate to the host's IP address - or the domain you assigned to that IP previously - and configure Dokku via the web admin.
|
||||
|
||||
>**Warning:** If you don't complete setup via the web installer (even if you set up SSH keys and virtual hosts otherwise) your Dokku installation will remain vulnerable to anyone finding the setup page and inserting their key.
|
||||
Alternatively, instructions to skip the web installer with an unattended installation are available in the [advanced install guide](/docs/getting-started/advanced-installation/#configuring).
|
||||
|
||||
>**Warning:** Web installer is not available on CentOS and Arch Linux. You will need to configure [SSH keys](/dokku/deployment/user-management/#adding-ssh-keys) and [virtual hosts](/dokku/configuration/domains/#customizing-hostnames) using dokku command line interface.
|
||||
> **Warning:** If you don't complete setup via the web installer (even if you set up SSH keys and virtual hosts otherwise) your Dokku installation will remain vulnerable to anyone finding the setup page and inserting their key. You can check if it is still running via `ps auxf | grep dokku-installer`, and it may be stopped via your server's init system - usually either `service dokku-installer stop` or `stop dokku-installer`.
|
||||
|
||||
> **Warning:** Web installer is not available on CentOS and Arch Linux. You will need to configure [SSH keys](/docs/deployment/user-management.md#adding-ssh-keys) and [virtual hosts](/docs/configuration/domains.md#customizing-hostnames) using dokku command line interface - see unattended installation linked above.
|
||||
|
||||
#### 3. Deploy your first application
|
||||
Once you save your settings, the web admin will self-terminate and you should be able to run or deploy to the Dokku installation.
|
||||
|
||||
Once you save your settings, the web admin will self-terminate and you should be able to run or [deploy to the Dokku installation](/docs/deployment/application-deployment.md).
|
||||
|
||||
### Installing via other methods
|
||||
|
||||
For various reasons, certain hosting providers may have other steps that should be preferred to the above. If hosted on any of the following popular hosts, please follow the linked to instructions:
|
||||
|
||||
- [Digital Ocean Installation Notes](/dokku/getting-started/install/digitalocean)
|
||||
- [DreamHost Cloud Installation Notes](/dokku/getting-started/install/dreamhost/)
|
||||
- [Linode Installation Notes](/dokku/getting-started/install/linode/)
|
||||
- [Microsoft Azure Installation Notes](/dokku/getting-started/install/azure/)
|
||||
- [DigitalOcean Installation Notes](/docs/getting-started/install/digitalocean.md)
|
||||
- [DreamHost Cloud Installation Notes](/docs/getting-started/install/dreamhost.md)
|
||||
- [Microsoft Azure Installation Notes](/docs/getting-started/install/azure.md)
|
||||
|
||||
As well, you may wish to customize your installation in some other fashion. or experiment with vagrant. The guides below should get you started:
|
||||
As well, you may wish to customize your installation in some other fashion. or experiment with Vagrant. The guides below should get you started:
|
||||
|
||||
- [Debian Package Installation Notes](/dokku/getting-started/install/debian/)
|
||||
- [RPM Package Installation Notes](/dokku/getting-started/install/rpm/)
|
||||
- [Vagrant Installation Notes](/dokku/getting-started/install/vagrant/)
|
||||
- [Advanced Install Customization](/dokku/getting-started/advanced-installation/)
|
||||
- [Debian Package Installation Notes](/docs/getting-started/install/debian.md)
|
||||
- [RPM Package Installation Notes](/docs/getting-started/install/rpm.md)
|
||||
- [Vagrant Installation Notes](/docs/getting-started/install/vagrant.md)
|
||||
- [Advanced Install Customization](/docs/getting-started/advanced-installation.md)
|
||||
|
||||
---
|
||||
|
||||
- <sup>[1]: To check whether your system has an fqdn set, run `sudo hostname -f`</sup>
|
||||
- <sup>[2]: If your system has less than 1GB of memory, you can use [this workaround](/dokku/getting-started/advanced-installation/#vms-with-less-than-1gb-of-memory).</sup>
|
||||
- <sup>[2]: If your system has less than 1GB of memory, you can use [this workaround](/docs/getting-started/advanced-installation.md#vms-with-less-than-1gb-of-memory).</sup>
|
||||
- <sup>[3]: nginx >= 1.8.0 can be installed via the [nginx repositories](https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/), or by adding [this PPA](https://launchpad.net/~nginx/+archive/ubuntu/stable) if you're using Ubuntu. nginx >= 1.11.5 is necessary for HTTP/2 support</sup>
|
||||
|
||||
@@ -1,6 +1,39 @@
|
||||
# Troubleshooting
|
||||
|
||||
__Symptom:__ I deployed my app but I am getting the default nginx page
|
||||
> New as of 0.17.0
|
||||
|
||||
```
|
||||
trace:on # Enables trace mode
|
||||
trace:off # Disables trace mode
|
||||
```
|
||||
|
||||
## Trace Mode
|
||||
|
||||
By default, Dokku will constrain the amount of output displayed for any given command run. The verbosity of output can be increased by enabling trace mode. Trace mode will turn on the `set -x` flag for bash plugins, while other plugins are free to respect the environment variable `DOKKU_TRACE` and log differently as approprate. Trace mode can be useful to see _where_ plugins are running commands that would otherwise be unexpected.
|
||||
|
||||
To enable trace mode, run `trace:on`
|
||||
|
||||
```shell
|
||||
dokku trace:on
|
||||
```
|
||||
|
||||
```
|
||||
-----> Enabling trace mode
|
||||
```
|
||||
|
||||
Trace mode can be disabled with `trace:off`
|
||||
|
||||
```shell
|
||||
dokku trace:off
|
||||
```
|
||||
|
||||
```
|
||||
-----> Disabling trace mode
|
||||
```
|
||||
|
||||
## Common Problems
|
||||
|
||||
__Symptom:__ I deployed my app but I am getting the default nginx page.
|
||||
|
||||
__Solution:__
|
||||
|
||||
@@ -11,7 +44,7 @@ nginx -t
|
||||
## nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
|
||||
```
|
||||
|
||||
If you get a similar error just edit __/etc/nginx/nginx.conf__ and add the following line to your http section:
|
||||
If you get a similar error just edit `/etc/nginx/nginx.conf` and add the following line to your `http` section:
|
||||
|
||||
```nginx
|
||||
http {
|
||||
@@ -35,45 +68,30 @@ Save the file and try stopping nginx and starting it again:
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ I want to deploy my app, but while pushing I get the following error
|
||||
__Symptom:__ I want to deploy my app, but while pushing I get the following error.
|
||||
|
||||
! [remote rejected] master -> master (pre-receive hook declined)
|
||||
|
||||
__Solution:__
|
||||
|
||||
The `remote rejected` error does not give enough information. Anything could have failed.
|
||||
|
||||
To enable Dokku tracing, simply run the following command:
|
||||
|
||||
```shell
|
||||
# since 0.3.9
|
||||
dokku trace on
|
||||
```
|
||||
|
||||
In versions older than 0.3.9, you can create a `/home/dokku/dokkurc` file containing the following :
|
||||
|
||||
```shell
|
||||
export DOKKU_TRACE=1
|
||||
```
|
||||
|
||||
This will trace all of dokku's activity. If this does not help you, create a [gist](https://gist.github.com) containing the full log, and create an issue.
|
||||
The `remote rejected` error does not give enough information. Anything could have failed. Enable trace mode and begin debugging. If this does not help you, create a [gist](https://gist.github.com) containing the full log, and create an issue.
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ I get the aforementioned error in the build phase (after turning on Dokku tracing)
|
||||
__Symptom:__ I get the aforementioned error in the build phase (after turning on Dokku tracing).
|
||||
|
||||
Most errors that happen in this phase are due to transient network issues (either locally or remotely) buildpack bugs.
|
||||
Most errors that happen in this phase are due to transient network issues (either locally or remotely) buildpack bugs.
|
||||
|
||||
__Solution (Less solution, more helpful troubleshooting steps):__
|
||||
|
||||
Find the failed phase's container image (*077581956a92* in this example)
|
||||
Find the failed phase's container image (`077581956a92` in this example).
|
||||
|
||||
```shell
|
||||
docker ps -a | grep build
|
||||
## 94d9515e6d93 077581956a92 "/build" 29 minutes ago Exited (0) 25 minutes ago cocky_bell
|
||||
```
|
||||
|
||||
Start a new container with the failed image and poke around (i.e. ensure you can access the internet from within the container or attempt the failed command, if known)
|
||||
Start a new container with the failed image and poke around (i.e. ensure you can access the internet from within the container or attempt the failed command, if known).
|
||||
|
||||
```shell
|
||||
docker run -ti 077581956a92 /bin/bash
|
||||
@@ -84,38 +102,37 @@ tar tzf node-v0.10.30-linux-x64.tar.gz
|
||||
## ...
|
||||
```
|
||||
|
||||
Sometimes (especially on DO) deploying again seems to get past these seemingly transient issues
|
||||
Additionally we've seen issues if changing networks that have different DNS resolvers. In this case, you can run the following to update your resolv.conf
|
||||
Sometimes (especially on DigitalOcean) deploying again seems to get past these seemingly transient issues. Additionally we've seen issues if changing networks that have different DNS resolvers. In this case, you can run the following to update your `resolv.conf`.
|
||||
|
||||
```shell
|
||||
resolvconf -u
|
||||
```
|
||||
|
||||
Please see https://github.com/dokku/dokku/issues/841 and https://github.com/dokku/dokku/issues/649
|
||||
Please see https://github.com/dokku/dokku/issues/841 and https://github.com/dokku/dokku/issues/649.
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ I want to deploy my app but I am getting asked for the password of the git user and the error message
|
||||
__Symptom:__ I want to deploy my app but I am getting asked for the password of the Git user and the error message.
|
||||
|
||||
fatal: 'NAME' does not appear to be a git repository
|
||||
fatal: Could not read from remote repository.
|
||||
|
||||
__Solution:__
|
||||
|
||||
You get asked for a password because your ssh secret key can't be found. This may happen if the private key corresponding to the public key you added with `sshcommand acl-add` is not located in the default location `~/.ssh/id_rsa`.
|
||||
You get asked for a password because your SSH secret key can't be found. This may happen if the private key corresponding to the public key you added with `sshcommand acl-add` is not located in the default location `~/.ssh/id_rsa`.
|
||||
|
||||
You have to point ssh to the correct secret key for your domain name. Add the following to your `~/.ssh/config`:
|
||||
You have to point SSH to the correct secret key for your domain name. Add the following to your `~/.ssh/config`:
|
||||
|
||||
```ini
|
||||
Host DOKKU_HOSTNAME
|
||||
IdentityFile "~/.ssh/KEYNAME"
|
||||
```
|
||||
|
||||
Also see [issue #116](https://github.com/dokku/dokku/issues/116)
|
||||
Also see [issue #116](https://github.com/dokku/dokku/issues/116).
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ I successfully deployed my application with no deployment errors and receiving Bad Gateway when attempting to access the application
|
||||
__Symptom:__ I successfully deployed my application with no deployment errors and receiving **Bad Gateway** when attempting to access the application.
|
||||
|
||||
__Solution:__
|
||||
|
||||
@@ -127,11 +144,11 @@ When specifying your port you may want to use something similar to:
|
||||
var port = process.env.PORT || 3000
|
||||
```
|
||||
|
||||
Please see https://github.com/dokku/dokku/issues/282
|
||||
Please see https://github.com/dokku/dokku/issues/282.
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ Deployment fails because of slow internet connection, messages shows `gzip: stdin: unexpected end of file`
|
||||
__Symptom:__ Deployment fails because of slow internet connection, messages shows `gzip: stdin: unexpected end of file`.
|
||||
|
||||
__Solution:__
|
||||
|
||||
@@ -146,16 +163,16 @@ If you see output similar this when deploying:
|
||||
! tar: Error is not recoverable: exiting now
|
||||
```
|
||||
|
||||
it might that the curl command that is supposed to fetch the buildpack (anything in the low megabyte file size range) takes too long to finish, due to slowish connection. To overwrite the default values (connection timeout: 3 seconds, total maximum time for operation: 30 seconds), set the following environment variables:
|
||||
it might that the cURL command that is supposed to fetch the buildpack (anything in the low megabyte file size range) takes too long to finish, due to slowish connection. To overwrite the default values (connection timeout: 90 seconds, total maximum time for operation: 600 seconds), set the following environment variables:
|
||||
|
||||
```shell
|
||||
dokku config:set --global CURL_TIMEOUT=600
|
||||
dokku config:set --global CURL_CONNECT_TIMEOUT=30
|
||||
dokku config:set --global CURL_TIMEOUT=1200
|
||||
dokku config:set --global CURL_CONNECT_TIMEOUT=180
|
||||
```
|
||||
|
||||
Please see https://github.com/dokku/dokku/issues/509
|
||||
Please see https://github.com/dokku/dokku/issues/509.
|
||||
|
||||
Another reason for this error (although it may respond immediately ruling out a timeout issue) may be because you've set the config setting `SSL_CERT_FILE`. Using a config setting with this key interferes with the buildpack's ability to download it's dependencies, so you must rename the config setting to something else, e.g. `MY_APP_SSL_CERT_FILE`.
|
||||
Another reason for this error (although it may respond immediately ruling out a timeout issue) may be because you've set the config setting `SSL_CERT_FILE`. Using a config setting with this key interferes with the buildpack's ability to download its dependencies, so you must rename the config setting to something else, e.g. `MY_APP_SSL_CERT_FILE`.
|
||||
|
||||
***
|
||||
|
||||
@@ -163,7 +180,7 @@ __Symptom:__ Build fails with `Killed` message.
|
||||
|
||||
__Solution:__
|
||||
|
||||
This generally occurs when the server runs out of memory. You can either add more ram to your server or setup swap space. The follow script will create 2gb of swap space.
|
||||
This generally occurs when the server runs out of memory. You can either add more RAM to your server or setup swap space. The follow script will create 2 GB of swap space.
|
||||
|
||||
```shell
|
||||
sudo install -o root -g root -m 0600 /dev/null /swapfile
|
||||
@@ -181,13 +198,13 @@ __Symptom:__ I successfully deployed my application with no deployment errors bu
|
||||
|
||||
__Solution:__
|
||||
|
||||
This can occur if Dokku is running on a system with a firewall like ufw enabled (some OS versions like Ubuntu 16.04 have this enabled by default). You can check if this is your case by running the following script:
|
||||
This can occur if Dokku is running on a system with a firewall like UFW enabled (some OS versions like Ubuntu 16.04 have this enabled by default). You can check if this is your case by running the following script:
|
||||
|
||||
```shell
|
||||
sudo ufw status
|
||||
```
|
||||
|
||||
If the previous script returned `Status: active` and a list of ports, ufw is enabled and is probably the cause of the symptom described above. To disable it, run:
|
||||
If the previous script returned `Status: active` and a list of ports, UFW is enabled and is probably the cause of the symptom described above. To disable it, run:
|
||||
|
||||
```shell
|
||||
sudo ufw disable
|
||||
@@ -195,3 +212,12 @@ sudo ufw disable
|
||||
|
||||
***
|
||||
|
||||
__Symptom:__ I can't connect to my application because the server is sending an invalid response, or can't provide a secure connection.
|
||||
|
||||
__Solution:__
|
||||
|
||||
This isn't usually an issue with Dokku, but rather an app config problem. This can happen when your application is configured to enforce secure connections/HSTS, but you don't have SSL set up for the app.
|
||||
|
||||
In Rails at least, if your `application.rb` or `environmnents/production.rb` include the line `configure.force_ssl = true` which includes HSTS, try commenting that out and redeploying.
|
||||
|
||||
If this solves the issue temporarily, longer term you should consider [configuring SSL](http://dokku.viewdocs.io/dokku/configuration/ssl/).
|
||||
|
||||
54
docs/getting-started/uninstalling.md
Normal file
54
docs/getting-started/uninstalling.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Uninstalling
|
||||
|
||||
While we hate to see you go, if you need to uninstall Dokku, the following may help you out:
|
||||
|
||||
## Arch Installation
|
||||
|
||||
```shell
|
||||
# purge dokku from your system
|
||||
yaourt -Rsn dokku
|
||||
```
|
||||
|
||||
## CentOS Installation
|
||||
|
||||
```shell
|
||||
# uninstall dokku
|
||||
yum remove dokku herokuish
|
||||
```
|
||||
|
||||
## Debian Installation
|
||||
|
||||
```shell
|
||||
# purge dokku from your system
|
||||
apt-get purge -y --force-yes dokku herokuish
|
||||
|
||||
# remove any dependencies that are no longer necessary
|
||||
apt-get -y --force-yes autoremove
|
||||
```
|
||||
|
||||
## Makefile Installation
|
||||
|
||||
This is a manual deletion process, and as it is not a recommended installation method, there is currently no automated uninstallation.
|
||||
|
||||
All service plugins should be unlinked from applications, stopped, and destroyed.
|
||||
|
||||
All applications should be stopped, and all docker containers and images deleted:
|
||||
|
||||
```shell
|
||||
# stop all applications
|
||||
dokku ps:stopall
|
||||
|
||||
# cleanup containers and images
|
||||
dokku cleanup
|
||||
```
|
||||
|
||||
The following user/group must be deleted:
|
||||
|
||||
- user: `dokku`
|
||||
- group: `dokku`
|
||||
|
||||
The following directories must be deleted:
|
||||
|
||||
- `~dokku`
|
||||
- `/var/lib/dokku`
|
||||
- `/var/log/dokku`
|
||||
@@ -1,6 +1,27 @@
|
||||
# Upgrading
|
||||
|
||||
If your version of Dokku is pre 0.3.0 (check with `dokku version`), we recommend [a fresh install](/dokku/getting-started/installation/) on a new server.
|
||||
If your version of Dokku is pre 0.3.0 (check with `dokku version`), we recommend [a fresh install](/docs/getting-started/installation.md) on a new server.
|
||||
|
||||
## Security Updates
|
||||
|
||||
For any security related updates, please follow our [Twitter account](https://twitter.com/dokku). As Dokku does not run any daemons, the security risk introduced by our software is minimal.
|
||||
|
||||
Your operating system may occasionally provide security updates. We recommend setting unattended upgrades for your operating system. Here are some helpful links:
|
||||
|
||||
- [Arch Linux System Maintenance](https://wiki.archlinux.org/index.php/System_maintenance)
|
||||
- [Centos Automatic Security Updates](https://serversforhackers.com/c/automatic-security-updates-centos)
|
||||
- [Debian Unattended Upgrades](https://wiki.debian.org/UnattendedUpgrades)
|
||||
- [Ubuntu Unattended Upgrades](https://help.ubuntu.com/community/AutomaticSecurityUpdates)
|
||||
|
||||
Docker releases updates periodically to their engine. We recommend reading their release notes and upgrading accordingly. Please see the [Docker documentation](https://docs.docker.com/) for more details.
|
||||
|
||||
Finally, we provide a helpful binary called `dokku-update`. This is a recommended package that:
|
||||
|
||||
- Can be installed separately, so upgrading Dokku will not affect the running of this package.
|
||||
- Automates many of the upgrade instructions for you.
|
||||
- Provides a clean way for us to further enhance the upgrade process in the future.
|
||||
|
||||
When installing from source, this is available from `contrib/dokku-update`, and is also available on Debian and RPM-based systems from our package repositories under the name `dokku-update`.
|
||||
|
||||
## Migration Guides
|
||||
|
||||
@@ -8,25 +29,48 @@ Before upgrading, check the migration guides to get comfortable with new feature
|
||||
|
||||
### 0.5 Migration Guide
|
||||
|
||||
- [0.5 Migration Guide](/dokku/appendices/0.5.0-migration-guide/)
|
||||
- [0.5 Migration Guide](/docs/appendices/0.5.0-migration-guide.md)
|
||||
|
||||
### 0.6 Migration Guide
|
||||
|
||||
- [0.6 Migration Guide](/dokku/appendices/0.6.0-migration-guide/)
|
||||
- [0.6 Migration Guide](/docs/appendices/0.6.0-migration-guide.md)
|
||||
|
||||
### 0.7 Migration Guide
|
||||
|
||||
- [0.7 Migration Guide](/dokku/appendices/0.7.0-migration-guide/)
|
||||
- [0.7 Migration Guide](/docs/appendices/0.7.0-migration-guide.md)
|
||||
|
||||
### 0.8 Migration Guide
|
||||
|
||||
- [0.8 Migration Guide](/docs/appendices/0.8.0-migration-guide.md)
|
||||
|
||||
### 0.9 Migration Guide
|
||||
|
||||
- [0.9 Migration Guide](/docs/appendices/0.9.0-migration-guide.md)
|
||||
|
||||
### 0.10 Migration Guide
|
||||
|
||||
- [0.10 Migration Guide](/docs/appendices/0.10.0-migration-guide.md)
|
||||
|
||||
## Upgrade Instructions
|
||||
|
||||
If Dokku was installed via `apt-get install dokku` or `bootstrap.sh` (most common), upgrade with:
|
||||
|
||||
```shell
|
||||
# update your local apt cache
|
||||
sudo apt-get update
|
||||
dokku apps
|
||||
dokku ps:stop APP # repeat to shut down each running app
|
||||
|
||||
# stop each running app
|
||||
# for 0.11.4 and newer versions, use
|
||||
dokku ps:stopall
|
||||
# for versions between 0.8.1 and 0.11.3, use
|
||||
dokku --quiet apps:list | xargs -L1 dokku ps:stop
|
||||
# for versions versions older than 0.8.1, use
|
||||
dokku --quiet apps | xargs -L1 dokku ps:stop
|
||||
|
||||
# update dokku and its dependencies
|
||||
sudo apt-get install -qq -y dokku herokuish sshcommand plugn
|
||||
|
||||
# rebuild all of your applications
|
||||
dokku ps:rebuildall # rebuilds all applications
|
||||
```
|
||||
|
||||
@@ -37,7 +81,7 @@ dokku ps:rebuildall # rebuilds all applications
|
||||
> dokku ps:rebuild APP
|
||||
> ```
|
||||
>
|
||||
> Please see the [images documentation](/dokku/deployment/methods/images/) and [tar documentation](/dokku/deployment/methods/tar/)
|
||||
> Please see the [images documentation](/docs/deployment/methods/images.md) and [tar documentation](/docs/deployment/methods/tar.md)
|
||||
> for instructions on rebuilding applications deployed by those plugins.
|
||||
|
||||
### Upgrade From Source
|
||||
@@ -45,8 +89,7 @@ dokku ps:rebuildall # rebuilds all applications
|
||||
If you installed Dokku from source (less common), upgrade with:
|
||||
|
||||
```shell
|
||||
dokku apps
|
||||
dokku ps:stop APP # repeat to shut down each running app
|
||||
dokku --quiet apps | xargs -L1 dokku ps:stop # stops each running app
|
||||
cd ~/dokku
|
||||
git pull --tags origin master
|
||||
|
||||
@@ -58,7 +101,7 @@ sudo make install
|
||||
dokku ps:rebuildall # rebuilds all applications
|
||||
```
|
||||
|
||||
To upgrade herokuish from source, upgrade with:
|
||||
To upgrade Herokuish from source, upgrade with:
|
||||
|
||||
```shell
|
||||
cd /tmp
|
||||
|
||||
@@ -4,9 +4,9 @@ If you’re stuck, there are a number of places you can get help:
|
||||
|
||||
## The Official Dokku Website
|
||||
|
||||
- [http://dokku.viewdocs.io/dokku/](/dokku/)
|
||||
- [http://dokku.viewdocs.io/dokku/](/docs/)
|
||||
|
||||
The Official Dokku website is always a great place to visit. It features links to oft-used developer tools, community plugins, and guides on using dokku.
|
||||
The Official Dokku website is always a great place to visit. It features links to oft-used developer tools, community plugins, and guides on using Dokku.
|
||||
|
||||
## The IRC and Slack Channels
|
||||
|
||||
|
||||
177
docs/home.html
177
docs/home.html
@@ -10,32 +10,61 @@
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css">
|
||||
<title>Dokku - The smallest PaaS implementation you've ever seen</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/apple-touch-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
||||
<link rel="manifest" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/manifest.json">
|
||||
<link rel="shortcut icon" href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/favicon.ico">
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/apple-touch-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
||||
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/manifest.json">
|
||||
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Dokku">
|
||||
<meta name="application-name" content="Dokku">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-TileImage" content="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/mstile-144x144.png">
|
||||
<meta name="msapplication-config" content="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/favicons/browserconfig.xml">
|
||||
<meta name="msapplication-TileImage" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/mstile-144x144.png">
|
||||
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://cdn.rawgit.com/dokku/dokku/v0.8.2/docs/assets/style.css" rel="stylesheet">
|
||||
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.17.6/docs/assets/style.css" rel="stylesheet">
|
||||
<!-- <link href="/dokku/docs/assets/style.css" rel="stylesheet"> -->
|
||||
<style>
|
||||
.sponsors {
|
||||
background-color: #272822;
|
||||
color: #FCFCFC;
|
||||
}
|
||||
.sponsors a {
|
||||
color: #f0ad4e;
|
||||
}
|
||||
.sponsors .backer img,
|
||||
.sponsors .sponsor img {
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
border: 8px solid gray;
|
||||
margin: 20px auto 20px auto;
|
||||
max-width: 192px;
|
||||
}
|
||||
.sponsors .backer img {
|
||||
-webkit-border-radius: 50%;
|
||||
border-radius: 50%;
|
||||
border: 0;
|
||||
}
|
||||
.sponsors img:hover {
|
||||
-moz-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
-webkit-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
|
||||
box-shadow: 0px 0px 32px 0px rgba(0,0,0,0.75);
|
||||
}
|
||||
.sponsors .fund-link {
|
||||
display: block;
|
||||
font-size: .8em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -98,12 +127,12 @@
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">wget https://raw.githubusercontent.com/dokku/dokku/v0.8.2/bootstrap.sh</span>
|
||||
<span class="command">wget https://raw.githubusercontent.com/dokku/dokku/v0.17.6/bootstrap.sh</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">sudo DOKKU_TAG=v0.8.2 bash bootstrap.sh</span>
|
||||
<span class="command">sudo DOKKU_TAG=v0.17.6 bash bootstrap.sh</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="output"> # go to your server's IP and follow the web installer</span>
|
||||
@@ -125,7 +154,7 @@
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">wget -nv -O - https://packagecloud.io/gpg.key | apt-key add -</span>
|
||||
<span class="command">wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
@@ -135,7 +164,17 @@
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">echo "deb $SOURCE trusty main" | tee /etc/apt/sources.list.d/dokku.list</span>
|
||||
<span class="command">export OS_ID="$(lsb_release -cs 2>/dev/null || echo "trusty")"</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">echo "utopicvividwilyxenialyakketyzestyartfulbionic" | grep -q "$OS_ID" || OS_ID="trusty"</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
<span class="prompt">$</span>
|
||||
<span class="command">echo "deb $SOURCE $OS_ID main" | tee /etc/apt/sources.list.d/dokku.list</span>
|
||||
</p>
|
||||
<p class="line">
|
||||
<span class="path"></span>
|
||||
@@ -173,8 +212,8 @@
|
||||
</div>
|
||||
|
||||
<div class="alternate-instructions">
|
||||
<p>Hate <code>curl | bash</code>? See our official <a href="https://github.com/Azure/azure-quickstart-templates/tree/master/dokku-vm" target="_blank">Azure</a>, <a href="https://www.digitalocean.com/features/one-click-apps/dokku/" target="_blank">DigitalOcean</a>, <a href="/{{NAME}}~{{REF}}/getting-started/install/dreamhost/">DreamHost Cloud</a>, and <a href="/{{NAME}}~{{REF}}/getting-started/install/linode/" target="_blank">Linode</a> instructions.<p>
|
||||
<p>Still no love? <a href="https://github.com/dokku/dokku/blob/master/CONTRIBUTING.md" target="_blank">Contributions welcome</a>!</a>
|
||||
<p>Hate <code>curl | bash</code>? See our official <a href="https://github.com/Azure/azure-quickstart-templates/tree/master/dokku-vm" target="_blank">Azure</a>, <a href="https://www.digitalocean.com/features/one-click-apps/dokku/" target="_blank">DigitalOcean</a>, and <a href="/{{NAME}}~{{REF}}/getting-started/install/dreamhost/">DreamHost Cloud</a> instructions.</p>
|
||||
<p>Still no love? <a href="https://github.com/dokku/dokku/blob/master/CONTRIBUTING.md" target="_blank">Contributions welcome</a>!</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -226,64 +265,54 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid slack-channel team-members">
|
||||
<h3>Meet the core team</h3>
|
||||
<div class="container-fluid slack-channel sponsors">
|
||||
<h3>Sponsor Dokku</h3>
|
||||
|
||||
<div class="row">
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-2 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/progrium-hidden.jpg" alt="Jeff Lindsay">
|
||||
<img src="./assets/team/progrium.jpg" alt="Jeff Lindsay">
|
||||
</div>
|
||||
Jeff Lindsay
|
||||
<a class="fund-link" href="https://www.patreon.com/progrium">Sponsor people they sponsor</a>
|
||||
</div>
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-0 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/josegonzalez-hidden.jpg" alt="Morris Jobke">
|
||||
<img src="./assets/team/josegonzalez.jpg" alt="Morris Jobke">
|
||||
</div>
|
||||
Jose Diaz-Gonzalez
|
||||
<a class="fund-link" href="http://www.amazon.com/registry/wishlist/36RYHSXCFYDTG/">Buy him something nice</a>
|
||||
</div>
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-2 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/u2mejc-hidden.jpg" alt="Justin Clark">
|
||||
<img src="./assets/team/u2mejc.jpg" alt="Justin Clark">
|
||||
</div>
|
||||
Justin Clark
|
||||
<a class="fund-link" href="http://smile.amazon.com/registry/wishlist/3SCPXMNI2EIYV">Feed his dog greenie treats!</a>
|
||||
</div>
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-0 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/flink-hidden.jpg" alt="Loïc Guitaut">
|
||||
<img src="./assets/team/flink.jpg" alt="Loïc Guitaut">
|
||||
</div>
|
||||
Loïc Guitaut
|
||||
<a class="fund-link" href="https://www.amazon.com/gp/registry/wishlist/23NWY5AVAGGGO/">Build out his star wars collection</a>
|
||||
</div>
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-2 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/michaelshobbs-hidden.jpg" alt="Michael Hobbs">
|
||||
<img src="./assets/team/michaelshobbs.jpg" alt="Michael Hobbs">
|
||||
</div>
|
||||
Michael Hobbs
|
||||
<a class="fund-link" href="https://gratipay.com/~michaelshobbs/">Fund on gratipay</a>
|
||||
</div>
|
||||
<div class="team-member col-md-offset-0 col-md-4 col-sm-offset-0 col-sm-4 col-xs-offset-3 col-xs-6">
|
||||
<div class="team-member-image">
|
||||
<img src="./assets/team/morrisjobke-hidden.jpg" alt="Morris Jobke">
|
||||
<img src="./assets/team/morrisjobke.jpg" alt="Morris Jobke">
|
||||
</div>
|
||||
Morris Jobke
|
||||
<a class="fund-link" href="">Get him an ebook</a>
|
||||
<div class="col-md-12">
|
||||
|
||||
<p>Here are a few of our sponsors and backers. Join them and <a href="https://opencollective.com/dokku#sponsor" target="_blank">become a sponsor</a> on OpenCollective!</p>
|
||||
|
||||
<p class="sponsor">
|
||||
<a href="https://opencollective.com/dokku/sponsor/0/website" target="_blank"><img src="https://opencollective.com/dokku/sponsor/0/avatar.svg" style="max-width: 192px"></a>
|
||||
<a href="https://opencollective.com/dokku/sponsor/1/website" target="_blank"><img src="https://opencollective.com/dokku/sponsor/1/avatar.svg" style="max-width: 192px"></a>
|
||||
<a href="https://opencollective.com/dokku/sponsor/2/website" target="_blank"><img src="https://opencollective.com/dokku/sponsor/2/avatar.svg" style="max-width: 192px"></a>
|
||||
<a href="https://opencollective.com/dokku/sponsor/3/website" target="_blank"><img src="https://opencollective.com/dokku/sponsor/3/avatar.svg" style="max-width: 192px"></a>
|
||||
</p>
|
||||
|
||||
<p class="backer">
|
||||
<a href="https://opencollective.com/dokku/backer/0/website" target="_blank"><img src="https://opencollective.com/dokku/backer/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/1/website" target="_blank"><img src="https://opencollective.com/dokku/backer/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/2/website" target="_blank"><img src="https://opencollective.com/dokku/backer/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/3/website" target="_blank"><img src="https://opencollective.com/dokku/backer/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/4/website" target="_blank"><img src="https://opencollective.com/dokku/backer/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/5/website" target="_blank"><img src="https://opencollective.com/dokku/backer/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/6/website" target="_blank"><img src="https://opencollective.com/dokku/backer/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/7/website" target="_blank"><img src="https://opencollective.com/dokku/backer/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/8/website" target="_blank"><img src="https://opencollective.com/dokku/backer/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/9/website" target="_blank"><img src="https://opencollective.com/dokku/backer/9/avatar.svg"></a>
|
||||
</p>
|
||||
<p class="backer">
|
||||
<a href="https://opencollective.com/dokku/backer/10/website" target="_blank"><img src="https://opencollective.com/dokku/backer/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/11/website" target="_blank"><img src="https://opencollective.com/dokku/backer/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/12/website" target="_blank"><img src="https://opencollective.com/dokku/backer/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/13/website" target="_blank"><img src="https://opencollective.com/dokku/backer/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/14/website" target="_blank"><img src="https://opencollective.com/dokku/backer/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/15/website" target="_blank"><img src="https://opencollective.com/dokku/backer/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/16/website" target="_blank"><img src="https://opencollective.com/dokku/backer/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/17/website" target="_blank"><img src="https://opencollective.com/dokku/backer/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/18/website" target="_blank"><img src="https://opencollective.com/dokku/backer/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/dokku/backer/19/website" target="_blank"><img src="https://opencollective.com/dokku/backer/19/avatar.svg"></a>
|
||||
</p>
|
||||
|
||||
<p>You can also <a href="https://www.patreon.com/dokku" target="_blank">back us anonymously</a> on Patreon.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<footer>
|
||||
<p>© 2013-2016 Dokku</p>
|
||||
<p>© 2013-2019 Dokku</p>
|
||||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
|
||||
@@ -24,20 +24,19 @@ Please remember that DNS relies heavily on _caching_. Changes you make to DNS c
|
||||
|
||||
Don't be afraid to ask if you need help. Create a [new issue](https://github.com/dokku/dokku/issues) and someone will be glad to assist you.
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
For the examples, we will use the domain name `example.tld` and the IP address `127.0.0.1`.
|
||||
|
||||
Dokku uses DNS to differentiate between apps on your dokku-powered server. If you are using the domain `example.tld`, and you have two apps `myapp1` and `myapp2`, Dokku will make them available at `myapp1.example.tld` and `myapp2.example.tld`.
|
||||
Dokku uses DNS to differentiate between apps on your dokku-powered server. If you are using the domain `example.tld`, and you have two apps `node-js-app1` and `node-js-app2`, Dokku will make them available at `node-js-app1.example.tld` and `node-js-app2.example.tld`.
|
||||
|
||||
To get started, you need to know the IP address of your Dokku server. Connect to it and run `ifconfig` or `ip addr` to see the IP address.
|
||||
|
||||
Now you have to make a decision about your domain. Do you want everything and anything at `example.tld` to go to your Dokku server, or would you rather use a 'sub domain' for your Dokku server?
|
||||
|
||||
In other words, do you want your applications on your Dokku server accessible via `myapp.example.tld` or via `myapp.myserver.example.tld`?
|
||||
In other words, do you want your applications on your Dokku server accessible via `node-js-app.example.tld` or via `node-js-app.myserver.example.tld`?
|
||||
|
||||
#### Using a sub-domain (myapp.myserver.example.tld)
|
||||
#### Using a sub-domain (node-js-app.myserver.example.tld)
|
||||
|
||||
Using a sub-domain is easy. When you set up your server, you probably gave it a name like `myserver.example.tld`.
|
||||
|
||||
@@ -70,13 +69,13 @@ If everything is working correctly, you should also be able to query for any oth
|
||||
|
||||
If they all return your IP address, you have set DNS up properly for dokku. You should also be able to `ssh root@myserver.example.tld` and access your server.
|
||||
|
||||
Proceed with the setup instructions in the [installation documentation](/dokku/getting-started/installation/)
|
||||
Proceed with the setup instructions in the [installation documentation](/docs/getting-started/installation.md)
|
||||
|
||||
#### Using the root of your domain (myapp.example.tld)
|
||||
#### Using the root of your domain (node-js-app.example.tld)
|
||||
|
||||
This section is a work in progress. It is incomplete.
|
||||
|
||||
Using the 'root' of your domain is nearly identical to the previous example.
|
||||
|
||||
* hostname is under `example.tld`, still needs `A` record
|
||||
* Need to modify `/home/dokku/HOSTNAME` and `/home/dokku/VHOST`
|
||||
* hostname is under `example.tld`, still needs `A` record.
|
||||
* Update your global domain using the [domains plugin](docs/configuration/domains.md).
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user