Compare commits

..

79 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
3585ee8612 Release 0.4.4 2015-11-07 21:55:05 -05:00
Jose Diaz-Gonzalez
5dbb31cf8a Merge pull request #1612 from Flink/logs-options
Add multiple options to the logs plugin
2015-11-06 00:32:32 -05:00
Jose Diaz-Gonzalez
26d50b0140 Merge pull request #1660 from callahad/deb
Fixup debian/control for Debian
2015-11-06 00:18:51 -05:00
Jose Diaz-Gonzalez
c2fc3141a9 Merge pull request #1643 from Flink/fix-no-vhost
Fix generated nginx config when NO_VHOST=1
2015-11-06 00:06:08 -05:00
Dan Callahan
23c25d01ff Fixup debian/control for Debian
* Bump `Version` field.
* Set minimum nginx version to 1.4.6, per #1654
* Depend on both `rubygem-foo` (Ubuntu) and `ruby-foo` (Debian).
* Add distro-default `docker.io (>= 1.6.2)` as an alternative.

  Version 1.6.2 is in both `trusty-updates` and `jessie-backports`,
  while `trusty` itself has `0.9.1`. We seriously want to avoid that.

This also updates the docs so people don't forget to bump the version
field in the future. Even though we really do that for them with sed.
2015-11-05 22:34:28 -06:00
Jose Diaz-Gonzalez
de832c596a Merge pull request #1644 from mmerickel/watch-events-logrotate
watch dokku events through a logrotate
2015-11-05 22:01:19 -05:00
Jose Diaz-Gonzalez
237dfe2bbd Merge pull request #1634 from callahad/bats
bats is available in homebrew
2015-11-05 21:59:58 -05:00
Jose Diaz-Gonzalez
49a07e5210 Merge pull request #1664 from progrium/mh-add-rev-to-pre-receive-app
add $REV to pre-receive-app call
2015-11-05 21:59:25 -05:00
Jose Diaz-Gonzalez
a1983e0131 Merge pull request #1653 from callahad/SC2145
Resolve SC2145: 'Argument mixes string and array.'
2015-11-05 21:57:02 -05:00
Michael Hobbs
95a7a93cb9 [ci skip] update docs 2015-11-05 18:46:18 -08:00
Michael Hobbs
455033703a add $REV to pre-receive-app call 2015-11-05 17:18:44 -08:00
Jose Diaz-Gonzalez
0470d493ae Merge pull request #1662 from xadh00m/master
Only return users of group 'adm'
2015-11-05 11:15:48 -05:00
Mirko Geissler
c2858e5fb3 Merge pull request #1 from xadh00m/adm_group_fix
Only return users of group 'adm'
2015-11-05 11:52:42 +01:00
Mirko Geissler
f85775b870 Only return users of group 'adm'
This fixes the issue where all groups starting with 'adm' are returned which broke the installation.
2015-11-05 11:51:29 +01:00
Jose Diaz-Gonzalez
d50f3cd151 Merge pull request #1655 from callahad/SC2162
Resolve SC2162: 'read without -r mangles backslashes'
2015-11-05 00:36:48 -05:00
Jose Diaz-Gonzalez
9b887b6262 Merge pull request #1656 from callahad/SC2001
Resolve SC2001: 'See if you can use ${var//search/replace} instead'
2015-11-05 00:36:14 -05:00
Jose Diaz-Gonzalez
f3cc2310da Merge pull request #1657 from callahad/doc-updates
Various small doc updates
2015-11-05 00:35:35 -05:00
Kim Ausloos
ce26004fc8 Various small doc updates
Replaces #1622, addresses comments by @josegonzalez

[ci skip]
2015-11-04 21:26:54 -06:00
Dan Callahan
ff07842dc5 Resolve SC2001: 'See if you can use ${var//search/replace} instead'
https://github.com/koalaman/shellcheck/wiki/SC2001
2015-11-04 20:43:41 -06:00
Dan Callahan
c389b213b5 Resolve SC2162: 'read without -r mangles backslashes'
More information:

https://github.com/koalaman/shellcheck/wiki/SC2162

http://wiki.bash-hackers.org/commands/builtin/read
2015-11-04 20:40:42 -06:00
Jose Diaz-Gonzalez
e1e7fbcc52 Merge pull request #1652 from callahad/SC2143
Resolve SC2143: 'Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar'
2015-11-04 17:20:45 -05:00
Dan Callahan
84c0988fd8 Resolve SC2145: 'Argument mixes string and array.'
https://github.com/koalaman/shellcheck/wiki/SC2145
2015-11-04 11:30:49 -06:00
Dan Callahan
9229e1a9a7 Resolve SC2143: 'Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar'
...we actually don't violate this

https://github.com/koalaman/shellcheck/wiki/SC2143
2015-11-04 11:00:59 -06:00
Jose Diaz-Gonzalez
5f83476811 Merge pull request #1647 from callahad/SC2115
Resolve SC2115: 'Use "${var:?}" to ensure this never expands to /'
2015-11-04 11:54:53 -05:00
Jose Diaz-Gonzalez
0bd06e70d5 Merge pull request #1651 from callahad/SC2029
Resolve SC2029: 'this expands on client side'
2015-11-04 11:54:38 -05:00
Jose Diaz-Gonzalez
c78bf267a3 Merge pull request #1648 from callahad/SC2154
Resolve SC2154: 'variable is referenced but not assigned'
2015-11-04 11:54:16 -05:00
Jose Diaz-Gonzalez
c8c83703ed Merge pull request #1649 from callahad/SC2164
Resolve SC2164: 'Use cd ... || exit in case cd fails.'
2015-11-04 11:54:04 -05:00
Jose Diaz-Gonzalez
baac2ceda2 Merge pull request #1650 from callahad/SC2148
Resolve SC2148: 'target shell is unknown'
2015-11-04 11:53:48 -05:00
Dan Callahan
d465ceb045 Resolve SC2154: 'variable is referenced but not assigned'
In this case, Bats sets $status, $output, and $lines, but ShellCheck
doesn't statically know that. Therefore, we ignore SC2154 when those
variables are first introduced in ./tests/unit/test_helper.bash

https://github.com/koalaman/shellcheck/wiki/SC2154
2015-11-03 22:00:22 -06:00
Dan Callahan
8ed0193b1d Resolve SC2115: 'Use "${var:?}" to ensure this never expands to /'
https://github.com/koalaman/shellcheck/wiki/SC2115
2015-11-03 22:00:05 -06:00
Dan Callahan
1de54d52ac Resolve SC2164: 'Use cd ... || exit in case cd fails.'
https://github.com/koalaman/shellcheck/wiki/SC2164
2015-11-03 21:55:09 -06:00
Dan Callahan
e1b5b1aafc Resolve SC2148: 'target shell is unknown'
https://github.com/koalaman/shellcheck/wiki/SC2148
2015-11-03 21:46:23 -06:00
Dan Callahan
344d48e01b Resolve SC2029: 'this expands on client side'
https://github.com/koalaman/shellcheck/wiki/SC2029

This patch addes inline directives where this is the desired behavior,
instead of globaly excluding the check.
2015-11-03 21:40:31 -06:00
Jose Diaz-Gonzalez
279c49f084 Merge pull request #1645 from rvalyi/master
a git repo can be accessed via ssh
2015-11-03 19:56:48 -05:00
Raphaël Valyi
2b64fe4666 a git repo can be accessed via ssh 2015-11-03 01:11:12 -02:00
Michael Merickel
2d109a20c5 watch dokku events through a logrotate 2015-11-02 14:20:55 -06:00
Loïc Guitaut
804c822ace Fix generated nginx config when NO_VHOST=1
Fixes #1625
2015-11-02 19:08:41 +01:00
Loïc Guitaut
7f5c2caed6 Add multiple options to the logs plugin
New version of the logs plugin broke compatibility (as reported in #1534).
So options have been added to handle display:
* -t/--tail to tail logs (already existed)
* -n/--num NUM to display only this number of lines
* -p/--ps PS to display logs only from provided process
* -q/--quiet to display raw logs without color, time and names

This should close #1534
2015-11-02 15:31:17 +01:00
Jose Diaz-Gonzalez
de29abdab6 Merge pull request #1635 from callahad/linode
Remove deprecated Linode stackscript
2015-10-31 18:09:48 -04:00
Dan Callahan
c250d170cd Remove deprecated Linode stackscript
This is nolonger relevant since we rewrote the Linode docs in commit
81523b3bd0

[ci skip]
2015-10-31 16:13:43 -05:00
Dan Callahan
c48fe4e2a9 bats is available in homebrew 2015-10-31 16:12:36 -05:00
Jose Diaz-Gonzalez
81c5173f5e Merge pull request #1633 from elia/patch-3
Add a warning regarding the use of `trace on`
2015-10-31 15:22:18 -04:00
Elia Schito
ac04199963 Add a warning regarding the use of trace on 2015-10-31 14:56:19 +01:00
Jose Diaz-Gonzalez
a2985e082b Merge pull request #1628 from progrium/mh-restore-var-namespace
move RESTORE variable to DOKKU_APP namespace
2015-10-29 12:40:35 -04:00
Jose Diaz-Gonzalez
8c24483fb7 Merge pull request #1630 from adamwolf/patch-1
Enabling tracing is actually 'dokku trace on'
2015-10-29 12:30:40 -04:00
Adam Wolf
cd3ce7de22 Enabling tracing is actually 'dokku trace on' 2015-10-29 11:28:36 -05:00
Michael Hobbs
e28c75e56a move RESTORE variable to DOKKU_APP namespace 2015-10-29 07:55:09 -07:00
Jose Diaz-Gonzalez
f13796fa57 Merge pull request #1613 from kdomanski/restore
add ps:restore to start applications which weren't manually stopped
2015-10-28 14:15:57 -04:00
Jose Diaz-Gonzalez
49d8cc4902 Merge pull request #1624 from u2mejc/master
Add trace to help output
2015-10-28 12:45:16 -04:00
Jose Diaz-Gonzalez
b22b04af8e Merge pull request #1626 from progrium/josegonzalez-patch-1
Add official dokku-copy-files-to-image plugin
2015-10-27 23:31:11 -04:00
Jose Diaz-Gonzalez
39bf2a2100 Add official dokku-copy-files-to-image plugin
[ci skip]
2015-10-27 23:31:03 -04:00
Jose Diaz-Gonzalez
b50df757db Merge pull request #1623 from sedouard/doc_azure
Doc - Add Azure Documentation
2015-10-27 20:40:50 -04:00
Steven Edouard
aaeae0d9cc Doc - Add Azure Documentation
[ci skip]
2015-10-27 17:24:56 -07:00
Justin Clark
4f6843104c Add trace to help output 2015-10-27 17:15:38 -07:00
Jose Diaz-Gonzalez
bdd0f50dd9 Merge pull request #1621 from elia/patch-2
Support for --force is present in official plugins
2015-10-27 08:10:46 -04:00
Elia Schito
77b3725d5b Support for --force is present in official plugins 2015-10-27 11:21:54 +01:00
Kamil Domański
6c19414b7a add ps:restore to start applications which weren't manually stopped 2015-10-26 20:06:53 +01:00
Jose Diaz-Gonzalez
b3f44e3f96 Merge pull request #1610 from kdomanski/post-stop
Add post-stop plugn trigger
2015-10-26 13:54:21 -04:00
Kamil Domański
f705004975 Add post-stop plugn trigger 2015-10-26 17:57:18 +01:00
Jose Diaz-Gonzalez
39ba53607a Merge pull request #1607 from progrium/debian-installation
Dokku support for Debian Jessie installation
2015-10-25 23:49:26 -04:00
Jose Diaz-Gonzalez
d17cb43bd3 Add missing sudo call to nginx reload 2015-10-25 22:56:48 -04:00
Jose Diaz-Gonzalez
c8bcd67498 Fix warnings in building plugn binary 2015-10-25 22:41:10 -04:00
Jose Diaz-Gonzalez
dcf34eb4d4 Create a systemd service for dokku-installer 2015-10-25 20:19:35 -04:00
Jose Diaz-Gonzalez
5a35c9a76c Run apt-get clean before calling apt-get update
This ensures that we can call apt-get update after adding a new apt source. Debian needs a bit more time to refresh it's own caches, so we just force it's cache to be clean before calling apt-get update again.
2015-10-25 20:13:10 -04:00
Jose Diaz-Gonzalez
b23e5d1cbb Add support for vmware_fusion 2015-10-25 20:09:37 -04:00
Jose Diaz-Gonzalez
a11b46058e Add ruby1.9.1 as a dependency
Debian systems do not have the proper ruby installed, so installing fpm fails.
2015-10-25 20:09:25 -04:00
Jose Diaz-Gonzalez
b3041661b3 Correctly set syslog user as owner on dokku logs for non-debian systems
On debian, rsyslog runs as root, so we don't want to force the non-existent syslog owner.

Fix syntax error
2015-10-25 00:09:26 -04:00
Jose Diaz-Gonzalez
66833f12a0 Ensure we have sudo installed when installing dokku debian packages
Refs #976
2015-10-24 23:15:03 -04:00
Jose Diaz-Gonzalez
18d6e1be3b Add special case commands for instances where we are running dokku in debian
Refs #976
2015-10-24 23:12:38 -04:00
Jose Diaz-Gonzalez
6674d7823e Automatically detect whether dokku is running on debian vs ubuntu
Refs #976
2015-10-24 23:12:14 -04:00
Jose Diaz-Gonzalez
f3959c38b0 Favor chgrp over chown to ensure proper group on logs
Refs #976
2015-10-24 22:44:10 -04:00
Jose Diaz-Gonzalez
8d0fbc0d1b Switch to ruby-dev package over ruby1.9.1-dev
This package is the version we use for as a dokku dependency, and thus there is no need to specify a *specific* version when building the deb packages.

Refs #976
2015-10-24 22:33:00 -04:00
Jose Diaz-Gonzalez
9878c0b6fa Ensure we have a directory for the dokku motd message. Refs #976 2015-10-24 22:11:27 -04:00
Jose Diaz-Gonzalez
79cc07d71b Add sudo pre-dependency for herokuish. Refs #976 2015-10-24 22:11:27 -04:00
Jose Diaz-Gonzalez
9d5d147a9c Use https url for cloning repository. Refs #976
Using git-based urls meant that the user must authenticate against github, which can fail in certain situations
2015-10-24 22:11:18 -04:00
Jose Diaz-Gonzalez
82475ab70d Merge pull request #1606 from progrium/josegonzalez-patch-1
Install plugn 0.2.0 in Makefile installs
2015-10-24 20:02:48 -04:00
Jose Diaz-Gonzalez
cc2c7be96e Install plugn 0.2.0 in Makefile installs
Closes #1479
2015-10-24 18:10:17 -04:00
Jose Diaz-Gonzalez
68e3f93b08 Merge pull request #1605 from progrium/nicer-code-styling
Make commented output a bit more readable
2015-10-24 16:32:10 -04:00
Jose Diaz-Gonzalez
9b3d722eec Make commented output a bit more readable
[ci skip]
2015-10-24 16:31:28 -04:00
57 changed files with 420 additions and 356 deletions

View File

@@ -78,7 +78,8 @@ Output of the following commands
- `dokku plugin`: - `dokku plugin`:
- `docker inspect CONTAINER_ID` (if applicable): - `docker inspect CONTAINER_ID` (if applicable):
- `cat /home/dokku/<app>/nginx.conf` (if applicable): - `cat /home/dokku/<app>/nginx.conf` (if applicable):
- Output of failing dokku commands with `dokku trace on`: - Output of failing dokku commands with `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):
Environment details (AWS, VirtualBox, physical, etc.): Environment details (AWS, VirtualBox, physical, etc.):

View File

@@ -1,5 +1,56 @@
# History # History
## 0.4.4
This release adds a few interesting changes:
- The `dokku logs` command now roughly maps to the `heroku logs` command, and supports most available options.
- Native Microsoft Azure support is now available!
- Quite a few shellcheck issues were fixed thanks to @callahad!
- Experimental debian installation support. Going forward, we will try and make dokku compatible with all systemd installations, as well as investigate dockerfile-based deployment to continue simplifying installation.
Thanks to all our contributors for making this release great!
### Bug Fixes
- #1606: @josegonzalez Install plugn 0.2.0 in Makefile installs
- #1643: @Flink Fix generated nginx config when NO_VHOST=1
- #1644: @mmerickel Watch dokku events through a logrotate
- #1647: @callahad Resolve SC2115: 'Use "${var:?}" to ensure this never expands to /'
- #1648: @callahad Resolve SC2154: 'variable is referenced but not assigned'
- #1649: @callahad Resolve SC2164: 'Use cd ... || exit in case cd fails.'
- #1650: @callahad Resolve SC2148: 'target shell is unknown'
- #1651: @callahad Resolve SC2029: 'this expands on client side'
- #1652: @callahad Resolve SC2143: 'Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar'
- #1653: @callahad Resolve SC2145: 'Argument mixes string and array.'
- #1655: @callahad Resolve SC2162: 'read without -r mangles backslashes'
- #1656: @callahad Resolve SC2001: 'See if you can use ${var//search/replace} instead'
- #1660: @callahad Fixup debian/control for Debian
- #1662: @xadh00m Only return users of group 'adm'
### New Features
- #1607: @josegonzalez Dokku support for Debian Jessie installation
- #1610: @kdomanski Add post-stop plugn trigger
- #1612: @Flink Add multiple options to the logs plugin
- #1613: @kdomanski Add ps:restore to start applications which weren't manually stopped
- #1628: @michaelshobbs Move RESTORE variable to DOKKU_APP namespace
- #1634: @callahad Allow installation of bats via homebrew
- #1645: @rvalyi Add ability to access git repo via ssh
- #1664: @michaelshobbs Add $REV to pre-receive-app call
### Documentation
- #1605: @josegonzalez Make commented output a bit more readable
- #1621: @josegonzalez Document `--force` option for `:destroy` commands
- #1623: @sedouard Add Azure Documentation
- #1624: @u2mejc Add trace to help output
- #1626: @josegonzalez Add official dokku-copy-files-to-image plugin
- #1630: @adamwolf Enabling tracing is actually 'dokku trace on'
- #1633: @elia Add a warning regarding the use of `trace on`
- #1635: @callahad Remove deprecated Linode stackscript
- #1657: @kimausloos Various small doc updates
## 0.4.3 ## 0.4.3
This release was mainly a documentation release/bugfix. This release was mainly a documentation release/bugfix.
@@ -8,7 +59,7 @@ One major removal was is that as of 0.4.3, we no longer restart containers autom
If desired, you may replicate this functionality using the official `docker-options` plugin. If desired, you may replicate this functionality using the official `docker-options` plugin.
## Bug Fixes ### Bug Fixes
- #1560: @darklow Fixes issue where SSL and non-SSL templates cannot be used at the same time - #1560: @darklow Fixes issue where SSL and non-SSL templates cannot be used at the same time
- #1566: @michaelshobbs Fix logic error in enabling nginx - #1566: @michaelshobbs Fix logic error in enabling nginx
@@ -20,7 +71,7 @@ If desired, you may replicate this functionality using the official `docker-opti
- #1603: @josegonzalez Add missing plugin triggers - #1603: @josegonzalez Add missing plugin triggers
Quiet client #1568 Quiet client #1568
## New Features ### New Features
- #1490: @vijayviji Add windows-specific vagrant setup - #1490: @vijayviji Add windows-specific vagrant setup
- #1563: @kdomanski Cleanup all dead containers in dokku cleanup - #1563: @kdomanski Cleanup all dead containers in dokku cleanup
@@ -28,7 +79,7 @@ Quiet client #1568
- #1600: @josegonzalez Upgrade to Herokuish 0.3.4 - #1600: @josegonzalez Upgrade to Herokuish 0.3.4
- #1602: @josegonzalez Add pre-receive-app plugin trigger - #1602: @josegonzalez Add pre-receive-app plugin trigger
## Documentation ### Documentation
- #1556: @josegonzalez Use proper cdn link for css asset - #1556: @josegonzalez Use proper cdn link for css asset
- #1557: @josegonzalez Code styling changes - #1557: @josegonzalez Code styling changes
@@ -212,7 +263,7 @@ This release is a bugfix release covering dokku packaging.
- #1397: @josegonzalez Use https docker apt repo - #1397: @josegonzalez Use https docker apt repo
- #1394: @josegonzalez Remove `dokku plugins-install` from postinst hook - #1394: @josegonzalez Remove `dokku plugins-install` from postinst hook
### Docs Changes ### Documentation
- #1395: @adrianmoya Adding fqdn requirement - #1395: @adrianmoya Adding fqdn requirement
@@ -239,7 +290,7 @@ This release is a bugfix release mostly covering installation and nginx issues.
- #1359: @michaelshobbs allow DOKKU_WAIT_TO_RETIRE to be defined per app - #1359: @michaelshobbs allow DOKKU_WAIT_TO_RETIRE to be defined per app
- #1365: @michaelshobbs support dockerfile images that don't include bash - #1365: @michaelshobbs support dockerfile images that don't include bash
### Docs Changes ### Documentation
- #1305: @josegonzalez Updated documentation site - #1305: @josegonzalez Updated documentation site
- #1321: @fwolfst Mention alternative to nginx.conf templates: include-dir. - #1321: @fwolfst Mention alternative to nginx.conf templates: include-dir.
@@ -278,7 +329,7 @@ This release is a general bugfix release, with improvements to handling of nginx
- #1291: @michaelshobbs Refactored interface for managing global/local app configuration - #1291: @michaelshobbs Refactored interface for managing global/local app configuration
- #1299: @SonicHedgehog Set X-Forwarded-Proto header if TLS is enabled when running checks - #1299: @SonicHedgehog Set X-Forwarded-Proto header if TLS is enabled when running checks
### Docs Changes ### Documentation
- #1273: @alessio Add docs for the events plugin - #1273: @alessio Add docs for the events plugin
- #1276: @josegonzalez Reorder and deprecate a few plugins - #1276: @josegonzalez Reorder and deprecate a few plugins
@@ -319,7 +370,7 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc
- #1251: @josegonzalez Fallback to using /etc/init.d/nginx reload directly to restart nginx - #1251: @josegonzalez Fallback to using /etc/init.d/nginx reload directly to restart nginx
- #1264: @josegonzalez Require lxc-docker-1.6.2 - #1264: @josegonzalez Require lxc-docker-1.6.2
### Docs Changes ### Documentation
- #1252: @josegonzalez Fix ssh port for vagrant installation. Closes #1139. [ci skip] - #1252: @josegonzalez Fix ssh port for vagrant installation. Closes #1139. [ci skip]
- #1250: @josegonzalez SSL documentation is misleading - #1250: @josegonzalez SSL documentation is misleading
@@ -346,7 +397,7 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc
- #1227: @Flink Use --no-cache when building Dockerfile - #1227: @Flink Use --no-cache when building Dockerfile
- #1246: @josegonzalez Ensure we call apt-get before installing packages - #1246: @josegonzalez Ensure we call apt-get before installing packages
### Docs Changes ### Documentation
- #1168: @cjblomqvist [docs] Update git-rev plugin to point to maintained version - #1168: @cjblomqvist [docs] Update git-rev plugin to point to maintained version
- #1180: @sherbondy [docs] Clarify usage around official dokku `docker-options` plugin - #1180: @sherbondy [docs] Clarify usage around official dokku `docker-options` plugin

View File

@@ -1,7 +1,7 @@
DOKKU_VERSION = master DOKKU_VERSION = master
SSHCOMMAND_URL ?= https://raw.githubusercontent.com/progrium/sshcommand/master/sshcommand SSHCOMMAND_URL ?= https://raw.githubusercontent.com/progrium/sshcommand/master/sshcommand
PLUGN_URL ?= https://github.com/progrium/plugn/releases/download/v0.1.0/plugn_0.1.0_linux_x86_64.tgz PLUGN_URL ?= https://github.com/progrium/dokku/releases/download/v0.4.0/plugn_0.2.0_linux_x86_64.tgz
STACK_URL ?= https://github.com/gliderlabs/herokuish.git STACK_URL ?= https://github.com/gliderlabs/herokuish.git
PREBUILT_STACK_URL ?= gliderlabs/herokuish:latest PREBUILT_STACK_URL ?= gliderlabs/herokuish:latest
DOKKU_LIB_ROOT ?= /var/lib/dokku DOKKU_LIB_ROOT ?= /var/lib/dokku

View File

@@ -10,8 +10,8 @@ Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. S
To install the latest stable release, you can run the following commands as a user that has access to `sudo`: To install the latest stable release, you can run the following commands as a user that has access to `sudo`:
wget https://raw.githubusercontent.com/progrium/dokku/v0.4.3/bootstrap.sh wget https://raw.githubusercontent.com/progrium/dokku/v0.4.4/bootstrap.sh
sudo DOKKU_TAG=v0.4.3 bash bootstrap.sh sudo DOKKU_TAG=v0.4.4 bash bootstrap.sh
### Upgrading ### Upgrading

4
Vagrantfile vendored
View File

@@ -27,6 +27,10 @@ Vagrant::configure("2") do |config|
vb.customize ["modifyvm", :id, "--memory", BOX_MEMORY] vb.customize ["modifyvm", :id, "--memory", BOX_MEMORY]
end end
config.vm.provider :vmware_fusion do |v, override|
v.vmx["memsize"] = BOX_MEMORY
end
config.vm.define "empty", autostart: false config.vm.define "empty", autostart: false
config.vm.define "dokku", primary: true do |vm| config.vm.define "dokku", primary: true do |vm|

View File

@@ -6,7 +6,18 @@ if ARGV[0] == "onboot"
File.open("/etc/init/dokku-installer.conf", "w") do |f| File.open("/etc/init/dokku-installer.conf", "w") do |f|
f.puts "start on runlevel [2345]" f.puts "start on runlevel [2345]"
f.puts "exec #{File.absolute_path(__FILE__)} selfdestruct" f.puts "exec #{File.absolute_path(__FILE__)} selfdestruct"
end end if File.directory?("/etc/init")
File.open("/etc/systemd/system/dokku-installer.service", "w") do |f|
f.puts "[Unit]"
f.puts "Description=Dokku web-installer"
f.puts ""
f.puts "[Service]"
f.puts "ExecStart=#{File.absolute_path(__FILE__)} selfdestruct"
f.puts ""
f.puts "[Install]"
f.puts "WantedBy=multi-user.target"
f.puts "WantedBy=graphical.target"
end if File.directory?("/etc/systemd/system")
File.open("/etc/nginx/conf.d/dokku-installer.conf", "w") do |f| File.open("/etc/nginx/conf.d/dokku-installer.conf", "w") do |f|
f.puts "upstream dokku-installer { server 127.0.0.1:2000; }" f.puts "upstream dokku-installer { server 127.0.0.1:2000; }"
f.puts "server {" f.puts "server {"
@@ -21,7 +32,7 @@ if ARGV[0] == "onboot"
exit exit
end end
version = "v0.4.3" version = "v0.4.4"
dokku_root = ENV["DOKKU_ROOT"] || "/home/dokku" dokku_root = ENV["DOKKU_ROOT"] || "/home/dokku"
admin_keys = `cat /root/.ssh/authorized_keys`.split("\n") admin_keys = `cat /root/.ssh/authorized_keys`.split("\n")
hostname = `bash -c '[[ $(dig +short $HOSTNAME) ]] && echo $HOSTNAME || curl icanhazip.com'`.strip hostname = `bash -c '[[ $(dig +short $HOSTNAME) ]] && echo $HOSTNAME || curl icanhazip.com'`.strip
@@ -48,7 +59,7 @@ post "/setup" do
end end
Thread.new { Thread.new {
`rm /etc/nginx/conf.d/dokku-installer.conf && /etc/init.d/nginx stop && /etc/init.d/nginx start` `rm /etc/nginx/conf.d/dokku-installer.conf && /etc/init.d/nginx stop && /etc/init.d/nginx start`
`rm /etc/init/dokku-installer.conf && stop dokku-installer` `rm -f /etc/init/dokku-installer.conf /etc/systemd/system/dokku-installer.service && stop dokku-installer`
}.run if ARGV[0] == "selfdestruct" }.run if ARGV[0] == "selfdestruct"
end end

View File

@@ -93,6 +93,7 @@ if [[ ! -z $DOKKU_HOST ]]; then
fi fi
if [[ -z "$donotshift" ]]; then if [[ -z "$donotshift" ]]; then
# shellcheck disable=SC2029
ssh -o LogLevel=QUIET -t "dokku@$DOKKU_HOST" "$@" ssh -o LogLevel=QUIET -t "dokku@$DOKKU_HOST" "$@"
exit $? exit $?
fi fi
@@ -119,7 +120,7 @@ if [[ ! -z $DOKKU_HOST ]]; then
done done
fi fi
fi fi
# shellcheck disable=SC2086 # shellcheck disable=SC2086,SC2029
ssh -o LogLevel=QUIET -t "dokku@$DOKKU_HOST" $long_args "$verb" "$appname" "${args[@]}" ssh -o LogLevel=QUIET -t "dokku@$DOKKU_HOST" $long_args "$verb" "$appname" "${args[@]}"
} }

View File

@@ -1,174 +0,0 @@
#!/bin/bash
# <UDF name="hostname" default="" label="Hostname for dokku instance" example="example.com">
# <UDF name="ssh_key" default="" label="Public SSH Key for root user" example="Sets the root user's public ssh key, which is also automatically imported into the dokku installer">
# <UDF name="notify_email" default="" Label="Send Finish Notification To" example="Email address to send notification to when finished." />
logit() {
# Simple logging function that prepends an easy-to-find marker '=> ' and a timestamp to a message
TIMESTAMP=$(date -u +'%m/%d %H:%M:%S')
MSG="=> ${TIMESTAMP} $1"
echo ${MSG}
}
set_ssh_key() {
if [[ -n "${SSH_KEY}" ]]; then
logit "Setting root ssh key"
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo "$SSH_KEY" > /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chown -R root:root /root/.ssh
fi
}
set_passwordless_ssh() {
logit "Turn off password authentication and root login for SSH"
echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
service ssh restart
}
system_primary_ip() {
# returns the primary IP assigned to eth0
ifconfig eth0 | awk -F: '/inet addr:/ {print $2}' | awk '{ print $1 }'
}
set_hostname() {
logit "Set up hostname"
if [[ -n "${HOSTNAME}" ]]; then
echo $HOSTNAME > /etc/hostname
echo $IPADDR $FQDN $HOSTNAME >> /etc/hosts
else
system_primary_ip > /etc/hostname
echo "$(system_primary_ip) localhost" >> /etc/hosts
fi
IPADDR=$(/sbin/ifconfig eth0 | awk '/inet / { print $2 }' | sed 's/addr://')
hostname -F /etc/hostname
}
postfix_install_loopback_only() {
logit "Installing and configuring Postfix"
# Installs postfix and configure to listen only on the local interface. Also
# allows for local mail delivery
echo "postfix postfix/destinations string localhost.localdomain, localhost" | debconf-set-selections
echo "postfix postfix/mailname string localhost" | debconf-set-selections
echo "postfix postfix/main_mailer_type select Internet Site" | debconf-set-selections
echo "postfix postfix/myhostname string localhost" | debconf-set-selections
sudo apt-get install -qq -y postfix > /dev/null 2>&1
/usr/sbin/postconf -e "inet_interfaces = loopback-only"
#/usr/sbin/postconf -e "local_transport = error:local delivery is disabled"
touch /tmp/restart-postfix
}
notify_install_via_email() {
if [[ -n "${NOTIFY_EMAIL}" ]]; then
logit "Sending notification email to ${NOTIFY_EMAIL}"
/usr/sbin/sendmail "${NOTIFY_EMAIL}" <<EOD
To: ${NOTIFY_EMAIL}
Subject: Dokku installation is complete
From: Dokku StackScript <no-reply@${HOSTNAME}>
Your Dokku installation is complete and now ready to be configured: http://$(system_primary_ip) . Please visit this url to complete the setup of your Dokku instance.
Enjoy using Dokku!
EOD
fi
}
notify_restart_via_email() {
if [[ -n "${NOTIFY_EMAIL}" ]]; then
logit "Sending notification email to ${NOTIFY_EMAIL} of required restart"
/usr/sbin/sendmail "${NOTIFY_EMAIL}" <<EOD
To: ${NOTIFY_EMAIL}
Subject: Dokku Linode instance must be restarted
From: Dokku StackScript <no-reply@${HOSTNAME}>
The following linode instance must be restarted:
${LINODE_LISHUSERNAME}
Before restarting, please go to this url:
https://manager.linode.com/linodes/dashboard/${LINODE_LISHUSERNAME}
Then click "Edit" next to the selected configuration profile and make the following changes:
- Change the "Kernel" option to the current "pv-grub" release
- Set the "Distro helper" option to "no"
Then save your changes. Next, reboot the instance from the Linode Dashboard. You'll receive an email once the instance is available to continue the dokku installation.
EOD
fi
}
setup_linode() {
logit "Installing via linode"
DEBIAN_FRONTEND=noninteractive apt-get install -qq -y linux-virtual
DEBIAN_FRONTEND=noninteractive apt-get purge -qq -y grub2 grub-pc
DEBIAN_FRONTEND=noninteractive apt-get install -qq -y grub
mkdir -p /boot/grub
update-grub -y
sed -i 's/kopt=root=UUID=.* ro/kopt=root=\/dev\/xvda console=hvc0 ro quiet/g' /boot/grub/menu.lst
sed -i 's/# groot=(hd0,0)/# groot=(hd0)/g' /boot/grub/menu.lst
update-grub
cp /etc/rc.local /etc/rc.local-bak
cat << "EOF" > /etc/rc.local
#!/bin/sh -e
sudo apt-get update >> /root/setup_linode.txt 2>&1
sudo apt-get install -y linux-image-extra-"$(uname -r)" >> /root/setup_linode.txt 2>&1
modprobe aufs >> /root/setup_linode.txt 2>&1
sudo apt-get install -y apparmor cgroup-lite >> /root/setup_linode.txt 2>&1
sudo apt-get install -y dokku >> /root/setup_linode.txt 2>&1
# Clean up this script so it only runs once
rm -f /etc/rc.local
mv /etc/rc.local-bak /etc/rc.local
exit 0
EOF
chmod +x /etc/rc.local
}
install_prerequisites() {
logit "Installing pre-requisites"
sudo apt-get update -qq > /dev/null
sudo apt-get install -qq -y apt-transport-https curl > /dev/null 2>&1
logit "Installing docker"
curl -sSL https://get.docker.com/ | sh
logit "Installing dokku"
curl -sSL https://packagecloud.io/gpg.key 2> /dev/null | apt-key add - > /dev/null 2>&1
echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ trusty main" > /etc/apt/sources.list.d/dokku.list
sudo apt-get update -qq > /dev/null
}
install_dokku() {
logit "Installing pre-requisites"
sudo apt-get install -qq -y linux-image-extra-"$(uname -r)" > /dev/null 2>&1
logit "Installing dokku"
sudo apt-get install -qq -y dokku > /dev/null 2>&1
logit "Done!"
}
exec &> /root/stackscript.log
set_ssh_key
set_passwordless_ssh
postfix_install_loopback_only
set_hostname
install_prerequisites
if [[ -n "$LINODE_ID" ]]; then
setup_linode
notify_restart_via_email
else
install_dokku
notify_install_via_email
fi

18
deb.mk
View File

@@ -49,7 +49,7 @@ deb-all: deb-herokuish deb-dokku deb-gems deb-plugn deb-sshcommand
deb-setup: deb-setup:
echo "-> Updating deb repository and installing build requirements" echo "-> Updating deb repository and installing build requirements"
sudo apt-get update -qq > /dev/null sudo apt-get update -qq > /dev/null
sudo apt-get install -qq -y gcc git ruby1.9.1-dev > /dev/null 2>&1 sudo apt-get install -qq -y gcc git ruby-dev ruby1.9.1 > /dev/null 2>&1
command -v fpm > /dev/null || sudo gem install fpm --no-ri --no-rdoc command -v fpm > /dev/null || sudo gem install fpm --no-ri --no-rdoc
ssh -o StrictHostKeyChecking=no git@github.com || true ssh -o StrictHostKeyChecking=no git@github.com || true
@@ -69,7 +69,7 @@ deb-herokuish: deb-setup
echo "sudo docker build -t gliderlabs/herokuish /var/lib/herokuish 1> /dev/null" >> /tmp/tmp/post-install echo "sudo docker build -t gliderlabs/herokuish /var/lib/herokuish 1> /dev/null" >> /tmp/tmp/post-install
echo "-> Cloning repository" echo "-> Cloning repository"
git clone -q "git@github.com:$(HEROKUISH_REPO_NAME).git" /tmp/tmp/herokuish > /dev/null git clone -q "https://github.com/$(HEROKUISH_REPO_NAME).git" /tmp/tmp/herokuish > /dev/null
rm -rf /tmp/tmp/herokuish/.git /tmp/tmp/herokuish/.gitignore rm -rf /tmp/tmp/herokuish/.git /tmp/tmp/herokuish/.gitignore
echo "-> Copying files into place" echo "-> Copying files into place"
@@ -77,7 +77,7 @@ deb-herokuish: deb-setup
cp -rf /tmp/tmp/herokuish /tmp/build/var/lib/herokuish cp -rf /tmp/tmp/herokuish /tmp/build/var/lib/herokuish
echo "-> Creating $(HEROKUISH_PACKAGE_NAME)" 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 | docker-engine-cs' --after-install /tmp/tmp/post-install --url "https://github.com/$(HEROKUISH_REPO_NAME)" --description $(HEROKUISH_DESCRIPTION) --license 'MIT License' . 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 | docker-engine-cs' --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 mv *.deb /tmp
deb-dokku: deb-setup deb-dokku: deb-setup
@@ -121,16 +121,18 @@ deb-plugn: deb-setup
mkdir -p /tmp/tmp /tmp/build mkdir -p /tmp/tmp /tmp/build
echo "-> Cloning repository" echo "-> Cloning repository"
git clone -q "git@github.com:$(PLUGN_REPO_NAME).git" /tmp/tmp/plugn > /dev/null git clone -q "https://github.com/$(PLUGN_REPO_NAME).git" /tmp/tmp/plugn > /dev/null
rm -rf /tmp/tmp/plugn/.git /tmp/tmp/plugn/.gitignore rm -rf /tmp/tmp/plugn/.git /tmp/tmp/plugn/.gitignore
echo "-> Copying files into place" echo "-> Copying files into place"
mkdir -p /tmp/build/usr/local/bin $(GOPATH) mkdir -p /tmp/build/usr/local/bin $(GOPATH)
sudo apt-get clean
sudo apt-get update -qq > /dev/null sudo apt-get update -qq > /dev/null
sudo apt-get install -qq -y git golang mercurial > /dev/null 2>&1 sudo apt-get install -qq -y git golang mercurial > /dev/null 2>&1
export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH) && cd /tmp/tmp/plugn && make deps export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH):/tmp/tmp/plugn && go get github.com/progrium/plugn
export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH) && cd /tmp/tmp/plugn && go build -o plugn export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH):/tmp/tmp/plugn && cd /home/vagrant/gocode/src/github.com/progrium/plugn && make deps
mv /tmp/tmp/plugn/plugn /tmp/build/usr/local/bin/plugn export PATH=$(PATH):$(GOROOT)/bin:$(GOPATH)/bin && export GOROOT=$(GOROOT) && export GOPATH=$(GOPATH):/tmp/tmp/plugn && cd /home/vagrant/gocode/src/github.com/progrium/plugn && rm plugn && go build -o plugn
mv /home/vagrant/gocode/src/github.com/progrium/plugn/plugn /tmp/build/usr/local/bin/plugn
echo "-> Creating $(PLUGN_PACKAGE_NAME)" echo "-> Creating $(PLUGN_PACKAGE_NAME)"
sudo fpm -t deb -s dir -C /tmp/build -n plugn -v $(PLUGN_VERSION) -a $(PLUGN_ARCHITECTURE) -p $(PLUGN_PACKAGE_NAME) --url "https://github.com/$(PLUGN_REPO_NAME)" --description $(PLUGN_DESCRIPTION) --license 'MIT License' . sudo fpm -t deb -s dir -C /tmp/build -n plugn -v $(PLUGN_VERSION) -a $(PLUGN_ARCHITECTURE) -p $(PLUGN_PACKAGE_NAME) --url "https://github.com/$(PLUGN_REPO_NAME)" --description $(PLUGN_DESCRIPTION) --license 'MIT License' .
@@ -141,7 +143,7 @@ deb-sshcommand: deb-setup
mkdir -p /tmp/tmp /tmp/build mkdir -p /tmp/tmp /tmp/build
echo "-> Cloning repository" echo "-> Cloning repository"
git clone -q "git@github.com:$(SSHCOMMAND_REPO_NAME).git" /tmp/tmp/sshcommand > /dev/null git clone -q "https://github.com/$(SSHCOMMAND_REPO_NAME).git" /tmp/tmp/sshcommand > /dev/null
rm -rf /tmp/tmp/sshcommand/.git /tmp/tmp/sshcommand/.gitignore rm -rf /tmp/tmp/sshcommand/.git /tmp/tmp/sshcommand/.gitignore
echo "-> Copying files into place" echo "-> Copying files into place"

8
debian/control vendored
View File

@@ -1,9 +1,9 @@
Package: dokku Package: dokku
Version: 0.3.12 Version: 0.4.4
Section: base Section: web
Priority: optional Priority: optional
Architecture: amd64 Architecture: amd64
Depends: locales, git, make, curl, software-properties-common, docker-engine | docker-engine-cs | lxc-docker, gcc, python-software-properties, man-db, herokuish, sshcommand Depends: locales, git, make, curl, gcc, man-db, herokuish, sshcommand, docker-engine-cs | docker-engine | lxc-docker (>= 1.6.2) | docker.io (>= 1.6.2), software-properties-common, python-software-properties
Pre-Depends: nginx, dnsutils, ruby, ruby-dev, rubygem-rack, rubygem-rack-protection, rubygem-sinatra, rubygem-tilt, apparmor, cgroupfs-mount | cgroup-lite, plugn Pre-Depends: nginx (>= 1.4.6), dnsutils, apparmor, cgroupfs-mount | cgroup-lite, plugn, sudo, ruby, ruby-dev, rubygem-rack , rubygem-rack-protection, rubygem-sinatra, rubygem-tilt
Maintainer: Jose Diaz-Gonzalez <dokku@josediazgonzalez.com> Maintainer: Jose Diaz-Gonzalez <dokku@josediazgonzalez.com>
Description: Docker powered mini-Heroku in around 100 lines of Bash Description: Docker powered mini-Heroku in around 100 lines of Bash

4
debian/postinst vendored
View File

@@ -24,7 +24,7 @@ case "$1" in
touch /var/lib/dokku/core-plugins/config.toml /var/lib/dokku/plugins/config.toml touch /var/lib/dokku/core-plugins/config.toml /var/lib/dokku/plugins/config.toml
# migrate old plugins # migrate old plugins
find /var/lib/dokku/plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do find /var/lib/dokku/plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
if [ "$plugin" = "available" ] || [ "$plugin" = "enabled" ]; then if [ "$plugin" = "available" ] || [ "$plugin" = "enabled" ]; then
continue continue
elif [ -f /var/lib/dokku/plugins/$plugin/.core ]; then elif [ -f /var/lib/dokku/plugins/$plugin/.core ]; then
@@ -35,7 +35,7 @@ case "$1" in
done done
# enable all core plugins # enable all core plugins
find /var/lib/dokku/core-plugins/available -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do find /var/lib/dokku/core-plugins/available -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
if [ ! -d /var/lib/dokku/plugins/available/$plugin ]; then if [ ! -d /var/lib/dokku/plugins/available/$plugin ]; then
ln -s /var/lib/dokku/core-plugins/available/$plugin /var/lib/dokku/plugins/available/$plugin; ln -s /var/lib/dokku/core-plugins/available/$plugin /var/lib/dokku/plugins/available/$plugin;
PLUGIN_PATH=/var/lib/dokku/core-plugins plugn enable $plugin PLUGIN_PATH=/var/lib/dokku/core-plugins plugn enable $plugin

View File

@@ -2,10 +2,10 @@
<browserconfig> <browserconfig>
<msapplication> <msapplication>
<tile> <tile>
<square70x70logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-70x70.png"/> <square70x70logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-70x70.png"/>
<square150x150logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-150x150.png"/> <square150x150logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-150x150.png"/>
<square310x310logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-310x310.png"/> <square310x310logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-310x310.png"/>
<wide310x150logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-310x150.png"/> <wide310x150logo src="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-310x150.png"/>
<TileColor>#da532c</TileColor> <TileColor>#da532c</TileColor>
</tile> </tile>
</msapplication> </msapplication>

View File

@@ -2,37 +2,37 @@
"name": "Dokku", "name": "Dokku",
"icons": [ "icons": [
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-36x36.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-36x36.png",
"sizes": "36x36", "sizes": "36x36",
"type": "image\/png", "type": "image\/png",
"density": "0.75" "density": "0.75"
}, },
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-48x48.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-48x48.png",
"sizes": "48x48", "sizes": "48x48",
"type": "image\/png", "type": "image\/png",
"density": "1.0" "density": "1.0"
}, },
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-72x72.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-72x72.png",
"sizes": "72x72", "sizes": "72x72",
"type": "image\/png", "type": "image\/png",
"density": "1.5" "density": "1.5"
}, },
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-96x96.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-96x96.png",
"sizes": "96x96", "sizes": "96x96",
"type": "image\/png", "type": "image\/png",
"density": "2.0" "density": "2.0"
}, },
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-144x144.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-144x144.png",
"sizes": "144x144", "sizes": "144x144",
"type": "image\/png", "type": "image\/png",
"density": "3.0" "density": "3.0"
}, },
{ {
"src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.3\/docs\/assets\/favicons\/android-chrome-192x192.png", "src": "https:\/\/cdn.rawgit.com\/progrium\/dokku\/v0.4.4\/docs\/assets\/favicons\/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image\/png", "type": "image\/png",
"density": "4.0" "density": "4.0"

View File

@@ -25,7 +25,7 @@ h1 {
padding: 0 0 0 1em; padding: 0 0 0 1em;
} }
.header a { .header a {
background-image: url(https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/dokku.png); background-image: url(https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/dokku.png);
color: #fff; color: #fff;
text-indent: 40px; text-indent: 40px;
background-position: center left; background-position: center left;
@@ -40,7 +40,7 @@ h1 {
.blurb { .blurb {
color: #424242; color: #424242;
background-color: #ededed; background-color: #ededed;
background-image: url(https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/gplaypattern.png); background-image: url(https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/gplaypattern.png);
padding: 45px 0; padding: 45px 0;
text-align: center; text-align: center;
} }
@@ -102,6 +102,9 @@ h1 {
.quickstart-code .command { .quickstart-code .command {
color: #ffffcc; color: #ffffcc;
} }
.quickstart-code .line .output {
color: #aaaaaa;
}
.marketing .col-lg-4 { .marketing .col-lg-4 {
margin-bottom: 20px; margin-bottom: 20px;
text-align: center; text-align: center;

View File

@@ -2,7 +2,7 @@
> New as of 0.3.0 > New as of 0.3.0
Following a deploy, dokku will now wait `10` seconds before routing traffic to the new container. If the container is not running after this time, then the deploy is failed and your old container will continue serving traffic. You can configure this time using the following command: Following a deploy, dokku will now wait `10` seconds before routing traffic to the new container. If the container is not running after this time, then the deploy is failed and your old container will continue serving traffic. You can modify this value using the following command:
```shell ```shell
dokku config:set --global DOKKU_DEFAULT_CHECKS_WAIT=30 dokku config:set --global DOKKU_DEFAULT_CHECKS_WAIT=30
@@ -18,13 +18,13 @@ A check is a relative URL and may be followed by expected content from the page,
/about Our Amazing Team /about Our Amazing Team
``` ```
Dokku will wait `5` seconds before running the checks to give server time to start. This time can be overridden on a per-app basis in the `CHECKS` file by setting `WAIT=nn`. You may also override this for the global dokku installation: Dokku will wait `5` seconds before running the checks to give the server time to start. This value can be overridden on a per-app basis in the `CHECKS` file by setting `WAIT=nn`. You may also override this for the global dokku installation:
```shell ```shell
dokku config:set --global DOKKU_CHECKS_WAIT=15 dokku config:set --global DOKKU_CHECKS_WAIT=15
``` ```
Dokku will wait `60` seconds before stopping the old container so that existing connections are given a chance to complete. This time is also configurable globally: Dokku will wait `60` seconds before stopping the old container so that existing connections are given a chance to complete. This value is also configurable globally:
```shell ```shell
dokku config:set --global DOKKU_WAIT_TO_RETIRE=120 dokku config:set --global DOKKU_WAIT_TO_RETIRE=120

View File

@@ -21,13 +21,13 @@ You can set multiple environment variables at once:
dokku config:set node-js-app ENV=prod COMPILE_ASSETS=1 dokku config:set node-js-app ENV=prod COMPILE_ASSETS=1
``` ```
When setting variables with whitespace, you need to escape the whitespace: When setting variables with whitespaces, you need to escape them:
```shell ```shell
dokku config:set node-js-app KEY=\"VAL\ WITH\ SPACES\" dokku config:set node-js-app KEY=\"VAL\ WITH\ SPACES\"
``` ```
When setting or unsetting environment variables, you may wish sometimes 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: 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:
```shell ```shell
dokku --no-restart config:set node-js-app ENV=prod dokku --no-restart config:set node-js-app ENV=prod

View File

@@ -62,9 +62,10 @@ fi
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
export DEBIAN_FRONTEND=noninteractive
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
ubuntu) debian|ubuntu)
export DEBIAN_FRONTEND=noninteractive
apt-get install --force-yes -qq -y nginx apt-get install --force-yes -qq -y nginx
;; ;;
@@ -436,6 +437,24 @@ APP="$1";
dokku postgres:destroy $APP dokku postgres:destroy $APP
``` ```
### `post-stop`
- Description: Can be used to run commands after an application is manually stopped
- Invoked by: `dokku ps:stop`
- Arguments: `$APP`
- Example:
```shell
#!/usr/bin/env bash
# Marks an application as manually stopped
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
APP="$1";
dokku config:set --no-restart $APP MANUALLY_STOPPED=1
```
### `docker-args-build` ### `docker-args-build`
- Description: - Description:
@@ -591,7 +610,7 @@ nginx -t
- Description: Allows you to customize the contents of an application directory before they are processed for deployment. The `IMAGE_SOURCE_TYPE` can be any of `[herokuish, dockerfile]` - Description: Allows you to customize the contents of an application directory before they are processed for deployment. The `IMAGE_SOURCE_TYPE` can be any of `[herokuish, dockerfile]`
- Invoked by: `dokku git-hook`, `dokku tar-build-locked` - Invoked by: `dokku git-hook`, `dokku tar-build-locked`
- Arguments: `$APP $IMAGE_SOURCE_TYPE $TMP_WORK_DIR` - Arguments: `$APP $IMAGE_SOURCE_TYPE $TMP_WORK_DIR $REV`
- Example: - Example:
```shell ```shell
@@ -601,7 +620,7 @@ nginx -t
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
APP="$1"; IMAGE_SOURCE_TYPE="$2"; TMP_WORK_DIR="$3" APP="$1"; IMAGE_SOURCE_TYPE="$2"; TMP_WORK_DIR="$3"; REV="$4"
echo "$APP" > "$TMP_WORK_DIR/dokku-is-awesome" echo "$APP" > "$TMP_WORK_DIR/dokku-is-awesome"
``` ```

View File

@@ -4,18 +4,19 @@ 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: To propose a release, the following tasks need to be performed:
- The installable version must be changed in the `docs/installation.md` file. - The installable version must be changed in the `contrib/dokku-installer.rb` 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/home.html` file
- The installable version must be changed in the `docs/index.md` file - The installable version must be changed in the `docs/index.md` file
- The installable version must be changed in the `README.md` file. - The installable version must be changed in the `docs/installation.md` file.
- The installable version must be changed in the `contrib/dokku-installer.rb` file.
- The installable version must be changed in the `docs/template.html` 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 embedded css should be cleared in the `docs/template.html` 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 in the `docs/assets/style.css` 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/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/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 in the `docs/template.html` file. - The versioned links should be updated in the `docs/template.html` file.
- A list of changes must be made in the `HISTORY.md`. - A list of changes must be made in the `HISTORY.md`.
- A tag must be created locally with your release version - A tag must be created locally with your release version

View File

@@ -1,6 +1,6 @@
# DNS Configuration # DNS Configuration
This is a work in progress. > Note: This is a work in progress.
### DNS Versions ### DNS Versions
@@ -26,9 +26,9 @@ Don't be afraid to ask if you need help. Create a [new issue](https://github.co
For the examples, we will use the domain name `example.tld` and the IP address `127.0.0.1`. For the examples, we will use the domain name `example.tld` and the IP address `127.0.0.1`.
Dokku uses a 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 `myapp1` and `myapp2`, dokku will make them available at `myapp1.example.tld` and `myapp2.example.tld`.
To get started, you need to know the IP address of your dokku server. Connect in to it and run `ifconfig` or `ip addr` to see the IP address. 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.
# Caching # Caching

View File

@@ -0,0 +1,11 @@
# Microsoft Azure
- 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://azure.microsoft.com/en-us/documentation/templates/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.
- 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`.

View File

@@ -10,26 +10,26 @@
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css"> <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> <title>Dokku - The smallest PaaS implementation you've ever seen</title>
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-57x57.png"> <link rel="apple-touch-icon" sizes="57x57" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-60x60.png"> <link rel="apple-touch-icon" sizes="60x60" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="72x72" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-76x76.png"> <link rel="apple-touch-icon" sizes="76x76" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="114x114" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-120x120.png"> <link rel="apple-touch-icon" sizes="120x120" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-144x144.png"> <link rel="apple-touch-icon" sizes="144x144" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" sizes="152x152" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-180x180.png"> <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-16x16.png" sizes="16x16"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/manifest.json"> <link rel="manifest" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/manifest.json">
<link rel="shortcut icon" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon.ico"> <link rel="shortcut icon" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Dokku"> <meta name="apple-mobile-web-app-title" content="Dokku">
<meta name="application-name" content="Dokku"> <meta name="application-name" content="Dokku">
<meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-TileImage" content="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-144x144.png"> <meta name="msapplication-TileImage" content="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-144x144.png">
<meta name="msapplication-config" content="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/browserconfig.xml"> <meta name="msapplication-config" content="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
@@ -45,6 +45,7 @@
.quickstart-code .shell{background-color:#171717;font-family:Menlo,Consolas,"Courier New",Courier,"Liberation Mono",monospace;margin:0 20px;padding:20px;text-shadow:none;border-radius:0 0 5px 5px;box-shadow:0 5px 30px rgba(0,0,0,0.3)} .quickstart-code .shell{background-color:#171717;font-family:Menlo,Consolas,"Courier New",Courier,"Liberation Mono",monospace;margin:0 20px;padding:20px;text-shadow:none;border-radius:0 0 5px 5px;box-shadow:0 5px 30px rgba(0,0,0,0.3)}
.quickstart-code .line{display:block;margin:0;padding:0} .quickstart-code .line{display:block;margin:0;padding:0}
.quickstart-code .line span{display:inline-block} .quickstart-code .line span{display:inline-block}
.quickstart-code .line .output{color:#aaaaaa;}
.quickstart-code .path{color:#2a8fbd;user-select:none} .quickstart-code .path{color:#2a8fbd;user-select:none}
.quickstart-code .prompt{color:#f90;user-select:none} .quickstart-code .prompt{color:#f90;user-select:none}
.quickstart-code .command{color:#ffc} .quickstart-code .command{color:#ffc}
@@ -86,12 +87,12 @@
<p class="line"> <p class="line">
<span class="path">~</span> <span class="path">~</span>
<span class="prompt">$</span> <span class="prompt">$</span>
<span class="command">wget https://raw.githubusercontent.com/progrium/dokku/v0.4.3/bootstrap.sh</span> <span class="command">wget https://raw.githubusercontent.com/progrium/dokku/v0.4.4/bootstrap.sh</span>
</p> </p>
<p class="line"> <p class="line">
<span class="path">~</span> <span class="path">~</span>
<span class="prompt">$</span> <span class="prompt">$</span>
<span class="command">sudo DOKKU_TAG=v0.4.3 bash bootstrap.sh</span> <span class="command">sudo DOKKU_TAG=v0.4.4 bash bootstrap.sh</span>
</p> </p>
<p class="line"> <p class="line">
<span class="output"># =&gt; Go to your server's IP and follow the web installer</span> <span class="output"># =&gt; Go to your server's IP and follow the web installer</span>

View File

@@ -15,12 +15,12 @@
<p class="line"> <p class="line">
<span class="path">~</span> <span class="path">~</span>
<span class="prompt">$</span> <span class="prompt">$</span>
<span class="command">wget https://raw.githubusercontent.com/progrium/dokku/v0.4.3/bootstrap.sh</span> <span class="command">wget https://raw.githubusercontent.com/progrium/dokku/v0.4.4/bootstrap.sh</span>
</p> </p>
<p class="line"> <p class="line">
<span class="path">~</span> <span class="path">~</span>
<span class="prompt">$</span> <span class="prompt">$</span>
<span class="command">sudo DOKKU_TAG=v0.4.3 bash bootstrap.sh</span> <span class="command">sudo DOKKU_TAG=v0.4.4 bash bootstrap.sh</span>
</p> </p>
<p class="line"> <p class="line">
<span class="output"># =&gt; Go to your server's IP and follow the web installer</span> <span class="output"># =&gt; Go to your server's IP and follow the web installer</span>

View File

@@ -19,8 +19,8 @@ To install the latest stable version of dokku, you can run the following shell c
```shell ```shell
# installs dokku via apt-get # installs dokku via apt-get
wget https://raw.githubusercontent.com/progrium/dokku/v0.4.3/bootstrap.sh wget https://raw.githubusercontent.com/progrium/dokku/v0.4.4/bootstrap.sh
sudo DOKKU_TAG=v0.4.3 bash bootstrap.sh sudo DOKKU_TAG=v0.4.4 bash bootstrap.sh
``` ```
The installation process takes about 5-10 minutes, depending upon internet connection speed. The installation process takes about 5-10 minutes, depending upon internet connection speed.
@@ -34,7 +34,8 @@ Once you save your settings, the web admin will self-terminate and you should be
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: 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](http://progrium.viewdocs.io/dokku/getting-started/install/digitalocean) - [Digital Ocean Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/digitalocean)
- [Linode Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/linode) - [Linode Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/linode/)
- [Microsoft Azure Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/azure/)
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:

View File

@@ -1,6 +1,6 @@
# Nginx Configuration # Nginx Configuration
Dokku uses nginx as it's server for routing requests to specific applications. By default, access and error logs are written for each app to `/var/log/nginx/${APP}-access.log` and `/var/log/nginx/${APP}-error.log` respectively Dokku uses nginx as its server for routing requests to specific applications. By default, access and error logs are written for each app to `/var/log/nginx/${APP}-access.log` and `/var/log/nginx/${APP}-error.log` respectively
``` ```
nginx:access-logs <app> [-t] Show the nginx access logs for an application (-t follows) nginx:access-logs <app> [-t] Show the nginx access logs for an application (-t follows)
@@ -22,7 +22,7 @@ Dokku currently templates out an nginx configuration that is included in the `ng
- `nginx.conf.ssl_terminated.template` (since 0.4.0) - `nginx.conf.ssl_terminated.template` (since 0.4.0)
- `nginx.ssl.conf.template` (since 0.4.2) - `nginx.ssl.conf.template` (since 0.4.2)
> If placed on disk on the dokku server, the template file **must** be owned by the user `dokku:dokku`. > If placed on the dokku server, the template file **must** be owned by user and group `dokku:dokku`.
For instance - assuming defaults - to customize the nginx template in use for the `myapp` application, create the file `nginx.conf.template` in your repo or on disk with the with the following contents: For instance - assuming defaults - to customize the nginx template in use for the `myapp` application, create the file `nginx.conf.template` in your repo or on disk with the with the following contents:
@@ -70,7 +70,7 @@ The default nginx.conf- templates will include everything from your apps `nginx.
include $DOKKU_ROOT/$APP/nginx.conf.d/*.conf; 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 That means you can put additional configuration in separate files, for example to limit the uploaded body size to 50 megabytes, do
```shell ```shell
mkdir /home/dokku/myapp/nginx.conf.d/ mkdir /home/dokku/myapp/nginx.conf.d/

View File

@@ -44,8 +44,9 @@ The following plugins are available and provided by dokku maintainers. Where not
| [RabbitMQ (beta)](https://github.com/dokku/dokku-rabbitmq-plugin) | [dokku][] | 0.4.0+ | | [RabbitMQ (beta)](https://github.com/dokku/dokku-rabbitmq-plugin) | [dokku][] | 0.4.0+ |
| [Redis (beta)](https://github.com/dokku/dokku-redis-plugin) | [dokku][] | 0.4.0+ | | [Redis (beta)](https://github.com/dokku/dokku-redis-plugin) | [dokku][] | 0.4.0+ |
| [RethinkDB (beta)](https://github.com/dokku/dokku-rethinkdb-plugin) | [dokku][] | 0.4.0+ | | [RethinkDB (beta)](https://github.com/dokku/dokku-rethinkdb-plugin) | [dokku][] | 0.4.0+ |
| [Maintenance mode (beta)](https://github.com/dokku/dokku-maintenance) | [dokku][] | 0.4.0+ | | [Copy Files to Image](https://github.com/dokku/dokku-copyfiles-to-image) | [dokku][] | 0.4.0+ |
| [HTTP Auth (beta)](https://github.com/dokku/dokku-http-auth) | [dokku][] | 0.4.0+ | | [HTTP Auth (beta)](https://github.com/dokku/dokku-http-auth) | [dokku][] | 0.4.0+ |
| [Maintenance mode (beta)](https://github.com/dokku/dokku-maintenance) | [dokku][] | 0.4.0+ |
| [Redirect (beta)](https://github.com/dokku/dokku-redirect) | [dokku][] | 0.4.0+ | | [Redirect (beta)](https://github.com/dokku/dokku-redirect) | [dokku][] | 0.4.0+ |
## Community plugins ## Community plugins

View File

@@ -18,7 +18,7 @@ in order to avoid ssh interpretting dokku arguments for itself.
--quiet suppress output headers --quiet suppress output headers
--trace enable DOKKU_TRACE for current execution only --trace enable DOKKU_TRACE for current execution only
--rm|--rm-container remove docker container after successful dokku run <app> <command> --rm|--rm-container remove docker container after successful dokku run <app> <command>
--force force flag. currently used in apps:destroy --force force flag. currently used in apps:destroy and other ":destroy" commands
``` ```
## Clients ## Clients

View File

@@ -10,32 +10,31 @@
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400:sans-serif|Open+Sans:400:sans-serif" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Open+Sans:400:sans-serif|Open+Sans:400:sans-serif" rel="stylesheet" type="text/css">
<title>Dokku - The smallest PaaS implementation you've ever seen</title> <title>Dokku - The smallest PaaS implementation you've ever seen</title>
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-57x57.png"> <link rel="apple-touch-icon" sizes="57x57" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-60x60.png"> <link rel="apple-touch-icon" sizes="60x60" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="72x72" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-76x76.png"> <link rel="apple-touch-icon" sizes="76x76" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="114x114" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-120x120.png"> <link rel="apple-touch-icon" sizes="120x120" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-144x144.png"> <link rel="apple-touch-icon" sizes="144x144" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" sizes="152x152" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/apple-touch-icon-180x180.png"> <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/apple-touch-icon-180x180.png">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon-16x16.png" sizes="16x16"> <link rel="icon" type="image/png" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/manifest.json"> <link rel="manifest" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/manifest.json">
<link rel="shortcut icon" href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/favicon.ico"> <link rel="shortcut icon" href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Dokku"> <meta name="apple-mobile-web-app-title" content="Dokku">
<meta name="application-name" content="Dokku"> <meta name="application-name" content="Dokku">
<meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-TileImage" content="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/mstile-144x144.png"> <meta name="msapplication-TileImage" content="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/mstile-144x144.png">
<meta name="msapplication-config" content="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/favicons/browserconfig.xml"> <meta name="msapplication-config" content="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.rawgit.com/progrium/dokku/v0.4.3/docs/assets/style.css" rel="stylesheet"> <link href="https://cdn.rawgit.com/progrium/dokku/v0.4.4/docs/assets/style.css" rel="stylesheet">
<style> <style>
</style> </style>
</head> </head>
<body> <body>

View File

@@ -46,7 +46,7 @@ The `remote rejected` error does not give enough information. Anything could hav
To enable dokku tracing, simply run the following command: To enable dokku tracing, simply run the following command:
# Since 0.3.9 # Since 0.3.9
dokku trace dokku trace on
In versions older than 0.3.9, you can create a `/home/dokku/dokkurc` file containing the following : In versions older than 0.3.9, you can create a `/home/dokku/dokkurc` file containing the following :

12
dokku
View File

@@ -2,7 +2,15 @@
set -eo pipefail set -eo pipefail
shopt -s nullglob shopt -s nullglob
export DOKKU_DISTRO=${DOKKU_DISTRO:="ubuntu"} case "$(lsb_release -si)" in
Debian)
export DOKKU_DISTRO=${DOKKU_DISTRO:="debian"}
;;
*)
export DOKKU_DISTRO=${DOKKU_DISTRO:="ubuntu"}
;;
esac
export DOKKU_IMAGE=${DOKKU_IMAGE:="gliderlabs/herokuish"} export DOKKU_IMAGE=${DOKKU_IMAGE:="gliderlabs/herokuish"}
export DOKKU_ROOT=${DOKKU_ROOT:=~dokku} export DOKKU_ROOT=${DOKKU_ROOT:=~dokku}
export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"} export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"}
@@ -87,7 +95,7 @@ case "$1" in
DOKKU_DEFAULT_DOCKER_ARGS=$(: | plugn trigger docker-args-deploy $APP $IMAGE_TAG) DOKKU_DEFAULT_DOCKER_ARGS=$(: | plugn trigger docker-args-deploy $APP $IMAGE_TAG)
while read line || [[ -n "$line" ]]; do while read -r line || [[ -n "$line" ]]; do
TRIM=${line%#*} TRIM=${line%#*}
PROC_TYPE=${TRIM%%=*} PROC_TYPE=${TRIM%%=*}
PROC_COUNT=${TRIM#*=} PROC_COUNT=${TRIM#*=}

View File

@@ -193,6 +193,7 @@ case "$1" in
cat<<EOF cat<<EOF
ls, Pretty listing of deployed applications and containers ls, Pretty listing of deployed applications and containers
run <app> <cmd>, Run a command in the environment of an application run <app> <cmd>, Run a command in the environment of an application
trace [on/off], Enable dokku tracing
url <app>, Show the first URL for an application (compatibility) url <app>, Show the first URL for an application (compatibility)
urls <app>, Show all URLs for an application urls <app>, Show all URLs for an application
version, Print dokku's version version, Print dokku's version

View File

@@ -25,7 +25,7 @@ end script
EOF EOF
;; ;;
opensuse) debian|opensuse)
cat<<EOF > /etc/systemd/system/dokku-redeploy.service cat<<EOF > /etc/systemd/system/dokku-redeploy.service
[Unit] [Unit]
Description=Dokku app redeploy service Description=Dokku app redeploy service
@@ -42,7 +42,7 @@ EOF
;; ;;
esac esac
mkdir -p /etc/update-motd.d
cat<<EOF > /etc/update-motd.d/99-dokku cat<<EOF > /etc/update-motd.d/99-dokku
#!/bin/sh #!/bin/sh

View File

@@ -7,7 +7,7 @@ case "$1" in
events) events)
if [[ -f $DOKKU_EVENTS_LOGFILE ]]; then if [[ -f $DOKKU_EVENTS_LOGFILE ]]; then
if [[ $2 == "-t" ]]; then if [[ $2 == "-t" ]]; then
tail -f $DOKKU_EVENTS_LOGFILE tail -F $DOKKU_EVENTS_LOGFILE
else else
tail -n 100 $DOKKU_EVENTS_LOGFILE tail -n 100 $DOKKU_EVENTS_LOGFILE
fi fi

View File

@@ -10,12 +10,26 @@ flag_rsyslog_needs_restart=n
# This can be done unconditionally as mkdir -p # This can be done unconditionally as mkdir -p
# exits gracefully if the path already exists # exits gracefully if the path already exists
mkdir -m 775 -p "$DOKKU_LOGS_DIR" mkdir -m 775 -p "$DOKKU_LOGS_DIR"
chown syslog:dokku "$DOKKU_LOGS_DIR" case "$DOKKU_DISTRO" in
debian)
chgrp dokku "$DOKKU_LOGS_DIR"
;;
*)
chown syslog:dokku "$DOKKU_LOGS_DIR"
;;
esac
if [[ ! -f "$DOKKU_EVENTS_LOGFILE" ]]; then if [[ ! -f "$DOKKU_EVENTS_LOGFILE" ]]; then
touch "$DOKKU_EVENTS_LOGFILE" touch "$DOKKU_EVENTS_LOGFILE"
# chown syslog:root might not work on SUSE case "$DOKKU_DISTRO" in
chown syslog:dokku "$DOKKU_EVENTS_LOGFILE" debian)
chgrp dokku "$DOKKU_EVENTS_LOGFILE"
;;
*)
# chown syslog:root might not work on SUSE
chown syslog:dokku "$DOKKU_EVENTS_LOGFILE"
;;
esac
chmod 664 "$DOKKU_EVENTS_LOGFILE" chmod 664 "$DOKKU_EVENTS_LOGFILE"
fi fi

View File

@@ -31,7 +31,7 @@ case "$1" in
dokku_log_warn "To proceed, type \"$APP\"" dokku_log_warn "To proceed, type \"$APP\""
echo "" echo ""
read -p "> " app_name read -rp "> " app_name
if [[ "$app_name" != "$APP" ]]; then if [[ "$app_name" != "$APP" ]]; then
dokku_log_fail "Confirmation did not match $APP. Aborted." dokku_log_fail "Confirmation did not match $APP. Aborted."
fi fi

View File

@@ -3,7 +3,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
APP="$1"; IMAGE_REPO=$(get_app_image_repo $APP) APP="$1"; IMAGE_REPO=$(get_app_image_repo $APP)
[[ -n $APP ]] && rm -rf "$DOKKU_ROOT/$APP" > /dev/null [[ -n $APP ]] && rm -rf "${DOKKU_ROOT:?}/$APP" > /dev/null
# remove all application containers & images # remove all application containers & images
# shellcheck disable=SC2046 # shellcheck disable=SC2046

View File

@@ -72,7 +72,7 @@ case "$1" in
fi fi
# create all the app directories # create all the app directories
while read app; do mkdir "$TARGET_DIR/$app"; echo "Imported $app"; done < $BACKUP_TMP_DIR/.dokku_backup_apps while read -r app; do mkdir "$TARGET_DIR/$app"; echo "Imported $app"; done < $BACKUP_TMP_DIR/.dokku_backup_apps
# have the plugins import their stuff # have the plugins import their stuff
plugn trigger backup-import $VERSION "$BACKUP_ROOT" $TARGET_DIR "$BACKUP_TMP_DIR/.dokku_backup_apps" plugn trigger backup-import $VERSION "$BACKUP_ROOT" $TARGET_DIR "$BACKUP_TMP_DIR/.dokku_backup_apps"

View File

@@ -108,7 +108,7 @@ fi
# Reads name/value pairs, sets the WAIT and TIMEOUT variables # Reads name/value pairs, sets the WAIT and TIMEOUT variables
exec < "$FILENAME" exec < "$FILENAME"
while read LINE; do while read -r LINE; do
# Name/value pair # Name/value pair
if [[ "$LINE" =~ ^.+= ]]; then if [[ "$LINE" =~ ^.+= ]]; then
TRIM=${LINE%#*} TRIM=${LINE%#*}
@@ -143,7 +143,7 @@ do
fi fi
exec < "$FILENAME" exec < "$FILENAME"
while read CHECK_URL EXPECTED; do while read -r CHECK_URL EXPECTED; do
# Ignore empty lines and lines starting with # # Ignore empty lines and lines starting with #
# shellcheck disable=SC1001 # shellcheck disable=SC1001
[[ -z "$CHECK_URL" || "$CHECK_URL" =~ ^\# ]] && continue [[ -z "$CHECK_URL" || "$CHECK_URL" =~ ^\# ]] && continue

View File

@@ -10,16 +10,16 @@ has_tty() {
} }
dokku_log_info1() { dokku_log_info1() {
echo "-----> $@" echo "-----> $*"
} }
dokku_log_info2() { dokku_log_info2() {
echo "=====> $@" echo "=====> $*"
} }
dokku_log_info1_quiet() { dokku_log_info1_quiet() {
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
echo "-----> $@" echo "-----> $*"
else else
return 0 return 0
fi fi
@@ -27,31 +27,31 @@ dokku_log_info1_quiet() {
dokku_log_info2_quiet() { dokku_log_info2_quiet() {
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
echo "=====> $@" echo "=====> $*"
else else
return 0 return 0
fi fi
} }
dokku_col_log_info1() { dokku_col_log_info1() {
printf "%-25s %-25s %-25s %-25s\n" "-----> $@" printf "%-6s %-18s %-25s %-25s %-25s\n" "----->" "$@"
} }
dokku_col_log_info1_quiet() { dokku_col_log_info1_quiet() {
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
printf "%-25s %-25s %-25s %-25s\n" "-----> $@" printf "%-6s %-18s %-25s %-25s %-25s\n" "----->" "$@"
else else
return 0 return 0
fi fi
} }
dokku_col_log_info2() { dokku_col_log_info2() {
printf "%-25s %-25s %-25s %-25s\n" "=====> $@" printf "%-6s %-18s %-25s %-25s %-25s\n" "=====>" "$@"
} }
dokku_col_log_info2_quiet() { dokku_col_log_info2_quiet() {
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
printf "%-25s %-25s %-25s %-25s\n" "=====> $@" printf "%-6s %-18s %-25s %-25s %-25s\n" "=====>" "$@"
else else
return 0 return 0
fi fi
@@ -71,18 +71,18 @@ dokku_col_log_msg_quiet() {
dokku_log_verbose_quiet() { dokku_log_verbose_quiet() {
if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then if [[ -z "$DOKKU_QUIET_OUTPUT" ]]; then
echo " $@" echo " $*"
else else
return 0 return 0
fi fi
} }
dokku_log_verbose() { dokku_log_verbose() {
echo " $@" echo " $*"
} }
dokku_log_warn() { dokku_log_warn() {
echo " ! $@" echo " ! $*"
} }
dokku_log_fail() { dokku_log_fail() {
@@ -98,7 +98,7 @@ dokku_log_plugn_trigger_call() {
local l_hook local l_hook
l_hook="$1" ; shift l_hook="$1" ; shift
dokku_log_event "INVOKED: ${l_hook}( $@ ) NAME=$NAME FINGERPRINT=$FINGERPRINT" dokku_log_event "INVOKED: ${l_hook}( $* ) NAME=$NAME FINGERPRINT=$FINGERPRINT"
} }
dokku_container_log_verbose_quiet() { dokku_container_log_verbose_quiet() {

View File

@@ -28,7 +28,7 @@ verify_phase() {
return 0 return 0
fi fi
done done
dokku_log_fail "Phase(s) must be one of [${phases[@]}]" dokku_log_fail "Phase(s) must be one of [${phases[*]}]"
} }
get_phase_file_path() { get_phase_file_path() {

View File

@@ -24,7 +24,7 @@ output=""
if [[ -f "$PHASE_FILE_PATH" ]]; then if [[ -f "$PHASE_FILE_PATH" ]]; then
DONE=false DONE=false
until $DONE; do until $DONE; do
read line || DONE=true read -r line || DONE=true
[[ ! -n "$line" ]] && continue [[ ! -n "$line" ]] && continue

View File

@@ -6,7 +6,7 @@ IMPORT_DIR="$2"
TARGET_DIR="$3" TARGET_DIR="$3"
APPS="$4" APPS="$4"
while read APP; do while read -r APP; do
APP_PATH="$TARGET_DIR/$APP"; APP_PATH="$TARGET_DIR/$APP";
git init --bare $APP_PATH > /dev/null git init --bare $APP_PATH > /dev/null
PRERECEIVE_HOOK="$APP_PATH/hooks/pre-receive" PRERECEIVE_HOOK="$APP_PATH/hooks/pre-receive"

View File

@@ -21,10 +21,10 @@ git_build_app_repo() {
find -name .git -prune -exec rm -rf {} \; > /dev/null find -name .git -prune -exec rm -rf {} \; > /dev/null
if [[ -f Dockerfile ]] && [[ "$([[ -f .env ]] && grep -q BUILDPACK_URL .env; echo $?)" != "0" ]] && [[ ! -f ".buildpacks" ]]; then if [[ -f Dockerfile ]] && [[ "$([[ -f .env ]] && grep -q BUILDPACK_URL .env; echo $?)" != "0" ]] && [[ ! -f ".buildpacks" ]]; then
plugn trigger pre-receive-app "$APP" "dockerfile" "$TMP_WORK_DIR" plugn trigger pre-receive-app "$APP" "dockerfile" "$TMP_WORK_DIR" "$REV"
dokku receive "$APP" "dockerfile" "$TMP_WORK_DIR" | sed -u "s/^/"$'\e[1G'"/" dokku receive "$APP" "dockerfile" "$TMP_WORK_DIR" | sed -u "s/^/"$'\e[1G'"/"
else else
plugn trigger pre-receive-app "$APP" "herokuish" "$TMP_WORK_DIR" plugn trigger pre-receive-app "$APP" "herokuish" "$TMP_WORK_DIR" "$REV"
dokku receive "$APP" "herokuish" "$TMP_WORK_DIR" | sed -u "s/^/"$'\e[1G'"/" dokku receive "$APP" "herokuish" "$TMP_WORK_DIR" | sed -u "s/^/"$'\e[1G'"/"
fi fi
} }
@@ -33,7 +33,7 @@ case "$1" in
git-hook) git-hook)
APP=$2 APP=$2
while read oldrev newrev refname; do while read -r oldrev newrev refname; do
# Only run this script for the master branch. You can remove this # Only run this script for the master branch. You can remove this
# if block if you wish to run it for others as well. # if block if you wish to run it for others as well.
if [[ $refname = "refs/heads/master" ]]; then if [[ $refname = "refs/heads/master" ]]; then

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$(dirname "$0")/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/functions" source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/functions"
@@ -11,34 +12,63 @@ case "$1" in
APP_ROOT="$DOKKU_ROOT/$APP" APP_ROOT="$DOKKU_ROOT/$APP"
COLORS=(36 33 32 35 31) COLORS=(36 33 32 35 31)
if (is_deployed "$APP"); then if ! (is_deployed "$APP"); then
CONTAINERS=("$APP_ROOT"/CONTAINER.*)
if [[ $3 == "-t" ]]; then
DOKKU_LOGS_ARGS="--follow --tail 100"
else
DOKKU_LOGS_ARGS="--tail 100"
fi
((MAX_INDEX=${#CONTAINERS[*]} - 1)) || true
for i in ${!CONTAINERS[*]}; do
DYNO=$(echo "${CONTAINERS[i]}" | sed -r 's/.*CONTAINER\.(.*)/\1/')
CID=$(< "${CONTAINERS[i]}")
COLOR=${COLORS[i % ${#COLORS[*]}]}
DOKKU_LOGS_CMD+="(docker logs -t $DOKKU_LOGS_ARGS $CID 2>&1 | sed -r 's/^([^Z]+Z )/\x1b[${COLOR}m\1$APP[$DYNO]:\x1b[0m /gm')"
if [[ $i != "$MAX_INDEX" ]]; then
DOKKU_LOGS_CMD+="& "
else
DOKKU_LOGS_CMD+="; "
fi
done
bash -c "($DOKKU_LOGS_CMD)"
else
echo "Application's container not found" echo "Application's container not found"
exit 1
fi fi
shift 2;
TEMP=$(getopt -o htqn:p: --long help,tail,quiet,num:,ps: -n 'dokku logs' -- "$@")
if [[ $? != 0 ]]; then usage >&2 ; exit 1 ; fi
eval set -- "$TEMP"
DOKKU_LOGS_LINE_NUMBERS="100"
while true; do
case "$1" in
-t|--tail) DOKKU_LOGS_ARGS+="--follow "; shift ;;
-n|--num) DOKKU_LOGS_LINE_NUMBERS="$2"; shift 2 ;;
-p|--ps) DOKKU_LOGS_ONLY_PROCESS="$2"; shift 2 ;;
-q|--quiet) DOKKU_LOGS_NO_PRETTY_PRINT="true"; shift ;;
--) shift; break ;;
*) echo "Internal error"; exit 1;;
esac
done
if [[ -n $DOKKU_LOGS_ONLY_PROCESS ]]; then
CONTAINERS=("$APP_ROOT/CONTAINER.$DOKKU_LOGS_ONLY_PROCESS".*)
else
CONTAINERS=("$APP_ROOT"/CONTAINER.*)
fi
[[ -z $(stat -t "${CONTAINERS[0]}" 2>/dev/null) ]] && exit 0
DOKKU_LOGS_ARGS+="--tail $DOKKU_LOGS_LINE_NUMBERS"
((MAX_INDEX=${#CONTAINERS[*]} - 1)) || true
for i in ${!CONTAINERS[*]}; do
DYNO=$(echo "${CONTAINERS[i]}" | sed -r 's/.*CONTAINER\.(.*)/\1/')
CID=$(< "${CONTAINERS[i]}")
COLOR=${COLORS[i % ${#COLORS[*]}]}
if [[ $DOKKU_LOGS_NO_PRETTY_PRINT == "true" ]]; then
DOKKU_LOGS_CMD+="(docker logs $DOKKU_LOGS_ARGS $CID 2>&1)"
else
DOKKU_LOGS_PRETTY_PRINT_CMD="sed -r 's/^([^Z]+Z )/\x1b[${COLOR}m\1app[$DYNO]:\x1b[0m /gm'"
DOKKU_LOGS_CMD+="(docker logs -t $DOKKU_LOGS_ARGS $CID 2>&1 | $DOKKU_LOGS_PRETTY_PRINT_CMD)"
fi
if [[ $i != "$MAX_INDEX" ]]; then
DOKKU_LOGS_CMD+="& "
else
DOKKU_LOGS_CMD+="; "
fi
done
bash -c "($DOKKU_LOGS_CMD)"
;;
logs:help)
usage
;; ;;
help) help)
cat<<EOF cat<<EOF
logs <app> [-t], Show the last logs for an application (-t follows) logs <app> [-h] [-t] [-n num] [-q] [-p process], Show the last logs for an application
EOF EOF
;; ;;

12
plugins/logs/functions Executable file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
usage() {
echo "Usage: dokku logs <app>"
echo " display recent log output"
echo ""
echo " -n, --num NUM # the number of lines to display"
echo " -p, --ps PS # only display logs from the given process"
echo " -t, --tail # continually stream logs"
echo " -q, --quiet # display raw logs without colors, time and names"
}

View File

@@ -2,6 +2,11 @@
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
debian)
export DEBIAN_FRONTEND=noninteractive
apt-get install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" --force-yes -qq -y nginx dnsutils
;;
ubuntu) ubuntu)
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
[[ -z "$CIRCLECI" ]] && apt-get install -qq -y software-properties-common python-software-properties [[ -z "$CIRCLECI" ]] && apt-get install -qq -y software-properties-common python-software-properties

View File

@@ -114,6 +114,10 @@ validate_nginx() {
restart_nginx() { restart_nginx() {
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
debian)
sudo /usr/sbin/invoke-rc.d nginx reload > /dev/null
;;
ubuntu) ubuntu)
sudo /etc/init.d/nginx reload > /dev/null sudo /etc/init.d/nginx reload > /dev/null
;; ;;
@@ -141,7 +145,7 @@ nginx_build_config() {
if [[ -z "$DOKKU_APP_LISTEN_PORT" ]] && [[ -z "$DOKKU_APP_LISTEN_IP" ]]; then if [[ -z "$DOKKU_APP_LISTEN_PORT" ]] && [[ -z "$DOKKU_APP_LISTEN_IP" ]]; then
shopt -s nullglob shopt -s nullglob
for DOKKU_APP_IP_FILE in $DOKKU_ROOT/$APP/IP.web.*; do for DOKKU_APP_IP_FILE in $DOKKU_ROOT/$APP/IP.web.*; do
DOKKU_APP_PORT_FILE=$(echo $DOKKU_APP_IP_FILE | sed -e "s:IP:PORT:g") DOKKU_APP_PORT_FILE="${DOKKU_APP_IP_FILE//IP/PORT}"
DOKKU_APP_LISTENER_IP=$(< $DOKKU_APP_IP_FILE) DOKKU_APP_LISTENER_IP=$(< $DOKKU_APP_IP_FILE)
DOKKU_APP_LISTENER_PORT=$(< $DOKKU_APP_PORT_FILE) DOKKU_APP_LISTENER_PORT=$(< $DOKKU_APP_PORT_FILE)
@@ -229,7 +233,7 @@ EOF
local NGINX_SSL_PORT=$DOKKU_NGINX_SSL_PORT local NGINX_SSL_PORT=$DOKKU_NGINX_SSL_PORT
fi fi
while read line; do while read -r line; do
[[ -z "$line" ]] && continue [[ -z "$line" ]] && continue
dokku_log_info1 "Configuring SSL for $line..." dokku_log_info1 "Configuring SSL for $line..."
SSL_SERVER_NAME=$line SSL_SERVER_NAME=$line
@@ -250,6 +254,7 @@ EOF
eval "cat <<< \"$(< $NGINX_TEMPLATE)\" >> $NGINX_CONF" eval "cat <<< \"$(< $NGINX_TEMPLATE)\" >> $NGINX_CONF"
fi fi
if [[ "$(is_app_vhost_enabled $APP)" == "false" ]] || ([[ -z "$NONSSL_VHOSTS" ]] && [[ -z "$SSL_VHOSTS" ]]); then if [[ "$(is_app_vhost_enabled $APP)" == "false" ]] || ([[ -z "$NONSSL_VHOSTS" ]] && [[ -z "$SSL_VHOSTS" ]]); then
eval "cat <<< \"$(< $NGINX_TEMPLATE)\" >> $NGINX_CONF"
sed --in-place -n -e '/^.*server_name.*$/!p' $NGINX_CONF sed --in-place -n -e '/^.*server_name.*$/!p' $NGINX_CONF
fi fi

View File

@@ -2,6 +2,10 @@
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
debian)
echo "%dokku ALL=(ALL) NOPASSWD:/usr/sbin/invoke-rc.d nginx reload, /usr/sbin/nginx -t" > /etc/sudoers.d/dokku-nginx
;;
ubuntu) ubuntu)
echo "%dokku ALL=(ALL) NOPASSWD:/etc/init.d/nginx reload, /usr/sbin/nginx -t" > /etc/sudoers.d/dokku-nginx echo "%dokku ALL=(ALL) NOPASSWD:/etc/init.d/nginx reload, /usr/sbin/nginx -t" > /etc/sudoers.d/dokku-nginx
;; ;;
@@ -33,7 +37,7 @@ fi
echo 'server_names_hash_bucket_size 512;' >| /etc/nginx/conf.d/server_names_hash_bucket_size.conf echo 'server_names_hash_bucket_size 512;' >| /etc/nginx/conf.d/server_names_hash_bucket_size.conf
# make sure dokku can read the default log dir # make sure dokku can read the default log dir
gpasswd -M "$(egrep ^adm /etc/group | awk -F ":" '{ print $4 }')" dokku gpasswd -M "$(egrep ^adm: /etc/group | awk -F ":" '{ print $4 }')" dokku
chgrp -R dokku /var/log/nginx chgrp -R dokku /var/log/nginx
chmod g+r /var/log/nginx chmod g+r /var/log/nginx
@@ -41,6 +45,10 @@ chmod g+r /var/log/nginx
[[ -f /etc/logrotate.d/nginx ]] && sed -i -e 's/invoke-rc.d/service/g' /etc/logrotate.d/nginx [[ -f /etc/logrotate.d/nginx ]] && sed -i -e 's/invoke-rc.d/service/g' /etc/logrotate.d/nginx
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
debian)
/usr/sbin/invoke-rc.d nginx start
;;
ubuntu) ubuntu)
/etc/init.d/nginx start /etc/init.d/nginx start
;; ;;

View File

@@ -2,6 +2,10 @@
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
case "$DOKKU_DISTRO" in case "$DOKKU_DISTRO" in
debian)
sudo /usr/sbin/invoke-rc.d nginx reload > /dev/null
;;
ubuntu) ubuntu)
sudo /etc/init.d/nginx reload > /dev/null sudo /etc/init.d/nginx reload > /dev/null
;; ;;

View File

@@ -15,7 +15,7 @@ case "$1" in
[[ "$#" -gt 2 ]] && dokku_log_info1_quiet "Cannot install additional core plugins, running core plugin install trigger" [[ "$#" -gt 2 ]] && dokku_log_info1_quiet "Cannot install additional core plugins, running core plugin install trigger"
PLUGIN_PATH="$PLUGIN_CORE_PATH" plugn trigger install PLUGIN_PATH="$PLUGIN_CORE_PATH" plugn trigger install
;; ;;
https:*|git:*) https:*|git:*|ssh:*)
PLUGIN_GIT_URL="$2" PLUGIN_GIT_URL="$2"
download_and_enable_plugin "$PLUGIN_GIT_URL" "$3" download_and_enable_plugin "$PLUGIN_GIT_URL" "$3"
plugn trigger install plugn trigger install

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
[[ " ps ps:start ps:stop ps:rebuild ps:rebuildall ps:restart ps:restartall ps:scale help ps:help " == *" $1 "* ]] || exit $DOKKU_NOT_IMPLEMENTED_EXIT [[ " ps ps:start ps:stop ps:rebuild ps:rebuildall ps:restart ps:restartall ps:restore ps:scale help ps:help " == *" $1 "* ]] || exit $DOKKU_NOT_IMPLEMENTED_EXIT
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/ps/functions" source "$PLUGIN_AVAILABLE_PATH/ps/functions"
@@ -41,6 +41,7 @@ case "$1" in
if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then
echo "Stopping $APP ..." echo "Stopping $APP ..."
docker stop $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true docker stop $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true
plugn trigger post-stop $APP
else else
echo "App $APP already stopped" echo "App $APP already stopped"
fi fi
@@ -83,6 +84,20 @@ case "$1" in
shopt -u nullglob shopt -u nullglob
;; ;;
ps:restore)
shopt -s nullglob
for app in $DOKKU_ROOT/*; do
[[ ! -d $app ]] && continue
APP=$(basename $app)
DOKKU_APP_RESTORE=$(dokku config:get $APP DOKKU_APP_RESTORE || true)
if [[ $DOKKU_APP_RESTORE != 0 ]]; then
echo "Restoring app $APP ..."
dokku ps:start $APP
fi
done
shopt -u nullglob
;;
ps:scale) ps:scale)
[[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on" [[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on"
APP="$2"; IMAGE_TAG=$(get_running_image_tag $APP) APP="$2"; IMAGE_TAG=$(get_running_image_tag $APP)
@@ -96,7 +111,7 @@ case "$1" in
dokku_log_info1_quiet "Scaling for $APP" dokku_log_info1_quiet "Scaling for $APP"
dokku_col_log_info1_quiet "proctype" "qty" dokku_col_log_info1_quiet "proctype" "qty"
dokku_col_log_info1_quiet "--------" "---" dokku_col_log_info1_quiet "--------" "---"
while read line || [[ -n "$line" ]]; do while read -r line || [[ -n "$line" ]]; do
[[ -z "$line" ]] && continue [[ -z "$line" ]] && continue
PROC_NAME=${line%%=*} PROC_NAME=${line%%=*}
PROC_COUNT=${line#*=} PROC_COUNT=${line#*=}
@@ -118,6 +133,7 @@ case "$1" in
ps:rebuildall, Rebuild all apps ps:rebuildall, Rebuild all apps
ps:restart <app>, Restart app container(s) ps:restart <app>, Restart app container(s)
ps:restartall, Restart all deployed app containers ps:restartall, Restart all deployed app containers
ps:restore, Start previously running apps e.g. after reboot
EOF EOF
;; ;;

View File

@@ -4,7 +4,7 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
print_dokku_scale_file() { print_dokku_scale_file() {
local APP="$1"; local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE" local APP="$1"; local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE"
while read line || [[ -n "$line" ]]; do while read -r line || [[ -n "$line" ]]; do
dokku_log_info2_quiet "$line" dokku_log_info2_quiet "$line"
done < "$DOKKU_SCALE_FILE" done < "$DOKKU_SCALE_FILE"
} }
@@ -25,7 +25,7 @@ generate_scale_file() {
if [[ ! -e "$PROCFILE" ]]; then if [[ ! -e "$PROCFILE" ]]; then
echo "web=1" >> $DOKKU_SCALE_FILE echo "web=1" >> $DOKKU_SCALE_FILE
else else
while read line || [[ -n "$line" ]]; do while read -r line || [[ -n "$line" ]]; do
[[ -z "$line" ]] && continue [[ -z "$line" ]] && continue
NAME=${line%%:*} NAME=${line%%:*}
NUM_PROCS=0 NUM_PROCS=0

8
plugins/ps/post-deploy Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/ps/functions"
APP="$1"
dokku config:set --no-restart $APP DOKKU_APP_RESTORE=1

8
plugins/ps/post-stop Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/ps/functions"
APP="$1"
dokku config:set --no-restart $APP DOKKU_APP_RESTORE=0

View File

@@ -18,7 +18,7 @@ case "$1" in
while true; do while true; do
trap '' SIGINT trap '' SIGINT
read -ep "dokku> " line || { read -rep "dokku> " line || {
echo; true; break echo; true; break
} }
trap - SIGINT trap - SIGINT

View File

@@ -1,10 +1,12 @@
SYSTEM := $(shell sh -c 'uname -s 2>/dev/null')
shellcheck: shellcheck:
ifeq ($(shell shellcheck > /dev/null 2>&1 ; echo $$?),127) ifneq ($(shell shellcheck --version > /dev/null 2>&1 ; echo $$?),0)
ifeq ($(shell uname),Darwin) ifeq ($(SYSTEM),Darwin)
brew install shellcheck brew install shellcheck
else else
sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse' sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse'
sudo apt-get update && sudo apt-get install -y shellcheck sudo apt-get update && sudo apt-get install -y shellcheck
endif endif
endif endif
@@ -53,19 +55,23 @@ ifeq ($(shell grep dokku.me /home/dokku/VHOST 2>/dev/null),)
endif endif
bats: bats:
ifneq ($(shell bats --version > /dev/null 2>&1 ; echo $$?),0)
ifeq ($(SYSTEM),Darwin)
brew install bats
else
git clone https://github.com/sstephenson/bats.git /tmp/bats git clone https://github.com/sstephenson/bats.git /tmp/bats
cd /tmp/bats && sudo ./install.sh /usr/local cd /tmp/bats && sudo ./install.sh /usr/local
rm -rf /tmp/bats rm -rf /tmp/bats
endif
endif
lint: lint:
# these are disabled due to their expansive existence in the codebase. we should clean it up though # these are disabled due to their expansive existence in the codebase. we should clean it up though
# SC2034: VAR appears unused - https://github.com/koalaman/shellcheck/wiki/SC2034 # SC2034: VAR appears unused - https://github.com/koalaman/shellcheck/wiki/SC2034
# SC2086: Double quote to prevent globbing and word splitting - https://github.com/koalaman/shellcheck/wiki/SC2086 # SC2086: Double quote to prevent globbing and word splitting - https://github.com/koalaman/shellcheck/wiki/SC2086
# SC2143: Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar - https://github.com/koalaman/shellcheck/wiki/SC2143
# SC2001: See if you can use ${variable//search/replace} instead. - https://github.com/koalaman/shellcheck/wiki/SC2001
@echo linting... @echo linting...
@$(QUIET) shellcheck -e SC2029 ./contrib/dokku_client.sh @$(QUIET) shellcheck ./contrib/dokku_client.sh
@$(QUIET) find . -not -path '*/\.*' | xargs file | egrep "shell|bash" | egrep -v "directory|toml" | awk '{ print $$1 }' | sed 's/://g' | grep -v dokku_client.sh | xargs shellcheck -e SC2034,SC2086,SC2143,SC2001 @$(QUIET) find . -not -path '*/\.*' | xargs file | egrep "shell|bash" | egrep -v "directory|toml" | awk '{ print $$1 }' | sed 's/://g' | grep -v dokku_client.sh | xargs shellcheck -e SC2034,SC2086
unit-tests: unit-tests:
@echo running unit tests... @echo running unit tests...

View File

@@ -1 +1,2 @@
#!/usr/bin/env bash
set -e; sleep 5; output="$(curl -s -S $1)"; echo $output; test "$output" == "Hello World!" set -e; sleep 5; output="$(curl -s -S $1)"; echo $output; test "$output" == "Hello World!"

View File

@@ -19,6 +19,8 @@ flunk() {
return 1 return 1
} }
# ShellCheck doesn't know about $status from Bats
# shellcheck disable=SC2154
assert_success() { assert_success() {
if [[ "$status" -ne 0 ]]; then if [[ "$status" -ne 0 ]]; then
flunk "command failed with exit status $status" flunk "command failed with exit status $status"
@@ -43,6 +45,8 @@ assert_equal() {
fi fi
} }
# ShellCheck doesn't know about $output from Bats
# shellcheck disable=SC2154
assert_output() { assert_output() {
local expected local expected
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
@@ -53,6 +57,8 @@ assert_output() {
assert_equal "$expected" "$output" assert_equal "$expected" "$output"
} }
# ShellCheck doesn't know about $lines from Bats
# shellcheck disable=SC2154
assert_line() { assert_line() {
if [[ "$1" -ge 0 ]] 2>/dev/null; then if [[ "$1" -ge 0 ]] 2>/dev/null; then
assert_equal "$2" "${lines[$1]}" assert_equal "$2" "${lines[$1]}"
@@ -112,7 +118,7 @@ deploy_app() {
GIT_REMOTE="$2"; GIT_REMOTE=${GIT_REMOTE:="dokku@dokku.me:$TEST_APP"} GIT_REMOTE="$2"; GIT_REMOTE=${GIT_REMOTE:="dokku@dokku.me:$TEST_APP"}
TMP=$(mktemp -d -t "dokku.me.XXXXX") TMP=$(mktemp -d -t "dokku.me.XXXXX")
rmdir $TMP && cp -r ./tests/apps/$APP_TYPE $TMP rmdir $TMP && cp -r ./tests/apps/$APP_TYPE $TMP
cd $TMP cd $TMP || exit 1
git init git init
git config user.email "robot@example.com" git config user.email "robot@example.com"
git config user.name "Test Robot" git config user.name "Test Robot"
@@ -128,7 +134,7 @@ deploy_app() {
setup_client_repo() { setup_client_repo() {
TMP=$(mktemp -d -t "dokku.me.XXXXX") TMP=$(mktemp -d -t "dokku.me.XXXXX")
rmdir $TMP && cp -r ./tests/apps/nodejs-express $TMP rmdir $TMP && cp -r ./tests/apps/nodejs-express $TMP
cd $TMP cd $TMP || exit 1
git init git init
git config user.email "robot@example.com" git config user.email "robot@example.com"
git config user.name "Test Robot" git config user.name "Test Robot"