Compare commits
91 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c3de8c628 | ||
|
|
99dd31ceeb | ||
|
|
b983afe9fa | ||
|
|
ef64210821 | ||
|
|
dcb880b0f2 | ||
|
|
b26aec249c | ||
|
|
3903b8a331 | ||
|
|
5f192ec3a1 | ||
|
|
f42972fc3c | ||
|
|
f4f3d4adc6 | ||
|
|
7e0a8dca94 | ||
|
|
23322b6dde | ||
|
|
fbf136bbe3 | ||
|
|
952e7c6fda | ||
|
|
ae10527b8a | ||
|
|
b4d0456f5f | ||
|
|
3f28c24b57 | ||
|
|
9da3b4e155 | ||
|
|
dded26625b | ||
|
|
515eb372a4 | ||
|
|
abe06b3d84 | ||
|
|
229d97e502 | ||
|
|
51cd7fd85e | ||
|
|
9a52cbdd27 | ||
|
|
7d5c242fa9 | ||
|
|
e665243ae1 | ||
|
|
6f79fb2e87 | ||
|
|
211f0ef049 | ||
|
|
07aa343140 | ||
|
|
ab658ec274 | ||
|
|
a2eab242b6 | ||
|
|
321b94db19 | ||
|
|
e17f87d62d | ||
|
|
4fc23a8ffb | ||
|
|
044027e31b | ||
|
|
e4be7e38ad | ||
|
|
5a93e875a3 | ||
|
|
24fdc0a778 | ||
|
|
3db3bfb150 | ||
|
|
37036ec2fa | ||
|
|
4b94a37f72 | ||
|
|
db4d8dba88 | ||
|
|
cc9d76aa11 | ||
|
|
97bbded5bb | ||
|
|
a95e5d210d | ||
|
|
0f7b24fcc7 | ||
|
|
3a2e9973b6 | ||
|
|
5b5f6031b2 | ||
|
|
96a2ec01f5 | ||
|
|
9473ac5f38 | ||
|
|
d803dbb84a | ||
|
|
5981ff8e9b | ||
|
|
b3d7174a7a | ||
|
|
9ea888f62e | ||
|
|
2ba5c9df50 | ||
|
|
d30fb7b85c | ||
|
|
0a895b2d11 | ||
|
|
20ed65efdd | ||
|
|
27769f54b0 | ||
|
|
0748b3eec8 | ||
|
|
469156ac98 | ||
|
|
6f5f3fa908 | ||
|
|
fe84ec08a8 | ||
|
|
f6cd3f5c89 | ||
|
|
88c1abc608 | ||
|
|
a937e6de50 | ||
|
|
5d36264dd2 | ||
|
|
af88aabfb6 | ||
|
|
4491142a7b | ||
|
|
5df4bd710a | ||
|
|
a41cb46b77 | ||
|
|
7477f6438a | ||
|
|
ed2c4493a4 | ||
|
|
2ed14fc81c | ||
|
|
978e2fd702 | ||
|
|
712954560a | ||
|
|
5e648c29ed | ||
|
|
ea84e4d5e4 | ||
|
|
f2a32ae0f6 | ||
|
|
358b02ac39 | ||
|
|
268c318bc5 | ||
|
|
f87cd22340 | ||
|
|
b1223cd6cc | ||
|
|
9fb4ce6cb4 | ||
|
|
d73eee201d | ||
|
|
dd900a3975 | ||
|
|
9452699aaf | ||
|
|
f2081505eb | ||
|
|
857724984e | ||
|
|
4e36ab9361 | ||
|
|
b3ac4f36f7 |
@@ -1,4 +1,4 @@
|
|||||||
FROM phusion/baseimage:focal-1.1.0
|
FROM phusion/baseimage:focal-1.2.0
|
||||||
|
|
||||||
CMD ["/sbin/my_init"]
|
CMD ["/sbin/my_init"]
|
||||||
|
|
||||||
|
|||||||
120
HISTORY.md
120
HISTORY.md
@@ -1,5 +1,125 @@
|
|||||||
# History
|
# History
|
||||||
|
|
||||||
|
## 0.27.7
|
||||||
|
|
||||||
|
Install/update via the bootstrap script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.7/bootstrap.sh
|
||||||
|
sudo DOKKU_TAG=v0.27.7 bash bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- #5238: @josegonzalez Respect dokku system user/group when setting storage permissions on installation
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- #5239: @josegonzalez Add builder-type and image-stage labels to all images
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- #5241: @josegonzalez Clarify where logs are pulled from and general log shipping stance
|
||||||
|
- #5237: @josegonzalez Fix builder-pack:set command example
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
- #5235: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 220 to 221 in /tests/apps/php
|
||||||
|
|
||||||
|
## 0.27.6
|
||||||
|
|
||||||
|
Install/update via the bootstrap script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.6/bootstrap.sh
|
||||||
|
sudo DOKKU_TAG=v0.27.6 bash bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- #5225: @josegonzalez Use original app name when setting include_labels for vector source
|
||||||
|
- #5228: @josegonzalez Always respect app.json formations in scale settings
|
||||||
|
- #5201: @josegonzalez Use pack as default builder for arm64 servers
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- #5230: @josegonzalez Clarify usage of build args to set environment variables for Dockerfile deploys
|
||||||
|
- #5208: @asokoloski-m Fix typo in dockerfile builder docs
|
||||||
|
- #5206: @AxelTheGerman Added dokku-litestream to list of community plugins
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
- #5218: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 219 to 220 in /tests/apps/php
|
||||||
|
- #5222: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.10 to 11.0.11 in /tests/apps/java
|
||||||
|
- #5224: @josegonzalez Document that the community registry plugin should be uninstalled before upgrading past 0.24.x
|
||||||
|
- #5220: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.9 to 11.0.10 in /tests/apps/java
|
||||||
|
- #5212: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 218 to 219 in /tests/apps/php
|
||||||
|
- #5210: @dependabot[bot] chore(deps): bump monolog/monolog from 1.27.0 to 1.27.1 in /tests/apps/php
|
||||||
|
- #5204: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 217 to 218 in /tests/apps/php
|
||||||
|
|
||||||
|
## 0.27.5
|
||||||
|
|
||||||
|
Install/update via the bootstrap script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.5/bootstrap.sh
|
||||||
|
sudo DOKKU_TAG=v0.27.5 bash bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- #5183: @josegonzalez Filter apps when verifying app names
|
||||||
|
- #5199: @josegonzalez Revert "fix: Vector fails to start container due to --watch-config flag"
|
||||||
|
- #5197: @holamendi fix: Vector fails to start container due to --watch-config flag
|
||||||
|
- #5192: @josegonzalez Confirm installation of universe packages when installing on ubuntu
|
||||||
|
- #5193: @josegonzalez Force-set correct permissions on env files
|
||||||
|
- #5181: @josegonzalez Ensure we default SSH_NAME to NAME when filtering apps
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
- #5196: @josegonzalez Disable herokuish usage on both armhf and arm64 platforms
|
||||||
|
- #5194: @josegonzalez Upgrade base Dockerfile image to phusion/baseimage:focal-1.2.0
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
- #5200: @dependabot[bot] chore(deps): bump rack from 2.2.3 to 2.2.3.1 in /tests/apps/ruby
|
||||||
|
- #5198: @dependabot[bot] chore(deps): bump grunt from 1.5.2 to 1.5.3 in /tests/apps/multi
|
||||||
|
- #5187: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 216 to 217 in /tests/apps/php
|
||||||
|
|
||||||
|
## 0.27.4
|
||||||
|
|
||||||
|
Install/update via the bootstrap script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.4/bootstrap.sh
|
||||||
|
sudo DOKKU_TAG=v0.27.4 bash bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- #5180: @Bilal-io fixes rst-versions height
|
||||||
|
|
||||||
|
## 0.27.3
|
||||||
|
|
||||||
|
Install/update via the bootstrap script:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.3/bootstrap.sh
|
||||||
|
sudo DOKKU_TAG=v0.27.3 bash bootstrap.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- #5178: @josegonzalez Fix app filtering for authenticated usage
|
||||||
|
- #5173: @bitjockey42 Add 22.04 to supported distro versions
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- #5179: @Bilal-io Fixes to the Docs version switcher
|
||||||
|
- #5177: @josegonzalez docs: cleanup experimental warning in scheduler docs
|
||||||
|
- #5176: @josegonzalez Update installation requirements to mention arm64 and ubuntu 22.04
|
||||||
|
- #5174: @vladdoster Fix typos and phrasing in remote commands documentation
|
||||||
|
|
||||||
## 0.27.2
|
## 0.27.2
|
||||||
|
|
||||||
Install/update via the bootstrap script:
|
Install/update via the bootstrap script:
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ Otherwise, you will need to import the keypair manually after installation using
|
|||||||
To install the latest stable release, run the following commands as a user who has access to `sudo`:
|
To install the latest stable release, run the following commands as a user who has access to `sudo`:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.2/bootstrap.sh
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.7/bootstrap.sh
|
||||||
sudo DOKKU_TAG=v0.27.2 bash bootstrap.sh
|
sudo DOKKU_TAG=v0.27.7 bash bootstrap.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
You can then proceed to configure your server domain (via `dokku domains:set-global`) and user access (via `dokku ssh-keys:add`) to complete the installation.
|
You can then proceed to configure your server domain (via `dokku domains:set-global`) and user access (via `dokku ssh-keys:add`) to complete the installation.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ set -eo pipefail
|
|||||||
# That's good because it prevents our output overlapping with wget's.
|
# That's good because it prevents our output overlapping with wget's.
|
||||||
# It also means that we can't run a partially downloaded script.
|
# It also means that we can't run a partially downloaded script.
|
||||||
|
|
||||||
SUPPORTED_VERSIONS="Debian [9, 10, 11], CentOS [7], Fedora (partial) [33, 34], Ubuntu [18.04, 20.04]"
|
SUPPORTED_VERSIONS="Debian [9, 10, 11], CentOS [7], Fedora (partial) [33, 34], Ubuntu [18.04, 20.04, 22.04]"
|
||||||
|
|
||||||
log-fail() {
|
log-fail() {
|
||||||
declare desc="log fail formatter"
|
declare desc="log fail formatter"
|
||||||
@@ -63,7 +63,7 @@ install-requirements() {
|
|||||||
apt-get -qq -y --no-install-recommends install software-properties-common
|
apt-get -qq -y --no-install-recommends install software-properties-common
|
||||||
fi
|
fi
|
||||||
|
|
||||||
add-apt-repository universe >/dev/null
|
add-apt-repository -y universe >/dev/null
|
||||||
apt-get update -qq >/dev/null
|
apt-get update -qq >/dev/null
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -163,7 +163,7 @@ install-dokku-from-deb-package() {
|
|||||||
local NO_INSTALL_RECOMMENDS=${DOKKU_NO_INSTALL_RECOMMENDS:=""}
|
local NO_INSTALL_RECOMMENDS=${DOKKU_NO_INSTALL_RECOMMENDS:=""}
|
||||||
local OS_ID
|
local OS_ID
|
||||||
|
|
||||||
if ! in-array "$DOKKU_DISTRO_VERSION" "18.04" "20.04" "9" "10" "11"; then
|
if ! in-array "$DOKKU_DISTRO_VERSION" "18.04" "20.04" "22.04" "9" "10" "11"; then
|
||||||
log-fail "Unsupported Linux distribution. Only the following versions are supported: $SUPPORTED_VERSIONS"
|
log-fail "Unsupported Linux distribution. Only the following versions are supported: $SUPPORTED_VERSIONS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
2
debian/control
vendored
2
debian/control
vendored
@@ -1,5 +1,5 @@
|
|||||||
Package: dokku
|
Package: dokku
|
||||||
Version: 0.27.2
|
Version: 0.27.7
|
||||||
Section: web
|
Section: web
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Architecture: amd64
|
Architecture: amd64
|
||||||
|
|||||||
@@ -35,35 +35,35 @@ dokku plugin:list
|
|||||||
|
|
||||||
```
|
```
|
||||||
plugn: dev
|
plugn: dev
|
||||||
00_dokku-standard 0.27.2 enabled dokku core standard plugin
|
00_dokku-standard 0.27.7 enabled dokku core standard plugin
|
||||||
20_events 0.27.2 enabled dokku core events logging plugin
|
20_events 0.27.7 enabled dokku core events logging plugin
|
||||||
app-json 0.27.2 enabled dokku core app-json plugin
|
app-json 0.27.7 enabled dokku core app-json plugin
|
||||||
apps 0.27.2 enabled dokku core apps plugin
|
apps 0.27.7 enabled dokku core apps plugin
|
||||||
build-env 0.27.2 enabled dokku core build-env plugin
|
build-env 0.27.7 enabled dokku core build-env plugin
|
||||||
buildpacks 0.27.2 enabled dokku core buildpacks plugin
|
buildpacks 0.27.7 enabled dokku core buildpacks plugin
|
||||||
certs 0.27.2 enabled dokku core certificate management plugin
|
certs 0.27.7 enabled dokku core certificate management plugin
|
||||||
checks 0.27.2 enabled dokku core checks plugin
|
checks 0.27.7 enabled dokku core checks plugin
|
||||||
common 0.27.2 enabled dokku core common plugin
|
common 0.27.7 enabled dokku core common plugin
|
||||||
config 0.27.2 enabled dokku core config plugin
|
config 0.27.7 enabled dokku core config plugin
|
||||||
docker-options 0.27.2 enabled dokku core docker-options plugin
|
docker-options 0.27.7 enabled dokku core docker-options plugin
|
||||||
domains 0.27.2 enabled dokku core domains plugin
|
domains 0.27.7 enabled dokku core domains plugin
|
||||||
enter 0.27.2 enabled dokku core enter plugin
|
enter 0.27.7 enabled dokku core enter plugin
|
||||||
git 0.27.2 enabled dokku core git plugin
|
git 0.27.7 enabled dokku core git plugin
|
||||||
logs 0.27.2 enabled dokku core logs plugin
|
logs 0.27.7 enabled dokku core logs plugin
|
||||||
network 0.27.2 enabled dokku core network plugin
|
network 0.27.7 enabled dokku core network plugin
|
||||||
nginx-vhosts 0.27.2 enabled dokku core nginx-vhosts plugin
|
nginx-vhosts 0.27.7 enabled dokku core nginx-vhosts plugin
|
||||||
plugin 0.27.2 enabled dokku core plugin plugin
|
plugin 0.27.7 enabled dokku core plugin plugin
|
||||||
proxy 0.27.2 enabled dokku core proxy plugin
|
proxy 0.27.7 enabled dokku core proxy plugin
|
||||||
ps 0.27.2 enabled dokku core ps plugin
|
ps 0.27.7 enabled dokku core ps plugin
|
||||||
repo 0.27.2 enabled dokku core repo plugin
|
repo 0.27.7 enabled dokku core repo plugin
|
||||||
resource 0.27.2 enabled dokku core resource plugin
|
resource 0.27.7 enabled dokku core resource plugin
|
||||||
scheduler-docker-local 0.27.2 enabled dokku core scheduler-docker-local plugin
|
scheduler-docker-local 0.27.7 enabled dokku core scheduler-docker-local plugin
|
||||||
shell 0.27.2 enabled dokku core shell plugin
|
shell 0.27.7 enabled dokku core shell plugin
|
||||||
ssh-keys 0.27.2 enabled dokku core ssh-keys plugin
|
ssh-keys 0.27.7 enabled dokku core ssh-keys plugin
|
||||||
storage 0.27.2 enabled dokku core storage plugin
|
storage 0.27.7 enabled dokku core storage plugin
|
||||||
tags 0.27.2 enabled dokku core tags plugin
|
tags 0.27.7 enabled dokku core tags plugin
|
||||||
tar 0.27.2 enabled dokku core tar plugin
|
tar 0.27.7 enabled dokku core tar plugin
|
||||||
trace 0.27.2 enabled dokku core trace plugin
|
trace 0.27.7 enabled dokku core trace plugin
|
||||||
```
|
```
|
||||||
|
|
||||||
> Warning: All plugin commands other than `plugin:list` and `plugin:help` require sudo access and must be run directly from the Dokku server.
|
> Warning: All plugin commands other than `plugin:list` and `plugin:help` require sudo access and must be run directly from the Dokku server.
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ The [dokku-registry](https://github.com/dokku/dokku-registry) plugin is now buil
|
|||||||
- At this time, remote docker repositories are not automatically created for AWS, and users must create those repositories for their applications as necessary. This may be implemented in the future.
|
- At this time, remote docker repositories are not automatically created for AWS, and users must create those repositories for their applications as necessary. This may be implemented in the future.
|
||||||
- Docker images are only pushed when configured to do so. See the [registry management documentation](/docs/deployment/registry-management.md) for more details.
|
- Docker images are only pushed when configured to do so. See the [registry management documentation](/docs/deployment/registry-management.md) for more details.
|
||||||
|
|
||||||
|
Before upgrading, uninstall the registry plugin via `dokku plugin:uninstall registry`. Not doing so will cause issues with Dokku.
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
<browserconfig>
|
<browserconfig>
|
||||||
<msapplication>
|
<msapplication>
|
||||||
<tile>
|
<tile>
|
||||||
<square70x70logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-70x70.png"/>
|
<square70x70logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-70x70.png"/>
|
||||||
<square150x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-150x150.png"/>
|
<square150x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-150x150.png"/>
|
||||||
<square310x310logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-310x310.png"/>
|
<square310x310logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-310x310.png"/>
|
||||||
<wide310x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-310x150.png"/>
|
<wide310x150logo src="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-310x150.png"/>
|
||||||
<TileColor>#da532c</TileColor>
|
<TileColor>#da532c</TileColor>
|
||||||
</tile>
|
</tile>
|
||||||
</msapplication>
|
</msapplication>
|
||||||
|
|||||||
@@ -2,37 +2,37 @@
|
|||||||
"name": "Dokku",
|
"name": "Dokku",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-36x36.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/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.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-48x48.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/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.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-72x72.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/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.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-96x96.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/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.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-144x144.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/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.jsdelivr.net\/dokku\/dokku@v0.27.2\/docs\/assets\/favicons\/android-chrome-192x192.png",
|
"src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.27.7\/docs\/assets\/favicons\/android-chrome-192x192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image\/png",
|
"type": "image\/png",
|
||||||
"density": "4.0"
|
"density": "4.0"
|
||||||
|
|||||||
@@ -42,13 +42,13 @@ h1 {
|
|||||||
font-size: 1.6em;
|
font-size: 1.6em;
|
||||||
}
|
}
|
||||||
.header .navbar-brand a {
|
.header .navbar-brand a {
|
||||||
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/dokku.png);
|
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/dokku.png);
|
||||||
text-indent: 40px;
|
text-indent: 40px;
|
||||||
}
|
}
|
||||||
.blurb {
|
.blurb {
|
||||||
color: #424242;
|
color: #424242;
|
||||||
background-color: #ededed;
|
background-color: #ededed;
|
||||||
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/gplaypattern.png);
|
background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/gplaypattern.png);
|
||||||
padding: 45px 0;
|
padding: 45px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
@@ -542,10 +542,14 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
|
|||||||
left: auto;
|
left: auto;
|
||||||
max-height: 600px;
|
max-height: 600px;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
overflow: scroll;
|
overflow: hidden;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
.rst-versions.rst-badge.shift-up {
|
||||||
|
overflow-y: scroll;
|
||||||
|
height: calc(100vh - 100px);
|
||||||
|
}
|
||||||
.rst-versions.rst-badge .icon-book {
|
.rst-versions.rst-badge .icon-book {
|
||||||
float: none
|
float: none
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,6 @@
|
|||||||
"0.24.10",
|
"0.24.10",
|
||||||
"0.25.7",
|
"0.25.7",
|
||||||
"0.26.8",
|
"0.26.8",
|
||||||
"0.27.2"
|
"0.27.7"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ The following plugins are available and provided by Dokku maintainers. Please f
|
|||||||
| [Haproxy tcp load balancer](https://github.com/256dpi/dokku-haproxy) | [256dpi][] | 0.4.0+ |
|
| [Haproxy tcp load balancer](https://github.com/256dpi/dokku-haproxy) | [256dpi][] | 0.4.0+ |
|
||||||
| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
|
| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
|
||||||
| [HTTP Auth Secure Apps](https://github.com/matto1990/dokku-secure-apps) | [matto1990][] | 0.4.0+ |
|
| [HTTP Auth Secure Apps](https://github.com/matto1990/dokku-secure-apps) | [matto1990][] | 0.4.0+ |
|
||||||
|
| [Litestream](https://github.com/AxelTheGerman/dokku-litestream)<sup>2</sup> | [AxelTheGerman][] | 0.27.0+ |
|
||||||
| [Monit (Health Checks)](https://github.com/mbreit/dokku-monit) | [mbreit][] | 0.8.0+ |
|
| [Monit (Health Checks)](https://github.com/mbreit/dokku-monit) | [mbreit][] | 0.8.0+ |
|
||||||
| [Nuke Containers](https://github.com/josegonzalez/dokku-nuke) | [josegonzalez][] | 0.4.0+ |
|
| [Nuke Containers](https://github.com/josegonzalez/dokku-nuke) | [josegonzalez][] | 0.4.0+ |
|
||||||
| [Open App Ports](https://github.com/josegonzalez/dokku-ports) | [josegonzalez][] | 0.3.x |
|
| [Open App Ports](https://github.com/josegonzalez/dokku-ports) | [josegonzalez][] | 0.3.x |
|
||||||
@@ -116,13 +117,15 @@ The following plugins are available and provided by Dokku maintainers. Please f
|
|||||||
|
|
||||||
<sup>1</sup> Extends app.json support to include creating volumes and creating / linking databases on push
|
<sup>1</sup> Extends app.json support to include creating volumes and creating / linking databases on push
|
||||||
|
|
||||||
<sup>2</sup> Adds the possibility to add SSH deployment keys to receive private hosted packages
|
<sup>2</sup> Adds SQLite replication to external object storage via [Litestream](https://litestream.io)
|
||||||
|
|
||||||
<sup>3</sup> Adds the ability to add custom hosts to the containers known_hosts file to be able to ssh them easily (useful with deployment keys)
|
<sup>3</sup> Adds the possibility to add SSH deployment keys to receive private hosted packages
|
||||||
|
|
||||||
<sup>4</sup> Adds the ability to sync an application repo with a remote GitHub repo (useful for automated rebuilds without needing a git push from an external system
|
<sup>4</sup> Adds the ability to add custom hosts to the containers known_hosts file to be able to ssh them easily (useful with deployment keys)
|
||||||
|
|
||||||
<sup>5</sup> Adds the ability to invoke a post-deploy webhook with the IP, port and app name, all with a single config:set).
|
<sup>5</sup> Adds the ability to sync an application repo with a remote GitHub repo (useful for automated rebuilds without needing a git push from an external system
|
||||||
|
|
||||||
|
<sup>6</sup> Adds the ability to invoke a post-deploy webhook with the IP, port and app name, all with a single config:set).
|
||||||
|
|
||||||
### Other Plugins
|
### Other Plugins
|
||||||
|
|
||||||
@@ -238,6 +241,7 @@ The following plugins are no longer maintained by their developers.
|
|||||||
[aomitayo]: https://github.com/aomitayo
|
[aomitayo]: https://github.com/aomitayo
|
||||||
[apmorton]: https://github.com/apmorton
|
[apmorton]: https://github.com/apmorton
|
||||||
[artofrawr]: https://github.com/artofrawr
|
[artofrawr]: https://github.com/artofrawr
|
||||||
|
[AxelTheGerman]: https://github.com/AxelTheGerman
|
||||||
[badsyntax]: https://github.com/badsyntax
|
[badsyntax]: https://github.com/badsyntax
|
||||||
[basgys]: https://github.com/basgys
|
[basgys]: https://github.com/basgys
|
||||||
[benjamin-dobell]: https://github.com/benjamin-dobell
|
[benjamin-dobell]: https://github.com/benjamin-dobell
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ config:keys (<app>|--global) [--merged]
|
|||||||
config:set [--encoded] [--no-restart] (<app>|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars
|
config:set [--encoded] [--no-restart] (<app>|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars
|
||||||
config:unset [--no-restart] (<app>|--global) KEY1 [KEY2 ...] Unset one or more config vars
|
config:unset [--no-restart] (<app>|--global) KEY1 [KEY2 ...] Unset one or more config vars
|
||||||
```
|
```
|
||||||
> For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available _only_ during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860).
|
> For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available _only_ during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860). Consider using [build arguments](/docs/deployment/builders/dockerfiles.md#build-time-configuration-variables) to expose variables during build-time for Dockerfile apps.
|
||||||
|
|
||||||
Environment variables are available both at run time and during the application build/compilation step for buildpack-based deploys.
|
Environment variables are available both at run time and during the application build/compilation step for buildpack-based deploys.
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ dokku builder-pack:set --global projecttoml-path
|
|||||||
You can get a report about the app's storage status using the `builder-pack:report` command:
|
You can get a report about the app's storage status using the `builder-pack:report` command:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dokku app-json:report
|
dokku builder-pack:report
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ dokku builder-dockerfile:set --global dockerfile-path
|
|||||||
You can get a report about the app's storage status using the `builder-dockerfile:report` command:
|
You can get a report about the app's storage status using the `builder-dockerfile:report` command:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dokku app-json:report
|
dokku builder-dockerfile:report
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ You can easily get logs of an app using the `logs` command:
|
|||||||
dokku logs node-js-app
|
dokku logs node-js-app
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Logs are pulled via integration with the scheduler for the specified application via "live tailing". As such, logs from previously running deployments are usually not available. Users that desire to see logs from previous deployments for debugging purposes should persist those logs to external services. Please see Dokku's [vector integration](deployment/logs.md#vector-logging-shipping) for more information on how to persist logs across deployments to ship logs to another service or a third-party platform.
|
||||||
|
|
||||||
#### Behavioral modifiers
|
#### Behavioral modifiers
|
||||||
|
|
||||||
Dokku also supports certain command-line arguments that augment the `log` command's behavior.
|
Dokku also supports certain command-line arguments that augment the `log` command's behavior.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Dokku commands can be run over SSH. Anywhere you would run `dokku <command>`, just run `ssh -t dokku@dokku.me <command>`
|
Dokku commands can be run over SSH. Anywhere you would run `dokku <command>`, just run `ssh -t dokku@dokku.me <command>`
|
||||||
The `-t` is used to request a pty. It is highly recommended to do so.
|
The `-t` is used to request a pty. It is highly recommended to do so.
|
||||||
To avoid the need to type the `-t` option each time, simply create/modify a section in the `.ssh/config` on the client side, as follows:
|
To avoid the need to type the `-t` option each time, create/modify a section in the `.ssh/config` on the client side, as follows:
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
Host dokku.me
|
Host dokku.me
|
||||||
@@ -12,7 +12,7 @@ Host dokku.me
|
|||||||
## Behavioral modifiers
|
## Behavioral modifiers
|
||||||
|
|
||||||
Dokku also supports certain command line arguments that augment its behavior. If using these over SSH, you must use the form `ssh -t dokku@dokku.me -- <command>`
|
Dokku also supports certain command line arguments that augment its behavior. If using these over SSH, you must use the form `ssh -t dokku@dokku.me -- <command>`
|
||||||
in order to avoid SSH interpretting Dokku arguments for itself.
|
to avoid SSH interpreting Dokku arguments for itself.
|
||||||
|
|
||||||
```
|
```
|
||||||
--quiet suppress output headers
|
--quiet suppress output headers
|
||||||
@@ -71,7 +71,7 @@ All commands have the application name automatically set via the `--app` flag on
|
|||||||
|
|
||||||
The client supports several environment variables:
|
The client supports several environment variables:
|
||||||
|
|
||||||
- `DOKKU_HOST` (default: `dokku` git remote): Used to interact with a specific remote server. Can be overriden via `--remote` flag.
|
- `DOKKU_HOST` (default: `dokku` git remote): Used to interact with a specific remote server. Can be overridden via the `--remote` flag.
|
||||||
- `DOKKU_PORT` (default: `22`): Used to specify a port to connect to the Dokku server on.
|
- `DOKKU_PORT` (default: `22`): Used to specify a port to connect to the Dokku server on.
|
||||||
|
|
||||||
It also supports several flags (all flags unspecified here are passed as is to the server):
|
It also supports several flags (all flags unspecified here are passed as is to the server):
|
||||||
|
|||||||
@@ -91,7 +91,11 @@ Omitting or removing the entry will result in parallelism for that process type
|
|||||||
|
|
||||||
Note that increasing the value of `max_parallel` may significantly impact CPU utilization on your host as your app containers - and their respective processes - start up. Setting a value higher than the number of available CPUs is discouraged. It is recommended that users carefully set this value so as not to overburden their server.
|
Note that increasing the value of `max_parallel` may significantly impact CPU utilization on your host as your app containers - and their respective processes - start up. Setting a value higher than the number of available CPUs is discouraged. It is recommended that users carefully set this value so as not to overburden their server.
|
||||||
|
|
||||||
## Implemented Triggers
|
## Scheduler Interface
|
||||||
|
|
||||||
|
The following sections describe implemented scheduler functionality for the `docker-local` scheduler.
|
||||||
|
|
||||||
|
### Implemented Commands and Triggers
|
||||||
|
|
||||||
This plugin implements various functionality through `plugn` triggers to integrate with Docker for running apps on a single server. The following functionality is supported by the `scheduler-docker-local` plugin.
|
This plugin implements various functionality through `plugn` triggers to integrate with Docker for running apps on a single server. The following functionality is supported by the `scheduler-docker-local` plugin.
|
||||||
|
|
||||||
@@ -105,11 +109,16 @@ This plugin implements various functionality through `plugn` triggers to integra
|
|||||||
- `ps:stop`
|
- `ps:stop`
|
||||||
- `run`
|
- `run`
|
||||||
|
|
||||||
## Supported Resource Management Properties
|
|
||||||
|
### Logging support
|
||||||
|
|
||||||
|
App logs for the `logs` command are fetched from running containers via the `docker` cli. To persist logs across deployments, consider using Dokku's [vector integration](deployment/logs.md#vector-logging-shipping) to ship logs to another service or a third-party platform.
|
||||||
|
|
||||||
|
### Supported Resource Management Properties
|
||||||
|
|
||||||
The `docker-local` scheduler supports a minimal list of resource _limits_ and _reservations_. The following properties are supported:
|
The `docker-local` scheduler supports a minimal list of resource _limits_ and _reservations_. The following properties are supported:
|
||||||
|
|
||||||
### Resource Limits
|
#### Resource Limits
|
||||||
|
|
||||||
- cpu: (docker option: `--cpus`), is specified in number of CPUs a process can access.
|
- cpu: (docker option: `--cpus`), is specified in number of CPUs a process can access.
|
||||||
- See the ["CPU" section](https://docs.docker.com/config/containers/resource_constraints/#cpu) of the Docker Runtime Options documentation for more information.
|
- See the ["CPU" section](https://docs.docker.com/config/containers/resource_constraints/#cpu) of the Docker Runtime Options documentation for more information.
|
||||||
@@ -120,7 +129,7 @@ The `docker-local` scheduler supports a minimal list of resource _limits_ and _r
|
|||||||
- nvidia-gpus: (docker option: `--gpus`), is specified in number of Nvidia GPUs a process can access.
|
- nvidia-gpus: (docker option: `--gpus`), is specified in number of Nvidia GPUs a process can access.
|
||||||
- See the ["GPU" section](https://docs.docker.com/config/containers/resource_constraints/#gpu) of the Docker Runtime Options documentation for more information.
|
- See the ["GPU" section](https://docs.docker.com/config/containers/resource_constraints/#gpu) of the Docker Runtime Options documentation for more information.
|
||||||
|
|
||||||
### Resource Reservations
|
#### Resource Reservations
|
||||||
|
|
||||||
- memory: (docker option: `--memory-reservation`) should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes). Default unit is `m` (megabytes).
|
- memory: (docker option: `--memory-reservation`) should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes). Default unit is `m` (megabytes).
|
||||||
- See the ["Memory" section](https://docs.docker.com/config/containers/resource_constraints/#memory) of the Docker Runtime Options documentation for more information.
|
- See the ["Memory" section](https://docs.docker.com/config/containers/resource_constraints/#memory) of the Docker Runtime Options documentation for more information.
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
# Kubernetes Scheduler
|
# Kubernetes Scheduler
|
||||||
|
|
||||||
> Warning: This scheduler is not in Dokku core and thus is considered experimental.
|
> Warning: This scheduler is not in Dokku core and thus functionality may change over time as the API stabilizes.
|
||||||
|
|
||||||
The [Kubernetes Scheduler Plugin](https://github.com/dokku/dokku-scheduler-kubernetes) implements the following functionality:
|
The [Nomad Scheduler Plugin](https://github.com/dokku/dokku-scheduler-kubernetes) is available free as an external plugin. Please see the plugin's [issue tracker](https://github.com/dokku/dokku-scheduler-kubernetes/issues) for more information on the status of the plugin.
|
||||||
|
|
||||||
|
For users that require additional functionality, please refer to the [Sponsoring Documentation](https://github.com/dokku/.github/blob/master/SPONSORING.md).
|
||||||
|
|
||||||
|
## Scheduler Interface
|
||||||
|
|
||||||
|
The following sections describe implemented scheduler functionality for the `docker-local` scheduler.
|
||||||
|
|
||||||
|
### Implemented Commands and Triggers
|
||||||
|
|
||||||
|
This plugin implements various functionality through `plugn` triggers to integrate with `kubectl` for running apps on a Kubernetes cluster. The following functionality is supported by the `scheduler-kubernetes` plugin.
|
||||||
|
|
||||||
- `apps:destroy`
|
- `apps:destroy`
|
||||||
- `deploy`: partial, does not implement failed deploy log capture
|
- `deploy`: partial, does not implement failed deploy log capture
|
||||||
- `logs`: partial, does not implement failure logs
|
- `logs`: partial, does not implement failure logs
|
||||||
- `ps:stop`
|
- `ps:stop`
|
||||||
|
|
||||||
Please see the plugin's [issue tracker](https://github.com/dokku/dokku-scheduler-kubernetes/issues) for more information on the status of the plugin.
|
### Logging support
|
||||||
|
|
||||||
For users that require additional functionality, please refer to the [Sponsoring Documentation](https://github.com/dokku/.github/blob/master/SPONSORING.md).
|
App logs for the `logs` command are fetched from running pods via the `kubectl` cli. To persist logs across deployments, consider using [Vector](https://vector.dev/docs/setup/installation/platforms/kubernetes/) or a similar tool to ship logs to another service or a third-party platform.
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
# Nomad Scheduler
|
# Nomad Scheduler
|
||||||
|
|
||||||
> Warning: This scheduler is not in Dokku core and thus is considered experimental.
|
> Warning: This scheduler is not in Dokku core and thus functionality may change over time as the API stabilizes.
|
||||||
|
|
||||||
The [Nomad Scheduler Plugin](https://github.com/dokku/dokku-scheduler-nomad) implements the following functionality:
|
The [Nomad Scheduler Plugin](https://github.com/dokku/dokku-scheduler-nomad) is available free as an external plugin. Please see the plugin's [issue tracker](https://github.com/dokku/dokku-scheduler-nomad/issues) for more information on the status of the plugin.
|
||||||
|
|
||||||
|
For users that require additional functionality, please refer to the [Sponsoring Documentation](https://github.com/dokku/.github/blob/master/SPONSORING.md).
|
||||||
|
|
||||||
|
## Scheduler Interface
|
||||||
|
|
||||||
|
The following sections describe implemented scheduler functionality for the `docker-local` scheduler.
|
||||||
|
|
||||||
|
### Implemented Commands and Triggers
|
||||||
|
|
||||||
|
This plugin implements various functionality through `plugn` triggers to integrate with the `nomad` cli for running apps on a Nomad cluster. The following functionality is supported by the `scheduler-nomad` plugin.
|
||||||
|
|
||||||
- `apps:destroy`
|
- `apps:destroy`
|
||||||
- `deploy`
|
- `deploy`
|
||||||
- `ps:stop`
|
- `ps:stop`
|
||||||
|
|
||||||
Please see the plugin's [issue tracker](https://github.com/dokku/dokku-scheduler-nomad/issues) for more information on the status of the plugin.
|
### Logging support
|
||||||
|
|
||||||
For users that require additional functionality, please refer to the [Sponsoring Documentation](https://github.com/dokku/.github/blob/master/SPONSORING.md).
|
> Warning: Fetching app logs for the `logs` command is currently not implemented. Please consider using [Vector](https://vector.dev/docs/setup/installation/platforms/kubernetes/) or a similar tool to ship logs to another service or a third-party platform.
|
||||||
|
|||||||
@@ -74,6 +74,21 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
|||||||
# TODO
|
# TODO
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `app-list`
|
||||||
|
|
||||||
|
- Description: Lists all apps in available to the currently logged in user. Optionally disables filtering by user if the first argument is `false`.
|
||||||
|
- Invoked by:
|
||||||
|
- Arguments: `$FILTER`
|
||||||
|
- Example:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
```
|
||||||
|
|
||||||
### `app-json-process-deploy-parallelism`
|
### `app-json-process-deploy-parallelism`
|
||||||
|
|
||||||
- Description: Decides the parallelism to use when deploying a given process type. The default is 1 process entry at a type.
|
- Description: Decides the parallelism to use when deploying a given process type. The default is 1 process entry at a type.
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ The workflow looks like this:
|
|||||||
```shell
|
```shell
|
||||||
# having dokku-arch in ../dokku-arch
|
# having dokku-arch in ../dokku-arch
|
||||||
vagrant up build-arch
|
vagrant up build-arch
|
||||||
# wait for "==> build-arch: ==> Finished making: dokku 0.27.2-2 (Mon Feb 22 23:20:37 CET 2016)"
|
# wait for "==> build-arch: ==> Finished making: dokku 0.27.7-2 (Mon Feb 22 23:20:37 CET 2016)"
|
||||||
cd ../dokku-arch
|
cd ../dokku-arch
|
||||||
git add PKGBUILD .SRCINFO
|
git add PKGBUILD .SRCINFO
|
||||||
git commit -m 'Update to dokku 0.9.9'
|
git commit -m 'Update to dokku 0.9.9'
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Pull the dokku/dokku image:
|
Pull the dokku/dokku image:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
docker pull dokku/dokku:0.27.2
|
docker pull dokku/dokku:0.27.7
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, run the image.
|
Next, run the image.
|
||||||
@@ -18,7 +18,7 @@ docker container run \
|
|||||||
--publish 8443:443 \
|
--publish 8443:443 \
|
||||||
--volume /var/lib/dokku:/mnt/dokku \
|
--volume /var/lib/dokku:/mnt/dokku \
|
||||||
--volume /var/run/docker.sock:/var/run/docker.sock \
|
--volume /var/run/docker.sock:/var/run/docker.sock \
|
||||||
dokku/dokku:0.27.2
|
dokku/dokku:0.27.7
|
||||||
```
|
```
|
||||||
|
|
||||||
The above command will start a new docker container that is ready when a message similar to `Runit started as PID 12345` appears.
|
The above command will start a new docker container that is ready when a message similar to `Runit started as PID 12345` appears.
|
||||||
|
|||||||
@@ -9,12 +9,13 @@ Dokku is an extensible, open source Platform as a Service that runs on a single
|
|||||||
To start using Dokku, you'll need a system that meets the following minimum requirements:
|
To start using Dokku, you'll need a system that meets the following minimum requirements:
|
||||||
|
|
||||||
- A fresh installation of any of the following operating systems:
|
- A fresh installation of any of the following operating systems:
|
||||||
- [Ubuntu 18.04/20.04 x64](https://www.ubuntu.com/download)
|
- [Ubuntu 18.04/20.04/22.04](https://www.ubuntu.com/download)
|
||||||
- [Debian 9+ x64](https://www.debian.org/distrib/)
|
- [Debian 9+ x64](https://www.debian.org/distrib/)
|
||||||
- [CentOS 7 x64](https://www.centos.org/download/) *(experimental)*
|
- [CentOS 7 x64](https://www.centos.org/download/) *(experimental)*
|
||||||
- A server with one of the following architectures
|
- A server with one of the following architectures
|
||||||
- AMD64 (alternatively known as `x86_64`), commonly used for Intel cloud servers
|
- AMD64 (alternatively known as `x86_64`), commonly used for Intel cloud servers
|
||||||
- ARMV7 (alternatively known as `armhf`), commonly used for Raspberry PI
|
- ARMV7 (alternatively known as `armhf`), commonly used for Raspberry PI
|
||||||
|
- ARMV8 (alternatively known as `arm64`), commonly used for Raspberry PI and AWS Graviton
|
||||||
|
|
||||||
To avoid memory pressure during builds or runtime of your applications, we suggest the following:
|
To avoid memory pressure during builds or runtime of your applications, we suggest the following:
|
||||||
|
|
||||||
@@ -38,8 +39,8 @@ To install the latest stable version of Dokku, you can run the following shell c
|
|||||||
|
|
||||||
```shell
|
```shell
|
||||||
# for debian systems, installs Dokku via apt-get
|
# for debian systems, installs Dokku via apt-get
|
||||||
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.2/bootstrap.sh;
|
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.7/bootstrap.sh;
|
||||||
sudo DOKKU_TAG=v0.27.2 bash bootstrap.sh
|
sudo DOKKU_TAG=v0.27.7 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.
|
||||||
|
|||||||
@@ -10,30 +10,30 @@
|
|||||||
<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.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-57x57.png">
|
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-57x57.png">
|
||||||
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-60x60.png">
|
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-60x60.png">
|
||||||
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-72x72.png">
|
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-72x72.png">
|
||||||
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-76x76.png">
|
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-76x76.png">
|
||||||
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-114x114.png">
|
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-114x114.png">
|
||||||
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-120x120.png">
|
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-120x120.png">
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-144x144.png">
|
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-144x144.png">
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-152x152.png">
|
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-152x152.png">
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-180x180.png">
|
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-180x180.png">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
||||||
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/manifest.json">
|
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/manifest.json">
|
||||||
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon.ico">
|
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/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.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-144x144.png">
|
<meta name="msapplication-TileImage" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-144x144.png">
|
||||||
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/browserconfig.xml">
|
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/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.2/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/style.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/style.css" rel="stylesheet">
|
||||||
<!-- <link href="/dokku/docs/assets/style.css" rel="stylesheet"> -->
|
<!-- <link href="/dokku/docs/assets/style.css" rel="stylesheet"> -->
|
||||||
<style>
|
<style>
|
||||||
</style>
|
</style>
|
||||||
@@ -98,12 +98,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/dokku/dokku/v0.27.2/bootstrap.sh</span>
|
<span class="command">wget https://raw.githubusercontent.com/dokku/dokku/v0.27.7/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.27.2 bash bootstrap.sh</span>
|
<span class="command">sudo DOKKU_TAG=v0.27.7 bash bootstrap.sh</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="line">
|
<p class="line">
|
||||||
<span class="output"> # Configure your server domain via `dokku domains:set-global`</span>
|
<span class="output"> # Configure your server domain via `dokku domains:set-global`</span>
|
||||||
|
|||||||
@@ -9,26 +9,26 @@
|
|||||||
<meta name="author" content="">
|
<meta name="author" content="">
|
||||||
<title>Dokku - {{DOC_TITLE}}</title>
|
<title>Dokku - {{DOC_TITLE}}</title>
|
||||||
|
|
||||||
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-57x57.png">
|
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-57x57.png">
|
||||||
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-60x60.png">
|
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-60x60.png">
|
||||||
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-72x72.png">
|
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-72x72.png">
|
||||||
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-76x76.png">
|
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-76x76.png">
|
||||||
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-114x114.png">
|
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-114x114.png">
|
||||||
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-120x120.png">
|
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-120x120.png">
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-144x144.png">
|
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-144x144.png">
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-152x152.png">
|
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-152x152.png">
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/apple-touch-icon-180x180.png">
|
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/apple-touch-icon-180x180.png">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
||||||
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
||||||
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/manifest.json">
|
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/manifest.json">
|
||||||
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/favicon.ico">
|
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/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.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/mstile-144x144.png">
|
<meta name="msapplication-TileImage" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/mstile-144x144.png">
|
||||||
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/favicons/browserconfig.xml">
|
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/favicons/browserconfig.xml">
|
||||||
<meta name="theme-color" content="#ffffff">
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.2/docs/assets/style.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.27.7/docs/assets/style.css" rel="stylesheet">
|
||||||
<!-- <link href="/dokku/docs/assets/style.css" rel="stylesheet"> -->
|
<!-- <link href="/dokku/docs/assets/style.css" rel="stylesheet"> -->
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
@@ -500,6 +500,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
addVersionLink('master');
|
addVersionLink('master');
|
||||||
|
versions.reverse();
|
||||||
Array.prototype.forEach.call(versions, function (version, i) {
|
Array.prototype.forEach.call(versions, function (version, i) {
|
||||||
addVersionLink(version);
|
addVersionLink(version);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core standard plugin"
|
description = "dokku core standard plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ cmd-report() {
|
|||||||
declare cmd="report"
|
declare cmd="report"
|
||||||
[[ "$1" == "$cmd" ]] && shift 1
|
[[ "$1" == "$cmd" ]] && shift 1
|
||||||
declare APP="$1"
|
declare APP="$1"
|
||||||
|
local ARCHITECTURE="$(dpkg --print-architecture 2>/dev/null || true)"
|
||||||
|
|
||||||
if [[ "$APP" == "--format" ]]; then
|
if [[ "$APP" == "--format" ]]; then
|
||||||
dokku_log_fail "--format flag not supported on global report"
|
dokku_log_fail "--format flag not supported on global report"
|
||||||
@@ -23,8 +24,8 @@ cmd-report() {
|
|||||||
dokku_log_info1 "git version: $(git --version)"
|
dokku_log_info1 "git version: $(git --version)"
|
||||||
dokku_log_info1 "sigil version: $(sigil -v)"
|
dokku_log_info1 "sigil version: $(sigil -v)"
|
||||||
dokku_log_info1 "herokuish version: "
|
dokku_log_info1 "herokuish version: "
|
||||||
if [[ "$(dpkg --print-architecture 2>/dev/null || true)" == "armhf" ]]; then
|
if [[ "$ARCHITECTURE" == "armhf" ]] || [[ "$ARCHITECTURE" == "arm64" ]]; then
|
||||||
dokku_log_warn "herokuish not supported on armhf architecture"
|
dokku_log_warn "herokuish not supported on $ARCHITECTURE architecture"
|
||||||
else
|
else
|
||||||
"$DOCKER_BIN" container run $DOKKU_GLOBAL_RUN_ARGS --rm "$DOKKU_IMAGE" herokuish version | sed "s/^/ /"
|
"$DOCKER_BIN" container run $DOKKU_GLOBAL_RUN_ARGS --rm "$DOKKU_IMAGE" herokuish version | sed "s/^/ /"
|
||||||
fi
|
fi
|
||||||
|
|||||||
6
plugins/20_events/app-list
Executable file
6
plugins/20_events/app-list
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eo pipefail
|
||||||
|
[[ $DOKKU_TRACE ]] && set -x
|
||||||
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
||||||
|
|
||||||
|
[[ ! "$DOKKU_EVENTS" ]] || dokku_log_plugn_trigger_call "$(basename "$0")" "$@"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core events logging plugin"
|
description = "dokku core events logging plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -497,7 +497,7 @@ func setScale(appName string, image string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
skipDeploy := true
|
skipDeploy := true
|
||||||
clearExisting := false
|
clearExisting := true
|
||||||
args := []string{appName, strconv.FormatBool(skipDeploy), strconv.FormatBool(clearExisting)}
|
args := []string{appName, strconv.FormatBool(skipDeploy), strconv.FormatBool(clearExisting)}
|
||||||
for processType, formation := range appJSON.Formation {
|
for processType, formation := range appJSON.Formation {
|
||||||
if formation.Quantity != nil {
|
if formation.Quantity != nil {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core app-json plugin"
|
description = "dokku core app-json plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core apps plugin"
|
description = "dokku core apps plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ trigger-builder-dockerfile-builder-build() {
|
|||||||
dokku_log_info1 "Building $APP from Dockerfile"
|
dokku_log_info1 "Building $APP from Dockerfile"
|
||||||
|
|
||||||
local IMAGE=$(get_app_image_name "$APP")
|
local IMAGE=$(get_app_image_name "$APP")
|
||||||
local DOCKER_BUILD_LABEL_ARGS=("--label=org.label-schema.schema-version=1.0" "--label=org.label-schema.vendor=dokku" "--label=com.dokku.app-name=$APP" "--label=com.dokku.image-stage=build")
|
local DOCKER_BUILD_LABEL_ARGS=("--label=dokku" "--label=org.label-schema.schema-version=1.0" "--label=org.label-schema.vendor=dokku" "--label=com.dokku.image-stage=build" "--label=com.dokku.builder-type=dockerfile" "--label=com.dokku.app-name=$APP")
|
||||||
|
|
||||||
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core builder-dockerfile plugin"
|
description = "dokku core builder-dockerfile plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ trigger-builder-herokuish-builder-build() {
|
|||||||
local IMAGE=$(get_app_image_name "$APP")
|
local IMAGE=$(get_app_image_name "$APP")
|
||||||
local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache"
|
local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache"
|
||||||
local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache"
|
local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache"
|
||||||
local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP")
|
local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL dokku=" "--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.image-stage=build" "--change" "LABEL com.dokku.builder-type=herokuish" "--change" "LABEL com.dokku.app-name=$APP")
|
||||||
local DOCKER_RUN_LABEL_ARGS=("--label=com.dokku.image-stage=build" "--label=com.dokku.app-name=$APP")
|
local DOCKER_RUN_LABEL_ARGS=("--label=dokku" "--label=org.label-schema.schema-version=1.0" "--label=org.label-schema.vendor=dokku" "--label=com.dokku.image-stage=build" "--label=com.dokku.builder-type=herokuish" "--label=com.dokku.app-name=$APP")
|
||||||
local CID TAR_CID
|
local CID TAR_CID
|
||||||
|
|
||||||
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ trigger-builder-herokuish-builder-detect() {
|
|||||||
declare desc="builder-herokuish builder-detect plugin trigger"
|
declare desc="builder-herokuish builder-detect plugin trigger"
|
||||||
declare trigger="builder-detect"
|
declare trigger="builder-detect"
|
||||||
declare APP="$1" SOURCECODE_WORK_DIR="$2"
|
declare APP="$1" SOURCECODE_WORK_DIR="$2"
|
||||||
|
local ARCHITECTURE="$(dpkg --print-architecture 2>/dev/null || true)"
|
||||||
|
|
||||||
if [[ "$(dpkg --print-architecture 2>/dev/null || true)" == "armhf" ]]; then
|
if [[ "$ARCHITECTURE" == "armhf" ]] || [[ "$ARCHITECTURE" == "arm64" ]]; then
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core builder-herokuish plugin"
|
description = "dokku core builder-herokuish plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core builder-null plugin"
|
description = "dokku core builder-null plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ trigger-builder-pack-builder-build() {
|
|||||||
|
|
||||||
plugn trigger pre-build-pack "$APP" "$SOURCECODE_WORK_DIR"
|
plugn trigger pre-build-pack "$APP" "$SOURCECODE_WORK_DIR"
|
||||||
pack build "$IMAGE" --builder "$DOKKU_CNB_BUILDER" --path "$SOURCECODE_WORK_DIR" --default-process web "${ENV_ARGS[@]}"
|
pack build "$IMAGE" --builder "$DOKKU_CNB_BUILDER" --path "$SOURCECODE_WORK_DIR" --default-process web "${ENV_ARGS[@]}"
|
||||||
docker-image-labeler --label=com.dokku.image-stage=build --label=com.dokku.app-name=$APP --label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=dokku "$IMAGE"
|
docker-image-labeler --label=dokku --label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.image-stage=build --label=com.dokku.builder-type=pack --label=com.dokku.app-name=$APP "$IMAGE"
|
||||||
|
|
||||||
plugn trigger post-build-pack "$APP" "$SOURCECODE_WORK_DIR"
|
plugn trigger post-build-pack "$APP" "$SOURCECODE_WORK_DIR"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core builder-pack plugin"
|
description = "dokku core builder-pack plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core builder plugin"
|
description = "dokku core builder plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core buildpacks plugin"
|
description = "dokku core buildpacks plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core certificate management plugin"
|
description = "dokku core certificate management plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ migrate_checks_vars_0_5_0() {
|
|||||||
local GLOBAL_SKIP_ALL_CHECKS=$(config_get --global DOKKU_SKIP_ALL_CHECKS || true)
|
local GLOBAL_SKIP_ALL_CHECKS=$(config_get --global DOKKU_SKIP_ALL_CHECKS || true)
|
||||||
local GLOBAL_SKIP_DEFAULT_CHECKS=$(config_get --global DOKKU_SKIP_DEFAULT_CHECKS || true)
|
local GLOBAL_SKIP_DEFAULT_CHECKS=$(config_get --global DOKKU_SKIP_DEFAULT_CHECKS || true)
|
||||||
|
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
local APP_SKIP_ALL_CHECKS=$(config_get "$app" DOKKU_SKIP_ALL_CHECKS || true)
|
local APP_SKIP_ALL_CHECKS=$(config_get "$app" DOKKU_SKIP_ALL_CHECKS || true)
|
||||||
local APP_SKIP_DEFAULT_CHECKS=$(config_get "$app" DOKKU_SKIP_DEFAULT_CHECKS || true)
|
local APP_SKIP_DEFAULT_CHECKS=$(config_get "$app" DOKKU_SKIP_DEFAULT_CHECKS || true)
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ migrate_checks_vars_0_5_0() {
|
|||||||
migrate_checks_vars_0_6_0() {
|
migrate_checks_vars_0_6_0() {
|
||||||
declare desc="migrates CHECKS config variables from 0.5.x to support fully-disabled zero-downtime checks"
|
declare desc="migrates CHECKS config variables from 0.5.x to support fully-disabled zero-downtime checks"
|
||||||
|
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
local APP_DOKKU_CHECKS_ENABLED=$(config_get "$app" DOKKU_CHECKS_ENABLED || true)
|
local APP_DOKKU_CHECKS_ENABLED=$(config_get "$app" DOKKU_CHECKS_ENABLED || true)
|
||||||
if [[ $APP_DOKKU_CHECKS_ENABLED ]]; then
|
if [[ $APP_DOKKU_CHECKS_ENABLED ]]; then
|
||||||
dokku_log_info1 "Migrating zero downtime env variables to 0.6.x. The following variables will be migrated"
|
dokku_log_info1 "Migrating zero downtime env variables to 0.6.x. The following variables will be migrated"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core checks plugin"
|
description = "dokku core checks plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -245,6 +245,16 @@ func GetRunningImageTag(appName string, imageTag string) (string, error) {
|
|||||||
|
|
||||||
// DokkuApps returns a list of all local apps
|
// DokkuApps returns a list of all local apps
|
||||||
func DokkuApps() ([]string, error) {
|
func DokkuApps() ([]string, error) {
|
||||||
|
apps, err := UnfilteredDokkuApps()
|
||||||
|
if err != nil {
|
||||||
|
return apps, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filterApps(apps)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnfilteredDokkuApps returns an unfiltered list of all local apps
|
||||||
|
func UnfilteredDokkuApps() ([]string, error) {
|
||||||
apps := []string{}
|
apps := []string{}
|
||||||
dokkuRoot := MustGetEnv("DOKKU_ROOT")
|
dokkuRoot := MustGetEnv("DOKKU_ROOT")
|
||||||
files, err := ioutil.ReadDir(dokkuRoot)
|
files, err := ioutil.ReadDir(dokkuRoot)
|
||||||
@@ -267,7 +277,7 @@ func DokkuApps() ([]string, error) {
|
|||||||
return apps, fmt.Errorf("You haven't deployed any applications yet")
|
return apps, fmt.Errorf("You haven't deployed any applications yet")
|
||||||
}
|
}
|
||||||
|
|
||||||
return filterApps(apps)
|
return apps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAppImageName returns image identifier for a given app, tag tuple. validate if tag is presented
|
// GetAppImageName returns image identifier for a given app, tag tuple. validate if tag is presented
|
||||||
@@ -571,6 +581,11 @@ func VerifyAppName(appName string) error {
|
|||||||
return &AppDoesNotExist{appName}
|
return &AppDoesNotExist{appName}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apps, _ := filterApps([]string{appName})
|
||||||
|
if len(apps) != 1 {
|
||||||
|
return &AppDoesNotExist{appName}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ var (
|
|||||||
testEnvLine2 = "export testKey=TESTING"
|
testEnvLine2 = "export testKey=TESTING"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func setupTests() (err error) {
|
||||||
|
return os.Setenv("PLUGIN_ENABLED_PATH", "/var/lib/dokku/plugins/enabled")
|
||||||
|
}
|
||||||
|
|
||||||
func setupTestApp() (err error) {
|
func setupTestApp() (err error) {
|
||||||
Expect(os.MkdirAll(testAppDir, 0644)).To(Succeed())
|
Expect(os.MkdirAll(testAppDir, 0644)).To(Succeed())
|
||||||
b := []byte(testEnvLine + "\n")
|
b := []byte(testEnvLine + "\n")
|
||||||
@@ -48,32 +52,37 @@ func teardownTestApp2() {
|
|||||||
|
|
||||||
func TestCommonGetEnv(t *testing.T) {
|
func TestCommonGetEnv(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(MustGetEnv("DOKKU_ROOT")).To(Equal("/home/dokku"))
|
Expect(MustGetEnv("DOKKU_ROOT")).To(Equal("/home/dokku"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonGetAppImageRepo(t *testing.T) {
|
func TestCommonGetAppImageRepo(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(GetAppImageRepo("testapp")).To(Equal("dokku/testapp"))
|
Expect(GetAppImageRepo("testapp")).To(Equal("dokku/testapp"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonVerifyImageInvalid(t *testing.T) {
|
func TestCommonVerifyImageInvalid(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(VerifyImage("testapp")).To(Equal(false))
|
Expect(VerifyImage("testapp")).To(Equal(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonVerifyAppNameInvalid(t *testing.T) {
|
func TestCommonVerifyAppNameInvalid(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
err := VerifyAppName("1994testApp")
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(VerifyAppName("1994testApp")).To(HaveOccurred())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonVerifyAppName(t *testing.T) {
|
func TestCommonVerifyAppName(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
Expect(VerifyAppName(testAppName)).To(Succeed())
|
Expect(VerifyAppName(testAppName)).To(Succeed())
|
||||||
teardownTestApp()
|
teardownTestApp()
|
||||||
|
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp2()).To(Succeed())
|
Expect(setupTestApp2()).To(Succeed())
|
||||||
Expect(VerifyAppName(testAppName2)).To(Succeed())
|
Expect(VerifyAppName(testAppName2)).To(Succeed())
|
||||||
teardownTestApp2()
|
teardownTestApp2()
|
||||||
@@ -81,13 +90,14 @@ func TestCommonVerifyAppName(t *testing.T) {
|
|||||||
|
|
||||||
func TestCommonDokkuAppsError(t *testing.T) {
|
func TestCommonDokkuAppsError(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
_, err := DokkuApps()
|
_, err := DokkuApps()
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommonDokkuApps(t *testing.T) {
|
func TestCommonDokkuApps(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
os.Setenv("PLUGIN_ENABLED_PATH", "/var/lib/dokku/plugins/enabled")
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
apps, err := DokkuApps()
|
apps, err := DokkuApps()
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@@ -98,6 +108,7 @@ func TestCommonDokkuApps(t *testing.T) {
|
|||||||
|
|
||||||
func TestCommonStripInlineComments(t *testing.T) {
|
func TestCommonStripInlineComments(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
text := StripInlineComments(strings.Join([]string{testEnvLine, "# testing comment"}, " "))
|
text := StripInlineComments(strings.Join([]string{testEnvLine, "# testing comment"}, " "))
|
||||||
Expect(text).To(Equal(testEnvLine))
|
Expect(text).To(Equal(testEnvLine))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ has_tty() {
|
|||||||
|
|
||||||
dokku_apps() {
|
dokku_apps() {
|
||||||
declare desc="prints list of all local apps"
|
declare desc="prints list of all local apps"
|
||||||
local INSTALLED_APPS="$(plugn trigger app-list)"
|
declare FILTER="$1"
|
||||||
|
local INSTALLED_APPS="$(plugn trigger app-list "$FILTER")"
|
||||||
if [[ -z "$INSTALLED_APPS" ]]; then
|
if [[ -z "$INSTALLED_APPS" ]]; then
|
||||||
dokku_log_fail "You haven't deployed any applications yet"
|
dokku_log_fail "You haven't deployed any applications yet"
|
||||||
fi
|
fi
|
||||||
@@ -249,23 +250,12 @@ is_valid_app_name_old() {
|
|||||||
verify_app_name() {
|
verify_app_name() {
|
||||||
declare desc="verify app name format and app existence"
|
declare desc="verify app name format and app existence"
|
||||||
declare APP="$1"
|
declare APP="$1"
|
||||||
local VALID_NEW=false
|
|
||||||
local VALID_OLD=false
|
if "$PLUGIN_CORE_AVAILABLE_PATH/common/common" --quiet verify-app-name "$APP"; then
|
||||||
if fn-is-valid-app-name "$APP" 2>/dev/null; then
|
return 0
|
||||||
VALID_NEW=true
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if fn-is-valid-app-name-old "$APP" 2>/dev/null; then
|
DOKKU_FAIL_EXIT_CODE=20 dokku_log_fail "App $APP does not exist"
|
||||||
VALID_OLD=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$VALID_NEW" == "false" ]] && [[ "$VALID_OLD" == "false" ]]; then
|
|
||||||
dokku_log_fail "App name must begin with lowercase alphanumeric character, and cannot include uppercase characters, colons, or underscores"
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ ! -d "$DOKKU_ROOT/$APP" ]] && DOKKU_FAIL_EXIT_CODE=20 dokku_log_fail "App $APP does not exist"
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_image() {
|
verify_image() {
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ func filterApps(apps []string) ([]string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sshName := os.Getenv("SSH_NAME")
|
sshName := os.Getenv("SSH_NAME")
|
||||||
|
if sshName == "" {
|
||||||
|
sshName = os.Getenv("NAME")
|
||||||
|
}
|
||||||
if sshName == "" {
|
if sshName == "" {
|
||||||
sshName = "default"
|
sshName = "default"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,19 @@ func LogFailWithError(err error) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogFailWithErrorQuiet is the failure log formatter (with quiet option)
|
||||||
|
// prints text to stderr and exits with the specified exit code
|
||||||
|
// The error message is not printed if DOKKU_QUIET_OUTPUT has any value
|
||||||
|
func LogFailWithErrorQuiet(err error) {
|
||||||
|
if os.Getenv("DOKKU_QUIET_OUTPUT") == "" {
|
||||||
|
fmt.Fprintln(os.Stderr, fmt.Sprintf(" ! %s", err.Error()))
|
||||||
|
}
|
||||||
|
if errExit, ok := err.(ErrWithExitCode); ok {
|
||||||
|
os.Exit(errExit.ExitCode())
|
||||||
|
}
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
// LogFailQuiet is the failure log formatter (with quiet option)
|
// LogFailQuiet is the failure log formatter (with quiet option)
|
||||||
// prints text to stderr and exits with status 1
|
// prints text to stderr and exits with status 1
|
||||||
func LogFailQuiet(text string) {
|
func LogFailQuiet(text string) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core common plugin"
|
description = "dokku core common plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -38,11 +38,14 @@ func main() {
|
|||||||
appName = "--global"
|
appName = "--global"
|
||||||
}
|
}
|
||||||
fmt.Print(common.GetAppScheduler(appName))
|
fmt.Print(common.GetAppScheduler(appName))
|
||||||
|
case "verify-app-name":
|
||||||
|
appName := flag.Arg(1)
|
||||||
|
err = common.VerifyAppName(appName)
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("Invalid common command call: %v", cmd)
|
err = fmt.Errorf("Invalid common command call: %v", cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
common.LogFailQuiet(err.Error())
|
common.LogFailWithErrorQuiet(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,12 @@ func main() {
|
|||||||
var err error
|
var err error
|
||||||
switch trigger {
|
switch trigger {
|
||||||
case "app-list":
|
case "app-list":
|
||||||
err = common.TriggerAppList()
|
filtered := flag.Arg(0)
|
||||||
|
if filtered == "" {
|
||||||
|
filtered = "true"
|
||||||
|
}
|
||||||
|
filter := common.ToBool(filtered)
|
||||||
|
err = common.TriggerAppList(filter)
|
||||||
case "core-post-deploy":
|
case "core-post-deploy":
|
||||||
appName := flag.Arg(0)
|
appName := flag.Arg(0)
|
||||||
err = common.TriggerCorePostDeploy(appName)
|
err = common.TriggerCorePostDeploy(appName)
|
||||||
|
|||||||
@@ -6,8 +6,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// TriggerAppList outputs each app name to stdout on a newline
|
// TriggerAppList outputs each app name to stdout on a newline
|
||||||
func TriggerAppList() error {
|
func TriggerAppList(filtered bool) error {
|
||||||
apps, _ := DokkuApps()
|
var apps []string
|
||||||
|
if filtered {
|
||||||
|
apps, _ = DokkuApps()
|
||||||
|
} else {
|
||||||
|
apps, _ = UnfilteredDokkuApps()
|
||||||
|
}
|
||||||
|
|
||||||
for _, app := range apps {
|
for _, app := range apps {
|
||||||
Log(app)
|
Log(app)
|
||||||
}
|
}
|
||||||
@@ -30,7 +36,7 @@ func TriggerInstall() error {
|
|||||||
return fmt.Errorf("Unable to install the common plugin: %s", err.Error())
|
return fmt.Errorf("Unable to install the common plugin: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
apps, err := DokkuApps()
|
apps, err := UnfilteredDokkuApps()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
SUBCOMMANDS = subcommands/bundle subcommands/clear subcommands/export subcommands/get subcommands/keys subcommands/show subcommands/set subcommands/unset
|
SUBCOMMANDS = subcommands/bundle subcommands/clear subcommands/export subcommands/get subcommands/keys subcommands/show subcommands/set subcommands/unset
|
||||||
TRIGGERS = triggers/config-export triggers/config-get triggers/config-get-global
|
TRIGGERS = triggers/config-export triggers/config-get triggers/config-get-global
|
||||||
BUILD = commands subcommands triggers
|
BUILD = commands config_sub subcommands triggers
|
||||||
PLUGIN_NAME = config
|
PLUGIN_NAME = config
|
||||||
|
|
||||||
|
clean-config_sub:
|
||||||
|
rm -rf config_sub
|
||||||
|
|
||||||
|
config_sub: clean-config_sub **/**/config_sub.go
|
||||||
|
go build -ldflags="-s -w" $(GO_ARGS) -o config_sub src/config_sub/config_sub.go
|
||||||
|
|
||||||
include ../../common.mk
|
include ../../common.mk
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ func SetMany(appName string, entries map[string]string, restart bool) (err error
|
|||||||
fmt.Println(prettyPrintEnvEntries(" ", entries))
|
fmt.Println(prettyPrintEnvEntries(" ", entries))
|
||||||
}
|
}
|
||||||
env.Write()
|
env.Write()
|
||||||
|
common.SetPermissions(env.Filename(), 0600)
|
||||||
triggerUpdate(appName, "set", keys)
|
triggerUpdate(appName, "set", keys)
|
||||||
}
|
}
|
||||||
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
||||||
@@ -84,6 +85,7 @@ func UnsetMany(appName string, keys []string, restart bool) (err error) {
|
|||||||
}
|
}
|
||||||
if changed {
|
if changed {
|
||||||
env.Write()
|
env.Write()
|
||||||
|
common.SetPermissions(env.Filename(), 0600)
|
||||||
triggerUpdate(appName, "unset", keys)
|
triggerUpdate(appName, "unset", keys)
|
||||||
}
|
}
|
||||||
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
||||||
@@ -107,6 +109,7 @@ func UnsetAll(appName string, restart bool) (err error) {
|
|||||||
}
|
}
|
||||||
if changed {
|
if changed {
|
||||||
env.Write()
|
env.Write()
|
||||||
|
common.SetPermissions(env.Filename(), 0600)
|
||||||
triggerUpdate(appName, "clear", []string{})
|
triggerUpdate(appName, "clear", []string{})
|
||||||
}
|
}
|
||||||
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
if !global && restart && env.GetBoolDefault("DOKKU_APP_RESTORE", true) {
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ var (
|
|||||||
globalConfigFile = strings.Join([]string{dokkuRoot, "ENV"}, "/")
|
globalConfigFile = strings.Join([]string{dokkuRoot, "ENV"}, "/")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func setupTests() (err error) {
|
||||||
|
return os.Setenv("PLUGIN_ENABLED_PATH", "/var/lib/dokku/plugins/enabled")
|
||||||
|
}
|
||||||
|
|
||||||
func setupTestApp() (err error) {
|
func setupTestApp() (err error) {
|
||||||
Expect(os.MkdirAll(testAppDir, 0766)).To(Succeed())
|
Expect(os.MkdirAll(testAppDir, 0766)).To(Succeed())
|
||||||
b := []byte("export testKey=TESTING\n")
|
b := []byte("export testKey=TESTING\n")
|
||||||
@@ -38,6 +42,7 @@ func teardownTestApp() {
|
|||||||
|
|
||||||
func TestConfigGetWithDefault(t *testing.T) {
|
func TestConfigGetWithDefault(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
Expect(GetWithDefault(testAppName, "unknownKey", "UNKNOWN")).To(Equal("UNKNOWN"))
|
Expect(GetWithDefault(testAppName, "unknownKey", "UNKNOWN")).To(Equal("UNKNOWN"))
|
||||||
Expect(GetWithDefault(testAppName, "testKey", "testKey")).To(Equal("TESTING"))
|
Expect(GetWithDefault(testAppName, "testKey", "testKey")).To(Equal("TESTING"))
|
||||||
@@ -47,6 +52,7 @@ func TestConfigGetWithDefault(t *testing.T) {
|
|||||||
|
|
||||||
func TestConfigGet(t *testing.T) {
|
func TestConfigGet(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
@@ -59,45 +65,48 @@ func TestConfigGet(t *testing.T) {
|
|||||||
|
|
||||||
func TestConfigSetMany(t *testing.T) {
|
func TestConfigSetMany(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
expectValue(testAppName, "testKey", "TESTING")
|
expectValue(testAppName, "testKey", "TESTING")
|
||||||
|
|
||||||
vals := map[string]string{"testKey": "updated", "testKey2": "new"}
|
vals := []string{"testKey=updated", "testKey2=new"}
|
||||||
Expect(SetMany(testAppName, vals, false)).To(Succeed())
|
Expect(CommandSet(testAppName, vals, false, true, false)).To(Succeed())
|
||||||
expectValue(testAppName, "testKey", "updated")
|
expectValue(testAppName, "testKey", "updated")
|
||||||
expectValue(testAppName, "testKey2", "new")
|
expectValue(testAppName, "testKey2", "new")
|
||||||
|
|
||||||
vals = map[string]string{"testKey": "updated_global", "testKey2": "new_global"}
|
vals = []string{"testKey=updated_global", "testKey2=new_global"}
|
||||||
Expect(SetMany("", vals, false)).To(Succeed())
|
Expect(CommandSet("", vals, true, true, false)).To(Succeed())
|
||||||
expectValue("", "testKey", "updated_global")
|
expectValue("", "testKey", "updated_global")
|
||||||
expectValue("", "testKey2", "new_global")
|
expectValue("", "testKey2", "new_global")
|
||||||
expectValue("", "globalKey", "GLOBAL_VALUE")
|
expectValue("", "globalKey", "GLOBAL_VALUE")
|
||||||
expectValue(testAppName, "testKey", "updated")
|
expectValue(testAppName, "testKey", "updated")
|
||||||
expectValue(testAppName, "testKey2", "new")
|
expectValue(testAppName, "testKey2", "new")
|
||||||
|
|
||||||
Expect(SetMany(testAppName+"does_not_exist", vals, false)).ToNot(Succeed())
|
Expect(CommandSet(testAppName+"does_not_exist", vals, false, true, false)).ToNot(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigUnsetAll(t *testing.T) {
|
func TestConfigUnsetAll(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
expectValue(testAppName, "testKey", "TESTING")
|
expectValue(testAppName, "testKey", "TESTING")
|
||||||
expectValue("", "testKey", "GLOBAL_TESTING")
|
expectValue("", "testKey", "GLOBAL_TESTING")
|
||||||
|
|
||||||
Expect(UnsetAll(testAppName, false)).To(Succeed())
|
Expect(CommandClear(testAppName, false, true)).To(Succeed())
|
||||||
expectNoValue(testAppName, "testKey")
|
expectNoValue(testAppName, "testKey")
|
||||||
expectNoValue(testAppName, "noKey")
|
expectNoValue(testAppName, "noKey")
|
||||||
expectNoValue(testAppName, "globalKey")
|
expectNoValue(testAppName, "globalKey")
|
||||||
|
|
||||||
Expect(UnsetAll(testAppName+"does-not-exist", false)).ToNot(Succeed())
|
Expect(CommandClear(testAppName+"does-not-exist", false, true)).ToNot(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestConfigUnsetMany(t *testing.T) {
|
func TestConfigUnsetMany(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
@@ -105,19 +114,20 @@ func TestConfigUnsetMany(t *testing.T) {
|
|||||||
expectValue("", "testKey", "GLOBAL_TESTING")
|
expectValue("", "testKey", "GLOBAL_TESTING")
|
||||||
|
|
||||||
keys := []string{"testKey", "noKey"}
|
keys := []string{"testKey", "noKey"}
|
||||||
Expect(UnsetMany(testAppName, keys, false)).To(Succeed())
|
Expect(CommandUnset(testAppName, keys, false, true)).To(Succeed())
|
||||||
expectNoValue(testAppName, "testKey")
|
expectNoValue(testAppName, "testKey")
|
||||||
expectValue("", "testKey", "GLOBAL_TESTING")
|
expectValue("", "testKey", "GLOBAL_TESTING")
|
||||||
|
|
||||||
Expect(UnsetMany(testAppName, keys, false)).To(Succeed())
|
Expect(CommandUnset(testAppName, keys, false, true)).To(Succeed())
|
||||||
expectNoValue(testAppName, "testKey")
|
expectNoValue(testAppName, "testKey")
|
||||||
expectNoValue(testAppName, "globalKey")
|
expectNoValue(testAppName, "globalKey")
|
||||||
|
|
||||||
Expect(UnsetMany(testAppName+"does-not-exist", keys, false)).ToNot(Succeed())
|
Expect(CommandUnset(testAppName+"does-not-exist", keys, false, true)).ToNot(Succeed())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEnvironmentLoading(t *testing.T) {
|
func TestEnvironmentLoading(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
@@ -142,6 +152,7 @@ func TestEnvironmentLoading(t *testing.T) {
|
|||||||
|
|
||||||
func TestInvalidKeys(t *testing.T) {
|
func TestInvalidKeys(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
@@ -158,6 +169,7 @@ func TestInvalidKeys(t *testing.T) {
|
|||||||
|
|
||||||
func TestInvalidEnvOnDisk(t *testing.T) {
|
func TestInvalidEnvOnDisk(t *testing.T) {
|
||||||
RegisterTestingT(t)
|
RegisterTestingT(t)
|
||||||
|
Expect(setupTests()).To(Succeed())
|
||||||
Expect(setupTestApp()).To(Succeed())
|
Expect(setupTestApp()).To(Succeed())
|
||||||
defer teardownTestApp()
|
defer teardownTestApp()
|
||||||
|
|
||||||
|
|||||||
@@ -60,10 +60,6 @@ func newEnvFromString(rep string) (env *Env, err error) {
|
|||||||
|
|
||||||
//LoadAppEnv loads an environment for the given app
|
//LoadAppEnv loads an environment for the given app
|
||||||
func LoadAppEnv(appName string) (env *Env, err error) {
|
func LoadAppEnv(appName string) (env *Env, err error) {
|
||||||
err = common.VerifyAppName(appName)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
appfile, err := getAppFile(appName)
|
appfile, err := getAppFile(appName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -92,6 +88,11 @@ func LoadGlobalEnv() (*Env, error) {
|
|||||||
return loadFromFile("<global>", getGlobalFile())
|
return loadFromFile("<global>", getGlobalFile())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filename returns the full path on disk to the file holding the env vars
|
||||||
|
func (e *Env) Filename() string {
|
||||||
|
return e.filename
|
||||||
|
}
|
||||||
|
|
||||||
//Get an environment variable
|
//Get an environment variable
|
||||||
func (e *Env) Get(key string) (value string, ok bool) {
|
func (e *Env) Get(key string) (value string, ok bool) {
|
||||||
value, ok = e.env[key]
|
value, ok = e.env[key]
|
||||||
@@ -352,10 +353,6 @@ func loadFromFile(name string, filename string) (env *Env, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getAppFile(appName string) (string, error) {
|
func getAppFile(appName string) (string, error) {
|
||||||
err := common.VerifyAppName(appName)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return filepath.Join(common.MustGetEnv("DOKKU_ROOT"), appName, "ENV"), nil
|
return filepath.Join(common.MustGetEnv("DOKKU_ROOT"), appName, "ENV"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ config_sub() {
|
|||||||
declare desc="executes a config subcommand"
|
declare desc="executes a config subcommand"
|
||||||
local name="$1"
|
local name="$1"
|
||||||
shift
|
shift
|
||||||
"$PLUGIN_AVAILABLE_PATH/config/subcommands/$name" "config:$name" "$@"
|
"$PLUGIN_AVAILABLE_PATH/config/config_sub" "$name" "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
config_export() {
|
config_export() {
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
func export(appName string, global bool, merged bool, format string) error {
|
"github.com/dokku/dokku/plugins/common"
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
|
func export(appName string, merged bool, format string) error {
|
||||||
env := getEnvironment(appName, merged)
|
env := getEnvironment(appName, merged)
|
||||||
exportType := ExportFormatExports
|
exportType := ExportFormatExports
|
||||||
suffix := "\n"
|
suffix := "\n"
|
||||||
@@ -37,3 +40,113 @@ func export(appName string, global bool, merged bool, format string) error {
|
|||||||
fmt.Print(exported + suffix)
|
fmt.Print(exported + suffix)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SubBundle implements the logic for config:bundle without app name validation
|
||||||
|
func SubBundle(appName string, merged bool) error {
|
||||||
|
env := getEnvironment(appName, merged)
|
||||||
|
return env.ExportBundle(os.Stdout)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubClear implements the logic for config:clear without app name validation
|
||||||
|
func SubClear(appName string, noRestart bool) error {
|
||||||
|
return UnsetAll(appName, !noRestart)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubExport implements the logic for config:export without app name validation
|
||||||
|
func SubExport(appName string, merged bool, format string) error {
|
||||||
|
return export(appName, merged, format)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubGet implements the logic for config:get without app name validation
|
||||||
|
func SubGet(appName string, keys []string, quoted bool) error {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
return errors.New("Expected: key")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(keys) != 1 {
|
||||||
|
return fmt.Errorf("Unexpected argument(s): %v", keys[1:])
|
||||||
|
}
|
||||||
|
|
||||||
|
value, ok := Get(appName, keys[0])
|
||||||
|
if !ok {
|
||||||
|
os.Exit(1)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if quoted {
|
||||||
|
fmt.Printf("'%s'\n", singleQuoteEscape(value))
|
||||||
|
} else {
|
||||||
|
fmt.Printf("%s\n", value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubKeys implements the logic for config:keys without app name validation
|
||||||
|
func SubKeys(appName string, merged bool) error {
|
||||||
|
env := getEnvironment(appName, merged)
|
||||||
|
for _, k := range env.Keys() {
|
||||||
|
fmt.Println(k)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubSet implements the logic for config:set without app name validation
|
||||||
|
func SubSet(appName string, pairs []string, noRestart bool, encoded bool) error {
|
||||||
|
if len(pairs) == 0 {
|
||||||
|
return errors.New("At least one env pair must be given")
|
||||||
|
}
|
||||||
|
|
||||||
|
updated := make(map[string]string)
|
||||||
|
for _, e := range pairs {
|
||||||
|
parts := strings.SplitN(e, "=", 2)
|
||||||
|
if len(parts) == 1 {
|
||||||
|
return fmt.Errorf("Invalid env pair: %v", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
key, value := parts[0], parts[1]
|
||||||
|
if encoded {
|
||||||
|
decoded, err := base64.StdEncoding.DecodeString(value)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("%s for key '%s'", err.Error(), key)
|
||||||
|
}
|
||||||
|
value = string(decoded)
|
||||||
|
}
|
||||||
|
updated[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
return SetMany(appName, updated, !noRestart)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubShow implements the logic for config:show without app name validation
|
||||||
|
func SubShow(appName string, merged bool, shell bool, export bool) error {
|
||||||
|
env := getEnvironment(appName, merged)
|
||||||
|
if shell && export {
|
||||||
|
return errors.New("Only one of --shell and --export can be given")
|
||||||
|
}
|
||||||
|
if shell {
|
||||||
|
common.LogWarn("Deprecated: Use 'config:export --format shell' instead")
|
||||||
|
fmt.Print(env.Export(ExportFormatShell))
|
||||||
|
} else if export {
|
||||||
|
common.LogWarn("Deprecated: Use 'config:export --format exports' instead")
|
||||||
|
fmt.Println(env.Export(ExportFormatExports))
|
||||||
|
} else {
|
||||||
|
contextName := "global"
|
||||||
|
if appName != "" {
|
||||||
|
contextName = appName
|
||||||
|
}
|
||||||
|
common.LogInfo2Quiet(contextName + " env vars")
|
||||||
|
fmt.Println(env.Export(ExportFormatPretty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubUnset implements the logic for config:unset without app name validation
|
||||||
|
func SubUnset(appName string, keys []string, noRestart bool) error {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
return fmt.Errorf("At least one key must be given")
|
||||||
|
}
|
||||||
|
|
||||||
|
return UnsetMany(appName, keys, !noRestart)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core config plugin"
|
description = "dokku core config plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
112
plugins/config/src/config_sub/config_sub.go
Normal file
112
plugins/config/src/config_sub/config_sub.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/dokku/dokku/plugins/common"
|
||||||
|
"github.com/dokku/dokku/plugins/config"
|
||||||
|
|
||||||
|
flag "github.com/spf13/pflag"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getKeys(args []string, global bool) []string {
|
||||||
|
keys := args
|
||||||
|
if !global && len(keys) > 0 {
|
||||||
|
keys = keys[1:]
|
||||||
|
}
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
|
// main entrypoint to all subcommands
|
||||||
|
func main() {
|
||||||
|
action := os.Args[1]
|
||||||
|
|
||||||
|
var err error
|
||||||
|
appName := "--global"
|
||||||
|
switch action {
|
||||||
|
case "bundle":
|
||||||
|
args := flag.NewFlagSet("bundle", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
merged := args.Bool("merged", false, "--merged: merge app environment and global environment")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
err = config.SubBundle(appName, *merged)
|
||||||
|
case "clear":
|
||||||
|
args := flag.NewFlagSet("clear", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
noRestart := args.Bool("no-restart", false, "--no-restart: no restart")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
err = config.SubClear(appName, *noRestart)
|
||||||
|
case "export":
|
||||||
|
args := flag.NewFlagSet("export", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
merged := args.Bool("merged", false, "--merged: merge app environment and global environment")
|
||||||
|
format := args.String("format", "exports", "--format: [ docker-args | docker-args-keys | exports | envfile | json | json-list | pack-keys | pretty | shell ] which format to export as)")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
err = config.SubExport(appName, *merged, *format)
|
||||||
|
case "get":
|
||||||
|
args := flag.NewFlagSet("get", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
quoted := args.Bool("quoted", false, "--quoted: get the value quoted")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
keys := getKeys(args.Args(), *global)
|
||||||
|
err = config.SubGet(appName, keys, *quoted)
|
||||||
|
case "keys":
|
||||||
|
args := flag.NewFlagSet("keys", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
merged := args.Bool("merged", false, "--merged: merge app environment and global environment")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
err = config.SubKeys(appName, *merged)
|
||||||
|
case "show":
|
||||||
|
args := flag.NewFlagSet("show", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
merged := args.Bool("merged", false, "--merged: display the app's environment merged with the global environment")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
err = config.SubShow(appName, *merged, false, false)
|
||||||
|
case "set":
|
||||||
|
args := flag.NewFlagSet("set", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
encoded := args.Bool("encoded", false, "--encoded: interpret VALUEs as base64")
|
||||||
|
noRestart := args.Bool("no-restart", false, "--no-restart: no restart")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
pairs := getKeys(args.Args(), *global)
|
||||||
|
err = config.SubSet(appName, pairs, *noRestart, *encoded)
|
||||||
|
case "unset":
|
||||||
|
args := flag.NewFlagSet("unset", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: use the global environment")
|
||||||
|
noRestart := args.Bool("no-restart", false, "--no-restart: no restart")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
if !*global {
|
||||||
|
appName = args.Arg(0)
|
||||||
|
}
|
||||||
|
keys := getKeys(args.Args(), *global)
|
||||||
|
err = config.SubUnset(appName, keys, *noRestart)
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("Invalid plugin config_sub call: %s", action)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.LogFailWithError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,156 +1,83 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
// CommandBundle creates a tarball of a .env.d directory
|
||||||
"encoding/base64"
|
// containing env vars for the app
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/dokku/dokku/plugins/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CommandBundle implements config:bundle
|
|
||||||
func CommandBundle(appName string, global bool, merged bool) error {
|
func CommandBundle(appName string, global bool, merged bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
env := getEnvironment(appName, merged)
|
return SubBundle(appName, merged)
|
||||||
return env.ExportBundle(os.Stdout)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandClear implements config:clear
|
// CommandClear unsets all environment variables in use
|
||||||
func CommandClear(appName string, global bool, noRestart bool) error {
|
func CommandClear(appName string, global bool, noRestart bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return UnsetAll(appName, !noRestart)
|
return SubClear(appName, noRestart)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandExport implements config:export
|
// CommandExport outputs all env vars (merged or not, global or not)
|
||||||
|
// in the specified format for consumption by other tools
|
||||||
func CommandExport(appName string, global bool, merged bool, format string) error {
|
func CommandExport(appName string, global bool, merged bool, format string) error {
|
||||||
return export(appName, global, merged, format)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return SubExport(appName, merged, format)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandGet implements config:get
|
// CommandGet gets the value for the specified environment variable
|
||||||
func CommandGet(appName string, keys []string, global bool, quoted bool) error {
|
func CommandGet(appName string, keys []string, global bool, quoted bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(keys) == 0 {
|
return SubGet(appName, keys, quoted)
|
||||||
return errors.New("Expected: key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(keys) != 1 {
|
|
||||||
return fmt.Errorf("Unexpected argument(s): %v", keys[1:])
|
|
||||||
}
|
|
||||||
|
|
||||||
value, ok := Get(appName, keys[0])
|
|
||||||
if !ok {
|
|
||||||
os.Exit(1)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if quoted {
|
|
||||||
fmt.Printf("'%s'\n", singleQuoteEscape(value))
|
|
||||||
} else {
|
|
||||||
fmt.Printf("%s\n", value)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandKeys implements config:keys
|
// CommandKeys shows the keys set for the specified environment
|
||||||
func CommandKeys(appName string, global bool, merged bool) error {
|
func CommandKeys(appName string, global bool, merged bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
env := getEnvironment(appName, merged)
|
return SubKeys(appName, merged)
|
||||||
for _, k := range env.Keys() {
|
|
||||||
fmt.Println(k)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandSet implements config:set
|
// CommandSet sets one or more environment variable pairs
|
||||||
func CommandSet(appName string, pairs []string, global bool, noRestart bool, encoded bool) error {
|
func CommandSet(appName string, pairs []string, global bool, noRestart bool, encoded bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(pairs) == 0 {
|
return SubSet(appName, pairs, noRestart, encoded)
|
||||||
return errors.New("At least one env pair must be given")
|
|
||||||
}
|
|
||||||
|
|
||||||
updated := make(map[string]string)
|
|
||||||
for _, e := range pairs {
|
|
||||||
parts := strings.SplitN(e, "=", 2)
|
|
||||||
if len(parts) == 1 {
|
|
||||||
return fmt.Errorf("Invalid env pair: %v", e)
|
|
||||||
}
|
|
||||||
|
|
||||||
key, value := parts[0], parts[1]
|
|
||||||
if encoded {
|
|
||||||
decoded, err := base64.StdEncoding.DecodeString(value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("%s for key '%s'", err.Error(), key)
|
|
||||||
}
|
|
||||||
value = string(decoded)
|
|
||||||
}
|
|
||||||
updated[key] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
return SetMany(appName, updated, !noRestart)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandShow implements config:show
|
// CommandShow pretty-prints the specified environment vaiables
|
||||||
func CommandShow(appName string, global bool, merged bool, shell bool, export bool) error {
|
func CommandShow(appName string, global bool, merged bool, shell bool, export bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
env := getEnvironment(appName, merged)
|
return SubShow(appName, merged, shell, export)
|
||||||
if shell && export {
|
|
||||||
return errors.New("Only one of --shell and --export can be given")
|
|
||||||
}
|
|
||||||
if shell {
|
|
||||||
common.LogWarn("Deprecated: Use 'config:export --format shell' instead")
|
|
||||||
fmt.Print(env.Export(ExportFormatShell))
|
|
||||||
} else if export {
|
|
||||||
common.LogWarn("Deprecated: Use 'config:export --format exports' instead")
|
|
||||||
fmt.Println(env.Export(ExportFormatExports))
|
|
||||||
} else {
|
|
||||||
contextName := "global"
|
|
||||||
if appName != "" {
|
|
||||||
contextName = appName
|
|
||||||
}
|
|
||||||
common.LogInfo2Quiet(contextName + " env vars")
|
|
||||||
fmt.Println(env.Export(ExportFormatPretty))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandUnset implements config:unset
|
// CommandUnset unsets one or more keys in a specified environment
|
||||||
func CommandUnset(appName string, keys []string, global bool, noRestart bool) error {
|
func CommandUnset(appName string, keys []string, global bool, noRestart bool) error {
|
||||||
appName, err := getAppNameOrGlobal(appName, global)
|
appName, err := getAppNameOrGlobal(appName, global)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(keys) == 0 {
|
return SubUnset(appName, keys, noRestart)
|
||||||
return fmt.Errorf("At least one key must be given")
|
|
||||||
}
|
|
||||||
|
|
||||||
return UnsetMany(appName, keys, !noRestart)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,13 @@ func TriggerConfigExport(appName string, global string, merged string, format st
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return export(appName, g, m, format)
|
|
||||||
|
appName, err = getAppNameOrGlobal(appName, g)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return export(appName, m, format)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TriggerConfigGet returns an app config value by key
|
// TriggerConfigGet returns an app config value by key
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ func deleteCrontab() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func writeCronEntries() error {
|
func writeCronEntries() error {
|
||||||
apps, _ := common.DokkuApps()
|
apps, _ := common.UnfilteredDokkuApps()
|
||||||
commands := []templateCommand{}
|
commands := []templateCommand{}
|
||||||
for _, appName := range apps {
|
for _, appName := range apps {
|
||||||
scheduler := common.GetAppScheduler(appName)
|
scheduler := common.GetAppScheduler(appName)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core cron plugin"
|
description = "dokku core cron plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core docker-options plugin"
|
description = "dokku core docker-options plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ trigger-domains-install() {
|
|||||||
declare trigger="install"
|
declare trigger="install"
|
||||||
|
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
domains_setup "$app"
|
domains_setup "$app"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core domains plugin"
|
description = "dokku core domains plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core enter plugin"
|
description = "dokku core enter plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -58,7 +58,19 @@ git_trigger_build() {
|
|||||||
plugn trigger post-extract "$APP" "$TMP_WORK_DIR" "$REV"
|
plugn trigger post-extract "$APP" "$TMP_WORK_DIR" "$REV"
|
||||||
|
|
||||||
BUILDER="$(plugn trigger builder-detect "$APP" "$TMP_WORK_DIR" | head -n1 || true)"
|
BUILDER="$(plugn trigger builder-detect "$APP" "$TMP_WORK_DIR" | head -n1 || true)"
|
||||||
[[ -z "$BUILDER" ]] && BUILDER="herokuish"
|
if [[ -z "$BUILDER" ]]; then
|
||||||
|
BUILDER="herokuish"
|
||||||
|
local ARCHITECTURE="$(dpkg --print-architecture 2>/dev/null || true)"
|
||||||
|
if [[ "$ARCHITECTURE" == "arm64" ]]; then
|
||||||
|
dokku_log_warn "Herokuish builder not supported on $ARCHITECTURE servers."
|
||||||
|
dokku_log_warn "Switching to pack builder."
|
||||||
|
BUILDER="pack"
|
||||||
|
elif [[ "$ARCHITECTURE" == "armhf" ]]; then
|
||||||
|
dokku_log_warn "Herokuish builder not supported on $ARCHITECTURE servers."
|
||||||
|
dokku_log_warn "Consider using a Dockerfile to build your app."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
plugn trigger pre-receive-app "$APP" "$BUILDER" "$TMP_WORK_DIR" "$REV"
|
plugn trigger pre-receive-app "$APP" "$BUILDER" "$TMP_WORK_DIR" "$REV"
|
||||||
dokku_receive "$APP" "$BUILDER" "$TMP_WORK_DIR"
|
dokku_receive "$APP" "$BUILDER" "$TMP_WORK_DIR"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ migrate_git_vars_0_12_0() {
|
|||||||
DOKKU_QUIET_OUTPUT=1 config_unset --global DOKKU_DEPLOY_BRANCH || true
|
DOKKU_QUIET_OUTPUT=1 config_unset --global DOKKU_DEPLOY_BRANCH || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
DOKKU_DEPLOY_BRANCH=$(config_get "$app" DOKKU_DEPLOY_BRANCH || true)
|
DOKKU_DEPLOY_BRANCH=$(config_get "$app" DOKKU_DEPLOY_BRANCH || true)
|
||||||
if [[ -n "$DOKKU_DEPLOY_BRANCH" ]]; then
|
if [[ -n "$DOKKU_DEPLOY_BRANCH" ]]; then
|
||||||
fn-plugin-property-write "git" "$app" "deploy-branch" "$DOKKU_DEPLOY_BRANCH"
|
fn-plugin-property-write "git" "$app" "deploy-branch" "$DOKKU_DEPLOY_BRANCH"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core git plugin"
|
description = "dokku core git plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ func sinkValueToConfig(appName string, sinkValue string) (vectorSink, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func writeVectorConfig() error {
|
func writeVectorConfig() error {
|
||||||
apps, _ := common.DokkuApps()
|
apps, _ := common.UnfilteredDokkuApps()
|
||||||
data := vectorConfig{
|
data := vectorConfig{
|
||||||
Sources: map[string]vectorSource{},
|
Sources: map[string]vectorSource{},
|
||||||
Sinks: map[string]vectorSink{},
|
Sinks: map[string]vectorSink{},
|
||||||
@@ -168,18 +168,18 @@ func writeVectorConfig() error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
appName = strings.ReplaceAll(appName, ".", "-")
|
inflectedAppName := strings.ReplaceAll(appName, ".", "-")
|
||||||
sink, err := sinkValueToConfig(appName, value)
|
sink, err := sinkValueToConfig(inflectedAppName, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data.Sources[fmt.Sprintf("docker-source:%s", appName)] = vectorSource{
|
data.Sources[fmt.Sprintf("docker-source:%s", inflectedAppName)] = vectorSource{
|
||||||
Type: "docker_logs",
|
Type: "docker_logs",
|
||||||
IncludeLabels: []string{fmt.Sprintf("com.dokku.app-name=%s", appName)},
|
IncludeLabels: []string{fmt.Sprintf("com.dokku.app-name=%s", appName)},
|
||||||
}
|
}
|
||||||
|
|
||||||
data.Sinks[fmt.Sprintf("docker-sink:%s", appName)] = sink
|
data.Sinks[fmt.Sprintf("docker-sink:%s", inflectedAppName)] = sink
|
||||||
}
|
}
|
||||||
|
|
||||||
value := common.PropertyGet("logs", "--global", "vector-sink")
|
value := common.PropertyGet("logs", "--global", "vector-sink")
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core logs plugin"
|
description = "dokku core logs plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core network plugin"
|
description = "dokku core network plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func TriggerInstall() error {
|
|||||||
return fmt.Errorf("Unable to install the network plugin: %s", err.Error())
|
return fmt.Errorf("Unable to install the network plugin: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
apps, err := common.DokkuApps()
|
apps, err := common.UnfilteredDokkuApps()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ validate_nginx() {
|
|||||||
verify_app_name "$APP"
|
verify_app_name "$APP"
|
||||||
nginx_vhosts_validate_single_func "$APP" "$FLAG"
|
nginx_vhosts_validate_single_func "$APP" "$FLAG"
|
||||||
else
|
else
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
nginx_vhosts_validate_single_func "$app" "$FLAG"
|
nginx_vhosts_validate_single_func "$app" "$FLAG"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ trigger-nginx-vhosts-install() {
|
|||||||
[[ -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
|
||||||
|
|
||||||
# @TODO: Remove this after a few versions
|
# @TODO: Remove this after a few versions
|
||||||
for app in $(dokku_apps); do
|
for app in $(dokku_apps "false"); do
|
||||||
nginx_port="$(config_get "$app" DOKKU_NGINX_PORT || true)"
|
nginx_port="$(config_get "$app" DOKKU_NGINX_PORT || true)"
|
||||||
nginx_ssl_port="$(config_get "$app" DOKKU_NGINX_SSL_PORT || true)"
|
nginx_ssl_port="$(config_get "$app" DOKKU_NGINX_SSL_PORT || true)"
|
||||||
if [[ -n "$nginx_port" ]] || [[ -n "$nginx_ssl_port" ]]; then
|
if [[ -n "$nginx_port" ]] || [[ -n "$nginx_ssl_port" ]]; then
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core nginx-vhosts plugin"
|
description = "dokku core nginx-vhosts plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core plugin plugin"
|
description = "dokku core plugin plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core proxy plugin"
|
description = "dokku core proxy plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core ps plugin"
|
description = "dokku core ps plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ func TriggerInstall() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
apps, err := common.DokkuApps()
|
apps, err := common.UnfilteredDokkuApps()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core registry plugin"
|
description = "dokku core registry plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core repo plugin"
|
description = "dokku core repo plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core resource plugin"
|
description = "dokku core resource plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core run plugin"
|
description = "dokku core run plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core scheduler-docker-local plugin"
|
description = "dokku core scheduler-docker-local plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core scheduler-null plugin"
|
description = "dokku core scheduler-null plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core scheduler plugin"
|
description = "dokku core scheduler plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func TriggerInstall() error {
|
|||||||
return fmt.Errorf("Unable to install the scheduler plugin: %s", err.Error())
|
return fmt.Errorf("Unable to install the scheduler plugin: %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
apps, err := common.DokkuApps()
|
apps, err := common.UnfilteredDokkuApps()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core shell plugin"
|
description = "dokku core shell plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core ssh-keys plugin"
|
description = "dokku core ssh-keys plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ set -eo pipefail
|
|||||||
trigger-storage-install() {
|
trigger-storage-install() {
|
||||||
declare desc="storage install trigger"
|
declare desc="storage install trigger"
|
||||||
declare trigger="install"
|
declare trigger="install"
|
||||||
local storage_directory="${DOKKU_LIB_ROOT}/data/storage"
|
|
||||||
mkdir -p "${storage_directory}"
|
mkdir -p "${DOKKU_LIB_ROOT}/data/storage"
|
||||||
chown dokku:dokku "${storage_directory}"
|
chown "${DOKKU_SYSTEM_USER}:${DOKKU_SYSTEM_GROUP}" "${DOKKU_LIB_ROOT}/data/storage"
|
||||||
|
|
||||||
STORAGE_SUDOERS_FILE="/etc/sudoers.d/dokku-storage"
|
STORAGE_SUDOERS_FILE="/etc/sudoers.d/dokku-storage"
|
||||||
local mode="0440"
|
local mode="0440"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core storage plugin"
|
description = "dokku core storage plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[plugin]
|
[plugin]
|
||||||
description = "dokku core trace plugin"
|
description = "dokku core trace plugin"
|
||||||
version = "0.27.2"
|
version = "0.27.7"
|
||||||
[plugin.config]
|
[plugin.config]
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-servlet</artifactId>
|
<artifactId>jetty-servlet</artifactId>
|
||||||
<version>11.0.9</version>
|
<version>11.0.11</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
|
|||||||
14
tests/apps/multi/package-lock.json
generated
14
tests/apps/multi/package-lock.json
generated
@@ -11,7 +11,7 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bower": "^1.8.0",
|
"bower": "^1.8.0",
|
||||||
"grunt": "~1.5.2",
|
"grunt": "~1.5.3",
|
||||||
"grunt-cli": "~1.4.3",
|
"grunt-cli": "~1.4.3",
|
||||||
"grunt-contrib-compass": "~1.1.1",
|
"grunt-contrib-compass": "~1.1.1",
|
||||||
"load-grunt-tasks": "~5.1.0",
|
"load-grunt-tasks": "~5.1.0",
|
||||||
@@ -517,9 +517,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/grunt": {
|
"node_modules/grunt": {
|
||||||
"version": "1.5.2",
|
"version": "1.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
|
||||||
"integrity": "sha512-XCtfaIu72OyDqK24MjWiGC9SwlkuhkS1mrULr1xzuJ2XqAFhP3ZAchZGHJeSCY6mkaOXU4F7SbmmCF7xIVoC9w==",
|
"integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dateformat": "~3.0.3",
|
"dateformat": "~3.0.3",
|
||||||
"eventemitter2": "~0.4.13",
|
"eventemitter2": "~0.4.13",
|
||||||
@@ -2110,9 +2110,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"grunt": {
|
"grunt": {
|
||||||
"version": "1.5.2",
|
"version": "1.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
|
||||||
"integrity": "sha512-XCtfaIu72OyDqK24MjWiGC9SwlkuhkS1mrULr1xzuJ2XqAFhP3ZAchZGHJeSCY6mkaOXU4F7SbmmCF7xIVoC9w==",
|
"integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"dateformat": "~3.0.3",
|
"dateformat": "~3.0.3",
|
||||||
"eventemitter2": "~0.4.13",
|
"eventemitter2": "~0.4.13",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user