Merge pull request #8640 from dokku/8631-caddy-haproxy-traefik-report-global-lacks-raw-key-for-global-properties

Split report global keys into raw and computed
This commit is contained in:
Jose Diaz-Gonzalez
2026-05-23 22:54:23 -04:00
committed by GitHub
93 changed files with 2868 additions and 413 deletions

View File

@@ -169,3 +169,26 @@ Available flags:
- `--builds-computed-retention`: the resolved retention applied to this app - `--builds-computed-retention`: the resolved retention applied to this app
`--build-status` returns the **display** status, so an abandoned in-flight build shows `abandoned` rather than `running`. The raw on-disk status is only visible by reading the JSON record directly. `--build-status` returns the **display** status, so an abandoned in-flight build shows `abandoned` rather than `running`. The raw on-disk status is only visible by reading the JSON record directly.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `retention` | app + global | `20` | `--builds-retention`, `--builds-global-retention`, `--builds-computed-retention` | Number of recent build records kept per app; older finalized records are pruned at the end of each deploy |
### Read-only flags
The following flags surface in `builds:report` but are not managed by `builds:set` - they are derived metadata recorded during the build:
| Flag | Description |
|---|---|
| `--build-id` | Unique identifier of the most recent build for the app |
| `--build-kind` | Whether the record was a `build` or a `deploy` |
| `--build-status` | Display status (`running`, `succeeded`, `failed`, `canceled`, `abandoned`); computed at read time |
| `--build-source` | Trigger that started the build (e.g. `git-hook`, `ps:rebuild`, `ps:restart`) |
| `--build-pid` | PID of the build process |
| `--build-started-at` | UNIX timestamp the build started |
| `--build-finished-at` | UNIX timestamp the build finished |
| `--build-exit-code` | Exit code of the build process |

View File

@@ -101,18 +101,20 @@ dokku app-json:report
``` ```
=====> node-js-app app-json information =====> node-js-app app-json information
App-json computed appjson path: app2.json App-json computed appjson path: app2.json
App-json global appjson path: app.json App-json global appjson path:
App-json appjson path: app2.json App-json appjson path: app2.json
=====> python-sample app-json information =====> python-sample app-json information
App-json computed appjson path: app.json App-json computed appjson path: app.json
App-json global appjson path: app.json App-json global appjson path:
App-json appjson path: App-json appjson path:
=====> ruby-sample app-json information =====> ruby-sample app-json information
App-json computed appjson path: app.json App-json computed appjson path: app.json
App-json global appjson path: app.json App-json global appjson path:
App-json appjson path: App-json appjson path:
``` ```
The `appjson-path` and `global-appjson-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-appjson-path` key holds the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default of `app.json`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -122,7 +124,7 @@ dokku app-json:report node-js-app
``` ```
=====> node-js-app app-json information =====> node-js-app app-json information
App-json computed appjson path: app2.json App-json computed appjson path: app2.json
App-json global appjson path: app.json App-json global appjson path:
App-json appjson path: app2.json App-json appjson path: app2.json
``` ```

View File

@@ -230,3 +230,13 @@ The `docker-options:list` command prints the options stored for a single process
dokku docker-options:list node-js-app --process web --phase deploy dokku docker-options:list node-js-app --process web --phase deploy
dokku docker-options:list node-js-app --phase deploy dokku docker-options:list node-js-app --phase deploy
``` ```
## Properties
### Internal properties
The following property is recorded internally by the docker-options plugin and is not exposed via `docker-options:report`:
| Property | Description | Source |
|---|---|---|
| `migrated-from-files` | Global migration sentinel that records that the legacy `DOCKER_OPTIONS_<PHASE>` flat-file store has been drained into plugin properties | `plugins/docker-options/functions.go` writes `"true"` once the install-time migration runs |

View File

@@ -208,3 +208,15 @@ dokku registry:set node-js-app push-extra-tags
# globally # globally
dokku registry:set --global push-extra-tags dokku registry:set --global push-extra-tags
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `image-repo` | app only | `dokku/<app>` | `--registry-image-repo`, `--registry-computed-image-repo` | Repository name used when pushing the app's image (overrides the global template) |
| `image-repo-template` | global only | `dokku/{{ .AppName }}` | `--registry-global-image-repo-template` | Go template used to compute the per-app image repository when `image-repo` is unset |
| `push-extra-tags` | app + global | none | `--registry-push-extra-tags` | Comma-separated list of additional tags pushed alongside the deploy tag |
| `push-on-release` | app + global | `false` | `--registry-push-on-release`, `--registry-global-push-on-release`, `--registry-computed-push-on-release` | When `true`, pushes the image to the registry on every successful build |
| `server` | app + global | none | `--registry-server`, `--registry-global-server`, `--registry-computed-server` | Registry server host (e.g. `ghcr.io`) used when pushing images |

View File

@@ -21,6 +21,7 @@
- The `docker-local` scheduler now sends `SIGTERM` to old containers immediately after a successful deploy, rather than waiting `wait-to-retire` seconds before signaling. This matches Heroku's graceful-shutdown contract and lets applications begin draining in-flight work as soon as proxy traffic switches. The `wait-to-retire` grace period and `stop-timeout-seconds` hard-stop continue to apply as before. See the [zero downtime deploys documentation](/docs/deployment/zero-downtime-deploys.md#wait-to-retire) for more details. - The `docker-local` scheduler now sends `SIGTERM` to old containers immediately after a successful deploy, rather than waiting `wait-to-retire` seconds before signaling. This matches Heroku's graceful-shutdown contract and lets applications begin draining in-flight work as soon as proxy traffic switches. The `wait-to-retire` grace period and `stop-timeout-seconds` hard-stop continue to apply as before. See the [zero downtime deploys documentation](/docs/deployment/zero-downtime-deploys.md#wait-to-retire) for more details.
- The `docker-local` scheduler no longer queues an image for retirement when another running container of the same app still uses it. This fixes the case where a `ps:rebuild` against an image-based deploy (`git:from-image`) produced an identical-SHA image and the `dokku-retire` cron timer would log `Image ... has running containers, skipping rm` on every run. Stuck entries from prior versions are pruned automatically on the next `ps:retire` run. - The `docker-local` scheduler no longer queues an image for retirement when another running container of the same app still uses it. This fixes the case where a `ps:rebuild` against an image-based deploy (`git:from-image`) produced an identical-SHA image and the `dokku-retire` cron timer would log `Image ... has running containers, skipping rm` on every run. Stuck entries from prior versions are pruned automatically on the next `ps:retire` run.
- All `:report` subcommands now accept the `--global` flag, which scopes the report to globally-configured properties. The flag composes with `--format json`, so a JSON report of global properties can be obtained via, for example, `dokku scheduler:report --global --format json`. Previously, combining `--global` with `--format json` was rejected with an "info flag" error, and `--global` on its own was treated as an unknown flag. - All `:report` subcommands now accept the `--global` flag, which scopes the report to globally-configured properties. The flag composes with `--format json`, so a JSON report of global properties can be obtained via, for example, `dokku scheduler:report --global --format json`. Previously, combining `--global` with `--format json` was rejected with an "info flag" error, and `--global` on its own was treated as an unknown flag.
- Every `:report` key of the form `<plugin>-global-<property>` now returns the raw stored global value (empty when the property has never been set) instead of the resolved value with the built-in default substituted in. A new `<plugin>-computed-<property>` key has been added wherever a default existed and returns the effective value (per-app value, falling back to the global value, then to the built-in default). This affects `caddy`, `haproxy`, `traefik`, `app-json`, `builder-dockerfile`, `builder-herokuish`, `builder-lambda`, `builder-nixpacks`, `builder-pack`, `builder-railpack`, `checks`, `git`, `logs`, `network`, `proxy`, and `scheduler`. External tooling that read `<plugin>-global-<property>` and depended on the default value should switch to `<plugin>-computed-<property>`. The bare `<plugin>-<property>` keys for caddy/haproxy/traefik global-only properties (`caddy-image`, `haproxy-log-level`, `traefik-api-enabled`, etc.) have also been replaced by the `global-` and `computed-` pair.
- The `scheduler-k3s` plugin now manages env config and the dokku-generated image pull Secret as their own helm releases with stable names (`config-{app}` and `pull-secret-{app}`) rather than bundling them into the app helm chart with a per-deploy timestamp suffix (`env-{app}.{ts}` / `ims-{app}.{ts}`). This fixes two bugs: a helm rollback of the app chart no longer deletes Secrets that older ReplicaSets still reference, and the Deployment's `imagePullSecrets` list no longer accumulates references to nonexistent Secrets across deploys. The next deploy of an app switches the Deployment's `envFrom` and `imagePullSecrets` references to the stable names and prunes any leaked entries; existing live Deployments do not need to be patched manually. App rename now also uninstalls the old `tls-{app}`, `config-{app}`, and `pull-secret-{app}` releases under the previous app name; the new name's releases are recreated on the next deploy or certs sync. - The `scheduler-k3s` plugin now manages env config and the dokku-generated image pull Secret as their own helm releases with stable names (`config-{app}` and `pull-secret-{app}`) rather than bundling them into the app helm chart with a per-deploy timestamp suffix (`env-{app}.{ts}` / `ims-{app}.{ts}`). This fixes two bugs: a helm rollback of the app chart no longer deletes Secrets that older ReplicaSets still reference, and the Deployment's `imagePullSecrets` list no longer accumulates references to nonexistent Secrets across deploys. The next deploy of an app switches the Deployment's `envFrom` and `imagePullSecrets` references to the stable names and prunes any leaked entries; existing live Deployments do not need to be patched manually. App rename now also uninstalls the old `tls-{app}`, `config-{app}`, and `pull-secret-{app}` releases under the previous app name; the new name's releases are recreated on the next deploy or certs sync.
- The storage plugin now treats persistent volumes as named, scheduler-aware first-class resources via `storage:create`, `storage:mount`, `storage:set`, and `storage:destroy`. The legacy `storage:mount <app> <host>:<container>` colon form continues to work on docker-local apps but is deprecated; on k3s apps it is rejected. Existing colon-form mounts are migrated automatically the first time the new storage plugin runs (during the install trigger) - they appear as `legacy-<hash>` entries in `storage:list-entries`. The migration is idempotent and tied to a per-app flag file at `$DOKKU_LIB_ROOT/config/storage/.migrated/<app>`; deleting that file forces a re-scan on the next install. The `storage:ensure-directory` command keeps working but now emits a deprecation warning - prefer `storage:create <name> [<path>]` (the path defaults to the same `$DOKKU_LIB_ROOT/data/storage/<name>` location). Storage entry names must now be DNS-1123 labels of 45 characters or less so they can be used verbatim as Helm release and Kubernetes resource names; underscores and uppercase characters that the older `ensure-directory` validator accepted are rejected for new names. The migration synthesizer always uses lowercase hex hashes so existing data is never locked out. - The storage plugin now treats persistent volumes as named, scheduler-aware first-class resources via `storage:create`, `storage:mount`, `storage:set`, and `storage:destroy`. The legacy `storage:mount <app> <host>:<container>` colon form continues to work on docker-local apps but is deprecated; on k3s apps it is rejected. Existing colon-form mounts are migrated automatically the first time the new storage plugin runs (during the install trigger) - they appear as `legacy-<hash>` entries in `storage:list-entries`. The migration is idempotent and tied to a per-app flag file at `$DOKKU_LIB_ROOT/config/storage/.migrated/<app>`; deleting that file forces a re-scan on the next install. The `storage:ensure-directory` command keeps working but now emits a deprecation warning - prefer `storage:create <name> [<path>]` (the path defaults to the same `$DOKKU_LIB_ROOT/data/storage/<name>` location). Storage entry names must now be DNS-1123 labels of 45 characters or less so they can be used verbatim as Helm release and Kubernetes resource names; underscores and uppercase characters that the older `ensure-directory` validator accepted are rejected for new names. The migration synthesizer always uses lowercase hex hashes so existing data is never locked out.

View File

@@ -288,3 +288,11 @@ An autoscaling trigger consists of the following properties:
- Example use-cases - Example use-cases
- Setting up OAuth clients and DNS - Setting up OAuth clients and DNS
- Loading seed/test data into the app’s test database - Loading seed/test data into the app’s test database
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `appjson-path` | app + global | `app.json` | `--app-json-appjson-path`, `--app-json-global-appjson-path`, `--app-json-computed-appjson-path` | Path within the app to the `app.json` manifest, relative to the build root |

View File

@@ -129,3 +129,13 @@ The following config variables have special meanings and can be set in a variety
| `DOKKU_TRACE` | none | `dokku trace:on` <br /> `dokku trace:off` <br /> `--trace` flag | Turn on very verbose debugging. | | `DOKKU_TRACE` | none | `dokku trace:on` <br /> `dokku trace:off` <br /> `--trace` flag | Turn on very verbose debugging. |
| `DOKKU_SYSTEM_GROUP` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System group to chown files as. | | `DOKKU_SYSTEM_GROUP` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System group to chown files as. |
| `DOKKU_SYSTEM_USER` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System user to chown files as. | | `DOKKU_SYSTEM_USER` | `dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | System user to chown files as. |
## Properties
### Internal properties
The following property is recorded internally by the config plugin and is not exposed via `config:report`:
| Property | Description | Source |
|---|---|---|
| `env-migrated` | Migration sentinel that records the per-app or global `DOKKU_*` env-var → property migration completed for 0.38.0 | `plugins/config/triggers.go` writes `"true"` after the upgrade-time pass |

View File

@@ -150,3 +150,20 @@ If an `https:443:*` port mapping already exists when a certificate is installed
### Running behind a proxy (`X-Forwarded-Ssl`, etc.) ### Running behind a proxy (`X-Forwarded-Ssl`, etc.)
See the [running behind another proxy documentation](/docs/networking/proxies/nginx.md#running-behind-another-proxy--configuring-x-forwarded--headers) for more information on how to configure your Nginx config when your server is running behind a proxy (e.g. load balancer, etc.). See the [running behind another proxy documentation](/docs/networking/proxies/nginx.md#running-behind-another-proxy--configuring-x-forwarded--headers) for more information on how to configure your Nginx config when your server is running behind a proxy (e.g. load balancer, etc.).
## Properties
### Read-only flags
The following flags surface in `certs:report` but are not managed by `certs:set` - they are derived from the on-disk certificate:
| Flag | Description |
|---|---|
| `--ssl-enabled` | `true` when an SSL certificate is installed for the app |
| `--ssl-dir` | Absolute path to the per-app certificate directory |
| `--ssl-hostnames` | Hostnames the certificate covers (CN plus Subject Alternative Names) |
| `--ssl-issuer` | Certificate issuer DN |
| `--ssl-subject` | Certificate subject DN |
| `--ssl-verified` | `true` if the certificate chain verifies against the system CA bundle |
| `--ssl-expires-at` | Certificate `notAfter` timestamp |
| `--ssl-starts-at` | Certificate `notBefore` timestamp |

View File

@@ -312,3 +312,17 @@ You can pass flags which will output only the value of the specific information
```shell ```shell
dokku apps:report node-js-app --app-dir dokku apps:report node-js-app --app-dir
``` ```
## Properties
### Read-only flags
The following flags surface in `apps:report` but are not managed by `apps:set`:
| Flag | Description |
|---|---|
| `--app-created-at` | UNIX timestamp of app creation |
| `--app-deploy-source` | Source kind of the last deploy (`git`, `archive`, `docker-image`, `git-sync`) |
| `--app-deploy-source-metadata` | Free-form metadata for the deploy source (commit sha, image ref, URL) |
| `--app-dir` | Absolute path of the app root on disk |
| `--app-locked` | `true` while a deploy or rebuild holds the app lock |

View File

@@ -172,3 +172,21 @@ Custom plugins names _must_ have the prefix `builder-` or builder overriding via
Builders can use any tools available on the system to build the docker image, and may even be used to schedule building off-server. The only current requirement is that the image must exist on the server at the end of the `builder-build` command, though this requirement may be relaxed in a future release. Builders can use any tools available on the system to build the docker image, and may even be used to schedule building off-server. The only current requirement is that the image must exist on the server at the end of the `builder-build` command, though this requirement may be relaxed in a future release.
For a simple example of how to implement this trigger, see `builder-pack`, which utilizes a cli tool - `pack-cli` - to generate an OCI image that is compatible with Docker and can be scheduled by the official scheduling plugins. For a simple example of how to implement this trigger, see `builder-pack`, which utilizes a cli tool - `pack-cli` - to generate an OCI image that is compatible with Docker and can be scheduled by the official scheduling plugins.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `build-dir` | app + global | none | `--builder-build-dir`, `--builder-global-build-dir`, `--builder-computed-build-dir` | Subdirectory within the repository to use as the build context |
| `selected` | app + global | none | `--builder-selected`, `--builder-global-selected`, `--builder-computed-selected` | Builder plugin to use; overrides automatic detection |
| `skip-cleanup` | app + global | none | (not in report) | When `true`, leaves intermediate build artifacts in place after the build |
### Read-only flags
The following flags surface in `builder:report` but are not managed by `builder:set`:
| Flag | Description |
|---|---|
| `--builder-detected` | Builder auto-selected for the app when `selected` is unset |

View File

@@ -190,3 +190,13 @@ You can pass flags which will output only the value of the specific information
```shell ```shell
dokku buildpacks:report node-js-app --buildpacks-list dokku buildpacks:report node-js-app --buildpacks-list
``` ```
## Properties
### Settable properties
These properties are managed via `buildpacks:set-property` (the legacy command name for this plugin).
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `stack` | app + global | none | `--buildpacks-stack`, `--buildpacks-global-stack`, `--buildpacks-computed-stack` | Herokuish stack image used to compile the app (e.g. `heroku/heroku:24`) |

View File

@@ -98,18 +98,20 @@ dokku builder-pack:report
``` ```
=====> node-js-app builder-pack information =====> node-js-app builder-pack information
Builder pack computed projecttoml path: project2.toml Builder pack computed projecttoml path: project2.toml
Builder pack global projecttoml path: project.toml Builder pack global projecttoml path:
Builder pack projecttoml path: project2.toml Builder pack projecttoml path: project2.toml
=====> python-sample builder-pack information =====> python-sample builder-pack information
Builder pack computed projecttoml path: project.toml Builder pack computed projecttoml path: project.toml
Builder pack global projecttoml path: project.toml Builder pack global projecttoml path:
Builder pack projecttoml path: Builder pack projecttoml path:
=====> ruby-sample builder-pack information =====> ruby-sample builder-pack information
Builder pack computed projecttoml path: project.toml Builder pack computed projecttoml path: project.toml
Builder pack global projecttoml path: project.json Builder pack global projecttoml path:
Builder pack projecttoml path: Builder pack projecttoml path:
``` ```
The `projecttoml-path` and `global-projecttoml-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-projecttoml-path` key holds the effective value used at build time, falling back to the global value (where one has been set) and then to the built-in default of `project.toml`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -119,7 +121,7 @@ dokku builder-pack:report node-js-app
``` ```
=====> node-js-app builder-pack information =====> node-js-app builder-pack information
Builder pack computed projecttoml path: project2.toml Builder pack computed projecttoml path: project2.toml
Builder pack global projecttoml path: project.toml Builder pack global projecttoml path:
Builder pack projecttoml path: project2.toml Builder pack projecttoml path: project2.toml
``` ```
@@ -165,3 +167,11 @@ dokku buildpacks:set-property --global stack
### Specifying commands via Procfile ### Specifying commands via Procfile
See the [Procfile documentation](/docs/processes/process-management.md#procfile) for more information on how to specify different processes for your app. See the [Procfile documentation](/docs/processes/process-management.md#procfile) for more information on how to specify different processes for your app.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `projecttoml-path` | app + global | `project.toml` | `--builder-pack-projecttoml-path`, `--builder-pack-global-projecttoml-path`, `--builder-pack-computed-projecttoml-path` | Path within the app to the CNB `project.toml` manifest, relative to the build root |

View File

@@ -82,18 +82,20 @@ dokku builder-dockerfile:report
``` ```
=====> node-js-app builder-dockerfile information =====> node-js-app builder-dockerfile information
Builder dockerfile computed dockerfile path: Dockerfile2 Builder dockerfile computed dockerfile path: Dockerfile2
Builder dockerfile global dockerfile path: Dockerfile Builder dockerfile global dockerfile path:
Builder dockerfile dockerfile path: Dockerfile2 Builder dockerfile dockerfile path: Dockerfile2
=====> python-sample builder-dockerfile information =====> python-sample builder-dockerfile information
Builder dockerfile computed dockerfile path: Dockerfile Builder dockerfile computed dockerfile path: Dockerfile
Builder dockerfile global dockerfile path: Dockerfile Builder dockerfile global dockerfile path:
Builder dockerfile dockerfile path: Builder dockerfile dockerfile path:
=====> ruby-sample builder-dockerfile information =====> ruby-sample builder-dockerfile information
Builder dockerfile computed dockerfile path: Dockerfile Builder dockerfile computed dockerfile path: Dockerfile
Builder dockerfile global dockerfile path: Dockerfile Builder dockerfile global dockerfile path:
Builder dockerfile dockerfile path: Builder dockerfile dockerfile path:
``` ```
The `dockerfile-path` and `global-dockerfile-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-dockerfile-path` key holds the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default of `Dockerfile`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -103,7 +105,7 @@ dokku builder-dockerfile:report node-js-app
``` ```
=====> node-js-app builder-dockerfile information =====> node-js-app builder-dockerfile information
Builder dockerfile computed dockerfile path: Dockerfile2 Builder dockerfile computed dockerfile path: Dockerfile2
Builder dockerfile global dockerfile path: Dockerfile Builder dockerfile global dockerfile path:
Builder dockerfile dockerfile path: Dockerfile2 Builder dockerfile dockerfile path: Dockerfile2
``` ```
@@ -213,3 +215,11 @@ See the [Procfile documentation](/docs/processes/process-management.md#procfile)
### Exposed ports ### Exposed ports
See the [port management documentation](/docs/networking/port-management.md) for more information on how Dokku exposes ports for applications and how you can configure these for your app. See the [port management documentation](/docs/networking/port-management.md) for more information on how Dokku exposes ports for applications and how you can configure these for your app.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `dockerfile-path` | app + global | `Dockerfile` | `--builder-dockerfile-dockerfile-path`, `--builder-dockerfile-global-dockerfile-path`, `--builder-dockerfile-computed-dockerfile-path` | Path within the app to the Dockerfile used by the dockerfile builder |

View File

@@ -117,18 +117,20 @@ dokku builder-herokuish:report
``` ```
=====> node-js-app builder-herokuish information =====> node-js-app builder-herokuish information
Builder herokuish computed allowed: false Builder herokuish computed allowed: false
Builder herokuish global allowed: true Builder herokuish global allowed:
Builder herokuish allowed: false Builder herokuish allowed: false
=====> python-sample builder-herokuish information =====> python-sample builder-herokuish information
Builder herokuish computed allowed: true Builder herokuish computed allowed: true
Builder herokuish global allowed: true Builder herokuish global allowed:
Builder herokuish allowed: Builder herokuish allowed:
=====> ruby-sample builder-herokuish information =====> ruby-sample builder-herokuish information
Builder herokuish computed allowed: true Builder herokuish computed allowed: true
Builder herokuish global allowed: true Builder herokuish global allowed:
Builder herokuish allowed: Builder herokuish allowed:
``` ```
The `allowed` and `global-allowed` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-allowed` key holds the effective value used at build time, falling back to the global value (where one has been set) and then to the built-in default (`true` on amd64, `false` otherwise).
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -138,7 +140,7 @@ dokku builder-herokuish:report node-js-app
``` ```
=====> node-js-app builder-herokuish information =====> node-js-app builder-herokuish information
Builder herokuish computed allowed: false Builder herokuish computed allowed: false
Builder herokuish global allowed: true Builder herokuish global allowed:
Builder herokuish allowed: false Builder herokuish allowed: false
``` ```
@@ -208,4 +210,12 @@ See the [buildpack management documentation](/docs/processes/process-management.
### Displaying buildpack reports for an app ### Displaying buildpack reports for an app
See the [buildpack management documentation](/docs/processes/process-management.md#displaying-buildpack-reports-for-an-app) for more information on how to display buildpack reports for an app. See the [buildpack management documentation](/docs/processes/process-management.md#displaying-buildpack-reports-for-an-app) for more information on how to display buildpack reports for an app.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `allowed` | app + global | `true` | `--builder-herokuish-allowed`, `--builder-herokuish-global-allowed`, `--builder-herokuish-computed-allowed` | When `false`, the herokuish builder is skipped during builder detection for this app |

View File

@@ -84,18 +84,20 @@ dokku builder-lambda:report
``` ```
=====> node-js-app builder-lambda information =====> node-js-app builder-lambda information
Builder lambda computed lambdayml path: lambda2.yml Builder lambda computed lambdayml path: lambda2.yml
Builder lambda global lambdayml path: lambda.yml Builder lambda global lambdayml path:
Builder lambda lambdayml path: lambda2.yml Builder lambda lambdayml path: lambda2.yml
=====> python-sample builder-lambda information =====> python-sample builder-lambda information
Builder lambda computed lambdayml path: lambda.yml Builder lambda computed lambdayml path: lambda.yml
Builder lambda global lambdayml path: lambda.yml Builder lambda global lambdayml path:
Builder lambda lambdayml path: Builder lambda lambdayml path:
=====> ruby-sample builder-lambda information =====> ruby-sample builder-lambda information
Builder lambda computed lambdayml path: lambda.yml Builder lambda computed lambdayml path: lambda.yml
Builder lambda global lambdayml path: lambda.yml Builder lambda global lambdayml path:
Builder lambda lambdayml path: Builder lambda lambdayml path:
``` ```
The `lambdayml-path` and `global-lambdayml-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-lambdayml-path` key holds the effective value used at build time, falling back to the global value (where one has been set) and then to the built-in default of `lambda.yml`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -105,7 +107,7 @@ dokku builder-lambda:report node-js-app
``` ```
=====> node-js-app builder-lambda information =====> node-js-app builder-lambda information
Builder lambda computed lambdayml path: lambda2.yml Builder lambda computed lambdayml path: lambda2.yml
Builder lambda global lambdayml path: lambda.yml Builder lambda global lambdayml path:
Builder lambda lambdayml path: lambda2.yml Builder lambda lambdayml path: lambda2.yml
``` ```
@@ -118,3 +120,11 @@ dokku builder-lambda:report node-js-app --builder-lambda-lambdayml-path
``` ```
lambda2.yml lambda2.yml
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `lambdayml-path` | app + global | `lambda.yml` | `--builder-lambda-lambdayml-path`, `--builder-lambda-global-lambdayml-path`, `--builder-lambda-computed-lambdayml-path` | Path within the app to the `lambda.yml` manifest used by the lambda builder |

View File

@@ -97,18 +97,20 @@ dokku builder-nixpacks:report
``` ```
=====> node-js-app builder-nixpacks information =====> node-js-app builder-nixpacks information
Builder-nixpacks computed nixpackstoml path: nixpacks2.toml Builder-nixpacks computed nixpackstoml path: nixpacks2.toml
Builder-nixpacks global nixpackstoml path: nixpacks.toml Builder-nixpacks global nixpackstoml path:
Builder-nixpacks nixpackstoml path: nixpacks2.toml Builder-nixpacks nixpackstoml path: nixpacks2.toml
=====> python-sample builder-nixpacks information =====> python-sample builder-nixpacks information
Builder-nixpacks computed nixpackstoml path: nixpacks.toml Builder-nixpacks computed nixpackstoml path: nixpacks.toml
Builder-nixpacks global nixpackstoml path: nixpacks.toml Builder-nixpacks global nixpackstoml path:
Builder-nixpacks nixpackstoml path: Builder-nixpacks nixpackstoml path:
=====> ruby-sample builder-nixpacks information =====> ruby-sample builder-nixpacks information
Builder-nixpacks computed nixpackstoml path: nixpacks.toml Builder-nixpacks computed nixpackstoml path: nixpacks.toml
Builder-nixpacks global nixpackstoml path: nixpacks.toml Builder-nixpacks global nixpackstoml path:
Builder-nixpacks nixpackstoml path: Builder-nixpacks nixpackstoml path:
``` ```
The `nixpackstoml-path` and `global-nixpackstoml-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-nixpackstoml-path` key holds the effective value used at build time, falling back to the global value (where one has been set) and then to the built-in default of `nixpacks.toml`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -118,7 +120,7 @@ dokku builder-nixpacks:report node-js-app
``` ```
=====> node-js-app builder-nixpacks information =====> node-js-app builder-nixpacks information
Builder-nixpacks computed nixpackstoml path: nixpacks2.toml Builder-nixpacks computed nixpackstoml path: nixpacks2.toml
Builder-nixpacks global nixpackstoml path: nixpacks.toml Builder-nixpacks global nixpackstoml path:
Builder-nixpacks nixpackstoml path: nixpacks2.toml Builder-nixpacks nixpackstoml path: nixpacks2.toml
``` ```
@@ -131,3 +133,11 @@ dokku builder-nixpacks:report node-js-app --builder-nixpacks-nixpackstoml-path
``` ```
nixpacks2.toml nixpacks2.toml
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `nixpackstoml-path` | app + global | `nixpacks.toml` | `--builder-nixpacks-nixpackstoml-path`, `--builder-nixpacks-global-nixpackstoml-path`, `--builder-nixpacks-computed-nixpackstoml-path` | Path within the app to the `nixpacks.toml` manifest used by the nixpacks builder |

View File

@@ -106,18 +106,20 @@ dokku builder-railpack:report
``` ```
=====> node-js-app builder-railpack information =====> node-js-app builder-railpack information
Builder-railpack computed railpackjson path: railpack2.json Builder-railpack computed railpackjson path: railpack2.json
Builder-railpack global railpackjson path: railpack.json Builder-railpack global railpackjson path:
Builder-railpack railpackjson path: railpack2.json Builder-railpack railpackjson path: railpack2.json
=====> python-sample builder-railpack information =====> python-sample builder-railpack information
Builder-railpack computed railpackjson path: railpack.json Builder-railpack computed railpackjson path: railpack.json
Builder-railpack global railpackjson path: railpack.json Builder-railpack global railpackjson path:
Builder-railpack railpackjson path: Builder-railpack railpackjson path:
=====> ruby-sample builder-railpack information =====> ruby-sample builder-railpack information
Builder-railpack computed railpackjson path: railpack.json Builder-railpack computed railpackjson path: railpack.json
Builder-railpack global railpackjson path: railpack.json Builder-railpack global railpackjson path:
Builder-railpack railpackjson path: Builder-railpack railpackjson path:
``` ```
The `railpackjson-path` and `global-railpackjson-path` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-railpackjson-path` key holds the effective value used at build time, falling back to the global value (where one has been set) and then to the built-in default of `railpack.json`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -127,7 +129,7 @@ dokku builder-railpack:report node-js-app
``` ```
=====> node-js-app builder-railpack information =====> node-js-app builder-railpack information
Builder-railpack computed railpackjson path: railpack2.json Builder-railpack computed railpackjson path: railpack2.json
Builder-railpack global railpackjson path: railpack.json Builder-railpack global railpackjson path:
Builder-railpack railpackjson path: railpack2.json Builder-railpack railpackjson path: railpack2.json
``` ```
@@ -140,3 +142,11 @@ dokku builder-railpack:report node-js-app --builder-railpack-railpackjson-path
``` ```
railpack2.json railpack2.json
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `railpackjson-path` | app + global | `railpack.json` | `--builder-railpack-railpackjson-path`, `--builder-railpack-global-railpackjson-path`, `--builder-railpack-computed-railpackjson-path` | Path within the app to the `railpack.json` manifest used by the railpack builder |

View File

@@ -311,3 +311,15 @@ As with app-specific label alias settings, the global value may also be cleared
```shell ```shell
dokku logs:set --global app-label-alias dokku logs:set --global app-label-alias
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `app-label-alias` | app + global | `com.dokku.app-name` | `--logs-app-label-alias`, `--logs-global-app-label-alias`, `--logs-computed-app-label-alias` | Docker label key whose value is used to identify the app when shipping logs |
| `max-size` | app + global | `10m` | `--logs-max-size`, `--logs-global-max-size`, `--logs-computed-max-size` | Maximum size of an individual log file before rotation |
| `vector-image` | global only | _parsed from `plugins/logs/Dockerfile`_ | `--logs-global-vector-image`, `--logs-computed-vector-image` | Docker image used to run the vector log-shipper container |
| `vector-networks` | global only | none | `--logs-global-vector-networks`, `--logs-computed-vector-networks` | Comma-separated list of docker networks the vector container is attached to |
| `vector-sink` | app + global | none | `--logs-vector-sink`, `--logs-global-vector-sink`, `--logs-computed-vector-sink` | DSN-style sink configuration for vector (e.g. `console://` or `loki://...`) |

View File

@@ -281,12 +281,15 @@ dokku git:report
``` ```
=====> node-js-app git information =====> node-js-app git information
Git computed archive max files: 10000
Git computed archive max size: 1073741824
Git computed deploy branch: master Git computed deploy branch: master
Git computed keep git dir: false Git computed keep git dir: false
Git deploy branch: Git deploy branch:
Git global archive max files: 10000 Git global archive max files:
Git global archive max size: 1073741824 Git global archive max size:
Git global deploy branch: master Git global deploy branch:
Git global keep git dir:
Git keep git dir: Git keep git dir:
Git rev env var: GIT_REV Git rev env var: GIT_REV
Git sha: a1b2c3d Git sha: a1b2c3d
@@ -294,7 +297,7 @@ dokku git:report
Git last updated at: 1700000000 Git last updated at: 1700000000
``` ```
The `deploy-branch` and `keep-git-dir` keys hold the raw per-app value and are empty when nothing has been set on the app. The `computed-deploy-branch` and `computed-keep-git-dir` keys hold the effective value used at deploy time, falling back to the corresponding global value (where one exists) and then to the built-in default. The bare per-app keys (`deploy-branch`, `keep-git-dir`) and the `global-<prop>` keys hold the raw per-app or global value respectively, and are empty when nothing has been set. The `computed-<prop>` keys hold the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default.
You can run the command for a specific app also. You can run the command for a specific app also.
@@ -315,3 +318,25 @@ dokku git:report node-js-app --format json
``` ```
The `--format` flag cannot be combined with an info flag. The `--format` flag cannot be combined with an info flag.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `archive-max-files` | app + global | none | `--git-global-archive-max-files`, `--git-computed-archive-max-files` | Maximum number of files allowed in an uploaded archive deploy |
| `archive-max-size` | app + global | none | `--git-global-archive-max-size`, `--git-computed-archive-max-size` | Maximum total size of an uploaded archive deploy |
| `deploy-branch` | app + global | `master` | `--git-deploy-branch`, `--git-global-deploy-branch`, `--git-computed-deploy-branch` | Branch name pushed by the git remote that triggers a deploy |
| `keep-git-dir` | app + global | `false` | `--git-keep-git-dir`, `--git-global-keep-git-dir`, `--git-computed-keep-git-dir` | When `true`, retains the `.git` directory inside the build context |
| `rev-env-var` | app + global | `GIT_REV` | `--git-rev-env-var` | Environment variable name receiving the deployed commit SHA; empty disables injection |
| `source-image` | app + global | none | `--git-source-image` | Docker image to clone application source from when deploying from an image |
### Read-only flags
The following flags surface in `git:report` but are not managed by `git:set` - they are derived from repository state:
| Flag | Description |
|---|---|
| `--git-sha` | HEAD commit SHA of the app's git repo |
| `--git-last-updated-at` | UNIX timestamp of the last write to the deploy branch ref |

View File

@@ -216,3 +216,12 @@ The `docker-local` scheduler supports a minimal list of resource _limits_ and _r
- 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.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `init-process` | app + global | `true` | `--scheduler-docker-local-init-process`, `--scheduler-docker-local-global-init-process`, `--scheduler-docker-local-computed-init-process` | When `true`, runs containers with Docker's `--init` flag (reaping zombie processes) |
| `parallel-schedule-count` | app + global | `1` | `--scheduler-docker-local-parallel-schedule-count`, `--scheduler-docker-local-global-parallel-schedule-count`, `--scheduler-docker-local-computed-parallel-schedule-count` | Maximum number of containers scheduled in parallel during a deploy |

View File

@@ -787,3 +787,25 @@ If unspecified for any task, the default reservation will be `.1` CPU and `128Mi
> [!NOTE] > [!NOTE]
> Cron tasks retrieve resource limits based on the computed cron task ID. > Cron tasks retrieve resource limits based on the computed cron task ID.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `deploy-timeout` | app + global | `300s` | `--scheduler-k3s-deploy-timeout`, `--scheduler-k3s-global-deploy-timeout`, `--scheduler-k3s-computed-deploy-timeout` | Timeout for a single helm install/upgrade cycle |
| `image-pull-secrets` | app + global | none | `--scheduler-k3s-image-pull-secrets`, `--scheduler-k3s-global-image-pull-secrets`, `--scheduler-k3s-computed-image-pull-secrets` | Comma-separated list of Kubernetes secret names used to pull private images |
| `ingress-class` | global only | `nginx` | `--scheduler-k3s-global-ingress-class` | IngressClass name used for app ingresses (e.g. `nginx`, `traefik`) |
| `kube-context` | global only | none | `--scheduler-k3s-global-kube-context` | Kube context name used by helm and kubectl invocations |
| `kubeconfig-path` | global only | `/etc/rancher/k3s/k3s.yaml` | `--scheduler-k3s-global-kubeconfig-path` | Filesystem path to the kubeconfig used to talk to the cluster |
| `kustomize-root-path` | app + global | none | `--scheduler-k3s-kustomize-root-path`, `--scheduler-k3s-global-kustomize-root-path`, `--scheduler-k3s-computed-kustomize-root-path` | Path within the app to a kustomize root applied after the helm install |
| `letsencrypt-email-prod` | global only | none | `--scheduler-k3s-global-letsencrypt-email-prod` | Contact email for the production cert-manager ClusterIssuer |
| `letsencrypt-email-stag` | global only | none | `--scheduler-k3s-global-letsencrypt-email-stag` | Contact email for the staging cert-manager ClusterIssuer |
| `letsencrypt-server` | app + global | `prod` | `--scheduler-k3s-letsencrypt-server`, `--scheduler-k3s-global-letsencrypt-server`, `--scheduler-k3s-computed-letsencrypt-server` | ACME directory (`prod` or `staging`) used for app certificates |
| `namespace` | app + global | `default` | `--scheduler-k3s-namespace`, `--scheduler-k3s-global-namespace`, `--scheduler-k3s-computed-namespace` | Kubernetes namespace into which the app's resources are installed |
| `network-interface` | global only | none | `--scheduler-k3s-global-network-interface` | Host network interface used by k3s |
| `rollback-on-failure` | app + global | `false` | `--scheduler-k3s-rollback-on-failure`, `--scheduler-k3s-global-rollback-on-failure`, `--scheduler-k3s-computed-rollback-on-failure` | When `true`, helm rolls back the release if a deploy fails |
| `shm-size` | app + global | none | `--scheduler-k3s-shm-size`, `--scheduler-k3s-global-shm-size`, `--scheduler-k3s-computed-shm-size` | `/dev/shm` size override applied to app containers |
| `token` | global only | none | (not in report) | Cluster join token used by `scheduler-k3s:cluster-add` |
| `chart.<chart-name>.<property>` | global only | none | `--scheduler-k3s-global-chart.<chart-name>.<property>` (dynamic per chart/property) | Override a value injected into the helm chart named `<chart-name>` (one row per chart/property pair) |

View File

@@ -80,14 +80,16 @@ dokku scheduler:report
Scheduler selected: herokuish Scheduler selected: herokuish
=====> python-sample scheduler information =====> python-sample scheduler information
Scheduler computed selected: dockerfile Scheduler computed selected: dockerfile
Scheduler global selected: herokuish Scheduler global selected:
Scheduler selected: dockerfile Scheduler selected: dockerfile
=====> ruby-sample scheduler information =====> ruby-sample scheduler information
Scheduler computed selected: herokuish Scheduler computed selected: docker-local
Scheduler global selected: herokuish Scheduler global selected:
Scheduler selected: Scheduler selected:
``` ```
The `selected` and `global-selected` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-selected` key holds the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default of `docker-local`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -96,6 +98,8 @@ dokku scheduler:report node-js-app
``` ```
=====> node-js-app scheduler information =====> node-js-app scheduler information
Scheduler computed selected: herokuish
Scheduler global selected:
Scheduler selected: herokuish Scheduler selected: herokuish
``` ```
@@ -143,3 +147,12 @@ Schedulers may decide to omit some functionality here, or use plugin triggers to
Schedulers can use any tools available on the system to build the docker image, and may even be used to interact with off-server systems. The only current requirement is that the scheduler must have access to the image built in the build phase. If this is not the case, the registry plugin can be used to push the image to a registry that the scheduler software can access. Schedulers can use any tools available on the system to build the docker image, and may even be used to interact with off-server systems. The only current requirement is that the scheduler must have access to the image built in the build phase. If this is not the case, the registry plugin can be used to push the image to a registry that the scheduler software can access.
Deployment tasks are currently executed directly on the primary Dokku server. Deployment tasks are currently executed directly on the primary Dokku server.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `selected` | app + global | `docker-local` | `--scheduler-selected`, `--scheduler-global-selected`, `--scheduler-computed-selected` | Scheduler plugin used to deploy this app (`docker-local`, `k3s`, etc.) |
| `shell` | app + global | none | (not in report) | Shell used by `enter`/`run` commands when entering a container |

View File

@@ -95,22 +95,24 @@ dokku checks:report
Checks disabled list: none Checks disabled list: none
Checks skipped list: none Checks skipped list: none
Checks computed wait to retire: 60 Checks computed wait to retire: 60
Checks global wait to retire: 60 Checks global wait to retire:
Checks wait to retire: Checks wait to retire:
=====> python-app checks information =====> python-app checks information
Checks disabled list: none Checks disabled list: none
Checks skipped list: none Checks skipped list: none
Checks computed wait to retire: 60 Checks computed wait to retire: 60
Checks global wait to retire: 60 Checks global wait to retire:
Checks wait to retire: Checks wait to retire:
=====> ruby-app checks information =====> ruby-app checks information
Checks disabled list: _all_ Checks disabled list: _all_
Checks skipped list: none Checks skipped list: none
Checks computed wait to retire: 60 Checks computed wait to retire: 60
Checks global wait to retire: 60 Checks global wait to retire:
Checks wait to retire: Checks wait to retire:
``` ```
The `wait-to-retire` and `global-wait-to-retire` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-wait-to-retire` key holds the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default of `60`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -120,10 +122,10 @@ dokku checks:report node-js-app
``` ```
=====> node-js-app checks information =====> node-js-app checks information
Checks disabled list: none Checks disabled list: none
Checks skipped list: none Checks skipped list: none
Checks computed wait to retire: 60 Checks computed wait to retire: 60
Checks global wait to retire: 60 Checks global wait to retire:
Checks wait to retire: Checks wait to retire:
``` ```
You can pass flags which will output only the value of the specific information you want. For example: You can pass flags which will output only the value of the specific information you want. For example:
@@ -263,3 +265,11 @@ dokku checks:run node-js-app web.3
-----> Running pre-flight checks -----> Running pre-flight checks
Invalid container id specified (APP.web.3) Invalid container id specified (APP.web.3)
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `wait-to-retire` | app + global | `60` | `--checks-wait-to-retire`, `--checks-global-wait-to-retire`, `--checks-computed-wait-to-retire` | Seconds to wait between deploying the new container and stopping the old one |

View File

@@ -428,7 +428,7 @@ dokku network:report
=====> node-js-app network information =====> node-js-app network information
Network attach post create: Network attach post create:
Network attach post deploy: Network attach post deploy:
Network bind all interfaces: false Network bind all interfaces:
Network computed attach post create: Network computed attach post create:
Network computed attach post deploy: Network computed attach post deploy:
Network computed bind all interfaces:false Network computed bind all interfaces:false
@@ -436,7 +436,7 @@ dokku network:report
Network computed tld: Network computed tld:
Network global attach post create: Network global attach post create:
Network global attach post deploy: Network global attach post deploy:
Network global bind all interfaces:false Network global bind all interfaces:
Network global initial network: Network global initial network:
Network global tld: Network global tld:
Network initial network: Network initial network:
@@ -445,7 +445,7 @@ dokku network:report
=====> python-sample network information =====> python-sample network information
Network attach post create: Network attach post create:
Network attach post deploy: Network attach post deploy:
Network bind all interfaces: false Network bind all interfaces:
Network computed attach post create: Network computed attach post create:
Network computed attach post deploy: Network computed attach post deploy:
Network computed bind all interfaces:false Network computed bind all interfaces:false
@@ -453,7 +453,7 @@ dokku network:report
Network computed tld: Network computed tld:
Network global attach post create: Network global attach post create:
Network global attach post deploy: Network global attach post deploy:
Network global bind all interfaces:false Network global bind all interfaces:
Network global initial network: Network global initial network:
Network global tld: Network global tld:
Network initial network: Network initial network:
@@ -462,7 +462,7 @@ dokku network:report
=====> ruby-sample network information =====> ruby-sample network information
Network attach post create: Network attach post create:
Network attach post deploy: Network attach post deploy:
Network bind all interfaces: false Network bind all interfaces:
Network computed attach post create: Network computed attach post create:
Network computed attach post deploy: Network computed attach post deploy:
Network computed bind all interfaces:false Network computed bind all interfaces:false
@@ -470,7 +470,7 @@ dokku network:report
Network computed tld: Network computed tld:
Network global attach post create: Network global attach post create:
Network global attach post deploy: Network global attach post deploy:
Network global bind all interfaces:false Network global bind all interfaces:
Network global initial network: Network global initial network:
Network global tld: Network global tld:
Network initial network: Network initial network:
@@ -478,6 +478,8 @@ dokku network:report
Network web listeners: Network web listeners:
``` ```
The per-app and `global-` keys for each property hold the raw values and are empty when nothing has been set. The `computed-` keys hold the effective value, falling back to the global value (where one has been set) and then to the built-in default (`false` for `bind-all-interfaces`, empty otherwise).
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -488,7 +490,7 @@ dokku network:report node-js-app
=====> node-js-app network information =====> node-js-app network information
Network attach post create: Network attach post create:
Network attach post deploy: Network attach post deploy:
Network bind all interfaces: false Network bind all interfaces:
Network computed attach post create: Network computed attach post create:
Network computed attach post deploy: Network computed attach post deploy:
Network computed bind all interfaces:false Network computed bind all interfaces:false
@@ -496,7 +498,7 @@ dokku network:report node-js-app
Network computed tld: Network computed tld:
Network global attach post create: Network global attach post create:
Network global attach post deploy: Network global attach post deploy:
Network global bind all interfaces:false Network global bind all interfaces:
Network global initial network: Network global initial network:
Network global tld: Network global tld:
Network initial network: Network initial network:
@@ -509,3 +511,24 @@ You can pass flags which will output only the value of the specific information
```shell ```shell
dokku network:report node-js-app --network-bind-all-interfaces dokku network:report node-js-app --network-bind-all-interfaces
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `attach-post-create` | app + global | none | `--network-attach-post-create`, `--network-global-attach-post-create`, `--network-computed-attach-post-create` | Networks attached to a container immediately after creation, before the deploy phase |
| `attach-post-deploy` | app + global | none | `--network-attach-post-deploy`, `--network-global-attach-post-deploy`, `--network-computed-attach-post-deploy` | Networks attached to a container after it passes healthchecks |
| `bind-all-interfaces` | app + global | `false` | `--network-bind-all-interfaces`, `--network-global-bind-all-interfaces`, `--network-computed-bind-all-interfaces` | When `true`, binds containers to `0.0.0.0` instead of the default Docker network address |
| `initial-network` | app + global | none | `--network-initial-network`, `--network-global-initial-network`, `--network-computed-initial-network` | Network attached at container creation time |
| `static-web-listener` | app only | none | `--network-static-web-listener` | Static `host:port` override used in proxy templates when no container is running |
| `tld` | app + global | none | `--network-tld`, `--network-global-tld`, `--network-computed-tld` | Top-level domain appended to auto-generated app vhosts |
### Read-only flags
The following flag surfaces in `network:report` but is not managed by `network:set` - it is derived from the running app state:
| Flag | Description |
|---|---|
| `--network-web-listeners` | Current `web` process listeners (host:port) for the deployed app |

View File

@@ -220,3 +220,13 @@ You can pass flags which will output only the value of the specific information
```shell ```shell
dokku ports:report node-js-app --ports-map dokku ports:report node-js-app --ports-map
``` ```
## Properties
### Read-only flags
The following flags surface in `ports:report` but are not managed by `ports:set` - they are derived from the deploy:
| Flag | Description |
|---|---|
| `--ports-map-detected` | Port mapping inferred from `EXPOSE` directives or the running container |

View File

@@ -220,35 +220,22 @@ dokku caddy:report
``` ```
=====> node-js-app caddy information =====> node-js-app caddy information
Caddy computed tls internal: false Caddy computed image: lucaslorentz/caddy-docker-proxy:2.7
Caddy global tls internal: false Caddy computed letsencrypt email:
Caddy image: lucaslorentz/caddy-docker-proxy:2.7 Caddy computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
Caddy letsencrypt email: Caddy computed log level: ERROR
Caddy letsencrypt server: Caddy computed polling interval: 5s
Caddy log level: ERROR Caddy computed tls internal: false
Caddy polling interval: 5s Caddy global image:
Caddy tls internal: Caddy global letsencrypt email:
=====> python-app caddy information Caddy global letsencrypt server:
Caddy computed tls internal: false Caddy global log level:
Caddy global tls internal: false Caddy global polling interval:
Caddy image: lucaslorentz/caddy-docker-proxy:2.7 Caddy global tls internal:
Caddy letsencrypt email:
Caddy letsencrypt server:
Caddy log level: ERROR
Caddy polling interval: 5s
Caddy tls internal:
=====> ruby-app caddy information
Caddy computed tls internal: false
Caddy global tls internal: false
Caddy image: lucaslorentz/caddy-docker-proxy:2.7
Caddy letsencrypt email:
Caddy letsencrypt server:
Caddy log level: ERROR
Caddy polling interval: 5s
Caddy tls internal: Caddy tls internal:
``` ```
The `tls-internal` key holds the raw per-app value and is empty when nothing has been set on the app. The `computed-tls-internal` key holds the effective value used at deploy time, falling back to the global value and then to the built-in default of `false`. The `global-tls-internal` key holds the global value. The `global-<prop>` keys hold the raw global value and are empty when nothing has been set globally. The `computed-<prop>` keys hold the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default. The bare `tls-internal` key holds the raw per-app value.
You can run the command for a specific app also. You can run the command for a specific app also.
@@ -258,18 +245,44 @@ dokku caddy:report node-js-app
``` ```
=====> node-js-app caddy information =====> node-js-app caddy information
Caddy computed tls internal: false Caddy computed image: lucaslorentz/caddy-docker-proxy:2.7
Caddy global tls internal: false Caddy computed letsencrypt email:
Caddy image: lucaslorentz/caddy-docker-proxy:2.7 Caddy computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
Caddy letsencrypt email: Caddy computed log level: ERROR
Caddy letsencrypt server: Caddy computed polling interval: 5s
Caddy log level: ERROR Caddy computed tls internal: false
Caddy polling interval: 5s Caddy global image:
Caddy global letsencrypt email:
Caddy global letsencrypt server:
Caddy global log level:
Caddy global polling interval:
Caddy global tls internal:
Caddy tls internal: Caddy tls internal:
``` ```
You can pass flags which will output only the value of the specific information you want. For example: You can pass flags which will output only the value of the specific information you want. For example:
```shell ```shell
dokku caddy:report node-js-app --caddy-image dokku caddy:report node-js-app --caddy-computed-image
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `image` | global only | _parsed from `plugins/caddy-vhosts/Dockerfile`_ | `--caddy-global-image`, `--caddy-computed-image` | Docker image used to run the Caddy container |
| `letsencrypt-email` | global only | none | `--caddy-global-letsencrypt-email`, `--caddy-computed-letsencrypt-email` | Contact email enabling letsencrypt; empty disables https issuance |
| `letsencrypt-server` | global only | `https://acme-v02.api.letsencrypt.org/directory` | `--caddy-global-letsencrypt-server`, `--caddy-computed-letsencrypt-server` | ACME directory used when requesting certificates |
| `log-level` | global only | `ERROR` | `--caddy-global-log-level`, `--caddy-computed-log-level` | Caddy log level |
| `polling-interval` | global only | `5s` | `--caddy-global-polling-interval`, `--caddy-computed-polling-interval` | Frequency at which Caddy polls the Docker API for label changes |
| `tls-internal` | app + global | `false` | `--caddy-tls-internal`, `--caddy-global-tls-internal`, `--caddy-computed-tls-internal` | When `true`, uses Caddy's built-in self-signed TLS instead of letsencrypt |
### Internal properties
The following properties are not managed by `caddy:set` but are recorded internally by the plugin:
| Property | Description | Source |
|---|---|---|
| `proxy-status` | `started`/`stopped` state of the caddy compose project | `cmd-caddy-start`/`cmd-caddy-stop` in `plugins/caddy-vhosts/command-functions` |

View File

@@ -205,13 +205,20 @@ dokku haproxy:report
``` ```
=====> node-js-app haproxy information =====> node-js-app haproxy information
Haproxy image: byjg/easy-haproxy:4.0.0 Haproxy computed image: byjg/easy-haproxy:4.0.0
=====> python-app haproxy information Haproxy computed letsencrypt email:
Haproxy image: byjg/easy-haproxy:4.0.0 Haproxy computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
=====> ruby-app haproxy information Haproxy computed log level: ERROR
Haproxy image: byjg/easy-haproxy:4.0.0 Haproxy computed refresh conf: 10
Haproxy global image:
Haproxy global letsencrypt email:
Haproxy global letsencrypt server:
Haproxy global log level:
Haproxy global refresh conf:
``` ```
The `global-<prop>` keys hold the raw global value and are empty when nothing has been set globally. The `computed-<prop>` keys hold the effective value used at deploy time, falling back to the built-in default when the global value is empty.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -220,11 +227,42 @@ dokku haproxy:report node-js-app
``` ```
=====> node-js-app haproxy information =====> node-js-app haproxy information
Haproxy image: byjg/easy-haproxy:4.0.0 Haproxy computed image: byjg/easy-haproxy:4.0.0
Haproxy computed letsencrypt email:
Haproxy computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
Haproxy computed log level: ERROR
Haproxy computed refresh conf: 10
Haproxy global image:
Haproxy global letsencrypt email:
Haproxy global letsencrypt server:
Haproxy global log level:
Haproxy global refresh conf:
``` ```
You can pass flags which will output only the value of the specific information you want. For example: You can pass flags which will output only the value of the specific information you want. For example:
```shell ```shell
dokku haproxy:report node-js-app --haproxy-image dokku haproxy:report node-js-app --haproxy-computed-image
``` ```
## Properties
### Settable properties
All haproxy properties are global only. Set with `haproxy:set --global <property> <value>`.
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `image` | global only | _parsed from `plugins/haproxy-vhosts/Dockerfile`_ | `--haproxy-global-image`, `--haproxy-computed-image` | Docker image used to run the Haproxy container |
| `letsencrypt-email` | global only | none | `--haproxy-global-letsencrypt-email`, `--haproxy-computed-letsencrypt-email` | Contact email enabling letsencrypt; empty disables https issuance |
| `letsencrypt-server` | global only | `https://acme-v02.api.letsencrypt.org/directory` | `--haproxy-global-letsencrypt-server`, `--haproxy-computed-letsencrypt-server` | ACME directory used when requesting certificates |
| `log-level` | global only | `ERROR` | `--haproxy-global-log-level`, `--haproxy-computed-log-level` | Haproxy log level |
| `refresh-conf` | global only | `10` | `--haproxy-global-refresh-conf`, `--haproxy-computed-refresh-conf` | Seconds between Haproxy polls of the Docker API for label changes |
### Internal properties
The following properties are not managed by `haproxy:set` but are recorded internally by the plugin:
| Property | Description | Source |
|---|---|---|
| `proxy-status` | `started`/`stopped` state of the haproxy compose project | `cmd-haproxy-start`/`cmd-haproxy-stop` in `plugins/haproxy-vhosts/command-functions` |

View File

@@ -620,3 +620,60 @@ See the [ports documentation](/docs/networking/port-management.md) for more info
### Regenerating nginx config ### Regenerating nginx config
See the [proxy documentation](/docs/networking/proxy-management.md#regenerating-proxy-config) for more information on how to rebuild the nginx proxy configuration for your app. See the [proxy documentation](/docs/networking/proxy-management.md#regenerating-proxy-config) for more information on how to rebuild the nginx proxy configuration for your app.
## Properties
### Settable properties
All nginx-vhosts properties are settable at both the app and global scope.
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `access-log-format` | app + global | none | `--nginx-access-log-format`, `--nginx-global-access-log-format`, `--nginx-computed-access-log-format` | Custom nginx `log_format` directive used for the access log |
| `access-log-path` | app + global | _`{nginx-log-root}/{app}-access.log`_ | `--nginx-access-log-path`, `--nginx-global-access-log-path`, `--nginx-computed-access-log-path` | Path inside the nginx container where access logs are written |
| `bind-address-ipv4` | app + global | none | `--nginx-bind-address-ipv4`, `--nginx-global-bind-address-ipv4`, `--nginx-computed-bind-address-ipv4` | IPv4 address the nginx server block binds to |
| `bind-address-ipv6` | app + global | `::` | `--nginx-bind-address-ipv6`, `--nginx-global-bind-address-ipv6`, `--nginx-computed-bind-address-ipv6` | IPv6 address the nginx server block binds to |
| `client-body-timeout` | app + global | `60s` | `--nginx-client-body-timeout`, `--nginx-global-client-body-timeout`, `--nginx-computed-client-body-timeout` | Time allowed to read the request body from the client |
| `client-header-timeout` | app + global | `60s` | `--nginx-client-header-timeout`, `--nginx-global-client-header-timeout`, `--nginx-computed-client-header-timeout` | Time allowed to read the request header from the client |
| `client-max-body-size` | app + global | `1m` | `--nginx-client-max-body-size`, `--nginx-global-client-max-body-size`, `--nginx-computed-client-max-body-size` | Maximum allowed request body size |
| `disable-custom-config` | app + global | `false` | `--nginx-disable-custom-config`, `--nginx-global-disable-custom-config`, `--nginx-computed-disable-custom-config` | When `true`, ignores app-supplied `nginx.conf.d/*.conf` snippets |
| `error-log-path` | app + global | _`{nginx-log-root}/{app}-error.log`_ | `--nginx-error-log-path`, `--nginx-global-error-log-path`, `--nginx-computed-error-log-path` | Path inside the nginx container where error logs are written |
| `hsts` | app + global | `true` | `--nginx-hsts`, `--nginx-global-hsts`, `--nginx-computed-hsts` | When `true`, emits a `Strict-Transport-Security` header on HTTPS responses |
| `hsts-include-subdomains` | app + global | `true` | `--nginx-hsts-include-subdomains`, `--nginx-global-hsts-include-subdomains`, `--nginx-computed-hsts-include-subdomains` | Adds the `includeSubDomains` directive to the HSTS header |
| `hsts-max-age` | app + global | `15724800` | `--nginx-hsts-max-age`, `--nginx-global-hsts-max-age`, `--nginx-computed-hsts-max-age` | `max-age` value (seconds) in the HSTS header |
| `hsts-preload` | app + global | `false` | `--nginx-hsts-preload`, `--nginx-global-hsts-preload`, `--nginx-computed-hsts-preload` | Adds the `preload` directive to the HSTS header |
| `keepalive-timeout` | app + global | `75s` | `--nginx-keepalive-timeout`, `--nginx-global-keepalive-timeout`, `--nginx-computed-keepalive-timeout` | Time an idle keep-alive connection stays open |
| `lingering-timeout` | app + global | `5s` | `--nginx-lingering-timeout`, `--nginx-global-lingering-timeout`, `--nginx-computed-lingering-timeout` | Time nginx waits for more client data when closing a connection |
| `nginx-conf-sigil-path` | app + global | `nginx.conf.sigil` | `--nginx-nginx-conf-sigil-path`, `--nginx-global-nginx-conf-sigil-path`, `--nginx-computed-nginx-conf-sigil-path` | Path within the app to a custom `nginx.conf.sigil` template |
| `nginx-service-command` | app + global | none | (not in report) | Override command used by `nginx:start`/`nginx:stop`/`nginx:reload` |
| `proxy-buffer-size` | app + global | _system pagesize_ | `--nginx-proxy-buffer-size`, `--nginx-global-proxy-buffer-size`, `--nginx-computed-proxy-buffer-size` | Buffer size for reading the first part of the upstream response |
| `proxy-buffering` | app + global | `on` | `--nginx-proxy-buffering`, `--nginx-global-proxy-buffering`, `--nginx-computed-proxy-buffering` | Whether nginx buffers upstream responses (`on` or `off`) |
| `proxy-buffers` | app + global | _`8 {pagesize}`_ | `--nginx-proxy-buffers`, `--nginx-global-proxy-buffers`, `--nginx-computed-proxy-buffers` | Number and size of buffers used for an upstream response |
| `proxy-busy-buffers-size` | app + global | _`2 * pagesize`_ | `--nginx-proxy-busy-buffers-size`, `--nginx-global-proxy-busy-buffers-size`, `--nginx-computed-proxy-busy-buffers-size` | Maximum buffer size that can be busy sending a response to the client |
| `proxy-connect-timeout` | app + global | `60s` | `--nginx-proxy-connect-timeout`, `--nginx-global-proxy-connect-timeout`, `--nginx-computed-proxy-connect-timeout` | Time to establish a connection to the upstream |
| `proxy-keepalive` | app + global | none | `--nginx-proxy-keepalive`, `--nginx-global-proxy-keepalive`, `--nginx-computed-proxy-keepalive` | Number of idle keep-alive connections to upstream servers held open per worker |
| `proxy-read-timeout` | app + global | `60s` | `--nginx-proxy-read-timeout`, `--nginx-global-proxy-read-timeout`, `--nginx-computed-proxy-read-timeout` | Time to read a response from the upstream |
| `proxy-send-timeout` | app + global | `60s` | `--nginx-proxy-send-timeout`, `--nginx-global-proxy-send-timeout`, `--nginx-computed-proxy-send-timeout` | Time to transmit a request to the upstream |
| `send-timeout` | app + global | `60s` | `--nginx-send-timeout`, `--nginx-global-send-timeout`, `--nginx-computed-send-timeout` | Time between two successive write operations to the client |
| `underscore-in-headers` | app + global | `off` | `--nginx-underscore-in-headers`, `--nginx-global-underscore-in-headers`, `--nginx-computed-underscore-in-headers` | Whether to allow underscores in client request header field names |
| `x-forwarded-for-value` | app + global | `$remote_addr` | `--nginx-x-forwarded-for-value`, `--nginx-global-x-forwarded-for-value`, `--nginx-computed-x-forwarded-for-value` | Value used for the `X-Forwarded-For` header |
| `x-forwarded-port-value` | app + global | `$server_port` | `--nginx-x-forwarded-port-value`, `--nginx-global-x-forwarded-port-value`, `--nginx-computed-x-forwarded-port-value` | Value used for the `X-Forwarded-Port` header |
| `x-forwarded-proto-value` | app + global | `$scheme` | `--nginx-x-forwarded-proto-value`, `--nginx-global-x-forwarded-proto-value`, `--nginx-computed-x-forwarded-proto-value` | Value used for the `X-Forwarded-Proto` header |
| `x-forwarded-ssl` | app + global | none | `--nginx-x-forwarded-ssl`, `--nginx-global-x-forwarded-ssl`, `--nginx-computed-x-forwarded-ssl` | Value used for the `X-Forwarded-Ssl` header (e.g. `on`/`off`) |
### Read-only flags
The following flag surfaces in `nginx:report` but is not managed by `nginx:set`:
| Flag | Description |
|---|---|
| `--nginx-last-visited-at` | UNIX timestamp of the last request served by nginx for the app |
### Internal properties
The following properties are recorded internally by the plugin and are not exposed via `nginx:report`:
| Property | Description | Source |
|---|---|---|
| `proxy-status` | `started`/`stopped` state of the nginx system service | `cmd-nginx-start`/`cmd-nginx-stop` |
| `nginx-conf-sigil-migrated` | Migration sentinel set the first time a v1 template is rewritten to the current schema | `plugins/nginx-vhosts/install` writes `"true"` once the install-time migration runs |

View File

@@ -279,3 +279,46 @@ You can pass flags which will output only the value of the specific information
```shell ```shell
dokku openresty:report node-js-app --openresty-letsencrypt-email dokku openresty:report node-js-app --openresty-letsencrypt-email
``` ```
## Properties
### Settable properties
Five properties (`image`, `log-level`, `letsencrypt-email`, `letsencrypt-server`, `allowed-letsencrypt-domains-func-base64`) are global only. The rest are app only - they cannot be set with `--global`.
`openresty:report` currently exposes a single raw flag per property (no `--global-` / `--computed-` split) except for `hsts`, which has all three flag shapes.
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `access-log-format` | app only | none | `--openresty-access-log-format` | Custom nginx `log_format` directive used for the access log |
| `access-log-path` | app only | _`/var/log/nginx/{app}-access.log`_ | `--openresty-access-log-path` | Path inside the openresty container where access logs are written |
| `allowed-letsencrypt-domains-func-base64` | global only | _allow-all stub_ | `--openresty-allowed-letsencrypt-domains-func-base64` | Base64-encoded Lua function deciding which domains may request a letsencrypt certificate |
| `bind-address-ipv4` | app only | none | `--openresty-bind-address-ipv4` | IPv4 address the openresty server block binds to |
| `bind-address-ipv6` | app only | `::` | `--openresty-bind-address-ipv6` | IPv6 address the openresty server block binds to |
| `client-body-timeout` | app only | `60s` | `--openresty-client-body-timeout` | Time allowed to read the request body from the client |
| `client-header-timeout` | app only | `60s` | `--openresty-client-header-timeout` | Time allowed to read the request header from the client |
| `client-max-body-size` | app only | `1m` | `--openresty-client-max-body-size` | Maximum allowed request body size |
| `error-log-path` | app only | _`/var/log/nginx/{app}-error.log`_ | `--openresty-error-log-path` | Path inside the openresty container where error logs are written |
| `hsts` | app only | `true` | `--openresty-hsts`, `--openresty-global-hsts`, `--openresty-computed-hsts` | When `true`, emits a `Strict-Transport-Security` header on HTTPS responses |
| `hsts-include-subdomains` | app only | `true` | `--openresty-hsts-include-subdomains` | Adds the `includeSubDomains` directive to the HSTS header |
| `hsts-max-age` | app only | `15724800` | `--openresty-hsts-max-age` | `max-age` value (seconds) in the HSTS header |
| `hsts-preload` | app only | `false` | `--openresty-hsts-preload` | Adds the `preload` directive to the HSTS header |
| `image` | global only | _parsed from `plugins/openresty-vhosts/Dockerfile`_ | `--openresty-image` | Docker image used to run the openresty container |
| `keepalive-timeout` | app only | `75s` | `--openresty-keepalive-timeout` | Time an idle keep-alive connection stays open |
| `letsencrypt-email` | global only | none | `--openresty-letsencrypt-email` | Contact email enabling letsencrypt; empty disables https issuance |
| `letsencrypt-server` | global only | `https://acme-v02.api.letsencrypt.org/directory` | `--openresty-letsencrypt-server` | ACME directory used when requesting certificates |
| `lingering-timeout` | app only | `5s` | `--openresty-lingering-timeout` | Time openresty waits for more client data when closing a connection |
| `log-level` | global only | `ERROR` | (not in report) | Openresty log level |
| `proxy-buffer-size` | app only | _system pagesize_ | `--openresty-proxy-buffer-size` | Buffer size for reading the first part of the upstream response |
| `proxy-buffering` | app only | `on` | `--openresty-proxy-buffering` | Whether openresty buffers upstream responses (`on` or `off`) |
| `proxy-buffers` | app only | _`8 {pagesize}`_ | `--openresty-proxy-buffers` | Number and size of buffers used for an upstream response |
| `proxy-busy-buffers-size` | app only | _`2 * pagesize`_ | `--openresty-proxy-busy-buffers-size` | Maximum buffer size that can be busy sending a response to the client |
| `proxy-connect-timeout` | app only | `60s` | `--openresty-proxy-connect-timeout` | Time to establish a connection to the upstream |
| `proxy-read-timeout` | app only | `60s` | `--openresty-proxy-read-timeout` | Time to read a response from the upstream |
| `proxy-send-timeout` | app only | `60s` | `--openresty-proxy-send-timeout` | Time to transmit a request to the upstream |
| `send-timeout` | app only | `60s` | `--openresty-send-timeout` | Time between two successive write operations to the client |
| `underscore-in-headers` | app only | `off` | `--openresty-underscore-in-headers` | Whether to allow underscores in client request header field names |
| `x-forwarded-for-value` | app only | `$remote_addr` | `--openresty-x-forwarded-for-value` | Value used for the `X-Forwarded-For` header |
| `x-forwarded-port-value` | app only | `$server_port` | `--openresty-x-forwarded-port-value` | Value used for the `X-Forwarded-Port` header |
| `x-forwarded-proto-value` | app only | `$scheme` | `--openresty-x-forwarded-proto-value` | Value used for the `X-Forwarded-Proto` header |
| `x-forwarded-ssl` | app only | none | `--openresty-x-forwarded-ssl` | Value used for the `X-Forwarded-Ssl` header (e.g. `on`/`off`) |

View File

@@ -331,43 +331,30 @@ dokku traefik:report
``` ```
=====> node-js-app traefik information =====> node-js-app traefik information
Traefik api enabled: false Traefik computed api enabled: false
Traefik api vhost: traefik.dokku.me Traefik computed api vhost: traefik.dokku.me
Traefik basic auth password: password Traefik computed challenge mode: tls
Traefik basic auth username: user Traefik computed dashboard enabled: false
Traefik challenge mode: tls Traefik computed http entry point: http
Traefik dashboard enabled: false Traefik computed https entry point: https
Traefik dns provider: Traefik computed image: traefik:v2.8
Traefik image: traefik:v2.8 Traefik computed letsencrypt email:
Traefik letsencrypt email: Traefik computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
Traefik letsencrypt server: Traefik computed log level: ERROR
Traefik log level: ERROR Traefik global api enabled:
=====> python-app traefik information Traefik global api vhost:
Traefik api enabled: false Traefik global challenge mode:
Traefik api vhost: traefik.dokku.me Traefik global dashboard enabled:
Traefik basic auth password: password Traefik global http entry point:
Traefik basic auth username: user Traefik global https entry point:
Traefik challenge mode: tls Traefik global image:
Traefik dashboard enabled: false Traefik global letsencrypt email:
Traefik dns provider: Traefik global letsencrypt server:
Traefik image: traefik:v2.8 Traefik global log level:
Traefik letsencrypt email:
Traefik letsencrypt server:
Traefik log level: ERROR
=====> ruby-app traefik information
Traefik api enabled: false
Traefik api vhost: traefik.dokku.me
Traefik basic auth password: password
Traefik basic auth username: user
Traefik challenge mode: tls
Traefik dashboard enabled: false
Traefik dns provider:
Traefik image: traefik:v2.8
Traefik letsencrypt email:
Traefik letsencrypt server:
Traefik log level: ERROR
``` ```
The `global-<prop>` keys hold the raw global value and are empty when nothing has been set globally. The `computed-<prop>` keys hold the effective value used at deploy time, falling back to the built-in default when the global value is empty.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -376,21 +363,63 @@ dokku traefik:report node-js-app
``` ```
=====> node-js-app traefik information =====> node-js-app traefik information
Traefik api enabled: false Traefik computed api enabled: false
Traefik api vhost: traefik.dokku.me Traefik computed api vhost: traefik.dokku.me
Traefik basic auth password: password Traefik computed challenge mode: tls
Traefik basic auth username: user Traefik computed dashboard enabled: false
Traefik challenge mode: tls Traefik computed http entry point: http
Traefik dashboard enabled: false Traefik computed https entry point: https
Traefik dns provider: Traefik computed image: traefik:v2.8
Traefik image: traefik:v2.8 Traefik computed letsencrypt email:
Traefik letsencrypt email: Traefik computed letsencrypt server: https://acme-v02.api.letsencrypt.org/directory
Traefik letsencrypt server: Traefik computed log level: ERROR
Traefik log level: ERROR Traefik global api enabled:
Traefik global api vhost:
Traefik global challenge mode:
Traefik global dashboard enabled:
Traefik global http entry point:
Traefik global https entry point:
Traefik global image:
Traefik global letsencrypt email:
Traefik global letsencrypt server:
Traefik global log level:
``` ```
You can pass flags which will output only the value of the specific information you want. For example: You can pass flags which will output only the value of the specific information you want. For example:
```shell ```shell
dokku traefik:report node-js-app --traefik-api-enabled dokku traefik:report node-js-app --traefik-computed-api-enabled
``` ```
## Properties
### Settable properties
All traefik properties are global only. Set with `traefik:set --global <property> <value>`.
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `api-enabled` | global only | `false` | `--traefik-global-api-enabled`, `--traefik-computed-api-enabled` | When `true`, enables the Traefik HTTP API |
| `api-entry-point` | global only | none | `--traefik-global-api-entry-point`, `--traefik-computed-api-entry-point` | Name of the entry point used by the Traefik API |
| `api-entry-point-address` | global only | none | `--traefik-global-api-entry-point-address`, `--traefik-computed-api-entry-point-address` | Address (`host:port`) the Traefik API listens on |
| `api-vhost` | global only | `traefik.dokku.me` | `--traefik-global-api-vhost`, `--traefik-computed-api-vhost` | Virtual host that routes to the Traefik API |
| `basic-auth-password` | global only | none | `--traefik-global-basic-auth-password`, `--traefik-computed-basic-auth-password` | Password for basic auth in front of the API/dashboard |
| `basic-auth-username` | global only | none | `--traefik-global-basic-auth-username`, `--traefik-computed-basic-auth-username` | Username for basic auth in front of the API/dashboard |
| `challenge-mode` | global only | `tls` | `--traefik-global-challenge-mode`, `--traefik-computed-challenge-mode` | ACME challenge method used by Traefik (`tls`, `http`, or `dns`) |
| `dashboard-enabled` | global only | `false` | `--traefik-global-dashboard-enabled`, `--traefik-computed-dashboard-enabled` | When `true`, enables the Traefik dashboard |
| `dns-provider` | global only | none | `--traefik-global-dns-provider`, `--traefik-computed-dns-provider` | Lego DNS provider name used when `challenge-mode` is `dns` |
| `dns-provider-<ENV_VAR>` | global only | none | (no report flag) | Per-provider environment variables passed to the Traefik container; `<ENV_VAR>` is the upstream variable name (e.g. `dns-provider-cloudflare-api-token`) |
| `http-entry-point` | global only | `http` | `--traefik-global-http-entry-point`, `--traefik-computed-http-entry-point` | Entry point name handling plaintext HTTP traffic |
| `https-entry-point` | global only | `https` | `--traefik-global-https-entry-point`, `--traefik-computed-https-entry-point` | Entry point name handling TLS-terminated HTTPS traffic |
| `image` | global only | _parsed from `plugins/traefik-vhosts/Dockerfile`_ | `--traefik-global-image`, `--traefik-computed-image` | Docker image used to run the Traefik container |
| `letsencrypt-email` | global only | none | `--traefik-global-letsencrypt-email`, `--traefik-computed-letsencrypt-email` | Contact email enabling letsencrypt; empty disables https issuance |
| `letsencrypt-server` | global only | `https://acme-v02.api.letsencrypt.org/directory` | `--traefik-global-letsencrypt-server`, `--traefik-computed-letsencrypt-server` | ACME directory used when requesting certificates |
| `log-level` | global only | `ERROR` | `--traefik-global-log-level`, `--traefik-computed-log-level` | Traefik log level |
### Internal properties
The following properties are not managed by `traefik:set` but are recorded internally by the plugin:
| Property | Description | Source |
|---|---|---|
| `proxy-status` | `started`/`stopped` state of the traefik compose project | `cmd-traefik-start`/`cmd-traefik-stop` in `plugins/traefik-vhosts/command-functions` |

View File

@@ -142,16 +142,24 @@ dokku proxy:report
``` ```
=====> node-js-app proxy information =====> node-js-app proxy information
Proxy computed type: nginx
Proxy enabled: true Proxy enabled: true
Proxy type: nginx Proxy global type:
Proxy type:
=====> python-sample proxy information =====> python-sample proxy information
Proxy computed type: nginx
Proxy enabled: true Proxy enabled: true
Proxy type: nginx Proxy global type:
Proxy type:
=====> ruby-sample proxy information =====> ruby-sample proxy information
Proxy computed type: nginx
Proxy enabled: true Proxy enabled: true
Proxy type: nginx Proxy global type:
Proxy type:
``` ```
The `type` and `global-type` keys hold the raw per-app and global value respectively, and are empty when nothing has been set. The `computed-type` key holds the effective value used at deploy time, falling back to the global value (where one has been set) and then to the built-in default of `nginx`.
You can run the command for a specific app also. You can run the command for a specific app also.
```shell ```shell
@@ -160,14 +168,16 @@ dokku proxy:report node-js-app
``` ```
=====> node-js-app proxy information =====> node-js-app proxy information
Proxy computed type: nginx
Proxy enabled: true Proxy enabled: true
Proxy type: nginx Proxy global type:
Proxy type:
``` ```
You can pass flags which will output only the value of the specific information you want. For example: You can pass flags which will output only the value of the specific information you want. For example:
```shell ```shell
dokku proxy:report node-js-app --proxy-type dokku proxy:report node-js-app --proxy-computed-type
``` ```
#### Proxy Port Scheme #### Proxy Port Scheme
@@ -226,3 +236,22 @@ Proxy implementations may decide to omit some functionality here, or use plugin
Individual proxy implementations _may_ trigger app rebuilds, depending on how proxy metadata is exposed for the proxy implementation. Individual proxy implementations _may_ trigger app rebuilds, depending on how proxy metadata is exposed for the proxy implementation.
Finally, proxy implementations _may_ install extra software needed for the proxy itself in whatever manner deemed fit. Proxy software can run on the host itself or within a running Docker container with either exposed ports or host networking. Finally, proxy implementations _may_ install extra software needed for the proxy itself in whatever manner deemed fit. Proxy software can run on the host itself or within a running Docker container with either exposed ports or host networking.
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `disabled` | app only | `false` | (exposed inverted as `--proxy-enabled`) | When `true`, disables proxy integration for this app (`proxy:enable`/`proxy:disable` write this) |
| `proxy-port` | app + global | none | (not in report) | Override port used for the HTTP listener in the generated proxy config |
| `proxy-ssl-port` | app + global | none | (not in report) | Override port used for the HTTPS listener in the generated proxy config |
| `type` | app + global | `nginx` | `--proxy-type`, `--proxy-global-type`, `--proxy-computed-type` | Proxy implementation handling traffic for the app (`nginx`, `caddy`, `haproxy`, `traefik`, `openresty`, or a custom plugin) |
### Read-only flags
The following flags surface in `proxy:report` but are not managed by `proxy:set`:
| Flag | Description |
|---|---|
| `--proxy-enabled` | `true` when the app's `disabled` property is not `true` |

View File

@@ -463,3 +463,29 @@ The default value (`true`) may be restored by passing an empty value:
```shell ```shell
dokku ps:set node-js-app restore dokku ps:set node-js-app restore
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `dockerfile-start-cmd` | app only | none | (not in report) | Override `CMD` for Dockerfile-based apps |
| `procfile-path` | app + global | `Procfile` | `--ps-procfile-path`, `--ps-global-procfile-path`, `--ps-computed-procfile-path` | Path to the app's Procfile, relative to the build root |
| `restart-policy` | app only | `on-failure:10` | `--ps-restart-policy` | Docker restart policy applied to deployed containers (`no`, `always`, `unless-stopped`, `on-failure[:max-retries]`) |
| `restore` | app only | `true` | `--restore` | When `true`, the app is restarted automatically by `ps:retire` after a host reboot |
| `skip-deploy` | app + global | `false` | (not in report) | When `true`, skips the deploy phase after a successful build |
| `start-cmd` | app only | none | (not in report) | Override start command for buildpack apps |
| `stop-timeout-seconds` | app + global | `30` | `--stop-timeout-seconds`, `--global-stop-timeout-seconds`, `--computed-stop-timeout-seconds` | Seconds Docker waits before SIGKILLing a container on stop |
### Read-only flags
The following flags surface in `ps:report` but are not managed by `ps:set` - they are derived from the running process state:
| Flag | Description |
|---|---|
| `--ps-can-scale` | `false` when the app's procfile or builder forbids horizontal scaling |
| `--deployed` | `true` after the first successful deploy |
| `--running` | `true` while any container for the app is running |
| `--processes` | Total scaled process count across all proctypes |
| `--status-<proctype>` | Container status and ID for each running proctype (one entry per Procfile process type) |

View File

@@ -295,3 +295,14 @@ SHELL=/bin/bash
### PLACE ALL CRON TASKS ABOVE, DO NOT REMOVE THE WHITESPACE AFTER THIS LINE ### PLACE ALL CRON TASKS ABOVE, DO NOT REMOVE THE WHITESPACE AFTER THIS LINE
``` ```
## Properties
### Settable properties
| Property | Scope | Default | Report flags | Description |
|---|---|---|---|---|
| `mailfrom` | app + global | none | `--cron-mailfrom` | `From:` address used in cron failure emails |
| `mailto` | app + global | none | `--cron-mailto` | Recipient address for cron failure emails; empty disables email |
| `maintenance` | app + global | `false` | `--cron-maintenance`, `--cron-global-maintenance`, `--cron-computed-maintenance` | When `true`, suspends all cron tasks for the app (or globally) |
| `maintenance.<cron-id>` | app only | `false` | `--cron-maintenance-<cron-id>` (dynamic per task) | Suspends an individual cron task by its computed ID (one row per task); written by `cron:suspend`/`cron:resume` |

View File

@@ -15,7 +15,8 @@ func ReportSingleApp(appName string, format string, infoFlag string) error {
var flags map[string]common.ReportFunc var flags map[string]common.ReportFunc
if appName == "--global" { if appName == "--global" {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--app-json-global-appjson-path": reportGlobalAppjsonpath, "--app-json-computed-appjson-path": reportComputedAppjsonpath,
"--app-json-global-appjson-path": reportGlobalAppjsonpath,
} }
} else { } else {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
@@ -41,12 +42,15 @@ func reportComputedAppjsonpath(appName string) string {
if value == "" { if value == "" {
value = reportGlobalAppjsonpath(appName) value = reportGlobalAppjsonpath(appName)
} }
if value == "" {
value = "app.json"
}
return value return value
} }
func reportGlobalAppjsonpath(appName string) string { func reportGlobalAppjsonpath(appName string) string {
return common.PropertyGetDefault("app-json", "--global", "appjson-path", "app.json") return common.PropertyGet("app-json", "--global", "appjson-path")
} }
func reportAppjsonpath(appName string) string { func reportAppjsonpath(appName string) string {

View File

@@ -44,6 +44,7 @@ cmd-builder-dockerfile-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-dockerfile-computed-dockerfile-path: $(fn-builder-dockerfile-computed-dockerfile-path "$APP")"
"--builder-dockerfile-global-dockerfile-path: $(fn-builder-dockerfile-global-dockerfile-path "$APP")" "--builder-dockerfile-global-dockerfile-path: $(fn-builder-dockerfile-global-dockerfile-path "$APP")"
) )
else else
@@ -97,6 +98,9 @@ fn-builder-dockerfile-computed-dockerfile-path() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-builder-dockerfile-global-dockerfile-path "$APP")" file="$(fn-builder-dockerfile-global-dockerfile-path "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="Dockerfile"
fi
echo "$file" echo "$file"
} }
@@ -104,7 +108,7 @@ fn-builder-dockerfile-computed-dockerfile-path() {
fn-builder-dockerfile-global-dockerfile-path() { fn-builder-dockerfile-global-dockerfile-path() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "builder-dockerfile" "--global" "dockerfile-path" "Dockerfile" fn-plugin-property-get-default "builder-dockerfile" "--global" "dockerfile-path" ""
} }
fn-builder-dockerfile-dockerfile-path() { fn-builder-dockerfile-dockerfile-path() {

View File

@@ -44,6 +44,7 @@ cmd-builder-herokuish-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-herokuish-computed-allowed: $(fn-builder-herokuish-computed-allowed "$APP")"
"--builder-herokuish-global-allowed: $(fn-builder-herokuish-global-allowed)" "--builder-herokuish-global-allowed: $(fn-builder-herokuish-global-allowed)"
) )
else else
@@ -97,16 +98,16 @@ fn-builder-herokuish-computed-allowed() {
if [[ -z "$allowed" ]]; then if [[ -z "$allowed" ]]; then
allowed="$(fn-builder-herokuish-global-allowed)" allowed="$(fn-builder-herokuish-global-allowed)"
fi fi
if [[ -z "$allowed" ]]; then
allowed="true"
[[ "$(dpkg --print-architecture 2>/dev/null || true)" != "amd64" ]] && allowed="false"
fi
echo "$allowed" echo "$allowed"
} }
fn-builder-herokuish-global-allowed() { fn-builder-herokuish-global-allowed() {
local default_value="true" fn-plugin-property-get-default "builder-herokuish" "--global" "allowed" ""
[[ "$(dpkg --print-architecture 2>/dev/null || true)" != "amd64" ]] && default_value="false"
fn-plugin-property-get-default "builder-herokuish" "--global" "allowed" "$default_value"
} }
fn-builder-herokuish-allowed() { fn-builder-herokuish-allowed() {

View File

@@ -44,6 +44,7 @@ cmd-builder-lambda-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-lambda-computed-lambdayml-path: $(fn-builder-lambda-computed-lambdayml-path "$APP")"
"--builder-lambda-global-lambdayml-path: $(fn-builder-lambda-global-lambdayml-path "$APP")" "--builder-lambda-global-lambdayml-path: $(fn-builder-lambda-global-lambdayml-path "$APP")"
) )
else else
@@ -97,6 +98,9 @@ fn-builder-lambda-computed-lambdayml-path() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-builder-lambda-global-lambdayml-path "$APP")" file="$(fn-builder-lambda-global-lambdayml-path "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="lambda.yml"
fi
echo "$file" echo "$file"
} }
@@ -104,7 +108,7 @@ fn-builder-lambda-computed-lambdayml-path() {
fn-builder-lambda-global-lambdayml-path() { fn-builder-lambda-global-lambdayml-path() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "builder-lambda" "--global" "lambdayml-path" "lambda.yml" fn-plugin-property-get-default "builder-lambda" "--global" "lambdayml-path" ""
} }
fn-builder-lambda-lambdayml-path() { fn-builder-lambda-lambdayml-path() {

View File

@@ -44,6 +44,7 @@ cmd-builder-nixpacks-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-nixpacks-computed-nixpackstoml-path: $(fn-builder-nixpacks-computed-nixpackstoml-path "$APP")"
"--builder-nixpacks-global-nixpackstoml-path: $(fn-builder-nixpacks-global-nixpackstoml-path "$APP")" "--builder-nixpacks-global-nixpackstoml-path: $(fn-builder-nixpacks-global-nixpackstoml-path "$APP")"
) )
else else
@@ -97,6 +98,9 @@ fn-builder-nixpacks-computed-nixpackstoml-path() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-builder-nixpacks-global-nixpackstoml-path "$APP")" file="$(fn-builder-nixpacks-global-nixpackstoml-path "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="nixpacks.toml"
fi
echo "$file" echo "$file"
} }
@@ -104,7 +108,7 @@ fn-builder-nixpacks-computed-nixpackstoml-path() {
fn-builder-nixpacks-global-nixpackstoml-path() { fn-builder-nixpacks-global-nixpackstoml-path() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get "builder-nixpacks" "--global" "nixpackstoml-path" "nixpacks.toml" fn-plugin-property-get "builder-nixpacks" "--global" "nixpackstoml-path" ""
} }
fn-builder-nixpacks-nixpackstoml-path() { fn-builder-nixpacks-nixpackstoml-path() {

View File

@@ -44,6 +44,7 @@ cmd-builder-pack-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-pack-computed-projecttoml-path: $(fn-builder-pack-computed-projecttoml-path "$APP")"
"--builder-pack-global-projecttoml-path: $(fn-builder-pack-global-projecttoml-path "$APP")" "--builder-pack-global-projecttoml-path: $(fn-builder-pack-global-projecttoml-path "$APP")"
) )
else else
@@ -97,6 +98,9 @@ fn-builder-pack-computed-projecttoml-path() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-builder-pack-global-projecttoml-path "$APP")" file="$(fn-builder-pack-global-projecttoml-path "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="project.toml"
fi
echo "$file" echo "$file"
} }
@@ -104,7 +108,7 @@ fn-builder-pack-computed-projecttoml-path() {
fn-builder-pack-global-projecttoml-path() { fn-builder-pack-global-projecttoml-path() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "builder-pack" "--global" "projecttoml-path" "project.toml" fn-plugin-property-get-default "builder-pack" "--global" "projecttoml-path" ""
} }
fn-builder-pack-projecttoml-path() { fn-builder-pack-projecttoml-path() {

View File

@@ -44,6 +44,7 @@ cmd-builder-railpack-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--builder-railpack-computed-railpackjson-path: $(fn-builder-railpack-computed-railpackjson-path "$APP")"
"--builder-railpack-global-railpackjson-path: $(fn-builder-railpack-global-railpackjson-path "$APP")" "--builder-railpack-global-railpackjson-path: $(fn-builder-railpack-global-railpackjson-path "$APP")"
) )
else else
@@ -97,6 +98,9 @@ fn-builder-railpack-computed-railpackjson-path() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-builder-railpack-global-railpackjson-path "$APP")" file="$(fn-builder-railpack-global-railpackjson-path "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="railpack.json"
fi
echo "$file" echo "$file"
} }
@@ -104,7 +108,7 @@ fn-builder-railpack-computed-railpackjson-path() {
fn-builder-railpack-global-railpackjson-path() { fn-builder-railpack-global-railpackjson-path() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get "builder-railpack" "--global" "railpackjson-path" "railpack.json" fn-plugin-property-get "builder-railpack" "--global" "railpackjson-path" ""
} }
fn-builder-railpack-railpackjson-path() { fn-builder-railpack-railpackjson-path() {

View File

@@ -13,7 +13,7 @@ trigger-caddy-vhosts-certs-force() {
return return
fi fi
if [[ -n "$(fn-caddy-letsencrypt-email)" ]]; then if [[ -n "$(fn-caddy-computed-letsencrypt-email)" ]]; then
echo true echo true
fi fi
} }

View File

@@ -70,23 +70,34 @@ cmd-caddy-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--caddy-computed-image: $(fn-caddy-computed-image)"
"--caddy-computed-letsencrypt-email: $(fn-caddy-computed-letsencrypt-email)"
"--caddy-computed-letsencrypt-server: $(fn-caddy-computed-letsencrypt-server)"
"--caddy-computed-log-level: $(fn-caddy-computed-log-level)"
"--caddy-computed-polling-interval: $(fn-caddy-computed-polling-interval)"
"--caddy-computed-tls-internal: $(fn-caddy-computed-tls-internal "$APP")"
"--caddy-global-image: $(fn-caddy-global-image)"
"--caddy-global-letsencrypt-email: $(fn-caddy-global-letsencrypt-email)"
"--caddy-global-letsencrypt-server: $(fn-caddy-global-letsencrypt-server)"
"--caddy-global-log-level: $(fn-caddy-global-log-level)"
"--caddy-global-polling-interval: $(fn-caddy-global-polling-interval)"
"--caddy-global-tls-internal: $(fn-caddy-global-tls-internal)" "--caddy-global-tls-internal: $(fn-caddy-global-tls-internal)"
"--caddy-image: $(fn-caddy-image)"
"--caddy-letsencrypt-email: $(fn-caddy-letsencrypt-email)"
"--caddy-letsencrypt-server: $(fn-caddy-letsencrypt-server)"
"--caddy-log-level: $(fn-caddy-log-level)"
"--caddy-polling-interval: $(fn-caddy-polling-interval)"
) )
else else
verify_app_name "$APP" verify_app_name "$APP"
flag_map=( flag_map=(
"--caddy-computed-image: $(fn-caddy-computed-image)"
"--caddy-computed-letsencrypt-email: $(fn-caddy-computed-letsencrypt-email)"
"--caddy-computed-letsencrypt-server: $(fn-caddy-computed-letsencrypt-server)"
"--caddy-computed-log-level: $(fn-caddy-computed-log-level)"
"--caddy-computed-polling-interval: $(fn-caddy-computed-polling-interval)"
"--caddy-computed-tls-internal: $(fn-caddy-computed-tls-internal "$APP")" "--caddy-computed-tls-internal: $(fn-caddy-computed-tls-internal "$APP")"
"--caddy-global-image: $(fn-caddy-global-image)"
"--caddy-global-letsencrypt-email: $(fn-caddy-global-letsencrypt-email)"
"--caddy-global-letsencrypt-server: $(fn-caddy-global-letsencrypt-server)"
"--caddy-global-log-level: $(fn-caddy-global-log-level)"
"--caddy-global-polling-interval: $(fn-caddy-global-polling-interval)"
"--caddy-global-tls-internal: $(fn-caddy-global-tls-internal)" "--caddy-global-tls-internal: $(fn-caddy-global-tls-internal)"
"--caddy-image: $(fn-caddy-image)"
"--caddy-letsencrypt-email: $(fn-caddy-letsencrypt-email)"
"--caddy-letsencrypt-server: $(fn-caddy-letsencrypt-server)"
"--caddy-log-level: $(fn-caddy-log-level)"
"--caddy-polling-interval: $(fn-caddy-polling-interval)"
"--caddy-tls-internal: $(fn-caddy-tls-internal "$APP")" "--caddy-tls-internal: $(fn-caddy-tls-internal "$APP")"
) )
fi fi

View File

@@ -68,7 +68,7 @@ trigger-caddy-vhosts-docker-args-process-deploy() {
fi fi
done < <(plugn trigger ports-get "$APP") done < <(plugn trigger ports-get "$APP")
letsencrypt_email="$(fn-caddy-letsencrypt-email)" letsencrypt_email="$(fn-caddy-computed-letsencrypt-email)"
if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then
proxy_container_https_port_candidate="$proxy_container_http_port_candidate" proxy_container_https_port_candidate="$proxy_container_http_port_candidate"
proxy_host_https_port_candidate="$proxy_host_http_port_candidate" proxy_host_https_port_candidate="$proxy_host_http_port_candidate"

View File

@@ -36,35 +36,73 @@ fn-caddy-template-compose-file() {
fi fi
local SIGIL_PARAMS=(CADDY_DATA_DIR="${DOKKU_LIB_ROOT}/data/caddy" local SIGIL_PARAMS=(CADDY_DATA_DIR="${DOKKU_LIB_ROOT}/data/caddy"
CADDY_IMAGE="$(fn-caddy-image)" CADDY_IMAGE="$(fn-caddy-computed-image)"
CADDY_LETSENCRYPT_EMAIL="$(fn-caddy-letsencrypt-email)" CADDY_LETSENCRYPT_EMAIL="$(fn-caddy-computed-letsencrypt-email)"
CADDY_LETSENCRYPT_SERVER="$(fn-caddy-letsencrypt-server)" CADDY_LETSENCRYPT_SERVER="$(fn-caddy-computed-letsencrypt-server)"
CADDY_LOG_LEVEL="$(fn-caddy-log-level)" CADDY_LOG_LEVEL="$(fn-caddy-computed-log-level)"
CADDY_POLLING_INTERVAL="$(fn-caddy-polling-interval)") CADDY_POLLING_INTERVAL="$(fn-caddy-computed-polling-interval)")
sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH" sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH"
} }
fn-caddy-image() { fn-caddy-global-image() {
fn-plugin-property-get-default "caddy" "--global" "image" "$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/caddy-vhosts/Dockerfile" | awk '{print $2}')" fn-plugin-property-get-default "caddy" "--global" "image" ""
} }
fn-caddy-letsencrypt-email() { fn-caddy-computed-image() {
local value
value="$(fn-caddy-global-image)"
if [[ -z "$value" ]]; then
value="$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/caddy-vhosts/Dockerfile" | awk '{print $2}')"
fi
echo "$value"
}
fn-caddy-global-letsencrypt-email() {
fn-plugin-property-get-default "caddy" "--global" "letsencrypt-email" "" fn-plugin-property-get-default "caddy" "--global" "letsencrypt-email" ""
} }
fn-caddy-letsencrypt-server() { fn-caddy-computed-letsencrypt-email() {
fn-plugin-property-get-default "caddy" "--global" "letsencrypt-server" "https://acme-v02.api.letsencrypt.org/directory" fn-caddy-global-letsencrypt-email
} }
fn-caddy-log-level() { fn-caddy-global-letsencrypt-server() {
local log_level fn-plugin-property-get-default "caddy" "--global" "letsencrypt-server" ""
log_level="$(fn-plugin-property-get-default "caddy" "--global" "log-level" "ERROR")"
echo "${log_level^^}"
} }
fn-caddy-polling-interval() { fn-caddy-computed-letsencrypt-server() {
fn-plugin-property-get-default "caddy" "--global" "polling-interval" "5s" local value
value="$(fn-caddy-global-letsencrypt-server)"
if [[ -z "$value" ]]; then
value="https://acme-v02.api.letsencrypt.org/directory"
fi
echo "$value"
}
fn-caddy-global-log-level() {
fn-plugin-property-get-default "caddy" "--global" "log-level" ""
}
fn-caddy-computed-log-level() {
local value
value="$(fn-caddy-global-log-level)"
if [[ -z "$value" ]]; then
value="ERROR"
fi
echo "${value^^}"
}
fn-caddy-global-polling-interval() {
fn-plugin-property-get-default "caddy" "--global" "polling-interval" ""
}
fn-caddy-computed-polling-interval() {
local value
value="$(fn-caddy-global-polling-interval)"
if [[ -z "$value" ]]; then
value="5s"
fi
echo "$value"
} }
fn-caddy-tls-internal() { fn-caddy-tls-internal() {
@@ -79,9 +117,12 @@ fn-caddy-computed-tls-internal() {
if [[ -z "$value" ]]; then if [[ -z "$value" ]]; then
value="$(fn-caddy-global-tls-internal)" value="$(fn-caddy-global-tls-internal)"
fi fi
if [[ -z "$value" ]]; then
value="false"
fi
echo "$value" echo "$value"
} }
fn-caddy-global-tls-internal() { fn-caddy-global-tls-internal() {
fn-plugin-property-get-default "caddy" "--global" "tls-internal" "false" fn-plugin-property-get-default "caddy" "--global" "tls-internal" ""
} }

View File

@@ -45,6 +45,7 @@ cmd-checks-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--checks-computed-wait-to-retire: $(fn-checks-computed-wait-to-retire "$APP")"
"--checks-global-wait-to-retire: $(fn-checks-global-wait-to-retire "$APP")" "--checks-global-wait-to-retire: $(fn-checks-global-wait-to-retire "$APP")"
) )
else else
@@ -116,6 +117,9 @@ fn-checks-computed-wait-to-retire() {
if [[ "$file" == "" ]]; then if [[ "$file" == "" ]]; then
file="$(fn-checks-global-wait-to-retire "$APP")" file="$(fn-checks-global-wait-to-retire "$APP")"
fi fi
if [[ "$file" == "" ]]; then
file="60"
fi
echo "$file" echo "$file"
} }
@@ -123,7 +127,7 @@ fn-checks-computed-wait-to-retire() {
fn-checks-global-wait-to-retire() { fn-checks-global-wait-to-retire() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "checks" "--global" "wait-to-retire" "60" fn-plugin-property-get-default "checks" "--global" "wait-to-retire" ""
} }
fn-checks-wait-to-retire() { fn-checks-wait-to-retire() {

View File

@@ -11,12 +11,12 @@ fi
DOKKU_ARCHIVE_MAX_SIZE_DEFAULT="1073741824" DOKKU_ARCHIVE_MAX_SIZE_DEFAULT="1073741824"
DOKKU_ARCHIVE_MAX_FILES_DEFAULT="10000" DOKKU_ARCHIVE_MAX_FILES_DEFAULT="10000"
fn-archive-max-size() { fn-archive-computed-max-size() {
declare desc="returns the configured max archive size in bytes" declare desc="returns the configured max archive size in bytes"
fn-plugin-property-get "git" "--global" "archive-max-size" "$DOKKU_ARCHIVE_MAX_SIZE_DEFAULT" fn-plugin-property-get "git" "--global" "archive-max-size" "$DOKKU_ARCHIVE_MAX_SIZE_DEFAULT"
} }
fn-archive-max-files() { fn-archive-computed-max-files() {
declare desc="returns the configured max archive entry count" declare desc="returns the configured max archive entry count"
fn-plugin-property-get "git" "--global" "archive-max-files" "$DOKKU_ARCHIVE_MAX_FILES_DEFAULT" fn-plugin-property-get "git" "--global" "archive-max-files" "$DOKKU_ARCHIVE_MAX_FILES_DEFAULT"
} }
@@ -43,8 +43,8 @@ fn-archive-check-bomb-protection() {
declare desc="validates archive against bomb protection limits" declare desc="validates archive against bomb protection limits"
declare ARCHIVE_PATH="$1" ARCHIVE_TYPE="$2" declare ARCHIVE_PATH="$1" ARCHIVE_TYPE="$2"
local MAX_SIZE MAX_FILES local MAX_SIZE MAX_FILES
MAX_SIZE="$(fn-archive-max-size)" MAX_SIZE="$(fn-archive-computed-max-size)"
MAX_FILES="$(fn-archive-max-files)" MAX_FILES="$(fn-archive-computed-max-files)"
local ARCHIVE_SIZE local ARCHIVE_SIZE
ARCHIVE_SIZE="$(stat -c %s "$ARCHIVE_PATH" 2>/dev/null || stat -f %z "$ARCHIVE_PATH" 2>/dev/null || echo 0)" ARCHIVE_SIZE="$(stat -c %s "$ARCHIVE_PATH" 2>/dev/null || stat -f %z "$ARCHIVE_PATH" 2>/dev/null || echo 0)"
@@ -190,8 +190,8 @@ fn-archive-extract-zip() {
declare desc="safely extracts a zip archive with post-extraction symlink validation" declare desc="safely extracts a zip archive with post-extraction symlink validation"
declare ARCHIVE_PATH="$1" DEST_DIR="$2" declare ARCHIVE_PATH="$1" DEST_DIR="$2"
local MAX_SIZE MAX_FILES local MAX_SIZE MAX_FILES
MAX_SIZE="$(fn-archive-max-size)" MAX_SIZE="$(fn-archive-computed-max-size)"
MAX_FILES="$(fn-archive-max-files)" MAX_FILES="$(fn-archive-computed-max-files)"
local ARCHIVE_SIZE local ARCHIVE_SIZE
ARCHIVE_SIZE="$(stat -c %s "$ARCHIVE_PATH" 2>/dev/null || stat -f %z "$ARCHIVE_PATH" 2>/dev/null || echo 0)" ARCHIVE_SIZE="$(stat -c %s "$ARCHIVE_PATH" 2>/dev/null || stat -f %z "$ARCHIVE_PATH" 2>/dev/null || echo 0)"

View File

@@ -65,7 +65,7 @@ cmd-git-hook() {
plugn trigger app-exists "$APP" 2>/dev/null || is_valid_app_name "$APP" plugn trigger app-exists "$APP" 2>/dev/null || is_valid_app_name "$APP"
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if ! git check-ref-format --branch "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then if ! git check-ref-format --branch "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then
echo $'\e[1G\e[K'"-----> WARNING: Invalid branch name '$DOKKU_DEPLOY_BRANCH' specified via deploy-branch setting." echo $'\e[1G\e[K'"-----> WARNING: Invalid branch name '$DOKKU_DEPLOY_BRANCH' specified via deploy-branch setting."
echo $'\e[1G\e[K'"-----> For more details, please see the man page for 'git-check-ref-format.'" echo $'\e[1G\e[K'"-----> For more details, please see the man page for 'git-check-ref-format.'"
@@ -84,7 +84,7 @@ cmd-git-hook() {
if [[ $(find "$PLUGIN_PATH"/enabled/*/receive-branch 2>/dev/null | wc -l) != 1 ]]; then if [[ $(find "$PLUGIN_PATH"/enabled/*/receive-branch 2>/dev/null | wc -l) != 1 ]]; then
plugn trigger receive-branch "$APP" "$newrev" "$refname" plugn trigger receive-branch "$APP" "$newrev" "$refname"
plugn trigger deploy-source-set "$APP" "git-push" "$newrev" plugn trigger deploy-source-set "$APP" "git-push" "$newrev"
elif [[ -z "$(fn-git-deploy-branch "$APP" "")" ]]; then elif [[ -z "$(fn-git-computed-deploy-branch "$APP" "")" ]]; then
local deploy_branch="${refname/refs\/heads\//}" local deploy_branch="${refname/refs\/heads\//}"
deploy_branch="${deploy_branch/refs\/tags\//}" deploy_branch="${deploy_branch/refs\/tags\//}"
@@ -115,7 +115,7 @@ git_build() {
fi fi
local REF="$REV" local REF="$REV"
else else
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if [[ -f "$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH" ]]; then if [[ -f "$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH" ]]; then
REF=$(<"$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH") REF=$(<"$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH")
else else

View File

@@ -8,7 +8,7 @@ trigger-git-git-deploy-branch() {
declare trigger="git-deploy-branch" declare trigger="git-deploy-branch"
declare APP="$1" declare APP="$1"
fn-git-deploy-branch "$APP" fn-git-computed-deploy-branch "$APP"
} }
trigger-git-git-deploy-branch "$@" trigger-git-git-deploy-branch "$@"

View File

@@ -11,7 +11,7 @@ trigger-git-git-from-directory() {
declare APP="$1" SOURCECODE_WORK_DIR="$2" USER_NAME="${3:-Dokku}" USER_EMAIL="${4:-automated@dokku.sh}" declare APP="$1" SOURCECODE_WORK_DIR="$2" USER_NAME="${3:-Dokku}" USER_EMAIL="${4:-automated@dokku.sh}"
local APP_ROOT="$DOKKU_ROOT/$APP" local APP_ROOT="$DOKKU_ROOT/$APP"
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
local REV local REV
local TMP_WORK_DIR=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX") local TMP_WORK_DIR=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
local TMP_WORK_DIR_2=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX") local TMP_WORK_DIR_2=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
@@ -25,7 +25,7 @@ trigger-git-git-from-directory() {
dokku_log_info1 "Updating git repository with specified build context" dokku_log_info1 "Updating git repository with specified build context"
if [[ "$has_code" == "false" ]]; then if [[ "$has_code" == "false" ]]; then
# setup new repo # setup new repo
local DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
cp -rT "$SOURCECODE_WORK_DIR" "$TMP_WORK_DIR" cp -rT "$SOURCECODE_WORK_DIR" "$TMP_WORK_DIR"
suppress_output fn-git-cmd "$TMP_WORK_DIR" init suppress_output fn-git-cmd "$TMP_WORK_DIR" init
suppress_output fn-git-cmd "$TMP_WORK_DIR" checkout -b "$DEPLOY_BRANCH" suppress_output fn-git-cmd "$TMP_WORK_DIR" checkout -b "$DEPLOY_BRANCH"
@@ -64,7 +64,7 @@ trigger-git-git-from-directory() {
return return
else else
local exit_code=$? local exit_code=$?
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if [[ "$has_code" == "false" ]]; then if [[ "$has_code" == "false" ]]; then
fn-git-cmd "$APP_ROOT" update-ref -d HEAD fn-git-cmd "$APP_ROOT" update-ref -d HEAD
else else

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/archive-functions"
set -eo pipefail set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x [[ $DOKKU_TRACE ]] && set -x
@@ -273,7 +274,7 @@ cmd-git-sync() {
fi fi
local APP_ROOT="$DOKKU_ROOT/$APP" local APP_ROOT="$DOKKU_ROOT/$APP"
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
CURRENT_REF="$(fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" 2>/dev/null || true)" CURRENT_REF="$(fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" 2>/dev/null || true)"
dokku_setup_build_capture "$APP" "git:sync" dokku_setup_build_capture "$APP" "git:sync"
@@ -369,19 +370,27 @@ cmd-git-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--git-global-archive-max-files: $(fn-plugin-property-get "git" "--global" "archive-max-files" "10000")" "--git-computed-archive-max-files: $(fn-archive-computed-max-files)"
"--git-global-archive-max-size: $(fn-plugin-property-get "git" "--global" "archive-max-size" "1073741824")" "--git-computed-archive-max-size: $(fn-archive-computed-max-size)"
"--git-global-deploy-branch: $(fn-plugin-property-get "git" "--global" "deploy-branch" "master")" "--git-computed-deploy-branch: $(fn-git-computed-deploy-branch "$APP")"
"--git-computed-keep-git-dir: $(fn-git-computed-keep-git-dir "$APP")"
"--git-global-archive-max-files: $(fn-plugin-property-get "git" "--global" "archive-max-files" "")"
"--git-global-archive-max-size: $(fn-plugin-property-get "git" "--global" "archive-max-size" "")"
"--git-global-deploy-branch: $(fn-plugin-property-get "git" "--global" "deploy-branch" "")"
"--git-global-keep-git-dir: $(fn-plugin-property-get "git" "--global" "keep-git-dir" "")"
) )
else else
verify_app_name "$APP" verify_app_name "$APP"
flag_map=( flag_map=(
"--git-computed-deploy-branch: $(fn-git-deploy-branch "$APP")" "--git-computed-archive-max-files: $(fn-archive-computed-max-files)"
"--git-computed-keep-git-dir: $(fn-git-keep-git-dir "$APP")" "--git-computed-archive-max-size: $(fn-archive-computed-max-size)"
"--git-computed-deploy-branch: $(fn-git-computed-deploy-branch "$APP")"
"--git-computed-keep-git-dir: $(fn-git-computed-keep-git-dir "$APP")"
"--git-deploy-branch: $(fn-plugin-property-get "git" "$APP" "deploy-branch" "")" "--git-deploy-branch: $(fn-plugin-property-get "git" "$APP" "deploy-branch" "")"
"--git-global-archive-max-files: $(fn-plugin-property-get "git" "--global" "archive-max-files" "10000")" "--git-global-archive-max-files: $(fn-plugin-property-get "git" "--global" "archive-max-files" "")"
"--git-global-archive-max-size: $(fn-plugin-property-get "git" "--global" "archive-max-size" "1073741824")" "--git-global-archive-max-size: $(fn-plugin-property-get "git" "--global" "archive-max-size" "")"
"--git-global-deploy-branch: $(fn-plugin-property-get "git" "--global" "deploy-branch" "master")" "--git-global-deploy-branch: $(fn-plugin-property-get "git" "--global" "deploy-branch" "")"
"--git-global-keep-git-dir: $(fn-plugin-property-get "git" "--global" "keep-git-dir" "")"
"--git-keep-git-dir: $(fn-plugin-property-get "git" "$APP" "keep-git-dir" "")" "--git-keep-git-dir: $(fn-plugin-property-get "git" "$APP" "keep-git-dir" "")"
"--git-rev-env-var: $(fn-plugin-property-get "git" "$APP" "rev-env-var" "GIT_REV")" "--git-rev-env-var: $(fn-plugin-property-get "git" "$APP" "rev-env-var" "GIT_REV")"
"--git-sha: $(fn-git-cmd "$APP_ROOT" rev-parse HEAD 2>/dev/null || false)" "--git-sha: $(fn-git-cmd "$APP_ROOT" rev-parse HEAD 2>/dev/null || false)"
@@ -475,13 +484,13 @@ fn-git-clone() {
local APP_ROOT="$DOKKU_ROOT/$APP" local APP_ROOT="$DOKKU_ROOT/$APP"
[[ -z "$APP" ]] && dokku_log_fail "Please specify an app to run the command on" [[ -z "$APP" ]] && dokku_log_fail "Please specify an app to run the command on"
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then if fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then
dokku_log_fail "The clone subcommand can only be executed for new applications" dokku_log_fail "The clone subcommand can only be executed for new applications"
fi fi
if [[ -z "$GIT_REF" ]]; then if [[ -z "$GIT_REF" ]]; then
GIT_REF="$(fn-git-deploy-branch "$APP")" GIT_REF="$(fn-git-computed-deploy-branch "$APP")"
fi fi
local TMP_IS_REF_DIR=$(mktemp -d "/tmp/dokku-ref-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX") local TMP_IS_REF_DIR=$(mktemp -d "/tmp/dokku-ref-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
@@ -511,7 +520,7 @@ fn-git-clone() {
fi fi
fi fi
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if [[ "$GIT_REF" != "$DOKKU_DEPLOY_BRANCH" ]]; then if [[ "$GIT_REF" != "$DOKKU_DEPLOY_BRANCH" ]]; then
if [[ "$is_ref" == "true" ]]; then if [[ "$is_ref" == "true" ]]; then
fn-git-cmd "$TMP_CLONE_DIR" branch -qq -D "$DOKKU_DEPLOY_BRANCH" 2>/dev/null || true fn-git-cmd "$TMP_CLONE_DIR" branch -qq -D "$DOKKU_DEPLOY_BRANCH" 2>/dev/null || true
@@ -542,12 +551,12 @@ fn-git-fetch() {
local DOKKU_DEPLOY_BRANCH local DOKKU_DEPLOY_BRANCH
local APP_ROOT="$DOKKU_ROOT/$APP" local APP_ROOT="$DOKKU_ROOT/$APP"
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if ! fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then if ! fn-git-cmd "$APP_ROOT" rev-parse "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then
dokku_log_fail "The fetch subcommand can only be executed for existing applications" dokku_log_fail "The fetch subcommand can only be executed for existing applications"
fi fi
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
if ! fn-git-cmd "$APP_ROOT" check-ref-format --branch "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then if ! fn-git-cmd "$APP_ROOT" check-ref-format --branch "$DOKKU_DEPLOY_BRANCH" &>/dev/null; then
dokku_log_warn "Invalid branch name '$DOKKU_DEPLOY_BRANCH' specified via deploy-branch setting." dokku_log_warn "Invalid branch name '$DOKKU_DEPLOY_BRANCH' specified via deploy-branch setting."
dokku_log_warn "For more details, please see the man page for 'git-check-ref-format.'" dokku_log_warn "For more details, please see the man page for 'git-check-ref-format.'"
@@ -571,7 +580,7 @@ fn-git-has-code() {
declare APP="$1" DOKKU_DEPLOY_BRANCH="$2" declare APP="$1" DOKKU_DEPLOY_BRANCH="$2"
if [[ -z "$DOKKU_DEPLOY_BRANCH" ]]; then if [[ -z "$DOKKU_DEPLOY_BRANCH" ]]; then
DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
fi fi
local HEAD_FILE="$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH" local HEAD_FILE="$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH"
@@ -585,7 +594,7 @@ fn-git-has-code() {
fn-git-last-updated-at() { fn-git-last-updated-at() {
declare desc="retrieve the deploy branch for a given application" declare desc="retrieve the deploy branch for a given application"
declare APP="$1" declare APP="$1"
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
local HEAD_FILE="$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH" local HEAD_FILE="$DOKKU_ROOT/$APP/refs/heads/$DOKKU_DEPLOY_BRANCH"
if [[ -f "$HEAD_FILE" ]]; then if [[ -f "$HEAD_FILE" ]]; then
@@ -593,7 +602,7 @@ fn-git-last-updated-at() {
fi fi
} }
fn-git-deploy-branch() { fn-git-computed-deploy-branch() {
declare desc="retrieve the deploy branch for a given application" declare desc="retrieve the deploy branch for a given application"
local APP="$1" local APP="$1"
local DEFAULT_BRANCH="${2-master}" local DEFAULT_BRANCH="${2-master}"
@@ -609,14 +618,17 @@ fn-git-deploy-branch() {
fi fi
} }
fn-git-keep-git-dir() { fn-git-computed-keep-git-dir() {
declare desc="retrieve the keep-git-dir value for a given application" declare desc="retrieve the keep-git-dir value for a given application"
local APP="$1" local APP="$1"
local DEFAULT_KEEP_GIT_DIR="${2-false}" local DEFAULT_KEEP_GIT_DIR="${2-false}"
local DOKKU_KEEP_GIT_DIR="$(fn-plugin-property-get "git" "$APP" "keep-git-dir" "")" local DOKKU_KEEP_GIT_DIR="$(fn-plugin-property-get "git" "$APP" "keep-git-dir" "")"
local DOKKU_GLOBAL_KEEP_GIT_DIR="$(fn-plugin-property-get "git" "--global" "keep-git-dir" "")"
if [[ -n "$DOKKU_KEEP_GIT_DIR" ]]; then if [[ -n "$DOKKU_KEEP_GIT_DIR" ]]; then
echo "$DOKKU_KEEP_GIT_DIR" echo "$DOKKU_KEEP_GIT_DIR"
elif [[ -n "$DOKKU_GLOBAL_KEEP_GIT_DIR" ]]; then
echo "$DOKKU_GLOBAL_KEEP_GIT_DIR"
else else
echo "$DEFAULT_KEEP_GIT_DIR" echo "$DEFAULT_KEEP_GIT_DIR"
fi fi
@@ -624,7 +636,7 @@ fn-git-keep-git-dir() {
fn-git-setup-build-dir() { fn-git-setup-build-dir() {
declare APP="$1" GIT_WORKDIR="$2" REV="$3" declare APP="$1" GIT_WORKDIR="$2" REV="$3"
local DOKKU_KEEP_GIT_DIR="$(fn-git-keep-git-dir "$APP")" local DOKKU_KEEP_GIT_DIR="$(fn-git-computed-keep-git-dir "$APP")"
if [[ "$DOKKU_KEEP_GIT_DIR" == "true" ]]; then if [[ "$DOKKU_KEEP_GIT_DIR" == "true" ]]; then
fn-git-setup-build-dir-new "$APP" "$GIT_WORKDIR" "$REV" fn-git-setup-build-dir-new "$APP" "$GIT_WORKDIR" "$REV"
@@ -636,7 +648,7 @@ fn-git-setup-build-dir() {
fn-git-setup-build-dir-new() { fn-git-setup-build-dir-new() {
declare APP="$1" GIT_WORKDIR="$2" REV="$3" declare APP="$1" GIT_WORKDIR="$2" REV="$3"
local APP_ROOT="$DOKKU_ROOT/$APP" local APP_ROOT="$DOKKU_ROOT/$APP"
local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")" local DOKKU_DEPLOY_BRANCH="$(fn-git-computed-deploy-branch "$APP")"
# unset the git quarantine path to allow us to use 2.13.0+ # unset the git quarantine path to allow us to use 2.13.0+
# See this issue for more information: https://github.com/dokku/dokku/issues/2796 # See this issue for more information: https://github.com/dokku/dokku/issues/2796
@@ -671,7 +683,7 @@ fn-git-setup-build-dir-worktree() {
fn-git-setup-build-dir-submodules() { fn-git-setup-build-dir-submodules() {
declare APP="$1" GIT_WORKDIR="$2" declare APP="$1" GIT_WORKDIR="$2"
local DOKKU_KEEP_GIT_DIR="$(fn-git-keep-git-dir "$APP")" local DOKKU_KEEP_GIT_DIR="$(fn-git-computed-keep-git-dir "$APP")"
# unset the git quarantine path to allow us to use 2.13.0+ # unset the git quarantine path to allow us to use 2.13.0+
# See this issue for more information: https://github.com/dokku/dokku/issues/2796 # See this issue for more information: https://github.com/dokku/dokku/issues/2796

View File

@@ -13,7 +13,7 @@ trigger-haproxy-vhosts-certs-force() {
return return
fi fi
if [[ -n "$(fn-haproxy-letsencrypt-email)" ]]; then if [[ -n "$(fn-haproxy-computed-letsencrypt-email)" ]]; then
echo true echo true
fi fi
} }

View File

@@ -71,11 +71,16 @@ cmd-haproxy-report-single() {
verify_app_name "$APP" verify_app_name "$APP"
fi fi
local flag_map=( local flag_map=(
"--haproxy-image: $(fn-haproxy-image)" "--haproxy-computed-image: $(fn-haproxy-computed-image)"
"--haproxy-letsencrypt-email: $(fn-haproxy-letsencrypt-email)" "--haproxy-computed-letsencrypt-email: $(fn-haproxy-computed-letsencrypt-email)"
"--haproxy-letsencrypt-server: $(fn-haproxy-letsencrypt-server)" "--haproxy-computed-letsencrypt-server: $(fn-haproxy-computed-letsencrypt-server)"
"--haproxy-log-level: $(fn-haproxy-log-level)" "--haproxy-computed-log-level: $(fn-haproxy-computed-log-level)"
"--haproxy-refresh-conf: $(fn-haproxy-refresh-conf)" "--haproxy-computed-refresh-conf: $(fn-haproxy-computed-refresh-conf)"
"--haproxy-global-image: $(fn-haproxy-global-image)"
"--haproxy-global-letsencrypt-email: $(fn-haproxy-global-letsencrypt-email)"
"--haproxy-global-letsencrypt-server: $(fn-haproxy-global-letsencrypt-server)"
"--haproxy-global-log-level: $(fn-haproxy-global-log-level)"
"--haproxy-global-refresh-conf: $(fn-haproxy-global-refresh-conf)"
) )
fn-report-validate-format "$FORMAT" "$INFO_FLAG" fn-report-validate-format "$FORMAT" "$INFO_FLAG"

View File

@@ -68,7 +68,7 @@ trigger-haproxy-vhosts-docker-args-process-deploy() {
fi fi
done < <(plugn trigger ports-get "$APP") done < <(plugn trigger ports-get "$APP")
letsencrypt_email="$(fn-haproxy-letsencrypt-email)" letsencrypt_email="$(fn-haproxy-computed-letsencrypt-email)"
if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then
proxy_container_https_port_candidate="$proxy_container_http_port_candidate" proxy_container_https_port_candidate="$proxy_container_http_port_candidate"
proxy_host_https_port_candidate="$proxy_host_http_port_candidate" proxy_host_https_port_candidate="$proxy_host_http_port_candidate"

View File

@@ -35,33 +35,71 @@ fn-haproxy-template-compose-file() {
COMPOSE_TEMPLATE="$CUSTOM_COMPOSE_TEMPLATE" COMPOSE_TEMPLATE="$CUSTOM_COMPOSE_TEMPLATE"
fi fi
local SIGIL_PARAMS=(HAPROXY_IMAGE="$(fn-haproxy-image)" local SIGIL_PARAMS=(HAPROXY_IMAGE="$(fn-haproxy-computed-image)"
HAPROXY_LOG_LEVEL="$(fn-haproxy-log-level)" HAPROXY_LOG_LEVEL="$(fn-haproxy-computed-log-level)"
HAPROXY_LETSENCRYPT_EMAIL="$(fn-haproxy-letsencrypt-email)" HAPROXY_LETSENCRYPT_EMAIL="$(fn-haproxy-computed-letsencrypt-email)"
HAPROXY_LETSENCRYPT_SERVER="$(fn-haproxy-letsencrypt-server)" HAPROXY_LETSENCRYPT_SERVER="$(fn-haproxy-computed-letsencrypt-server)"
HAPROXY_REFRESH_CONF="$(fn-haproxy-refresh-conf)") HAPROXY_REFRESH_CONF="$(fn-haproxy-computed-refresh-conf)")
sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH" sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH"
} }
fn-haproxy-image() { fn-haproxy-global-image() {
fn-plugin-property-get-default "haproxy" "--global" "image" "$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/haproxy-vhosts/Dockerfile" | awk '{print $2}')" fn-plugin-property-get-default "haproxy" "--global" "image" ""
} }
fn-haproxy-log-level() { fn-haproxy-computed-image() {
local log_level local value
log_level="$(fn-plugin-property-get-default "haproxy" "--global" "log-level" "ERROR")" value="$(fn-haproxy-global-image)"
echo "${log_level^^}" if [[ -z "$value" ]]; then
value="$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/haproxy-vhosts/Dockerfile" | awk '{print $2}')"
fi
echo "$value"
} }
fn-haproxy-letsencrypt-email() { fn-haproxy-global-log-level() {
fn-plugin-property-get-default "haproxy" "--global" "log-level" ""
}
fn-haproxy-computed-log-level() {
local value
value="$(fn-haproxy-global-log-level)"
if [[ -z "$value" ]]; then
value="ERROR"
fi
echo "${value^^}"
}
fn-haproxy-global-letsencrypt-email() {
fn-plugin-property-get-default "haproxy" "--global" "letsencrypt-email" "" fn-plugin-property-get-default "haproxy" "--global" "letsencrypt-email" ""
} }
fn-haproxy-letsencrypt-server() { fn-haproxy-computed-letsencrypt-email() {
fn-plugin-property-get-default "haproxy" "--global" "letsencrypt-server" "https://acme-v02.api.letsencrypt.org/directory" fn-haproxy-global-letsencrypt-email
} }
fn-haproxy-refresh-conf() { fn-haproxy-global-letsencrypt-server() {
fn-plugin-property-get-default "haproxy" "--global" "refresh-conf" "10" fn-plugin-property-get-default "haproxy" "--global" "letsencrypt-server" ""
}
fn-haproxy-computed-letsencrypt-server() {
local value
value="$(fn-haproxy-global-letsencrypt-server)"
if [[ -z "$value" ]]; then
value="https://acme-v02.api.letsencrypt.org/directory"
fi
echo "$value"
}
fn-haproxy-global-refresh-conf() {
fn-plugin-property-get-default "haproxy" "--global" "refresh-conf" ""
}
fn-haproxy-computed-refresh-conf() {
local value
value="$(fn-haproxy-global-refresh-conf)"
if [[ -z "$value" ]]; then
value="10"
fi
echo "$value"
} }

View File

@@ -222,7 +222,7 @@ func writeVectorConfig() error {
data.Sources["docker-global-source"] = vectorSource{ data.Sources["docker-global-source"] = vectorSource{
Type: "docker_logs", Type: "docker_logs",
IncludeLabels: []string{reportGlobalAppLabelAlias("global")}, IncludeLabels: []string{reportComputedAppLabelAlias("global")},
} }
data.Sinks["docker-global-sink"] = sink data.Sinks["docker-global-sink"] = sink

View File

@@ -20,23 +20,31 @@ func ReportSingleApp(appName string, format string, infoFlag string) error {
var flags map[string]common.ReportFunc var flags map[string]common.ReportFunc
if appName == "--global" { if appName == "--global" {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--logs-global-app-label-alias": reportGlobalAppLabelAlias, "--logs-computed-app-label-alias": reportComputedAppLabelAlias,
"--logs-global-max-size": reportGlobalMaxSize, "--logs-computed-max-size": reportComputedMaxSize,
"--logs-global-vector-sink": reportGlobalVectorSink, "--logs-computed-vector-image": reportComputedVectorImage,
"--logs-vector-global-image": reportVectorGlobalImage, "--logs-computed-vector-networks": reportComputedVectorNetworks,
"--logs-vector-global-networks": reportVectorGlobalNetworks, "--logs-computed-vector-sink": reportComputedVectorSink,
"--logs-global-app-label-alias": reportGlobalAppLabelAlias,
"--logs-global-max-size": reportGlobalMaxSize,
"--logs-global-vector-image": reportGlobalVectorImage,
"--logs-global-vector-networks": reportGlobalVectorNetworks,
"--logs-global-vector-sink": reportGlobalVectorSink,
} }
} else { } else {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--logs-app-label-alias": reportAppLabelAlias,
"--logs-computed-app-label-alias": reportComputedAppLabelAlias, "--logs-computed-app-label-alias": reportComputedAppLabelAlias,
"--logs-computed-max-size": reportComputedMaxSize, "--logs-computed-max-size": reportComputedMaxSize,
"--logs-computed-vector-image": reportComputedVectorImage,
"--logs-computed-vector-networks": reportComputedVectorNetworks,
"--logs-computed-vector-sink": reportComputedVectorSink,
"--logs-global-app-label-alias": reportGlobalAppLabelAlias, "--logs-global-app-label-alias": reportGlobalAppLabelAlias,
"--logs-global-max-size": reportGlobalMaxSize, "--logs-global-max-size": reportGlobalMaxSize,
"--logs-global-vector-image": reportGlobalVectorImage,
"--logs-global-vector-networks": reportGlobalVectorNetworks,
"--logs-global-vector-sink": reportGlobalVectorSink, "--logs-global-vector-sink": reportGlobalVectorSink,
"--logs-app-label-alias": reportAppLabelAlias,
"--logs-max-size": reportMaxSize, "--logs-max-size": reportMaxSize,
"--logs-vector-global-image": reportVectorGlobalImage,
"--logs-vector-global-networks": reportVectorGlobalNetworks,
"--logs-vector-sink": reportVectorSink, "--logs-vector-sink": reportVectorSink,
} }
} }
@@ -57,12 +65,15 @@ func reportComputedAppLabelAlias(appName string) string {
if value == "" { if value == "" {
value = reportGlobalAppLabelAlias(appName) value = reportGlobalAppLabelAlias(appName)
} }
if value == "" {
value = AppLabelAlias
}
return value return value
} }
func reportGlobalAppLabelAlias(appName string) string { func reportGlobalAppLabelAlias(appName string) string {
return common.PropertyGetDefault("logs", "--global", "app-label-alias", AppLabelAlias) return common.PropertyGet("logs", "--global", "app-label-alias")
} }
func reportAppLabelAlias(appName string) string { func reportAppLabelAlias(appName string) string {
@@ -74,22 +85,41 @@ func reportComputedMaxSize(appName string) string {
if value == "" { if value == "" {
value = reportGlobalMaxSize(appName) value = reportGlobalMaxSize(appName)
} }
if value == "" {
value = MaxSize
}
return value return value
} }
func reportGlobalMaxSize(appName string) string { func reportGlobalMaxSize(appName string) string {
return common.PropertyGetDefault("logs", "--global", "max-size", MaxSize) return common.PropertyGet("logs", "--global", "max-size")
} }
func reportVectorGlobalImage(appName string) string { func reportGlobalVectorImage(appName string) string {
return common.PropertyGet("logs", "--global", "vector-image")
}
func reportComputedVectorImage(appName string) string {
return getComputedVectorImage() return getComputedVectorImage()
} }
func reportVectorGlobalNetworks(appName string) string { func reportGlobalVectorNetworks(appName string) string {
return common.PropertyGet("logs", "--global", "vector-networks") return common.PropertyGet("logs", "--global", "vector-networks")
} }
func reportComputedVectorNetworks(appName string) string {
return reportGlobalVectorNetworks(appName)
}
func reportComputedVectorSink(appName string) string {
value := reportVectorSink(appName)
if value == "" {
value = reportGlobalVectorSink(appName)
}
return value
}
func reportGlobalVectorSink(appName string) string { func reportGlobalVectorSink(appName string) string {
value := common.PropertyGet("logs", "--global", "vector-sink") value := common.PropertyGet("logs", "--global", "vector-sink")
if value == "" { if value == "" {

View File

@@ -17,11 +17,16 @@ func ReportSingleApp(appName string, format string, infoFlag string) error {
var flags map[string]common.ReportFunc var flags map[string]common.ReportFunc
if appName == "--global" { if appName == "--global" {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--network-global-attach-post-create": reportGlobalAttachPostCreate, "--network-computed-attach-post-create": reportComputedAttachPostCreate,
"--network-global-attach-post-deploy": reportGlobalAttachPostDeploy, "--network-computed-attach-post-deploy": reportComputedAttachPostDeploy,
"--network-global-bind-all-interfaces": reportGlobalBindAllInterfaces, "--network-computed-bind-all-interfaces": reportComputedBindAllInterfaces,
"--network-global-initial-network": reportGlobalInitialNetwork, "--network-computed-initial-network": reportComputedInitialNetwork,
"--network-global-tld": reportGlobalTld, "--network-computed-tld": reportComputedTld,
"--network-global-attach-post-create": reportGlobalAttachPostCreate,
"--network-global-attach-post-deploy": reportGlobalAttachPostDeploy,
"--network-global-bind-all-interfaces": reportGlobalBindAllInterfaces,
"--network-global-initial-network": reportGlobalInitialNetwork,
"--network-global-tld": reportGlobalTld,
} }
} else { } else {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
@@ -91,6 +96,9 @@ func reportComputedBindAllInterfaces(appName string) string {
if value == "" { if value == "" {
value = reportGlobalBindAllInterfaces(appName) value = reportGlobalBindAllInterfaces(appName)
} }
if value == "" {
value = "false"
}
return value return value
} }
@@ -122,7 +130,7 @@ func reportGlobalAttachPostDeploy(appName string) string {
} }
func reportGlobalBindAllInterfaces(appName string) string { func reportGlobalBindAllInterfaces(appName string) string {
return common.PropertyGetDefault("network", "--global", "bind-all-interfaces", "false") return common.PropertyGet("network", "--global", "bind-all-interfaces")
} }
func reportGlobalInitialNetwork(appName string) string { func reportGlobalInitialNetwork(appName string) string {

View File

@@ -184,9 +184,9 @@ func globalValue(appName string, property string) string {
case "bind-address-ipv6": case "bind-address-ipv6":
value = nginx_vhosts.GlobalBindAddressIPv6() value = nginx_vhosts.GlobalBindAddressIPv6()
case "client-body-timeout": case "client-body-timeout":
value = nginx_vhosts.ComputedClientBodyTimeout(appName) value = nginx_vhosts.GlobalClientBodyTimeout()
case "client-header-timeout": case "client-header-timeout":
value = nginx_vhosts.ComputedClientHeaderTimeout(appName) value = nginx_vhosts.GlobalClientHeaderTimeout()
case "client-max-body-size": case "client-max-body-size":
value = nginx_vhosts.GlobalClientMaxBodySize() value = nginx_vhosts.GlobalClientMaxBodySize()
case "disable-custom-config": case "disable-custom-config":
@@ -202,9 +202,9 @@ func globalValue(appName string, property string) string {
case "hsts": case "hsts":
value = nginx_vhosts.GlobalHSTS() value = nginx_vhosts.GlobalHSTS()
case "keepalive-timeout": case "keepalive-timeout":
value = nginx_vhosts.ComputedKeepaliveTimeout(appName) value = nginx_vhosts.GlobalKeepaliveTimeout()
case "lingering-timeout": case "lingering-timeout":
value = nginx_vhosts.ComputedLingeringTimeout(appName) value = nginx_vhosts.GlobalLingeringTimeout()
case "nginx-conf-sigil-path": case "nginx-conf-sigil-path":
value = nginx_vhosts.GlobalNginxConfSigilPath() value = nginx_vhosts.GlobalNginxConfSigilPath()
case "nginx-service-command": case "nginx-service-command":

View File

@@ -13,10 +13,13 @@ func getComputedProxyType(appName string) string {
if proxyType == "" { if proxyType == "" {
proxyType = getGlobalProxyType() proxyType = getGlobalProxyType()
} }
if proxyType == "" {
proxyType = "nginx"
}
return proxyType return proxyType
} }
func getGlobalProxyType() string { func getGlobalProxyType() string {
return common.PropertyGetDefault("proxy", "--global", "type", "nginx") return common.PropertyGet("proxy", "--global", "type")
} }

View File

@@ -15,7 +15,8 @@ func ReportSingleApp(appName string, format string, infoFlag string) error {
var flags map[string]common.ReportFunc var flags map[string]common.ReportFunc
if appName == "--global" { if appName == "--global" {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--proxy-global-type": reportGlobalType, "--proxy-computed-type": reportComputedType,
"--proxy-global-type": reportGlobalType,
} }
} else { } else {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
@@ -47,12 +48,7 @@ func reportEnabled(appName string) string {
} }
func reportComputedType(appName string) string { func reportComputedType(appName string) string {
proxyType := getGlobalProxyType() return getComputedProxyType(appName)
if proxyType == "" {
proxyType = getAppProxyType(appName)
}
return proxyType
} }
func reportGlobalType(appName string) string { func reportGlobalType(appName string) string {

View File

@@ -102,12 +102,15 @@ func reportComputedProcfilePath(appName string) string {
if value == "" { if value == "" {
value = reportGlobalProcfilePath(appName) value = reportGlobalProcfilePath(appName)
} }
if value == "" {
value = "Procfile"
}
return value return value
} }
func reportGlobalProcfilePath(appName string) string { func reportGlobalProcfilePath(appName string) string {
return common.PropertyGetDefault("ps", "--global", "procfile-path", "Procfile") return common.PropertyGet("ps", "--global", "procfile-path")
} }
func reportProcfilePath(appName string) string { func reportProcfilePath(appName string) string {
@@ -154,14 +157,17 @@ func reportComputedStopTimeoutSeconds(appName string) string {
if value == "" { if value == "" {
value = reportGlobalStopTimeoutSeconds(appName) value = reportGlobalStopTimeoutSeconds(appName)
} }
if value == "" {
value = "30"
}
return value return value
} }
func reportGlobalStopTimeoutSeconds(appName string) string { func reportGlobalStopTimeoutSeconds(appName string) string {
return common.PropertyGetDefault("ps", "--global", "stop-timeout-seconds", "30") return common.PropertyGet("ps", "--global", "stop-timeout-seconds")
} }
func reportStopTimeoutSeconds(appName string) string { func reportStopTimeoutSeconds(appName string) string {
return common.PropertyGetDefault("ps", appName, "stop-timeout-seconds", "30") return common.PropertyGet("ps", appName, "stop-timeout-seconds")
} }

View File

@@ -45,6 +45,8 @@ cmd-scheduler-docker-local-report-single() {
local flag_map=() local flag_map=()
if [[ "$APP" == "--global" ]]; then if [[ "$APP" == "--global" ]]; then
flag_map=( flag_map=(
"--scheduler-docker-local-computed-init-process: $(fn-scheduler-docker-local-computed-init-process "$APP")"
"--scheduler-docker-local-computed-parallel-schedule-count: $(fn-scheduler-docker-local-computed-parallel-schedule-count "$APP")"
"--scheduler-docker-local-global-init-process: $(fn-scheduler-docker-local-global-init-process "$APP")" "--scheduler-docker-local-global-init-process: $(fn-scheduler-docker-local-global-init-process "$APP")"
"--scheduler-docker-local-global-parallel-schedule-count: $(fn-scheduler-docker-local-global-parallel-schedule-count "$APP")" "--scheduler-docker-local-global-parallel-schedule-count: $(fn-scheduler-docker-local-global-parallel-schedule-count "$APP")"
) )
@@ -107,12 +109,15 @@ fn-scheduler-docker-local-computed-init-process() {
if [[ -z "$value" ]]; then if [[ -z "$value" ]]; then
value="$(fn-scheduler-docker-local-global-init-process "$APP")" value="$(fn-scheduler-docker-local-global-init-process "$APP")"
fi fi
if [[ -z "$value" ]]; then
value="true"
fi
echo "$value" echo "$value"
} }
fn-scheduler-docker-local-global-init-process() { fn-scheduler-docker-local-global-init-process() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "scheduler-docker-local" "--global" "init-process" "true" fn-plugin-property-get-default "scheduler-docker-local" "--global" "init-process" ""
} }
fn-scheduler-docker-local-parallel-schedule-count() { fn-scheduler-docker-local-parallel-schedule-count() {
@@ -127,12 +132,15 @@ fn-scheduler-docker-local-computed-parallel-schedule-count() {
if [[ -z "$value" ]]; then if [[ -z "$value" ]]; then
value="$(fn-scheduler-docker-local-global-parallel-schedule-count "$APP")" value="$(fn-scheduler-docker-local-global-parallel-schedule-count "$APP")"
fi fi
if [[ -z "$value" ]]; then
value="1"
fi
echo "$value" echo "$value"
} }
fn-scheduler-docker-local-global-parallel-schedule-count() { fn-scheduler-docker-local-global-parallel-schedule-count() {
declare APP="$1" declare APP="$1"
fn-plugin-property-get-default "scheduler-docker-local" "--global" "parallel-schedule-count" "1" fn-plugin-property-get-default "scheduler-docker-local" "--global" "parallel-schedule-count" ""
} }
fn-scheduler-docker-local-get-checks-file-path() { fn-scheduler-docker-local-get-checks-file-path() {

View File

@@ -15,7 +15,8 @@ func ReportSingleApp(appName string, format string, infoFlag string) error {
var flags map[string]common.ReportFunc var flags map[string]common.ReportFunc
if appName == "--global" { if appName == "--global" {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
"--scheduler-global-selected": reportGlobalSelected, "--scheduler-computed-selected": reportComputedSelected,
"--scheduler-global-selected": reportGlobalSelected,
} }
} else { } else {
flags = map[string]common.ReportFunc{ flags = map[string]common.ReportFunc{
@@ -41,12 +42,15 @@ func reportComputedSelected(appName string) string {
if value == "" { if value == "" {
value = reportGlobalSelected(appName) value = reportGlobalSelected(appName)
} }
if value == "" {
value = "docker-local"
}
return value return value
} }
func reportGlobalSelected(appName string) string { func reportGlobalSelected(appName string) string {
return common.PropertyGetDefault("scheduler", "--global", "selected", "docker-local") return common.PropertyGet("scheduler", "--global", "selected")
} }
func reportSelected(appName string) string { func reportSelected(appName string) string {

View File

@@ -13,7 +13,7 @@ trigger-traefik-vhosts-certs-force() {
return return
fi fi
if [[ -n "$(fn-traefik-letsencrypt-email)" ]]; then if [[ -n "$(fn-traefik-computed-letsencrypt-email)" ]]; then
echo true echo true
fi fi
} }

View File

@@ -71,21 +71,36 @@ cmd-traefik-report-single() {
verify_app_name "$APP" verify_app_name "$APP"
fi fi
local flag_map=( local flag_map=(
"--traefik-api-enabled: $(fn-traefik-api-enabled)" "--traefik-computed-api-enabled: $(fn-traefik-computed-api-enabled)"
"--traefik-api-entry-point: $(fn-traefik-api-entry-point)" "--traefik-computed-api-entry-point: $(fn-traefik-computed-api-entry-point)"
"--traefik-api-entry-point-address: $(fn-traefik-api-entry-point-address)" "--traefik-computed-api-entry-point-address: $(fn-traefik-computed-api-entry-point-address)"
"--traefik-api-vhost: $(fn-traefik-api-vhost)" "--traefik-computed-api-vhost: $(fn-traefik-computed-api-vhost)"
"--traefik-basic-auth-password: $(fn-traefik-basic-auth-password)" "--traefik-computed-basic-auth-password: $(fn-traefik-computed-basic-auth-password)"
"--traefik-basic-auth-username: $(fn-traefik-basic-auth-username)" "--traefik-computed-basic-auth-username: $(fn-traefik-computed-basic-auth-username)"
"--traefik-challenge-mode: $(fn-traefik-challenge-mode)" "--traefik-computed-challenge-mode: $(fn-traefik-computed-challenge-mode)"
"--traefik-dashboard-enabled: $(fn-traefik-dashboard-enabled)" "--traefik-computed-dashboard-enabled: $(fn-traefik-computed-dashboard-enabled)"
"--traefik-dns-provider: $(fn-traefik-dns-provider)" "--traefik-computed-dns-provider: $(fn-traefik-computed-dns-provider)"
"--traefik-image: $(fn-traefik-image)" "--traefik-computed-http-entry-point: $(fn-traefik-computed-http-entry-point)"
"--traefik-letsencrypt-email: $(fn-traefik-letsencrypt-email)" "--traefik-computed-https-entry-point: $(fn-traefik-computed-https-entry-point)"
"--traefik-letsencrypt-server: $(fn-traefik-letsencrypt-server)" "--traefik-computed-image: $(fn-traefik-computed-image)"
"--traefik-log-level: $(fn-traefik-log-level)" "--traefik-computed-letsencrypt-email: $(fn-traefik-computed-letsencrypt-email)"
"--traefik-http-entry-point: $(fn-traefik-http-entry-point)" "--traefik-computed-letsencrypt-server: $(fn-traefik-computed-letsencrypt-server)"
"--traefik-https-entry-point: $(fn-traefik-https-entry-point)" "--traefik-computed-log-level: $(fn-traefik-computed-log-level)"
"--traefik-global-api-enabled: $(fn-traefik-global-api-enabled)"
"--traefik-global-api-entry-point: $(fn-traefik-global-api-entry-point)"
"--traefik-global-api-entry-point-address: $(fn-traefik-global-api-entry-point-address)"
"--traefik-global-api-vhost: $(fn-traefik-global-api-vhost)"
"--traefik-global-basic-auth-password: $(fn-traefik-global-basic-auth-password)"
"--traefik-global-basic-auth-username: $(fn-traefik-global-basic-auth-username)"
"--traefik-global-challenge-mode: $(fn-traefik-global-challenge-mode)"
"--traefik-global-dashboard-enabled: $(fn-traefik-global-dashboard-enabled)"
"--traefik-global-dns-provider: $(fn-traefik-global-dns-provider)"
"--traefik-global-http-entry-point: $(fn-traefik-global-http-entry-point)"
"--traefik-global-https-entry-point: $(fn-traefik-global-https-entry-point)"
"--traefik-global-image: $(fn-traefik-global-image)"
"--traefik-global-letsencrypt-email: $(fn-traefik-global-letsencrypt-email)"
"--traefik-global-letsencrypt-server: $(fn-traefik-global-letsencrypt-server)"
"--traefik-global-log-level: $(fn-traefik-global-log-level)"
) )
local dns_provider_env_vars local dns_provider_env_vars

View File

@@ -68,7 +68,7 @@ trigger-traefik-vhosts-docker-args-process-deploy() {
fi fi
done < <(plugn trigger ports-get "$APP") done < <(plugn trigger ports-get "$APP")
letsencrypt_email="$(fn-traefik-letsencrypt-email)" letsencrypt_email="$(fn-traefik-computed-letsencrypt-email)"
if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then
proxy_container_https_port_candidate="$proxy_container_http_port_candidate" proxy_container_https_port_candidate="$proxy_container_http_port_candidate"
proxy_host_https_port_candidate="$proxy_host_http_port_candidate" proxy_host_https_port_candidate="$proxy_host_http_port_candidate"
@@ -107,7 +107,7 @@ trigger-traefik-vhosts-docker-args-process-deploy() {
fi fi
output="$output --label traefik.http.services.$APP-$PROC_TYPE-http.loadbalancer.server.port=$proxy_container_http_port" output="$output --label traefik.http.services.$APP-$PROC_TYPE-http.loadbalancer.server.port=$proxy_container_http_port"
output="$output --label traefik.http.routers.$APP-$PROC_TYPE-http.entrypoints=$(fn-traefik-http-entry-point)" output="$output --label traefik.http.routers.$APP-$PROC_TYPE-http.entrypoints=$(fn-traefik-computed-http-entry-point)"
output="$output --label traefik.http.routers.$APP-$PROC_TYPE-http.service=$APP-$PROC_TYPE-http" output="$output --label traefik.http.routers.$APP-$PROC_TYPE-http.service=$APP-$PROC_TYPE-http"
if [[ -n "$traefik_domains" ]]; then if [[ -n "$traefik_domains" ]]; then
output="$output --label \"traefik.http.routers.$APP-$PROC_TYPE-http.rule=$traefik_domains\"" output="$output --label \"traefik.http.routers.$APP-$PROC_TYPE-http.rule=$traefik_domains\""
@@ -122,7 +122,7 @@ trigger-traefik-vhosts-docker-args-process-deploy() {
fi fi
output="$output --label traefik.http.services.$APP-$PROC_TYPE-https.loadbalancer.server.port=$proxy_container_https_port" output="$output --label traefik.http.services.$APP-$PROC_TYPE-https.loadbalancer.server.port=$proxy_container_https_port"
output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.entrypoints=$(fn-traefik-https-entry-point)" output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.entrypoints=$(fn-traefik-computed-https-entry-point)"
output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.service=$APP-$PROC_TYPE-https" output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.service=$APP-$PROC_TYPE-https"
output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.tls.certresolver=leresolver" output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.tls.certresolver=leresolver"
if [[ -n "$traefik_domains" ]]; then if [[ -n "$traefik_domains" ]]; then

View File

@@ -36,106 +36,209 @@ fn-traefik-template-compose-file() {
COMPOSE_TEMPLATE="$CUSTOM_COMPOSE_TEMPLATE" COMPOSE_TEMPLATE="$CUSTOM_COMPOSE_TEMPLATE"
fi fi
basic_auth_password="$(fn-traefik-basic-auth-password)" basic_auth_password="$(fn-traefik-computed-basic-auth-password)"
basic_auth_username="$(fn-traefik-basic-auth-username)" basic_auth_username="$(fn-traefik-computed-basic-auth-username)"
if [[ -n "$basic_auth_password" ]] && [[ -n "$basic_auth_username" ]]; then if [[ -n "$basic_auth_password" ]] && [[ -n "$basic_auth_username" ]]; then
basic_auth="$(htpasswd -nb "$basic_auth_username" "$basic_auth_password" | sed -e s/\\$/\\$\\$/g)" basic_auth="$(htpasswd -nb "$basic_auth_username" "$basic_auth_password" | sed -e s/\\$/\\$\\$/g)"
fi fi
local dns_provider_env_vars="" local dns_provider_env_vars=""
local dns_provider local dns_provider
dns_provider="$(fn-traefik-dns-provider)" dns_provider="$(fn-traefik-computed-dns-provider)"
if [[ -n "$dns_provider" ]]; then if [[ -n "$dns_provider" ]]; then
dns_provider_env_vars="$(fn-traefik-dns-provider-env-vars)" dns_provider_env_vars="$(fn-traefik-dns-provider-env-vars)"
fi fi
local api_entry_point_address api_entry_point_port="" local api_entry_point_address api_entry_point_port=""
api_entry_point_address="$(fn-traefik-api-entry-point-address)" api_entry_point_address="$(fn-traefik-computed-api-entry-point-address)"
if [[ -n "$api_entry_point_address" ]]; then if [[ -n "$api_entry_point_address" ]]; then
api_entry_point_port="${api_entry_point_address##*:}" api_entry_point_port="${api_entry_point_address##*:}"
fi fi
local SIGIL_PARAMS=(TRAEFIK_API_ENABLED="$(fn-traefik-api-enabled)" local SIGIL_PARAMS=(TRAEFIK_API_ENABLED="$(fn-traefik-computed-api-enabled)"
TRAEFIK_API_ENTRY_POINT="$(fn-traefik-api-entry-point)" TRAEFIK_API_ENTRY_POINT="$(fn-traefik-computed-api-entry-point)"
TRAEFIK_API_ENTRY_POINT_ADDRESS="$api_entry_point_address" TRAEFIK_API_ENTRY_POINT_ADDRESS="$api_entry_point_address"
TRAEFIK_API_ENTRY_POINT_PORT="$api_entry_point_port" TRAEFIK_API_ENTRY_POINT_PORT="$api_entry_point_port"
TRAEFIK_API_VHOST="$(fn-traefik-api-vhost)" TRAEFIK_API_VHOST="$(fn-traefik-computed-api-vhost)"
TRAEFIK_BASIC_AUTH="$basic_auth" TRAEFIK_BASIC_AUTH="$basic_auth"
TRAEFIK_CHALLENGE_MODE="$(fn-traefik-challenge-mode)" TRAEFIK_CHALLENGE_MODE="$(fn-traefik-computed-challenge-mode)"
TRAEFIK_DASHBOARD_ENABLED="$(fn-traefik-dashboard-enabled)" TRAEFIK_DASHBOARD_ENABLED="$(fn-traefik-computed-dashboard-enabled)"
TRAEFIK_DATA_DIR="${DOKKU_LIB_ROOT}/data/traefik" TRAEFIK_DATA_DIR="${DOKKU_LIB_ROOT}/data/traefik"
TRAEFIK_DNS_PROVIDER="$dns_provider" TRAEFIK_DNS_PROVIDER="$dns_provider"
TRAEFIK_DNS_PROVIDER_ENV_VARS="$dns_provider_env_vars" TRAEFIK_DNS_PROVIDER_ENV_VARS="$dns_provider_env_vars"
TRAEFIK_IMAGE="$(fn-traefik-image)" TRAEFIK_IMAGE="$(fn-traefik-computed-image)"
TRAEFIK_LETSENCRYPT_EMAIL="$(fn-traefik-letsencrypt-email)" TRAEFIK_LETSENCRYPT_EMAIL="$(fn-traefik-computed-letsencrypt-email)"
TRAEFIK_LETSENCRYPT_SERVER="$(fn-traefik-letsencrypt-server)" TRAEFIK_LETSENCRYPT_SERVER="$(fn-traefik-computed-letsencrypt-server)"
TRAEFIK_LOG_LEVEL="$(fn-traefik-log-level)") TRAEFIK_LOG_LEVEL="$(fn-traefik-computed-log-level)")
sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH" sigil -f "$COMPOSE_TEMPLATE" "${SIGIL_PARAMS[@]}" | cat -s >"$OUTPUT_PATH"
} }
fn-traefik-api-enabled() { fn-traefik-global-api-enabled() {
fn-plugin-property-get-default "traefik" "--global" "api-enabled" "false" fn-plugin-property-get-default "traefik" "--global" "api-enabled" ""
} }
fn-traefik-api-vhost() { fn-traefik-computed-api-enabled() {
fn-plugin-property-get-default "traefik" "--global" "api-vhost" "traefik.dokku.me" local value
value="$(fn-traefik-global-api-enabled)"
if [[ -z "$value" ]]; then
value="false"
fi
echo "$value"
} }
fn-traefik-basic-auth-password() { fn-traefik-global-api-vhost() {
fn-plugin-property-get-default "traefik" "--global" "api-vhost" ""
}
fn-traefik-computed-api-vhost() {
local value
value="$(fn-traefik-global-api-vhost)"
if [[ -z "$value" ]]; then
value="traefik.dokku.me"
fi
echo "$value"
}
fn-traefik-global-basic-auth-password() {
fn-plugin-property-get-default "traefik" "--global" "basic-auth-password" "" fn-plugin-property-get-default "traefik" "--global" "basic-auth-password" ""
} }
fn-traefik-basic-auth-username() { fn-traefik-computed-basic-auth-password() {
fn-traefik-global-basic-auth-password
}
fn-traefik-global-basic-auth-username() {
fn-plugin-property-get-default "traefik" "--global" "basic-auth-username" "" fn-plugin-property-get-default "traefik" "--global" "basic-auth-username" ""
} }
fn-traefik-dashboard-enabled() { fn-traefik-computed-basic-auth-username() {
fn-plugin-property-get-default "traefik" "--global" "dashboard-enabled" "false" fn-traefik-global-basic-auth-username
} }
fn-traefik-image() { fn-traefik-global-dashboard-enabled() {
fn-plugin-property-get-default "traefik" "--global" "image" "$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/traefik-vhosts/Dockerfile" | awk '{print $2}')" fn-plugin-property-get-default "traefik" "--global" "dashboard-enabled" ""
} }
fn-traefik-letsencrypt-email() { fn-traefik-computed-dashboard-enabled() {
local value
value="$(fn-traefik-global-dashboard-enabled)"
if [[ -z "$value" ]]; then
value="false"
fi
echo "$value"
}
fn-traefik-global-image() {
fn-plugin-property-get-default "traefik" "--global" "image" ""
}
fn-traefik-computed-image() {
local value
value="$(fn-traefik-global-image)"
if [[ -z "$value" ]]; then
value="$(grep "FROM" "$PLUGIN_AVAILABLE_PATH/traefik-vhosts/Dockerfile" | awk '{print $2}')"
fi
echo "$value"
}
fn-traefik-global-letsencrypt-email() {
fn-plugin-property-get-default "traefik" "--global" "letsencrypt-email" "" fn-plugin-property-get-default "traefik" "--global" "letsencrypt-email" ""
} }
fn-traefik-letsencrypt-server() { fn-traefik-computed-letsencrypt-email() {
fn-plugin-property-get-default "traefik" "--global" "letsencrypt-server" "https://acme-v02.api.letsencrypt.org/directory" fn-traefik-global-letsencrypt-email
} }
fn-traefik-log-level() { fn-traefik-global-letsencrypt-server() {
local log_level fn-plugin-property-get-default "traefik" "--global" "letsencrypt-server" ""
log_level="$(fn-plugin-property-get-default "traefik" "--global" "log-level" "ERROR")"
echo "${log_level^^}"
} }
fn-traefik-http-entry-point() { fn-traefik-computed-letsencrypt-server() {
fn-plugin-property-get-default "traefik" "--global" "http-entry-point" "http" local value
value="$(fn-traefik-global-letsencrypt-server)"
if [[ -z "$value" ]]; then
value="https://acme-v02.api.letsencrypt.org/directory"
fi
echo "$value"
} }
fn-traefik-https-entry-point() { fn-traefik-global-log-level() {
fn-plugin-property-get-default "traefik" "--global" "https-entry-point" "https" fn-plugin-property-get-default "traefik" "--global" "log-level" ""
} }
fn-traefik-api-entry-point() { fn-traefik-computed-log-level() {
local value
value="$(fn-traefik-global-log-level)"
if [[ -z "$value" ]]; then
value="ERROR"
fi
echo "${value^^}"
}
fn-traefik-global-http-entry-point() {
fn-plugin-property-get-default "traefik" "--global" "http-entry-point" ""
}
fn-traefik-computed-http-entry-point() {
local value
value="$(fn-traefik-global-http-entry-point)"
if [[ -z "$value" ]]; then
value="http"
fi
echo "$value"
}
fn-traefik-global-https-entry-point() {
fn-plugin-property-get-default "traefik" "--global" "https-entry-point" ""
}
fn-traefik-computed-https-entry-point() {
local value
value="$(fn-traefik-global-https-entry-point)"
if [[ -z "$value" ]]; then
value="https"
fi
echo "$value"
}
fn-traefik-global-api-entry-point() {
fn-plugin-property-get-default "traefik" "--global" "api-entry-point" "" fn-plugin-property-get-default "traefik" "--global" "api-entry-point" ""
} }
fn-traefik-api-entry-point-address() { fn-traefik-computed-api-entry-point() {
fn-traefik-global-api-entry-point
}
fn-traefik-global-api-entry-point-address() {
fn-plugin-property-get-default "traefik" "--global" "api-entry-point-address" "" fn-plugin-property-get-default "traefik" "--global" "api-entry-point-address" ""
} }
fn-traefik-challenge-mode() { fn-traefik-computed-api-entry-point-address() {
fn-plugin-property-get-default "traefik" "--global" "challenge-mode" "tls" fn-traefik-global-api-entry-point-address
} }
fn-traefik-dns-provider() { fn-traefik-global-challenge-mode() {
fn-plugin-property-get-default "traefik" "--global" "challenge-mode" ""
}
fn-traefik-computed-challenge-mode() {
local value
value="$(fn-traefik-global-challenge-mode)"
if [[ -z "$value" ]]; then
value="tls"
fi
echo "$value"
}
fn-traefik-global-dns-provider() {
fn-plugin-property-get-default "traefik" "--global" "dns-provider" "" fn-plugin-property-get-default "traefik" "--global" "dns-provider" ""
} }
fn-traefik-computed-dns-provider() {
fn-traefik-global-dns-provider
}
fn-traefik-dns-provider-env-vars() { fn-traefik-dns-provider-env-vars() {
declare desc="returns all dns-provider-* environment variables" declare desc="returns all dns-provider-* environment variables"
fn-plugin-property-get-all-by-prefix "traefik" "--global" "dns-provider-" fn-plugin-property-get-all-by-prefix "traefik" "--global" "dns-provider-"

View File

@@ -278,7 +278,7 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "app.json" assert_output ""
run /bin/bash -c "dokku app-json:report $TEST_APP --format json" run /bin/bash -c "dokku app-json:report $TEST_APP --format json"
echo "output: $output" echo "output: $output"
@@ -286,7 +286,7 @@ teardown() {
assert_success assert_success
assert_output_contains '"app-json-appjson-path":"app2.json"' assert_output_contains '"app-json-appjson-path":"app2.json"'
assert_output_contains '"app-json-computed-appjson-path":"app2.json"' assert_output_contains '"app-json-computed-appjson-path":"app2.json"'
assert_output_contains '"app-json-global-appjson-path":"app.json"' assert_output_contains '"app-json-global-appjson-path":""'
assert_output_contains "app-json-selected" 0 assert_output_contains "app-json-selected" 0
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-selected" run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-selected"
@@ -313,6 +313,55 @@ teardown() {
assert_output "app.json" assert_output "app.json"
} }
@test "(app-json:report) appjson-path raw vs computed vs global" {
run /bin/bash -c "dokku app-json:set --global appjson-path"
assert_success
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-appjson-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-global-appjson-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-computed-appjson-path"
assert_success
assert_output "app.json"
run /bin/bash -c "dokku app-json:set --global appjson-path app.global.json"
assert_success
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-global-appjson-path"
assert_success
assert_output "app.global.json"
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-computed-appjson-path"
assert_success
assert_output "app.global.json"
run /bin/bash -c "dokku app-json:set $TEST_APP appjson-path app.app.json"
assert_success
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-appjson-path"
assert_success
assert_output "app.app.json"
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-global-appjson-path"
assert_success
assert_output "app.global.json"
run /bin/bash -c "dokku app-json:report $TEST_APP --app-json-computed-appjson-path"
assert_success
assert_output "app.app.json"
run /bin/bash -c "dokku app-json:set $TEST_APP appjson-path"
assert_success
run /bin/bash -c "dokku app-json:set --global appjson-path"
assert_success
}
copy_app_json_to_sub_app() { copy_app_json_to_sub_app() {
local APP="$1" local APP="$1"
local APP_REPO_DIR="$2" local APP_REPO_DIR="$2"

View File

@@ -228,12 +228,24 @@ PY
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --git-computed-archive-max-size"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "1073741824" assert_output "1073741824"
run /bin/bash -c "dokku git:report --global --git-global-archive-max-files" run /bin/bash -c "dokku git:report --global --git-global-archive-max-files"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --git-computed-archive-max-files"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "10000" assert_output "10000"
run /bin/bash -c "dokku git:set --global archive-max-size 2147483648" run /bin/bash -c "dokku git:set --global archive-max-size 2147483648"
@@ -244,6 +256,12 @@ PY
assert_success assert_success
assert_output "2147483648" assert_output "2147483648"
run /bin/bash -c "dokku git:report --global --git-computed-archive-max-size"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "2147483648"
run /bin/bash -c "dokku git:set --global archive-max-size" run /bin/bash -c "dokku git:set --global archive-max-size"
assert_success assert_success
} }

View File

@@ -46,7 +46,7 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "Dockerfile" assert_output ""
run /bin/bash -c "dokku builder-dockerfile:report --global --format json | jq -r 'has(\"dockerfile-path\")'" run /bin/bash -c "dokku builder-dockerfile:report --global --format json | jq -r 'has(\"dockerfile-path\")'"
echo "output: $output" echo "output: $output"
@@ -64,6 +64,75 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku builder-dockerfile:set --global dockerfile-path Dockerfile.custom"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku builder-dockerfile:report --global --builder-dockerfile-global-dockerfile-path"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "Dockerfile.custom"
run /bin/bash -c "dokku builder-dockerfile:set --global dockerfile-path"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(builder-dockerfile:report) dockerfile-path raw vs computed vs global" {
run /bin/bash -c "dokku builder-dockerfile:set --global dockerfile-path"
assert_success
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-dockerfile-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-global-dockerfile-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-computed-dockerfile-path"
assert_success
assert_output "Dockerfile"
run /bin/bash -c "dokku builder-dockerfile:set --global dockerfile-path Dockerfile.global"
assert_success
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-global-dockerfile-path"
assert_success
assert_output "Dockerfile.global"
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-computed-dockerfile-path"
assert_success
assert_output "Dockerfile.global"
run /bin/bash -c "dokku builder-dockerfile:set $TEST_APP dockerfile-path Dockerfile.app"
assert_success
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-dockerfile-path"
assert_success
assert_output "Dockerfile.app"
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-global-dockerfile-path"
assert_success
assert_output "Dockerfile.global"
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-computed-dockerfile-path"
assert_success
assert_output "Dockerfile.app"
run /bin/bash -c "dokku builder-dockerfile:set $TEST_APP dockerfile-path"
assert_success
run /bin/bash -c "dokku builder-dockerfile:set --global dockerfile-path"
assert_success
run /bin/bash -c "dokku builder-dockerfile:report $TEST_APP --builder-dockerfile-computed-dockerfile-path"
assert_success
assert_output "Dockerfile" assert_output "Dockerfile"
} }

View File

@@ -52,6 +52,58 @@ teardown() {
assert_success assert_success
} }
@test "(builder-herokuish:report) allowed raw vs computed vs global" {
local default_allowed="true"
[[ "$(dpkg --print-architecture 2>/dev/null || true)" != "amd64" ]] && default_allowed="false"
run /bin/bash -c "dokku builder-herokuish:set --global allowed"
assert_success
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-allowed"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-global-allowed"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-computed-allowed"
assert_success
assert_output "$default_allowed"
run /bin/bash -c "dokku builder-herokuish:set --global allowed false"
assert_success
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-global-allowed"
assert_success
assert_output "false"
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-computed-allowed"
assert_success
assert_output "false"
run /bin/bash -c "dokku builder-herokuish:set $TEST_APP allowed true"
assert_success
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-allowed"
assert_success
assert_output "true"
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-global-allowed"
assert_success
assert_output "false"
run /bin/bash -c "dokku builder-herokuish:report $TEST_APP --builder-herokuish-computed-allowed"
assert_success
assert_output "true"
run /bin/bash -c "dokku builder-herokuish:set $TEST_APP allowed"
assert_success
run /bin/bash -c "dokku builder-herokuish:set --global allowed"
assert_success
}
@test "(builder-herouish:build .env)" { @test "(builder-herouish:build .env)" {
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP
echo "output: $output" echo "output: $output"

View File

@@ -52,6 +52,55 @@ teardown() {
assert_success assert_success
} }
@test "(builder-lambda:report) lambdayml-path raw vs computed vs global" {
run /bin/bash -c "dokku builder-lambda:set --global lambdayml-path"
assert_success
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-lambdayml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-global-lambdayml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-computed-lambdayml-path"
assert_success
assert_output "lambda.yml"
run /bin/bash -c "dokku builder-lambda:set --global lambdayml-path lambda.global.yml"
assert_success
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-global-lambdayml-path"
assert_success
assert_output "lambda.global.yml"
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-computed-lambdayml-path"
assert_success
assert_output "lambda.global.yml"
run /bin/bash -c "dokku builder-lambda:set $TEST_APP lambdayml-path lambda.app.yml"
assert_success
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-lambdayml-path"
assert_success
assert_output "lambda.app.yml"
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-global-lambdayml-path"
assert_success
assert_output "lambda.global.yml"
run /bin/bash -c "dokku builder-lambda:report $TEST_APP --builder-lambda-computed-lambdayml-path"
assert_success
assert_output "lambda.app.yml"
run /bin/bash -c "dokku builder-lambda:set $TEST_APP lambdayml-path"
assert_success
run /bin/bash -c "dokku builder-lambda:set --global lambdayml-path"
assert_success
}
@test "(builder-lambda:set)" { @test "(builder-lambda:set)" {
run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk" run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk"
echo "output: $output" echo "output: $output"

View File

@@ -56,6 +56,55 @@ teardown() {
assert_success assert_success
} }
@test "(builder-nixpacks:report) nixpackstoml-path raw vs computed vs global" {
run /bin/bash -c "dokku builder-nixpacks:set --global nixpackstoml-path"
assert_success
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-nixpackstoml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-global-nixpackstoml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-computed-nixpackstoml-path"
assert_success
assert_output "nixpacks.toml"
run /bin/bash -c "dokku builder-nixpacks:set --global nixpackstoml-path nixpacks.global.toml"
assert_success
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-global-nixpackstoml-path"
assert_success
assert_output "nixpacks.global.toml"
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-computed-nixpackstoml-path"
assert_success
assert_output "nixpacks.global.toml"
run /bin/bash -c "dokku builder-nixpacks:set $TEST_APP nixpackstoml-path nixpacks.app.toml"
assert_success
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-nixpackstoml-path"
assert_success
assert_output "nixpacks.app.toml"
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-global-nixpackstoml-path"
assert_success
assert_output "nixpacks.global.toml"
run /bin/bash -c "dokku builder-nixpacks:report $TEST_APP --builder-nixpacks-computed-nixpackstoml-path"
assert_success
assert_output "nixpacks.app.toml"
run /bin/bash -c "dokku builder-nixpacks:set $TEST_APP nixpackstoml-path"
assert_success
run /bin/bash -c "dokku builder-nixpacks:set --global nixpackstoml-path"
assert_success
}
@test "(builder-nixpacks:set)" { @test "(builder-nixpacks:set)" {
run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk" run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk"
echo "output: $output" echo "output: $output"

View File

@@ -58,6 +58,55 @@ teardown() {
assert_success assert_success
} }
@test "(builder-pack:report) projecttoml-path raw vs computed vs global" {
run /bin/bash -c "dokku builder-pack:set --global projecttoml-path"
assert_success
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-projecttoml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-global-projecttoml-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-computed-projecttoml-path"
assert_success
assert_output "project.toml"
run /bin/bash -c "dokku builder-pack:set --global projecttoml-path project.global.toml"
assert_success
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-global-projecttoml-path"
assert_success
assert_output "project.global.toml"
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-computed-projecttoml-path"
assert_success
assert_output "project.global.toml"
run /bin/bash -c "dokku builder-pack:set $TEST_APP projecttoml-path project.app.toml"
assert_success
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-projecttoml-path"
assert_success
assert_output "project.app.toml"
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-global-projecttoml-path"
assert_success
assert_output "project.global.toml"
run /bin/bash -c "dokku builder-pack:report $TEST_APP --builder-pack-computed-projecttoml-path"
assert_success
assert_output "project.app.toml"
run /bin/bash -c "dokku builder-pack:set $TEST_APP projecttoml-path"
assert_success
run /bin/bash -c "dokku builder-pack:set --global projecttoml-path"
assert_success
}
@test "(builder-pack:set)" { @test "(builder-pack:set)" {
run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk" run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk"
echo "output: $output" echo "output: $output"

View File

@@ -67,6 +67,55 @@ teardown() {
assert_success assert_success
} }
@test "(builder-railpack:report) railpackjson-path raw vs computed vs global" {
run /bin/bash -c "dokku builder-railpack:set --global railpackjson-path"
assert_success
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-railpackjson-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-global-railpackjson-path"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-computed-railpackjson-path"
assert_success
assert_output "railpack.json"
run /bin/bash -c "dokku builder-railpack:set --global railpackjson-path railpack.global.json"
assert_success
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-global-railpackjson-path"
assert_success
assert_output "railpack.global.json"
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-computed-railpackjson-path"
assert_success
assert_output "railpack.global.json"
run /bin/bash -c "dokku builder-railpack:set $TEST_APP railpackjson-path railpack.app.json"
assert_success
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-railpackjson-path"
assert_success
assert_output "railpack.app.json"
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-global-railpackjson-path"
assert_success
assert_output "railpack.global.json"
run /bin/bash -c "dokku builder-railpack:report $TEST_APP --builder-railpack-computed-railpackjson-path"
assert_success
assert_output "railpack.app.json"
run /bin/bash -c "dokku builder-railpack:set $TEST_APP railpackjson-path"
assert_success
run /bin/bash -c "dokku builder-railpack:set --global railpackjson-path"
assert_success
}
@test "(builder-railpack:set)" { @test "(builder-railpack:set)" {
run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk" run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk"
echo "output: $output" echo "output: $output"

View File

@@ -209,6 +209,104 @@ teardown() {
assert_success assert_success
} }
@test "(builder:report) selected raw vs computed vs global" {
run /bin/bash -c "dokku builder:set --global selected"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-selected"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-selected"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-selected"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:set --global selected dockerfile"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-selected"
assert_success
assert_output "dockerfile"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-selected"
assert_success
assert_output "dockerfile"
run /bin/bash -c "dokku builder:set $TEST_APP selected herokuish"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-selected"
assert_success
assert_output "herokuish"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-selected"
assert_success
assert_output "dockerfile"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-selected"
assert_success
assert_output "herokuish"
run /bin/bash -c "dokku builder:set $TEST_APP selected"
assert_success
run /bin/bash -c "dokku builder:set --global selected"
assert_success
}
@test "(builder:report) build-dir raw vs computed vs global" {
run /bin/bash -c "dokku builder:set --global build-dir"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-build-dir"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-build-dir"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-build-dir"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku builder:set --global build-dir global/subdir"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-build-dir"
assert_success
assert_output "global/subdir"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-build-dir"
assert_success
assert_output "global/subdir"
run /bin/bash -c "dokku builder:set $TEST_APP build-dir app/subdir"
assert_success
run /bin/bash -c "dokku builder:report $TEST_APP --builder-build-dir"
assert_success
assert_output "app/subdir"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-global-build-dir"
assert_success
assert_output "global/subdir"
run /bin/bash -c "dokku builder:report $TEST_APP --builder-computed-build-dir"
assert_success
assert_output "app/subdir"
run /bin/bash -c "dokku builder:set $TEST_APP build-dir"
assert_success
run /bin/bash -c "dokku builder:set --global build-dir"
assert_success
}
@test "(builder:set)" { @test "(builder:set)" {
run deploy_app python run deploy_app python
echo "output: $output" echo "output: $output"

View File

@@ -191,6 +191,51 @@ teardown() {
assert_success assert_success
} }
@test "(buildpacks:report) stack raw vs computed vs global" {
run /bin/bash -c "dokku buildpacks:set-property --global stack"
assert_success
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-stack\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-global-stack\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku buildpacks:set-property --global stack gliderlabs/herokuish:global"
assert_success
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-global-stack\"'"
assert_success
assert_output "gliderlabs/herokuish:global"
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-computed-stack\"'"
assert_success
assert_output "gliderlabs/herokuish:global"
run /bin/bash -c "dokku buildpacks:set-property $TEST_APP stack gliderlabs/herokuish:app"
assert_success
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-stack\"'"
assert_success
assert_output "gliderlabs/herokuish:app"
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-global-stack\"'"
assert_success
assert_output "gliderlabs/herokuish:global"
run /bin/bash -c "dokku buildpacks:report $TEST_APP --format json | jq -r '.\"buildpacks-computed-stack\"'"
assert_success
assert_output "gliderlabs/herokuish:app"
run /bin/bash -c "dokku buildpacks:set-property $TEST_APP stack"
assert_success
run /bin/bash -c "dokku buildpacks:set-property --global stack"
assert_success
}
@test "(buildpacks) buildpacks:remove" { @test "(buildpacks) buildpacks:remove" {
run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs"
echo "output: $output" echo "output: $output"

View File

@@ -18,13 +18,31 @@ teardown() {
dokku nginx:start dokku nginx:start
} }
@test "(caddy:report) --global --caddy-log-level" { @test "(caddy:report) --global global vs computed log-level" {
run /bin/bash -c "dokku caddy:report --global --caddy-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku caddy:report --global --caddy-computed-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "ERROR"
run /bin/bash -c "dokku caddy:set --global log-level DEBUG" run /bin/bash -c "dokku caddy:set --global log-level DEBUG"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku caddy:report --global --caddy-log-level" run /bin/bash -c "dokku caddy:report --global --caddy-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "DEBUG"
run /bin/bash -c "dokku caddy:report --global --caddy-computed-log-level"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -34,6 +52,44 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku caddy:report --global --caddy-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku caddy:report --global --caddy-computed-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "ERROR"
}
@test "(caddy:report) --global raw and computed keys in --format json" {
run /bin/bash -c "dokku caddy:report --global --format json | jq -r '.\"global-image\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku caddy:report --global --format json | jq -r '.\"computed-image\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_exists
run /bin/bash -c "dokku caddy:report --global --format json | jq -r '.\"global-polling-interval\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku caddy:report --global --format json | jq -r '.\"computed-polling-interval\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "5s"
} }
@test "(caddy) global-only keys" { @test "(caddy) global-only keys" {
@@ -80,7 +136,7 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "false" assert_output ""
run /bin/bash -c "dokku caddy:set $TEST_APP tls-internal true" run /bin/bash -c "dokku caddy:set $TEST_APP tls-internal true"
echo "output: $output" echo "output: $output"
@@ -294,12 +350,12 @@ teardown() {
assert_success assert_success
assert_output "$TEST_APP.${DOKKU_DOMAIN}" assert_output "$TEST_APP.${DOKKU_DOMAIN}"
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output_not_exists assert_output_not_exists
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-detected" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "http:80:5000 https:443:5000" assert_output "http:80:5000 https:443:5000"

View File

@@ -41,7 +41,7 @@ teardown() {
} }
@test "(checks:report) --global --format json" { @test "(checks:report) --global --format json" {
run /bin/bash -c "dokku checks:set --global wait-to-retire 90" run /bin/bash -c "dokku checks:set --global wait-to-retire"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -55,13 +55,30 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "90" assert_output ""
run /bin/bash -c "dokku checks:report --global --format json | jq -r 'has(\"wait-to-retire\")'" run /bin/bash -c "dokku checks:report --global --format json | jq -r '.\"computed-wait-to-retire\"'"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "false" assert_output "60"
run /bin/bash -c "dokku checks:set --global wait-to-retire 90"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku checks:report --global --format json | jq -r '.\"global-wait-to-retire\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "90"
run /bin/bash -c "dokku checks:report --global --format json | jq -r '.\"computed-wait-to-retire\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "90"
run /bin/bash -c "dokku checks:report --global" run /bin/bash -c "dokku checks:report --global"
echo "output: $output" echo "output: $output"
@@ -69,16 +86,22 @@ teardown() {
assert_success assert_success
assert_output_contains "global checks information" assert_output_contains "global checks information"
run /bin/bash -c "dokku checks:report --global --checks-global-wait-to-retire"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "90"
run /bin/bash -c "dokku checks:set --global wait-to-retire" run /bin/bash -c "dokku checks:set --global wait-to-retire"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku checks:report --global --checks-global-wait-to-retire"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku checks:report --global --checks-computed-wait-to-retire"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "60"
} }
@test "(checks) checks:help" { @test "(checks) checks:help" {

View File

@@ -186,6 +186,59 @@ teardown() {
assert_output_not_contains "unknown flag" assert_output_not_contains "unknown flag"
} }
@test "(cron:report) maintenance raw vs computed vs global" {
run /bin/bash -c "dokku cron:set --global maintenance"
assert_success
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-maintenance\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-global-maintenance\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-computed-maintenance\"'"
assert_success
assert_output "false"
run /bin/bash -c "dokku cron:set --global maintenance true"
assert_success
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-global-maintenance\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-computed-maintenance\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku cron:set $TEST_APP maintenance true"
assert_success
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-maintenance\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-global-maintenance\"'"
assert_success
assert_output "true"
# cron computed-maintenance returns "true" if either per-app or global is
# "true" (cron's logic at plugins/cron/report.go::reportComputedMaintenance
# is OR-not-override: any "true" wins). This is intentional for maintenance
# mode - a per-app "false" does NOT override a global "true".
run /bin/bash -c "dokku cron:report $TEST_APP --format json | jq -r '.\"cron-computed-maintenance\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku cron:set $TEST_APP maintenance"
assert_success
run /bin/bash -c "dokku cron:set --global maintenance"
assert_success
}
@test "(cron:set) --global rejects task maintenance properties" { @test "(cron:set) --global rejects task maintenance properties" {
run /bin/bash -c "dokku cron:set --global maintenance.fakeid true" run /bin/bash -c "dokku cron:set --global maintenance.fakeid true"
echo "output: $output" echo "output: $output"

View File

@@ -71,52 +71,88 @@ teardown() {
assert_output_contains "Invalid flag passed" assert_output_contains "Invalid flag passed"
} }
@test "(git:report) keep-git-dir raw vs computed" { @test "(git:report) keep-git-dir raw vs computed vs global" {
run /bin/bash -c "dokku git:report $TEST_APP --git-keep-git-dir" run /bin/bash -c "dokku git:set --global keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku git:report $TEST_APP --git-keep-git-dir"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku git:report $TEST_APP --git-global-keep-git-dir"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir" run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
assert_output "false" assert_output "false"
run /bin/bash -c "dokku git:set $TEST_APP keep-git-dir true" run /bin/bash -c "dokku git:set --global keep-git-dir true"
echo "output: $output"
echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku git:report $TEST_APP --git-keep-git-dir" run /bin/bash -c "dokku git:report $TEST_APP --git-global-keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
assert_output "true" assert_output "true"
run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir" run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
assert_output "true" assert_output "true"
run /bin/bash -c "dokku git:set $TEST_APP keep-git-dir false"
assert_success
run /bin/bash -c "dokku git:report $TEST_APP --git-keep-git-dir"
assert_success
assert_output "false"
run /bin/bash -c "dokku git:report $TEST_APP --git-global-keep-git-dir"
assert_success
assert_output "true"
run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir"
assert_success
assert_output "false"
run /bin/bash -c "dokku git:set $TEST_APP keep-git-dir" run /bin/bash -c "dokku git:set $TEST_APP keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku git:report $TEST_APP --git-keep-git-dir" run /bin/bash -c "dokku git:set --global keep-git-dir"
echo "output: $output"
echo "status: $status"
assert_success assert_success
assert_output "" }
run /bin/bash -c "dokku git:report $TEST_APP --git-computed-keep-git-dir" @test "(git:report) rev-env-var raw" {
echo "output: $output" # Unset the per-app property file if a previous test left it written-empty
echo "status: $status" # (git:set <app> rev-env-var "" intentionally writes an empty file as the
# documented "unset" behavior, which masks the report's default fallback).
run /bin/bash -c "dokku git:set $TEST_APP rev-env-var COMMIT_SHA"
assert_success assert_success
assert_output "false"
run /bin/bash -c "dokku git:report $TEST_APP --git-rev-env-var"
assert_success
assert_output "COMMIT_SHA"
run /bin/bash -c "dokku git:set $TEST_APP rev-env-var"
assert_success
}
@test "(git:report) source-image raw" {
run /bin/bash -c "dokku git:report $TEST_APP --git-source-image"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku git:set $TEST_APP source-image alpine:3.20"
assert_success
run /bin/bash -c "dokku git:report $TEST_APP --git-source-image"
assert_success
assert_output "alpine:3.20"
run /bin/bash -c "dokku git:set $TEST_APP source-image"
assert_success
run /bin/bash -c "dokku git:report $TEST_APP --git-source-image"
assert_success
assert_output_not_exists
} }
@test "(git:report) raw and computed keys in --format json" { @test "(git:report) raw and computed keys in --format json" {
@@ -145,6 +181,60 @@ teardown() {
assert_output "false" assert_output "false"
} }
@test "(git:report) --global raw and computed keys" {
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"global-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"computed-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "master"
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"global-archive-max-files\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"computed-archive-max-files\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "10000"
run /bin/bash -c "dokku git:set --global deploy-branch main"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"global-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "main"
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"computed-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "main"
run /bin/bash -c "dokku git:set --global deploy-branch"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"global-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
}
@test "(git) git:help" { @test "(git) git:help" {
run /bin/bash -c "dokku git" run /bin/bash -c "dokku git"
echo "output: $output" echo "output: $output"

View File

@@ -887,7 +887,13 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "master" assert_output ""
run /bin/bash -c "dokku git:report $TEST_APP --format json | jq -r '.\"computed-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "main"
run /bin/bash -c "dokku git:report $TEST_APP --format json | jq -e ." run /bin/bash -c "dokku git:report $TEST_APP --format json | jq -e ."
echo "output: $output" echo "output: $output"
@@ -925,6 +931,12 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --format json | jq -r '.\"computed-deploy-branch\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "master" assert_output "master"
run /bin/bash -c "dokku git:report --global --format json | jq -r 'has(\"deploy-branch\")'" run /bin/bash -c "dokku git:report --global --format json | jq -r 'has(\"deploy-branch\")'"
@@ -937,5 +949,11 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku git:report --global --git-computed-deploy-branch"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "master" assert_output "master"
} }

View File

@@ -57,7 +57,13 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku haproxy:report --global --haproxy-refresh-conf" run /bin/bash -c "dokku haproxy:report --global --haproxy-global-refresh-conf"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "5"
run /bin/bash -c "dokku haproxy:report --global --haproxy-computed-refresh-conf"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -74,7 +80,42 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku haproxy:report --global --haproxy-refresh-conf" run /bin/bash -c "dokku haproxy:report --global --haproxy-global-refresh-conf"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku haproxy:report --global --haproxy-computed-refresh-conf"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "10"
}
@test "(haproxy:report) --global raw and computed keys in --format json" {
run /bin/bash -c "dokku haproxy:set --global refresh-conf"
assert_success
run /bin/bash -c "dokku haproxy:report --global --format json | jq -r '.\"global-image\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku haproxy:report --global --format json | jq -r '.\"computed-image\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_exists
run /bin/bash -c "dokku haproxy:report --global --format json | jq -r '.\"global-refresh-conf\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku haproxy:report --global --format json | jq -r '.\"computed-refresh-conf\"'"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -205,12 +246,12 @@ teardown() {
assert_success assert_success
assert_output "true" assert_output "true"
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output_not_exists assert_output_not_exists
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-detected" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "http:80:5000 https:443:5000" assert_output "http:80:5000 https:443:5000"

View File

@@ -9,6 +9,7 @@ setup() {
teardown() { teardown() {
destroy_app destroy_app
dokku logs:set --global vector-image >/dev/null 2>/dev/null || true
dokku logs:set --global vector-networks >/dev/null 2>/dev/null || true dokku logs:set --global vector-networks >/dev/null 2>/dev/null || true
docker network rm test-vector-net-a >/dev/null || true docker network rm test-vector-net-a >/dev/null || true
docker network rm test-vector-net-b >/dev/null || true docker network rm test-vector-net-b >/dev/null || true
@@ -57,7 +58,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_failure assert_failure
assert_output_contains "$TEST_APP logs information" 0 assert_output_contains "$TEST_APP logs information" 0
assert_output_contains "Invalid flag passed, valid flags: --logs-app-label-alias, --logs-computed-app-label-alias, --logs-computed-max-size, --logs-global-app-label-alias, --logs-global-max-size, --logs-global-vector-sink, --logs-max-size, --logs-vector-global-image, --logs-vector-global-networks, --logs-vector-sink" assert_output_contains "Invalid flag passed, valid flags: --logs-app-label-alias, --logs-computed-app-label-alias, --logs-computed-max-size, --logs-computed-vector-image, --logs-computed-vector-networks, --logs-computed-vector-sink, --logs-global-app-label-alias, --logs-global-max-size, --logs-global-vector-image, --logs-global-vector-networks, --logs-global-vector-sink, --logs-max-size, --logs-vector-sink"
run /bin/bash -c "dokku logs:report $TEST_APP --logs-vector-sink 2>&1" run /bin/bash -c "dokku logs:report $TEST_APP --logs-vector-sink 2>&1"
echo "output: $output" echo "output: $output"
@@ -74,6 +75,14 @@ teardown() {
assert_output_contains "Invalid flag passed" 0 assert_output_contains "Invalid flag passed" 0
} }
@test "(logs) logs:report --global invalid flag" {
run /bin/bash -c "dokku logs:report --global --invalid-flag 2>&1"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "Invalid flag passed, valid flags: --logs-computed-app-label-alias, --logs-computed-max-size, --logs-computed-vector-image, --logs-computed-vector-networks, --logs-computed-vector-sink, --logs-global-app-label-alias, --logs-global-max-size, --logs-global-vector-image, --logs-global-vector-networks, --logs-global-vector-sink"
}
@test "(logs) logs:set [error]" { @test "(logs) logs:set [error]" {
run /bin/bash -c "dokku logs:set 2>&1" run /bin/bash -c "dokku logs:set 2>&1"
echo "output: $output" echo "output: $output"
@@ -412,7 +421,7 @@ teardown() {
assert_success assert_success
assert_output_not_exists assert_output_not_exists
run /bin/bash -c "dokku logs:report $TEST_APP --logs-global-max-size 2>&1" run /bin/bash -c "dokku logs:report $TEST_APP --logs-computed-max-size 2>&1"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -428,6 +437,12 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output_not_exists
run /bin/bash -c "dokku logs:report $TEST_APP --logs-computed-max-size 2>&1"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "10m" assert_output "10m"
run /bin/bash -c "dokku logs:set --global max-size 20m" 2>&1 run /bin/bash -c "dokku logs:set --global max-size 20m" 2>&1
@@ -442,6 +457,12 @@ teardown() {
assert_success assert_success
assert_output "20m" assert_output "20m"
run /bin/bash -c "dokku logs:report $TEST_APP --logs-computed-max-size 2>&1"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "20m"
run /bin/bash -c "dokku logs:set --global max-size unlimited" 2>&1 run /bin/bash -c "dokku logs:set --global max-size unlimited" 2>&1
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
@@ -464,9 +485,81 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output_not_exists
run /bin/bash -c "dokku logs:report $TEST_APP --logs-computed-max-size 2>&1"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "10m" assert_output "10m"
} }
@test "(logs:report) vector-sink raw vs global" {
run create_app
assert_success
run /bin/bash -c "dokku logs:set --global vector-sink"
assert_success
run /bin/bash -c "dokku logs:report $TEST_APP --format json | jq -r '.\"logs-vector-sink\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku logs:report $TEST_APP --format json | jq -r '.\"logs-global-vector-sink\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku logs:set --global vector-sink console://?encoding[codec]=json"
assert_success
run /bin/bash -c "dokku logs:report $TEST_APP --format json | jq -r '.\"logs-global-vector-sink\"'"
assert_success
assert_output "console://?encoding[codec]=json"
run /bin/bash -c "dokku logs:set $TEST_APP vector-sink datadog_logs://?api_key=abc"
assert_success
run /bin/bash -c "dokku logs:report $TEST_APP --format json | jq -r '.\"logs-vector-sink\"'"
assert_success
assert_output "datadog_logs://?api_key=abc"
run /bin/bash -c "dokku logs:set $TEST_APP vector-sink"
assert_success
run /bin/bash -c "dokku logs:set --global vector-sink"
assert_success
}
@test "(logs:report) vector-global-image and vector-global-networks raw" {
run create_app
assert_success
run /bin/bash -c "dokku logs:set --global vector-image"
assert_success
run /bin/bash -c "dokku logs:report --global --format json | jq -r '.\"logs-global-vector-image\"'"
assert_success
assert_output_not_exists
run /bin/bash -c "dokku logs:report --global --format json | jq -r '.\"logs-computed-vector-image\"'"
assert_success
assert_output_exists
run /bin/bash -c "dokku logs:set --global vector-image timberio/vector:custom"
assert_success
run /bin/bash -c "dokku logs:report --global --format json | jq -r '.\"logs-global-vector-image\"'"
assert_success
assert_output "timberio/vector:custom"
run /bin/bash -c "dokku logs:set --global vector-image"
assert_success
run /bin/bash -c "dokku logs:report --global --format json | jq -r '.\"logs-global-vector-networks\"'"
assert_success
assert_output ""
}
@test "(logs) logs:set --global vector-networks" { @test "(logs) logs:set --global vector-networks" {
docker network create test-vector-net-a >/dev/null docker network create test-vector-net-a >/dev/null
docker network create test-vector-net-b >/dev/null docker network create test-vector-net-b >/dev/null
@@ -506,7 +599,7 @@ teardown() {
assert_success assert_success
assert_output_contains "Setting vector-networks" assert_output_contains "Setting vector-networks"
run /bin/bash -c "dokku logs:report --global --logs-vector-global-networks 2>&1" run /bin/bash -c "dokku logs:report --global --logs-global-vector-networks 2>&1"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -518,7 +611,7 @@ teardown() {
assert_success assert_success
assert_output_contains "Setting vector-networks" assert_output_contains "Setting vector-networks"
run /bin/bash -c "dokku logs:report --global --logs-vector-global-networks 2>&1" run /bin/bash -c "dokku logs:report --global --logs-global-vector-networks 2>&1"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -530,7 +623,7 @@ teardown() {
assert_success assert_success
assert_output_contains "Unsetting vector-networks" assert_output_contains "Unsetting vector-networks"
run /bin/bash -c "dokku logs:report --global --logs-vector-global-networks 2>&1" run /bin/bash -c "dokku logs:report --global --logs-global-vector-networks 2>&1"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success

View File

@@ -66,6 +66,141 @@ teardown() {
assert_success assert_success
} }
@test "(network:report) tld raw vs computed" {
run /bin/bash -c "dokku network:set --global tld"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku network:report --global --format json | jq -r '.\"network-global-tld\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku network:set --global tld example.test"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku network:report --global --format json | jq -r '.\"network-global-tld\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "example.test"
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-tld\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "example.test"
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-computed-tld\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "example.test"
run /bin/bash -c "dokku network:set --global tld"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(network:report) attach-post-create raw vs computed vs global" {
docker network create create-network-x >/dev/null
run /bin/bash -c "dokku network:set --global attach-post-create"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-attach-post-create\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-attach-post-create\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-computed-attach-post-create\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:set --global attach-post-create create-network-x"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-attach-post-create\"'"
assert_success
assert_output "create-network-x"
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-computed-attach-post-create\"'"
assert_success
assert_output "create-network-x"
run /bin/bash -c "dokku network:set --global attach-post-create"
assert_success
docker network rm create-network-x >/dev/null
}
@test "(network:report) attach-post-deploy raw vs computed vs global" {
docker network create deploy-network-x >/dev/null
run /bin/bash -c "dokku network:set --global attach-post-deploy"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-attach-post-deploy\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-attach-post-deploy\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:set --global attach-post-deploy deploy-network-x"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-attach-post-deploy\"'"
assert_success
assert_output "deploy-network-x"
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-computed-attach-post-deploy\"'"
assert_success
assert_output "deploy-network-x"
run /bin/bash -c "dokku network:set --global attach-post-deploy"
assert_success
docker network rm deploy-network-x >/dev/null
}
@test "(network:report) initial-network raw vs computed vs global" {
docker network create initial-network-x >/dev/null
run /bin/bash -c "dokku network:set --global initial-network"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-initial-network\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-initial-network\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku network:set --global initial-network initial-network-x"
assert_success
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-global-initial-network\"'"
assert_success
assert_output "initial-network-x"
run /bin/bash -c "dokku network:report $TEST_APP --format json | jq -r '.\"network-computed-initial-network\"'"
assert_success
assert_output "initial-network-x"
run /bin/bash -c "dokku network:set --global initial-network"
assert_success
docker network rm initial-network-x >/dev/null
}
@test "(network) network:set bind-all-interfaces" { @test "(network) network:set bind-all-interfaces" {
run deploy_app run deploy_app
echo "output: $output" echo "output: $output"

View File

@@ -0,0 +1,103 @@
#!/usr/bin/env bats
load test_helper
setup() {
global_setup
create_app
}
teardown() {
destroy_app
global_teardown
}
# assert_nginx_property_set_get verifies that for a given nginx property,
# (a) the raw per-app and global keys cycle through set/unset states,
# (b) the computed key always returns a non-empty value when defaults exist,
# and (c) the computed key falls back through per-app -> global.
#
# This intentionally does not pin the exact default value for properties whose
# default is computed at runtime (e.g. proxy-buffer-size depends on the host's
# page size) - those would be brittle to assert verbatim. The set/unset cycle
# is the canonical test for the report convention.
assert_nginx_property_set_get() {
declare prop="$1" app_value="$2" global_value="$3"
run /bin/bash -c "dokku nginx:set --global $prop"
assert_success
run /bin/bash -c "dokku nginx:set --global $prop '$global_value'"
assert_success
run /bin/bash -c "dokku nginx:report $TEST_APP --format json | jq -r '.\"global-$prop\"'"
assert_success
assert_output "$global_value"
run /bin/bash -c "dokku nginx:report $TEST_APP --format json | jq -r '.\"computed-$prop\"'"
assert_success
assert_output "$global_value"
run /bin/bash -c "dokku nginx:set $TEST_APP $prop '$app_value'"
assert_success
run /bin/bash -c "dokku nginx:report $TEST_APP --format json | jq -r '.\"$prop\"'"
assert_success
assert_output "$app_value"
run /bin/bash -c "dokku nginx:report $TEST_APP --format json | jq -r '.\"global-$prop\"'"
assert_success
assert_output "$global_value"
run /bin/bash -c "dokku nginx:report $TEST_APP --format json | jq -r '.\"computed-$prop\"'"
assert_success
assert_output "$app_value"
run /bin/bash -c "dokku nginx:set $TEST_APP $prop"
assert_success
run /bin/bash -c "dokku nginx:set --global $prop"
assert_success
}
@test "(nginx:report) timeout properties raw/global/computed" {
for prop in client-body-timeout client-header-timeout keepalive-timeout lingering-timeout send-timeout proxy-connect-timeout proxy-read-timeout proxy-send-timeout; do
assert_nginx_property_set_get "$prop" "30s" "45s"
done
}
@test "(nginx:report) buffer properties raw/global/computed" {
assert_nginx_property_set_get "proxy-buffer-size" "8k" "16k"
assert_nginx_property_set_get "proxy-buffering" "off" "on"
assert_nginx_property_set_get "proxy-buffers" "16 16k" "32 16k"
assert_nginx_property_set_get "proxy-busy-buffers-size" "16k" "32k"
assert_nginx_property_set_get "client-max-body-size" "10m" "20m"
}
@test "(nginx:report) hsts properties raw/global/computed" {
assert_nginx_property_set_get "hsts" "false" "true"
assert_nginx_property_set_get "hsts-include-subdomains" "false" "true"
assert_nginx_property_set_get "hsts-max-age" "3600" "7200"
assert_nginx_property_set_get "hsts-preload" "true" "false"
}
@test "(nginx:report) x-forwarded properties raw/global/computed" {
assert_nginx_property_set_get "x-forwarded-for-value" "\$remote_addr" "\$proxy_add_x_forwarded_for"
assert_nginx_property_set_get "x-forwarded-port-value" "8080" "8443"
assert_nginx_property_set_get "x-forwarded-proto-value" "https" "http"
assert_nginx_property_set_get "x-forwarded-ssl" "on" "off"
}
@test "(nginx:report) log/address properties raw/global/computed" {
assert_nginx_property_set_get "bind-address-ipv4" "127.0.0.1" "0.0.0.0"
assert_nginx_property_set_get "bind-address-ipv6" "::1" "::"
assert_nginx_property_set_get "access-log-format" "main" "combined"
assert_nginx_property_set_get "access-log-path" "/var/log/nginx/app-access.log" "/dev/stdout"
assert_nginx_property_set_get "error-log-path" "/var/log/nginx/app-error.log" "/dev/stderr"
}
@test "(nginx:report) misc properties raw/global/computed" {
assert_nginx_property_set_get "disable-custom-config" "false" "true"
assert_nginx_property_set_get "underscore-in-headers" "on" "off"
assert_nginx_property_set_get "proxy-keepalive" "8" "16"
}

View File

@@ -28,6 +28,103 @@ teardown() {
assert_output "$help_output" assert_output "$help_output"
} }
@test "(proxy:report) --global raw vs computed type" {
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-global-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-computed-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "nginx"
run /bin/bash -c "dokku proxy:set --global type caddy"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-global-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "caddy"
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-computed-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "caddy"
run /bin/bash -c "dokku proxy:set --global type"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-global-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku proxy:report --global --format json | jq -r '.\"proxy-computed-type\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "nginx"
}
@test "(proxy:report) type raw vs computed vs global" {
run /bin/bash -c "dokku proxy:set --global type"
assert_success
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-type\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-global-type\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-computed-type\"'"
assert_success
assert_output "nginx"
run /bin/bash -c "dokku proxy:set --global type caddy"
assert_success
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-global-type\"'"
assert_success
assert_output "caddy"
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-computed-type\"'"
assert_success
assert_output "caddy"
run /bin/bash -c "dokku proxy:set $TEST_APP type traefik"
assert_success
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-type\"'"
assert_success
assert_output "traefik"
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-global-type\"'"
assert_success
assert_output "caddy"
run /bin/bash -c "dokku proxy:report $TEST_APP --format json | jq -r '.\"proxy-computed-type\"'"
assert_success
assert_output "traefik"
run /bin/bash -c "dokku proxy:set $TEST_APP type"
assert_success
run /bin/bash -c "dokku proxy:set --global type"
assert_success
}
@test "(proxy:set) invalid port mapping set" { @test "(proxy:set) invalid port mapping set" {
run /bin/bash -c "dokku proxy:set $TEST_APP http:80:80" run /bin/bash -c "dokku proxy:set $TEST_APP http:80:80"
echo "output: $output" echo "output: $output"

View File

@@ -83,7 +83,7 @@ teardown() {
run /bin/bash -c "dokku ps:report $TEST_APP --ps-global-procfile-path" run /bin/bash -c "dokku ps:report $TEST_APP --ps-global-procfile-path"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "Procfile" assert_output ""
assert_success assert_success
run /bin/bash -c "dokku ps:report $TEST_APP --ps-procfile-path" run /bin/bash -c "dokku ps:report $TEST_APP --ps-procfile-path"
@@ -168,8 +168,57 @@ web
assert_success assert_success
} }
@test "(ps:report) stop-timeout-seconds raw vs computed vs global" {
run /bin/bash -c "dokku ps:set --global stop-timeout-seconds"
assert_success
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"stop-timeout-seconds\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"global-stop-timeout-seconds\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"computed-stop-timeout-seconds\"'"
assert_success
assert_output "30"
run /bin/bash -c "dokku ps:set --global stop-timeout-seconds 90"
assert_success
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"global-stop-timeout-seconds\"'"
assert_success
assert_output "90"
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"computed-stop-timeout-seconds\"'"
assert_success
assert_output "90"
run /bin/bash -c "dokku ps:set $TEST_APP stop-timeout-seconds 45"
assert_success
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"stop-timeout-seconds\"'"
assert_success
assert_output "45"
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"global-stop-timeout-seconds\"'"
assert_success
assert_output "90"
run /bin/bash -c "dokku ps:report $TEST_APP --format json | jq -r '.\"computed-stop-timeout-seconds\"'"
assert_success
assert_output "45"
run /bin/bash -c "dokku ps:set $TEST_APP stop-timeout-seconds"
assert_success
run /bin/bash -c "dokku ps:set --global stop-timeout-seconds"
assert_success
}
@test "(ps:restart-policy) default policy" { @test "(ps:restart-policy) default policy" {
run /bin/bash -c "dokku --quiet ps:report $TEST_APP --ps-restart-policy" run /bin/bash -c "dokku ps:report $TEST_APP --ps-restart-policy"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "on-failure:10" assert_output "on-failure:10"
@@ -182,7 +231,7 @@ web
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku --quiet ps:report $TEST_APP --ps-restart-policy" run /bin/bash -c "dokku ps:report $TEST_APP --ps-restart-policy"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "$policy" assert_output "$policy"
@@ -196,7 +245,7 @@ web
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku --quiet ps:report $TEST_APP --ps-restart-policy" run /bin/bash -c "dokku ps:report $TEST_APP --ps-restart-policy"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "$test_restart_policy" assert_output "$test_restart_policy"

View File

@@ -133,6 +133,115 @@ teardown() {
create_app create_app
} }
@test "(registry:report) image-repo raw vs computed vs global" {
run /bin/bash -c "dokku registry:set --global image-repo-template"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-image-repo\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-global-image-repo-template\"'"
assert_success
assert_output ""
# When neither per-app image-repo nor a global image-repo-template are set,
# reportComputedImageRepo falls back to common.GetAppImageRepo which returns
# the default dokku/<app> image name.
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-image-repo\"'"
assert_success
assert_output "dokku/$TEST_APP"
run /bin/bash -c "dokku registry:set --global image-repo-template 'dokku/{{ APP }}'"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-global-image-repo-template\"'"
assert_success
assert_output 'dokku/{{ APP }}'
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-image-repo\"'"
assert_success
assert_output "dokku/$TEST_APP"
run /bin/bash -c "dokku registry:set $TEST_APP image-repo my/$TEST_APP"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-image-repo\"'"
assert_success
assert_output "my/$TEST_APP"
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-image-repo\"'"
assert_success
assert_output "my/$TEST_APP"
run /bin/bash -c "dokku registry:set $TEST_APP image-repo"
assert_success
run /bin/bash -c "dokku registry:set --global image-repo-template"
assert_success
}
@test "(registry:report) push-on-release raw vs computed vs global" {
run /bin/bash -c "dokku registry:set --global push-on-release"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-push-on-release\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-global-push-on-release\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-push-on-release\"'"
assert_success
assert_output "false"
run /bin/bash -c "dokku registry:set --global push-on-release true"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-global-push-on-release\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-push-on-release\"'"
assert_success
assert_output "true"
run /bin/bash -c "dokku registry:set $TEST_APP push-on-release false"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-push-on-release\"'"
assert_success
assert_output "false"
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-computed-push-on-release\"'"
assert_success
assert_output "false"
run /bin/bash -c "dokku registry:set $TEST_APP push-on-release"
assert_success
run /bin/bash -c "dokku registry:set --global push-on-release"
assert_success
}
@test "(registry:report) push-extra-tags raw" {
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-push-extra-tags\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku registry:set $TEST_APP push-extra-tags release,stable"
assert_success
run /bin/bash -c "dokku registry:report $TEST_APP --format json | jq -r '.\"registry-push-extra-tags\"'"
assert_success
assert_output "release,stable"
run /bin/bash -c "dokku registry:set $TEST_APP push-extra-tags"
assert_success
}
@test "(registry) registry:set server" { @test "(registry) registry:set server" {
run /bin/bash -c "dokku registry:set --global server ghcr.io" run /bin/bash -c "dokku registry:set --global server ghcr.io"
echo "output: $output" echo "output: $output"

View File

@@ -10,17 +10,29 @@ teardown() {
global_teardown global_teardown
} }
@test "(scheduler-docker-local:report) --global --scheduler-docker-local-global-init-process" { @test "(scheduler-docker-local:report) --global raw and computed keys" {
run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-global-init-process" run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-global-init-process"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-computed-init-process"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "true" assert_output "true"
run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-global-parallel-schedule-count" run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-global-parallel-schedule-count"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:report --global --scheduler-docker-local-computed-parallel-schedule-count"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "1" assert_output "1"
} }
@@ -46,7 +58,7 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "1" assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --scheduler-docker-local-init-process" run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --scheduler-docker-local-init-process"
echo "output: $output" echo "output: $output"
@@ -64,7 +76,7 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
assert_output "true" assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --scheduler-docker-local-invalid-flag" run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --scheduler-docker-local-invalid-flag"
echo "output: $output" echo "output: $output"
@@ -99,7 +111,7 @@ teardown() {
run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"global-init-process\"'" run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"global-init-process\"'"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "true" assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"parallel-schedule-count\"'" run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"parallel-schedule-count\"'"
echo "output: $output" echo "output: $output"
@@ -114,7 +126,7 @@ teardown() {
run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"global-parallel-schedule-count\"'" run /bin/bash -c "dokku scheduler-docker-local:report $TEST_APP --format json | jq -r '.\"global-parallel-schedule-count\"'"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "1" assert_output ""
run /bin/bash -c "dokku scheduler-docker-local:set $TEST_APP init-process false" run /bin/bash -c "dokku scheduler-docker-local:set $TEST_APP init-process false"
echo "output: $output" echo "output: $output"

97
tests/unit/scheduler.bats Normal file
View File

@@ -0,0 +1,97 @@
#!/usr/bin/env bats
load test_helper
setup() {
global_setup
create_app
}
teardown() {
dokku scheduler:set --global selected >/dev/null 2>&1 || true
destroy_app
global_teardown
}
@test "(scheduler) scheduler:help" {
run /bin/bash -c "dokku scheduler"
echo "output: $output"
echo "status: $status"
assert_output_contains "Manage scheduler settings"
help_output="$output"
run /bin/bash -c "dokku scheduler:help"
echo "output: $output"
echo "status: $status"
assert_output_contains "Manage scheduler settings"
assert_output "$help_output"
}
@test "(scheduler:report) selected raw vs computed vs global" {
run /bin/bash -c "dokku scheduler:set --global selected"
assert_success
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-selected\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-global-selected\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-computed-selected\"'"
assert_success
assert_output "docker-local"
run /bin/bash -c "dokku scheduler:set --global selected null"
assert_success
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-global-selected\"'"
assert_success
assert_output "null"
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-computed-selected\"'"
assert_success
assert_output "null"
run /bin/bash -c "dokku scheduler:set $TEST_APP selected docker-local"
assert_success
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-selected\"'"
assert_success
assert_output "docker-local"
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-global-selected\"'"
assert_success
assert_output "null"
run /bin/bash -c "dokku scheduler:report $TEST_APP --format json | jq -r '.\"scheduler-computed-selected\"'"
assert_success
assert_output "docker-local"
run /bin/bash -c "dokku scheduler:set $TEST_APP selected"
assert_success
run /bin/bash -c "dokku scheduler:set --global selected"
assert_success
}
@test "(scheduler:report) --global --format json" {
run /bin/bash -c "dokku scheduler:set --global selected"
assert_success
run /bin/bash -c "dokku scheduler:report --global --format json | jq -e ."
assert_success
run /bin/bash -c "dokku scheduler:report --global --format json | jq -r '.\"scheduler-global-selected\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku scheduler:report --global --format json | jq -r '.\"scheduler-computed-selected\"'"
assert_success
assert_output "docker-local"
run /bin/bash -c "dokku scheduler:report --global --format json | jq -r 'has(\"scheduler-selected\")'"
assert_success
assert_output "false"
}

View File

@@ -184,6 +184,38 @@ teardown() {
assert_output "mount_volume:/mount" assert_output "mount_volume:/mount"
} }
@test "(storage:report) build/deploy/run mounts raw" {
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-build-mounts\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-deploy-mounts\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-run-mounts\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku storage:mount $TEST_APP /tmp/storage-mount:/mount"
assert_success
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-deploy-mounts\"'"
assert_success
assert_output "-v /tmp/storage-mount:/mount"
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-run-mounts\"'"
assert_success
assert_output "-v /tmp/storage-mount:/mount"
run /bin/bash -c "dokku storage:report $TEST_APP --format json | jq -r '.\"storage-build-mounts\"'"
assert_success
assert_output ""
run /bin/bash -c "dokku storage:unmount $TEST_APP /tmp/storage-mount:/mount"
assert_success
}
@test "(storage) storage:create / storage:list-entries / storage:destroy" { @test "(storage) storage:create / storage:list-entries / storage:destroy" {
run /bin/bash -c "dokku storage:create rdmtest-entry" run /bin/bash -c "dokku storage:create rdmtest-entry"
echo "output: $output" echo "output: $output"

View File

@@ -23,13 +23,31 @@ teardown() {
dokku nginx:start dokku nginx:start
} }
@test "(traefik:report) --global --traefik-log-level" { @test "(traefik:report) --global global vs computed log-level" {
run /bin/bash -c "dokku traefik:report --global --traefik-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku traefik:report --global --traefik-computed-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "ERROR"
run /bin/bash -c "dokku traefik:set --global log-level DEBUG" run /bin/bash -c "dokku traefik:set --global log-level DEBUG"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report --global --traefik-log-level" run /bin/bash -c "dokku traefik:report --global --traefik-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "DEBUG"
run /bin/bash -c "dokku traefik:report --global --traefik-computed-log-level"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -39,6 +57,44 @@ teardown() {
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report --global --traefik-global-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku traefik:report --global --traefik-computed-log-level"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "ERROR"
}
@test "(traefik:report) --global raw and computed keys in --format json" {
run /bin/bash -c "dokku traefik:report --global --format json | jq -r '.\"global-api-vhost\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku traefik:report --global --format json | jq -r '.\"computed-api-vhost\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "traefik.dokku.me"
run /bin/bash -c "dokku traefik:report --global --format json | jq -r '.\"global-dashboard-enabled\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "dokku traefik:report --global --format json | jq -r '.\"computed-dashboard-enabled\"'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "false"
} }
@test "(traefik) global-only keys" { @test "(traefik) global-only keys" {
@@ -244,12 +300,12 @@ teardown() {
assert_success assert_success
assert_output "5000" assert_output "5000"
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output_not_exists assert_output_not_exists
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-detected" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_output "http:80:5000 https:443:5000" assert_output "http:80:5000 https:443:5000"
@@ -409,7 +465,7 @@ teardown() {
} }
@test "(traefik) [dns-01] challenge-mode property" { @test "(traefik) [dns-01] challenge-mode property" {
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-challenge-mode" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-challenge-mode"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -420,7 +476,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-challenge-mode" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-challenge-mode"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -431,7 +487,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-challenge-mode" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-challenge-mode"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -439,7 +495,7 @@ teardown() {
} }
@test "(traefik) [dns-01] dns-provider property" { @test "(traefik) [dns-01] dns-provider property" {
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-dns-provider" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-dns-provider"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -450,7 +506,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-dns-provider" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-dns-provider"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -461,7 +517,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-dns-provider" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-dns-provider"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -594,7 +650,7 @@ teardown() {
} }
@test "(traefik) api-entry-point property" { @test "(traefik) api-entry-point property" {
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-api-entry-point" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-api-entry-point"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -605,7 +661,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-api-entry-point" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-api-entry-point"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -616,7 +672,7 @@ teardown() {
echo "status: $status" echo "status: $status"
assert_success assert_success
run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-api-entry-point" run /bin/bash -c "dokku traefik:report $TEST_APP --traefik-computed-api-entry-point"
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success