diff --git a/.codacy.yml b/.codacy.yml
deleted file mode 100644
index bd3ed9e8bbe..00000000000
--- a/.codacy.yml
+++ /dev/null
@@ -1,10 +0,0 @@
----
-engines:
- duplication:
- exclude_paths:
- - "*"
-exclude_paths:
- - vendor/**/*
- - tests/**/*
- - "**_test.go"
- - contrib/*
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 9f09bd79f66..209e713df36 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -2,13 +2,16 @@ FROM dokku/dokku:latest
RUN apt-get update
RUN apt-get install --no-install-recommends -y build-essential file nano && \
- apt-get install --no-install-recommends -y help2man shellcheck uuid-runtime wget xmlstarlet && \
+ apt-get install --no-install-recommends -y software-properties-common help2man shellcheck uuid-runtime wget xmlstarlet && \
apt-get clean autoclean && \
apt-get autoremove --yes && \
rm -rf /var/lib/apt/lists/*
-RUN wget https://dl.google.com/go/go1.16.10.linux-amd64.tar.gz && \
- tar -xvf go1.16.10.linux-amd64.tar.gz && \
+ARG TARGETARCH
+COPY common.mk common.mk
+RUN GOLANG_VERSION=$(grep BUILD_IMAGE common.mk | cut -d' ' -f3 | cut -d':' -f2) && \
+ wget https://dl.google.com/go/go${GOLANG_VERSION}.linux-${TARGETARCH}.tar.gz && \
+ tar -xvf go${GOLANG_VERSION}.linux-${TARGETARCH}.tar.gz && \
mv go /usr/local
RUN GOROOT=/usr/local/go /usr/local/go/bin/go install golang.org/x/tools/gopls@latest 2>&1
diff --git a/.devcontainer/bin/bump-modules b/.devcontainer/bin/bump-modules
new file mode 100755
index 00000000000..88e815bd1a8
--- /dev/null
+++ b/.devcontainer/bin/bump-modules
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+export GOWORK=off
+pushd /root/go/src/github.com/dokku/dokku/plugins/ >/dev/null || exit 1
+for plugin in *; do
+ if [[ ! -f "/root/go/src/github.com/dokku/dokku/plugins/$plugin/go.mod" ]]; then continue; fi
+ echo "$plugin"
+ pushd /root/go/src/github.com/dokku/dokku/plugins/$plugin || exit 1
+ echo "running go mod tidy for $plugin"
+ if ! go mod tidy; then
+ echo "go mod tidy failed for $plugin"
+ exit 1
+ fi
+ echo "running go mod download for $plugin"
+ if ! go mod download; then
+ echo "go mod download failed for $plugin"
+ exit 1
+ fi
+ popd >/dev/null || exit 1
+done
+popd >/dev/null || exit 1
diff --git a/.devcontainer/bin/deploy-test-app b/.devcontainer/bin/deploy-test-app
new file mode 100755
index 00000000000..2a1b2ab79d5
--- /dev/null
+++ b/.devcontainer/bin/deploy-test-app
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+main() {
+ declare APP="${1:-test}"
+
+ if ! dokku apps:exists $APP; then
+ dokku apps:create $APP
+ fi
+
+ dokku builder-herokuish:set $APP allowed true
+ dokku git:sync --build $APP https://github.com/dokku/smoke-test-app.git
+}
+
+main "$@"
diff --git a/.devcontainer/bin/setup-dev-env b/.devcontainer/bin/setup-dev-env
new file mode 100755
index 00000000000..066ac45d36b
--- /dev/null
+++ b/.devcontainer/bin/setup-dev-env
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+install-go-devtools() {
+ go install github.com/go-delve/delve/cmd/dlv@latest
+ go install honnef.co/go/tools/cmd/staticcheck@latest
+ go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
+}
+
+setup-ci() {
+ local dokku_root="/root/go/src/github.com/dokku/dokku"
+ pushd "$plugin_root" >/dev/null || true
+ make ci-dependencies setup-deploy-tests
+ popd >/dev/null || true
+}
+
+main() {
+ install-go-devtools
+ setup-ci
+}
+
+main "$@"
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index b1112f0bee3..f0a2a782567 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -4,22 +4,37 @@
"context": ".."
},
"containerEnv": {
+ "DOKKU_HOSTNAME": "dokku.me",
"DOKKU_HOST_ROOT": "${localWorkspaceFolder}/tmp/data/home/dokku",
+ "DOKKU_LIB_HOST_ROOT": "${localWorkspaceFolder}/tmp/data/var/lib/dokku",
"GO_ROOT_MOUNT": "${localWorkspaceFolder}:/go/src/github.com/dokku/dokku"
},
- "extensions": [
- "golang.go",
- "mads-hartmann.bash-ide-vscode",
- "ms-vscode.makefile-tools"
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "golang.go",
+ "mads-hartmann.bash-ide-vscode",
+ "ms-vscode.makefile-tools",
+ "sleistner.vscode-fileutils",
+ "ms-azuretools.vscode-docker"
+ ]
+ }
+ },
+ "initializeCommand": [
+ "mkdir",
+ "-p",
+ "tmp/data"
],
- "initializeCommand": ["mkdir", "-p", "tmp/data"],
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind",
"source=${localWorkspaceFolder}/tmp/data/,target=/mnt/dokku/,type=bind"
],
"overrideCommand": false,
- "postCreateCommand": "make setup-deploy-tests",
- "runArgs": ["--init"],
+ "postCreateCommand": "setup-dev-env",
+ "postStartCommand": "printenv > .vscode/devcontainer.env",
+ "runArgs": [
+ "--init"
+ ],
"workspaceFolder": "/root/go/src/github.com/dokku/dokku",
"workspaceMount": "type=bind,source=${localWorkspaceFolder},target=/root/go/src/github.com/dokku/dokku,consistency=cached"
-}
+}
\ No newline at end of file
diff --git a/.dockerignore b/.dockerignore
index a06e41fd677..b3b351f2067 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -6,8 +6,13 @@ contrib
build
docs
tests
-!build/dokku.deb
+!build/package/*
+!docs/_build/entrypoint
+!docs/_build/hooks.py
+!docs/_build/requirements.txt
!tests/dhparam.pem
!contrib/bash-completion
+!contrib/dependencies.json
!contrib/docker
+!contrib/update-deb-dependencies
vendor
diff --git a/.editorconfig b/.editorconfig
index b4d8d412f90..dddd5ce123f 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,3 +19,6 @@ indent_size = 4
insert_final_newline = true
indent_style = tab
indent_size = 4
+
+[*.md]
+tab_width = 4
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
new file mode 100644
index 00000000000..d4029556501
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -0,0 +1,67 @@
+---
+name: Bug Report
+description: File a bug report
+labels: ["needs: investigation"]
+type: Bug
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Consider [sponsoring Dokku](https://github.com/sponsors/dokku). Sponsorship goes directly to supporting activities such as fixing bugs and general maintenance.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description of problem
+ description: What happened? What did you expect to happen?
+ validations:
+ required: true
+ - type: textarea
+ id: steps
+ attributes:
+ label: Steps to reproduce
+ description: What are the steps that we need to follow to reproduce this issue?
+ validations:
+ required: true
+ - type: textarea
+ id: report-output
+ attributes:
+ label: dokku report $APP_NAME
+ description: Please paste the output of the command `dokku report $APP_NAME`, where `$APP_NAME` is the name of your app
+ validations:
+ required: true
+ - type: textarea
+ id: additional-output
+ attributes:
+ label: Additional information
+ description: |
+ This information is useful for debugging app issues:
+
+ - Container Inspect Output (if applicable) via `dokku ps:inspect APP_NAME`
+ - The nginx configuration (if applicable) via `dokku nginx:show-config APP_NAME`
+ - Link to the exact repository being deployed (if possible/applicable)
+
+ If a deploy is failing or behaving unexpectedly:
+
+ - Application name
+ - The type of application being deployed (node, php, python, ruby, etc.)
+ - If using buildpacks, which custom buildpacks are in use
+ - If using a Dockerfile, the contents of that file
+ - If it exists, the contents of your Procfile.
+ validations:
+ required: false
+ - type: textarea
+ id: logs
+ attributes:
+ label: "Output of failing commands after running: dokku trace:off"
+ render: shell
+ validations:
+ required: false
+ - type: textarea
+ id: trace-logs
+ attributes:
+ label: "Output of failing commands after running: dokku trace:on"
+ description: |
+ **BEWARE**: `dokku trace:on` will cause some commands to print environment variables, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXX
+ render: shell
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/buildpack_issue.yaml b/.github/ISSUE_TEMPLATE/buildpack_issue.yaml
new file mode 100644
index 00000000000..4dbb47491f1
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/buildpack_issue.yaml
@@ -0,0 +1,71 @@
+---
+name: Buildpack Issue
+description: Is your deploy failing while building your application using buildpacks? Check this out.
+labels: ["upstream: buildpacks"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ If your build is stuck downloading something, compiling a file, or seems to always fail around the same area, Github Issues is not a great place to debug. This is because these sorts of issues tend to take a lot of back and forth to figure out, and the code for buildpacks is not generally maintained by the Dokku project.
+
+
+ Debugging tips:
+
+ - If you see text that says `Killed` in your output, attempt to increase free memory by using a larger server or [add swap memory](https://dokku.com/docs/getting-started/troubleshooting/#build-fails-with-killed-message).
+ - Turn on buildpack trace mode via `dokku config:set $APP_NAME BUILDPACK_XTRACE=1` and retry your deploy. Not all buildpacks support this, but many will output extra debugging information.
+ - Your hosting provider may have issues accessing AWS S3. Verify a slow/stalled download works by directly curling the file from your host.
+ - Many buildpacks allow downloading a file from an alternative location specified via environment variable.
+ - [Increase curl timeouts](https://dokku.com/docs/getting-started/troubleshooting/#deployment-fails-because-of-slow-internet-connection-messages-s) if you see gzip download issues.
+ - If using multi-buildpack support but a buildpack is failing to apply, ensure you have any files necessary for the `bin/detect` script of the buildpack to `exit 0`. Selected buildpacks must still pass the detection phase in order to be used.
+
+
+ If you are still having issues, file a ticket here and then further discussing the ticket in one of our [Monitored Support Channels](https://dokku.com/docs/getting-started/where-to-get-help/#monitored-locations) (Discord, Github Discussions, Slack). Your filed ticket may be closed or locked, but any subsequent discovery will be posted to the ticket for posterity.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description of problem
+ description: What happened? What did you expect to happen?
+ validations:
+ required: true
+ - type: textarea
+ id: report-output
+ attributes:
+ label: dokku report $APP_NAME
+ description: Please paste the output of the command `dokku report $APP_NAME`, where `$APP_NAME` is the name of your app.
+ validations:
+ required: true
+ - type: textarea
+ id: additional-output
+ attributes:
+ label: Additional information
+ description: |
+ This information is useful for debugging app issues:
+
+ - Container Inspect Output (if applicable) via `dokku ps:inspect APP_NAME`
+ - The nginx configuration (if applicable) via `dokku nginx:show-config APP_NAME`
+ - Link to the exact repository being deployed (if possible/applicable)
+
+ If a deploy is failing or behaving unexpectedly:
+
+ - Application name
+ - The type of application being deployed (node, php, python, ruby, etc.)
+ - If using buildpacks, which custom buildpacks are in use
+ - If it exists, the contents of your Procfile.
+ validations:
+ required: true
+ - type: textarea
+ id: logs
+ attributes:
+ label: "Output of failing deploy after running: dokku trace:off"
+ render: shell
+ validations:
+ required: true
+ - type: textarea
+ id: trace-logs
+ attributes:
+ label: "Output of failing deploy after running: dokku trace:on"
+ description: |
+ **BEWARE**: `dokku trace:on` will cause some commands to print environment variables, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXX
+ render: shell
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml
new file mode 100644
index 00000000000..f7cfaeafca2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation.yaml
@@ -0,0 +1,26 @@
+---
+name: Documentation Issue
+description: Let us know that something in the docs needs clarification
+labels: ["needs: investigation", "type: documentation"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Consider [sponsoring Dokku](https://github.com/sponsors/dokku). Sponsorship goes directly to supporting activities such as fixing bugs and general maintenance.
+ - type: input
+ id: docs-link
+ attributes:
+ label: Link to the documentation page
+ description: Which docs page is impacted?
+ - type: textarea
+ id: description
+ attributes:
+ label: Documentation problem
+ description: Describe what you think is incorrect, not well documented, or missing from the documentation
+ validations:
+ required: true
+ - type: textarea
+ id: report-output
+ attributes:
+ label: dokku report
+ description: Please paste the output of the command `dokku report` so we know what systems any issue might apply to
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
new file mode 100644
index 00000000000..3bf12ccde56
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -0,0 +1,18 @@
+---
+name: Feature Request
+description: Have an idea for a new feature? Ask away!
+labels: ["needs: plan", "type: enhancement"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ While pull requests are always welcome, feel free to fill this out with an idea of what you would like to happen and we can discuss if and how it should be implemented in Dokku.
+
+ Consider [sponsoring Dokku](https://github.com/sponsors/dokku). Sponsorship goes directly to supporting activities such as implementing new features and upgrading existing functionality.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description of feature
+ description: When you perform what command or action, what do you think should happen?
+ validations:
+ required: true
diff --git a/.github/actions/build-image/action.yml b/.github/actions/build-image/action.yml
new file mode 100644
index 00000000000..2a9de383f59
--- /dev/null
+++ b/.github/actions/build-image/action.yml
@@ -0,0 +1,37 @@
+---
+name: 'build-image'
+
+description: 'builds a dokku docker image'
+
+inputs:
+ architecture:
+ description: 'platform to build'
+ required: true
+ default: 'linux/amd64'
+
+runs:
+ using: "composite"
+ steps:
+ - name: download packages
+ uses: actions/download-artifact@v8
+ with:
+ name: build
+ path: build
+
+ - name: set up docker buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v4
+
+ - name: build docker image
+ shell: bash
+ run: |
+ docker buildx build \
+ --load \
+ --progress plain \
+ --tag "dokku/dokku:latest" \
+ .
+
+ - name: smoke test image
+ shell: bash
+ run: |
+ make test-image-healthcheck IMAGE_TAG=dokku/dokku:latest
diff --git a/.github/commands/bump-azure b/.github/commands/bump-azure
index a40c381b0f4..fbb0b27b5af 100755
--- a/.github/commands/bump-azure
+++ b/.github/commands/bump-azure
@@ -18,7 +18,11 @@ main() {
cd tmp
- $GH_FOLDER/bin/gh auth login --with-token <<<"$BOT_GITHUB_API_TOKEN"
+ if [[ -n "$BOT_GITHUB_API_TOKEN" ]]; then
+ $GH_FOLDER/bin/gh auth login --with-token <<<"$BOT_GITHUB_API_TOKEN"
+ else
+ echo "BOT_GITHUB_API_TOKEN is not set, skipping gh auth login"
+ fi
echo "=====> Cloning quickstart templates"
rm -rf azure-quickstart-templates >/dev/null
@@ -35,15 +39,29 @@ main() {
contents="$(jq --arg VERSION "$VERSION" '.parameters.dokkuVersion.defaultValue = $VERSION' application-workloads/dokku/dokku-vm/azuredeploy.json)"
echo "${contents}" >application-workloads/dokku/dokku-vm/azuredeploy.json
+ # update the version in main.bicep
+ # the line being updated looks like this:
+ # param dokkuVersion string = '0.28.4'
+ # we need to update the value of dokkuVersion to the new version
+ sed -i "s/param dokkuVersion string = '[^']*'/param dokkuVersion string = '$VERSION'/" application-workloads/dokku/dokku-vm/main.bicep
+
echo "=====> Updating remote repository"
git add application-workloads/dokku/dokku-vm
git checkout -b dokku-$VERSION
git commit -m "Update dokku-vm dokku version to $VERSION"
- git remote set-url origin "https://$BOT_GITHUB_USERNAME:$BOT_GITHUB_API_TOKEN@github.com/dokku/azure-quickstart-templates.git"
- git push -f origin dokku-$VERSION
+ if [[ -z "$BOT_GITHUB_API_TOKEN" ]] || [[ -z "$BOT_GITHUB_USERNAME" ]]; then
+ echo "BOT_GITHUB_API_TOKEN or BOT_GITHUB_USERNAME is not set, skipping git remote set-url"
+ else
+ git remote set-url origin "https://$BOT_GITHUB_USERNAME:$BOT_GITHUB_API_TOKEN@github.com/dokku/azure-quickstart-templates.git"
+ git push -f origin dokku-$VERSION
+ fi
- echo "=====> Creating upstream pull request"
- ../$GH_FOLDER/bin/gh pr create --head dokku:dokku-$VERSION --repo Azure/azure-quickstart-templates --title "Update dokku-vm dokku version to $VERSION" --body ''
+ if [[ -z "$BOT_GITHUB_API_TOKEN" ]] || [[ -z "$BOT_GITHUB_USERNAME" ]]; then
+ echo "BOT_GITHUB_API_TOKEN or BOT_GITHUB_USERNAME is not set, skipping gh pr create"
+ else
+ echo "=====> Creating upstream pull request"
+ ../$GH_FOLDER/bin/gh pr create --head dokku:dokku-$VERSION --repo Azure/azure-quickstart-templates --title "Update dokku-vm dokku version to $VERSION" --body ''
+ fi
popd &>/dev/null
}
diff --git a/.github/commands/ci-setup b/.github/commands/ci-setup
index 43c3ac6f6d8..a6e0cd77c17 100755
--- a/.github/commands/ci-setup
+++ b/.github/commands/ci-setup
@@ -1,20 +1,24 @@
#!/usr/bin/env bash
set -eo pipefail
-set -x
+
+DOKKU_DOMAIN=${DOKKU_DOMAIN:="dokku.me"}
echo "=====> set hostname"
hostname
internal_ip="$(ifconfig eth0 | grep 'inet ' | awk '{print $2}')"
-sudo hostname "dokku.me"
-echo "dokku.me" | sudo tee /etc/hostname
+echo "CI_SERVER_IP=${internal_ip}" >>"$GITHUB_ENV"
+sudo hostname "$DOKKU_DOMAIN"
+echo "$DOKKU_DOMAIN" | sudo tee /etc/hostname
hostname
sudo cat /etc/hostname
-echo "=====> resolve dokku.me"
+echo "=====> resolve $DOKKU_DOMAIN"
sudo apt -qq -y --no-install-recommends install net-tools
-# dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to eth0
-ifconfig
-sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth0
+if [[ "$DOKKU_DOMAIN" == "dokku.me" ]]; then
+ # dokku.me now resolves to 10.0.0.2. add 10.0.0.2/24 to eth0
+ ifconfig
+ sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth0
+fi
echo "=====> install ci-dependencies"
make ci-dependencies
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index a8f9702ae0b..fa2343c691a 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,107 +1,449 @@
---
version: 2
updates:
+ - package-ecosystem: pip
+ directory: "/docs/_build"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/app-json"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/apps"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/builder"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/buildpacks"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/common"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/config"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/cron"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/docker-options"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/logs"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/network"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/nginx-vhosts"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/ports"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/proxy"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/ps"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/registry"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/repo"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/resource"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/scheduler-docker-local"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/scheduler-k3s"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: gomod
+ directory: "/plugins/scheduler"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 2
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/plugins/caddy-vhosts"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/plugins/haproxy-vhosts"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/plugins/logs"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/plugins/openresty-vhosts"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/plugins/traefik-vhosts"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
- package-ecosystem: bundler
directory: "/tests/apps/ruby"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: bundler
directory: "/tests/apps/multi"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/checks-root"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/config"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
- directory: "/tests/apps/dockerfile-dokku-scale"
+ directory: "/tests/apps/dockerfile-app-json-formations"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/dockerfile-noexpose"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/dockerfile-procfile-bad"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/dockerfile-procfile"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/dockerfile"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/gitsubmodules"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: gomod
directory: "/tests/apps/gogrpc"
schedule:
interval: daily
open-pull-requests-limit: 10
- ignore:
- - dependency-name: google.golang.org/grpc
- versions:
- - "> 1.29.1"
+ labels:
+ - "type: tests"
- package-ecosystem: pip
directory: "/tests/apps/multi"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: maven
directory: "/tests/apps/java"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: npm
+ directory: "/tests/apps/multi"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/nodejs-express"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/nodejs-worker"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/nodejs-express-noappjson"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: npm
directory: "/tests/apps/nodejs-express-noprocfile"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: composer
directory: "/tests/apps/php"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
- package-ecosystem: pip
directory: "/tests/apps/python-flask"
schedule:
interval: daily
open-pull-requests-limit: 10
- - package-ecosystem: npm
- directory: "/tests/apps/.websocket.disabled"
+ labels:
+ - "type: tests"
+ - package-ecosystem: github-actions
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ ignore:
+ - dependency-name: "*"
+ update-types:
+ - "version-update:semver-minor"
+ - "version-update:semver-patch"
+ - package-ecosystem: "docker"
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-noexpose"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-procfile"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-entrypoint"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-procfile-bad"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/go-fail-predeploy"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/zombies-dockerfile-no-tini"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-release"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: pip
+ directory: "/tests/apps/dockerfile-release"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/dockerfile-app-json-formations"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/gogrpc"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/zombies-dockerfile-tini"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/tests/apps/go-fail-postdeploy"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: tests"
+ - package-ecosystem: "docker"
+ directory: "/docs/_build"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
+ - package-ecosystem: "docker"
+ directory: "/.devcontainer"
schedule:
interval: daily
open-pull-requests-limit: 10
+ labels:
+ - "type: dependencies"
diff --git a/.github/linters/.markdown-lint.yml b/.github/linters/.markdown-lint.yml
index 2b7650bb297..e16596c0a06 100644
--- a/.github/linters/.markdown-lint.yml
+++ b/.github/linters/.markdown-lint.yml
@@ -8,3 +8,30 @@ MD013: false
# Inline HTML
# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md033
MD033: false
+
+# List indentation
+# 2 spaces breaks list formatting in mkdocs
+# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md007
+MD007:
+ indent: 4
+
+# Fenced code blocks should have a language specified
+# We use a second, un-languaged code block to denote the output
+# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md040
+MD040: false
+
+# Blank line inside blockquote
+# This is typically done when a section has a "New as of" or "Warning" in addition to a note
+# May wish to take advantage of github-style admonitions
+# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md028
+MD028: false
+
+# No duplicate headers
+# HISTORY.md has a ton of these
+# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md024
+MD024: false
+
+# First line h1
+# The issue template doesn't have one
+# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md041
+MD041: false
diff --git a/.github/linters/.yamllint.yml b/.github/linters/.yamllint.yml
index 75da2b7021e..fe6352dcc1f 100644
--- a/.github/linters/.yamllint.yml
+++ b/.github/linters/.yamllint.yml
@@ -3,3 +3,6 @@ extends: default
rules:
line-length: disable
+
+ignore:
+ - plugins/scheduler-k3s/templates/*
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d7d59cdbc72..44720039c1f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,49 +10,120 @@ on:
branches:
- 'master'
+concurrency:
+ group: build-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+env:
+ INSTALL_DOCKER_REPO: 1
+
jobs:
+ check-commit:
+ runs-on: ubuntu-24.04
+ outputs:
+ skip: ${{ steps.check-commit.outputs.skip }}
+
+ steps:
+ - uses: actions/checkout@v7
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+
+ - name: check if message contain keywords ace scopeid
+ id: check-commit
+ run: |
+ # checking for "docs" or "[ci skip]" messages
+ message=$(git log -1 --pretty=format:'%s')
+ if [[ "$message" =~ "\[(ci skip)\]" ]]; then
+ echo "Skipping tests due to [ci skip] message"
+ echo "skip=true" >> $GITHUB_OUTPUT
+ elif [[ "$message" =~ "^docs:" ]]; then
+ echo "Skipping tests due to "docs:" prefix on message"
+ echo "skip=true" >> $GITHUB_OUTPUT
+ fi
+
build:
name: build
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
+ needs: check-commit
+ if: ${{ needs.check-commit.outputs.skip != 'true' }}
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
strategy:
fail-fast: true
+ timeout-minutes: 45
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v7
+
+ - name: set up qemu
+ uses: docker/setup-qemu-action@v4
+
+ - name: set up docker buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v4
- name: build package
run: ./tests/ci/setup.sh build
+ env:
+ SKIP_IMAGE_BUILD: true
- name: set matrix for build
id: set-matrix
run: |
- json=$(python .github/commands/matrix)
+ json=$(python3 .github/commands/matrix)
echo $json
- echo "::set-output name=matrix::$(echo "$json")"
+ echo "matrix=$json" >> $GITHUB_OUTPUT
- name: upload packages
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v7
with:
name: build
path: build
+ build-image-amd64:
+ name: build-image.linux/amd64
+ needs: build
+ runs-on: ubuntu-24.04
+ timeout-minutes: 20
+
+ steps:
+ - uses: actions/checkout@v7
+
+ - name: build-image
+ uses: ./.github/actions/build-image
+ with:
+ architecture: linux/amd64
+
+ build-image-arm64:
+ name: build-image.linux/arm64
+ needs: build
+ runs-on: ubuntu-24.04-arm
+ timeout-minutes: 20
+
+ steps:
+ - uses: actions/checkout@v7
+
+ - name: build-image
+ uses: ./.github/actions/build-image
+ with:
+ architecture: linux/arm64
+
unit-tests:
name: unit.${{ matrix.index }}
needs: build
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix: ${{fromJson(needs.build.outputs.matrix)}}
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v7
- name: download packages
- uses: actions/download-artifact@v1
+ uses: actions/download-artifact@v8
with:
name: build
+ path: build
- name: ci-setup
run: ./.github/commands/ci-setup
@@ -61,7 +132,7 @@ jobs:
# uses: luchihoratiu/debug-via-ssh@main
# with:
# NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
- # SSH_PASS: ${{ secrets.SSH_PASS }}
+ # SSH_PASS: ${{ secrets.NGROK_SSH_PASS }}
- name: run ci
timeout-minutes: 30
@@ -72,7 +143,7 @@ jobs:
SYNC_GITHUB_PASSWORD: ${{ secrets.SYNC_GITHUB_PASSWORD }}
SYNC_GITHUB_USERNAME: ${{ secrets.SYNC_GITHUB_USERNAME }}
- - uses: actions/upload-artifact@v2
+ - uses: actions/upload-artifact@v7
with:
name: test-results-${{ matrix.index }}
path: test-results
@@ -80,32 +151,37 @@ jobs:
docker-deploy-tests:
name: docker
needs: build
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v7
- name: download packages
- uses: actions/download-artifact@v1
+ uses: actions/download-artifact@v8
with:
name: build
+ path: build
- name: ci-setup
run: ./.github/commands/ci-setup
+ - name: docker-container-setup
+ run: |
+ ./tests/ci/setup.sh docker
+
- name: test docker deploys
shell: bash
timeout-minutes: 20
run: |
- ./tests/ci/setup.sh docker
+ docker exec dokku bash -c "cat /etc/sudoers.d/dokku-nginx"
DOKKU_SSH_PORT=3022 sudo -E make -e test-ci-docker
go-tests:
name: go.${{ matrix.index }}
needs: build
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
@@ -114,12 +190,13 @@ jobs:
GITHUB_NODE_INDEX: ${{ matrix.index }}
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v7
- name: download packages
- uses: actions/download-artifact@v1
+ uses: actions/download-artifact@v8
with:
name: build
+ path: build
- name: ci-setup
run: ./.github/commands/ci-setup
@@ -137,7 +214,7 @@ jobs:
2) sudo -E make -e deploy-test-multi ;;
3) sudo -E make -e deploy-test-go-fail-predeploy deploy-test-go-fail-postdeploy ;;
esac
- - uses: actions/upload-artifact@v2
+ - uses: actions/upload-artifact@v7
with:
name: coverage.${{ matrix.index }}
path: test-results/coverage
@@ -145,20 +222,22 @@ jobs:
publish-test-results:
name: publish-test-results
needs: unit-tests
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
+ permissions:
+ checks: write
# the build-and-test job might be skipped, we don't need to run this job then
if: success() || failure()
steps:
- name: download test-results
- uses: actions/download-artifact@v2
+ uses: actions/download-artifact@v8
with:
path: test-results
- name: Publish Unit Test Results
- uses: docker://ghcr.io/enricomi/publish-unit-test-result-action:v1
+ uses: EnricoMi/publish-unit-test-result-action@v2
with:
check_name: Unit Test Results
- github_token: ${{ secrets.GH_ACCESS_TOKEN }}
+ github_token: ${{ secrets.GITHUB_TOKEN }}
files: test-results/**/*.xml
- comment_on_pr: false
+ comment_mode: "off"
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index a0cdd6d1a5a..b51ba06d582 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -23,10 +23,14 @@ on:
schedule:
- cron: '18 22 * * 2'
+concurrency:
+ group: codeql-analysis-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
jobs:
analyze:
name: Analyze
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
@@ -38,11 +42,15 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
+
+ # workaround for https://github.com/github/codeql/issues/14235
+ - name: Remove go.work file
+ run: rm go.work
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v1
+ uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,7 +61,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
- uses: github/codeql-action/autobuild@v1
+ uses: github/codeql-action/autobuild@v4
# âšī¸ Command-line programs to run using the OS shell.
# đ https://git.io/JvXDl
@@ -62,9 +70,5 @@ jobs:
# and modify them (or add more) to build your code if your project
# uses a compiled language
- # - run: |
- # make bootstrap
- # make release
-
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
+ uses: github/codeql-action/analyze@v4
diff --git a/.github/workflows/dependency-updates.yml b/.github/workflows/dependency-updates.yml
new file mode 100644
index 00000000000..8f16110d20b
--- /dev/null
+++ b/.github/workflows/dependency-updates.yml
@@ -0,0 +1,110 @@
+---
+name: 'dependency-updates'
+
+# yamllint disable-line rule:truthy
+on:
+ schedule:
+ - cron: '0 6 * * *'
+ workflow_dispatch:
+
+permissions:
+ contents: write
+ pull-requests: write
+
+jobs:
+ prepare:
+ name: prepare
+ runs-on: ubuntu-24.04
+ outputs:
+ matrix: ${{ steps.matrix.outputs.matrix }}
+ steps:
+ - name: Clone
+ uses: actions/checkout@v7
+
+ - name: Build dependency matrix
+ id: matrix
+ run: |
+ matrix=$(jq -c '
+ [
+ (.dependencies[] | {section: "dependencies", name, version, url: .urls.amd64}),
+ (.predependencies[] | {section: "predependencies", name, version, url: .urls.amd64}),
+ (.recommendations[] | {section: "recommendations", name, version, url: .urls.amd64})
+ ]
+ | map(. + {repo: (.url | capture("https://github.com/(?[^/]+/[^/]+)/releases").r)})
+ | map(del(.url))
+ | {include: .}
+ ' contrib/dependencies.json)
+ echo "matrix=${matrix}" >> "$GITHUB_OUTPUT"
+
+ update:
+ name: 'update / ${{ matrix.name }}'
+ runs-on: ubuntu-24.04
+ needs: prepare
+ strategy:
+ fail-fast: false
+ matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
+ concurrency:
+ group: dependency-updates-${{ matrix.name }}
+ cancel-in-progress: false
+ steps:
+ - name: Clone
+ uses: actions/checkout@v7
+
+ - name: Resolve latest release
+ id: latest
+ env:
+ GH_TOKEN: ${{ secrets.HOMEBREW_GITHUB_API_TOKEN }}
+ REPO: ${{ matrix.repo }}
+ CURRENT: ${{ matrix.version }}
+ run: |
+ tag=$(gh release view --repo "$REPO" --json tagName -q .tagName)
+ latest="${tag#v}"
+ echo "latest=${latest}" >> "$GITHUB_OUTPUT"
+ if dpkg --compare-versions "$latest" gt "$CURRENT"; then
+ echo "outdated=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "outdated=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Bump dependency entry
+ if: steps.latest.outputs.outdated == 'true'
+ env:
+ SECTION: ${{ matrix.section }}
+ NAME: ${{ matrix.name }}
+ OLD: ${{ matrix.version }}
+ NEW: ${{ steps.latest.outputs.latest }}
+ run: |
+ tmp=$(mktemp)
+ jq --arg section "$SECTION" \
+ --arg name "$NAME" \
+ --arg old "$OLD" \
+ --arg new "$NEW" '
+ ($old) as $oldv |
+ ($new) as $newv |
+ (.[$section]) |= map(
+ if .name == $name then
+ .version = $newv
+ | .urls.amd64 |= (gsub("v" + $oldv; "v" + $newv) | gsub($oldv; $newv))
+ | .urls.arm64 |= (gsub("v" + $oldv; "v" + $newv) | gsub($oldv; $newv))
+ else . end
+ )
+ ' contrib/dependencies.json > "$tmp"
+ mv "$tmp" contrib/dependencies.json
+
+ - name: Open pull request
+ if: steps.latest.outputs.outdated == 'true'
+ uses: peter-evans/create-pull-request@v8
+ with:
+ token: ${{ secrets.HOMEBREW_GITHUB_API_TOKEN }}
+ branch: chore/bump-${{ matrix.name }}-${{ steps.latest.outputs.latest }}
+ base: ${{ github.ref_name }}
+ delete-branch: true
+ committer: 'Dokku Bot '
+ author: 'Dokku Bot '
+ commit-message: 'chore: bump ${{ matrix.name }} to ${{ steps.latest.outputs.latest }}'
+ title: 'chore: bump ${{ matrix.name }} to ${{ steps.latest.outputs.latest }}'
+ body: |
+ Bumps `${{ matrix.name }}` from `${{ matrix.version }}` to `${{ steps.latest.outputs.latest }}`.
+
+ Release notes: https://github.com/${{ matrix.repo }}/releases/tag/v${{ steps.latest.outputs.latest }}
+ labels: 'type: dependencies'
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 00000000000..44ac33fff7d
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,43 @@
+---
+name: 'docs'
+
+# yamllint disable-line rule:truthy
+on:
+ push:
+ branches:
+ - master
+
+concurrency:
+ group: docs-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ deploy:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Cloning repo
+ uses: actions/checkout@v7
+ with:
+ fetch-depth: 0
+
+ - name: "Setup python 3.10"
+ uses: actions/setup-python@v7
+ with:
+ python-version: '3.10'
+
+ - name: Generate documentation
+ env:
+ BOT_GITHUB_USERNAME: ${{ secrets.HOMEBREW_GITHUB_USERNAME }}
+ BOT_GITHUB_API_TOKEN: ${{ secrets.HOMEBREW_GITHUB_API_TOKEN }}
+ run: |
+ git config --global user.name 'Dokku Bot'
+ git config --global user.email no-reply@dokku.com
+
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
+ sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
+ sudo apt update
+ sudo apt install gh -y
+
+ gh auth login --with-token <<<"$BOT_GITHUB_API_TOKEN"
+ contrib/build-docs
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index c626b331701..092b9acee4a 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -10,52 +10,77 @@ on:
branches:
- 'master'
+concurrency:
+ group: lint-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
jobs:
hadolint:
name: hadolint
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
- name: Run hadolint
- uses: hadolint/hadolint-action@d7b38582334d9ac11c12021c16f21d63015fa250
- # v1.6.0 => d7b38582334d9ac11c12021c16f21d63015fa250
+ uses: hadolint/hadolint-action@2332a7b74a6de0dda2e2221d575162eba76ba5e5
+ # v3.0.0 => 4b5806eb9c6bee4954fc0e0cc3ad6175fc9782c1
markdown-lint:
name: markdown-lint
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
+ - name: Setup node
+ uses: actions/setup-node@v7
+ with:
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: '.github/workflows/lint.yml'
+ - name: Install markdownlint-cli
+ run: npm install -g markdownlint-cli@0.35.0
- name: Run markdown-lint
- uses: avto-dev/markdown-lint@04d43ee9191307b50935a753da3b775ab695eceb
- # v1.5.0 => 04d43ee9191307b50935a753da3b775ab695eceb
+ run: markdownlint -c .github/linters/.markdown-lint.yml *.md **/*.md
+
+ packer:
+ name: packer
+ runs-on: ubuntu-24.04
+ if: github.event.pull_request.user.login != 'dependabot[bot]'
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v7
+ - name: Setup packer
+ uses: hashicorp/setup-packer@main
with:
- config: '.github/linters/.markdown-lint.yml'
- args: './README.md'
+ version: latest
+ - name: Run packer init
+ run: "make image/init/digitalocean"
+ env:
+ PACKER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Run `packer validate`
+ env:
+ DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}
+ run: "make image/validate/digitalocean"
shellcheck:
name: shellcheck
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
- name: Run shellcheck
- uses: ludeeus/action-shellcheck@94e0aab03ca135d11a35e5bfc14e6746dc56e7e9
+ uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38
# 1.1.0 => 94e0aab03ca135d11a35e5bfc14e6746dc56e7e9
- env:
- # keep in sync with tests/shellcheck-exclude
- SHELLCHECK_OPTS: -e SC1001 -e SC1003 -e SC1090 -e SC1091 -e SC1117 -e SC2029 -e SC2030 -e SC2031 -e SC2034 -e SC2046 -e SC2064 -e SC2068 -e SC2086 -e SC2119 -e SC2120 -e SC2128 -e SC2148 -e SC2153 -e SC2154 -e SC2155 -e SC2162 -e SC2174 -e SC2179 -e SC2191 -e SC2199 -e SC2207 -e SC2219 -e SC2220 -e SC2230 -e SC2231 -e SC2235 -e SC2267 -e SC2295
shfmt:
name: shfmt
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
- name: Run shfmt
- uses: luizm/action-sh-checker@7f44869033b40ee4ffe7dc76c87a1bc66e3d025a
- # v0.3.0 => 7f44869033b40ee4ffe7dc76c87a1bc66e3d025a
+ uses: luizm/action-sh-checker@883217215b11c1fabbf00eb1a9a041f62d74c744
+ # v0.5.0 => edd0e45ecff35b05f162052b50df50976c1b74fc
env:
SHFMT_OPTS: -l -bn -ci -i 2 -d
with:
@@ -63,12 +88,12 @@ jobs:
yamllint:
name: yamllint
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Clone
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
- name: Run yamllint
- uses: ibiqlik/action-yamllint@ed2b6e911569708ed121c14b87d513860a7e36a7
- # v3.0.4 => ed2b6e911569708ed121c14b87d513860a7e36a7
+ uses: ibiqlik/action-yamllint@2576378a8e339169678f9939646ee3ee325e845c
+ # v3.1.1 => 2576378a8e339169678f9939646ee3ee325e845c
with:
config_file: '.github/linters/.yamllint.yml'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 24a2ddab11f..a2f71c070f8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,38 +1,59 @@
---
-name: 'release'
+name: "release"
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
inputs:
release_type:
- description: 'Release type [build, betafish, patch, minor, major]'
+ description: "Release type"
+ default: "patch"
required: true
- default: 'build'
-
+ type: choice
+ options:
+ - patch
+ - minor
+ - major
+ - build
+ - betafish
jobs:
release:
name: release
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
env:
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: ruby/setup-ruby@v1
with:
- ruby-version: 2.6
+ ruby-version: 2.7
- - name: Login to Docker Hub
- uses: docker/login-action@v1
+ - name: login to docker hub
+ uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: set up qemu
+ uses: docker/setup-qemu-action@v4
+
+ - name: set up docker buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v4
+
+ - name: inspect builder
+ run: |
+ echo "Name: ${{ steps.buildx.outputs.name }}"
+ echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}"
+ echo "Status: ${{ steps.buildx.outputs.status }}"
+ echo "Flags: ${{ steps.buildx.outputs.flags }}"
+ echo "Platforms: ${{ steps.buildx.outputs.platforms }}"
+
- name: install package_cloud
run: gem install package_cloud
@@ -42,25 +63,64 @@ jobs:
git config --global user.email no-reply@dokku.com
- name: build package
+ env:
+ RELEASE_GITHUB_USERNAME: ${{ secrets.HOMEBREW_GITHUB_USERNAME }}
+ RELEASE_GITHUB_API_TOKEN: ${{ secrets.HOMEBREW_GITHUB_API_TOKEN }}
run: contrib/release-dokku ${{ github.event.inputs.release_type }}
- name: output version
id: version
- run: echo "::set-output name=version::$(cat build/next-version)"
+ run: echo "version=$(cat build/next-version)" >> $GITHUB_OUTPUT
- name: upload packages
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v7
with:
name: build
path: build
+ build-digitalocean:
+ name: build-digitalocean
+ runs-on: ubuntu-24.04
+ needs: release
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v7
+
+ - name: Setup packer
+ uses: hashicorp/setup-packer@main
+ with:
+ version: latest
+
+ - name: Run packer init
+ run: "make image/init/digitalocean"
+
+ - name: Run `packer validate`
+ env:
+ DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}
+ run: |
+ VERSION=${{ needs.release.outputs.version }}
+ PKR_VAR_dokku_version="${VERSION:1}" make image/validate/digitalocean
+
+ - name: Bump Digitalocean Image
+ env:
+ DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}
+ run: |
+ VERSION=${{ needs.release.outputs.version }}
+ PKR_VAR_dokku_version="${VERSION:1}" make image/build/digitalocean
+
+ - name: upload packages
+ uses: actions/upload-artifact@v7
+ with:
+ name: digitalocean-manifest.json
+ path: digitalocean-manifest.json
+
bump-azure:
name: bump-azure
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
needs: release
steps:
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v7
- name: Bump Azure Template
env:
BOT_GITHUB_USERNAME: ${{ secrets.HOMEBREW_GITHUB_USERNAME }}
@@ -76,6 +136,31 @@ jobs:
runs-on: macos-latest
needs: release
steps:
+ - name: Brew doctor
+ run: |
+ brew doctor || true
+ - name: Brew cleanup
+ run: |
+ echo "====> Running brew cleanup"
+ brew cleanup || true
+ echo "====> Untapping homebrew/core"
+ brew untap homebrew/core || true
+ echo "====> Untapping homebrew/cask"
+ brew untap homebrew/cask || true
+ echo "====> Untapping aws/tap"
+ brew untap aws/tap || true
+ echo "====> Untapping hashicorp/tap"
+ brew untap hashicorp/tap || true
+ echo "====> Uninstalling openssl@1.1"
+ brew uninstall openssl@1.1 || true
+ echo "====> Uninstalling ruby@3.0"
+ brew uninstall ruby@3.0 || true
+ echo "====> Running brew cleanup"
+ brew cleanup || true
+ - name: Brew doctor
+ run: brew doctor || true
+ - name: Brew config
+ run: brew config
- name: Bump Homebrew Formula
env:
HOMEBREW_GITHUB_USERNAME: ${{ secrets.HOMEBREW_GITHUB_USERNAME }}
diff --git a/.gitignore b/.gitignore
index deb157886df..39d3bcbad14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,6 @@ test-results/
stack.tgz
tmp
coverage.out
+site
+go.work.sum
+node_modules
\ No newline at end of file
diff --git a/.golangci-lint.yml b/.golangci-lint.yml
new file mode 100644
index 00000000000..86abba66c43
--- /dev/null
+++ b/.golangci-lint.yml
@@ -0,0 +1,24 @@
+---
+run:
+ timeout: 5m
+
+linters:
+ disable-all: true
+
+ enable:
+ - errcheck
+ - goconst
+ - gocyclo
+ - gofumpt
+ - gosec
+ - gosimple
+ - govet
+ - ineffassign
+ - misspell
+ - revive
+ - staticcheck
+ - typecheck
+ - unconvert
+ - unparam
+ - unused
+ - whitespace
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 00000000000..dd449725e18
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+*.md
diff --git a/tests/shellcheck-exclude b/.shellcheckrc
similarity index 92%
rename from tests/shellcheck-exclude
rename to .shellcheckrc
index 2049f4b80e6..dffeb4f39b3 100644
--- a/tests/shellcheck-exclude
+++ b/.shellcheckrc
@@ -16,7 +16,7 @@
# SC2128 - Expanding an array without an index only gives the first element - https://github.com/koalaman/shellcheck/wiki/SC2128
# SC2148 - Tips depend on target shell and yours is unknown. Add a shebang - https://github.com/koalaman/shellcheck/wiki/SC2148
# SC2153 - Possible misspelling: DOKKU_ROOT may not be assigned, but DOKKU_PORT is - https://github.com/koalaman/shellcheck/wiki/SC2153
-# SC2154 - passed_docker_option is referenced but not assigned - https://github.com/koalaman/shellcheck/wiki/SC2154
+# SC2154 - Var is referenced but not assigned - https://github.com/koalaman/shellcheck/wiki/SC2154
# SC2155 - Declare and assign separately to avoid masking return values - https://github.com/koalaman/shellcheck/wiki/SC2155
# SC2162 - read without -r will mangle backslashes - https://github.com/koalaman/shellcheck/wiki/SC2162
# SC2174 - When used with -p, -m only applies to the deepest directory - https://github.com/koalaman/shellcheck/wiki/SC2174
@@ -30,3 +30,4 @@
# SC2235 - Use { ..; } instead of (..) to avoid subshell overhead - https://github.com/koalaman/shellcheck/wiki/SC2235
# SC2267 - GNU xargs -i is deprecated in favor of -I{} - https://github.com/koalaman/shellcheck/wiki/SC2267
# SC2295 - Expansions inside ${..} need to be quoted separately, otherwise they match as patterns - https://github.com/koalaman/shellcheck/wiki/SC2295
+disable=SC1001,SC1003,SC1090,SC1091,SC1117,SC2029,SC2030,SC2031,SC2034,SC2046,SC2064,SC2068,SC2086,SC2119,SC2120,SC2128,SC2148,SC2153,SC2154,SC2155,SC2162,SC2174,SC2179,SC2191,SC2199,SC2207,SC2219,SC2220,SC2231,SC2235,SC2267,SC2295
diff --git a/.stickler.yml b/.stickler.yml
deleted file mode 100644
index de214fa2ccc..00000000000
--- a/.stickler.yml
+++ /dev/null
@@ -1,13 +0,0 @@
----
-linters:
- shellcheck:
- shell: bash
- exclude: SC2034,SC1090,SC2191
- golint:
-
-files:
- ignore:
- - 'debian/*'
- - 'docs/*'
- - 'tests/*'
- - '*/vendor/*'
diff --git a/.well-known/funding-manifest-urls b/.well-known/funding-manifest-urls
new file mode 100644
index 00000000000..801633007cf
--- /dev/null
+++ b/.well-known/funding-manifest-urls
@@ -0,0 +1 @@
+https://dokku.com/funding.json
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 70825f4d18b..2eff3cb8a3a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,11 +19,11 @@ a chance of keeping on top of things.
- [Reporting Security Issues](#reporting-security-issues)
- [Reporting Issues](#reporting-other-issues)
- [Contributing](#contributing)
- - [Making Changes](#making-changes)
- - [Which branch to base the work](#which-branch-to-base-the-work)
- - [Submitting Changes](#submitting-changes)
- - [When will my change be merged?](#when-will-my-change-be-merged)
- - [Running tests locally](#running-tests-locally)
+ - [Making Changes](#making-changes)
+ - [Which branch to base the work](#which-branch-to-base-the-work)
+ - [Submitting Changes](#submitting-changes)
+ - [When will my change be merged?](#when-will-my-change-be-merged)
+ - [Running tests locally](#running-tests-locally)
- [Additional Resources](#additional-resources)
## Reporting security issues
@@ -65,24 +65,24 @@ need to do
- Make sure you have a [GitHub account](https://github.com/signup/free).
- Submit an [issue](https://github.com/dokku/dokku/issues), assuming one does not already exist.
- - Clearly describe the issue including steps to reproduce when it is a bug.
- - Make sure you fill in the earliest version that you know has the issue.
+ - Clearly describe the issue including steps to reproduce when it is a bug.
+ - Make sure you fill in the earliest version that you know has the issue.
- Fork the repository on GitHub.
### Making Changes
- Create a topic branch from where you want to base your work.
- - This is usually the master branch.
- - Only target an existing branch if you are certain your fix must be on that
- branch.
- - To quickly create a topic branch based on master; `git checkout -b my_contribution origin/master`.
- It is best to avoid working directly on the `master` branch. Doing so will
+ - This is usually the master branch.
+ - Only target an existing branch if you are certain your fix must be on that
+ branch.
+ - To quickly create a topic branch based on master; `git checkout -b my_contribution origin/master`.
+ It is best to avoid working directly on the `master` branch. Doing so will
help avoid conflicts if you pull in updates from origin.
- Make commits of logical units. Implementing a new function and calling it in
another file constitute a single logical unit of work.
- - Before you make a pull request, squash your commits into logical units of work
- using `git rebase -i` and `git push -f`.
- - A majority of submissions should have a single commit, so if in doubt,
+ - Before you make a pull request, squash your commits into logical units of work
+ using `git rebase -i` and `git push -f`.
+ - A majority of submissions should have a single commit, so if in doubt,
squash your commits down to one commit.
- Check for unnecessary whitespace with `git diff --check` before committing.
- Use descriptive commit messages and reference the #issue number.
@@ -92,12 +92,12 @@ need to do
- Your work should apply the [Dokku coding standards](https://github.com/progrium/bashstyle)
- Pull requests must be cleanly rebased on top of master without multiple branches
mixed into the PR.
- - **Git tip**: If your PR no longer merges cleanly, use `rebase master` in your
+ - **Git tip**: If your PR no longer merges cleanly, use `rebase master` in your
feature branch to update your pull request rather than `merge master`.
### Which branch to base the work
-All changes should be be based on the latest master commit.
+All changes should be based on the latest master commit.
### Submitting Changes
@@ -135,4 +135,4 @@ which contains test setup information as well as tips for running tests.
- [Existing issues](https://github.com/dokku/dokku/issues)
- [General GitHub documentation](https://help.github.com/)
- [GitHub pull request documentation](https://help.github.com/send-pull-requests/)
-- [Gliderlabs Slack in the #dokku channel](https://glider-slackin.herokuapp.com/)
+- [Gliderlabs Slack in the #dokku channel](https://slack.dokku.com/)
diff --git a/Dockerfile b/Dockerfile
index d146340581d..3b2229b5cca 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM phusion/baseimage:bionic-1.0.0
+FROM phusion/baseimage:noble-1.0.3
CMD ["/sbin/my_init"]
@@ -14,23 +14,47 @@ RUN addgroup --gid $DOKKU_GID dokku \
&& adduser --uid $DOKKU_UID --gid $DOKKU_GID --disabled-password --gecos "" "dokku"
COPY ./tests/dhparam.pem /tmp/dhparam.pem
-COPY ./build/dokku.deb /tmp/dokku.deb
+COPY ./build/package/ /tmp
+COPY ./contrib/dependencies.json /tmp/dependencies.json
+
+ENV DOKKU_INIT_SYSTEM=sv
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# hadolint ignore=DL3005,DL3008
-RUN echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | debconf-set-selections \
+RUN mkdir -p /etc/apt/keyrings \
+ && mkdir -p /etc/apt/keyrings \
+ && apt-get remove -y systemd && apt-get autoremove -y && apt-get update && apt-get -y --no-install-recommends install gpg jq lsb-release openssl openssh-server rsync software-properties-common \
+ && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg \
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
+ && apt-get update \
+ && apt-get -y --no-install-recommends install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
+ && PACK_URL="$(jq -r --arg arch "$(dpkg --print-architecture)" '.dependencies[] | select(.name == "pack") | .urls[$arch]' /tmp/dependencies.json)" \
+ && curl -fsSL "$PACK_URL" | tar -C /usr/bin/ --no-same-owner -xzf - pack \
+ && chmod +x /usr/bin/pack \
+ && test -x /usr/bin/pack \
+ && curl -o /tmp/nixpacks.bash -sSL https://nixpacks.com/install.sh \
+ && chmod +x /tmp/nixpacks.bash \
+ && NIXPACKS_BIN_DIR=/usr/bin BIN_DIR=/usr/bin /tmp/nixpacks.bash \
+ && test -x /usr/bin/nixpacks \
+ && rm -rf /tmp/nixpacks.bash \
+ && curl -o /tmp/railpack.bash -sSL https://railpack.com/install.sh \
+ && chmod +x /tmp/railpack.bash \
+ && RAILPACK_BIN_DIR=/usr/bin BIN_DIR=/usr/bin /tmp/railpack.bash \
+ && test -x /usr/bin/railpack \
+ && rm -rf /tmp/railpack.bash \
+ && echo "dokku dokku/hostname string $DOKKU_HOSTNAME" | debconf-set-selections \
&& echo "dokku dokku/skip_key_file boolean $DOKKU_SKIP_KEY_FILE" | debconf-set-selections \
&& echo "dokku dokku/vhost_enable boolean $DOKKU_VHOST_ENABLE" | debconf-set-selections \
+ && echo "dokku dokku/install_default_site boolean true" | debconf-set-selections \
&& curl -sSL https://packagecloud.io/dokku/dokku/gpgkey | apt-key add - \
- && echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ bionic main" | tee /etc/apt/sources.list.d/dokku.list \
+ && echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ noble main" | tee /etc/apt/sources.list.d/dokku.list \
&& mkdir -p /etc/nginx/ \
&& cp /tmp/dhparam.pem /etc/nginx/dhparam.pem \
- && apt-get update -qq \
- && apt-get upgrade -qq -y \
- && apt-get -qq -y --no-install-recommends --only-upgrade install openssl openssh-server \
- && apt-get -qq -y --no-install-recommends install rsync /tmp/dokku.deb \
- && apt-get purge -qq -y syslog-ng-core \
- && apt-get autoremove -qq -y \
+ && apt-get update \
+ && apt-get upgrade -y \
+ && apt-get -y --no-install-recommends install lambda-builder "/tmp/dokku-$(dpkg --print-architecture).deb" \
+ && apt-get purge -y syslog-ng-core \
+ && apt-get autoremove -y \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /tmp
@@ -39,6 +63,7 @@ COPY ./docker .
RUN \
rsync -a /tmp/ / \
+ && chmod +x /usr/local/bin/* \
&& rm -rf /tmp/* \
&& rm /etc/runit/runsvdir/default/sshd/down \
&& chown -R dokku:dokku /home/dokku/ \
@@ -51,8 +76,12 @@ RUN \
&& ln -sf /mnt/dokku/home/dokku /home/dokku \
&& ln -sf /mnt/dokku/var/lib/dokku/config /var/lib/dokku/config \
&& ln -sf /mnt/dokku/var/lib/dokku/data /var/lib/dokku/data \
+ && ln -sf /mnt/dokku/var/lib/dokku/services /var/lib/dokku/services \
&& mv /etc/my_init.d/00_regen_ssh_host_keys.sh /etc/my_init.d/15_regen_ssh_host_keys \
&& rm -f /etc/nginx/sites-enabled/default /usr/share/nginx/html/index.html /etc/my_init.d/10_syslog-ng.init \
&& rm -f /usr/local/openresty/nginx/conf/sites-enabled/default /usr/share/openresty/html/index.html \
&& sed -i '/imklog/d' /etc/rsyslog.conf \
&& rm -f /var/log/btmp /var/log/wtmp /var/log/*log /var/log/apt/* /var/log/dokku/*.log /var/log/nginx/* /var/log/openresty/*
+
+HEALTHCHECK --interval=30s --timeout=10s --start-period=5m --retries=3 \
+ CMD curl -fsS http://127.0.0.1:18080/_dokku/health || exit 1
diff --git a/HISTORY.md b/HISTORY.md
index c5cc0e3ac68..15610ccfc2c 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,11 +1,5312 @@
# History
+## 0.38.25
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.25/bootstrap.sh
+sudo DOKKU_TAG=v0.38.25 bash bootstrap.sh
+```
+
+### Security
+
+- #8848: @josegonzalez Prevent command injection via docker options eval
+
+### New Features
+
+- #8849: @josegonzalez Support per-app letsencrypt emails on k3s
+
+## 0.38.24
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.24/bootstrap.sh
+sudo DOKKU_TAG=v0.38.24 bash bootstrap.sh
+```
+
+### Documentation
+
+- #8836: @josegonzalez Link herokuish buildpack references to buildpack management page
+
+### Tests
+
+- #8841: @dependabot[bot] chore(deps): bump ruby from 4.0.5 to 4.0.6 in /tests/apps/dockerfile-entrypoint
+- #8843: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.82.0 to 1.82.1 in /tests/apps/gogrpc
+
+### Dependencies
+
+- #8845: @dependabot[bot] chore(deps): bump github.com/mattn/go-isatty from 0.0.22 to 0.0.23 in /plugins/app-json
+- #8844: @dependabot[bot] chore(deps): bump github.com/melbahja/goph from 1.5.1 to 1.5.2 in /plugins/common
+- #8842: @dependabot[bot] chore(deps): bump timberio/vector from 0.56.0-debian to 0.57.0-debian in /plugins/logs
+- #8838: @dokku-bot chore: bump pack to 0.40.8
+- #8846: @dependabot[bot] chore(deps): bump traefik from v3.7.7 to v3.7.8 in /plugins/traefik-vhosts
+- #8839: @dependabot[bot] chore(deps): bump actions/setup-node from 6 to 7
+- #8834: @dokku-bot chore: bump dokku-event-listener to 0.20.0
+
+## 0.38.23
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.23/bootstrap.sh
+sudo DOKKU_TAG=v0.38.23 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8833: @josegonzalez Parse cert CN and subject on OpenSSL 3.x
+
+### Tests
+
+- #8825: @dependabot[bot] chore(deps): bump golang from 1.26.4 to 1.26.5 in /tests/apps/zombies-dockerfile-no-tini
+- #8823: @dependabot[bot] chore(deps): bump golang from 1.26.4 to 1.26.5 in /tests/apps/zombies-dockerfile-tini
+- #8820: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 292 to 293 in /tests/apps/php
+- #8821: @dependabot[bot] chore(deps): bump golang from 1.26.4 to 1.26.5 in /tests/apps/go-fail-predeploy
+- #8822: @dependabot[bot] chore(deps): bump golang from 1.26.4 to 1.26.5 in /tests/apps/gogrpc
+- #8824: @dependabot[bot] chore(deps): bump golang from 1.26.4 to 1.26.5 in /tests/apps/go-fail-postdeploy
+
+### Dependencies
+
+- #8831: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.21.2 to 3.21.3 in /plugins/scheduler-k3s
+- #8830: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.37.0 to 1.38.0 in /plugins/scheduler-k3s
+- #8826: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.53.0 to 0.54.0 in /plugins/common
+- #8827: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.20.3 to 1.21.0 in /plugins/scheduler-k3s
+- #8828: @dependabot[bot] chore(deps): bump traefik from v3.7.6 to v3.7.7 in /plugins/traefik-vhosts
+- #8829: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.24.0 to 1.0.0 in /plugins/scheduler-k3s
+
+## 0.38.22
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.22/bootstrap.sh
+sudo DOKKU_TAG=v0.38.22 bash bootstrap.sh
+```
+
+### New Features
+
+- #8805: @RichardDorian Allow custom values for chown
+- #8810: @josegonzalez Expose whether a network was created by dokku
+- #8807: @josegonzalez Allow replacing buildpack list atomically
+- #8808: @josegonzalez Expose docker-options as structured lists in JSON report
+- #8806: @josegonzalez Expose scheduler-k3s autoscaling-auth state for read-back
+- #8801: @josegonzalez Add --format json support to plugin:list
+
+### Refactors
+
+- #8804: @josegonzalez Port bash :report subcommands to golang
+
+### Documentation
+
+- #8809: @josegonzalez Document nginx validate-config load_module override
+
+### Tests
+
+- #8803: @dependabot[bot] chore(deps): bump django from 5.2.15 to 5.2.16 in /tests/apps/dockerfile-release
+
+### Dependencies
+
+- #8816: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.21.0 to 0.22.0 in /plugins/common
+- #8818: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.51 to 2.11.52 in /plugins/scheduler-k3s
+- #8817: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.21.0 to 0.22.0 in /plugins/scheduler-docker-local
+- #8819: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.21.0 to 0.22.0 in /plugins/scheduler-k3s
+
+## 0.38.21
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.21/bootstrap.sh
+sudo DOKKU_TAG=v0.38.21 bash bootstrap.sh
+```
+
+### New Features
+
+- #8795: @josegonzalez Add --format json support to apps:list
+
+### Tests
+
+- #8788: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.81.1 to 1.82.0 in /tests/apps/gogrpc
+- #8787: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.51.0 to 0.55.0 in /tests/apps/gogrpc
+
+### Dependencies
+
+- #8781: @dependabot[bot] chore(deps): bump lucaslorentz/caddy-docker-proxy from 2.12 to 2.13 in /plugins/caddy-vhosts
+- #8794: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.36.0 to 1.37.0 in /plugins/scheduler-k3s
+- #8789: @dependabot[bot] chore(deps): bump pymdown-extensions from 11.0 to 11.0.1 in /docs/_build
+- #8782: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.23.2 to 0.24.0 in /plugins/scheduler-k3s
+- #8785: @dependabot[bot] chore(deps): bump traefik from v3.7.5 to v3.7.6 in /plugins/traefik-vhosts
+- #8786: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.31.0 to 1.36.0 in /plugins/scheduler-k3s
+- #8783: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.50 to 2.11.51 in /plugins/scheduler-k3s
+- #8780: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.20.2 to 1.20.3 in /plugins/scheduler-k3s
+- #8779: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.23.1 to 0.23.2 in /plugins/scheduler-k3s
+
+### Other
+
+- #8796: @josegonzalez Add --format json support to ps:scale
+
+## 0.38.20
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.20/bootstrap.sh
+sudo DOKKU_TAG=v0.38.20 bash bootstrap.sh
+```
+
+### Tests
+
+- #8773: @dependabot[bot] chore(deps): bump python from 3.15.0b2-bookworm to 3.15.0b3-bookworm in /tests/apps/dockerfile-release
+- #8756: @dependabot[bot] chore(deps): bump sass from 1.100.0 to 1.101.0 in /tests/apps/multi
+- #8753: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 291 to 292 in /tests/apps/php
+
+### Dependencies
+
+- #8766: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.21.1 to 3.21.2 in /plugins/scheduler-k3s
+- #8777: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.41.0 to 1.42.1 in /plugins/common
+- #8778: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 6.1.0 to 6.1.1 in /plugins/haproxy-vhosts
+- #8748: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.52.0 to 0.53.0 in /plugins/common
+- #8745: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.20.0 to 0.21.0 in /plugins/common
+- #8774: @dependabot[bot] chore(deps): bump python from 3.15.0b2-alpine to 3.15.0b3-alpine in /docs/_build
+- #8769: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.21.3 to 11.0 in /docs/_build
+- #8775: @dependabot[bot] chore(deps): bump click from 8.4.1 to 8.4.2 in /docs/_build
+- #8776: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 6.0.1 to 6.1.0 in /plugins/haproxy-vhosts
+- #8772: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.42.0 to 1.42.1 in /plugins/buildpacks
+- #8770: @dokku-bot chore: bump pack to 0.40.7
+- #8767: @dependabot[bot] chore(deps): bump github.com/containerd/containerd from 1.7.32 to 1.7.33 in /plugins/scheduler-k3s
+- #8765: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.41.0 to 1.42.0 in /plugins/scheduler-k3s
+- #8764: @dependabot[bot] chore(deps): bump actions/checkout from 6 to 7
+- #8762: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.36.1 to 1.36.2 in /plugins/scheduler-k3s
+- #8758: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.41.0 to 1.42.0 in /plugins/buildpacks
+- #8760: @dependabot[bot] chore(deps): bump k8s.io/apimachinery from 0.36.1 to 0.36.2 in /plugins/scheduler-k3s
+- #8757: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.21.0 to 3.21.1 in /plugins/scheduler-k3s
+- #8755: @dependabot[bot] chore(deps): bump traefik from v3.7.4 to v3.7.5 in /plugins/traefik-vhosts
+- #8754: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.49 to 2.11.50 in /plugins/scheduler-k3s
+- #8749: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.47 to 2.11.49 in /plugins/scheduler-k3s
+- #8743: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.14.3 to 4.15.0 in /docs/_build
+- #8744: @dependabot[bot] chore(deps): bump traefik from v3.7.3 to v3.7.4 in /plugins/traefik-vhosts
+- #8747: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.20.0 to 0.21.0 in /plugins/scheduler-k3s
+- #8746: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.20.0 to 0.21.0 in /plugins/scheduler-docker-local
+
+## 0.38.19
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.19/bootstrap.sh
+sudo DOKKU_TAG=v0.38.19 bash bootstrap.sh
+```
+
+## 0.38.18
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.18/bootstrap.sh
+sudo DOKKU_TAG=v0.38.18 bash bootstrap.sh
+```
+
+### Tests
+
+- #8734: @dependabot[bot] chore(deps): bump golang from 1.26.3 to 1.26.4 in /tests/apps/gogrpc
+- #8731: @dependabot[bot] chore(deps): bump golang from 1.26.3 to 1.26.4 in /tests/apps/go-fail-predeploy
+- #8733: @dependabot[bot] chore(deps): bump golang from 1.26.3 to 1.26.4 in /tests/apps/zombies-dockerfile-tini
+- #8735: @dependabot[bot] chore(deps): bump golang from 1.26.3 to 1.26.4 in /tests/apps/go-fail-postdeploy
+- #8736: @dependabot[bot] chore(deps): bump golang from 1.26.3 to 1.26.4 in /tests/apps/zombies-dockerfile-no-tini
+- #8738: @dependabot[bot] chore(deps): bump python from 3.15.0b1-bookworm to 3.15.0b2-bookworm in /tests/apps/dockerfile-release
+- #8730: @dependabot[bot] chore(deps): bump django from 5.2.14 to 5.2.15 in /tests/apps/dockerfile-release
+
+### Dependencies
+
+- #8727: @dependabot[bot] chore(deps): bump github.com/melbahja/goph from 1.5.0 to 1.5.1 in /plugins/common
+- #8739: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.46 to 2.11.47 in /plugins/scheduler-k3s
+- #8737: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.12.0 to 0.12.1 in /plugins/openresty-vhosts
+- #8732: @dependabot[bot] chore(deps): bump python from 3.15.0b1-alpine to 3.15.0b2-alpine in /docs/_build
+- #8740: @dependabot[bot] chore(deps): bump timberio/vector from 0.55.0-debian to 0.56.0-debian in /plugins/logs
+- #8741: @dependabot[bot] chore(deps): bump traefik from v3.7.1 to v3.7.3 in /plugins/traefik-vhosts
+
+## 0.38.17
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.17/bootstrap.sh
+sudo DOKKU_TAG=v0.38.17 bash bootstrap.sh
+```
+
+### New Features
+
+- #8729: @josegonzalez Add scheduler-k3s:preview subcommand to allow previewing helm chart changes
+
+### Dependencies
+
+- #8728: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.11.0 to 0.12.0 in /plugins/openresty-vhosts
+
+## 0.38.16
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.16/bootstrap.sh
+sudo DOKKU_TAG=v0.38.16 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8723: @josegonzalez Match control-plane nodes by their modern label
+- #8724: @josegonzalez Stop truncating existing files in common.TouchFile
+
+## 0.38.15
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.15/bootstrap.sh
+sudo DOKKU_TAG=v0.38.15 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8718: @josegonzalez Persist scheduler-k3s chart overrides as JSON maps
+
+### Other
+
+- #8720: @josegonzalez Persist scheduler-k3s annotations and labels as JSON maps
+
+## 0.38.14
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.14/bootstrap.sh
+sudo DOKKU_TAG=v0.38.14 bash bootstrap.sh
+```
+
+### New Features
+
+- #8716: @josegonzalez Add scheduler-k3s annotations:report and labels:report
+- #8715: @josegonzalez Add scheduler-k3s:charts:set and :charts:report
+
+## 0.38.13
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.13/bootstrap.sh
+sudo DOKKU_TAG=v0.38.13 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8713: @josegonzalez Make storage:mount upsert the existing attachment
+
+### New Features
+
+- #8714: @josegonzalez Expose per-attachment fields in storage:report
+- #8712: @josegonzalez Expose attachment readonly and volume_options in storage:list json
+- #8711: @josegonzalez Add --volume-options flag to storage:mount
+
+## 0.38.12
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.12/bootstrap.sh
+sudo DOKKU_TAG=v0.38.12 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8706: @josegonzalez Align apps:set/apps:report with what dokku actually reads
+
+## 0.38.11
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.11/bootstrap.sh
+sudo DOKKU_TAG=v0.38.11 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8704: @josegonzalez Pass storage entry basename to chown-storage-dir
+
+## 0.38.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.10/bootstrap.sh
+sudo DOKKU_TAG=v0.38.10 bash bootstrap.sh
+```
+
+### New Features
+
+- #8702: @josegonzalez Prompt for confirmation on storage:destroy
+
+### Tests
+
+- #8698: @dependabot[bot] chore(deps-dev): bump org.apache.maven.plugins:maven-dependency-plugin from 3.10.0 to 3.11.0 in /tests/apps/java
+
+## 0.38.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.9/bootstrap.sh
+sudo DOKKU_TAG=v0.38.9 bash bootstrap.sh
+```
+
+### New Features
+
+- #8697: @josegonzalez Split openresty report into raw/computed/global
+
+### Refactors
+
+- #8696: @josegonzalez Treat empty ps restart-policy as an unset
+
+## 0.38.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.8/bootstrap.sh
+sudo DOKKU_TAG=v0.38.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8690: @josegonzalez Unset bind-all-interfaces on empty value
+- #8689: @josegonzalez Expose remaining settable properties via :report
+
+### New Features
+
+- #8692: @Mordred Enable compression middleware for traefik when using scheduler-k3s
+- #8691: @josegonzalez Align Go-plugin :report JSON keys with bash-strip convention
+- #8688: @josegonzalez Promote registry image-repo-template to app + global
+
+### Dependencies
+
+- #8693: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.20.2 to 3.21.0 in /plugins/scheduler-k3s
+
+## 0.38.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.7/bootstrap.sh
+sudo DOKKU_TAG=v0.38.7 bash bootstrap.sh
+```
+
+### Security
+
+- #8672: @josegonzalez Prevent host shell injection from app.json cron commands
+
+### Bug Fixes
+
+- #8669: @josegonzalez Recover deployed image from registry on local miss
+- #8679: @josegonzalez Align ps/cron :report --global keys with plugin convention
+- #8678: @josegonzalez Split openresty report keys into global and computed pairs
+- #8676: @immanuwell Use SYSTEM for shfmt Darwin detection
+
+### New Features
+
+- #8677: @josegonzalez Warn on deprecated listen http2 in custom nginx templates
+
+### Tests
+
+- #8683: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 290 to 291 in /tests/apps/php
+- #8671: @josegonzalez Qualify scheduler-k3s ingressroute kubectl lookups
+
+### Dependencies
+
+- #8682: @dependabot[bot] chore(deps): bump k8s.io/apimachinery from 0.36.0 to 0.36.1 in /plugins/scheduler-k3s
+- #8681: @dependabot[bot] chore(deps): bump soupsieve from 2.8.3 to 2.8.4 in /docs/_build
+
+### Other
+
+- #8680: @josegonzalez Split more report global keys into raw and computed
+
+## 0.38.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.6/bootstrap.sh
+sudo DOKKU_TAG=v0.38.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8633: @Mordred Correctly redirect http traffic to https when using scheduler-k3s
+- #8665: @josegonzalez Clarify byte-preserving behavior of config:set --encoded
+- #8666: @josegonzalez Depend on cron | cron-daemon to allow alternatives
+- #8638: @josegonzalez Support --global on cron:set
+
+### Refactors
+
+- #8668: @josegonzalez Hash scheduler-k3s cron-id label to fit Kubernetes' 63-byte cap
+- #8664: @josegonzalez Convert filesystem migration markers to plugin properties
+
+### Documentation
+
+- #8645: @zenspider Removed outdated warning about dokku-update not being able to upgrade to specific versions.
+
+### Tests
+
+- #8667: @josegonzalez Rename logs:report vector key test and guard old keys
+- #8662: @dependabot[bot] chore(deps): bump qs from 6.15.0 to 6.15.2 in /tests/apps/checks-root
+- #8661: @dependabot[bot] chore(deps): bump sass from 1.99.0 to 1.100.0 in /tests/apps/multi
+- #8658: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 288 to 290 in /tests/apps/php
+- #8657: @dependabot[bot] chore(deps): bump slim/slim from 4.15.1 to 4.15.2 in /tests/apps/php
+- #8654: @dependabot[bot] chore(deps): bump ruby from 4.0.4 to 4.0.5 in /tests/apps/dockerfile-entrypoint
+- #8642: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.81.0 to 1.81.1 in /tests/apps/gogrpc
+
+### Dependencies
+
+- #8652: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.40.0 to 1.41.0 in /plugins/common
+- #8663: @dokku-bot chore: bump herokuish to 0.11.13
+- #8646: @dokku-bot chore: bump pack to 0.40.6
+- #8659: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.51.0 to 0.52.0 in /plugins/common
+- #8660: @dependabot[bot] chore(deps): bump click from 8.4.0 to 8.4.1 in /docs/_build
+- #8655: @dependabot[bot] chore(deps): bump github.com/containerd/containerd from 1.7.30 to 1.7.32 in /plugins/scheduler-k3s
+- #8651: @dependabot[bot] chore(deps): bump click from 8.3.3 to 8.4.0 in /docs/_build
+- #8649: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.40.0 to 1.41.0 in /plugins/buildpacks
+- #8650: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.40.0 to 1.41.0 in /plugins/config
+- #8648: @dependabot[bot] chore(deps): bump zipp from 3.23.1 to 4.1.0 in /docs/_build
+- #8644: @dokku-bot chore: bump pack to 0.40.5
+- #8641: @dependabot[bot] chore(deps): bump traefik from v3.7.0 to v3.7.1 in /plugins/traefik-vhosts
+- #8634: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.21.2 to 10.21.3 in /docs/_build
+
+### Other
+
+- #8640: @josegonzalez Split report global keys into raw and computed
+
+## 0.38.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.5/bootstrap.sh
+sudo DOKKU_TAG=v0.38.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8627: @josegonzalez Preserve explicit https:443 port mappings on cert update
+
+### New Features
+
+- #8629: @josegonzalez Attach vector container to additional docker networks
+- #8624: @josegonzalez Expose certs-set and certs-remove plugin triggers
+- #8626: @josegonzalez Split caddy report tls-internal into raw, computed, and global
+
+### Tests
+
+- #8620: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 287 to 288 in /tests/apps/php
+- #8621: @dependabot[bot] chore(deps): bump ruby from 4.0.3 to 4.0.4 in /tests/apps/dockerfile-entrypoint
+
+### Dependencies
+
+- #8622: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.36.0 to 1.36.1 in /plugins/scheduler-k3s
+
+## 0.38.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.4/bootstrap.sh
+sudo DOKKU_TAG=v0.38.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8615: @josegonzalez Reject per-app sets for openresty global-only properties
+- #8613: @josegonzalez Expose raw deploy-branch and keep-git-dir in git:report
+- #8549: @josegonzalez Route CNB images through launcher on scheduler-k3s
+
+### New Features
+
+- #8614: @josegonzalez Split scheduler-docker-local report into raw, computed, and global
+
+### Documentation
+
+- #8603: @cheif Add `dokku-http-oauth` to community plugins
+
+### Tests
+
+- #8618: @josegonzalez Isolate scheduler-k3s registry tags per bats file
+- #8616: @josegonzalez Migrate from junit_files to files in EnricoMi/publish-unit-test-result-action
+- #8617: @josegonzalez Upgrade actions in shared build-image compose action
+- #8609: @josegonzalez Skip packer lint job on dependabot PRs
+- #8604: @dependabot[bot] chore(deps): bump python from 3.14.3-bookworm to 3.15.0b1-bookworm in /tests/apps/dockerfile-release
+
+### Dependencies
+
+- #8606: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.50.0 to 0.51.0 in /plugins/common
+- #8608: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.45 to 2.11.46 in /plugins/scheduler-k3s
+- #8607: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.10.0 to 0.11.0 in /plugins/openresty-vhosts
+- #8605: @dependabot[bot] chore(deps): bump python from 3.14.3-alpine to 3.15.0b1-alpine in /docs/_build
+
+## 0.38.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.3/bootstrap.sh
+sudo DOKKU_TAG=v0.38.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8602: @josegonzalez Reject per-app sets for global-only proxy properties
+- #8601: @josegonzalez Rename app-json:report flags to match property
+- #8600: @josegonzalez Report info-flag should not error when app undeployed
+
+### New Features
+
+- #8599: @josegonzalez Add docker healthcheck to dokku container
+
+## 0.38.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.2/bootstrap.sh
+sudo DOKKU_TAG=v0.38.2 bash bootstrap.sh
+```
+
+### Security
+
+- #8590: @josegonzalez Restrict app names to prevent command injection
+- #8591: @josegonzalez Harden archive extraction against symlink traversal
+- #8589: @josegonzalez Enforce 0600 permissions on .netrc credentials file
+- #8588: @josegonzalez Sanitize openresty include filenames to prevent eval injection
+
+### Bug Fixes
+
+- #8593: @josegonzalez Gate ssl_reject_handshake behind nginx 1.19.4
+- #8578: @josegonzalez Reference SOURCECODE_WORK_DIR in builder core-post-extract
+
+### Documentation
+
+- #8592: @josegonzalez Add security section to release changelog
+- #8587: @vixalien Correct buildkit builder code block syntax
+- #8580: @othercorey Set issue type in bug report template
+
+### Tests
+
+- #8586: @josegonzalez Count assert_output_contains matches as fixed strings
+- #8581: @dependabot[bot] chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/go-fail-predeploy
+- #8582: @dependabot[bot] chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/gogrpc
+- #8584: @dependabot[bot] chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/go-fail-postdeploy
+- #8583: @dependabot[bot] chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/zombies-dockerfile-tini
+- #8585: @dependabot[bot] chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/zombies-dockerfile-no-tini
+- #8574: @dependabot[bot] chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-noexpose
+- #8575: @dependabot[bot] chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-procfile-bad
+- #8577: @dependabot[bot] chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-app-json-formations
+- #8576: @dependabot[bot] chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile
+- #8573: @dependabot[bot] chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-procfile
+
+### Dependencies
+
+- #8579: @josegonzalez Use type prefix for dokku-bot dependency label
+
+## 0.38.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.1/bootstrap.sh
+sudo DOKKU_TAG=v0.38.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8563: @josegonzalez Source property-functions where fn-plugin-property-* helpers are used
+- #8559: @josegonzalez Install cnb pack from github releases instead of ppa
+- #8558: @josegonzalez Chown migrated legacy storage entries to dokku
+- #8545: @josegonzalez Deflake haproxy bats tests
+
+### Refactors
+
+- #8546: @josegonzalez Consolidate nginx.conf.sigil server blocks
+
+### Documentation
+
+- #8548: @josegonzalez Use explicit type property in proxy:set examples
+- #8547: @josegonzalez Document plugin properties migrated from env vars
+- #8544: @josegonzalez Fix reference to when the build plugin was introduced
+
+### Tests
+
+- #8565: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.81.0 in /tests/apps/gogrpc
+- #8568: @dependabot[bot] chore(deps): bump gunicorn from 25.3.0 to 26.0.0 in /tests/apps/multi
+- #8572: @dependabot[bot] chore(deps): bump django from 5.2.13 to 5.2.14 in /tests/apps/dockerfile-release
+- #8570: @dependabot[bot] chore(deps): bump gunicorn from 25.3.0 to 26.0.0 in /tests/apps/dockerfile-release
+- #8567: @dependabot[bot] chore(deps): bump gunicorn from 25.3.0 to 26.0.0 in /tests/apps/python-flask
+
+### Dependencies
+
+- #8571: @dependabot[bot] chore(deps): bump traefik from v3.6.15 to v3.7.0 in /plugins/traefik-vhosts
+- #8569: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.44 to 2.11.45 in /plugins/scheduler-k3s
+- #8561: @dokku-bot chore: bump pack to 0.40.4
+- #8555: @dependabot[bot] chore(deps): bump github.com/mattn/go-isatty from 0.0.20 to 0.0.22 in /plugins/app-json
+- #8556: @dependabot[bot] chore(deps): bump github.com/Masterminds/semver/v3 from 3.4.0 to 3.5.0 in /plugins/scheduler-k3s
+- #8550: @dokku-bot chore: bump docker-container-healthchecker to 0.15.2
+- #8553: @dokku-bot chore: bump dokku-event-listener to 0.19.1
+- #8552: @dokku-bot chore: bump lambda-builder to 0.9.3
+- #8551: @dokku-bot chore: bump procfile-util to 0.20.7
+- #8554: @dependabot[bot] chore(deps): bump peter-evans/create-pull-request from 7 to 8
+
+## 0.38.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.38.0/bootstrap.sh
+sudo DOKKU_TAG=v0.38.0 bash bootstrap.sh
+```
+
+See the [0.38.0 migration guide](/docs/appendices/0.38.0-migration-guide.md) for more information on migrating to 0.38.0.
+
+### Bug Fixes
+
+- #8533: @josegonzalez Split env config and image pull secret into separate helm releases
+- #8530: @josegonzalez Split multi-flag input in docker-options
+- #8528: @josegonzalez Skip retiring images still in use by app containers
+- #8525: @josegonzalez Add launcher entrypoint for CNB images on dokku run and cron:run
+- #8522: @josegonzalez Only emit keda fallback when a non-cpu/memory trigger exists
+- #8515: @josegonzalez Fix vector mount directory config
+- #8508: @josegonzalez Preserve all domains when renaming an app
+- #8507: @josegonzalez Retire orphaned containers when scaling down
+
+### New Features
+
+- #8538: @josegonzalez Add scheduler-aware named storage entries
+- #8527: @josegonzalez Accept --global on :report subcommands
+- #8524: @josegonzalez Pre-validate custom nginx.conf.sigil during core-post-extract
+- #8523: @josegonzalez Support resource limits on the build container
+- #8517: @josegonzalez Send SIGTERM to old containers immediately on deploy
+- #8516: @josegonzalez Scope docker-options to specific procfile processes
+- #8509: @josegonzalez Ship default catch-all site on fresh apt install
+- #8506: @josegonzalez Add --format json to git:report and nginx:report
+- #8505: @josegonzalez Add git:auth-status to check netrc match
+- #8493: @josegonzalez Generate 502 config for apps without web listeners
+- #8404: @josegonzalez Upgrade vector chart from 0.42.0 to 0.52.0
+- #8403: @josegonzalez Upgrade ingress-nginx chart from 4.10.0 to 4.15.1
+- #8402: @josegonzalez Upgrade keda to 2.19.0 and keda-add-ons-http to 0.12.2
+- #8259: @josegonzalez Add post-create support for env key in app.json
+- #8157: @josegonzalez Add support for specifying buildpacks via app.json
+- #8154: @josegonzalez Enable live-restore by default when installing Dokku
+- #3697: @josegonzalez Migrate builds plugin to go and track per-build records
+
+### Refactors
+
+- #8514: @josegonzalez Migrate docker-options subcommands to go
+- #6716: @josegonzalez Move app and global ENV files to consolidated config path
+
+### Dependencies
+
+- #8541: @dependabot[bot] chore(deps): bump traefik from v3.6.14 to v3.6.15 in /plugins/traefik-vhosts
+- #8537: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.43 to 2.11.44 in /plugins/scheduler-k3s
+- #8535: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.39.1 to 1.40.0 in /plugins/common
+- #8529: @josegonzalez chore: bump dokku/netrc to v0.11.0
+- #8520: @dependabot[bot] chore(deps): bump packaging from 26.1 to 26.2 in /docs/_build
+- #8510: @dependabot[bot] chore(deps): bump packaging from 26.1 to 26.2 in /docs/_build
+- #8503: @josegonzalez Bump dependency versions and add daily updater workflow
+- #8502: @josegonzalez Bump go version to 1.26.2
+- #8495: @dependabot[bot] chore(deps): bump k8s.io/apimachinery from 0.35.4 to 0.36.0 in /plugins/scheduler-k3s
+- #8494: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.9.3 to 0.10.0 in /plugins/openresty-vhosts
+- #8490: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.35.4 to 1.36.0 in /plugins/scheduler-k3s
+
+### Other
+
+- #8498: @josegonzalez Migrate environment variables to plugin properties
+
+## 0.37.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.10/bootstrap.sh
+sudo DOKKU_TAG=v0.37.10 bash bootstrap.sh
+```
+
+### Tests
+
+- #8491: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 285 to 287 in /tests/apps/php
+- #8478: @josegonzalez chore: label test app dependency updates as type: tests
+
+### Dependencies
+
+- #8486: @dependabot[bot] chore(deps): bump click from 8.3.2 to 8.3.3 in /docs/_build
+- #8492: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.29.0 to 1.31.0 in /plugins/scheduler-k3s
+- #8489: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.42 to 2.11.43 in /plugins/scheduler-k3s
+- #8488: @dependabot[bot] chore(deps): bump timberio/vector from 0.54.0-debian to 0.55.0-debian in /plugins/logs
+- #8487: @dependabot[bot] chore(deps): bump traefik from v3.6.13 to v3.6.14 in /plugins/traefik-vhosts
+- #8483: @dependabot[bot] chore(deps): update markdown requirement from <3.11,>=3.2.1 to >=3.10.2,<3.11 in /docs/_build
+- #8485: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.35.2 to 0.35.4 in /plugins/scheduler-k3s
+- #8484: @dependabot[bot] chore(deps): bump k8s.io/client-go from 0.35.2 to 0.35.4 in /plugins/scheduler-k3s
+- #8482: @dependabot[bot] chore(deps): bump ruby from 4.0.2 to 4.0.3 in /tests/apps/dockerfile-entrypoint
+- #8481: @dependabot[bot] chore(deps): bump psycopg2-binary from 2.9.11 to 2.9.12 in /tests/apps/dockerfile-release
+- #8479: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.23.0 to 0.23.1 in /plugins/scheduler-k3s
+- #8480: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.35.3 to 1.35.4 in /plugins/scheduler-k3s
+
+## 0.37.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.9/bootstrap.sh
+sudo DOKKU_TAG=v0.37.9 bash bootstrap.sh
+```
+
+### Dependencies
+
+- #8473: @dependabot[bot] chore(deps): bump k8s.io/api from 0.35.2 to 0.35.4 in /plugins/scheduler-k3s
+- #8474: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.22.5 to 0.23.0 in /plugins/scheduler-k3s
+- #8476: @dependabot[bot] chore(deps): bump github.com/go-acme/lego/v4 from 4.25.2 to 4.34.0 in /plugins/scheduler-k3s
+- #8475: @dependabot[bot] chore(deps): bump github.com/moby/spdystream from 0.5.0 to 0.5.1 in /plugins/scheduler-k3s
+
+## 0.37.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.8/bootstrap.sh
+sudo DOKKU_TAG=v0.37.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8451: @mykolasolodukha Fix client prepending `--app` for non-app commands
+
+### New Features
+
+- #8443: @chemicalkosek Add application/graphql-response+json to nginx gzip_types
+
+### Dependencies
+
+- #8470: @dependabot[bot] chore(deps): bump packaging from 26.0 to 26.1 in /docs/_build
+- #8471: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.35.0 to 1.35.3 in /plugins/scheduler-k3s
+- #8472: @dependabot[bot] chore(deps): bump k8s.io/apimachinery from 0.35.2 to 0.35.3 in /plugins/scheduler-k3s
+- #8413: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.24.0 to 1.28.0 in /plugins/scheduler-k3s
+- #8425: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.19.3 to 1.20.0 in /plugins/scheduler-k3s
+- #8469: @dependabot[bot] chore(deps): bump zipp from 3.23.0 to 3.23.1 in /docs/_build
+- #8450: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.13.0 to 3.13.1 in /plugins/cron
+- #8465: @dependabot[bot] chore(deps): bump github.com/joho/godotenv from 1.2.0 to 1.5.1 in /plugins/config
+- #8463: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.49.0 to 0.50.0 in /plugins/common
+- #8449: @dependabot[bot] chore(deps): bump click from 8.3.1 to 8.3.2 in /docs/_build
+- #8464: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.20.1 to 3.20.2 in /plugins/scheduler-k3s
+- #8458: @dependabot[bot] chore(deps): bump traefik from v3.6.12 to v3.6.13 in /plugins/traefik-vhosts
+- #8457: @dependabot[bot] chore(deps): bump golang from 1.26.1 to 1.26.2 in /tests/apps/zombies-dockerfile-no-tini
+- #8456: @dependabot[bot] chore(deps): bump golang from 1.26.1 to 1.26.2 in /tests/apps/go-fail-postdeploy
+- #8455: @dependabot[bot] chore(deps): bump golang from 1.26.1 to 1.26.2 in /tests/apps/gogrpc
+- #8454: @dependabot[bot] chore(deps): bump golang from 1.26.1 to 1.26.2 in /tests/apps/zombies-dockerfile-tini
+- #8453: @dependabot[bot] chore(deps): bump golang from 1.26.1 to 1.26.2 in /tests/apps/go-fail-predeploy
+- #8452: @dependabot[bot] chore(deps): bump rack-session from 2.1.1 to 2.1.2 in /tests/apps/ruby
+- #8459: @dependabot[bot] chore(deps): bump django from 5.2.12 to 5.2.13 in /tests/apps/dockerfile-release
+- #8444: @dependabot[bot] chore(deps): bump rack from 3.2.5 to 3.2.6 in /tests/apps/ruby
+- #8445: @dependabot[bot] chore(deps): bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 in /plugins/scheduler-k3s
+- #8447: @dependabot[bot] chore(deps): bump werkzeug from 3.1.7 to 3.1.8 in /tests/apps/python-flask
+- #8440: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.21 to 10.21.2 in /docs/_build
+- #8441: @dependabot[bot] chore(deps): bump pygments from 2.19.2 to 2.20.0 in /docs/_build
+- #8442: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.79.3 to 1.80.0 in /tests/apps/gogrpc
+- #8410: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.48.0 to 0.49.0 in /plugins/common
+- #8422: @dependabot[bot] chore(deps): bump github.com/fatih/color from 1.18.0 to 1.19.0 in /plugins/common
+- #8434: @dependabot[bot] chore(deps): bump gunicorn from 25.2.0 to 25.3.0 in /tests/apps/python-flask
+- #8439: @dependabot[bot] chore(deps): bump brace-expansion from 1.1.12 to 1.1.13 in /tests/apps/multi
+- #8438: @dependabot[bot] chore(deps): bump path-to-regexp from 8.2.0 to 8.4.0 in /tests/apps/checks-root
+- #8437: @dependabot[bot] chore(deps): bump gunicorn from 25.2.0 to 25.3.0 in /tests/apps/dockerfile-release
+- #8436: @dependabot[bot] chore(deps): bump traefik from v3.6.11 to v3.6.12 in /plugins/traefik-vhosts
+- #8435: @dependabot[bot] chore(deps): bump gunicorn from 25.2.0 to 25.3.0 in /tests/apps/multi
+- #8427: @dependabot[bot] chore(deps): bump werkzeug from 3.1.6 to 3.1.7 in /tests/apps/python-flask
+- #8428: @dependabot[bot] chore(deps): bump gunicorn from 25.1.0 to 25.2.0 in /tests/apps/multi
+- #8429: @dependabot[bot] chore(deps): bump gunicorn from 25.1.0 to 25.2.0 in /tests/apps/python-flask
+- #8430: @dependabot[bot] chore(deps): bump djangorestframework from 3.17.0 to 3.17.1 in /tests/apps/dockerfile-release
+- #8431: @dependabot[bot] chore(deps): bump gunicorn from 25.1.0 to 25.2.0 in /tests/apps/dockerfile-release
+- #8432: @dependabot[bot] chore(deps): bump picomatch from 2.3.1 to 2.3.2 in /tests/apps/multi
+- #8423: @dependabot[bot] chore(deps): bump traefik from v3.6.10 to v3.6.11 in /plugins/traefik-vhosts
+- #8420: @dependabot[bot] chore(deps): bump mkdocs-material from 9.7.5 to 9.7.6 in /docs/_build
+- #8421: @dependabot[bot] chore(deps): bump importlib-metadata from 8.8.0 to 9.0.0 in /docs/_build
+- #8424: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.40 to 2.11.41 in /plugins/scheduler-k3s
+- #8411: @dependabot[bot] chore(deps): bump lucaslorentz/caddy-docker-proxy from 2.11 to 2.12 in /plugins/caddy-vhosts
+- #8412: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.20.0 to 3.20.1 in /plugins/scheduler-k3s
+- #8419: @dependabot[bot] chore(deps): bump djangorestframework from 3.16.1 to 3.17.0 in /tests/apps/dockerfile-release
+- #8418: @dependabot[bot] chore(deps): bump importlib-metadata from 8.7.1 to 8.8.0 in /docs/_build
+- #8417: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.77.0-dev to 1.79.3 in /plugins/scheduler-k3s
+- #8416: @dependabot[bot] chore(deps): bump ruby from 4.0.1 to 4.0.2 in /tests/apps/dockerfile-entrypoint
+- #8415: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.79.2 to 1.79.3 in /tests/apps/gogrpc
+- #8409: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.22.4 to 0.22.5 in /plugins/scheduler-k3s
+- #8408: @dependabot[bot] chore(deps): bump github.com/go-resty/resty/v2 from 2.17.1 to 2.17.2 in /plugins/scheduler-k3s
+- #8407: @dependabot[bot] chore(deps): bump mkdocs-material from 9.7.4 to 9.7.5 in /docs/_build
+- #8406: @dependabot[bot] chore(deps): bump timberio/vector from 0.53.0-debian to 0.54.0-debian in /plugins/logs
+
+### Other
+
+- #8468: @josegonzalez chore: bump dependencies in tests/apps/php
+- #8467: @josegonzalez chore: upgrade traefik from v2.11.41 to v2.11.42
+- #8466: @josegonzalez chore: bump dependencies in tests/apps/multi
+
+## 0.37.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.7/bootstrap.sh
+sudo DOKKU_TAG=v0.37.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8379: @josegonzalez Call correct function for limiting letsencrypt to certain domains
+
+### New Features
+
+- #8405: @josegonzalez Add Debian 13 versions of docker plugin packages
+- #8261: @josegonzalez Configure Traefik readiness healthchecks based on app.json config
+- #8378: @farmdawgnation Support custom entrypoint for api and dashboard
+
+### Dependencies
+
+- #8395: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.12.0 to 3.13.0 in /plugins/cron
+- #8401: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.38 to 2.11.40 in /plugins/scheduler-k3s
+- #8400: @dependabot[bot] chore(deps): bump github.com/melbahja/goph from 1.4.0 to 1.5.0 in /plugins/common
+- #8394: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.47.0 to 0.48.0 in /plugins/common
+- #8396: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.19.0 to 0.20.0 in /plugins/common
+- #8399: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.19.0 to 0.20.0 in /plugins/scheduler-k3s
+- #8398: @dependabot[bot] chore(deps): bump traefik from 3.6.9 to v3.6.10 in /plugins/traefik-vhosts
+- #8397: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.19.0 to 0.20.0 in /plugins/scheduler-docker-local
+- #8314: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.39.0 to 1.39.1 in /plugins/common
+- #8380: @dependabot[bot] chore(deps): bump lucaslorentz/caddy-docker-proxy from 2.10 to 2.11 in /plugins/caddy-vhosts
+- #8381: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.35.0 to 0.35.2 in /plugins/scheduler-k3s
+- #8382: @dependabot[bot] chore(deps): bump docker/login-action from 3 to 4
+- #8383: @dependabot[bot] chore(deps): bump docker/setup-qemu-action from 3 to 4
+- #8384: @dependabot[bot] chore(deps): bump mkdocs-material from 9.7.3 to 9.7.4 in /docs/_build
+- #8385: @dependabot[bot] chore(deps): bump django from 5.2.11 to 5.2.12 in /tests/apps/dockerfile-release
+- #8387: @dependabot[bot] chore(deps): bump docker/setup-buildx-action from 3 to 4
+- #8388: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.79.1 to 1.79.2 in /tests/apps/gogrpc
+- #8389: @dependabot[bot] chore(deps): bump golang from 1.26.0 to 1.26.1 in /tests/apps/go-fail-postdeploy
+- #8390: @dependabot[bot] chore(deps): bump golang from 1.26.0 to 1.26.1 in /tests/apps/gogrpc
+- #8391: @dependabot[bot] chore(deps): bump golang from 1.26.0 to 1.26.1 in /tests/apps/go-fail-predeploy
+- #8392: @dependabot[bot] chore(deps): bump golang from 1.26.0 to 1.26.1 in /tests/apps/zombies-dockerfile-tini
+- #8393: @dependabot[bot] chore(deps): bump golang from 1.26.0 to 1.26.1 in /tests/apps/zombies-dockerfile-no-tini
+- #8354: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.78.0 to 1.79.1 in /tests/apps/gogrpc
+- #8340: @dependabot[bot] chore(deps): bump python from 3.14.2-alpine to 3.14.3-alpine in /docs/_build
+- #8353: @dependabot[bot] chore(deps): bump gunicorn from 25.0.2 to 25.1.0 in /tests/apps/multi
+- #8357: @dependabot[bot] chore(deps): bump qs from 6.14.1 to 6.14.2 in /tests/apps/checks-root
+- #8361: @dependabot[bot] chore(deps): bump flask from 3.1.2 to 3.1.3 in /tests/apps/multi
+- #8360: @dependabot[bot] chore(deps): bump rack from 3.2.4 to 3.2.5 in /tests/apps/ruby
+- #8332: @dependabot[bot] chore(deps-dev): bump org.apache.maven.plugins:maven-dependency-plugin from 3.9.0 to 3.10.0 in /tests/apps/java
+- #8336: @dependabot[bot] chore(deps): bump python from 3.14.2-bookworm to 3.14.3-bookworm in /tests/apps/dockerfile-release
+- #8355: @dependabot[bot] chore(deps): bump gunicorn from 25.0.2 to 25.1.0 in /tests/apps/python-flask
+- #8356: @dependabot[bot] chore(deps): bump gunicorn from 25.0.2 to 25.1.0 in /tests/apps/dockerfile-release
+- #8358: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.20.1 to 10.21 in /docs/_build
+- #8371: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 5.0.0 to 6.0.1 in /plugins/haproxy-vhosts
+- #8362: @dependabot[bot] chore(deps): bump flask from 3.1.2 to 3.1.3 in /tests/apps/python-flask
+- #8374: @dependabot[bot] chore(deps): bump actions/download-artifact from 7 to 8
+- #8375: @dependabot[bot] chore(deps): bump actions/upload-artifact from 6 to 7
+- #8376: @dependabot[bot] chore(deps): bump phusion/baseimage from noble-1.0.2 to noble-1.0.3
+- #8377: @dependabot[bot] chore(deps): bump whitenoise from 6.11.0 to 6.12.0 in /tests/apps/dockerfile-release
+- #8365: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.36 to 2.11.37 in /plugins/scheduler-k3s
+- #8367: @dependabot[bot] chore(deps): bump werkzeug from 3.1.5 to 3.1.6 in /tests/apps/python-flask
+- #8368: @dependabot[bot] chore(deps): bump dj-database-url from 3.1.0 to 3.1.2 in /tests/apps/dockerfile-release
+- #8372: @dependabot[bot] chore(deps): bump mkdocs-material from 9.7.1 to 9.7.3 in /docs/_build
+- #8373: @dependabot[bot] chore(deps): bump traefik from 3.6.7 to 3.6.9 in /plugins/traefik-vhosts
+- #8351: @dependabot[bot] chore(deps): bump golang from 1.25.6 to 1.26.0 in /tests/apps/zombies-dockerfile-tini
+- #8350: @dependabot[bot] chore(deps): bump golang from 1.25.6 to 1.26.0 in /tests/apps/zombies-dockerfile-no-tini
+- #8349: @dependabot[bot] chore(deps): bump golang from 1.25.6 to 1.26.0 in /tests/apps/go-fail-postdeploy
+- #8348: @dependabot[bot] chore(deps): bump golang from 1.25.6 to 1.26.0 in /tests/apps/gogrpc
+- #8347: @dependabot[bot] chore(deps): bump golang from 1.25.6 to 1.26.0 in /tests/apps/go-fail-predeploy
+- #8344: @dependabot[bot] chore(deps): bump sigs.k8s.io/kustomize/api from 0.21.0 to 0.21.1 in /plugins/scheduler-k3s
+- #8329: @dependabot[bot] chore(deps): bump gunicorn from 25.0.1 to 25.0.2 in /tests/apps/multi
+- #8330: @dependabot[bot] chore(deps): bump gunicorn from 25.0.1 to 25.0.2 in /tests/apps/python-flask
+- #8331: @dependabot[bot] chore(deps): bump gunicorn from 25.0.1 to 25.0.2 in /tests/apps/dockerfile-release
+- #8320: @dependabot[bot] chore(deps): bump django from 5.2.10 to 5.2.11 in /tests/apps/dockerfile-release
+- #8321: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.35 to 2.11.36 in /plugins/scheduler-k3s
+- #8319: @dependabot[bot] chore(deps): bump gunicorn from 24.1.1 to 25.0.1 in /tests/apps/dockerfile-release
+- #8318: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.19.2 to 1.19.3 in /plugins/scheduler-k3s
+- #8317: @dependabot[bot] chore(deps): bump gunicorn from 24.1.1 to 25.0.1 in /tests/apps/multi
+- #8316: @dependabot[bot] chore(deps): bump gunicorn from 24.1.1 to 25.0.1 in /tests/apps/python-flask
+
+## 0.37.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.6/bootstrap.sh
+sudo DOKKU_TAG=v0.37.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8306: @josegonzalez Ensure we can call storage:report properly
+
+### Documentation
+
+- #8289: @josegonzalez Add an architecture document for dokku
+- #8288: @josegonzalez Add a readme for the docs folder
+
+### Dependencies
+
+- #8312: @dependabot[bot] chore(deps): bump timberio/vector from 0.52.0-debian to 0.53.0-debian in /plugins/logs
+- #8311: @dependabot[bot] chore(deps): bump gunicorn from 24.0.0 to 24.1.1 in /tests/apps/dockerfile-release
+- #8308: @dependabot[bot] chore(deps): bump gunicorn from 24.0.0 to 24.1.1 in /tests/apps/multi
+- #8309: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.20 to 10.20.1 in /docs/_build
+- #8307: @dependabot[bot] chore(deps): bump gunicorn from 24.0.0 to 24.1.1 in /tests/apps/python-flask
+- #8301: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.19.5 to 3.20.0 in /plugins/scheduler-k3s
+- #8299: @dependabot[bot] chore(deps): bump ruby from 4.0.0 to 4.0.1 in /tests/apps/dockerfile-entrypoint
+- #8293: @dependabot[bot] chore(deps): bump golang from 1.25.5 to 1.25.6 in /tests/apps/zombies-dockerfile-no-tini
+- #8296: @dependabot[bot] chore(deps): bump soupsieve from 2.8.1 to 2.8.3 in /docs/_build
+- #8295: @dependabot[bot] chore(deps): bump golang from 1.25.5 to 1.25.6 in /tests/apps/go-fail-postdeploy
+- #8294: @dependabot[bot] chore(deps): bump golang from 1.25.5 to 1.25.6 in /tests/apps/gogrpc
+- #8291: @dependabot[bot] chore(deps): bump golang from 1.25.5 to 1.25.6 in /tests/apps/zombies-dockerfile-tini
+- #8292: @dependabot[bot] chore(deps): bump golang from 1.25.5 to 1.25.6 in /tests/apps/go-fail-predeploy
+- #8277: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.34 to 2.11.35 in /plugins/scheduler-k3s
+- #8297: @dependabot[bot] chore(deps): bump pyparsing from 3.3.1 to 3.3.2 in /docs/_build
+- #8298: @dependabot[bot] chore(deps): bump lodash from 4.17.21 to 4.17.23 in /tests/apps/multi
+- #8300: @dependabot[bot] chore(deps): bump packaging from 25.0 to 26.0 in /docs/_build
+- #8303: @dependabot[bot] chore(deps): bump gunicorn from 23.0.0 to 24.0.0 in /tests/apps/python-flask
+- #8305: @dependabot[bot] chore(deps): bump gunicorn from 23.0.0 to 24.0.0 in /tests/apps/dockerfile-release
+- #8304: @dependabot[bot] chore(deps): bump gunicorn from 23.0.0 to 24.0.0 in /tests/apps/multi
+- #8280: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.19.4 to 3.19.5 in /plugins/scheduler-k3s
+- #8279: @dependabot[bot] chore(deps): bump traefik from 3.6.6 to 3.6.7 in /plugins/traefik-vhosts
+
+## 0.37.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.5/bootstrap.sh
+sudo DOKKU_TAG=v0.37.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8274: @josegonzalez Delete the tls app chart when the app is deleted
+- #8273: @josegonzalez Ensure the destination directory exists when extracting files from a repository
+- #8263: @josegonzalez Set correct version for builder-railpack plugin
+
+### New Features
+
+- #8268: @josegonzalez Add the ability to log into a registry on a per-app basis
+- #8258: @josegonzalez Add support for dns-01 challenge mode when using traefik
+- #8262: @josegonzalez Use certificates imported by certs plugin when deploying via scheduler-k3s
+- #8266: @josegonzalez Add a method to force build when re-using an image with git:from-image
+- #8265: @josegonzalez Add the ability to skip setting the deploy-branch when running git:sync
+
+### Refactors
+
+- #8264: @josegonzalez Rewrite the storage plugin in golang
+
+### Dependencies
+
+- #8270: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.38.3 to 1.39.0 in /plugins/common
+- #8267: @dependabot[bot] chore(deps): bump werkzeug from 3.1.4 to 3.1.5 in /tests/apps/python-flask
+- #8260: @dependabot[bot] chore(deps): bump django from 5.2.9 to 5.2.10 in /tests/apps/dockerfile-release
+- #8256: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.9.0 to 0.10.0
+- #8257: @dependabot[bot] chore(deps): bump dj-database-url from 3.0.1 to 3.1.0 in /tests/apps/dockerfile-release
+
+## 0.37.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.4/bootstrap.sh
+sudo DOKKU_TAG=v0.37.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8168: @josegonzalez Install logrotate in the container
+
+### Tests
+
+- #8254: @josegonzalez Add a test to prove cron:run commands work as expected
+- #8255: @josegonzalez Update test ruby app
+
+### Dependencies
+
+- #8252: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.19.1 to 10.20 in /docs/_build
+- #8253: @dependabot[bot] chore(deps): bump qs from 6.14.0 to 6.14.1 in /tests/apps/checks-root
+- #8249: @dependabot[bot] chore(deps): bump traefik from 3.6.5 to 3.6.6 in /plugins/traefik-vhosts
+- #8250: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.33 to 2.11.34 in /plugins/scheduler-k3s
+- #8247: @dependabot[bot] chore(deps): bump ruby from 3.4.8 to 4.0.0 in /tests/apps/dockerfile-entrypoint
+
+### Other
+
+- #8248: @osbre Add `proxy-keepalive` to Nginx properties
+
+## 0.37.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.3/bootstrap.sh
+sudo DOKKU_TAG=v0.37.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8199: @josegonzalez Pass global build args as array when building nixpacks apps
+- #8236: @josegonzalez Ensure the /etc/docker exists when interacting with it via postinst
+
+### Documentation
+
+- #8229: @kleutzinger Fix command syntax for removing docker options
+- #8219: @deanmarano Add deanmarano to community plugins list
+- #8205: @deanmarano Add DNS plugin to community plugins list
+
+### Tests
+
+- #8246: @josegonzalez Add tests to prove that Procfile tasks all work for every builder
+
+### Dependencies
+
+- #8243: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.34.2 to 0.35.0 in /plugins/scheduler-k3s
+- #8245: @dependabot[bot] chore(deps): bump github.com/go-resty/resty/v2 from 2.17.0 to 2.17.1 in /plugins/scheduler-k3s
+- #8244: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.34.2 to 1.35.0 in /plugins/scheduler-k3s
+- #8233: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.38.2 to 1.38.3 in /plugins/common
+- #8241: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.32 to 2.11.33 in /plugins/scheduler-k3s
+- #8240: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.19.1 to 1.19.2 in /plugins/scheduler-k3s
+- #8239: @dependabot[bot] chore(deps): bump pyparsing from 3.2.5 to 3.3.1 in /docs/_build
+- #8238: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.77.0 to 1.78.0 in /tests/apps/gogrpc
+- #8237: @dependabot[bot] chore(deps): bump github.com/kedacore/keda/v2 from 2.18.2 to 2.18.3 in /plugins/scheduler-k3s
+- #8235: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.19.2 to 3.19.4 in /plugins/scheduler-k3s
+- #8232: @dependabot[bot] chore(deps): bump importlib-metadata from 8.7.0 to 8.7.1 in /docs/_build
+- #8234: @dependabot[bot] chore(deps): bump k8s.io/client-go from 0.34.2 to 0.35.0 in /plugins/scheduler-k3s
+- #8231: @dependabot[bot] chore(deps): bump github.com/expr-lang/expr from 1.17.6 to 1.17.7 in /plugins/scheduler-k3s
+- #8208: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.45.0 to 0.46.0 in /plugins/common
+- #8201: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.18.0 to 0.19.0 in /plugins/common
+- #8214: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.10 to 1.36.11 in /tests/apps/gogrpc
+- #8216: @dependabot[bot] chore(deps): bump actions/download-artifact from 6 to 7
+- #8217: @dependabot[bot] chore(deps): bump actions/upload-artifact from 5 to 6
+- #8228: @dependabot[bot] chore(deps): bump soupsieve from 2.8 to 2.8.1 in /docs/_build
+- #8226: @dependabot[bot] chore(deps): bump ruby from 3.4.7 to 3.4.8 in /tests/apps/dockerfile-entrypoint
+- #8227: @dependabot[bot] chore(deps): bump mkdocs-material from 9.7.0 to 9.7.1 in /docs/_build
+- #8224: @dependabot[bot] chore(deps): bump traefik from 3.6.4 to 3.6.5 in /plugins/traefik-vhosts
+- #8225: @dependabot[bot] chore(deps): bump timberio/vector from 0.51.1-debian to 0.52.0-debian in /plugins/logs
+- #8220: @dependabot[bot] chore(deps): bump python from 3.14.1-bookworm to 3.14.2-bookworm in /tests/apps/dockerfile-release
+- #8221: @dependabot[bot] chore(deps): bump python from 3.14.1-alpine to 3.14.2-alpine in /docs/_build
+- #8218: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.19 to 10.19.1 in /docs/_build
+- #8215: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.18 to 10.19 in /docs/_build
+- #8209: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.38.2 to 1.38.3 in /plugins/config
+- #8210: @dependabot[bot] chore(deps): bump github.com/kedacore/keda/v2 from 2.18.1 to 2.18.2 in /plugins/scheduler-k3s
+- #8211: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.22.3 to 0.22.4 in /plugins/scheduler-k3s
+- #8200: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.17.2 to 10.18 in /docs/_build
+- #8202: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.18.0 to 0.19.0 in /plugins/scheduler-docker-local
+- #8203: @dependabot[bot] chore(deps): bump traefik from 3.6.2 to 3.6.4 in /plugins/traefik-vhosts
+- #8204: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.18.0 to 0.19.0 in /plugins/scheduler-k3s
+
+## 0.37.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.2/bootstrap.sh
+sudo DOKKU_TAG=v0.37.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8198: @josegonzalez Ensure we continue on with logic if the error returned from fetching all apps is NoAppsExist
+
+### Dependencies
+
+- #8196: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 4.6.0 to 5.0.0 in /plugins/haproxy-vhosts
+- #8197: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.31 to 2.11.32 in /plugins/scheduler-k3s
+
+## 0.37.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.1/bootstrap.sh
+sudo DOKKU_TAG=v0.37.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8186: @josegonzalez Update url to download golang
+- #8155: @josegonzalez Sanitize vector sink values in report output
+- #8156: @josegonzalez Do not start nginx if there are no apps with nginx as a proxy
+- #8152: @josegonzalez Ensure keda usage does not cause jank in scaling deployments
+
+### New Features
+
+- #8154: @josegonzalez Enable live-restore by default when installing Dokku
+- #8151: @josegonzalez Allow exposing non-web processes as kubernetes services
+
+### Refactors
+
+- #8149: @josegonzalez Remove nginx checks for functionality that always exists
+
+### Documentation
+
+- #8170: @znz Fix version in migration docs
+- #8169: @josegonzalez Update logging in doc generation to enhance doc generation debugging
+- #8153: @josegonzalez Fix reference to letsencrypt-server property
+- #8150: @josegonzalez Clarify system requirements for k3s usage
+- #8148: @josegonzalez Clarify plugin installation documentation
+
+### Dependencies
+
+- #8192: @dependabot[bot] chore(deps): bump golang from 1.25.4 to 1.25.5 in /tests/apps/go-fail-predeploy
+- #8191: @dependabot[bot] chore(deps): bump golang from 1.25.4 to 1.25.5 in /tests/apps/go-fail-postdeploy
+- #8189: @dependabot[bot] chore(deps): bump golang from 1.25.4 to 1.25.5 in /tests/apps/gogrpc
+- #8193: @dependabot[bot] chore(deps): bump python from 3.14.0-alpine to 3.14.1-alpine in /docs/_build
+- #8190: @dependabot[bot] chore(deps): bump golang from 1.25.4 to 1.25.5 in /tests/apps/zombies-dockerfile-no-tini
+- #8188: @dependabot[bot] chore(deps): bump golang from 1.25.4 to 1.25.5 in /tests/apps/zombies-dockerfile-tini
+- #8194: @dependabot[bot] chore(deps): bump python from 3.14.0-bookworm to 3.14.1-bookworm in /tests/apps/dockerfile-release
+- #8195: @dependabot[bot] chore(deps): bump django from 5.2.8 to 5.2.9 in /tests/apps/dockerfile-release
+- #8177: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/nodejs-express-noprocfile
+- #8178: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/dockerfile-procfile-bad
+- #8179: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/nodejs-express
+- #8180: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/dockerfile-procfile
+- #8181: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/gitsubmodules
+- #8183: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/checks-root
+- #8182: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/nodejs-express-noappjson
+- #8184: @dependabot[bot] chore(deps): bump express from 5.1.0 to 5.2.1 in /tests/apps/dockerfile-app-json-formations
+- #8172: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.14.2 to 4.14.3 in /docs/_build
+- #8173: @dependabot[bot] chore(deps): bump werkzeug from 3.1.3 to 3.1.4 in /tests/apps/python-flask
+- #8164: @dependabot[bot] chore(deps): bump body-parser from 2.2.0 to 2.2.1 in /tests/apps/checks-root
+- #8165: @dependabot[bot] chore(deps): bump github.com/go-resty/resty/v2 from 2.16.5 to 2.17.0 in /plugins/scheduler-k3s
+- #8167: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.17.1 to 10.17.2 in /docs/_build
+- #8162: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.30 to 2.11.31 in /plugins/scheduler-k3s
+- #8161: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.23.0 to 1.24.0 in /plugins/scheduler-k3s
+- #8159: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.19.0 to 3.19.2 in /plugins/scheduler-k3s
+- #8158: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.34.1 to 1.34.2 in /plugins/scheduler-k3s
+- #8143: @dependabot[bot] chore(deps): bump actions/checkout from 5 to 6
+- #8145: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.22.1 to 0.22.3 in /plugins/scheduler-k3s
+- #8146: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.34.1 to 0.34.2 in /plugins/scheduler-k3s
+- #8144: @dependabot[bot] chore(deps): bump traefik from 3.6.1 to 3.6.2 in /plugins/traefik-vhosts
+
+## 0.37.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.37.0/bootstrap.sh
+sudo DOKKU_TAG=v0.37.0 bash bootstrap.sh
+```
+
+See the [0.37.0 migration guide](/docs/appendices/0.37.0-migration-guide.md) for more information on migrating to 0.37.0.
+
+### Backwards Compatibility Breaks
+
+- #8140: @josegonzalez Rename the scheduler-k3s:cluster-* commands to use a : instead of - for a delimiter
+- #7982: @josegonzalez Remove references to pack being experimental
+
+### Bug Fixes
+
+- #8136: @josegonzalez Do not reset manually set port mappings when upgrading dokku
+- #8114: @josegonzalez Ensure we can execute run commands when exec is executed as part of an entrypoint
+- #8109: @josegonzalez Allow skipping the install trigger when installing a plugin
+- #8104: @josegonzalez Drop deprecated aufs check
+- #8100: @othercorey Add process-type label for run with procfile cmd
+
+### New Features
+
+- #8139: @josegonzalez Add aliases for select builder and scheduler plugins
+- #8138: @josegonzalez Turn on buildpack trace mode when dokku trace is on
+- #8137: @josegonzalez Add the ability to create k3s node profiles
+- #8135: @josegonzalez Add support for git remotes with port specified inline
+- #8112: @josegonzalez Implement cron and one-off run task TTLs
+- #8106: @josegonzalez Support inline comments for app.json
+- #8105: @josegonzalez Allow specifying kubelet-args when adding a new node to the cluster
+- #8085: @josegonzalez Implement config:import command
+- #8004: @Tashows Add buildpacks:detect subcommand
+- #7991: @josegonzalez Add ability to pause/restart cron jobs
+- #7989: @josegonzalez Add support to prevent overlapping execution of cron tasks
+- #7986: @josegonzalez Add support for specifying CNB buildpacks via buildpacks command
+- #7956: @josegonzalez Add a Railpack builder to Dokku
+- #7608: @dragonhunt02 Add commands to proxy implementations for managing labels
+
+### Refactors
+
+- #8101: @josegonzalez Filter build docker-options correctly for each builder
+
+### Documentation
+
+- #8103: @josegonzalez Correct the release version for railpacks support
+
+### Dependencies
+
+- #8130: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.43.0 to 0.45.0 in /plugins/common
+- #8110: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.76.0 to 1.77.0 in /tests/apps/gogrpc
+- #8108: @dependabot[bot] chore(deps): bump js-yaml from 3.14.1 to 3.14.2 in /tests/apps/multi
+- #8107: @dependabot[bot] chore(deps): bump click from 8.3.0 to 8.3.1 in /docs/_build
+- #8098: @dependabot[bot] chore(deps): bump traefik from 3.5.4 to 3.6.1 in /plugins/traefik-vhosts
+- #8097: @dependabot[bot] chore(deps): bump timberio/vector from 0.51.0-debian to 0.51.1-debian in /plugins/logs
+- #8094: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.16.1 to 10.17.1 in /docs/_build
+- #8092: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.23 to 9.7.0 in /docs/_build
+- #8090: @dependabot[bot] chore(deps): bump sigs.k8s.io/kustomize/api from 0.20.1 to 0.21.0 in /plugins/scheduler-k3s
+
+## 0.36.11
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.11/bootstrap.sh
+sudo DOKKU_TAG=v0.36.11 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8084: @josegonzalez Use the correct case for AS in Dockerfile
+- #8083: @josegonzalez Use correct variable for tasks
+- #8081: @josegonzalez Error out if the appname or app.json is missing when retrieving cron entries
+
+### Refactors
+
+- #8082: @josegonzalez Standardize naming in cron code
+
+### Dependencies
+
+- #8073: @dependabot[bot] chore(deps): bump timberio/vector from 0.50.0-debian to 0.51.0-debian in /plugins/logs
+- #8080: @dependabot[bot] chore(deps): bump github.com/containerd/containerd from 1.7.28 to 1.7.29 in /plugins/scheduler-k3s
+- #8079: @dependabot[bot] chore(deps): bump golang from 1.25.3 to 1.25.4 in /tests/apps/zombies-dockerfile-tini
+- #8075: @dependabot[bot] chore(deps): bump golang from 1.25.3 to 1.25.4 in /tests/apps/go-fail-postdeploy
+- #8078: @dependabot[bot] chore(deps): bump golang from 1.25.3 to 1.25.4 in /tests/apps/go-fail-predeploy
+- #8077: @dependabot[bot] chore(deps): bump golang from 1.25.3 to 1.25.4 in /tests/apps/zombies-dockerfile-no-tini
+- #8076: @dependabot[bot] chore(deps): bump golang from 1.25.3 to 1.25.4 in /tests/apps/gogrpc
+- #8072: @dependabot[bot] chore(deps): update markdown requirement from <3.10,>=3.2.1 to >=3.2.1,<3.11 in /docs/_build
+- #8074: @dependabot[bot] chore(deps): bump django from 5.2.7 to 5.2.8 in /tests/apps/dockerfile-release
+- #8071: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.22 to 9.6.23 in /docs/_build
+- #8068: @dependabot[bot] chore(deps): bump traefik from 3.5.3 to 3.5.4 in /plugins/traefik-vhosts
+- #8069: @dependabot[bot] chore(deps): bump github.com/kedacore/keda/v2 from 2.18.0 to 2.18.1 in /plugins/scheduler-k3s
+- #8066: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.29 to 2.11.30 in /plugins/scheduler-k3s
+
+## 0.36.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.10/bootstrap.sh
+sudo DOKKU_TAG=v0.36.10 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8063: @othercorey Use -t instead of deprecated --time in stop commands
+- #8058: @josegonzalez Ensure the pre-receive hook and URLS files are correct when cloning or renaming apps
+- #8059: @josegonzalez Expand variables for release tasks
+- #8060: @josegonzalez Use updated http2 directive for setting http2 support
+
+### Documentation
+
+- #8051: @othercorey Fix "its" in Caddy SSL configuration documentation
+
+### Dependencies
+
+- #8065: @dependabot[bot] chore(deps): bump actions/upload-artifact from 4 to 5
+- #8064: @dependabot[bot] chore(deps): bump actions/download-artifact from 5 to 6
+- #8057: @dependabot[bot] chore(deps): bump node from 24-alpine to 25-alpine in /tests/apps/dockerfile-procfile-bad
+- #8056: @dependabot[bot] chore(deps): bump node from 24-alpine to 25-alpine in /tests/apps/dockerfile-app-json-formations
+- #8055: @dependabot[bot] chore(deps): bump node from 24-alpine to 25-alpine in /tests/apps/dockerfile-procfile
+- #8054: @dependabot[bot] chore(deps): bump node from 24-alpine to 25-alpine in /tests/apps/dockerfile
+- #8053: @dependabot[bot] chore(deps): bump node from 24-alpine to 25-alpine in /tests/apps/dockerfile-noexpose
+
+## 0.36.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.9/bootstrap.sh
+sudo DOKKU_TAG=v0.36.9 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8032: @josegonzalez Set correct labels for tests/apps/dockerfile-release pip updates
+
+### New Features
+
+- #8047: @josegonzalez Add ability to disable letsencrypt for a given application or globally
+
+### Dependencies
+
+- #8049: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.19.0 to 1.19.1 in /plugins/scheduler-k3s
+- #8048: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.21 to 9.6.22 in /docs/_build
+- #8042: @dependabot[bot] chore(deps): bump django from 5.1.13 to 5.2.7 in /tests/apps/dockerfile-release
+- #8043: @dependabot[bot] chore(deps): bump whitenoise from 6.2.0 to 6.11.0 in /tests/apps/dockerfile-release
+- #8044: @dependabot[bot] chore(deps): bump djangorestframework from 3.15.2 to 3.16.1 in /tests/apps/dockerfile-release
+- #8045: @dependabot[bot] chore(deps): bump psycopg2-binary from 2.9.5 to 2.9.11 in /tests/apps/dockerfile-release
+- #8046: @dependabot[bot] chore(deps): bump dj-database-url from 1.0.0 to 3.0.1 in /tests/apps/dockerfile-release
+- #8041: @dependabot[bot] chore(deps): bump golang from 1.25.2 to 1.25.3 in /tests/apps/gogrpc
+- #8040: @dependabot[bot] chore(deps): bump golang from 1.25.2 to 1.25.3 in /tests/apps/go-fail-predeploy
+- #8039: @dependabot[bot] chore(deps): bump golang from 1.25.2 to 1.25.3 in /tests/apps/zombies-dockerfile-no-tini
+- #8037: @dependabot[bot] chore(deps): bump golang from 1.25.2 to 1.25.3 in /tests/apps/go-fail-postdeploy
+- #8038: @dependabot[bot] chore(deps): bump golang from 1.25.2 to 1.25.3 in /tests/apps/zombies-dockerfile-tini
+- #8036: @dependabot[bot] chore(deps): bump actions/setup-node from 5 to 6
+- #8033: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.12.1 to 0.13.0 in /plugins/scheduler-k3s
+- #8034: @dependabot[bot] chore(deps): bump github.com/kedacore/keda/v2 from 2.17.1-0.20250708210620-a239d2459a35 to 2.18.0 in /plugins/scheduler-k3s
+
+## 0.36.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.8/bootstrap.sh
+sudo DOKKU_TAG=v0.36.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #8031: @josegonzalez Respect the k3s master node version when adding a new worker to the k3s cluster
+- #7990: @josegonzalez Correct parsing of the --container-id flag for the enter command
+
+### Documentation
+
+- #8013: @othercorey Change command to add SSH key with sudo
+- #7998: @bakatz Remove incorrect documentation about --envfile flag for config:export
+
+### Dependencies
+
+- #8028: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.42.0 to 0.43.0 in /plugins/common
+- #8015: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.18.2 to 1.19.0 in /plugins/scheduler-k3s
+- #8029: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.12.1 to 0.13.0 in /plugins/ps
+- #8011: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.8.1 to 3.9.0 in /tests/apps/java
+- #8012: @dependabot[bot] chore(deps): bump click from 8.1.8 to 8.3.0 in /docs/_build
+- #8014: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.75.1 to 1.76.0 in /tests/apps/gogrpc
+- #8018: @dependabot[bot] chore(deps): bump github/codeql-action from 3 to 4
+- #8019: @dependabot[bot] chore(deps): bump golang from 1.25.1 to 1.25.2 in /tests/apps/zombies-dockerfile-no-tini
+- #8020: @dependabot[bot] chore(deps): bump golang from 1.25.1 to 1.25.2 in /tests/apps/go-fail-predeploy
+- #8021: @dependabot[bot] chore(deps): bump python from 3.13.7-bookworm to 3.14.0-bookworm in /tests/apps/dockerfile-release
+- #8022: @dependabot[bot] chore(deps): bump golang from 1.25.1 to 1.25.2 in /tests/apps/gogrpc
+- #8024: @dependabot[bot] chore(deps): bump golang from 1.25.1 to 1.25.2 in /tests/apps/zombies-dockerfile-tini
+- #8023: @dependabot[bot] chore(deps): bump golang from 1.25.1 to 1.25.2 in /tests/apps/go-fail-postdeploy
+- #8025: @dependabot[bot] chore(deps): bump python from 3.13.7-alpine to 3.14.0-alpine in /docs/_build
+- #8026: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.22.0 to 1.23.0 in /plugins/scheduler-k3s
+- #8027: @dependabot[bot] chore(deps): bump ruby from 3.4.6 to 3.4.7 in /tests/apps/dockerfile-entrypoint
+- #8030: @dependabot[bot] chore(deps): bump rack from 2.2.19 to 2.2.20 in /tests/apps/ruby
+- #8016: @dependabot[bot] chore(deps): bump rack from 2.2.18 to 2.2.19 in /tests/apps/ruby
+- #8009: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.9 to 1.36.10 in /tests/apps/gogrpc
+- #7994: @dependabot[bot] chore(deps): bump timberio/vector from 0.49.0-debian to 0.50.0-debian in /plugins/logs
+- #8006: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.20 to 9.6.21 in /docs/_build
+- #8003: @dependabot[bot] chore(deps): bump traefik from 3.5.2 to 3.5.3 in /plugins/traefik-vhosts
+- #7996: @dependabot[bot] chore(deps): bump pyyaml from 6.0.2 to 6.0.3 in /docs/_build
+- #8000: @dependabot[bot] chore(deps): bump markupsafe from 3.0.2 to 3.0.3 in /docs/_build
+- #8001: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.13.5 to 4.14.2 in /docs/_build
+- #8002: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.22.0 to 0.22.1 in /plugins/scheduler-k3s
+- #7995: @dependabot[bot] chore(deps): bump rack from 2.2.17 to 2.2.18 in /tests/apps/ruby
+- #7992: @dependabot[bot] chore(deps): bump hadolint/hadolint-action from 3.2.0 to 3.3.0
+- #7993: @dependabot[bot] chore(deps): bump pyparsing from 3.2.4 to 3.2.5 in /docs/_build
+- #7987: @dependabot[bot] chore(deps): bump ruby from 3.4.5 to 3.4.6 in /tests/apps/dockerfile-entrypoint
+- #7983: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.34.0 to 1.34.1 in /plugins/scheduler-k3s
+- #7984: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.19 to 9.6.20 in /docs/_build
+- #7985: @dependabot[bot] chore(deps): bump pyparsing from 3.2.3 to 3.2.4 in /docs/_build
+
+### Other
+
+- #8008: @dependabot[bot] chore(deps): bump django from 5.1.12 to 5.1.13 in /tests/apps/dockerfile-release
+
+## 0.36.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.7/bootstrap.sh
+sudo DOKKU_TAG=v0.36.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7981: @josegonzalez Only install software-properties-common on Ubuntu and older Debian installations
+- #7979: @josegonzalez Skip invalid apps when listing applications
+- #7977: @kminek Remove server_tokens directive from main nginx config if present (comâĻ
+- #7974: @josegonzalez Ensure lsb_release is available on debian systems
+
+### New Features
+
+- #7978: @josegonzalez Add ability to list global cron tasks
+- #7975: @josegonzalez Create SecurityContext for k3s scheduler from docker-options
+
+### Dependencies
+
+- #7972: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.34.0 to 0.34.1 in /plugins/scheduler-k3s
+- #7973: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.18.6 to 3.19.0 in /plugins/scheduler-k3s
+- #7971: @dependabot[bot] chore(deps): bump k8s.io/client-go from 0.34.0 to 0.34.1 in /plugins/scheduler-k3s
+- #7970: @dependabot[bot] chore(deps): bump k8s.io/api from 0.34.0 to 0.34.1 in /plugins/scheduler-k3s
+- #7966: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.19.0 to 1.22.0 in /plugins/scheduler-k3s
+- #7963: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.75.0 to 1.75.1 in /tests/apps/gogrpc
+- #7964: @dependabot[bot] chore(deps): bump traefik from 3.5.1 to 3.5.2 in /plugins/traefik-vhosts
+- #7965: @dependabot[bot] chore(deps): bump k8s.io/apimachinery from 0.34.0 to 0.34.1 in /plugins/scheduler-k3s
+- #7961: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.41.0 to 0.42.0 in /plugins/common
+- #7960: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.8 to 1.36.9 in /tests/apps/gogrpc
+
+### Other
+
+- #7968: @josegonzalez chore: bump herokuish version from 0.11.0 to 0.11.3
+- #7962: @dependabot[bot] chore(deps): bump django from 5.1.10 to 5.1.12 in /tests/apps/dockerfile-release
+
+## 0.36.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.6/bootstrap.sh
+sudo DOKKU_TAG=v0.36.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7955: @josegonzalez Ensure that the nixpacks bin is installed in /usr/bin/nixpacks in Docker image
+- #7953: @josegonzalez Set correct label for nixpacks builder
+- #7942: @josegonzalez Ensure the code is copied over to the new app on clone or rebase
+- #7941: @josegonzalez Do not generate an https url when there is no SSL certificate
+- #7940: @josegonzalez Silence openresty extract warnings during the deploy process
+
+### Tests
+
+- #7954: @josegonzalez Respect DOKKU_DOMAIN when deploying in tests
+- #7943: @josegonzalez Remove unused test app
+- #7939: @josegonzalez Add test for ensuring run commands work with pack-based builds
+
+### Dependencies
+
+- #7958: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.18.5 to 3.18.6 in /plugins/scheduler-k3s
+- #7952: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.16.0 to 0.17.0 in /plugins/common
+- #7951: @dependabot[bot] chore(deps): bump golang from 1.25.0 to 1.25.1 in /tests/apps/gogrpc
+- #7950: @dependabot[bot] chore(deps): bump golang from 1.25.0 to 1.25.1 in /tests/apps/go-fail-postdeploy
+- #7949: @dependabot[bot] chore(deps): bump golang from 1.25.0 to 1.25.1 in /tests/apps/zombies-dockerfile-no-tini
+- #7947: @dependabot[bot] chore(deps): bump golang from 1.25.0 to 1.25.1 in /tests/apps/zombies-dockerfile-tini
+- #7945: @dependabot[bot] chore(deps): bump golang from 1.25.0 to 1.25.1 in /tests/apps/go-fail-predeploy
+- #7946: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.18 to 9.6.19 in /docs/_build
+
+## 0.36.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.5/bootstrap.sh
+sudo DOKKU_TAG=v0.36.5 bash bootstrap.sh
+```
+
+### New Features
+
+- #7937: @josegonzalez Add support for Debian Trixie
+
+## 0.36.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.4/bootstrap.sh
+sudo DOKKU_TAG=v0.36.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7914: @josegonzalez Fix nginx configuration building in k3s scheduler
+
+### Dependencies
+
+- #7935: @dependabot[bot] chore(deps): update markdown requirement from <3.9,>=3.2.1 to >=3.2.1,<3.10 in /docs/_build
+- #7936: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.21.2 to 0.22.0 in /plugins/scheduler-k3s
+- #7931: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.28 to 2.11.29 in /plugins/scheduler-k3s
+- #7932: @dependabot[bot] chore(deps): bump actions/setup-python from 5 to 6
+- #7933: @dependabot[bot] chore(deps): bump actions/setup-node from 4 to 5
+- #7934: @dependabot[bot] chore(deps): bump hadolint/hadolint-action from 3.1.0 to 3.2.0
+- #7920: @dependabot[bot] chore(deps): bump github.com/spf13/pflag from 1.0.9 to 1.0.10 in /plugins/common
+- #7887: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.38.0 to 1.38.2 in /plugins/common
+- #7847: @dependabot[bot] chore(deps): bump timberio/vector from 0.48.0-debian to 0.49.0-debian in /plugins/logs
+- #7890: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.33.2 to 1.34.0 in /plugins/scheduler-k3s
+- #7881: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 4.5.0 to 4.6.0 in /plugins/haproxy-vhosts
+- #7880: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.13.4 to 4.13.5 in /docs/_build
+- #7888: @dependabot[bot] chore(deps): bump soupsieve from 2.7 to 2.8 in /docs/_build
+- #7902: @dependabot[bot] chore(deps): bump github.com/spf13/pflag from 1.0.7 to 1.0.9 in /plugins/common
+- #7891: @dependabot[bot] chore(deps): bump k8s.io/kubectl from 0.33.3 to 0.34.0 in /plugins/scheduler-k3s
+- #7895: @dependabot[bot] chore(deps): bump traefik from 3.5.0 to 3.5.1 in /plugins/traefik-vhosts
+
+## 0.36.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.3/bootstrap.sh
+sudo DOKKU_TAG=v0.36.3 bash bootstrap.sh
+```
+
+### New Features
+
+- #7878: @josegonzalez Allow specifying base64-encoded values in vector-sink DSN urls
+
+### Dependencies
+
+- #7873: @dependabot[bot] chore(deps): bump github.com/go-openapi/jsonpointer from 0.21.1 to 0.21.2 in /plugins/scheduler-k3s
+- #7874: @dependabot[bot] chore(deps): bump k8s.io/api from 0.33.3 to 0.33.4 in /plugins/scheduler-k3s
+- #7875: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.17 to 9.6.18 in /docs/_build
+
+## 0.36.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.2/bootstrap.sh
+sudo DOKKU_TAG=v0.36.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7872: @josegonzalez Correct issues when scaling non-web processes for the scheduler-k3s plugin
+
+### Refactors
+
+- #7871: @josegonzalez Remove public exposure of DOKKU_APP_TYPE in favor of builder detected property
+
+### Dependencies
+
+- #7868: @dependabot[bot] chore(deps): bump grunt-cli from 1.4.3 to 1.5.0 in /tests/apps/multi
+- #7869: @dependabot[bot] chore(deps): bump bower from 1.8.12 to 1.8.14 in /tests/apps/multi
+- #7870: @dependabot[bot] chore(deps): bump tmp from 0.2.4 to 0.2.5 in /tests/apps/multi
+- #7867: @dependabot[bot] chore(deps): bump grunt from 1.5.3 to 1.6.1 in /tests/apps/multi
+- #7866: @dependabot[bot] chore(deps): bump github.com/fluxcd/pkg/kustomize from 1.18.0 to 1.19.0 in /plugins/scheduler-k3s
+- #7862: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.7 to 1.36.8 in /tests/apps/gogrpc
+
+### Other
+
+- #7864: @josegonzalez chore(deps): add dependabot entries for plugins/scheduler-k3s and tests/apps/multi
+
+## 0.36.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.1/bootstrap.sh
+sudo DOKKU_TAG=v0.36.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7846: @josegonzalez Correct issue in parsing escaped plus signs in vector sink values
+- #7841: @leksyib14 Fix handling of equals sign in vector sink values
+- #7844: @josegonzalez Do not change permissions on config directory symlinks
+
+### Tests
+
+- #7848: @josegonzalez Ensure tests properly fetch data from json output
+- #7845: @josegonzalez Use the official github actions arm64 runner
+
+### Dependencies
+
+- #7861: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.74.2 to 1.75.0 in /tests/apps/gogrpc
+- #7860: @dependabot[bot] chore(deps): bump flask from 3.1.1 to 3.1.2 in /tests/apps/python-flask
+- #7859: @dependabot[bot] chore(deps): bump flask from 3.1.1 to 3.1.2 in /tests/apps/multi
+- #7856: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.16 to 9.6.17 in /docs/_build
+- #7857: @dependabot[bot] chore(deps): bump python from 3.13.6-alpine to 3.13.7-alpine in /docs/_build
+- #7858: @dependabot[bot] chore(deps): bump python from 3.13.6-bookworm to 3.13.7-bookworm in /tests/apps/dockerfile-release
+- #7855: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.25 to 11.0.26 in /tests/apps/java
+- #7849: @dependabot[bot] chore(deps): bump golang from 1.24.6 to 1.25.0 in /tests/apps/zombies-dockerfile-tini
+- #7850: @dependabot[bot] chore(deps): bump golang from 1.24.6 to 1.25.0 in /tests/apps/go-fail-predeploy
+- #7851: @dependabot[bot] chore(deps): bump golang from 1.24.6 to 1.25.0 in /tests/apps/go-fail-postdeploy
+- #7852: @dependabot[bot] chore(deps): bump golang from 1.24.6 to 1.25.0 in /tests/apps/gogrpc
+- #7853: @dependabot[bot] chore(deps): bump golang from 1.24.6 to 1.25.0 in /tests/apps/zombies-dockerfile-no-tini
+- #7842: @dependabot[bot] chore(deps): bump actions/checkout from 4 to 5
+- #7821: @dependabot[bot] chore(deps): bump traefik from 3.4.4 to 3.5.0 in /plugins/traefik-vhosts
+- #7843: @josegonzalez Bump go modules
+- #7824: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.15 to 9.6.16 in /docs/_build
+- #7823: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.16 to 10.16.1 in /docs/_build
+- #7831: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.6 to 1.36.7 in /tests/apps/gogrpc
+- #7839: @dependabot[bot] chore(deps): bump python from 3.13.5-bookworm to 3.13.6-bookworm in /tests/apps/dockerfile-release
+- #7838: @dependabot[bot] chore(deps): bump python from 3.13.5-alpine to 3.13.6-alpine in /docs/_build
+- #7837: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.40.0 to 0.41.0 in /plugins/common
+- #7836: @dependabot[bot] chore(deps): bump golang from 1.24.5 to 1.24.6 in /tests/apps/zombies-dockerfile-tini
+- #7835: @dependabot[bot] chore(deps): bump golang from 1.24.5 to 1.24.6 in /tests/apps/zombies-dockerfile-no-tini
+- #7834: @dependabot[bot] chore(deps): bump golang from 1.24.5 to 1.24.6 in /tests/apps/go-fail-postdeploy
+- #7833: @dependabot[bot] chore(deps): bump golang from 1.24.5 to 1.24.6 in /tests/apps/gogrpc
+- #7832: @dependabot[bot] chore(deps): bump golang from 1.24.5 to 1.24.6 in /tests/apps/go-fail-predeploy
+- #7828: @dependabot[bot] chore(deps): bump actions/download-artifact from 4 to 5
+
+### Other
+
+- #7854: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.18.4 to 3.18.5 in /plugins/scheduler-k3s
+- #7825: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.26 to 2.11.28 in /plugins/scheduler-k3s
+- #7830: @dependabot[bot] chore(deps): bump tmp from 0.2.1 to 0.2.4 in /tests/apps/multi
+- #7829: @dependabot[bot] chore(deps): bump github.com/go-acme/lego/v4 from 4.24.0 to 4.25.2 in /plugins/scheduler-k3s
+
+## 0.36.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.36.0/bootstrap.sh
+sudo DOKKU_TAG=v0.36.0 bash bootstrap.sh
+```
+
+See the [0.36.0 migration guide](/docs/appendices/0.36.0-migration-guide.md) for more information on migrating to 0.36.0.
+
+### Backwards Compatibility Breaks
+
+- #7442: @turicas Update how domains:clear works and add domains:reset command
+- #7577: @josegonzalez Migrate DOKKU_DOCKER_STOP_TIMEOUT to ps setting
+
+### Bug Fixes
+
+- #7579: @josegonzalez Stop all app containers when calling ps:stop
+- #7820: @josegonzalez Ignore brew doctor warnings when releasing Dokku as a homebrew formula
+- #7811: @slava-sh Fix issue deploying from a tar file
+- #7781: @josegonzalez Update gitignore to remove compiled triggers from repo
+
+### New Features
+
+- #7780: @josegonzalez Export the devcontainer environment to allow docker exec to work
+- #7776: @josegonzalez Add kustomize support for applying helm charts
+- #7773: @josegonzalez Use values.yaml correctly within internal Kubernetes Helm Chart
+- #7769: @devopswithnaman Improve error handling in docker operations
+- #7578: @josegonzalez Add ability to set maintenance mode for all cron tasks running for an app
+- #7504: @josegonzalez Only redeploy formations that have had their values changed
+- #7499: @nonZero Add support for custom nginx service command
+- #7812: @CiTroNaK Allow specifying a custom top-level label key for the caddy proxy
+
+### Removals
+
+- #7818: @josegonzalez Drop support for Ubuntu 20.04
+- #7774: @josegonzalez Remove ansi escape characters that dropped the remote: prefix in deploy output
+
+### Refactors
+
+- #7816: @josegonzalez Use helper go functions to handle extracting files from a repository
+
+### Documentation
+
+- #7777: @coorasse Fix typo in 0.36.0 migration guide
+- #7761: @largemouth Fix struct name in comment
+- #7760: @olleolleolle Drop dokku-client gem, homepage 404s
+- #7759: @olleolleolle Drop mention of dokkufy gem archived in 2017
+- #7755: @olleolleolle Update checkout action version in github actions documentation
+
+### Tests
+
+- #7762: @josegonzalez Reference new packeto buildpack urls
+
+### Dependencies
+
+- #7815: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.37.0 to 1.38.0 in /plugins/config
+- #7814: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.73.0 to 1.74.2 in /tests/apps/gogrpc
+- #7810: @dependabot[bot] chore(deps): bump github.com/spf13/pflag from 1.0.6 to 1.0.7 in /plugins/config
+- #7792: @dependabot[bot] chore(deps): bump ruby from 3.4.4 to 3.4.5 in /tests/apps/dockerfile-entrypoint
+- #7791: @dependabot[bot] chore(deps): bump traefik from 3.4.1 to 3.4.4 in /plugins/traefik-vhosts
+- #7790: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.39.0 to 0.40.0 in /plugins/common
+- #7787: @dependabot[bot] chore(deps): bump golang from 1.24.4 to 1.24.5 in /tests/apps/zombies-dockerfile-no-tini
+- #7786: @dependabot[bot] chore(deps): bump golang from 1.24.4 to 1.24.5 in /tests/apps/zombies-dockerfile-tini
+- #7785: @dependabot[bot] chore(deps): bump golang from 1.24.4 to 1.24.5 in /tests/apps/go-fail-predeploy
+- #7784: @dependabot[bot] chore(deps): bump golang from 1.24.4 to 1.24.5 in /tests/apps/gogrpc
+- #7783: @dependabot[bot] chore(deps): bump golang from 1.24.4 to 1.24.5 in /tests/apps/go-fail-postdeploy
+- #7782: @josegonzalez Update golang dependencies in scheduler-k3s plugin
+- #7779: @josegonzalez Update golang to 1.24
+- #7775: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.11.0 to 3.12.0 in /plugins/cron
+- #7772: @dependabot[bot] chore(deps): bump timberio/vector from 0.47.0-debian to 0.48.0-debian in /plugins/logs
+- #7771: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.14 to 9.6.15 in /docs/_build
+- #7768: @dependabot[bot] chore(deps): bump thin from 1.8.2 to 2.0.1 in /tests/apps/ruby
+- #7766: @dependabot[bot] chore(deps): bump lucaslorentz/caddy-docker-proxy from 2.9 to 2.10 in /plugins/caddy-vhosts
+- #7765: @dependabot[bot] chore(deps): bump pygments from 2.19.1 to 2.19.2 in /docs/_build
+- #7763: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.15 to 10.16 in /docs/_build
+- #7757: @dependabot[bot] chore(deps): bump python from 3.13.4-alpine to 3.13.5-alpine in /docs/_build
+- #7756: @dependabot[bot] chore(deps): bump python from 3.13.4-bookworm to 3.13.5-bookworm in /tests/apps/dockerfile-release
+- #7754: @dependabot[bot] chore(deps): bump requests from 2.32.0 to 2.32.4 in /tests/apps/lambda-python
+- #7753: @dependabot[bot] chore(deps): bump zipp from 3.22.0 to 3.23.0 in /docs/_build
+- #7749: @josegonzalez chore: update herokuish from 0.10.3 to 0.11.0
+- #7748: @josegonzalez chore: update docker-container-healthchecker from 0.11.5 to 0.14.0
+- #7628: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/nodejs-express-noappjson
+- #7621: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/nodejs-express
+- #7819: @dependabot[bot] chore(deps): bump brace-expansion from 1.1.11 to 1.1.12 in /tests/apps/multi
+
+## 0.35.20
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.20/bootstrap.sh
+sudo DOKKU_TAG=v0.35.20 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7726: @josegonzalez Ensure compose projects are spawned from the /tmp directory
+- #7725: @josegonzalez Uninstall hashicorp tap to fix formula releases
+
+### Dependencies
+
+- #7735: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.72.2 to 1.73.0 in /tests/apps/gogrpc
+- #7737: @dependabot[bot] chore(deps): bump python from 3.13.3-alpine to 3.13.4-alpine in /docs/_build
+- #7738: @dependabot[bot] chore(deps): bump python from 3.13.3-bookworm to 3.13.4-bookworm in /tests/apps/dockerfile-release
+- #7745: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.38.0 to 0.39.0 in /plugins/common
+- #7740: @dependabot[bot] chore(deps): bump golang from 1.24.3 to 1.24.4 in /tests/apps/gogrpc
+- #7741: @dependabot[bot] chore(deps): bump golang from 1.24.3 to 1.24.4 in /tests/apps/go-fail-postdeploy
+- #7742: @dependabot[bot] chore(deps): bump golang from 1.24.3 to 1.24.4 in /tests/apps/zombies-dockerfile-tini
+- #7743: @dependabot[bot] chore(deps): bump golang from 1.24.3 to 1.24.4 in /tests/apps/go-fail-predeploy
+- #7744: @dependabot[bot] chore(deps): bump golang from 1.24.3 to 1.24.4 in /tests/apps/zombies-dockerfile-no-tini
+- #7730: @dependabot[bot] chore(deps): bump traefik from 3.4.0 to 3.4.1 in /plugins/traefik-vhosts
+- #7729: @dependabot[bot] chore(deps): bump zipp from 3.21.0 to 3.22.0 in /docs/_build
+- #7727: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.72.1 to 1.72.2 in /tests/apps/gogrpc
+
+### Other
+
+- #7746: @dependabot[bot] chore(deps): bump django from 5.0.14 to 5.1.10 in /tests/apps/dockerfile-release
+- #7731: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.24 to 2.11.25 in /plugins/scheduler-k3s
+
+## 0.35.19
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.19/bootstrap.sh
+sudo DOKKU_TAG=v0.35.19 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7686: @josegonzalez Untap aws/tap to correct issues in formula release
+
+### Documentation
+
+- #7707: @swrobel Remove duplicate hostname plugin
+- #7687: @d9i Fix cron key in app.json docs
+- #7677: @plafue Add continuous integration example for woodpecker ci
+
+### Tests
+
+- #7585: @josegonzalez Add test to prove Dokku respects the Procfile when deploying from an image
+- #7678: @josegonzalez Revert "fix: update CID count in ps tests"
+
+### Dependencies
+
+- #7692: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.37.0 to 0.38.0 in /plugins/common
+- #7626: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/dockerfile
+- #7693: @dependabot[bot] chore(deps): bump traefik from 3.3.5 to 3.4.0 in /plugins/traefik-vhosts
+- #7694: @dependabot[bot] chore(deps): bump golang from 1.24.2 to 1.24.3 in /tests/apps/go-fail-postdeploy
+- #7695: @dependabot[bot] chore(deps): bump node from 23-alpine to 24-alpine in /tests/apps/dockerfile-procfile-bad
+- #7696: @dependabot[bot] chore(deps): bump golang from 1.24.2 to 1.24.3 in /tests/apps/gogrpc
+- #7697: @dependabot[bot] chore(deps): bump golang from 1.24.2 to 1.24.3 in /tests/apps/go-fail-predeploy
+- #7698: @dependabot[bot] chore(deps): bump node from 23-alpine to 24-alpine in /tests/apps/dockerfile-procfile
+- #7699: @dependabot[bot] chore(deps): bump golang from 1.24.2 to 1.24.3 in /tests/apps/zombies-dockerfile-no-tini
+- #7700: @dependabot[bot] chore(deps): bump golang from 1.24.2 to 1.24.3 in /tests/apps/zombies-dockerfile-tini
+- #7701: @dependabot[bot] chore(deps): bump node from 23-alpine to 24-alpine in /tests/apps/dockerfile
+- #7702: @dependabot[bot] chore(deps): bump node from 23-alpine to 24-alpine in /tests/apps/dockerfile-app-json-formations
+- #7704: @dependabot[bot] chore(deps): bump rack from 2.2.13 to 2.2.14 in /tests/apps/ruby
+- #7711: @dependabot[bot] chore(deps): bump flask from 3.1.0 to 3.1.1 in /tests/apps/multi
+- #7712: @dependabot[bot] chore(deps): bump flask from 3.1.0 to 3.1.1 in /tests/apps/python-flask
+- #7713: @dependabot[bot] chore(deps): bump pyyaml-env-tag from 0.1 to 1.1 in /docs/_build
+- #7714: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.12 to 9.6.14 in /docs/_build
+- #7715: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.72.0 to 1.72.1 in /tests/apps/gogrpc
+- #7716: @dependabot[bot] chore(deps): bump ruby from 3.4.3 to 3.4.4 in /tests/apps/dockerfile-entrypoint
+- #7718: @dependabot[bot] chore(deps): bump timberio/vector from 0.46.1-debian to 0.47.0-debian in /plugins/logs
+- #7703: @dependabot[bot] chore(deps): bump node from 23-alpine to 24-alpine in /tests/apps/dockerfile-noexpose
+- #7688: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.14.3 to 10.15 in /docs/_build
+- #7689: @dependabot[bot] chore(deps): bump importlib-metadata from 8.6.1 to 8.7.0 in /docs/_build
+- #7671: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.36.0 to 0.38.0 in /tests/apps/gogrpc
+- #7681: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.71.1 to 1.72.0 in /tests/apps/gogrpc
+- #7680: @dependabot[bot] chore(deps): bump soupsieve from 2.6 to 2.7 in /docs/_build
+- #7682: @dependabot[bot] chore(deps): bump packaging from 24.2 to 25.0 in /docs/_build
+- #7673: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.37.0 to 0.38.0 in /plugins/common
+- #7675: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 4.4.0 to 4.5.0 in /plugins/haproxy-vhosts
+- #7676: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.11 to 9.6.12 in /docs/_build
+
+### Other
+
+- #7723: @josegonzalez Revert "chore(deps): bump helm.sh/helm/v3 from 3.14.2 to 3.17.3 in /plugins/scheduler-k3s"
+- #7645: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.14.2 to 3.17.3 in /plugins/scheduler-k3s
+- #7717: @dependabot[bot] chore(deps): bump setuptools from 70.0.0 to 78.1.1 in /tests/apps/dockerfile-release
+- #7719: @d1ceward Fix: Add missing `systemctl` path detection in nginx-vhost plugin
+- #7679: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.15 to 2.11.24 in /plugins/scheduler-k3s
+
+## 0.35.18
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.18/bootstrap.sh
+sudo DOKKU_TAG=v0.35.18 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7669: @josegonzalez fix: update CID count in ps tests
+
+### Dependencies
+
+- #7668: @dependabot[bot] chore(deps): bump timberio/vector from 0.43.1-debian to 0.46.1-debian in /plugins/logs
+- #7670: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.13.3 to 4.13.4 in /docs/_build
+- #7630: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/gitsubmodules
+- #7666: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.36.0 to 0.37.0 in /plugins/common
+- #7618: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/.websocket.disabled
+- #7620: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/dockerfile-procfile-bad
+- #7622: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/dockerfile-procfile
+- #7629: @dependabot[bot] chore(deps): bump express from 5.0.1 to 5.1.0 in /tests/apps/checks-root
+- #7623: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/dockerfile-noexpose
+- #7627: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/nodejs-express-noprocfile
+- #7631: @dependabot[bot] chore(deps): bump express from 4.21.2 to 5.1.0 in /tests/apps/dockerfile-app-json-formations
+- #7667: @dependabot[bot] chore(deps): bump ruby from 3.4.2 to 3.4.3 in /tests/apps/dockerfile-entrypoint
+
+### Other
+
+- #7661: @josegonzalez chore: bump dokku-event-listener from 0.17.0 to 0.17.2
+- #7660: @josegonzalez chore: bump plugn from 0.15.3 to 0.16.0
+- #7659: @josegonzalez chore: bump gliderlabs-sigil from 0.11.0 to 0.11.4
+- #7656: @josegonzalez chore: bump netrc from 0.10.0 to 0.10.2
+- #7655: @josegonzalez chore: bump lambda-builder from 0.8.0 to 0.9.1
+- #7663: @josegonzalez chore: bump herokuish from 0.10.2 to 0.10.3
+- #7662: @josegonzalez chore: bump dokku-update from 0.9.4 to 0.9.6
+- #7658: @josegonzalez chore: bump sshcommand from 0.19.0 to 0.20.0
+- #7657: @josegonzalez chore: bump procfile-util from 0.19.0 to 0.20.3
+- #7654: @josegonzalez chore: bump docker-image-builder from 0.8.0 to 0.8.1
+- #7653: @josegonzalez chore: bump docker-container-healthchecker from 0.11.0 to 0.11.5
+
+## 0.35.17
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.17/bootstrap.sh
+sudo DOKKU_TAG=v0.35.17 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7606: @josegonzalez fix: bump dokku version in main.bicep when bumping azure versions
+- #7650: @josegonzalez fix: set the correct default ingress class for k3s clusters
+- #7649: @josegonzalez fix: decrease default in-use keda resources
+- #7587: @turicas Correctly name paketo chown option
+- #7584: @josegonzalez Install all builder binaries in Dokku docker image
+- #7580: @josegonzalez Do not set network flag when building dockerfile images
+- #7575: @josegonzalez Restore the git head ref when running repo:gc
+- #7574: @josegonzalez fix: do not write VHOST file if the DOKKU_ROOT directory does not exist
+
+### New Features
+
+- #7648: @josegonzalez feat: add ability to ship k3s container logs via vector
+- #7581: @josegonzalez Allow --volume flags to be passed to pack at buildtime
+- #7583: @josegonzalez Send Host header when running container checks in docker-local
+- #7572: @josegonzalez Add support for setting shm-size for kubernetes deployments
+
+### Documentation
+
+- #7652: @josegonzalez docs: use a cid-file in the plugin example
+- #7647: @closeobserve Fix some golang docblock comments
+- #7586: @turicas Remove `--` from `--git-url` in plugin installation docs
+
+### Dependencies
+
+- #7603: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.24 to 11.0.25 in /tests/apps/java
+- #7641: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.12.0 to 0.13.0 in /plugins/scheduler-docker-local
+- #7639: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.36.2 to 1.37.0 in /plugins/common
+- #7646: @dependabot[bot] chore(deps): bump phusion/baseimage from noble-1.0.0 to noble-1.0.2
+- #7610: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.5 to 1.36.6 in /tests/apps/gogrpc
+- #7619: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.71.0 to 1.71.1 in /tests/apps/gogrpc
+- #7624: @dependabot[bot] chore(deps): bump traefik from 3.3.4 to 3.3.5 in /plugins/traefik-vhosts
+- #7632: @dependabot[bot] chore(deps): bump golang from 1.24.1 to 1.24.2 in /tests/apps/go-fail-postdeploy
+- #7633: @dependabot[bot] chore(deps): bump golang from 1.24.1 to 1.24.2 in /tests/apps/zombies-dockerfile-tini
+- #7634: @dependabot[bot] chore(deps): bump golang from 1.24.1 to 1.24.2 in /tests/apps/go-fail-predeploy
+- #7643: @dependabot[bot] chore(deps): bump python from 3.13.2-bookworm to 3.13.3-bookworm in /tests/apps/dockerfile-release
+- #7635: @dependabot[bot] chore(deps): bump golang from 1.24.1 to 1.24.2 in /tests/apps/gogrpc
+- #7636: @dependabot[bot] chore(deps): bump golang from 1.24.1 to 1.24.2 in /tests/apps/zombies-dockerfile-no-tini
+- #7613: @dependabot[bot] chore(deps): bump pyparsing from 3.2.1 to 3.2.3 in /docs/_build
+- #7625: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.8 to 9.6.11 in /docs/_build
+- #7644: @dependabot[bot] chore(deps): bump python from 3.13.2-alpine to 3.13.3-alpine in /docs/_build
+- #7651: @dependabot[bot] chore(deps): update markdown requirement from <3.8,>=3.2.1 to >=3.2.1,<3.9 in /docs/_build
+- #7595: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.7 to 45.0.8
+- #7593: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.7 to 9.6.8 in /docs/_build
+- #7589: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.34.0 to 0.36.0 in /tests/apps/gogrpc
+- #7588: @dependabot[bot] chore(deps): bump rack from 2.2.12 to 2.2.13 in /tests/apps/ruby
+- #7570: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.10.0 to 3.11.0 in /plugins/cron
+- #7569: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.35.0 to 0.36.0 in /plugins/common
+- #7568: @dependabot[bot] chore(deps): bump jinja2 from 3.1.5 to 3.1.6 in /docs/_build
+
+### Other
+
+- #7601: @dependabot[bot] chore(deps): bump github.com/expr-lang/expr from 1.15.8 to 1.17.0 in /plugins/scheduler-k3s
+- #7602: @dependabot[bot] chore(deps): bump github.com/containerd/containerd from 1.7.20 to 1.7.27 in /plugins/scheduler-k3s
+- #7637: @dependabot[bot] chore(deps): bump django from 5.0.13 to 5.0.14 in /tests/apps/dockerfile-release
+- #7607: @dependabot[bot] chore(deps): bump gunicorn from 22.0.0 to 23.0.0 in /tests/apps/dockerfile-release
+- #7596: @josegonzalez Drop compromisde tj-actions/changed-files from Ci
+- #7582: @josegonzalez Add ability to disable vhosts for all apps
+- #7576: @josegonzalez fix: properly handle NoAppsExist in network:rebuild-all and buildpacks:set
+- #7571: @dependabot[bot] chore(deps): bump django from 5.0.11 to 5.0.13 in /tests/apps/dockerfile-release
+
+## 0.35.16
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.16/bootstrap.sh
+sudo DOKKU_TAG=v0.35.16 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7502: @josegonzalez Ensure all report subcommands exit 0 when there is no app
+
+### New Features
+
+- #7545: @josegonzalez feat: delegate authorized_keys file validation to sshcommand
+
+### Documentation
+
+- #7547: @creature Fix display of numbered list in troubleshooting docs
+- #7542: @creature Include troubleshooting details about app A being served when app B was expected due to in-app SSL redirects
+- #7530: @josegonzalez Finish sentence in docker-options documentation
+- #7527: @2x2xplz Add swapoff to commands when creating or updating swap space
+- #7526: @ebuckthal Update vector container volume mount description
+
+### Dependencies
+
+- #7565: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.11.0 to 0.12.0 in /plugins/common
+- #7566: @dependabot[bot] chore(deps): bump rack from 2.2.11 to 2.2.12 in /tests/apps/ruby
+- #7567: @dependabot[bot] chore(deps): bump jinja2 from 3.1.5 to 3.1.6 in /tests/apps/python-flask
+- #7563: @dependabot[bot] chore(deps): bump golang from 1.24.0 to 1.24.1 in /tests/apps/zombies-dockerfile-tini
+- #7561: @dependabot[bot] chore(deps): bump golang from 1.24.0 to 1.24.1 in /tests/apps/gogrpc
+- #7558: @dependabot[bot] chore(deps): bump golang from 1.24.0 to 1.24.1 in /tests/apps/zombies-dockerfile-no-tini
+- #7562: @dependabot[bot] chore(deps): bump golang from 1.24.0 to 1.24.1 in /tests/apps/go-fail-predeploy
+- #7555: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.5 to 9.6.7 in /docs/_build
+- #7564: @dependabot[bot] chore(deps): bump golang from 1.24.0 to 1.24.1 in /tests/apps/go-fail-postdeploy
+- #7560: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.11.0 to 0.12.0 in /plugins/scheduler-docker-local
+- #7559: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.70.0 to 1.71.0 in /tests/apps/gogrpc
+- #7553: @dependabot[bot] chore(deps): bump traefik from 3.3.3 to 3.3.4 in /plugins/traefik-vhosts
+- #7551: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.33.0 to 0.35.0 in /plugins/common
+- #7550: @dependabot[bot] chore(deps): bump github.com/go-jose/go-jose/v4 from 4.0.4 to 4.0.5 in /plugins/scheduler-k3s
+- #7548: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.9.2 to 0.9.3 in /plugins/openresty-vhosts
+- #7541: @dependabot[bot] chore(deps): bump ruby from 3.4.1 to 3.4.2 in /tests/apps/dockerfile-entrypoint
+- #7537: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.29.7 to 1.29.14 in /plugins/scheduler-k3s
+- #7536: @dependabot[bot] chore(deps): bump golang from 1.23.6 to 1.24.0 in /tests/apps/zombies-dockerfile-no-tini
+- #7535: @dependabot[bot] chore(deps): bump golang from 1.23.6 to 1.24.0 in /tests/apps/zombies-dockerfile-tini
+- #7534: @dependabot[bot] chore(deps): bump golang from 1.23.6 to 1.24.0 in /tests/apps/go-fail-predeploy
+- #7533: @dependabot[bot] chore(deps): bump golang from 1.23.6 to 1.24.0 in /tests/apps/go-fail-postdeploy
+- #7532: @dependabot[bot] chore(deps): bump golang from 1.23.6 to 1.24.0 in /tests/apps/gogrpc
+- #7531: @dependabot[bot] chore(deps): bump rack from 2.2.8.1 to 2.2.11 in /tests/apps/ruby
+- #7525: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.32.0 to 0.33.0 in /plugins/common
+- #7543: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.4 to 9.6.5 in /docs/_build
+- #7512: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.10.0 to 0.11.0 in /plugins/common
+- #7513: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.6 to 45.0.7
+- #7514: @dependabot[bot] chore(deps): bump golang from 1.23.5 to 1.23.6 in /tests/apps/gogrpc
+- #7515: @dependabot[bot] chore(deps): bump golang from 1.23.5 to 1.23.6 in /tests/apps/go-fail-predeploy
+- #7516: @dependabot[bot] chore(deps): bump golang from 1.23.5 to 1.23.6 in /tests/apps/go-fail-postdeploy
+- #7517: @dependabot[bot] chore(deps): bump golang from 1.23.5 to 1.23.6 in /tests/apps/zombies-dockerfile-tini
+- #7518: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.13.1 to 4.13.3 in /docs/_build
+- #7519: @dependabot[bot] chore(deps): bump golang from 1.23.5 to 1.23.6 in /tests/apps/zombies-dockerfile-no-tini
+- #7521: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.4 to 1.36.5 in /tests/apps/gogrpc
+- #7522: @dependabot[bot] chore(deps): bump python from 3.13.1-bookworm to 3.13.2-bookworm in /tests/apps/dockerfile-release
+- #7523: @dependabot[bot] chore(deps): bump python from 3.13.1-alpine to 3.13.2-alpine in /docs/_build
+- #7528: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.2 to 9.6.4 in /docs/_build
+- #7510: @dependabot[bot] chore(deps): bump mkdocs-material from 9.6.1 to 9.6.2 in /docs/_build
+- #7507: @dependabot[bot] chore(deps): bump traefik from 3.3.2 to 3.3.3 in /plugins/traefik-vhosts
+- #7505: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.14.2 to 10.14.3 in /docs/_build
+- #7506: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.12.3 to 4.13.1 in /docs/_build
+- #7508: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.9.1 to 0.9.2 in /plugins/openresty-vhosts
+- #7482: @dependabot[bot] chore(deps): bump github.com/spf13/pflag from 1.0.5 to 1.0.6 in /plugins/common
+- #7500: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.30.0 to 0.33.0 in /tests/apps/gogrpc
+- #7501: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.14 to 2.11.15 in /plugins/scheduler-k3s
+- #7497: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.49 to 9.6.1 in /docs/_build
+- #7479: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.14 to 10.14.2 in /docs/_build
+- #7477: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.69.4 to 1.70.0 in /tests/apps/gogrpc
+- #7476: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.2 to 1.36.4 in /tests/apps/gogrpc
+- #7469: @dependabot[bot] chore(deps): bump golang from 1.23.4 to 1.23.5 in /tests/apps/go-fail-postdeploy
+- #7468: @dependabot[bot] chore(deps): bump golang from 1.23.4 to 1.23.5 in /tests/apps/go-fail-predeploy
+- #7467: @dependabot[bot] chore(deps): bump golang from 1.23.4 to 1.23.5 in /tests/apps/zombies-dockerfile-no-tini
+- #7465: @dependabot[bot] chore(deps): bump golang from 1.23.4 to 1.23.5 in /tests/apps/zombies-dockerfile-tini
+- #7466: @dependabot[bot] chore(deps): bump golang from 1.23.4 to 1.23.5 in /tests/apps/gogrpc
+- #7462: @dependabot[bot] chore(deps): bump traefik from 3.3.1 to 3.3.2 in /plugins/traefik-vhosts
+- #7460: @dependabot[bot] chore(deps): bump django from 5.0.10 to 5.0.11 in /tests/apps/dockerfile-release
+- #7474: @dependabot[bot] chore(deps): bump importlib-metadata from 8.5.0 to 8.6.1 in /docs/_build
+
+### Other
+
+- #7554: @josegonzalez fix: update test for newer git version
+
+## 0.35.15
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.15/bootstrap.sh
+sudo DOKKU_TAG=v0.35.15 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7455: @turicas Add missing post-delete scripts to checks, caddy-vhosts and haproxy-vhosts
+
+### Dependencies
+
+- #7458: @dependabot[bot] chore(deps): bump traefik from 3.3.0 to 3.3.1 in /plugins/traefik-vhosts
+- #7457: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.69.2 to 1.69.4 in /tests/apps/gogrpc
+
+## 0.35.14
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.14/bootstrap.sh
+sudo DOKKU_TAG=v0.35.14 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7441: @turicas Fix Vagrantfile NFS config
+- #7417: @josegonzalez Write contents to stdout before writing to a file
+- #7416: @josegonzalez Add missing DOKKU_LIB_HOST_ROOT to ensure plugins work in devcontainer setup
+- #7412: @josegonzalez Remove cgroups dependencies
+
+### New Features
+
+- #7439: @josegonzalez Allow specifying a custom app label alias when shipping logs via vector
+- #7419: @josegonzalez Add the ability to set a MAILFROM value for local cron emails
+
+### Refactors
+
+- #7415: @josegonzalez Use the golang version of CopyFromImage when copying files in bash
+
+### Documentation
+
+- #7437: @turicas Fix doc generation
+- #7414: @josegonzalez Remove copyright date range
+
+### Dependencies
+
+- #7453: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.13 to 10.14 in /docs/_build
+- #7451: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.31.0 to 0.32.0 in /plugins/common
+- #7449: @dependabot[bot] chore(deps): bump pygments from 2.19.0 to 2.19.1 in /docs/_build
+- #7450: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.1 to 1.36.2 in /tests/apps/gogrpc
+- #7452: @dependabot[bot] chore(deps): bump traefik from 3.2.3 to 3.3.0 in /plugins/traefik-vhosts
+- #7446: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.14.0 to 1.14.1 in /plugins/common
+- #7445: @dependabot[bot] chore(deps): bump pygments from 2.18.0 to 2.19.0 in /docs/_build
+- #7444: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.5 to 45.0.6
+- #7436: @dependabot[bot] chore(deps): bump pyparsing from 3.2.0 to 3.2.1 in /docs/_build
+- #7433: @dependabot[bot] chore(deps): bump k8s.io/kubernetes from 1.29.1 to 1.29.7 in /plugins/scheduler-k3s
+- #7429: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.36.1 to 1.36.2 in /plugins/common
+- #7427: @dependabot[bot] chore(deps): bump click from 8.1.7 to 8.1.8 in /docs/_build
+- #7425: @dependabot[bot] chore(deps): bump jinja2 from 3.1.4 to 3.1.5 in /tests/apps/python-flask
+- #7426: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.36.0 to 1.36.1 in /tests/apps/gogrpc
+- #7428: @dependabot[bot] chore(deps): bump jinja2 from 3.1.4 to 3.1.5 in /docs/_build
+- #7430: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.12 to 10.13 in /docs/_build
+- #7432: @dependabot[bot] chore(deps): bump ruby from 3.3.6 to 3.4.1 in /tests/apps/dockerfile-entrypoint
+- #7424: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.69.0 to 1.69.2 in /tests/apps/gogrpc
+- #7420: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.35.2 to 1.36.0 in /tests/apps/gogrpc
+- #7421: @dependabot[bot] chore(deps): bump traefik from 3.2.2 to 3.2.3 in /plugins/traefik-vhosts
+- #7418: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.48 to 9.5.49 in /docs/_build
+- #7411: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.68.1 to 1.69.0 in /tests/apps/gogrpc
+
+### Other
+
+- #7434: @turicas Add missing checks:set to checks help
+- #7422: @Tashows Fix detached tty for k3s
+
+## 0.35.13
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.13/bootstrap.sh
+sudo DOKKU_TAG=v0.35.13 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7410: @josegonzalez Only raise nil responses for k8s list calls as errors
+- #7403: @Tashows Properly resolve imagePullSecrets from app and deploymentID if relevant property does not exist
+- #7404: @josegonzalez Correctly handle scale to zero with the Keda http addon
+- #7400: @Tashows Check if tty is actually used and support proper output when it's not
+
+### Documentation
+
+- #7395: @josegonzalez Add documentation for all file formats dokku uses
+- #7399: @nonZero Add -w 0 to base64 call in config:set docs for safe usage in ssh commands
+
+### Tests
+
+- #7380: @josegonzalez Run unit tests outside of docker by default
+
+### Dependencies
+
+- #7409: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.30.0 to 0.31.0 in /plugins/docker-options
+- #7405: @dependabot[bot] chore(deps): bump timberio/vector from 0.42.0-debian to 0.43.1-debian in /plugins/logs
+- #7407: @dependabot[bot] chore(deps): bump traefik from 3.2.1 to 3.2.2 in /plugins/traefik-vhosts
+- #7402: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.36.0 to 1.36.1 in /plugins/common
+- #7390: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.29.0 to 0.30.0 in /plugins/common
+- #7397: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.4 to 45.0.5
+- #7398: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.47 to 9.5.48 in /docs/_build
+- #7394: @dependabot[bot] chore(deps): bump django from 5.0.9 to 5.0.10 in /tests/apps/dockerfile-release
+- #7385: @dependabot[bot] chore(deps): bump golang from 1.23.3 to 1.23.4 in /tests/apps/go-fail-predeploy
+- #7386: @dependabot[bot] chore(deps): bump golang from 1.23.3 to 1.23.4 in /tests/apps/zombies-dockerfile-tini
+- #7387: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.68.0 to 1.68.1 in /tests/apps/gogrpc
+- #7388: @dependabot[bot] chore(deps): bump python from 3.13.0-alpine to 3.13.1-alpine in /docs/_build
+- #7389: @dependabot[bot] chore(deps): bump six from 1.16.0 to 1.17.0 in /docs/_build
+- #7392: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.9.0 to 0.10.0 in /plugins/scheduler-docker-local
+- #7393: @dependabot[bot] chore(deps): bump python from 3.13.0-bookworm to 3.13.1-bookworm in /tests/apps/dockerfile-release
+- #7384: @dependabot[bot] chore(deps): bump golang from 1.23.3 to 1.23.4 in /tests/apps/gogrpc
+- #7383: @dependabot[bot] chore(deps): bump golang from 1.23.3 to 1.23.4 in /tests/apps/zombies-dockerfile-no-tini
+- #7382: @dependabot[bot] chore(deps): bump golang from 1.23.3 to 1.23.4 in /tests/apps/go-fail-postdeploy
+
+## 0.35.12
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.12/bootstrap.sh
+sudo DOKKU_TAG=v0.35.12 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7361: @josegonzalez Allow autoscaling config to have zero min replicas
+
+### New Features
+
+- #7379: @josegonzalez Provide ability to customize chart values via `scheduler-k3s:set`
+
+### Documentation
+
+- #7365: @binchengqu Correct some documentation types
+
+### Dependencies
+
+- #7378: @josegonzalez Update go modules
+- #7376: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.46 to 9.5.47 in /docs/_build
+- #7370: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.35.1 to 1.36.0 in /plugins/common
+- #7377: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.11.9 to 2.11.14 in /plugins/scheduler-k3s
+- #7369: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.35.1 to 1.36.0 in /plugins/config
+- #7371: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.45 to 9.5.46 in /docs/_build
+- #7366: @dependabot[bot] chore(deps): bump traefik from 3.2.0 to 3.2.1 in /plugins/traefik-vhosts
+- #7364: @dependabot[bot] chore(deps): bump github.com/cert-manager/cert-manager from 1.13.3 to 1.15.4 in /plugins/scheduler-k3s
+- #7363: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.44 to 9.5.45 in /docs/_build
+- #7360: @dependabot[bot] chore(deps): bump flask from 3.0.3 to 3.1.0 in /tests/apps/python-flask
+- #7358: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.35.1 to 1.35.2 in /tests/apps/gogrpc
+- #7359: @dependabot[bot] chore(deps): bump flask from 3.0.3 to 3.1.0 in /tests/apps/multi
+
+## 0.35.11
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.11/bootstrap.sh
+sudo DOKKU_TAG=v0.35.11 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7353: @indrat Add missing export DOKKU_LIB_HOST_ROOT when running dokku in container
+
+### New Features
+
+- #7355: @josegonzalez Add support for http-based scaling when deploying on the k3s scheduler
+
+### Documentation
+
+- #7349: @josegonzalez Create .well-known/funding-manifest-urls
+
+### Dependencies
+
+- #7345: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.67.1 to 1.68.0 in /tests/apps/gogrpc
+- #7350: @dependabot[bot] chore(deps): bump zipp from 3.20.2 to 3.21.0 in /docs/_build
+- #7351: @dependabot[bot] chore(deps): bump werkzeug from 3.1.2 to 3.1.3 in /tests/apps/python-flask
+- #7347: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.28.0 to 0.29.0 in /plugins/common
+- #7348: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.8.0 to 0.9.0 in /plugins/common
+- #7344: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.3 to 45.0.4
+- #7343: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.8.0 to 0.9.0 in /plugins/scheduler-docker-local
+- #7342: @dependabot[bot] chore(deps): bump packaging from 24.1 to 24.2 in /docs/_build
+- #7341: @dependabot[bot] chore(deps): bump golang from 1.23.2 to 1.23.3 in /tests/apps/zombies-dockerfile-tini
+- #7340: @dependabot[bot] chore(deps): bump golang from 1.23.2 to 1.23.3 in /tests/apps/gogrpc
+- #7339: @dependabot[bot] chore(deps): bump golang from 1.23.2 to 1.23.3 in /tests/apps/go-fail-predeploy
+- #7338: @dependabot[bot] chore(deps): bump golang from 1.23.2 to 1.23.3 in /tests/apps/zombies-dockerfile-no-tini
+- #7337: @dependabot[bot] chore(deps): bump golang from 1.23.2 to 1.23.3 in /tests/apps/go-fail-postdeploy
+- #7335: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.43 to 9.5.44 in /docs/_build
+- #7334: @dependabot[bot] chore(deps): bump ruby from 3.3.5 to 3.3.6 in /tests/apps/dockerfile-entrypoint
+- #7333: @dependabot[bot] chore(deps): bump werkzeug from 3.1.1 to 3.1.2 in /tests/apps/python-flask
+
+### Other
+
+- #7357: @josegonzalez Run brew cleanup before running brew doctor
+
+## 0.35.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.10/bootstrap.sh
+sudo DOKKU_TAG=v0.35.10 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7324: @josegonzalez Correctly pull the deployment id from an app's helm values when executing dokku run under the k3s scheduler
+- #7332: @josegonzalez Drop the pod name from stdout output when creating one-off containers under the k3s scheduler
+- #7331: @josegonzalez Output logs for completed containers launched by the k3s scheduler
+- #7330: @josegonzalez Disable stdio buffering so log coloring happens normally when fetching logs for k3s-scheduler managed apps
+- #7329: @josegonzalez Correctly wait for one-off k3s pods to be ready
+- #7328: @josegonzalez Execute one-off commands with DOKKU_APP_SHELL as the initial command under the k3s scheduler
+- #7323: @josegonzalez Correct errors in brew doctor output when making a formula release
+
+### Dependencies
+
+- #7327: @dependabot[bot] chore(deps): bump watchdog from 5.0.3 to 6.0.0 in /docs/_build
+- #7326: @dependabot[bot] chore(deps): bump werkzeug from 3.1.0 to 3.1.1 in /tests/apps/python-flask
+
+## 0.35.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.9/bootstrap.sh
+sudo DOKKU_TAG=v0.35.9 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7321: @josegonzalez Allow nginx commands when the scheduler is set to null
+- #7313: @Tashows Remove prefixing releaseName with 'dokku-' in UninstallChart and GetValues calls in scheduler-k3s/triggers.go
+
+### New Features
+
+- #7322: @josegonzalez Add debugging information to brew bump-formula-pr
+
+### Documentation
+
+- #7312: @toanalien Fix typo in nginx documentation
+
+### Dependencies
+
+- #7320: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.34.2 to 1.35.1 in /plugins/common
+- #7311: @dependabot[bot] chore(deps): bump traefik from 3.1.6 to 3.2.0 in /plugins/traefik-vhosts
+- #7300: @dependabot[bot] chore(deps): bump github.com/fatih/color from 1.17.0 to 1.18.0 in /plugins/common
+- #7319: @dependabot[bot] chore(deps): bump werkzeug from 3.0.6 to 3.1.0 in /tests/apps/python-flask
+- #7317: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.42 to 9.5.43 in /docs/_build
+- #7310: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.11.2 to 10.12 in /docs/_build
+- #7299: @dependabot[bot] chore(deps): bump timberio/vector from 0.41.1-debian to 0.42.0-debian in /plugins/logs
+- #7306: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.8.0 to 3.8.1 in /tests/apps/java
+- #7305: @dependabot[bot] chore(deps): bump werkzeug from 3.0.4 to 3.0.6 in /tests/apps/python-flask
+
+## 0.35.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.8/bootstrap.sh
+sudo DOKKU_TAG=v0.35.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7295: @josegonzalez Respect the exit code and pass flags correctly when tailing nginx logs on k3s
+- #7294: @josegonzalez Tail the correct container in the ingress-nginx pod
+- #7293: @josegonzalez Strip non-numeric characters from certain ingress-nginx annotation values
+
+### New Features
+
+- #7296: @josegonzalez Implement nginx:show-config for k3s plugin
+
+### Documentation
+
+- #7297: @josegonzalez Document a required ps:restart in order to apply annotations, labels, and nginx properties
+
+### Dependencies
+
+- #7287: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.9.0 to 3.10.0 in /plugins/cron
+- #7288: @dependabot[bot] chore(deps): bump markupsafe from 3.0.1 to 3.0.2 in /docs/_build
+- #7289: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.41 to 9.5.42 in /docs/_build
+
+## 0.35.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.7/bootstrap.sh
+sudo DOKKU_TAG=v0.35.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7286: @josegonzalez Install netcat-traditional in 24.04 image
+- #7284: @josegonzalez Use correct name for scheduler-proxy-logs trigger
+- #7285: @josegonzalez Ensure builder pruning works when running under docker
+- #7283: @danieldiekmeier Force `docker builder prune` to skip confirmation
+
+## 0.35.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.6/bootstrap.sh
+sudo DOKKU_TAG=v0.35.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7279: @josegonzalez Allow exit code 2 when waiting for cloud-init to complete
+- #7255: @josegonzalez Do not attempt to expose the same mapped port more than once
+
+### New Features
+
+- #7278: @josegonzalez Allow usage of newer nginx.conf.sigil on older versions of dokku
+- #7271: @josegonzalez Add support for non-local nginx implementations
+- #7269: @josegonzalez Add support for various timeout-related functions to nginx, openresty and k3s plugins
+
+### Dependencies
+
+- #7272: @dependabot[bot] chore(deps): bump node from 22-alpine to 23-alpine in /tests/apps/dockerfile
+- #7273: @dependabot[bot] chore(deps): bump node from 22-alpine to 23-alpine in /tests/apps/dockerfile-procfile
+- #7274: @dependabot[bot] chore(deps): bump node from 22-alpine to 23-alpine in /tests/apps/dockerfile-app-json-formations
+- #7275: @dependabot[bot] chore(deps): bump node from 22-alpine to 23-alpine in /tests/apps/dockerfile-noexpose
+- #7276: @dependabot[bot] chore(deps): bump node from 22-alpine to 23-alpine in /tests/apps/dockerfile-procfile-bad
+- #7270: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.40 to 9.5.41 in /docs/_build
+- #7264: @dependabot[bot] chore(deps): bump pyparsing from 3.1.4 to 3.2.0 in /docs/_build
+- #7244: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.27.0 to 0.28.0 in /plugins/common
+- #7260: @dependabot[bot] chore(deps): bump traefik from 3.1.5 to 3.1.6 in /plugins/traefik-vhosts
+- #7259: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.39 to 9.5.40 in /docs/_build
+- #7258: @dependabot[bot] chore(deps): bump markupsafe from 3.0.0 to 3.0.1 in /docs/_build
+- #7254: @dependabot[bot] chore(deps): bump cookie and express in /tests/apps/checks-root
+- #7246: @dependabot[bot] chore(deps): bump python from 3.12.7-alpine to 3.13.0-alpine in /docs/_build
+- #7247: @dependabot[bot] chore(deps): bump python from 3.12.7-bookworm to 3.13.0-bookworm in /tests/apps/dockerfile-release
+- #7248: @dependabot[bot] chore(deps): bump markupsafe from 2.1.5 to 3.0.0 in /docs/_build
+- #7252: @dependabot[bot] chore(deps): bump django from 5.0.8 to 5.0.9 in /tests/apps/dockerfile-release
+
+### Other
+
+- #7282: @josegonzalez Skip ssh key setup when starting docker image
+- #7281: @josegonzalez Set hostname to dokku.me for devcontainer
+- #7280: @josegonzalez Merge changes from digitialocean's image-check script
+
+## 0.35.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.5/bootstrap.sh
+sudo DOKKU_TAG=v0.35.5 bash bootstrap.sh
+```
+
+### New Features
+
+- #7213: @josegonzalez Release Dokku on supported versions of Debian and Raspbian
+
+### Documentation
+
+- #7241: @josegonzalez Clarify phase utilization in docker-options docs
+- #7240: @josegonzalez Update testing docs to specify that CI is performed on Ubuntu Noble
+- #7218: @josegonzalez Fix reference to arm64
+- #7215: @Lewiscowles1986 Clarify x64 as amd64/arch64 in readme
+
+### Tests
+
+- #7212: @josegonzalez Update python version used in test apps
+
+### Dependencies
+
+- #7243: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.34.2 to 1.35.1 in /tests/apps/gogrpc
+- #7238: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.2 to 45.0.3
+- #7237: @dependabot[bot] chore(deps): bump traefik from 3.1.4 to 3.1.5 in /plugins/traefik-vhosts
+- #7227: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.67.0 to 1.67.1 in /tests/apps/gogrpc
+- #7231: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.11.1 to 10.11.2 in /docs/_build
+- #7228: @dependabot[bot] chore(deps): bump golang from 1.23.1 to 1.23.2 in /tests/apps/go-fail-postdeploy
+- #7229: @dependabot[bot] chore(deps): bump golang from 1.23.1 to 1.23.2 in /tests/apps/zombies-dockerfile-tini
+- #7230: @dependabot[bot] chore(deps): bump python from 3.12.6-bookworm to 3.12.7-bookworm in /tests/apps/dockerfile-release
+- #7232: @dependabot[bot] chore(deps): bump golang from 1.23.1 to 1.23.2 in /tests/apps/go-fail-predeploy
+- #7233: @dependabot[bot] chore(deps): bump python from 3.12.6-alpine to 3.12.7-alpine in /docs/_build
+- #7234: @dependabot[bot] chore(deps): bump golang from 1.23.1 to 1.23.2 in /tests/apps/zombies-dockerfile-no-tini
+- #7235: @dependabot[bot] chore(deps): bump golang from 1.23.1 to 1.23.2 in /tests/apps/gogrpc
+- #7220: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.38 to 9.5.39 in /docs/_build
+- #7221: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.10.2 to 10.11.1 in /docs/_build
+- #7222: @dependabot[bot] chore(deps): bump watchdog from 5.0.2 to 5.0.3 in /docs/_build
+
+### Other
+
+- #7245: @moenoel fix: #7035 broke traefik https router rule
+
+## 0.35.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.4/bootstrap.sh
+sudo DOKKU_TAG=v0.35.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7209: @josegonzalez Exit non-zero if any deployment tasks fails
+- #7211: @josegonzalez Always set the git rev env var when building an app via git:sync
+- #7208: @josegonzalez Compute path for docker-container-healthchecker
+- #7205: @Cactusbone chore: fix vagrant dokku-windows config
+
+### Tests
+
+- #7210: @josegonzalez Ensure pack binary is installed correctly when running tests in a devcontainer
+
+### Dependencies
+
+- #7206: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.37 to 9.5.38 in /docs/_build
+- #7207: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.10.1 to 10.10.2 in /docs/_build
+- #7203: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.36 to 9.5.37 in /docs/_build
+
+## 0.35.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.3/bootstrap.sh
+sudo DOKKU_TAG=v0.35.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7200: @josegonzalez Automatically select a container type if none is specified
+- #7199: @josegonzalez Check if nginx is running before reloading during an app deletion
+- #7198: @josegonzalez Add builder-herokuish to default help output
+- #7197: @josegonzalez Implement missing network:info command
+
+### Tests
+
+- #7201: @josegonzalez Run arm build on 22.04
+
+### Dependencies
+
+- #7193: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.9 to 10.10.1 in /docs/_build
+- #7194: @dependabot[bot] chore(deps): bump traefik from 3.1.2 to 3.1.4 in /plugins/traefik-vhosts
+- #7195: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.9.0 to 0.9.1 in /plugins/openresty-vhosts
+- #7196: @dependabot[bot] chore(deps): bump socket.io from 4.7.5 to 4.8.0 in /tests/apps/.websocket.disabled
+
+## 0.35.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.2/bootstrap.sh
+sudo DOKKU_TAG=v0.35.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7191: @josegonzalez Revert to building Dokku on Ubunut 20.04 Focal to hotfix glibc issues
+
+### New Features
+
+- #7190: @josegonzalez Allow setting most nginx properties globally
+
+## 0.35.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.1/bootstrap.sh
+sudo DOKKU_TAG=v0.35.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #7188: @josegonzalez Respect GO environment variables when building to ensure CGO is disabled
+
+### Documentation
+
+- #7187: @josegonzalez Remove reference to old web ui
+
+### Dependencies
+
+- #7115: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.26.0 to 0.27.0 in /plugins/common
+- #7160: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.10.7 to 2.11.9 in /plugins/scheduler-k3s
+- #7094: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.34.1 to 1.34.2 in /plugins/common
+- #7096: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.34.1 to 1.34.2 in /plugins/config
+- #7109: @dependabot[bot] chore(deps): bump watchdog from 4.0.2 to 5.0.2 in /docs/_build
+- #7127: @dependabot[bot] chore(deps): bump python from 3.12.5-alpine to 3.12.6-alpine in /docs/_build
+- #7117: @dependabot[bot] chore(deps): bump golang from 1.23.0 to 1.23.1 in /tests/apps/go-fail-postdeploy
+- #7116: @dependabot[bot] chore(deps): bump golang from 1.23.0 to 1.23.1 in /tests/apps/zombies-dockerfile-tini
+- #7112: @dependabot[bot] chore(deps): bump golang from 1.23.0 to 1.23.1 in /tests/apps/zombies-dockerfile-no-tini
+- #7108: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.23 to 11.0.24 in /tests/apps/java
+- #7113: @dependabot[bot] chore(deps): bump golang from 1.23.0 to 1.23.1 in /tests/apps/go-fail-predeploy
+- #7110: @dependabot[bot] chore(deps): bump ruby from 3.3.4 to 3.3.5 in /tests/apps/dockerfile-entrypoint
+- #7114: @dependabot[bot] chore(deps): bump golang from 1.23.0 to 1.23.1 in /tests/apps/gogrpc
+- #7132: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/dockerfile-procfile-bad
+- #7133: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/nodejs-express-noappjson
+- #7134: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/gitsubmodules
+- #7135: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/nodejs-express-noprocfile
+- #7136: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/dockerfile-procfile
+- #7137: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/dockerfile-app-json-formations
+- #7140: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/.websocket.disabled
+- #7141: @dependabot[bot] chore(deps): bump express from 4.19.2 to 4.21.0 in /tests/apps/nodejs-express
+- #7161: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.65.0 to 1.67.0 in /tests/apps/gogrpc
+- #7153: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.8.0 to 0.9.0
+- #7152: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 45.0.0 to 45.0.2
+- #7079: @dependabot[bot] chore(deps): bump pyparsing from 3.1.2 to 3.1.4 in /docs/_build
+- #7097: @dependabot[bot] chore(deps): bump mkdocs from 1.6.0 to 1.6.1 in /docs/_build
+- #7142: @dependabot[bot] chore(deps): bump importlib-metadata from 8.4.0 to 8.5.0 in /docs/_build
+- #7186: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.33 to 9.5.36 in /docs/_build
+- #7144: @dependabot[bot] chore(deps): bump zipp from 3.20.0 to 3.20.2 in /docs/_build
+
+## 0.35.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.35.0/bootstrap.sh
+sudo DOKKU_TAG=v0.35.0 bash bootstrap.sh
+```
+
+See the [0.35.0 migration guide](/docs/appendices/0.35.0-migration-guide.md) for more information on migrating to 0.35.0.
+
+### Bug Fixes
+
+- #7179: @josegonzalez Remove references to version in compose files
+- #7177: @josegonzalez Reference noble apt repository and not focal
+- #7164: @josegonzalez Remove systemd on docker-based installations
+- #7157: @Cactusbone Fix building in vagrant when jq is not available
+- #7147: @Cactusbone Support older docker versions by setting ARG value with an equal sign
+- #7088: @andreby Handle the case where parent PID is 0
+- #7077: @bakatz Add cron dependency because it's necessary to run scheduled cron jobs
+
+### New Features
+
+- #7185: @josegonzalez Fix vagrant running on arm64 machines
+- #7184: @josegonzalez Clear out docker builder cache once a day
+- #7183: @josegonzalez Error out when the Dockerfile is missing during builder-dockerfile execution
+- #7175: @josegonzalez Upgrade digitalocean image to Ubuntu Noble
+- #7174: @josegonzalez Upgrade vagrant image to Ubuntu Noble
+- #7173: @josegonzalez Upgrade builder docker image to Ubuntu Noble
+- #7166: @josegonzalez Upgrade herokuish from 0.9.2 to 0.10.1
+- #7075: @josegonzalez Upgrade herokuish builder to gliderlabs/herokuish:latest-24
+- #7074: @josegonzalez Upgrade cnb builder to heroku/builder:24
+- #7071: @josegonzalez Bump go version to 1.23.0
+- #6853: @Reggino Support Ubuntu 24.04 LTS
+- #6762: @josegonzalez Upgrade docker compose version in use
+
+### Documentation
+
+- #7180: @josegonzalez Reference actual properties for enabling the traefik api and dashboard
+- #7178: @josegonzalez Fix link to docs site
+- #7101: @strugee Fix typo in CNB documentation
+- #7100: @no0dles SVG gets modified on release
+
+### Tests
+
+- #7176: @josegonzalez Fetch packages installed in ci from Ubuntu Noble repo
+- #7172: @josegonzalez Run CI release processes on Ubuntu Noble
+- #7171: @josegonzalez Run CI on Ubuntu Noble
+- #7170: @josegonzalez Run CI codeql analysis on Ubuntu Noble
+- #7169: @josegonzalez Run CI doc generation on Ubuntu Noble
+- #7168: @josegonzalez Run CI linting on Ubuntu Noble
+- #7073: @josegonzalez Drop codacy
+
+### Dependencies
+
+- #7148: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.8.0 to 0.9.0 in /plugins/openresty-vhosts
+- #7139: @dependabot[bot] chore(deps): bump timberio/vector from 0.39.0-debian to 0.41.1-debian in /plugins/logs
+- #7060: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.8.0 to 3.9.0 in /plugins/cron
+- #7035: @dependabot[bot] chore(deps): bump traefik from 2.11.2 to 3.1.2 in /plugins/traefik-vhosts
+- #7014: @dependabot[bot] chore(deps): bump timberio/vector from 0.39.0-debian to 0.40.0-debian in /plugins/logs
+- #6985: @dependabot[bot] chore(deps): bump github.com/traefik/traefik/v2 from 2.10.7 to 2.11.6 in /plugins/scheduler-k3s
+
+### Other
+
+- #7165: @josegonzalez Upgrade Docker image to Ubuntu Noble 24.04
+- #6784: @josegonzalez Remove --restart docker arguments when not running deploy-phase containers
+
+## 0.34.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.9/bootstrap.sh
+sudo DOKKU_TAG=v0.34.9 bash bootstrap.sh
+```
+
+### Documentation
+
+- #7062: @Tashows List dokku-image-size-limit plugin
+
+### Dependencies
+
+- #7070: @dependabot[bot] chore(deps): bump micromatch from 4.0.5 to 4.0.8 in /tests/apps/multi
+- #7064: @dependabot[bot] chore(deps): bump importlib-metadata from 8.3.0 to 8.4.0 in /docs/_build
+- #7068: @dependabot[bot] chore(deps): bump werkzeug from 3.0.3 to 3.0.4 in /tests/apps/python-flask
+- #7065: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.22 to 11.0.23 in /tests/apps/java
+- #7066: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.7 to 45.0.0
+- #7067: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.7.1 to 3.8.0 in /tests/apps/java
+- #7069: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.32 to 9.5.33 in /docs/_build
+- #7063: @dependabot[bot] chore(deps): bump importlib-metadata from 8.2.0 to 8.3.0 in /docs/_build
+- #7058: @dependabot[bot] chore(deps): update markdown requirement from <3.7,>=3.2.1 to >=3.2.1,<3.8 in /docs/_build
+- #7059: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.31 to 9.5.32 in /docs/_build
+
+## 0.34.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.8/bootstrap.sh
+sudo DOKKU_TAG=v0.34.8 bash bootstrap.sh
+```
+
+### Documentation
+
+- #7046: @bakatz Fixes incorrect documentation link for null builder
+- #6983: @polettix Clarify paths used by Dokku when looking for specific files
+- #7012: @DavidTheProgrammer Fix grammar under HSTS Header section in ssl documentation
+- #7019: @josegonzalez Clarify to users that the migration guides should be followed for upgrades
+
+### Tests
+
+- #7039: @josegonzalez Correct case of pip in builder-pack test output
+
+### Dependencies
+
+- #7057: @josegonzalez Update golang dependencies
+- #7048: @dependabot[bot] chore(deps): bump soupsieve from 2.5 to 2.6 in /docs/_build
+- #7041: @dependabot[bot] chore(deps): bump zipp from 3.19.2 to 3.20.0 in /docs/_build
+- #7044: @dependabot[bot] chore(deps): bump gunicorn from 22.0.0 to 23.0.0 in /tests/apps/multi
+- #7042: @dependabot[bot] chore(deps): bump watchdog from 4.0.1 to 4.0.2 in /docs/_build
+- #7043: @dependabot[bot] chore(deps): bump gunicorn from 22.0.0 to 23.0.0 in /tests/apps/python-flask
+- #7045: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.25.0 to 0.26.0 in /plugins/common
+- #7050: @dependabot[bot] chore(deps): bump golang from 1.22.6 to 1.23.0 in /tests/apps/zombies-dockerfile-tini
+- #7049: @dependabot[bot] chore(deps): bump golang from 1.22.6 to 1.23.0 in /tests/apps/zombies-dockerfile-no-tini
+- #7051: @dependabot[bot] chore(deps): bump golang from 1.22.6 to 1.23.0 in /tests/apps/go-fail-predeploy
+- #7052: @dependabot[bot] chore(deps): bump golang from 1.22.6 to 1.23.0 in /tests/apps/gogrpc
+- #7053: @dependabot[bot] chore(deps): bump golang from 1.22.6 to 1.23.0 in /tests/apps/go-fail-postdeploy
+- #7022: @dependabot[bot] chore(deps): bump github.com/docker/docker from 24.0.9+incompatible to 25.0.6+incompatible in /plugins/scheduler-k3s
+- #7016: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.34.0 to 1.34.1 in /plugins/config
+- #7036: @dependabot[bot] chore(deps): bump django from 5.0.7 to 5.0.8 in /tests/apps/dockerfile-release
+- #7025: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.7.0 to 0.8.0 in /plugins/common
+- #7034: @dependabot[bot] chore(deps): bump golang from 1.22.5 to 1.22.6 in /tests/apps/gogrpc
+- #7033: @dependabot[bot] chore(deps): bump golang from 1.22.5 to 1.22.6 in /tests/apps/go-fail-postdeploy
+- #7030: @dependabot[bot] chore(deps): bump golang from 1.22.5 to 1.22.6 in /tests/apps/go-fail-predeploy
+- #7015: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.34.0 to 1.34.1 in /plugins/common
+- #7011: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.8.1 to 10.9 in /docs/_build
+- #7037: @dependabot[bot] chore(deps): bump python from 3.12.4-alpine to 3.12.5-alpine in /docs/_build
+- #7023: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.30 to 9.5.31 in /docs/_build
+- #7032: @dependabot[bot] chore(deps): bump pyyaml from 6.0.1 to 6.0.2 in /docs/_build
+- #7031: @dependabot[bot] chore(deps): bump golang from 1.22.5 to 1.22.6 in /tests/apps/zombies-dockerfile-tini
+- #7021: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.6 to 44.5.7
+- #7029: @dependabot[bot] chore(deps): bump golang from 1.22.5 to 1.22.6 in /tests/apps/zombies-dockerfile-no-tini
+- #6999: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.5 to 44.5.6
+- #7002: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.12.0 to 0.12.1 in /plugins/ps
+- #7004: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.28 to 9.5.30 in /docs/_build
+- #7006: @dependabot[bot] chore(deps): bump importlib-metadata from 8.0.0 to 8.2.0 in /docs/_build
+- #7007: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.33.1 to 1.34.0 in /plugins/common
+- #7008: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.33.1 to 1.34.0 in /plugins/config
+- #6996: @dependabot[bot] chore(deps): bump setuptools from 68.0.0 to 70.0.0 in /tests/apps/dockerfile-release
+
+## 0.34.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.7/bootstrap.sh
+sudo DOKKU_TAG=v0.34.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6984: @josegonzalez Correctly pass around arguments when displaying container log output
+
+### New Features
+
+- #6992: @josegonzalez feat: add logging when hsts nginx config is not using built-in template
+
+### Dependencies
+
+- #6988: @dependabot[bot] chore(deps): bump django from 5.0.6 to 5.0.7 in /tests/apps/dockerfile-release
+- #6987: @dependabot[bot] chore(deps): bump ruby from 3.3.3 to 3.3.4 in /tests/apps/dockerfile-entrypoint
+- #6972: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.9.0 to 0.12.0 in /plugins/ps
+- #6898: @josegonzalez Update all dependencies in the dokku ecosystem
+- #6978: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.21 to 11.0.22 in /tests/apps/java
+- #6961: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.9.0 to 0.11.0 in /plugins/ps
+- #6981: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.24.0 to 0.25.0 in /plugins/common
+- #6980: @dependabot[bot] chore(deps): bump golang from 1.22.4 to 1.22.5 in /tests/apps/gogrpc
+- #6979: @dependabot[bot] chore(deps): bump golang from 1.22.4 to 1.22.5 in /tests/apps/go-fail-postdeploy
+- #6977: @dependabot[bot] chore(deps): bump golang from 1.22.4 to 1.22.5 in /tests/apps/zombies-dockerfile-tini
+- #6976: @dependabot[bot] chore(deps): bump golang from 1.22.4 to 1.22.5 in /tests/apps/zombies-dockerfile-no-tini
+- #6975: @dependabot[bot] chore(deps): bump golang from 1.22.4 to 1.22.5 in /tests/apps/go-fail-predeploy
+- #6971: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.64.0 to 1.65.0 in /tests/apps/gogrpc
+- #6963: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.27 to 9.5.28 in /docs/_build
+- #6956: @dependabot[bot] chore(deps): bump importlib-metadata from 7.2.0 to 8.0.0 in /docs/_build
+- #6951: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.7.0 to 3.7.1 in /tests/apps/java
+- #6952: @dependabot[bot] chore(deps): bump importlib-metadata from 7.2.0 to 7.2.1 in /docs/_build
+- #6955: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.3 to 44.5.5
+- #6957: @dependabot[bot] chore(deps): bump djangorestframework from 3.14.0 to 3.15.2 in /tests/apps/dockerfile-release
+- #6958: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.8.1 to 0.9.0 in /plugins/ps
+
+## 0.34.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.6/bootstrap.sh
+sudo DOKKU_TAG=v0.34.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6949: @josegonzalez Set permissions correctly on all files in the builder-release process
+
+### Documentation
+
+- #6948: @anand2312 Fix grammar in docs/getting-started/advanced-installation
+
+### Dependencies
+
+- #6943: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.2 to 44.5.3
+- #6940: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.26 to 9.5.27 in /docs/_build
+- #6941: @dependabot[bot] chore(deps): bump timberio/vector from 0.38.0-debian to 0.39.0-debian in /plugins/logs
+- #6946: @dependabot[bot] chore(deps): bump importlib-metadata from 7.1.0 to 7.2.0 in /docs/_build
+
+## 0.34.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.5/bootstrap.sh
+sudo DOKKU_TAG=v0.34.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6835: @erickedji Add missing local RE_IPV4 & RE_IPV6 vars in core-post-deploy
+
+### New Features
+
+- #6808: @Coffee2CodeNL Traefik optional custom http https entrypoints
+
+### Documentation
+
+- #6937: @irth docs: add `network_mode: bridge` to the docker compose example
+- #6871: @chrisjsimpson Update dockerfile example in port management docs
+- #6857: @josegonzalez Update link to dokku development blog
+- #6821: @andrew-womeldorf Add tailscale plugin to community plugin list
+- #6823: @powdahound Remove errant tab character in cron:set help text
+- #6809: @alexislefebvre Update CI badge in readme
+
+### Dependencies
+
+- #6934: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.6.1 to 3.7.0 in /tests/apps/java
+- #6935: @dependabot[bot] chore(deps): bump braces from 3.0.2 to 3.0.3 in /tests/apps/multi
+- #6938: @dependabot[bot] chore(deps): bump ruby from 3.3.2 to 3.3.3 in /tests/apps/dockerfile-entrypoint
+- #6922: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.23.0 to 0.24.0 in /plugins/common
+- #6929: @dependabot[bot] chore(deps): bump python from 3.12.3-alpine to 3.12.4-alpine in /docs/_build
+- #6925: @dependabot[bot] chore(deps): bump zipp from 3.18.2 to 3.19.2 in /docs/_build
+- #6914: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.5.1 to 44.5.2
+- #6916: @dependabot[bot] chore(deps): bump ruby from 3.3.1 to 3.3.2 in /tests/apps/dockerfile-entrypoint
+- #6921: @dependabot[bot] chore(deps): bump golang from 1.22.3 to 1.22.4 in /tests/apps/zombies-dockerfile-no-tini
+- #6920: @dependabot[bot] chore(deps): bump golang from 1.22.3 to 1.22.4 in /tests/apps/zombies-dockerfile-tini
+- #6923: @dependabot[bot] chore(deps): bump golang from 1.22.3 to 1.22.4 in /tests/apps/go-fail-postdeploy
+- #6915: @dependabot[bot] chore(deps): bump lucaslorentz/caddy-docker-proxy from 2.8 to 2.9 in /plugins/caddy-vhosts
+- #6924: @dependabot[bot] chore(deps): bump golang from 1.22.3 to 1.22.4 in /tests/apps/gogrpc
+- #6927: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.24 to 9.5.26 in /docs/_build
+- #6926: @dependabot[bot] chore(deps): bump golang from 1.22.3 to 1.22.4 in /tests/apps/go-fail-predeploy
+- #6930: @dependabot[bot] chore(deps): bump packaging from 24.0 to 24.1 in /docs/_build
+- #6931: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.34.1 to 1.34.2 in /tests/apps/gogrpc
+- #6903: @dependabot[bot] chore(deps): bump requests from 2.31.0 to 2.32.0 in /tests/apps/lambda-python
+- #6901: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.23 to 9.5.24 in /docs/_build
+- #6908: @dependabot[bot] chore(deps): bump watchdog from 4.0.0 to 4.0.1 in /docs/_build
+- #6909: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.4.0 to 44.5.1
+- #6873: @dependabot[bot] chore(deps): bump werkzeug from 3.0.2 to 3.0.3 in /tests/apps/python-flask
+- #6892: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.3.0 to 44.4.0
+- #6891: @dependabot[bot] chore(deps): bump github.com/fatih/color from 1.16.0 to 1.17.0 in /plugins/common
+- #6886: @dependabot[bot] chore(deps): bump golang from 1.22.2 to 1.22.3 in /tests/apps/gogrpc
+- #6894: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.63.2 to 1.64.0 in /tests/apps/gogrpc
+- #6888: @dependabot[bot] chore(deps): bump timberio/vector from 0.36.1-debian to 0.38.0-debian in /plugins/logs
+- #6885: @dependabot[bot] chore(deps): bump golang from 1.22.2 to 1.22.3 in /tests/apps/zombies-dockerfile-tini
+- #6887: @dependabot[bot] chore(deps): bump golang from 1.22.2 to 1.22.3 in /tests/apps/go-fail-postdeploy
+- #6883: @dependabot[bot] chore(deps): bump golang from 1.22.2 to 1.22.3 in /tests/apps/zombies-dockerfile-no-tini
+- #6879: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.34.0 to 1.34.1 in /tests/apps/gogrpc
+- #6874: @dependabot[bot] chore(deps): bump jinja2 from 3.1.3 to 3.1.4 in /tests/apps/python-flask
+- #6876: @dependabot[bot] chore(deps): bump pygments from 2.17.2 to 2.18.0 in /docs/_build
+- #6875: @dependabot[bot] chore(deps): bump dokku/openresty-docker-proxy from 0.7.0 to 0.8.0 in /plugins/openresty-vhosts
+- #6878: @dependabot[bot] chore(deps): bump jinja2 from 3.1.3 to 3.1.4 in /docs/_build
+- #6880: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.22.0 to 0.23.0 in /plugins/common
+- #6884: @dependabot[bot] chore(deps): bump golang from 1.22.2 to 1.22.3 in /tests/apps/go-fail-predeploy
+- #6897: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.20 to 11.0.21 in /tests/apps/java
+- #6896: @dependabot[bot] chore(deps): bump zipp from 3.18.1 to 3.18.2 in /docs/_build
+- #6895: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.20 to 9.5.23 in /docs/_build
+- #6858: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.8 to 10.8.1 in /docs/_build
+- #6859: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.19 to 9.5.20 in /docs/_build
+- #6860: @dependabot[bot] chore(deps): bump node from 21-alpine to 22-alpine in /tests/apps/dockerfile-procfile
+- #6861: @dependabot[bot] chore(deps): bump node from 21-alpine to 22-alpine in /tests/apps/dockerfile-procfile-bad
+- #6862: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.33.0 to 1.33.1 in /plugins/common
+- #6863: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.33.0 to 1.33.1 in /plugins/config
+- #6865: @dependabot[bot] chore(deps): bump node from 21-alpine to 22-alpine in /tests/apps/dockerfile
+- #6866: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.33.0 to 1.34.0 in /tests/apps/gogrpc
+- #6867: @dependabot[bot] chore(deps): bump node from 21-alpine to 22-alpine in /tests/apps/dockerfile-noexpose
+- #6868: @dependabot[bot] chore(deps): bump node from 21-alpine to 22-alpine in /tests/apps/dockerfile-app-json-formations
+- #6849: @dependabot[bot] chore(deps): bump mkdocs from 1.5.3 to 1.6.0 in /docs/_build
+- #6852: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.18 to 9.5.19 in /docs/_build
+- #6850: @dependabot[bot] chore(deps): bump ruby from 3.3.0 to 3.3.1 in /tests/apps/dockerfile-entrypoint
+- #6845: @josegonzalez chore: update dependencies
+- #6843: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.32.0 to 1.33.0 in /plugins/common
+- #6844: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.32.0 to 1.33.0 in /plugins/config
+- #6842: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.1.0 to 44.3.0
+- #6841: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.7.1 to 10.8 in /docs/_build
+- #6839: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.21.0 to 0.23.0 in /plugins/config
+- #6837: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.21.0 to 0.23.0 in /tests/apps/gogrpc
+- #6838: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.21.0 to 0.23.0 in /plugins/common
+- #6840: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.21.0 to 0.23.0 in /plugins/scheduler-k3s
+- #6836: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.0.1 to 44.1.0
+- #6831: @dependabot[bot] chore(deps): bump gunicorn from 21.2.0 to 22.0.0 in /tests/apps/python-flask
+- #6829: @dependabot[bot] chore(deps): bump gunicorn from 20.1.0 to 22.0.0 in /tests/apps/dockerfile-release
+- #6830: @dependabot[bot] chore(deps): bump gunicorn from 21.2.0 to 22.0.0 in /tests/apps/multi
+- #6828: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.17 to 9.5.18 in /docs/_build
+- #6825: @dependabot[bot] chore(deps): bump sqlparse from 0.4.4 to 0.5.0 in /tests/apps/dockerfile-release
+- #6819: @dependabot[bot] chore(deps): bump traefik from 2.11.1 to 2.11.2 in /plugins/traefik-vhosts
+- #6817: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 44.0.0 to 44.0.1
+- #6816: @dependabot[bot] chore(deps): bump python from 3.12.2-alpine to 3.12.3-alpine in /docs/_build
+- #6818: @dependabot[bot] chore(deps): bump traefik from 2.11.0 to 2.11.1 in /plugins/traefik-vhosts
+- #6810: @dependabot[bot] chore(deps): bump flask from 3.0.2 to 3.0.3 in /tests/apps/python-flask
+- #6811: @dependabot[bot] chore(deps): bump flask from 3.0.2 to 3.0.3 in /tests/apps/multi
+- #6812: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.63.0 to 1.63.2 in /tests/apps/gogrpc
+
+### Other
+
+- #6855: @kcdragon Update Health Check documentation to include `port`
+
+## 0.34.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.4/bootstrap.sh
+sudo DOKKU_TAG=v0.34.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6801: @josegonzalez Guard against invalid proxy values due to move of port mapping to ports plugin
+- #6798: @josegonzalez Implement missing scheduler-app-status trigger in k3s scheduler plugin
+- #6791: @josegonzalez Correct issue where pre-deploy scripts do not have root access
+
+### New Features
+
+- #6800: @josegonzalez Update message for deployment tasks that execute in ephemeral containers
+
+### Documentation
+
+- #6799: @josegonzalez Document that a registry is required for k3s usage
+
+### Tests
+
+- #6802: @josegonzalez Update test for new deployment task output
+
+### Dependencies
+
+- #6807: @josegonzalez chore: bump go modules
+- #6805: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 in /plugins/common
+- #6806: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.21.0 to 0.22.0 in /plugins/common
+- #6803: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 in /plugins/scheduler-docker-local
+- #6804: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 in /plugins/app-json
+- #6794: @dependabot[bot] chore(deps): bump golang from 1.22.1 to 1.22.2 in /tests/apps/zombies-dockerfile-tini
+- #6796: @dependabot[bot] chore(deps): bump golang from 1.22.1 to 1.22.2 in /tests/apps/gogrpc
+- #6793: @dependabot[bot] chore(deps): bump golang from 1.22.1 to 1.22.2 in /tests/apps/zombies-dockerfile-no-tini
+- #6797: @dependabot[bot] chore(deps): bump golang from 1.22.1 to 1.22.2 in /tests/apps/go-fail-postdeploy
+- #6795: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.62.1 to 1.63.0 in /tests/apps/gogrpc
+- #6792: @dependabot[bot] chore(deps): bump golang from 1.22.1 to 1.22.2 in /tests/apps/go-fail-predeploy
+
+## 0.34.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.3/bootstrap.sh
+sudo DOKKU_TAG=v0.34.3 bash bootstrap.sh
+```
+
+### New Features
+
+- #6785: @josegonzalez Update herokuish requirement to better support readonly containers
+
+### Documentation
+
+- #6788: @bumblefudge Fix typos in nginx documentation
+- #6789: @crazehang Fix typos in documentation
+
+### Dependencies
+
+- #6786: @dependabot[bot] chore(deps): bump werkzeug from 3.0.1 to 3.0.2 in /tests/apps/python-flask
+- #6787: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.16 to 9.5.17 in /docs/_build
+- #6782: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.15 to 9.5.16 in /docs/_build
+
+## 0.34.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.2/bootstrap.sh
+sudo DOKKU_TAG=v0.34.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6779: @josegonzalez Add --global flag to ps:set
+- #6778: @josegonzalez Popd out of tmp directory after a git push-based deployment
+- #6777: @josegonzalez Use correct function name in openresty:report output
+
+### Documentation
+
+- #6781: @josegonzalez Update builder management docs to warn that globally setting a builder will force all apps to use that builder
+- #6780: @josegonzalez Clarify ssh-keys commands to run when adding ssh keys in docker-based installation
+
+### Other
+
+- #6776: @josegonzalez Use a long git sha in the git:report output
+
+## 0.34.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.1/bootstrap.sh
+sudo DOKKU_TAG=v0.34.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6775: @josegonzalez Ensure files get created with the correct permissions when building with herokuish
+- #6739: @AndrewKvalheim Dereference annotated git tags when deploying via git:sync
+- #6743: @testwill Fix typo in app-json output
+
+### New Features
+
+- #6768: @josegonzalez Migrate away from transitional packages
+
+### Documentation
+
+- #6763: @iloveitaly Add docker-compose example to installation docs
+- #6757: @josegonzalez Add documentation issue template
+- #6742: @josegonzalez Remove trailing whitespace from history doc
+
+### Dependencies
+
+- #6772: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 43.0.1 to 44.0.0
+- #6766: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.14 to 9.5.15 in /docs/_build
+- #6744: @dependabot[bot] chore(deps): bump github.com/docker/docker from 24.0.7+incompatible to 24.0.9+incompatible in /plugins/scheduler-k3s
+- #6754: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/dockerfile-app-json-formations
+- #6745: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/nodejs-express
+- #6746: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 43.0.0 to 43.0.1
+- #6747: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/.websocket.disabled
+- #6748: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/nodejs-express-noprocfile
+- #6749: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/nodejs-express-noappjson
+- #6750: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/dockerfile-procfile-bad
+- #6751: @dependabot[bot] chore(deps): bump importlib-metadata from 7.0.2 to 7.1.0 in /docs/_build
+- #6752: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/dockerfile-procfile
+- #6753: @dependabot[bot] chore(deps): bump express from 4.18.3 to 4.19.1 in /tests/apps/gitsubmodules
+- #6741: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.31.1 to 1.32.0 in /plugins/common
+- #6740: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.31.1 to 1.32.0 in /plugins/config
+
+## 0.34.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.34.0/bootstrap.sh
+sudo DOKKU_TAG=v0.34.0 bash bootstrap.sh
+```
+
+See the [0.34.0 migration guide](/docs/appendices/0.34.0-migration-guide.md) for more information on migrating to 0.34.0.
+
+### Bug Fixes
+
+- #6724: @josegonzalez Correctly check if a repository has code or not in git plugin
+- #6721: @josegonzalez Correct issue where cron properties cannot be retrieved if global
+- #6720: @josegonzalez Add nginx-property binary to gitignore
+- #6708: @josegonzalez Correctly handle quoted spaces over ssh
+- #6707: @josegonzalez Correct issue where removing by index failed due to incorrect input validation
+- #6705: @josegonzalez Ensure we cleanup the data directory on app deletion
+- #6703: @josegonzalez Use copytruncate in logrotate commands
+
+### New Features
+
+- #6725: @josegonzalez Warn when publish ports if scaling up or zero downtime is enabled
+- #6719: @josegonzalez Add a make target to copy the dokku binary over
+- #6717: @josegonzalez Add ability to only build synced repo if there are changes
+- #6715: @josegonzalez Add disk utilization to report output
+- #6704: @josegonzalez Switch the default k3s routing layer from traefik to nginx
+
+### Removals
+
+- #6700: @josegonzalez Remove priority property from traefik plugin
+
+### Refactors
+
+- #6714: @josegonzalez Use CallPlugnTrigger instead of PlugnTriggerSetup
+- #6713: @josegonzalez Use CallPlugnTrigger instead of PlugnTrigger
+- #6712: @josegonzalez Use CallPlugnTrigger instead of PlugnTriggerOutput
+- #6711: @josegonzalez Use CallPlugnTrigger instead of PlugnTriggerOutputAsString
+- #6681: @josegonzalez Migrate to single ingress per app/domain combination when using nginx for k3s proxying
+- #6156: @josegonzalez Migrate the app deploy lock to the data directory
+
+### Documentation
+
+- #6738: @josegonzalez Update migration guide for 0.34.x
+- #6731: @strugee Clarify alternate proxy support status
+
+### Dependencies
+
+- #6736: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.13 to 9.5.14 in /docs/_build
+- #6729: @dependabot[bot] chore(deps): update markdown requirement from <3.6,>=3.2.1 to >=3.2.1,<3.7 in /docs/_build
+- #6728: @dependabot[bot] chore(deps): bump zipp from 3.17.0 to 3.18.1 in /docs/_build
+- #6727: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.1.0 to 43.0.0
+- #6723: @dependabot[bot] chore(deps): bump zipp from 3.17.0 to 3.18.0 in /docs/_build
+- #6722: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.1.0 to 43.0.0
+- #6710: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 in /plugins/scheduler-k3s
+- #6709: @dependabot[bot] chore(deps): bump zipp from 3.17.0 to 3.18.0 in /docs/_build
+
+### Other
+
+- #6718: @josegonzalez Write current process id to all acquired lock files
+- #6706: @josegonzalez Remove git:unlock command
+- #6650: @bastianh Do not expose all containers via traefik by default
+- #6632: @josegonzalez Simplify file ownership in the container by setting the process ownership during the build process
+- #6630: @josegonzalez Remove unused code for copying cache directories
+
+## 0.33.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.9/bootstrap.sh
+sudo DOKKU_TAG=v0.33.9 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6695: @josegonzalez Do not attempt to install both k3s and traefik
+- #6687: @josegonzalez Correct issue where ClusterTriggerAuthentication objects were filtered based on prefix
+- #6686: @josegonzalez Validate input for the autoscaling-auth:set command
+- #6678: @josegonzalez Handle case where most builders didn't detect amd64 images on arm64
+- #6677: @josegonzalez Handle case where keda isn't installed properly
+- #6676: @josegonzalez Drop extra logging call from app-json plugin
+- #6674: @josegonzalez Remove systemd reverse dependency by dropping software-properties-common
+
+### New Features
+
+- #6698: @josegonzalez Upgrade ingress-nginx
+- #6588: @taraszka Add extra tags to every image dokku push when push-extra-tags are set
+- #6680: @josegonzalez Wait until helm charts are installed before marking a deploy as failed or completed
+
+### Documentation
+
+- #6699: @josegonzalez Add a placeholder migration guide for 0.33.0
+- #6682: @josegonzalez Fix reference to formation key in autoscaling example
+
+### Tests
+
+- #6696: @josegonzalez Run k3s tests with a specified server ip
+- #6679: @josegonzalez Split out k3s tests to speed up ci
+
+### Dependencies
+
+- #6697: @dependabot[bot] chore(deps): bump timberio/vector from 0.36.0-debian to 0.36.1-debian in /plugins/logs
+- #6685: @dependabot[bot] chore(deps): bump github.com/go-jose/go-jose/v3 from 3.0.1 to 3.0.3 in /plugins/scheduler-k3s
+- #6692: @dependabot[bot] chore(deps): bump packaging from 23.2 to 24.0 in /docs/_build
+- #6693: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.7 to 42.1.0
+- #6689: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.6 to 42.0.7
+- #6683: @dependabot[bot] chore(deps): bump importlib-metadata from 7.0.1 to 7.0.2 in /docs/_build
+- #6684: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.5 to 42.0.6
+
+## 0.33.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.8/bootstrap.sh
+sudo DOKKU_TAG=v0.33.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6675: @josegonzalez Remove the need for executing crontab as root
+- #6660: @josegonzalez Handle case where systemctl isn't in /usr/bin
+- #6659: @josegonzalez Add missing cron:set command
+- #6658: @josegonzalez Execute go get/build with mod in readonly mode
+- #6642: @josegonzalez Use correct annotations key for the ingress chart
+- #6631: @josegonzalez Correctly use cache volume for herokuish builds
+- #6629: @josegonzalez Use smaller reference to image pull secrets in secret naming
+- #6628: @josegonzalez Ensure non-web processes do not attempt to perform web logic in k3s templates
+- #6623: @josegonzalez Do not allow reusing the same scheme:host-port mappings when setting ports
+- #6624: @taraszka Install jq in vagrant vm
+- #6614: @josegonzalez Correct issue where --force-tty was not properly supported by run:detached calls
+
+### New Features
+
+- #6673: @josegonzalez Add image version as label to built images
+- #6640: @josegonzalez Add initial support for injecting keda addons
+- #6662: @josegonzalez Allow limiting letsencrypt to certain domains when using openresty as a proxy
+- #6643: @josegonzalez Add ability to add extra labels
+- #6639: @josegonzalez Add support for setting underscores-in-headers for nginx, openresty, and k3s
+- #6634: @josegonzalez feat: install keda addon in k3s cluster
+- #6616: @josegonzalez Ensure referenced images get updated by dependabot
+- #6613: @josegonzalez Add a helper binary to deploy a test app for local development
+
+### Refactors
+
+- #6644: @josegonzalez Only apply the cluster issuers helm chart when setting letsencrypt properties
+- #6641: @josegonzalez Rename image pull secrets to standardize on secret naming pattern
+- #6626: @josegonzalez Copy code into initial base image via docker build
+
+### Documentation
+
+- #6656: @holamendi Fix typo in builder management docs
+- #6652: @Calyhre Added dokku-mdns to list of community plugins
+- #6649: @undercontr Added detach flag to Docker installation documentation
+
+### Dependencies
+
+- #6671: @josegonzalez Update dokku dependencies
+- #6672: @dependabot[bot] chore(deps): bump golang from 1.22.0 to 1.22.1 in /tests/apps/go-fail-predeploy
+- #6670: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 in /tests/apps/gogrpc
+- #6669: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 in /tests/apps/gogrpc
+- #6668: @dependabot[bot] chore(deps): bump golang from 1.22.0 to 1.22.1 in /tests/apps/zombies-dockerfile-tini
+- #6667: @dependabot[bot] chore(deps): bump golang from 1.22.0 to 1.22.1 in /tests/apps/gogrpc
+- #6664: @dependabot[bot] chore(deps): bump golang from 1.22.0 to 1.22.1 in /tests/apps/go-fail-postdeploy
+- #6666: @dependabot[bot] chore(deps): bump pyparsing from 3.1.1 to 3.1.2 in /docs/_build
+- #6665: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.12 to 9.5.13 in /docs/_build
+- #6663: @dependabot[bot] chore(deps): bump golang from 1.22.0 to 1.22.1 in /tests/apps/zombies-dockerfile-no-tini
+- #6661: @josegonzalez Bump go modules
+- #6654: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.7 to 10.7.1 in /docs/_build
+- #6653: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.20.0 to 0.21.0 in /plugins/common
+- #6651: @dependabot[bot] chore(deps): bump python-dateutil from 2.9.0 to 2.9.0.post0 in /docs/_build
+- #6648: @dependabot[bot] chore(deps): bump python-dateutil from 2.8.2 to 2.9.0 in /docs/_build
+- #6645: @dependabot[bot] chore(deps): bump rack from 2.2.8 to 2.2.8.1 in /tests/apps/ruby
+- #6646: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.11 to 9.5.12 in /docs/_build
+- #6638: @josegonzalez chore: bump go modules
+- #6635: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.4 to 42.0.5
+- #6636: @dependabot[bot] chore(deps): bump timberio/vector from 0.36.X-debian to 0.36.0-debian in /plugins/logs
+- #6637: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.19.0 to 0.20.0 in /plugins/common
+- #6619: @dependabot[bot] chore(deps): bump traefik from v2.10 to 2.11 in /plugins/traefik-vhosts
+- #6622: @josegonzalez chore(deps): bump timberio/vector from 0.35.X-debian to 0.36.X-debian in /plugins/logs
+- #6618: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.10 to 9.5.11 in /docs/_build
+- #6621: @dependabot[bot] chore(deps): bump byjg/easy-haproxy from 4.3.0 to 4.4.0 in /plugins/haproxy-vhosts
+- #6610: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.14.1 to 3.14.2 in /plugins/scheduler-k3s
+
+## 0.33.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.7/bootstrap.sh
+sudo DOKKU_TAG=v0.33.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6608: @josegonzalez Fix issue with setting k3s resource values and lower the initial default values
+- #6607: @josegonzalez Call sed in unbuffered form to ensure log output is streamed to stdout
+- #6600: @josegonzalez Use correct label key for worker nodes
+- #6593: @josegonzalez Remove extra trailing newline to fix govet issue
+
+### New Features
+
+- #6595: @josegonzalez Add ability for users to specify alternative kubeconfig and kubecontext
+
+### Refactors
+
+- #6594: @josegonzalez Remove all calls to common.NewShellCmd
+- #6592: @josegonzalez Remove all calls to common.NewShellCmdWithArgs
+- #6591: @josegonzalez Always capture stdout/stderr when executing subprocesses
+- #6590: @josegonzalez Remove all direct usage of go-sh outside of plugin trigger setup
+
+### Dependencies
+
+- #6609: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.61.1 to 1.62.0 in /tests/apps/gogrpc
+- #6604: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.9 to 9.5.10 in /docs/_build
+- #6603: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.2 to 42.0.4
+- #6601: @dependabot[bot] chore(deps): bump helm.sh/helm/v3 from 3.13.3 to 3.14.1 in /plugins/scheduler-k3s
+- #6596: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.61.0 to 1.61.1 in /tests/apps/gogrpc
+
+## 0.33.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.6/bootstrap.sh
+sudo DOKKU_TAG=v0.33.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6589: @josegonzalez Use image pull secrets instead of registries.yaml to reference private repositories when deploying via k3s
+- #6581: @josegonzalez Fix issues in tls handling when deploying via k3s
+- #6582: @josegonzalez Correctly handle extra whitespace in scale file contents
+- #6390: @renweibo Prefer systemctl over sv when both exist while restarting nginx
+- #6579: @josegonzalez Ensure k3s can be installed with taints
+
+### New Features
+
+- #6585: @josegonzalez Add more context to errors in fetching cron entries
+- #6583: @josegonzalez Add WithContext functions for all subprocess-related code
+
+### Refactors
+
+- #6584: @josegonzalez Use new CallExecCommand when checking to see how help is being called
+
+### Dependencies
+
+- #6586: @dependabot[bot] chore(deps): bump mvdan.cc/sh/v3 from 3.7.0 to 3.8.0 in /plugins/cron
+- #6587: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.8 to 9.5.9 in /docs/_build
+- #6381: @dependabot[bot] chore(deps): bump actions/upload-artifact from 3 to 4
+- #6578: @josegonzalez Bump go modules
+
+### Other
+
+- #6576: @Tashows Allow creating a detached container with TTY enabled for attaching remote terminal
+
+## 0.33.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.5/bootstrap.sh
+sudo DOKKU_TAG=v0.33.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6574: @josegonzalez Correct indentation when configuring https on a k3s app
+
+### Documentation
+
+- #6575: @josegonzalez Remove reference to web ui from digitalocean install documentation
+
+### Dependencies
+
+- #6573: @dependabot[bot] chore(deps): bump golang from 1.21.6 to 1.22.0 in /tests/apps/go-fail-postdeploy
+- #6569: @dependabot[bot] chore(deps): bump golang from 1.21.6 to 1.22.0 in /tests/apps/go-fail-predeploy
+- #6570: @dependabot[bot] chore(deps): bump golang.org/x/crypto from 0.18.0 to 0.19.0 in /plugins/common
+- #6571: @dependabot[bot] chore(deps): bump golang from 1.21.6 to 1.22.0 in /tests/apps/zombies-dockerfile-tini
+- #6572: @dependabot[bot] chore(deps): bump python from 3.12.1-alpine to 3.12.2-alpine in /docs/_build
+
+## 0.33.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.4/bootstrap.sh
+sudo DOKKU_TAG=v0.33.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6564: @josegonzalez Ignore link and volume flags for nixpacks builds
+- #6563: @josegonzalez Wait until initial k3s node is ready before installing manifests
+- #6561: @josegonzalez Index the process map to ensure the correct config is pulled
+- #6560: @josegonzalez Skip app stop/delete when k3s is not installed
+- #6559: @josegonzalez Check errors when writing properties
+- #6556: @josegonzalez Respect the release namespace when creating resources for a k3s deploy
+
+### New Features
+
+- #6562: @josegonzalez Add support for specifying annotations on kubernetes resources
+- #6555: @josegonzalez Add support for app-specific service accounts when deploying via k3s
+- #6546: @josegonzalez Install kubectx and kubens helper binaries when setting up a k3s cluster
+
+### Refactors
+
+- #6558: @josegonzalez Use type-specific functions for writing contents to a file
+- #6557: @josegonzalez Consolidate property fetching for nginx plugin into golang codebase
+- #6536: @josegonzalez Manage vector container via compose
+
+### Documentation
+
+- #6545: @josegonzalez Migrate markdown doc rewriting into mkdocs hooks
+
+### Tests
+
+- #6554: @josegonzalez Fix issue where CI cannot install docker-buildx-plugin
+
+### Dependencies
+
+- #6568: @dependabot[bot] chore(deps): bump golang from 1.21.6 to 1.22.0 in /tests/apps/gogrpc
+- #6567: @dependabot[bot] chore(deps): bump watchdog from 3.0.0 to 4.0.0 in /docs/_build
+- #6566: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.7 to 9.5.8 in /docs/_build
+- #6565: @dependabot[bot] chore(deps): bump golang from 1.21.6 to 1.22.0 in /tests/apps/zombies-dockerfile-no-tini
+- #6551: @dependabot[bot] chore(deps): bump flask from 3.0.1 to 3.0.2 in /tests/apps/multi
+- #6552: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.6 to 9.5.7 in /docs/_build
+- #6553: @dependabot[bot] chore(deps): bump markupsafe from 2.1.4 to 2.1.5 in /docs/_build
+- #6550: @dependabot[bot] chore(deps): bump flask from 3.0.1 to 3.0.2 in /tests/apps/python-flask
+- #6548: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.19 to 11.0.20 in /tests/apps/java
+
+### Other
+
+- #6547: @josegonzalez Add support for nginx as a k3s ingress implementation
+
+## 0.33.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.3/bootstrap.sh
+sudo DOKKU_TAG=v0.33.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6542: @josegonzalez Drop -- when calling dokku run for cron-tab templating
+
+### Documentation
+
+- #6543: @josegonzalez Add support for badge shortcodes in documentation
+
+## 0.33.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.2/bootstrap.sh
+sudo DOKKU_TAG=v0.33.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6535: @josegonzalez Properly fetch default vector image if none is passed
+- #6533: @josegonzalez Ensure all k3s traefik middleware resources are scoped to the process
+- #6524: @josegonzalez Ensure all copied files always have line endings converted to unix-style
+
+### New Features
+
+- #6537: @josegonzalez Add the dokku logo as the chart icon
+- #6527: @josegonzalez Upgrade vector image to 0.35.x
+- #6534: @josegonzalez Allow specifying an ingress class via chart value
+
+### Documentation
+
+- #6530: @josegonzalez Fix indentation on letsencrypt sections for k3s scheduler docs
+
+### Tests
+
+- #6532: @josegonzalez Correct issues in tests for vector image log property
+
+### Dependencies
+
+- #6540: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.5 to 9.5.6 in /docs/_build
+- #6538: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.1 to 42.0.2
+- #6528: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 42.0.0 to 42.0.1
+- #6529: @dependabot[bot] chore(deps): bump google.golang.org/protobuf from 1.31.0 to 1.32.0 in /tests/apps/gogrpc
+
+### Other
+
+- #6526: @josegonzalez Allow setting the vector image as a global property
+
+## 0.33.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.1/bootstrap.sh
+sudo DOKKU_TAG=v0.33.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6520: @josegonzalez Guard against missing healthcheck config
+- #6519: @josegonzalez Use correct name for cluster-issuers helm chart
+
+### Refactors
+
+- #6521: @josegonzalez Install traefik via helm chart directly to avoid issues where traefik silently fails installation
+
+### Dependencies
+
+- #6523: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.4 to 9.5.5 in /docs/_build
+- #6522: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.60.1 to 1.61.0 in /tests/apps/gogrpc
+
+## 0.33.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.33.0/bootstrap.sh
+sudo DOKKU_TAG=v0.33.0 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6466: @josegonzalez Use correct key for migrating global scheduler configuration on upgrade
+- #6450: @josegonzalez Always set -- on docker run commands internally to avoid parsing flags on specified commands
+- #6447: @josegonzalez Propagate arm64 build support for development builds
+- #6445: @josegonzalez Do not strip whitespace when displaying a file for debugging purposes
+- #6442: @josegonzalez Ignore go.work when bumping modules
+- #6427: @josegonzalez Add missing gitignore entry for app-json trigger
+
+### New Features
+
+- #6500: @josegonzalez Add support for custom user namespaces when creating persistent storage directories
+- #6492: @josegonzalez Add support for multierror when exiting triggers
+- #6491: @josegonzalez Add wrappers for exec and ssh commands
+- #6489: @josegonzalez Disable flag parsing for dokku enter
+- #6469: @josegonzalez Allow generating an ssh deploy key via the git plugin
+- #6468: @josegonzalez Implement global support for setting proxy type
+- #6467: @josegonzalez Add ability to customize the registry repo with a template
+- #6464: @josegonzalez Create helper function for exposing a docker image's working directory
+- #6462: @josegonzalez Ensure ps:stop has a proper cli header
+- #6460: @josegonzalez Add a post-registry-login trigger
+- #6459: @josegonzalez Alias common registry names to docker.io
+- #6457: @josegonzalez Add the ability to specify the output format when listing ports
+- #6452: @josegonzalez Add alternative implementation for calling plugin triggers
+- #6446: @josegonzalez Add support for global-only environment properties
+- #6443: @josegonzalez Add support for exposing healthchecks in the AppJson struct
+- #6435: @josegonzalez Implement native k3s scheduler support
+- #6433: @josegonzalez Add go.work.sum to gitignore
+- #6432: @josegonzalez Upgrade golang to 1.21.6
+- #6430: @josegonzalez Reformat devcontainer file
+- #6428: @josegonzalez Add ms-azuretools.vscode-docker to devcontainer setup
+- #6313: @josegonzalez Set the platform flag in order to run amd64 images on arm64 deploy targets
+
+### Refactors
+
+- #6448: @josegonzalez Return an int32 for scale count
+- #6444: @josegonzalez Allow setting a custom mode when writing a slice to a file
+
+### Documentation
+
+- #6517: @josegonzalez Remove k3s tutorial from documentation
+- #6516: @josegonzalez Note that the external kubernetes plugin is deprecated
+- #6515: @josegonzalez Replace the kubernetes plugin with k3s in the documentation
+- #6514: @josegonzalez Add notes on k3s replacement of the scheduler-kubernetes plugin
+- #6461: @josegonzalez Add documentation for implementing scheduler-related commands
+- #6458: @josegonzalez Add docblocks to appjson structs
+- #6420: @aochagavia Fix typo in zero downtime documentation
+
+### Tests
+
+- #6465: @josegonzalez Update haproxy tests so they pass
+- #6449: @josegonzalez Run ci on ubuntu 22.04
+- #6431: @josegonzalez Add golanglint-ci testing support
+
+### Dependencies
+
+- #6513: @dependabot[bot] chore(deps): bump github.com/containerd/containerd from 1.7.6 to 1.7.11 in /plugins/scheduler-k3s
+- #6512: @josegonzalez Update github.com/gonsi/gomega golang dependency
+- #6511: @josegonzalez Update crypto and sys golang dependencies
+- #6494: @dependabot[bot] chore(deps): bump markupsafe from 2.1.3 to 2.1.4 in /docs/_build
+- #6482: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.3 to 9.5.4 in /docs/_build
+- #6478: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/zombies-dockerfile-tini
+- #6456: @dependabot[bot] chore(deps): bump google.golang.org/grpc from 1.29.1 to 1.60.1 in /tests/apps/gogrpc
+- #6454: @dependabot[bot] chore(deps): bump flask from 3.0.0 to 3.0.1 in /tests/apps/python-flask
+- #6455: @dependabot[bot] chore(deps): bump flask from 3.0.0 to 3.0.1 in /tests/apps/multi
+- #6453: @josegonzalez Remove ignored dependency from dependabot
+- #6451: @josegonzalez Update go modules
+- #6439: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.30.0 to 1.31.0 in /plugins/config
+- #6438: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.30.0 to 1.31.0 in /plugins/common
+- #6437: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.12.2 to 4.12.3 in /docs/_build
+- #6436: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 41.1.1 to 42.0.0
+- #6425: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 41.0.1 to 41.1.1
+- #6424: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.3 to 9.5.4 in /docs/_build
+- #6421: @josegonzalez chore: bump golang.org/x/sync from 0.5.0 to 0.6.0
+- #6419: @dependabot[bot] chore(deps): bump jinja2 from 3.1.2 to 3.1.3 in /docs/_build
+- #6418: @dependabot[bot] chore(deps): bump jinja2 from 3.1.2 to 3.1.3 in /tests/apps/python-flask
+- #6415: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/go-fail-postdeploy
+- #6414: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/gogrpc
+- #6413: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/go-fail-predeploy
+- #6412: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/zombies-dockerfile-no-tini
+- #6411: @dependabot[bot] chore(deps): bump golang from 1.21.5 to 1.21.6 in /tests/apps/zombies-dockerfile-tini
+- #6410: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.19.0 to 0.20.0 in /tests/apps/gogrpc
+- #6406: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.5.0 to 0.6.0 in /plugins/scheduler-docker-local
+
+### Other
+
+- #6463: @josegonzalez Use exported function from appjson module instead of manually parsing
+- #6429: @josegonzalez Use go.work for development purposes
+
+## 0.32.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.32.4/bootstrap.sh
+sudo DOKKU_TAG=v0.32.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6407: @josegonzalez Upgrade ruby to fix the release process
+- #6394: @josegonzalez Scope the delete of symlinked plugins in debian post-install to the plugin folders
+
+### Refactors
+
+- #6388: @Juneezee Replace deprecated `io/ioutil` functions
+
+### Documentation
+
+- #6385: @josegonzalez Fix docblock entries for properties in plugins
+- #6384: @josegonzalez Cleanup some markdown in documentation
+- #6365: @josegonzalez Split out archive/image deployment docs into their own file
+
+### Tests
+
+- #6408: @josegonzalez Add options to the release workflow
+- #6359: @josegonzalez Update buildpack api for test buildpack
+
+### Dependencies
+
+- #6399: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.5 to 10.7 in /docs/_build
+- #6398: @dependabot[bot] chore(deps): bump sinatra from 3.1.0 to 3.2.0 in /tests/apps/ruby
+- #6395: @dependabot[bot] chore(deps): bump ruby from 3.2.2 to 3.3.0 in /tests/apps/dockerfile-entrypoint
+- #6391: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.2 to 9.5.3 in /docs/_build
+- #6392: @dependabot[bot] chore(deps): bump importlib-metadata from 7.0.0 to 7.0.1 in /docs/_build
+- #6393: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.2.3 to 41.0.1
+- #6387: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.18 to 11.0.19 in /tests/apps/java
+- #6386: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.2.2 to 40.2.3
+- #6377: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.2.1 to 40.2.2
+- #6380: @dependabot[bot] chore(deps): bump github/codeql-action from 2 to 3
+- #6379: @dependabot[bot] chore(deps): bump mkdocs-material from 9.5.1 to 9.5.2 in /docs/_build
+- #6378: @dependabot[bot] chore(deps): bump python from 3.12.0-alpine to 3.12.1-alpine in /docs/_build
+- #6376: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.14 to 9.5.1 in /docs/_build
+- #6371: @dependabot[bot] chore(deps): bump golang from 1.21.4 to 1.21.5 in /tests/apps/gogrpc
+- #6369: @dependabot[bot] chore(deps): bump golang from 1.21.4 to 1.21.5 in /tests/apps/zombies-dockerfile-tini
+- #6368: @dependabot[bot] chore(deps): bump golang from 1.21.4 to 1.21.5 in /tests/apps/zombies-dockerfile-no-tini
+- #6367: @dependabot[bot] chore(deps): bump importlib-metadata from 6.8.0 to 7.0.0 in /docs/_build
+- #6366: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.2.0 to 40.2.1
+- #6370: @dependabot[bot] chore(deps): bump golang from 1.21.4 to 1.21.5 in /tests/apps/go-fail-predeploy
+- #6372: @dependabot[bot] chore(deps): bump golang from 1.21.4 to 1.21.5 in /tests/apps/go-fail-postdeploy
+- #6373: @dependabot[bot] chore(deps): bump actions/setup-python from 4 to 5
+- #6364: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.18.0 to 0.19.0 in /tests/apps/gogrpc
+- #6361: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.4 to 10.5 in /docs/_build
+- #6362: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.12 to 9.4.14 in /docs/_build
+- #6360: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.1.1 to 40.2.0
+- #6357: @dependabot[bot] chore(deps): bump mkdocs-material-extensions from 1.3 to 1.3.1 in /docs/_build
+- #6355: @dependabot[bot] chore(deps): bump pygments from 2.16.1 to 2.17.2 in /docs/_build
+- #6358: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.8 to 9.4.12 in /docs/_build
+- #6348: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.3.1 to 10.4 in /docs/_build
+
+## 0.32.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.32.3/bootstrap.sh
+sudo DOKKU_TAG=v0.32.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6345: @josegonzalez Use updated pre-build trigger for builder-herokuish
+
+### New Features
+
+- #6346: @josegonzalez Update all go modules and add a command to bump modules
+
+### Documentation
+
+- #6339: @nschlemm Fixed link to vector sink documentation
+- #6314: @josegonzalez Remove reference to DOKKU_SCHEDULER environment variable in favor of scheduler:set
+- #6317: @edmorley Replace deprecated builder reference in persistent-storage.md
+- #6325: @josegonzalez Add documentation on openresty includes
+
+### Dependencies
+
+- #6343: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.17.0 to 0.18.0 in /tests/apps/gogrpc
+- #6338: @dependabot[bot] chore(deps): bump golang from 1.21.3 to 1.21.4 in /tests/apps/go-fail-postdeploy
+- #6337: @dependabot[bot] chore(deps): bump golang from 1.21.3 to 1.21.4 in /tests/apps/gogrpc
+- #6336: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.0.2 to 40.1.1
+- #6335: @dependabot[bot] chore(deps): bump golang from 1.21.3 to 1.21.4 in /tests/apps/go-fail-predeploy
+- #6334: @dependabot[bot] chore(deps): bump golang from 1.21.3 to 1.21.4 in /tests/apps/zombies-dockerfile-tini
+- #6333: @dependabot[bot] chore(deps): bump golang from 1.21.3 to 1.21.4 in /tests/apps/zombies-dockerfile-no-tini
+- #6328: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.7 to 9.4.8 in /docs/_build
+- #6320: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.17 to 11.0.18 in /tests/apps/java
+- #6318: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.6 to 9.4.7 in /docs/_build
+- #6322: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 40.0.0 to 40.0.2
+- #6323: @dependabot[bot] chore(deps): bump django from 4.1.10 to 4.1.13 in /tests/apps/dockerfile-release
+
+### Other
+
+- #6315: @josegonzalez Correct key in dependency file to fix docker-container-healthchecker installs on local arm64 servers
+
+## 0.32.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.32.2/bootstrap.sh
+sudo DOKKU_TAG=v0.32.2 bash bootstrap.sh
+```
+
+### New Features
+
+- #6324: @josegonzalez Update openresty image to 0.6.0
+
+### Documentation
+
+- #6316: @holamendi Fix docs app-exists plugin trigger description
+
+### Dependencies
+
+- #6307: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.7.0 to 0.8.0
+- #6308: @dependabot[bot] chore(deps): bump werkzeug from 3.0.0 to 3.0.1 in /tests/apps/python-flask
+- #6310: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.28.1 to 1.29.0 in /plugins/config
+- #6311: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.2.4 to 40.0.0
+
+## 0.32.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.32.1/bootstrap.sh
+sudo DOKKU_TAG=v0.32.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6286: @josegonzalez Remove trailing quote on openresty letsencrypt email
+- #6287: @josegonzalez Recursively delete old custom openresty includes
+
+### New Features
+
+- #6303: @josegonzalez feat: add the ability to specify location-block includes
+
+### Documentation
+
+- #6288: @josegonzalez Add missing link to nixpacks builder
+
+### Dependencies
+
+- #6306: @dependabot[bot] chore(deps): bump org.apache.maven.plugins:maven-dependency-plugin from 3.6.0 to 3.6.1 in /tests/apps/java
+- #6301: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.28.0 to 1.28.1 in /plugins/config
+- #6304: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.2.3 to 39.2.4
+- #6305: @dependabot[bot] chore(deps): bump actions/setup-node from 3 to 4
+- #6297: @dependabot[bot] chore(deps): bump node from 20-alpine to 21-alpine in /tests/apps/dockerfile-procfile
+- #6292: @dependabot[bot] chore(deps): bump node from 20-alpine to 21-alpine in /tests/apps/dockerfile-procfile-bad
+- #6293: @dependabot[bot] chore(deps): bump node from 20-alpine to 21-alpine in /tests/apps/dockerfile
+- #6294: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.3 to 10.3.1 in /docs/_build
+- #6295: @dependabot[bot] chore(deps): bump node from 20-alpine to 21-alpine in /tests/apps/dockerfile-app-json-formations
+- #6296: @dependabot[bot] chore(deps): bump node from 20-alpine to 21-alpine in /tests/apps/dockerfile-noexpose
+- #6289: @dependabot[bot] chore(deps): bump mkdocs-material-extensions from 1.2 to 1.3 in /docs/_build
+- #6290: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.2.2 to 39.2.3
+
+## 0.32.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.32.0/bootstrap.sh
+sudo DOKKU_TAG=v0.32.0 bash bootstrap.sh
+```
+
+See the [0.32.0 migration guide](/docs/appendices/0.32.0-migration-guide.md) for more information on migrating to 0.32.0.
+
+### New Features
+
+- #6277: @josegonzalez Run ps:restore in parallel by default
+- #6276: @josegonzalez Warn when incorrect interface/port in use for web processes
+- #6132: @josegonzalez Add the ability to specify a custom mailto for all cron output
+- #6124: @josegonzalez Add a shell function to check if a plugin trigger exists
+- #5348: @josegonzalez Add nixpacks builder support
+
+### Removals
+
+- #6283: @josegonzalez Remove deprecated proxy-ports functions and and plugin subcommands
+
+### Deprecations
+
+- #6127: @josegonzalez Deprecate the builder-specific pre-release-* triggers in favor of a global pre-release-builder trigger
+- #6126: @josegonzalez Deprecate the builder-specific post-build-* triggers in favor of a global post-build trigger
+- #6125: @josegonzalez Deprecate the builder-specific pre-build-* triggers in favor of a global pre-build trigger
+
+### Documentation
+
+- #6284: @josegonzalez Document future removal of deprecated CHECKS file format
+- #6123: @josegonzalez Add a migration guide for 0.32.x
+
+### Dependencies
+
+- #6285: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.5 to 9.4.6 in /docs/_build
+- #6281: @josegonzalez Upgrade golang to 1.21
+
+### Other
+
+- #6155: @josegonzalez Remove ARM support
+
+## 0.31.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.5/bootstrap.sh
+sudo DOKKU_TAG=v0.31.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6275: @josegonzalez Update message referencing CHECKS file usage to app.json
+- #6273: @josegonzalez Clean up local build images immediately after an image is released
+
+### New Features
+
+- #6274: @josegonzalez Add more version output to dokku report command
+- #6255: @josegonzalez Add ci concurrency to linting workflow
+- #6253: @josegonzalez Add ci concurrency to doc building
+- #6254: @josegonzalez Add ci concurrency to codeql analysis
+- #6222: @josegonzalez Install docker-buildx-plugin to silence buildx warnings
+
+### Refactors
+
+- #6257: @josegonzalez Manage Dokku system dependencies in a single file
+
+### Documentation
+
+- #6271: @josegonzalez Update list of official, community, and deprecated plugins
+- #6224: @joeyates Correct typo in example app.json for healthchecks
+- #6207: @AlejandroAkbal Update port clearing command in Dockerfile deploy documentation
+
+### Tests
+
+- #6278: @josegonzalez Remove pack installation from builder-lambda tests
+
+### Dependencies
+
+- #6269: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.14.0 to 0.17.0 in /plugins/common
+- #6270: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.2.1 to 39.2.2
+- #6262: @dependabot[bot] chore(deps): bump golang from 1.21.2 to 1.21.3 in /tests/apps/zombies-dockerfile-no-tini
+- #6263: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.16.0 to 0.17.0 in /tests/apps/gogrpc
+- #6264: @dependabot[bot] chore(deps): bump golang from 1.21.2 to 1.21.3 in /tests/apps/zombies-dockerfile-tini
+- #6265: @dependabot[bot] chore(deps): bump golang from 1.21.2 to 1.21.3 in /tests/apps/go-fail-predeploy
+- #6259: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.16 to 11.0.17 in /tests/apps/java
+- #6260: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.4 to 9.4.5 in /docs/_build
+- #6261: @dependabot[bot] chore(deps): bump golang from 1.21.2 to 1.21.3 in /tests/apps/gogrpc
+- #6266: @dependabot[bot] chore(deps): bump golang from 1.21.2 to 1.21.3 in /tests/apps/go-fail-postdeploy
+- #6258: @dependabot[bot] chore(deps): update markdown requirement from <3.5,>=3.2.1 to >=3.2.1,<3.6 in /docs/_build
+- #6256: @josegonzalez chore: bump github.com/otiai10/copy and golang.org/x/sync
+- #6241: @dependabot[bot] chore(deps): bump python from 3.11.5-alpine to 3.12.0-alpine in /docs/_build
+- #6252: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.2 to 9.4.4 in /docs/_build
+- #6235: @dependabot[bot] chore(deps): bump packaging from 23.1 to 23.2 in /docs/_build
+- #6232: @dependabot[bot] chore(deps): bump werkzeug from 2.3.7 to 3.0.0 in /tests/apps/python-flask
+- #6231: @dependabot[bot] chore(deps): bump flask from 2.3.3 to 3.0.0 in /tests/apps/python-flask
+- #6248: @dependabot[bot] chore(deps): bump golang from 1.21.1 to 1.21.2 in /tests/apps/gogrpc
+- #6251: @dependabot[bot] chore(deps): bump golang from 1.21.1 to 1.21.2 in /tests/apps/zombies-dockerfile-tini
+- #6250: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.15.0 to 0.16.0 in /tests/apps/gogrpc
+- #6249: @dependabot[bot] chore(deps): bump golang from 1.21.1 to 1.21.2 in /tests/apps/go-fail-predeploy
+- #6247: @dependabot[bot] chore(deps): bump golang from 1.21.1 to 1.21.2 in /tests/apps/zombies-dockerfile-no-tini
+- #6246: @dependabot[bot] chore(deps): bump golang from 1.21.1 to 1.21.2 in /tests/apps/go-fail-postdeploy
+- #6245: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.3.0 to 0.4.0 in /plugins/scheduler-docker-local
+- #6233: @dependabot[bot] chore(deps): bump flask from 2.3.3 to 3.0.0 in /tests/apps/multi
+- #6239: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.12.0 to 1.14.0 in /plugins/ps
+- #6234: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.12.0 to 1.14.0 in /plugins/builder
+- #6240: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.2.0 to 39.2.1
+- #6228: @josegonzalez Update all go modules and ensure all are tracked in dependabot
+- #6227: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.27.10 to 1.28.0 in /plugins/common
+- #6216: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.1.2 to 39.2.0
+- #6217: @dependabot[bot] chore(deps): bump mkdocs-material from 9.4.1 to 9.4.2 in /docs/_build
+- #6215: @dependabot[bot] chore(deps): bump mkdocs-material from 9.3.1 to 9.4.1 in /docs/_build
+- #6214: @dependabot[bot] chore(deps): bump mkdocs-material-extensions from 1.1.1 to 1.2 in /docs/_build
+- #6209: @dependabot[bot] chore(deps): bump zipp from 3.16.2 to 3.17.0 in /docs/_build
+- #6211: @dependabot[bot] chore(deps): bump mkdocs from 1.5.2 to 1.5.3 in /docs/_build
+- #6213: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.0.2 to 39.1.2
+- #6202: @dependabot[bot] chore(deps): bump docker/setup-buildx-action from 2 to 3
+- #6199: @dependabot[bot] chore(deps): bump docker/login-action from 2 to 3
+- #6200: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 39.0.0 to 39.0.2
+- #6201: @dependabot[bot] chore(deps): bump docker/setup-qemu-action from 2 to 3
+- #6203: @dependabot[bot] chore(deps): bump mkdocs-material from 9.2.8 to 9.3.1 in /docs/_build
+
+## 0.31.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.4/bootstrap.sh
+sudo DOKKU_TAG=v0.31.4 bash bootstrap.sh
+```
+
+### Documentation
+
+- #5958: @gamedevsam Update command used to retrieve image digest when image is not pushed to a registry
+
+### Dependencies
+
+- #6194: @dependabot[bot] chore(deps): bump golang from 1.21.0 to 1.21.1 in /tests/apps/go-fail-predeploy
+- #6197: @dependabot[bot] chore(deps): bump golang from 1.21.0 to 1.21.1 in /tests/apps/gogrpc
+- #6195: @dependabot[bot] chore(deps): bump golang from 1.21.0 to 1.21.1 in /tests/apps/go-fail-postdeploy
+- #6196: @dependabot[bot] chore(deps): bump golang from 1.21.0 to 1.21.1 in /tests/apps/zombies-dockerfile-tini
+- #6193: @dependabot[bot] chore(deps): bump golang from 1.21.0 to 1.21.1 in /tests/apps/zombies-dockerfile-no-tini
+- #6190: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.14.0 to 0.15.0 in /tests/apps/gogrpc
+
+### Other
+
+- #6191: @josegonzalez chore: remove debug logging from git plugin
+
+## 0.31.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.3/bootstrap.sh
+sudo DOKKU_TAG=v0.31.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6179: @rct-k Fix build cache for herokuish-built apps
+
+### Tests
+
+- #6177: @maxvisser Update shellcheck junit integration for newer version of shellcheck
+
+### Dependencies
+
+- #6186: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.2.1 to 10.3 in /docs/_build
+- #6184: @dependabot[bot] chore(deps): bump soupsieve from 2.4.1 to 2.5 in /docs/_build
+- #6183: @dependabot[bot] chore(deps): bump actions/checkout from 3 to 4
+- #6187: @dependabot[bot] chore(deps): bump mkdocs-material from 9.2.6 to 9.2.8 in /docs/_build
+- #6188: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 38.2.0 to 39.0.0
+- #6173: @dependabot[bot] chore(deps): bump org.eclipse.jetty:jetty-servlet from 11.0.15 to 11.0.16 in /tests/apps/java
+- #6174: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 38.1.3 to 38.2.0
+- #6175: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.2 to 10.2.1 in /docs/_build
+- #6176: @dependabot[bot] chore(deps): bump mkdocs-material from 9.2.5 to 9.2.6 in /docs/_build
+- #6171: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.1 to 10.2 in /docs/_build
+- #6168: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 38.1.0 to 38.1.3
+- #6170: @dependabot[bot] chore(deps): bump mkdocs-material from 9.2.3 to 9.2.5 in /docs/_build
+- #6169: @dependabot[bot] chore(deps): bump python from 3.11.4-alpine to 3.11.5-alpine in /docs/_build
+
+## 0.31.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.2/bootstrap.sh
+sudo DOKKU_TAG=v0.31.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6154: @josegonzalez Ensure app clones have domains setup
+- #6164: @josegonzalez Use correct path for openresty letsencrypt data
+- #6165: @josegonzalez Ensure we cleanup extracted files prior to next deployment
+- #6166: @josegonzalez Remove unused source from openresty trigger
+- #6163: @josegonzalez Add missing triggers for openresty-vhosts plugin
+- #6151: @josegonzalez Do not pass an empty argument to scheduler-run when triggering cron tasks manually
+- #6150: @josegonzalez Correct issue where temp file cleanup fails deploy
+
+### Documentation
+
+- #6167: @josegonzalez Correct svg path on homepage
+- #6153: @imankulov Fix superscript typos in plugin documentation
+
+### Tests
+
+- #6152: @josegonzalez Use buildjet for building arm images
+- #6149: @josegonzalez Fix issue where CI cannot install docker-compose-plugin
+
+### Dependencies
+
+- #6161: @josegonzalez Upgrade sigil to 0.10.1
+- #6162: @josegonzalez Upgrade herokuish to 0.7.1
+- #6160: @josegonzalez Upgrade sshcommand to 0.17.1
+- #6159: @josegonzalez Upgrade procfile-util to 0.16.0
+- #6158: @josegonzalez Upgrade netrc to 0.7.1
+- #6157: @josegonzalez Upgrade lambda-builder to 0.5.0
+- #6147: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.6.1 to 38.1.0
+- #6145: @dependabot[bot] chore(deps): bump mkdocs-material from 9.2.2 to 9.2.3 in /docs/_build
+- #6139: @dependabot[bot] chore(deps): bump flask from 2.3.2 to 2.3.3 in /tests/apps/multi
+- #6140: @dependabot[bot] chore(deps): bump flask from 2.3.2 to 2.3.3 in /tests/apps/python-flask
+- #6141: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.21 to 9.2.2 in /docs/_build
+
+### Other
+
+- #6148: @josegonzalez Add missing relabel command to docker-image-labeler for CNB builder
+
+## 0.31.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.1/bootstrap.sh
+sudo DOKKU_TAG=v0.31.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6133: @josegonzalez Properly handle tag and branch pushes
+- #6131: @josegonzalez Ensure tmp files are cleaned up when commands exit
+- #6130: @josegonzalez Correct package for container healthchecker when building digitalocean image
+- #6121: @josegonzalez Add missing error-log-path function to openresty plugin
+
+### Documentation
+
+- #6129: @josegonzalez Cleanup markdown and use Github Admonitions
+
+### Dependencies
+
+- #6120: @dependabot[bot] chore(deps): bump click from 8.1.6 to 8.1.7 in /docs/_build
+- #6119: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.6.0 to 37.6.1
+- #6118: @dependabot[bot] chore(deps): bump werkzeug from 2.3.6 to 2.3.7 in /tests/apps/python-flask
+- #6115: @dependabot[bot] chore(deps): bump golang from 1.20.7 to 1.21.0 in /tests/apps/zombies-dockerfile-no-tini
+- #6114: @dependabot[bot] chore(deps): bump golang from 1.20.7 to 1.21.0 in /tests/apps/zombies-dockerfile-tini
+- #6104: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.13.0 to 0.14.0 in /tests/apps/gogrpc
+- #6113: @dependabot[bot] chore(deps): bump golang from 1.20.7 to 1.21.0 in /tests/apps/go-fail-predeploy
+- #6112: @dependabot[bot] chore(deps): bump golang from 1.20.7 to 1.21.0 in /tests/apps/go-fail-postdeploy
+- #6111: @dependabot[bot] chore(deps): bump golang from 1.20.7 to 1.21.0 in /tests/apps/gogrpc
+- #6107: @dependabot[bot] chore(deps): bump pygments from 2.15.1 to 2.16.1 in /docs/_build
+- #6106: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.5.2 to 37.6.0
+- #6105: @dependabot[bot] chore(deps): bump sinatra from 3.0.6 to 3.1.0 in /tests/apps/ruby
+
+### Other
+
+- #6122: @josegonzalez Plugin trigger and event cleanup
+
+## 0.31.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.31.0/bootstrap.sh
+sudo DOKKU_TAG=v0.31.0 bash bootstrap.sh
+```
+
+See the [0.31.0 migration guide](/docs/appendices/0.31.0-migration-guide.md) for more information on migrating to 0.31.0.
+
+### Backwards Compatibility Breaks
+
+- #6102: @josegonzalez Deprecate ARM as a build target
+- #6029: @josegonzalez Provide users the ability to override auto-detected port mappings
+
+### Bug Fixes
+
+- #6110: @josegonzalez Correctly handle rebase when generating release notes for minor/major releases
+- #6081: @josegonzalez Use correct namespace for haproxy service state tracking
+- #6079: @josegonzalez Remove debugging code from builder-dockerfile plugin
+- #6078: @josegonzalez Use correct quoting in format template when fetching exposed image ports
+- #6070: @josegonzalez Do not write empty values for nginx container labels
+- #6014: @josegonzalez Automatically clear the git source-image property when changing deployment methodologies
+- #5985: @josegonzalez Mount the traefik data directory instead of the acme.json file when starting traefik
+- #5979: @josegonzalez Do not start proxy implementations during server restore if they weren't manually started via the :start command
+- #5973: @josegonzalez Remove all containers and images by label on app destroy
+
+### New Features
+
+- #6100: @josegonzalez Add support for non-web healthchecks via app.json
+- #6098: @josegonzalez Upgrade traefik image from v2.8 to v2.10
+- #6097: @josegonzalez Upgrade caddy image from 2.7 to 2.8
+- #6082: @josegonzalez Add openresty proxy implementation
+- #6057: @josegonzalez Inject docker labels when nginx proxy implementation is in use
+- #6043: @josegonzalez Write auto-detected port mappings during a deploy
+- #6013: @josegonzalez Export environment variables during dockerfile builds for use with value-less --build-arg flags
+- #6007: @Firfi Add application/wasm to nginx.conf.sigil gzip
+- #5993: @josegonzalez Un-deprecate apps and config cli aliases
+- #5992: @josegonzalez Mount the vector data directory instead of the vector file
+- #5991: @josegonzalez Add the ability to execute a cron task on the fly
+- #5990: @josegonzalez Add json format output to cron:list command
+- #5989: @josegonzalez Skip scaled processes that are missing in the Procfile
+- #5978: @josegonzalez Export environment variables during dockerfile builds for use with value-less --build-arg flags
+- #5908: @josegonzalez Generate jobs for crontab in parallel
+- #5891: @josegonzalez Add support for specifying multiple networks on a given app
+
+### Refactors
+
+- #6042: @josegonzalez Rename port-map property to port
+- #6021: @josegonzalez Simplify ports-configure codebase
+- #6018: @josegonzalez Move code that fetches raw tcp ports for dockerfile deploys to ports plugin
+- #6017: @josegonzalez Deprecate proxy-configure-ports plugin trigger in favor of ports-configure
+- #6011: @josegonzalez Use ports-get plugn trigger for fetching port mappings
+- #6010: @josegonzalez Use ports-clear plugn trigger to manage clearing the port map
+- #5988: @josegonzalez Move crontab writing code to scheduler-docker-local plugin
+- #5975: @josegonzalez Standardize on shorthand for redirecting all output to /dev/null
+- #5974: @josegonzalez Standardize on ls subcommand when interacting with the docker binary
+
+### Documentation
+
+- #6116: @josegonzalez Remove extra newline in migration docs
+- #6099: @josegonzalez Clean up references in proxy plugins
+- #5987: @josegonzalez Clarify that a branch can be specified when updating a plugin
+
+### Tests
+
+- #6103: @josegonzalez Timeout docker image builds in CI
+- #6101: @josegonzalez Make it possible to specify an alternative base domain for tests
+- #6095: @josegonzalez Remove assertion for unconsumed build arguments
+- #6094: @josegonzalez Correct assertion for dockerfile builds when a variable is eval'd
+- #6080: @josegonzalez Add assertions to various bats tests
+- #6076: @josegonzalez Use assert_output_not_exists instead of asserting output is empty string
+- #6075: @josegonzalez Use an alternative curl request to ensure requests go to the local nginx
+- #6074: @josegonzalez Fix issue where networks weren't being torn down during testing
+- #6012: @josegonzalez Use ports:report to get the list of port mappings
+- #5977: @josegonzalez Move all shellcheck disable definitions to .shellcheckrc
+- #5976: @josegonzalez Remove Stickler configuration
+
+### Other
+
+- #6109: @josegonzalez Make heroku-22/jammy the default stack for cnb/herokuish builds
+- #6096: @josegonzalez Upgrade vector image from 0.23.x to 0.31.x
+- #6019: @josegonzalez Move code for fetching an available port to the ports plugin
+- #6015: @josegonzalez Move CHECKS file extraction to the beginning of the deploy
+- #5995: @josegonzalez Migrate the proxy port map from config variable to property system
+- #5986: @josegonzalez Move all port management code to standalone ports plugin
+- #5495: @josegonzalez Move herokuish app cache from the filesystem into a docker volume
+
+## 0.30.11
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.11/bootstrap.sh
+sudo DOKKU_TAG=v0.30.11 bash bootstrap.sh
+```
+
+### Dependencies
+
+- #6091: @dependabot[bot] chore(deps): bump mkdocs from 1.5.1 to 1.5.2 in /docs/_build
+- #6093: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.5.1 to 37.5.2
+- #6088: @dependabot[bot] chore(deps): bump golang from 1.20.6 to 1.20.7 in /tests/apps/gogrpc
+- #6087: @dependabot[bot] chore(deps): bump golang from 1.20.6 to 1.20.7 in /tests/apps/zombies-dockerfile-no-tini
+- #6086: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.12.0 to 0.13.0 in /tests/apps/gogrpc
+- #6085: @dependabot[bot] chore(deps): bump golang from 1.20.6 to 1.20.7 in /tests/apps/go-fail-postdeploy
+- #6084: @dependabot[bot] chore(deps): bump golang from 1.20.6 to 1.20.7 in /tests/apps/go-fail-predeploy
+- #6083: @dependabot[bot] chore(deps): bump golang from 1.20.6 to 1.20.7 in /tests/apps/zombies-dockerfile-tini
+- #6072: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.5.0 to 37.5.1
+- #6073: @dependabot[bot] chore(deps): bump pyparsing from 3.1.0 to 3.1.1 in /docs/_build
+
+## 0.30.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.10/bootstrap.sh
+sudo DOKKU_TAG=v0.30.10 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6036: @l3x4 Remove auth middleware from traefik compose setup when basic auth is not enabled
+- #6041: @josegonzalez Use updated path for devcontainer vscode extensions
+- #6022: @iphoting Fix issue with docker plugin-list install failing boot for docker-based installations
+- #6028: @josegonzalez Detect and use systemd on Debian systems when interacting with nginx
+
+### Documentation
+
+- #6068: @nickgal Fix typo in port management docs
+- #6063: @PabloCastellano Fix typo in nginx docs
+
+### Tests
+
+- #6035: @iphoting Allow the check-commit CI job to work with PRs from other repos
+
+### Dependencies
+
+- #6065: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.19 to 9.1.21 in /docs/_build
+- #6064: @dependabot[bot] chore(deps): bump mkdocs from 1.4.3 to 1.5.1 in /docs/_build
+- #6059: @josegonzalez Update go packages to fix build issues
+- #6058: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.4.0 to 37.5.0
+- #6053: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.3.0 to 37.4.0
+- #6049: @dependabot[bot] chore(deps): bump gunicorn from 21.1.0 to 21.2.0 in /tests/apps/multi
+- #6050: @dependabot[bot] chore(deps): bump click from 8.1.5 to 8.1.6 in /docs/_build
+- #6051: @dependabot[bot] chore(deps): bump gunicorn from 21.1.0 to 21.2.0 in /tests/apps/python-flask
+- #6052: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.1.2 to 37.3.0
+- #6048: @dependabot[bot] chore(deps): bump pyyaml from 6.0 to 6.0.1 in /docs/_build
+- #6047: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.18 to 9.1.19 in /docs/_build
+- #6046: @dependabot[bot] chore(deps): bump gunicorn from 20.1.0 to 21.1.0 in /tests/apps/python-flask
+- #6045: @dependabot[bot] chore(deps): bump gunicorn from 20.1.0 to 21.1.0 in /tests/apps/multi
+- #6044: @dependabot[bot] chore(deps): bump zipp from 3.16.1 to 3.16.2 in /docs/_build
+- #6038: @dependabot[bot] chore(deps): bump pymdown-extensions from 10.0.1 to 10.1 in /docs/_build
+- #6039: @dependabot[bot] chore(deps): bump click from 8.1.4 to 8.1.5 in /docs/_build
+- #6040: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.1.1 to 37.1.2
+- #6037: @dependabot[bot] chore(deps): bump zipp from 3.16.0 to 3.16.1 in /docs/_build
+- #6034: @dependabot[bot] chore(deps): bump golang from 1.20.5 to 1.20.6 in /tests/apps/zombies-dockerfile-tini
+- #6032: @dependabot[bot] chore(deps): bump golang from 1.20.5 to 1.20.6 in /tests/apps/zombies-dockerfile-no-tini
+- #6033: @dependabot[bot] chore(deps): bump golang from 1.20.5 to 1.20.6 in /tests/apps/gogrpc
+- #6031: @dependabot[bot] chore(deps): bump golang from 1.20.5 to 1.20.6 in /tests/apps/go-fail-postdeploy
+- #6030: @dependabot[bot] chore(deps): bump golang from 1.20.5 to 1.20.6 in /tests/apps/go-fail-predeploy
+- #6027: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.1.0 to 37.1.1
+- #6024: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.0.5 to 37.1.0
+- #6026: @dependabot[bot] chore(deps): bump importlib-metadata from 6.7.0 to 6.8.0 in /docs/_build
+- #6025: @dependabot[bot] chore(deps): bump zipp from 3.15.0 to 3.16.0 in /docs/_build
+
+### Other
+
+- #6056: @Coffee2CodeNL Add debian bookworm to release and bootstrap script
+
+## 0.30.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.9/bootstrap.sh
+sudo DOKKU_TAG=v0.30.9 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #6009: @josegonzalez Properly set the plugin repository name when installing in a docker-based dokku install
+- #5999: @caplod Fix http to https redirect in traefik
+
+### Documentation
+
+- #6006: @josegonzalez Clarify how to specify the contents of an ssh key for dokku
+- #5998: @kleutzinger Fix typo in scheduled cron task documentation
+- #5984: @josegonzalez Unify all Procfile-handling documentation under the process management docs
+- #5982: @josegonzalez Update docs to mention that files are extracted from source where source code is available
+
+### Dependencies
+
+- #6008: @dependabot[bot] chore(deps): bump click from 8.1.3 to 8.1.4 in /docs/_build
+- #6003: @dependabot[bot] chore(deps): bump django from 4.1.9 to 4.1.10 in /tests/apps/dockerfile-release
+- #6005: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.11.0 to 0.12.0 in /tests/apps/gogrpc
+- #6000: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.17 to 9.1.18 in /docs/_build
+
+## 0.30.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.8/bootstrap.sh
+sudo DOKKU_TAG=v0.30.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5941: @josegonzalez Use github token to avoid rate limiting during packer init
+- #5930: @michaelmulley Fix issue with docker plugin-list install failing boot for docker-based installations
+
+### New Features
+
+- #5962: @jaytula Add Debian 12 support to the bootstrap install script
+- #5926: @josegonzalez Update default herokuish version to 0.6.0
+
+### Documentation
+
+- #5943: @josegonzalez Add a note for each network type mentioning when they are best used
+- #5938: @josegonzalez Add build-base to ensure gcc is available
+- #5927: @aradalvand Improve docs about `X-Forwarded-*` headers and move it to nginx.md
+- #5921: @aradalvand Update dockerfiles.md to mention that BuildKit is the default builder from Docker v24 onwards
+- #5923: @aradalvand Remove `:master` from `git push` commands in the documentation
+
+### Tests
+
+- #5972: @josegonzalez Add permissions to allow publishing test results for pull requests
+- #5944: @josegonzalez Add the ability to skip ci when commit message includes a ci skip message or are docs related
+
+### Dependencies
+
+- #5971: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.0.4 to 37.0.5
+- #5967: @dependabot[bot] chore(deps): bump socket.io from 4.6.2 to 4.7.1 in /tests/apps/.websocket.disabled
+- #5968: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 37.0.3 to 37.0.4
+- #5966: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.16 to 9.1.17 in /docs/_build
+- #5965: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.4.1 to 37.0.3
+- #5957: @josegonzalez chore: update go packages to fix build issues
+- #5956: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.4.0 to 36.4.1
+- #5949: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 in /plugins/builder
+- #5951: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 in /plugins/ps
+- #5952: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 in /plugins/common
+- #5953: @dependabot[bot] chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 in /plugins/app-json
+- #5948: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.3.0 to 36.4.0
+- #5950: @dependabot[bot] chore(deps): bump importlib-metadata from 6.6.0 to 6.7.0 in /docs/_build
+- #5954: @dependabot[bot] chore(deps): bump pyparsing from 3.0.9 to 3.1.0 in /docs/_build
+- #5946: @josegonzalez Update to actions/checkout@v3
+- #5940: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.15 to 9.1.16 in /docs/_build
+- #5939: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.2.1 to 36.3.0
+- #5937: @josegonzalez chore: update go packages to fix build issues
+- #5934: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.2.0 to 0.3.0 in /plugins/app-json
+- #5933: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.1.0 to 36.2.1
+- #5935: @dependabot[bot] chore(deps): bump golang.org/x/sync from 0.2.0 to 0.3.0 in /plugins/common
+- #5928: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.10.0 to 0.11.0 in /tests/apps/gogrpc
+- #5922: @dependabot[bot] chore(deps): bump werkzeug from 2.3.5 to 2.3.6 in /tests/apps/python-flask
+- #5919: @dependabot[bot] chore(deps): bump python from 3.11.3-buster to 3.11.4-buster in /tests/apps/dockerfile-release
+- #5913: @dependabot[bot] chore(deps): bump golang from 1.20.4 to 1.20.5 in /tests/apps/go-fail-predeploy
+- #5915: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.27.7 to 1.27.8 in /plugins/config
+- #5916: @dependabot[bot] chore(deps): bump github.com/onsi/gomega from 1.27.7 to 1.27.8 in /plugins/common
+- #5917: @dependabot[bot] chore(deps): bump werkzeug from 2.3.4 to 2.3.5 in /tests/apps/python-flask
+- #5918: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.18 to 36.1.0
+- #5920: @dependabot[bot] chore(deps): bump python from 3.11.3-alpine to 3.11.4-alpine in /docs/_build
+- #5914: @dependabot[bot] chore(deps): bump golang from 1.20.4 to 1.20.5 in /tests/apps/zombies-dockerfile-no-tini
+- #5912: @dependabot[bot] chore(deps): bump golang from 1.20.4 to 1.20.5 in /tests/apps/go-fail-postdeploy
+- #5911: @dependabot[bot] chore(deps): bump golang from 1.20.4 to 1.20.5 in /tests/apps/gogrpc
+- #5910: @dependabot[bot] chore(deps): bump golang from 1.20.4 to 1.20.5 in /tests/apps/zombies-dockerfile-tini
+- #5909: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.17 to 36.0.18
+- #5906: @dependabot[bot] chore(deps): bump markupsafe from 2.1.2 to 2.1.3 in /docs/_build
+- #5907: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.15 to 36.0.17
+
+### Other
+
+- #5945: @josegonzalez tests: split out image building into it's own job to speed up ci
+- #5942: @josegonzalez Move the times function to functions.go
+
+## 0.30.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.7/bootstrap.sh
+sudo DOKKU_TAG=v0.30.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5905: @josegonzalez fix: trim whitespace on registry property values
+
+### Documentation
+
+- #5897: @josegonzalez Add cron-restart to plugin registry
+
+### Dependencies
+
+- #5904: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.11 to 36.0.15
+- #5902: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.10 to 36.0.11
+- #5900: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.9 to 36.0.10
+- #5898: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.8 to 36.0.9
+- #5899: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.14 to 9.1.15 in /docs/_build
+- #5894: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.6 to 36.0.8
+
+## 0.30.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.6/bootstrap.sh
+sudo DOKKU_TAG=v0.30.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5889: @josegonzalez Respect dashboard disabling properties in traefik
+- #5890: @josegonzalez Add missing report triggers and omitted proxy functionality
+- #5757: @josegonzalez Ensure users can push from an image-deploy repository and respect deploy-branch
+
+### New Features
+
+- #5873: @josegonzalez Add dependabot to all plugin dependencies
+
+### Dependencies
+
+- #5877: @dependabot[bot] chore(deps): bump github.com/multiformats/go-base36 from 0.1.1-0.20220823151017-f5af2eed4d9c to 0.2.0 in /plugins/cron
+- #5886: @josegonzalez chore: bump github.com/otiai10/copy from 1.9.0 to 1.11.0
+- #5875: @dependabot[bot] chore(deps): bump github.com/gofrs/flock from 0.8.0 to 0.8.1 in /plugins/ps
+- #5885: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 36.0.3 to 36.0.6
+- #5871: @dependabot[bot] chore(deps): bump tj-actions/changed-files from 35.9.2 to 36.0.3
+
+### Other
+
+- #5887: @josegonzalez chore: bump github.com/ryanuber/columnize from 1.1.2-0.20190319233515-9e6335e58db3 to 2.1.2+incompatible
+- #5872: @Samuelodan Fix typo in upgrading docs
+
+## 0.30.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.5/bootstrap.sh
+sudo DOKKU_TAG=v0.30.5 bash bootstrap.sh
+```
+
+### New Features
+
+- #5862: @edmorley Stop using the `latest` tag for the default `DOKKU_CNB_BUILDER`
+
+### Documentation
+
+- #5870: @josegonzalez Repair malformed code-block
+- #5863: @joker234 Remove reference to ssh github clone from app deployment docs
+
+### Tests
+
+- #5867: @josegonzalez Update linuxserver image used in tests to one that is compatible with arm64
+
+### Dependencies
+
+- #5868: @josegonzalez Update all golang dependencies to fix go.0 tests
+- #5856: @dependabot[bot] chore(deps): bump pymdown-extensions from 9.11 to 10.0.1 in /docs/_build
+- #5865: @dependabot[bot] chore(deps): bump requests from 2.27.1 to 2.31.0 in /tests/apps/lambda-python
+- #5864: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.12 to 9.1.14 in /docs/_build
+- #5866: @dependabot[bot] chore(deps): bump maven-dependency-plugin from 3.5.0 to 3.6.0 in /tests/apps/java
+
+## 0.30.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.4/bootstrap.sh
+sudo DOKKU_TAG=v0.30.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5786: @obrienmd Detect id_ed25519.pub in git:public-key command
+- #5758: @josegonzalez Support pack-based images that do not have a Procfile
+
+### New Features
+
+- #5851: @josegonzalez Allow setting _ as domain name for default nginx routing
+
+### Documentation
+
+- #5853: @josegonzalez Always overwrite bootstrap install file
+- #5828: @josegonzalez Add a note to the troubleshooting docs pointing developers to bind to all interfaces
+- #5827: @josegonzalez Add permalink support to headers
+
+### Tests
+
+- #5850: @josegonzalez Only run packer validation if any packer-related files were changed
+
+### Dependencies
+
+- #5837: @dependabot[bot] chore(deps): bump golang from 1.20.3 to 1.20.4 in /tests/apps/zombies-dockerfile-tini
+- #5836: @dependabot[bot] chore(deps): bump golang from 1.20.3 to 1.20.4 in /tests/apps/gogrpc
+- #5832: @dependabot[bot] chore(deps): bump flask from 2.3.1 to 2.3.2 in /tests/apps/multi
+- #5831: @dependabot[bot] chore(deps): bump flask from 2.3.1 to 2.3.2 in /tests/apps/python-flask
+- #5839: @dependabot[bot] chore(deps): bump mkdocs from 1.4.2 to 1.4.3 in /docs/_build
+- #5835: @dependabot[bot] chore(deps): bump golang from 1.20.3 to 1.20.4 in /tests/apps/zombies-dockerfile-no-tini
+- #5838: @dependabot[bot] chore(deps): bump golang from 1.20.3 to 1.20.4 in /tests/apps/go-fail-predeploy
+- #5841: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.9.0 to 0.10.0 in /tests/apps/gogrpc
+- #5842: @dependabot[bot] chore(deps): bump werkzeug from 2.3.1 to 2.3.4 in /tests/apps/python-flask
+- #5844: @dependabot[bot] chore(deps): bump django from 4.1.7 to 4.1.9 in /tests/apps/dockerfile-release
+- #5848: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.8 to 9.1.12 in /docs/_build
+- #5840: @dependabot[bot] chore(deps): bump golang from 1.20.3 to 1.20.4 in /tests/apps/go-fail-postdeploy
+- #5823: @dependabot[bot] chore(deps): bump flask from 2.2.3 to 2.3.1 in /tests/apps/python-flask
+- #5825: @dependabot[bot] chore(deps): bump flask from 2.2.3 to 2.3.1 in /tests/apps/multi
+- #5826: @dependabot[bot] chore(deps): bump werkzeug from 2.2.3 to 2.3.1 in /tests/apps/python-flask
+
+## 0.30.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.3/bootstrap.sh
+sudo DOKKU_TAG=v0.30.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5763: @josegonzalez Set dokku version correctly for digitalocean image build
+
+### New Features
+
+- #5799: @josegonzalez Add ability to run dokku report without downloading herokuish image
+
+### Documentation
+
+- #5810: @strugee Fix typo in 0.30.x migration guide
+- #5820: @tylercrumpton Fix "cotainer" typo in one-off tasks docs page.
+- #5800: @josegonzalez Fix indentation in registry configuration documentation
+
+### Dependencies
+
+- #5809: @dependabot[bot] chore(deps): bump pygments from 2.15.0 to 2.15.1 in /docs/_build
+- #5811: @dependabot[bot] chore(deps): bump node from 19-alpine to 20-alpine in /tests/apps/dockerfile-noexpose
+- #5812: @dependabot[bot] chore(deps): bump node from 19-alpine to 20-alpine in /tests/apps/dockerfile-procfile
+- #5813: @dependabot[bot] chore(deps): bump node from 19-alpine to 20-alpine in /tests/apps/dockerfile-procfile-bad
+- #5814: @dependabot[bot] chore(deps): bump node from 19-alpine to 20-alpine in /tests/apps/dockerfile
+- #5815: @dependabot[bot] chore(deps): bump node from 19-alpine to 20-alpine in /tests/apps/dockerfile-app-json-formations
+- #5816: @dependabot[bot] chore(deps): bump sqlparse from 0.4.3 to 0.4.4 in /tests/apps/dockerfile-release
+- #5818: @dependabot[bot] chore(deps): bump importlib-metadata from 6.5.0 to 6.6.0 in /docs/_build
+- #5821: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.6 to 9.1.8 in /docs/_build
+- #5805: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.14 to 11.0.15 in /tests/apps/java
+- #5808: @dependabot[bot] chore(deps): bump importlib-metadata from 6.3.0 to 6.5.0 in /docs/_build
+- #5802: @dependabot[bot] chore(deps): bump packaging from 23.0 to 23.1 in /docs/_build
+- #5806: @dependabot[bot] chore(deps): bump soupsieve from 2.4 to 2.4.1 in /docs/_build
+- #5779: @dependabot[bot] chore(deps): bump golang from 1.20.2 to 1.20.3 in /tests/apps/gogrpc
+- #5782: @dependabot[bot] chore(deps): bump golang from 1.20.2 to 1.20.3 in /tests/apps/go-fail-postdeploy
+- #5788: @dependabot[bot] chore(deps): bump python from 3.11.2-alpine to 3.11.3-alpine in /docs/_build
+- #5795: @dependabot[bot] chore(deps): bump pygments from 2.14.0 to 2.15.0 in /docs/_build
+- #5796: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.12.0 to 4.12.2 in /docs/_build
+- #5797: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.4 to 9.1.6 in /docs/_build
+- #5801: @dependabot[bot] chore(deps): bump sinatra from 3.0.5 to 3.0.6 in /tests/apps/ruby
+- #5794: @dependabot[bot] chore(deps): bump pymdown-extensions from 9.10 to 9.11 in /docs/_build
+- #5793: @dependabot[bot] chore(deps): bump importlib-metadata from 6.1.0 to 6.3.0 in /docs/_build
+- #5791: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.8.0 to 0.9.0 in /tests/apps/gogrpc
+- #5789: @dependabot[bot] chore(deps): bump python from 3.11.2-buster to 3.11.3-buster in /tests/apps/dockerfile-release
+- #5783: @dependabot[bot] chore(deps): bump golang from 1.20.2 to 1.20.3 in /tests/apps/zombies-dockerfile-tini
+- #5781: @dependabot[bot] chore(deps): bump golang from 1.20.2 to 1.20.3 in /tests/apps/zombies-dockerfile-no-tini
+- #5780: @dependabot[bot] chore(deps): bump golang from 1.20.2 to 1.20.3 in /tests/apps/go-fail-predeploy
+- #5775: @dependabot[bot] chore(deps): bump ruby from 3.2.1 to 3.2.2 in /tests/apps/dockerfile-entrypoint
+- #5774: @dependabot[bot] chore(deps): bump thin from 1.8.1 to 1.8.2 in /tests/apps/ruby
+- #5765: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.3 to 9.1.4 in /docs/_build
+
+## 0.30.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.2/bootstrap.sh
+sudo DOKKU_TAG=v0.30.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5749: @josegonzalez Keep image specified by git:from-image on app rebuild
+- #5750: @josegonzalez Return an error when an invalid scale count is encountered
+- #5748: @josegonzalez Correct set source type and source metadata
+
+### New Features
+
+- #5754: @josegonzalez Ignore release branches in changelog output
+
+### Removals
+
+- #5756: @josegonzalez Drop code supporting git versions without worktree support
+
+### Documentation
+
+- #5744: @josegonzalez Add DOKKU_LIB_HOST_ROOT to docker usage docs
+- #5740: @josegonzalez Add a note about how running plugin:install does not apply for docker-based installs
+- #5719: @TkTech Give a quick example of what to do after disabling the proxy to expose a UDP port
+- #5737: @Samuelodan Update instructions for setting letsencrypt global email
+- #5736: @josegonzalez Remove extra backtick from nginx docs
+- #5725: @IgnisDa Add surrealdb community plugin
+
+### Tests
+
+- #5755: @josegonzalez Ignore issue where errors are required to be lowercased
+
+### Dependencies
+
+- #5762: @dependabot[bot] chore(deps): bump watchdog from 2.3.1 to 3.0.0 in /docs/_build
+- #5760: @dependabot[bot] chore(deps): bump importlib-metadata from 6.0.0 to 6.1.0 in /docs/_build
+- #5761: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.11.2 to 4.12.0 in /docs/_build
+- #5745: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.2 to 9.1.3 in /docs/_build
+- #5746: @dependabot[bot] chore(deps): bump rack from 2.2.6.3 to 2.2.6.4 in /tests/apps/ruby
+- #5732: @dependabot[bot] chore(deps): bump github.com/golang/protobuf from 1.5.2 to 1.5.3 in /tests/apps/gogrpc
+- #5727: @dependabot[bot] chore(deps): bump golang from 1.20.1 to 1.20.2 in /tests/apps/zombies-dockerfile-tini
+- #5708: @dependabot[bot] chore(deps): bump zipp from 3.14.0 to 3.15.0 in /docs/_build
+- #5734: @dependabot[bot] chore(deps): bump mkdocs-material from 9.1.0 to 9.1.2 in /docs/_build
+- #5731: @dependabot[bot] chore(deps): bump rack from 2.2.6.2 to 2.2.6.3 in /tests/apps/ruby
+- #5730: @dependabot[bot] chore(deps): bump golang from 1.20.1 to 1.20.2 in /tests/apps/go-fail-predeploy
+- #5729: @dependabot[bot] chore(deps): bump golang from 1.20.1 to 1.20.2 in /tests/apps/zombies-dockerfile-no-tini
+- #5728: @dependabot[bot] chore(deps): bump golang from 1.20.1 to 1.20.2 in /tests/apps/gogrpc
+- #5726: @dependabot[bot] chore(deps): bump golang from 1.20.1 to 1.20.2 in /tests/apps/go-fail-postdeploy
+- #5723: @dependabot[bot] chore(deps): bump pymdown-extensions from 9.9.2 to 9.10 in /docs/_build
+- #5722: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.7.0 to 0.8.0 in /tests/apps/gogrpc
+- #5721: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.0.0-20220225172249-27dd8689420f to 0.7.0 in /plugins/common
+- #5715: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.5.0 to 0.7.0
+- #5712: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.13 to 11.0.14 in /tests/apps/java
+- #5713: @dependabot[bot] chore(deps): bump watchdog from 2.3.0 to 2.3.1 in /docs/_build
+- #5717: @dependabot[bot] chore(deps): bump mkdocs-material from 9.0.14 to 9.1.0 in /docs/_build
+- #5703: @dependabot[bot] chore(deps): bump golang.org/x/net from 0.0.0-20190813141303-74dc4d7220e7 to 0.7.0 in /tests/apps/gogrpc
+- #5705: @dependabot[bot] chore(deps): bump mkdocs-material from 9.0.13 to 9.0.14 in /docs/_build
+- #5704: @dependabot[bot] chore(deps): bump watchdog from 2.2.1 to 2.3.0 in /docs/_build
+- #5698: @dependabot[bot] chore(deps): bump golang.org/x/text from 0.3.7 to 0.3.8 in /plugins/common
+- #5697: @dependabot[bot] chore(deps): bump golang.org/x/text from 0.3.2 to 0.3.8 in /tests/apps/gogrpc
+
+### Other
+
+- #5751: @josegonzalez Update all golang dependencies to fix go.0 tests
+
+## 0.30.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.1/bootstrap.sh
+sudo DOKKU_TAG=v0.30.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5690: @josegonzalez Update dependencies for golang code to fix builds
+- #5683: @josegonzalez Ensure the services directory also exists
+- #5688: @josegonzalez Set custom entrypoint for pack-based containers so custom command/argument combinations are respected
+
+### New Features
+
+- #5682: @josegonzalez Build Digitalocean image automatically upon release
+- #5675: @josegonzalez Add new sections to release notes
+
+### Documentation
+
+- #5695: @josegonzalez Add a note about required upgrade to 0.29.x for versions prior to 0.25.x
+- #5689: @josegonzalez Add note about ubuntu 18.04 being deprecated
+- #5684: @josegonzalez Note that the app.json is pulled from the specified image when deploying via git:from-image
+- #5679: @josegonzalez Revert invalid replacement in homepage html path objects
+- #5678: @josegonzalez Cleanup docs on homepage for installation
+
+### Dependencies
+
+- #5693: @dependabot[bot] chore(deps): bump mkdocs-material from 9.0.12 to 9.0.13 in /docs/_build
+- #5694: @dependabot[bot] chore(deps): bump zipp from 3.13.0 to 3.14.0 in /docs/_build
+- #5677: @dependabot[bot] chore(deps): bump flask from 2.2.2 to 2.2.3 in /tests/apps/multi
+- #5676: @dependabot[bot] chore(deps): bump flask from 2.2.2 to 2.2.3 in /tests/apps/python-flask
+
+## 0.30.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.30.0/bootstrap.sh
+sudo DOKKU_TAG=v0.30.0 bash bootstrap.sh
+```
+
+See the [0.30.0 migration guide](/docs/appendices/0.30.0-migration-guide.md) for more information on migrating to 0.30.0.
+
+### Bug Fixes
+
+- #5674: @josegonzalez Use authenticated requests to the github api in order to generate changelogs for a release
+- #5604: @josegonzalez Trigger nginx proxy rebuild early to avoid downtime if deploying large numbers of processes
+- #5589: @josegonzalez Use warning_scheme variable instead of bare word in caddy-vhosts warning output
+- #5580: @josegonzalez Do not attempt to reinstall already installed plugins
+
+### New Features
+
+- #5663: @josegonzalez Update build-base docker image to ensure we can build on all supported platforms without stalling
+- #5308: @josegonzalez Implement haproxy proxy plugin
+- #5633: @josegonzalez Add auto-updates to docs python dependencies
+- #5603: @josegonzalez Add ability to deploy images generated via docker save with git:load-image
+- #5591: @josegonzalez Allow the herokuish builder to be detected when the computed allowed value is set not set to false
+- #5570: @josegonzalez Add support for customizing the remote in use for all commands sent via the official client
+- #5581: @josegonzalez Use short url for installation
+
+### Refactors
+
+- #5659: @josegonzalez Remove deprecated functions and commands
+
+### Documentation
+
+- #5658: @mpslanker Updated debian install docs to work on both debian and ubuntu
+- #5657: @josegonzalez Use correct version of Markdown for mkdocs
+- #5656: @josegonzalez Add "new as of" prefix to version in user management docs
+- #5645: @josegonzalez Update mkdocs-material features to cope with upgrade to 9.x
+- #5632: @josegonzalez Add a note mentioning that network aliases only work when attached to a network other than bridge
+- #5630: @josegonzalez Remove extra location block from built docs nginx config
+- #5616: @jcalfee Add a note about reloading nginx to troubleshooting docs
+- #5590: @josegonzalez Note that connecting to vagrant should be done via vagrant ssh
+- #5588: @josegonzalez Document how to route to server-local apps via a service proxy
+- #5585: @NicolasLM Improve instructions for disabling the default nginx site
+
+### Tests
+
+- #5673: @josegonzalez Cancel in progress builds when a new commit is pushed
+- #5611: @josegonzalez Add more debugging output to deploy tests
+- #5587: @josegonzalez Timeout build jobs within 45 minutes
+
+### Other
+
+- #5671: @dependabot[bot] chore(deps): bump soupsieve from 2.3.2.post1 to 2.4 in /docs/_build
+- #5666: @dependabot[bot] chore(deps): bump golang from 1.20.0 to 1.20.1 in /tests/apps/go-fail-predeploy
+- #5672: @dependabot[bot] chore(deps): bump django from 4.1.6 to 4.1.7 in /tests/apps/dockerfile-release
+- #5670: @dependabot[bot] chore(deps): bump golang from 1.20.0 to 1.20.1 in /tests/apps/zombies-dockerfile-no-tini
+- #5669: @dependabot[bot] chore(deps): bump golang from 1.20.0 to 1.20.1 in /tests/apps/go-fail-postdeploy
+- #5668: @dependabot[bot] chore(deps): bump golang from 1.20.0 to 1.20.1 in /tests/apps/gogrpc
+- #5667: @dependabot[bot] chore(deps): bump golang from 1.20.0 to 1.20.1 in /tests/apps/zombies-dockerfile-tini
+- #5665: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 230 to 231 in /tests/apps/php
+- #5664: @dependabot[bot] chore(deps): bump werkzeug from 2.2.2 to 2.2.3 in /tests/apps/python-flask
+- #5559: @josegonzalez Move app.json extraction from built image artifact to source code
+- #5661: @dependabot[bot] chore(deps): update markdown requirement from <3.4,>=3.2.1 to >=3.2.1,<3.5 in /docs/_build
+- #5655: @dependabot[bot] chore(deps): bump zipp from 3.12.1 to 3.13.0 in /docs/_build
+- #5654: @dependabot[bot] chore(deps): bump mkdocs-material from 9.0.11 to 9.0.12 in /docs/_build
+- #5648: @dependabot[bot] chore(deps): bump markdown from 3.3.7 to 3.4.1 in /docs/_build
+- #5650: @dependabot[bot] chore(deps): bump python from 3.11.1-buster to 3.11.2-buster in /tests/apps/dockerfile-release
+- #5651: @dependabot[bot] chore(deps): bump ruby from 3.2.0 to 3.2.1 in /tests/apps/dockerfile-entrypoint
+- #5652: @dependabot[bot] chore(deps): bump python from 3.11.1-alpine to 3.11.2-alpine in /docs/_build
+- #5647: @dependabot[bot] chore(deps): bump importlib-metadata from 4.12.0 to 6.0.0 in /docs/_build
+- #5646: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 229 to 230 in /tests/apps/php
+- #5634: @dependabot[bot] chore(deps): bump mkdocs-material from 8.4.2 to 9.0.11 in /docs/_build
+- #5637: @dependabot[bot] chore(deps): bump packaging from 21.3 to 23.0 in /docs/_build
+- #5643: @dependabot[bot] chore(deps): bump watchdog from 2.1.9 to 2.2.1 in /docs/_build
+- #5642: @dependabot[bot] chore(deps): bump pymdown-extensions from 9.5 to 9.9.2 in /docs/_build
+- #5639: @dependabot[bot] chore(deps): bump mkdocs from 1.3.1 to 1.4.2 in /docs/_build
+- #5638: @dependabot[bot] chore(deps): bump mkdocs-material-extensions from 1.0.3 to 1.1.1 in /docs/_build
+- #5631: @dependabot[bot] chore(deps): bump socket.io from 4.5.4 to 4.6.0 in /tests/apps/.websocket.disabled
+- #5636: @dependabot[bot] chore(deps): bump markupsafe from 2.1.1 to 2.1.2 in /docs/_build
+- #5641: @dependabot[bot] chore(deps): bump beautifulsoup4 from 4.11.1 to 4.11.2 in /docs/_build
+- #5635: @dependabot[bot] chore(deps): bump pygments from 2.13.0 to 2.14.0 in /docs/_build
+- #5640: @dependabot[bot] chore(deps): bump zipp from 3.8.1 to 3.12.1 in /docs/_build
+- #5629: @josegonzalez Update list indentation explaining network property utilization
+- #5617: @dependabot[bot] chore(deps): bump golang from 1.19.5 to 1.20.0 in /tests/apps/go-fail-predeploy
+- #5620: @dependabot[bot] chore(deps): bump golang from 1.19.5 to 1.20.0 in /tests/apps/gogrpc
+- #5618: @dependabot[bot] chore(deps): bump golang from 1.19.5 to 1.20.0 in /tests/apps/go-fail-postdeploy
+- #5625: @dependabot[bot] chore(deps): bump django from 4.1.2 to 4.1.6 in /tests/apps/dockerfile-release
+- #5619: @dependabot[bot] chore(deps): bump golang from 1.19.5 to 1.20.0 in /tests/apps/zombies-dockerfile-no-tini
+- #5621: @dependabot[bot] chore(deps): bump golang from 1.19.5 to 1.20.0 in /tests/apps/zombies-dockerfile-tini
+- #5615: @dependabot[bot] chore(deps): bump ludeeus/action-shellcheck from 1.1.0 to 2.0.0
+- #5610: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 227 to 229 in /tests/apps/php
+- #5608: @josegonzalez tests: refactor the config test to use a simple python codebase instead
+- #5606: @josegonzalez Ensure the mounted services directory is symlinked correctly
+- #5558: @josegonzalez Remove references to ubuntu 18.04 ahead of EOL
+- #5600: @dependabot[bot] chore(deps): bump rack from 2.2.4 to 2.2.6.2 in /tests/apps/ruby
+- #5598: @dependabot[bot] chore(deps): bump hadolint/hadolint-action from 3.0.0 to 3.1.0
+- #5595: @josegonzalez Remove deprecated ability to call logs:failed without specifying an app or --all flag
+- #5594: @josegonzalez Remove deprecated builder-specific post-release hooks
+- #5593: @josegonzalez Remove deprecated --detach flag
+- #5592: @josegonzalez Remove support for DOKKU_SCALE file
+- #5560: @josegonzalez Drop SPDY support from nginx plugin
+- #5579: @dependabot[bot] chore(deps): bump maven-dependency-plugin from 3.4.0 to 3.5.0 in /tests/apps/java
+
+## 0.29.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.29.4/bootstrap.sh
+sudo DOKKU_TAG=v0.29.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5571: @josegonzalez Ensure we properly setup all data directories on app install and creation
+- #5555: @josegonzalez Drop debugging code from ps plugin
+
+### Documentation
+
+- #5563: @kbuilds Clarify documentation for default site under nginx
+
+### Tests
+
+- #5557: @josegonzalez Update GitHub actions
+
+### Other
+
+- #5577: @dependabot[bot] chore(deps): bump golang from 1.19.4 to 1.19.5 in /tests/apps/gogrpc
+- #5573: @dependabot[bot] chore(deps): bump golang from 1.19.4 to 1.19.5 in /tests/apps/go-fail-postdeploy
+- #5574: @dependabot[bot] chore(deps): bump golang from 1.19.4 to 1.19.5 in /tests/apps/zombies-dockerfile-tini
+- #5575: @dependabot[bot] chore(deps): bump golang from 1.19.4 to 1.19.5 in /tests/apps/go-fail-predeploy
+- #5576: @dependabot[bot] chore(deps): bump golang from 1.19.4 to 1.19.5 in /tests/apps/zombies-dockerfile-no-tini
+
+## 0.29.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.29.3/bootstrap.sh
+sudo DOKKU_TAG=v0.29.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5544: @josegonzalez Exit non-zero when git:from-image deploys fail to start the app
+- #5543: @josegonzalez Properly parse arguments for git:status command
+
+### Tests
+
+- #5554: @josegonzalez Validate that procfile-path is respected
+
+### Other
+
+- #5551: @dependabot[bot] chore(deps): bump ruby from 3.1.3 to 3.2.0 in /tests/apps/dockerfile-entrypoint
+- #5547: @dependabot[bot] chore(deps): bump setuptools from 65.5.0 to 65.5.1 in /tests/apps/dockerfile-release
+- #5542: @josegonzalez Add json output format support to storage:list
+
+## 0.29.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.29.2/bootstrap.sh
+sudo DOKKU_TAG=v0.29.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5537: @jamesremuscat Correctly include `auth` middleware on `api` router.
+
+## 0.29.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.29.1/bootstrap.sh
+sudo DOKKU_TAG=v0.29.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5532: @josegonzalez Fix issue where git:from-image deploys may result in extracted files not being respected
+
+### Documentation
+
+- #5531: @josegonzalez Fix indentation on heading in where to get help
+- #5521: @AlejandroAkbal Remove reference to `--rm` flag cron task documentation
+- #5517: @josegonzalez Fix reference to scheduler name in kubernetes docs
+- #5516: @josegonzalez Fix reference to scheduler name in nomad docs
+
+### Tests
+
+- #5533: @josegonzalez Add a test case for nested vector-sink values with plus signs
+
+### Other
+
+- #5534: @dependabot[bot] chore(deps): bump sinatra from 3.0.4 to 3.0.5 in /tests/apps/ruby
+- #5514: @dependabot[bot] chore(deps): bump golang from 1.19.3 to 1.19.4 in /tests/apps/go-fail-predeploy
+- #5512: @dependabot[bot] chore(deps): bump golang from 1.19.3 to 1.19.4 in /tests/apps/go-fail-postdeploy
+- #5513: @dependabot[bot] chore(deps): bump golang from 1.19.3 to 1.19.4 in /tests/apps/zombies-dockerfile-no-tini
+- #5511: @dependabot[bot] chore(deps): bump golang from 1.19.3 to 1.19.4 in /tests/apps/zombies-dockerfile-tini
+- #5510: @dependabot[bot] chore(deps): bump golang from 1.19.3 to 1.19.4 in /tests/apps/gogrpc
+- #5525: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.12 to 11.0.13 in /tests/apps/java
+- #5519: @dependabot[bot] chore(deps): bump python from 3.11.0-buster to 3.11.1-buster in /tests/apps/dockerfile-release
+- #5520: @dependabot[bot] chore(deps): bump python from 3.11.0-alpine to 3.11.1-alpine in /docs/_build
+
+## 0.29.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.29.0/bootstrap.sh
+sudo DOKKU_TAG=v0.29.0 bash bootstrap.sh
+```
+
+See the [0.29.0 migration guide](/docs/appendices/0.29.0-migration-guide.md) for more information on migrating to 0.29.0.
+
+### Bug Fixes
+
+- #5506: @josegonzalez Add support for escaped plus (+) signs in vector configurations
+- #5505: @josegonzalez Add missing event hooks
+- #5493: @josegonzalez Correct issue with detection of non-https port mapping as https port mapping
+- #5499: @josegonzalez Do not use traefik priority in service name
+- #5491: @josegonzalez Add missing http part to traefik routing rule
+- #5477: @josegonzalez Add missing config_sub entry to config gitignore
+- #5474: @josegonzalez Add missing source call
+- #5345: @esirK Always set app created-at via property instead of introspecting on folder creation time
+- #5456: @cooperaj Ensure Traefik only attempts to obtain certificate for api when enabled
+- #5466: @josegonzalez Drop the app argument when calling storage:ensure-directory from remote client
+- #5458: @cooperaj Ensure the TLS resolver is specifed for HTTPS enabled apps
+- #5448: @josegonzalez Do not attempt to attach a network to a container that already has it
+
+### New Features
+
+- #5494: @josegonzalez Silence the warning message when there are no dokku apps on install
+- #5490: @josegonzalez Add ability to set a custom priority for traefik routing rules
+- #5489: @josegonzalez Use exit code 137 to signify a lock was unable to be retrieved when calling ps:retire
+- #5487: @josegonzalez Use a priority when routing requests with traefik
+- #5481: @josegonzalez Drop installation of nginx ppa
+- #5478: @josegonzalez Allow users to enable herokuish usage on arm/arm64 platforms
+- #5479: @josegonzalez Cleanup builder code and docs
+- #5476: @josegonzalez Add fileutils plugin to the devcontainer
+- #5473: @josegonzalez Add warning when a user is attempting to deploy with an ipv4/ipv6 domain name and has the default nginx site file available
+- #5451: @josegonzalez Add git:status subcommand
+- #5349: @josegonzalez Error out when executing caddy and traefik commands without the compose plugin installed
+- #5322: @josegonzalez Implement run:logs command
+- #5321: @josegonzalez Implement run:stop command
+- #5434: @josegonzalez Upgrade to go 1.19 everywhere
+- #5320: @josegonzalez Add json format output to run:list
+
+### Refactors
+
+- #5488: @josegonzalez De-duplicate proxy building and simplify url generation
+- #5454: @josegonzalez Switch from base64-encoding to base36-encoding of cron task IDs
+
+### Documentation
+
+- #5509: @josegonzalez Update data loss blockquote to be warning
+- #5507: @josegonzalez Add tutorials link to navigation
+- #5503: @josegonzalez Document potential deployment downtime
+- #5484: @IgnisDa Add edgedb community plugin
+- #5482: @JonathanMH Fixes minor typos in proxy docs
+- #5465: @josegonzalez Fix embedded lists on deployment tasks
+- #5430: @pablobm Clarify that proxy:build-config is required for any nginx:set call
+- #5447: @josegonzalez Specify correct command for builder-lambda:report
+- #5429: @pablobm Clarify details of the default template
+
+### Tests
+
+- #5449: @josegonzalez Install goverage via go get
+
+### Other
+
+- #5500: @dependabot[bot] chore(deps): bump maven-dependency-plugin from 3.3.0 to 3.4.0 in /tests/apps/java
+- #5472: @josegonzalez Start started proxies automatically during ps:restore
+- #5497: @dependabot[bot] chore(deps): bump ruby from 3.1.2 to 3.1.3 in /tests/apps/dockerfile-entrypoint
+- #5496: @dependabot[bot] chore(deps): bump sinatra from 3.0.3 to 3.0.4 in /tests/apps/ruby
+- #5480: @josegonzalez Cleanup zero'd out processes when a Procfile omitting those process types is set
+- #5475: @josegonzalez Refactor nginx.conf.sigil to be extracted from a specified path in source code instead of the built image
+- #5467: @josegonzalez Move DOKKU_WAIT_TO_RETIRE to a checks property
+- #5455: @dependabot[bot] chore(deps): bump hadolint/hadolint-action from 2.1.0 to 3.0.0
+- #5463: @dependabot[bot] chore(deps): bump sinatra from 3.0.2 to 3.0.3 in /tests/apps/ruby
+- #5450: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 226 to 227 in /tests/apps/php
+- #5437: @dependabot[bot] chore(deps): bump golang from 1.19.2 to 1.19.3 in /tests/apps/zombies-dockerfile-tini
+- #5441: @dependabot[bot] chore(deps): bump golang from 1.19.2 to 1.19.3 in /tests/apps/gogrpc
+- #5440: @dependabot[bot] chore(deps): bump golang from 1.19.2 to 1.19.3 in /tests/apps/go-fail-predeploy
+- #5439: @dependabot[bot] chore(deps): bump golang from 1.19.2 to 1.19.3 in /tests/apps/zombies-dockerfile-no-tini
+- #5438: @dependabot[bot] chore(deps): bump golang from 1.19.2 to 1.19.3 in /tests/apps/go-fail-postdeploy
+- #5431: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 225 to 226 in /tests/apps/php
+- #5426: @dependabot[bot] chore(deps): bump python from 3.10.0-buster to 3.11.0-buster in /tests/apps/dockerfile-release
+- #5319: @josegonzalez Use container name instead of container id for run:detached output
+- #5427: @dependabot[bot] chore(deps): bump python from 3.10.8-alpine to 3.11.0-alpine in /docs/_build
+
+## 0.28.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.28.4/bootstrap.sh
+sudo DOKKU_TAG=v0.28.4 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5423: @josegonzalez Respect PLUGIN_PATH when checking if a plugin trigger exists
+- #5425: @josegonzalez Ignore https mappings when no ssl certificate exists
+
+### New Features
+
+- #5424: @josegonzalez Download all src files for go mod dependencies for use in vscode
+
+### Documentation
+
+- #5421: @josegonzalez Document that scaling via app.json will set all other processes to zero
+
+### Tests
+
+- #5422: @josegonzalez Test that build-arg works as expected
+
+### Other
+
+- #5418: @dependabot[bot] chore(deps): bump node from 18-alpine to 19-alpine in /tests/apps/dockerfile-noexpose
+- #5417: @dependabot[bot] chore(deps): bump node from 18-alpine to 19-alpine in /tests/apps/dockerfile-procfile-bad
+- #5419: @dependabot[bot] chore(deps): bump node from 18-alpine to 19-alpine in /tests/apps/dockerfile-dokku-scale
+- #5416: @dependabot[bot] chore(deps): bump node from 18-alpine to 19-alpine in /tests/apps/dockerfile-procfile
+- #5415: @dependabot[bot] chore(deps): bump node from 18-alpine to 19-alpine in /tests/apps/dockerfile
+- #5413: @dependabot[bot] chore(deps): bump ibiqlik/action-yamllint from 3.1.0 to 3.1.1
+
+## 0.28.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.28.3/bootstrap.sh
+sudo DOKKU_TAG=v0.28.3 bash bootstrap.sh
+```
+
+### New Features
+
+- #5394: @josegonzalez Add support for automatically updating Dockerfile FROM statements via dependabot
+
+### Other
+
+- #5411: @dependabot[bot] chore(deps): bump python from 3.8-buster to 3.10.0-buster in /tests/apps/dockerfile-release
+- #5400: @dependabot[bot] chore(deps): bump node from 4-alpine to 18-alpine in /tests/apps/dockerfile-procfile
+- #5405: @dependabot[bot] chore(deps): bump node from 4-alpine to 18-alpine in /tests/apps/dockerfile
+- #5397: @dependabot[bot] chore(deps): bump ruby from 2.5.1 to 3.1.2 in /tests/apps/dockerfile-entrypoint
+- #5401: @dependabot[bot] chore(deps): bump golang from 1.17.1 to 1.19.2 in /tests/apps/go-fail-postdeploy
+- #5403: @dependabot[bot] chore(deps): bump golang from 1.17.1 to 1.19.2 in /tests/apps/zombies-dockerfile-tini
+- #5407: @dependabot[bot] chore(deps): bump python from 3.10-alpine to 3.10.8-alpine in /docs/_build
+- #5404: @dependabot[bot] chore(deps): bump node from 4-alpine to 18-alpine in /tests/apps/dockerfile-dokku-scale
+- #5402: @dependabot[bot] chore(deps): bump node from 4-alpine to 18-alpine in /tests/apps/dockerfile-procfile-bad
+- #5398: @dependabot[bot] chore(deps): bump golang from 1.17.1 to 1.19.2 in /tests/apps/go-fail-predeploy
+- #5396: @dependabot[bot] chore(deps): bump golang from 1.17.1 to 1.19.2 in /tests/apps/gogrpc
+- #5399: @dependabot[bot] chore(deps): bump golang from 1.17.1 to 1.19.2 in /tests/apps/zombies-dockerfile-no-tini
+- #5395: @dependabot[bot] chore(deps): bump node from 4-alpine to 18-alpine in /tests/apps/dockerfile-noexpose
+
+## 0.28.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.28.2/bootstrap.sh
+sudo DOKKU_TAG=v0.28.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5393: @josegonzalez Correct issue with replacing the version in the installation guide
+- #5354: @josegonzalez Report the correct value for the letsencrypt server
+- #5347: @josegonzalez Set correct version on builder-lambda plugin
+
+### New Features
+
+- #5392: @josegonzalez Add support for devcontainers on ARM64 instances
+
+### Documentation
+
+- #5365: @josegonzalez Use correct indentation for embedded list in remote commands documentation
+- #5357: @josegonzalez Reference blog on main domain
+- #5355: @josegonzalez Autogenerate documentation in CI
+- #5351: @josegonzalez Fix formatting on list in deployment tasks
+- #5328: @holtergram Call out git remote change when renaming an app
+- #5344: @josegonzalez Generate docs via mkdocs
+- #5342: @josegonzalez Ensure doc links work on github as well as on docs site
+- #5336: @josegonzalez Add note about docker-compose requirement for using the caddy plugin
+- #5337: @josegonzalez Add note about docker-compose requirement for using the traefikâĻ
+- #5332: @cdubz Remove errant semicolon from wget command
+- #5329: @josegonzalez Use updated url for gliderlabs slack invite app
+- #5315: @alexislefebvre Fix doc link for systems with less than 1GB memory
+
+### Other
+
+- #5382: @dependabot[bot] chore(deps): bump sinatra from 2.2.2 to 3.0.2 in /tests/apps/ruby
+- #5386: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 224 to 225 in /tests/apps/php
+- #5361: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.11 to 11.0.12 in /tests/apps/java
+- #5346: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 223 to 224 in /tests/apps/php
+
+## 0.28.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.28.1/bootstrap.sh
+sudo DOKKU_TAG=v0.28.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5313: @josegonzalez Fix issues with multiple domains in new proxy plugins
+
+## 0.28.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.28.0/bootstrap.sh
+sudo DOKKU_TAG=v0.28.0 bash bootstrap.sh
+```
+
+See the [0.28.0 migration guide](/docs/appendices/0.28.0-migration-guide.md) for more information on migrating to 0.28.0.
+
+### Bug Fixes
+
+- #5299: @josegonzalez Do not trigger restarts when mutating config globally
+- #5298: @josegonzalez Set core.bare=true on correct repository path
+
+### New Features
+
+- #5300: @josegonzalez Add the ability to disable the init process
+- #5295: @josegonzalez Add an official caddy proxy implementation
+- #5293: @josegonzalez Add an official traefik proxy implementation
+- #5202: @josegonzalez Add builder-lambda plugin
+
+### Documentation
+
+- #5296: @janlavicka Fix typo in kubernetes docs
+- #5288: @josegonzalez Do not have bottom border float on page
+- #5283: @alexgleason Homepage: fix link in quick install guide
+
+### Other
+
+- #5297: @josegonzalez Update vector image
+- #5294: @josegonzalez Document and enable alternative proxy implementations
+- #5291: @dependabot[bot] chore(deps): bump werkzeug from 2.2.1 to 2.2.2 in /tests/apps/python-flask
+- #5292: @dependabot[bot] chore(deps): bump flask from 2.2.1 to 2.2.2 in /tests/apps/multi
+- #5290: @dependabot[bot] chore(deps): bump flask from 2.2.1 to 2.2.2 in /tests/apps/python-flask
+- #5227: @josegonzalez Drop forwarded port from vagrant setup
+- #5285: @josegonzalez Update all development dependencies
+- #5240: @josegonzalez Drop support for CentOS, Fedora, OpenSuse, as well as Debian 9
+- #5281: @dependabot[bot] chore(deps): bump flask from 2.1.3 to 2.2.1 in /tests/apps/multi
+- #5280: @dependabot[bot] chore(deps): bump flask from 2.1.3 to 2.2.1 in /tests/apps/python-flask
+- #5284: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 222 to 223 in /tests/apps/php
+
+## 0.27.10
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.10/bootstrap.sh
+sudo DOKKU_TAG=v0.27.10 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5276: @d6rkaiz Remove duplicate syntax for nginx.conf
+
+### Other
+
+- #5274: @kennell readme: mention Ubuntu 22.04 compability
+
+## 0.27.9
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.9/bootstrap.sh
+sudo DOKKU_TAG=v0.27.9 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5273: @josegonzalez Correct issue where more complex docker args were not properly parsed when scheduling containers
+- #5272: @josegonzalez Add support for --global as app name when calling config-get trigger
+- #5263: @alexgleason Update deprecated apt-key command
+
+### New Features
+
+- #5262: @josegonzalez Run shfmt against all test files
+- #5257: @chrisjdixon Move nginx.conf.d includes after all other hard-coded config to allow for overrides
+
+### Other
+
+- #5184: @yasoob New website. Closes #5175
+- #5270: @dependabot[bot] chore(deps): bump werkzeug from 2.2.0 to 2.2.1 in /tests/apps/python-flask
+- #5265: @dependabot[bot] chore(deps): bump werkzeug from 2.1.2 to 2.2.0 in /tests/apps/python-flask
+- #5264: @dependabot[bot] chore(deps): bump sinatra from 2.2.1 to 2.2.2 in /tests/apps/ruby
+- #5261: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.4.0 to 0.5.0
+- #5258: @dependabot[bot] chore(deps): bump sinatra from 2.2.0 to 2.2.1 in /tests/apps/ruby
+
+## 0.27.8
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.8/bootstrap.sh
+sudo DOKKU_TAG=v0.27.8 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5232: @YuukiHogo builder-build fix for DOKKU_DOCKERFILE_CACHE_BUILD and DOKKU_DOCKER_BUILD_OPTS variables
+
+### New Features
+
+- #5255: @josegonzalez export DOKKU_COMMAND for use in authentication systems
+
+### Other
+
+- #5250: @dependabot[bot] chore(deps): bump flask from 2.1.2 to 2.1.3 in /tests/apps/multi
+- #5251: @dependabot[bot] chore(deps): bump flask from 2.1.2 to 2.1.3 in /tests/apps/python-flask
+- #5245: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 221 to 222 in /tests/apps/php
+
+## 0.27.7
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.7/bootstrap.sh
+sudo DOKKU_TAG=v0.27.7 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5238: @josegonzalez Respect dokku system user/group when setting storage permissions on installation
+
+### New Features
+
+- #5239: @josegonzalez Add builder-type and image-stage labels to all images
+
+### Documentation
+
+- #5241: @josegonzalez Clarify where logs are pulled from and general log shipping stance
+- #5237: @josegonzalez Fix builder-pack:set command example
+
+### Other
+
+- #5235: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 220 to 221 in /tests/apps/php
+
+## 0.27.6
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.6/bootstrap.sh
+sudo DOKKU_TAG=v0.27.6 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5225: @josegonzalez Use original app name when setting include_labels for vector source
+- #5228: @josegonzalez Always respect app.json formations in scale settings
+- #5201: @josegonzalez Use pack as default builder for arm64 servers
+
+### Documentation
+
+- #5230: @josegonzalez Clarify usage of build args to set environment variables for Dockerfile deploys
+- #5208: @asokoloski-m Fix typo in dockerfile builder docs
+- #5206: @AxelTheGerman Added dokku-litestream to list of community plugins
+
+### Other
+
+- #5218: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 219 to 220 in /tests/apps/php
+- #5222: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.10 to 11.0.11 in /tests/apps/java
+- #5224: @josegonzalez Document that the community registry plugin should be uninstalled before upgrading past 0.24.x
+- #5220: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.9 to 11.0.10 in /tests/apps/java
+- #5212: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 218 to 219 in /tests/apps/php
+- #5210: @dependabot[bot] chore(deps): bump monolog/monolog from 1.27.0 to 1.27.1 in /tests/apps/php
+- #5204: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 217 to 218 in /tests/apps/php
+
+## 0.27.5
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.5/bootstrap.sh
+sudo DOKKU_TAG=v0.27.5 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5183: @josegonzalez Filter apps when verifying app names
+- #5199: @josegonzalez Revert "fix: Vector fails to start container due to --watch-config flag"
+- #5197: @holamendi fix: Vector fails to start container due to --watch-config flag
+- #5192: @josegonzalez Confirm installation of universe packages when installing on ubuntu
+- #5193: @josegonzalez Force-set correct permissions on env files
+- #5181: @josegonzalez Ensure we default SSH_NAME to NAME when filtering apps
+
+### New Features
+
+- #5196: @josegonzalez Disable herokuish usage on both armhf and arm64 platforms
+- #5194: @josegonzalez Upgrade base Dockerfile image to phusion/baseimage:focal-1.2.0
+
+### Other
+
+- #5200: @dependabot[bot] chore(deps): bump rack from 2.2.3 to 2.2.3.1 in /tests/apps/ruby
+- #5198: @dependabot[bot] chore(deps): bump grunt from 1.5.2 to 1.5.3 in /tests/apps/multi
+- #5187: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 216 to 217 in /tests/apps/php
+
+## 0.27.4
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.4/bootstrap.sh
+sudo DOKKU_TAG=v0.27.4 bash bootstrap.sh
+```
+
+### Documentation
+
+- #5180: @Bilal-io fixes rst-versions height
+
+## 0.27.3
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.3/bootstrap.sh
+sudo DOKKU_TAG=v0.27.3 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5178: @josegonzalez Fix app filtering for authenticated usage
+- #5173: @bitjockey42 Add 22.04 to supported distro versions
+
+### Documentation
+
+- #5179: @Bilal-io Fixes to the Docs version switcher
+- #5177: @josegonzalez docs: cleanup experimental warning in scheduler docs
+- #5176: @josegonzalez Update installation requirements to mention arm64 and ubuntu 22.04
+- #5174: @vladdoster Fix typos and phrasing in remote commands documentation
+
+## 0.27.2
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.2/bootstrap.sh
+sudo DOKKU_TAG=v0.27.2 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5166: @josegonzalez Ensure permissions for global VHOST file are set to the dokku user on install
+- #5141: @josegonzalez fix: set correct version on scheduler plugin
+- #5069: @josegonzalez Do not start intermediate container when calling dokku run after a failed build
+
+### New Features
+
+- #5168: @josegonzalez Add support for Ubuntu 22.04
+- #5125: @abulava Start the vector logging container after Docker daemon restarts
+- #5117: @josegonzalez Upgrade to golang 1.17.9
+
+### Documentation
+
+- #5167: @scottpashley Update client documentation to remove reference to unmaintained python client
+
+### Other
+
+- #5120: @dependabot[bot] chore(deps): bump github/codeql-action from 1 to 2
+- #5145: @dependabot[bot] chore(deps): bump jinja2 from 3.1.1 to 3.1.2 in /tests/apps/python-flask
+- #5157: @dependabot[bot] chore(deps): bump luizm/action-sh-checker from 0.3.0 to 0.4.0
+- #5160: @dependabot[bot] chore(deps): bump docker/setup-buildx-action from 1 to 2
+- #5161: @dependabot[bot] chore(deps): bump docker/login-action from 1 to 2
+- #5162: @dependabot[bot] chore(deps): bump docker/setup-qemu-action from 1 to 2
+- #5153: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/config
+- #5152: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/nodejs-express-noappjson
+- #5151: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/nodejs-express-noprocfile
+- #5150: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/nodejs-express
+- #5154: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/gitsubmodules
+- #5155: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/.websocket.disabled
+- #5163: @dependabot[bot] chore(deps): bump minimist from 1.2.5 to 1.2.6 in /tests/apps/multi
+- #5149: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/dockerfile-dokku-scale
+- #5148: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/dockerfile-procfile-bad
+- #5147: @dependabot[bot] chore(deps): bump express from 4.17.3 to 4.18.1 in /tests/apps/dockerfile-procfile
+- #5144: @dependabot[bot] chore(deps): bump flask from 2.1.1 to 2.1.2 in /tests/apps/python-flask
+- #5143: @dependabot[bot] chore(deps): bump werkzeug from 2.1.1 to 2.1.2 in /tests/apps/python-flask
+- #5142: @dependabot[bot] chore(deps): bump flask from 2.1.1 to 2.1.2 in /tests/apps/multi
+- #5137: @dependabot[bot] chore(deps): bump grunt from 1.4.1 to 1.5.2 in /tests/apps/multi
+- #5119: @dependabot[bot] chore(deps): bump socket.io from 4.4.1 to 4.5.0 in /tests/apps/.websocket.disabled
+
+## 0.27.1
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.1/bootstrap.sh
+sudo DOKKU_TAG=v0.27.1 bash bootstrap.sh
+```
+
+### Bug Fixes
+
+- #5095: @josegonzalez Ensure we properly clone and rename common properties
+- #5094: @josegonzalez Handle case when apps:clone is run in a directory the dokku user does not have access to
+- #5093: @josegonzalez Fix deploy branch setting
+- #5068: @josegonzalez Properly set cron-id from flag
+
+### New Features
+
+- #5092: @josegonzalez Warn and exit non-zero when attempting to rebuild from a non-existent branch
+- #5103: @naveensrinivasan Included githubactions in the dependabot config
+
+### Documentation
+
+- #5090: @josegonzalez Clarify the exact command that is run once a day by cron tasks
+- #5085: @josegonzalez Use issue template form functionality on github
+- #5076: @stamp-cmd Lint Markdown, Remove unused links
+- #5070: @josegonzalez Add discord as support channel
+
+### Other
+
+- #5107: @dependabot[bot] chore(deps): bump actions/checkout from 2 to 3
+- #5105: @dependabot[bot] chore(deps): bump ibiqlik/action-yamllint from 3.0.4 to 3.1
+- #5109: @dependabot[bot] chore(deps): bump actions/upload-artifact from 2 to 3
+- #5108: @dependabot[bot] chore(deps): bump hadolint/hadolint-action from 1.6.0 to 2.1.0
+- #5110: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 215 to 216 in /tests/apps/php
+- #5104: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 214 to 215 in /tests/apps/php
+- #5097: @dependabot[bot] chore(deps): bump werkzeug from 2.1.0 to 2.1.1 in /tests/apps/python-flask
+- #5098: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 213 to 214 in /tests/apps/php
+- #5096: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.8 to 11.0.9 in /tests/apps/java
+- #5091: @josegonzalez Update all dependencies for multi test app
+- #5089: @dependabot[bot] chore(deps): bump minimist from 1.2.5 to 1.2.6 in /tests/apps/multi
+- #5081: @dependabot[bot] chore(deps): bump jinja2 from 3.0.3 to 3.1.1 in /tests/apps/python-flask
+- #5071: @dependabot[bot] chore(deps): bump monolog/monolog from 1.26.1 to 1.27.0 in /tests/apps/php
+- #5075: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 212 to 213 in /tests/apps/php
+- #5082: @dependabot[bot] chore(deps): bump werkzeug from 2.0.3 to 2.1.0 in /tests/apps/python-flask
+- #5086: @dependabot[bot] chore(deps): bump flask from 2.0.3 to 2.1.1 in /tests/apps/multi
+- #5087: @dependabot[bot] chore(deps): bump flask from 2.0.3 to 2.1.1 in /tests/apps/python-flask
+- #5067: @dependabot[bot] chore(deps): bump maven-dependency-plugin from 3.2.0 to 3.3.0 in /tests/apps/java
+
+## 0.27.0
+
+Install/update via the bootstrap script:
+
+```shell
+wget -NP . https://dokku.com/install/v0.27.0/bootstrap.sh
+sudo DOKKU_TAG=v0.27.0 bash bootstrap.sh
+```
+
+See the [0.27.0 migration guide](/docs/appendices/0.27.0-migration-guide.md) for more information on migrating to 0.27.0.
+
+### Bug Fixes
+
+- #5063: @josegonzalez Fix buildx support for releases
+- #5061: @josegonzalez Use correct token when publish unit test results
+- #5057: @josegonzalez Ensure we use the correct variable for WAIT
+- #5052: @josegonzalez Run crontab under sudo to support rhel systems
+- #5051: @josegonzalez Ensure vector component sources have valid names
+- #5035: @nerg4l Fix help flag for logs command
+- #5019: @josegonzalez Only rename app domains associated with a global domain
+
+### New Features
+
+- #5064: @josegonzalez Upgrade docker image to ubuntu focal
+- #5058: @josegonzalez Add .shellcheckrc
+- #5055: @josegonzalez Release dokku for 32-bit Raspbian Bullseye
+- #5050: @josegonzalez Set the default memory unit type to megabytes
+- #5017: @josegonzalez Add command to clear all proxy configs
+
+### Refactors
+
+- #4921: @josegonzalez Add ability to filter returnable apps
+
+### Documentation
+
+- #5056: @miku86 Fix typo in port management docs
+- #5018: @josegonzalez Add warning for setting PORT environment variable
+
+### Other
+
+- #5062: @dependabot[bot] chore(deps): bump django from 3.1.13 to 3.1.14 in /tests/apps/dockerfile-release
+- #5053: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 211 to 212 in /tests/apps/php
+- #5038: @dependabot[bot] chore(deps): bump flask from 2.0.2 to 2.0.3 in /tests/apps/multi
+- #5048: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 210 to 211 in /tests/apps/php
+- #5039: @dependabot[bot] chore(deps): bump sinatra from 2.1.0 to 2.2.0 in /tests/apps/ruby
+- #5037: @dependabot[bot] chore(deps): bump flask from 2.0.2 to 2.0.3 in /tests/apps/python-flask
+- #5036: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 207 to 210 in /tests/apps/php
+- #5025: @dependabot[bot] chore(deps): bump jetty-servlet from 11.0.7 to 11.0.8 in /tests/apps/java
+- #5026: @dependabot[bot] chore(deps): bump werkzeug from 2.0.2 to 2.0.3 in /tests/apps/python-flask
+- #5027: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 206 to 207 in /tests/apps/php
+- #5021: @dependabot[bot] chore(deps-dev): bump heroku/heroku-buildpack-php from 205 to 206 in /tests/apps/php
+- #4975: @tcurdt add arm64 to the build
+
## 0.26.8
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.8/bootstrap.sh
sudo DOKKU_TAG=v0.26.8 bash bootstrap.sh
```
@@ -29,7 +5330,7 @@ sudo DOKKU_TAG=v0.26.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.7/bootstrap.sh
sudo DOKKU_TAG=v0.26.7 bash bootstrap.sh
```
@@ -69,7 +5370,7 @@ sudo DOKKU_TAG=v0.26.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.6/bootstrap.sh
sudo DOKKU_TAG=v0.26.6 bash bootstrap.sh
```
@@ -83,7 +5384,7 @@ sudo DOKKU_TAG=v0.26.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.5/bootstrap.sh
sudo DOKKU_TAG=v0.26.5 bash bootstrap.sh
```
@@ -111,7 +5412,7 @@ sudo DOKKU_TAG=v0.26.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.4/bootstrap.sh
sudo DOKKU_TAG=v0.26.4 bash bootstrap.sh
```
@@ -130,7 +5431,7 @@ sudo DOKKU_TAG=v0.26.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.3/bootstrap.sh
sudo DOKKU_TAG=v0.26.3 bash bootstrap.sh
```
@@ -143,7 +5444,7 @@ sudo DOKKU_TAG=v0.26.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.2/bootstrap.sh
sudo DOKKU_TAG=v0.26.2 bash bootstrap.sh
```
@@ -161,7 +5462,7 @@ sudo DOKKU_TAG=v0.26.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.1/bootstrap.sh
sudo DOKKU_TAG=v0.26.1 bash bootstrap.sh
```
@@ -178,7 +5479,7 @@ sudo DOKKU_TAG=v0.26.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.26.0/bootstrap.sh
sudo DOKKU_TAG=v0.26.0 bash bootstrap.sh
```
@@ -221,7 +5522,7 @@ See the [0.26.0 migration guide](/docs/appendices/0.26.0-migration-guide.md) for
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.7/bootstrap.sh
sudo DOKKU_TAG=v0.25.7 bash bootstrap.sh
```
@@ -247,7 +5548,7 @@ sudo DOKKU_TAG=v0.25.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.6/bootstrap.sh
sudo DOKKU_TAG=v0.25.6 bash bootstrap.sh
```
@@ -281,7 +5582,7 @@ sudo DOKKU_TAG=v0.25.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.5/bootstrap.sh
sudo DOKKU_TAG=v0.25.5 bash bootstrap.sh
```
@@ -328,7 +5629,7 @@ sudo DOKKU_TAG=v0.25.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.4/bootstrap.sh
sudo DOKKU_TAG=v0.25.4 bash bootstrap.sh
```
@@ -350,7 +5651,7 @@ sudo DOKKU_TAG=v0.25.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.3/bootstrap.sh
sudo DOKKU_TAG=v0.25.3 bash bootstrap.sh
```
@@ -376,7 +5677,7 @@ sudo DOKKU_TAG=v0.25.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.2/bootstrap.sh
sudo DOKKU_TAG=v0.25.2 bash bootstrap.sh
```
@@ -405,7 +5706,7 @@ sudo DOKKU_TAG=v0.25.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.1/bootstrap.sh
sudo DOKKU_TAG=v0.25.1 bash bootstrap.sh
```
@@ -422,7 +5723,7 @@ sudo DOKKU_TAG=v0.25.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.25.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.25.0/bootstrap.sh
sudo DOKKU_TAG=v0.25.0 bash bootstrap.sh
```
@@ -507,7 +5808,7 @@ See the [0.25.0 migration guide](/docs/appendices/0.25.0-migration-guide.md) for
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.10/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.10/bootstrap.sh
sudo DOKKU_TAG=v0.24.10 bash bootstrap.sh
```
@@ -529,7 +5830,7 @@ sudo DOKKU_TAG=v0.24.10 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.9/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.9/bootstrap.sh
sudo DOKKU_TAG=v0.24.9 bash bootstrap.sh
```
@@ -558,7 +5859,7 @@ sudo DOKKU_TAG=v0.24.9 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.8/bootstrap.sh
sudo DOKKU_TAG=v0.24.8 bash bootstrap.sh
```
@@ -590,7 +5891,7 @@ sudo DOKKU_TAG=v0.24.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.7/bootstrap.sh
sudo DOKKU_TAG=v0.24.7 bash bootstrap.sh
```
@@ -607,7 +5908,7 @@ sudo DOKKU_TAG=v0.24.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.6/bootstrap.sh
sudo DOKKU_TAG=v0.24.6 bash bootstrap.sh
```
@@ -634,7 +5935,7 @@ sudo DOKKU_TAG=v0.24.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.5/bootstrap.sh
sudo DOKKU_TAG=v0.24.5 bash bootstrap.sh
```
@@ -655,7 +5956,7 @@ sudo DOKKU_TAG=v0.24.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.4/bootstrap.sh
sudo DOKKU_TAG=v0.24.4 bash bootstrap.sh
```
@@ -696,7 +5997,7 @@ sudo DOKKU_TAG=v0.24.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.3/bootstrap.sh
sudo DOKKU_TAG=v0.24.3 bash bootstrap.sh
```
@@ -720,7 +6021,7 @@ sudo DOKKU_TAG=v0.24.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.2/bootstrap.sh
sudo DOKKU_TAG=v0.24.2 bash bootstrap.sh
```
@@ -739,7 +6040,7 @@ sudo DOKKU_TAG=v0.24.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.1/bootstrap.sh
sudo DOKKU_TAG=v0.24.1 bash bootstrap.sh
```
@@ -758,7 +6059,7 @@ sudo DOKKU_TAG=v0.24.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.24.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.24.0/bootstrap.sh
sudo DOKKU_TAG=v0.24.0 bash bootstrap.sh
```
@@ -792,7 +6093,7 @@ See the [0.24.0 migration guide](/docs/appendices/0.24.0-migration-guide.md) for
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.9/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.9/bootstrap.sh
sudo DOKKU_TAG=v0.23.9 bash bootstrap.sh
```
@@ -810,7 +6111,7 @@ sudo DOKKU_TAG=v0.23.9 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.8/bootstrap.sh
sudo DOKKU_TAG=v0.23.8 bash bootstrap.sh
```
@@ -838,7 +6139,7 @@ sudo DOKKU_TAG=v0.23.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.7/bootstrap.sh
sudo DOKKU_TAG=v0.23.7 bash bootstrap.sh
```
@@ -867,7 +6168,7 @@ sudo DOKKU_TAG=v0.23.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.6/bootstrap.sh
sudo DOKKU_TAG=v0.23.6 bash bootstrap.sh
```
@@ -884,7 +6185,7 @@ sudo DOKKU_TAG=v0.23.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.5/bootstrap.sh
sudo DOKKU_TAG=v0.23.5 bash bootstrap.sh
```
@@ -905,7 +6206,7 @@ sudo DOKKU_TAG=v0.23.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.4/bootstrap.sh
sudo DOKKU_TAG=v0.23.4 bash bootstrap.sh
```
@@ -923,7 +6224,7 @@ sudo DOKKU_TAG=v0.23.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.3/bootstrap.sh
sudo DOKKU_TAG=v0.23.3 bash bootstrap.sh
```
@@ -957,7 +6258,7 @@ sudo DOKKU_TAG=v0.23.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.2/bootstrap.sh
sudo DOKKU_TAG=v0.23.2 bash bootstrap.sh
```
@@ -989,7 +6290,7 @@ sudo DOKKU_TAG=v0.23.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.1/bootstrap.sh
sudo DOKKU_TAG=v0.23.1 bash bootstrap.sh
```
@@ -1019,7 +6320,7 @@ sudo DOKKU_TAG=v0.23.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.23.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.23.0/bootstrap.sh
sudo DOKKU_TAG=v0.23.0 bash bootstrap.sh
```
@@ -1069,7 +6370,7 @@ See the [0.23.0 migration guide](/docs/appendices/0.23.0-migration-guide.md) for
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.9/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.9/bootstrap.sh
sudo DOKKU_TAG=v0.22.9 bash bootstrap.sh
```
@@ -1111,7 +6412,7 @@ sudo DOKKU_TAG=v0.22.9 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.8/bootstrap.sh
sudo DOKKU_TAG=v0.22.8 bash bootstrap.sh
```
@@ -1128,7 +6429,7 @@ sudo DOKKU_TAG=v0.22.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.7/bootstrap.sh
sudo DOKKU_TAG=v0.22.7 bash bootstrap.sh
```
@@ -1141,7 +6442,7 @@ sudo DOKKU_TAG=v0.22.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.6/bootstrap.sh
sudo DOKKU_TAG=v0.22.6 bash bootstrap.sh
```
@@ -1175,7 +6476,7 @@ sudo DOKKU_TAG=v0.22.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.5/bootstrap.sh
sudo DOKKU_TAG=v0.22.5 bash bootstrap.sh
```
@@ -1200,7 +6501,7 @@ sudo DOKKU_TAG=v0.22.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.4/bootstrap.sh
sudo DOKKU_TAG=v0.22.4 bash bootstrap.sh
```
@@ -1229,7 +6530,7 @@ sudo DOKKU_TAG=v0.22.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.3/bootstrap.sh
sudo DOKKU_TAG=v0.22.3 bash bootstrap.sh
```
@@ -1264,7 +6565,7 @@ sudo DOKKU_TAG=v0.22.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.2/bootstrap.sh
sudo DOKKU_TAG=v0.22.2 bash bootstrap.sh
```
@@ -1285,7 +6586,7 @@ sudo DOKKU_TAG=v0.22.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.1/bootstrap.sh
sudo DOKKU_TAG=v0.22.1 bash bootstrap.sh
```
@@ -1331,7 +6632,7 @@ sudo DOKKU_TAG=v0.22.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.22.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.22.0/bootstrap.sh
sudo DOKKU_TAG=v0.22.0 bash bootstrap.sh
```
@@ -1372,7 +6673,7 @@ See the [0.22.0 migration guide](/docs/appendices/0.22.0-migration-guide.md) for
- #4160: @nerg4l Rewrite logs plugin in Go
- #4149: @josegonzalez Rewrite ps plugin in golang
-- #4080: @hugopeixoto Stop using VHOST when listing app domains and urls
+- #4080: @hugopeixoto Stop using VHOST when listing app domains and urls
- #4117: @josegonzalez Rewrite app-json plugin in golang
- #4113: @josegonzalez Drop herokuish release code
@@ -1417,7 +6718,7 @@ See the [0.22.0 migration guide](/docs/appendices/0.22.0-migration-guide.md) for
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.21.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.21.4/bootstrap.sh
sudo DOKKU_TAG=v0.21.4 bash bootstrap.sh
```
@@ -1447,7 +6748,7 @@ sudo DOKKU_TAG=v0.21.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.21.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.21.3/bootstrap.sh
sudo DOKKU_TAG=v0.21.3 bash bootstrap.sh
```
@@ -1465,7 +6766,7 @@ sudo DOKKU_TAG=v0.21.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.21.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.21.2/bootstrap.sh
sudo DOKKU_TAG=v0.21.2 bash bootstrap.sh
```
@@ -1495,7 +6796,7 @@ sudo DOKKU_TAG=v0.21.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.21.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.21.1/bootstrap.sh
sudo DOKKU_TAG=v0.21.1 bash bootstrap.sh
```
@@ -1505,7 +6806,8 @@ sudo DOKKU_TAG=v0.21.1 bash bootstrap.sh
## 0.21.0
-> Warning: Release is broken and will be pulled from upstream. Please use a newer version.
+> [!WARNING]
+> Release is broken and will be pulled from upstream. Please use a newer version.
### Bug Fixes
@@ -1596,7 +6898,7 @@ sudo DOKKU_TAG=v0.21.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.20.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.20.4/bootstrap.sh
sudo DOKKU_TAG=v0.20.4 bash bootstrap.sh
```
@@ -1619,7 +6921,7 @@ sudo DOKKU_TAG=v0.20.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.20.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.20.3/bootstrap.sh
sudo DOKKU_TAG=v0.20.3 bash bootstrap.sh
```
@@ -1638,7 +6940,7 @@ sudo DOKKU_TAG=v0.20.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.20.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.20.2/bootstrap.sh
sudo DOKKU_TAG=v0.20.2 bash bootstrap.sh
```
@@ -1656,7 +6958,7 @@ sudo DOKKU_TAG=v0.20.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.20.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.20.1/bootstrap.sh
sudo DOKKU_TAG=v0.20.1 bash bootstrap.sh
```
@@ -1687,7 +6989,7 @@ sudo DOKKU_TAG=v0.20.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.20.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.20.0/bootstrap.sh
sudo DOKKU_TAG=v0.20.0 bash bootstrap.sh
```
@@ -1760,7 +7062,7 @@ sudo DOKKU_TAG=v0.20.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.13/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.13/bootstrap.sh
sudo DOKKU_TAG=v0.19.13 bash bootstrap.sh
```
@@ -1777,7 +7079,7 @@ sudo DOKKU_TAG=v0.19.13 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.12/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.12/bootstrap.sh
sudo DOKKU_TAG=v0.19.12 bash bootstrap.sh
```
@@ -1809,7 +7111,7 @@ sudo DOKKU_TAG=v0.19.12 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.11/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.11/bootstrap.sh
sudo DOKKU_TAG=v0.19.11 bash bootstrap.sh
```
@@ -1830,7 +7132,7 @@ sudo DOKKU_TAG=v0.19.11 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.10/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.10/bootstrap.sh
sudo DOKKU_TAG=v0.19.10 bash bootstrap.sh
```
@@ -1871,7 +7173,7 @@ sudo DOKKU_TAG=v0.19.10 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.9/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.9/bootstrap.sh
sudo DOKKU_TAG=v0.19.9 bash bootstrap.sh
```
@@ -1891,7 +7193,7 @@ sudo DOKKU_TAG=v0.19.9 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.8/bootstrap.sh
sudo DOKKU_TAG=v0.19.8 bash bootstrap.sh
```
@@ -1900,7 +7202,7 @@ sudo DOKKU_TAG=v0.19.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.7/bootstrap.sh
sudo DOKKU_TAG=v0.19.7 bash bootstrap.sh
```
@@ -1918,7 +7220,7 @@ sudo DOKKU_TAG=v0.19.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.6/bootstrap.sh
sudo DOKKU_TAG=v0.19.6 bash bootstrap.sh
```
@@ -1933,7 +7235,7 @@ sudo DOKKU_TAG=v0.19.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.5/bootstrap.sh
sudo DOKKU_TAG=v0.19.5 bash bootstrap.sh
```
@@ -1946,7 +7248,7 @@ sudo DOKKU_TAG=v0.19.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.4/bootstrap.sh
sudo DOKKU_TAG=v0.19.4 bash bootstrap.sh
```
@@ -1959,7 +7261,7 @@ sudo DOKKU_TAG=v0.19.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.3/bootstrap.sh
sudo DOKKU_TAG=v0.19.3 bash bootstrap.sh
```
@@ -1996,7 +7298,7 @@ sudo DOKKU_TAG=v0.19.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.2/bootstrap.sh
sudo DOKKU_TAG=v0.19.2 bash bootstrap.sh
```
@@ -2009,20 +7311,20 @@ sudo DOKKU_TAG=v0.19.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.1/bootstrap.sh
sudo DOKKU_TAG=v0.19.1 bash bootstrap.sh
```
### Bug Fixes
-- #3713: @josegonzalez Require nginx 1.13+ in order to enable tls1.3
+- #3713: @josegonzalez Require nginx 1.13+ in order to enable tls1.3
## 0.19.0
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.19.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.19.0/bootstrap.sh
sudo DOKKU_TAG=v0.19.0 bash bootstrap.sh
```
@@ -2065,7 +7367,7 @@ sudo DOKKU_TAG=v0.19.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.5/bootstrap.sh
sudo DOKKU_TAG=v0.18.5 bash bootstrap.sh
```
@@ -2078,7 +7380,7 @@ sudo DOKKU_TAG=v0.18.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.4/bootstrap.sh
sudo DOKKU_TAG=v0.18.4 bash bootstrap.sh
```
@@ -2091,7 +7393,7 @@ sudo DOKKU_TAG=v0.18.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.3/bootstrap.sh
sudo DOKKU_TAG=v0.18.3 bash bootstrap.sh
```
@@ -2116,7 +7418,7 @@ sudo DOKKU_TAG=v0.18.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.2/bootstrap.sh
sudo DOKKU_TAG=v0.18.2 bash bootstrap.sh
```
@@ -2138,7 +7440,7 @@ sudo DOKKU_TAG=v0.18.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.1/bootstrap.sh
sudo DOKKU_TAG=v0.18.1 bash bootstrap.sh
```
@@ -2152,7 +7454,7 @@ sudo DOKKU_TAG=v0.18.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.18.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.18.0/bootstrap.sh
sudo DOKKU_TAG=v0.18.0 bash bootstrap.sh
```
@@ -2194,7 +7496,7 @@ sudo DOKKU_TAG=v0.18.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.9/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.9/bootstrap.sh
sudo DOKKU_TAG=v0.17.9 bash bootstrap.sh
```
@@ -2211,7 +7513,7 @@ sudo DOKKU_TAG=v0.17.9 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.8/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.8/bootstrap.sh
sudo DOKKU_TAG=v0.17.8 bash bootstrap.sh
```
@@ -2228,7 +7530,7 @@ sudo DOKKU_TAG=v0.17.8 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.7/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.7/bootstrap.sh
sudo DOKKU_TAG=v0.17.7 bash bootstrap.sh
```
@@ -2249,7 +7551,7 @@ sudo DOKKU_TAG=v0.17.7 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.6/bootstrap.sh
sudo DOKKU_TAG=v0.17.6 bash bootstrap.sh
```
@@ -2262,7 +7564,7 @@ sudo DOKKU_TAG=v0.17.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.5/bootstrap.sh
sudo DOKKU_TAG=v0.17.5 bash bootstrap.sh
```
@@ -2275,7 +7577,7 @@ sudo DOKKU_TAG=v0.17.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.4/bootstrap.sh
sudo DOKKU_TAG=v0.17.4 bash bootstrap.sh
```
@@ -2288,7 +7590,7 @@ sudo DOKKU_TAG=v0.17.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.3/bootstrap.sh
sudo DOKKU_TAG=v0.17.3 bash bootstrap.sh
```
@@ -2306,7 +7608,7 @@ sudo DOKKU_TAG=v0.17.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.2/bootstrap.sh
sudo DOKKU_TAG=v0.17.2 bash bootstrap.sh
```
@@ -2319,7 +7621,7 @@ sudo DOKKU_TAG=v0.17.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.1/bootstrap.sh
sudo DOKKU_TAG=v0.17.1 bash bootstrap.sh
```
@@ -2332,7 +7634,7 @@ sudo DOKKU_TAG=v0.17.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.17.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.17.0/bootstrap.sh
sudo DOKKU_TAG=v0.17.0 bash bootstrap.sh
```
@@ -2369,7 +7671,7 @@ sudo DOKKU_TAG=v0.17.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.16.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.16.4/bootstrap.sh
sudo DOKKU_TAG=v0.16.4 bash bootstrap.sh
```
@@ -2386,7 +7688,7 @@ sudo DOKKU_TAG=v0.16.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.16.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.16.3/bootstrap.sh
sudo DOKKU_TAG=v0.16.3 bash bootstrap.sh
```
@@ -2410,7 +7712,7 @@ sudo DOKKU_TAG=v0.16.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.16.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.16.2/bootstrap.sh
sudo DOKKU_TAG=v0.16.2 bash bootstrap.sh
```
@@ -2424,7 +7726,7 @@ sudo DOKKU_TAG=v0.16.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.16.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.16.1/bootstrap.sh
sudo DOKKU_TAG=v0.16.1 bash bootstrap.sh
```
@@ -2441,7 +7743,7 @@ sudo DOKKU_TAG=v0.16.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.16.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.16.0/bootstrap.sh
sudo DOKKU_TAG=v0.16.0 bash bootstrap.sh
```
@@ -2467,7 +7769,7 @@ sudo DOKKU_TAG=v0.16.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.5/bootstrap.sh
sudo DOKKU_TAG=v0.15.5 bash bootstrap.sh
```
@@ -2486,7 +7788,7 @@ sudo DOKKU_TAG=v0.15.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.4/bootstrap.sh
sudo DOKKU_TAG=v0.15.4 bash bootstrap.sh
```
@@ -2513,7 +7815,7 @@ sudo DOKKU_TAG=v0.15.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.3/bootstrap.sh
sudo DOKKU_TAG=v0.15.3 bash bootstrap.sh
```
@@ -2526,7 +7828,7 @@ sudo DOKKU_TAG=v0.15.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.2/bootstrap.sh
sudo DOKKU_TAG=v0.15.2 bash bootstrap.sh
```
@@ -2539,7 +7841,7 @@ sudo DOKKU_TAG=v0.15.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.1/bootstrap.sh
sudo DOKKU_TAG=v0.15.1 bash bootstrap.sh
```
@@ -2552,7 +7854,7 @@ sudo DOKKU_TAG=v0.15.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.15.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.15.0/bootstrap.sh
sudo DOKKU_TAG=v0.15.0 bash bootstrap.sh
```
@@ -2590,7 +7892,7 @@ sudo DOKKU_TAG=v0.15.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.6/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.6/bootstrap.sh
sudo DOKKU_TAG=v0.14.6 bash bootstrap.sh
```
@@ -2621,7 +7923,7 @@ sudo DOKKU_TAG=v0.14.6 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.5/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.5/bootstrap.sh
sudo DOKKU_TAG=v0.14.5 bash bootstrap.sh
```
@@ -2634,7 +7936,7 @@ sudo DOKKU_TAG=v0.14.5 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.4/bootstrap.sh
sudo DOKKU_TAG=v0.14.4 bash bootstrap.sh
```
@@ -2647,7 +7949,7 @@ sudo DOKKU_TAG=v0.14.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.3/bootstrap.sh
sudo DOKKU_TAG=v0.14.3 bash bootstrap.sh
```
@@ -2678,7 +7980,7 @@ sudo DOKKU_TAG=v0.14.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.2/bootstrap.sh
sudo DOKKU_TAG=v0.14.2 bash bootstrap.sh
```
@@ -2697,7 +7999,7 @@ sudo DOKKU_TAG=v0.14.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.1/bootstrap.sh
sudo DOKKU_TAG=v0.14.1 bash bootstrap.sh
```
@@ -2710,7 +8012,7 @@ sudo DOKKU_TAG=v0.14.1 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.14.0/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.14.0/bootstrap.sh
sudo DOKKU_TAG=v0.14.0 bash bootstrap.sh
```
@@ -2771,7 +8073,7 @@ sudo DOKKU_TAG=v0.14.0 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.13.4/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.13.4/bootstrap.sh
sudo DOKKU_TAG=v0.13.4 bash bootstrap.sh
```
@@ -2788,7 +8090,7 @@ sudo DOKKU_TAG=v0.13.4 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.13.3/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.13.3/bootstrap.sh
sudo DOKKU_TAG=v0.13.3 bash bootstrap.sh
```
@@ -2805,7 +8107,7 @@ sudo DOKKU_TAG=v0.13.3 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.13.2/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.13.2/bootstrap.sh
sudo DOKKU_TAG=v0.13.2 bash bootstrap.sh
```
@@ -2823,7 +8125,7 @@ sudo DOKKU_TAG=v0.13.2 bash bootstrap.sh
Install/update via the bootstrap script:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.13.1/bootstrap.sh
+wget -NP . https://dokku.com/install/v0.13.1/bootstrap.sh
sudo DOKKU_TAG=v0.13.1 bash bootstrap.sh
```
@@ -3381,7 +8683,7 @@ sudo DOKKU_TAG=v0.13.1 bash bootstrap.sh
- #2683: @josegonzalez Ensure we have an example for adding keys as another user
- #2682: @josegonzalez Clarify supported stanzas in app.json
- #2679: @callahad Remove unnecessary Linode-specific instructions
-- #2670: @znz Remove duplicated `(i.e. `
+- #2670: @znz Remove duplicated `(i.e.`
### Documentation
@@ -3735,7 +9037,7 @@ Thanks to all the contributors who helped with this release, and a special thank
## 0.5.8
-This release is the last release in the `0.5.x` series, and as such is mainly a bugfix release. Users are highly encouraged to upgrade to this release *before* moving to the upcoming `0.6.x` release, as we will be removing deprecated features at that point.
+This release is the last release in the `0.5.x` series, and as such is mainly a bugfix release. Users are highly encouraged to upgrade to this release _before_ moving to the upcoming `0.6.x` release, as we will be removing deprecated features at that point.
Thanks to all the contributors who helped with this release!
@@ -3927,7 +9229,7 @@ That was quick! This is a bugfix release to fix issues in the packaging and rele
This is our largest, most feature-packed release in the history of the dokku project. Lots of delicious things, including:
-- Support for docker 1.10/1.11. You *must* have docker 1.9.1+ to install dokku.
+- Support for docker 1.10/1.11. You _must_ have docker 1.9.1+ to install dokku.
- Revamped documentation website
- [Deployment Tasks](https://dokku.com/docs/advanced-usage/deployment-tasks/)
- Heroku-style management of [dockerfile processes](https://dokku.com/docs/deployment/builders/dockerfiles/#procfiles-and-multiple-processes)
@@ -4026,7 +9328,7 @@ Thanks to all the contributors who helped with this release!
## 0.4.13
-We lied. *This* is the final 0.4.x release. This specific release fixes support for bash `4.2`, which may be the only bash version available for certain testing environments.
+We lied. _This_ is the final 0.4.x release. This specific release fixes support for bash `4.2`, which may be the only bash version available for certain testing environments.
Thanks to all the contributors who helped with this release!
@@ -4080,7 +9382,7 @@ Thanks to all the contributors who helped with this release!
This release is mostly a bugfix release, though we have a few important changes:
- `dokku plugin:update` can now be used to update a specific plugin. Previously, this could potentially result in an error a user would have to manually resolve.
-- We have started labeling all dokku-managed containers. In a future minor release, triggering a `dokku cleanup` will remove *only* exited containers that are managed by dokku. This change allows users to start containers outside of dokku and be assured that dokku would not inadvertently remove them.
+- We have started labeling all dokku-managed containers. In a future minor release, triggering a `dokku cleanup` will remove _only_ exited containers that are managed by dokku. This change allows users to start containers outside of dokku and be assured that dokku would not inadvertently remove them.
Thanks to all the contributors who helped with this release!
@@ -4426,11 +9728,11 @@ One new feature is colorized logging output, which should make it easier to debu
This is our first minor release in almost a year. Many new features and removals have occurred, so here is a neat summary:
- Plugins are now triggered via `plugn`. Notably, you'll need add a `plugin.toml` to describe the plugin as well as use `plugn trigger` instead of `pluginhook` to trigger plugin callbacks. Please see the [plugin creation documentation](https://dokku.com/docs/development/plugin-creation/) for more details.
-- A few new official plugins have been added to the core, including [image tagging](https://dokku.com/docs/deployment/application-deployment/), [certificate management](https://dokku.com/docs/configuration/ssl/), a tar-based deploy solution, and much more. Check out the *New Features* section for more details.
+- A few new official plugins have been added to the core, including [image tagging](https://dokku.com/docs/deployment/application-deployment/), [certificate management](https://dokku.com/docs/configuration/ssl/), a tar-based deploy solution, and much more. Check out the _New Features_ section for more details.
- We've removed a few deprecated plugin callbacks. Please see the [plugin triggers documentation](https://dokku.com/docs/development/plugin-triggers/) to see what is available.
- [Official datastorage plugins](https://github.com/dokku) have been created for the most commonly used datastores. If you previously used/maintained a community contributed plugin, please check these out. We'll be adding more official plugins as time goes on.
-Thanks to the *many* contributors for making this release our best release so far, and special thanks to both @michaelshobbs and @Flink for pushing along the `0.4.0` release!
+Thanks to the _many_ contributors for making this release our best release so far, and special thanks to both @michaelshobbs and @Flink for pushing along the `0.4.0` release!
### Deprecations and Removals
@@ -4752,10 +10054,10 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc
- #1028: @Flink [docs] Add rails-logs to plugins
- #1031: @michaelshobbs Upgrade docker in CI to 1.5.0
- #1029: @assaf Added several enhancements for CHECKS file:
- - Specify how long to wait before running first check
- - Specify timeout for each check
- - Check specific hosts, e.g. http://signin.example.com
- - Check both HTTP and HTTPS resources
+ - Specify how long to wait before running first check
+ - Specify timeout for each check
+ - Check specific hosts, e.g. [http://signin.example.com](http://signin.example.com)
+ - Check both HTTP and HTTPS resources
- #1032: @cameron-martin Updated dokku-installer to use relative path
- #1035: @Flink [docs] Add dokku-http-auth to plugins
- #1040: @ebeigarts [docs] Add dokku-slack plugin information
@@ -4859,12 +10161,12 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc
## 0.3.9
- #787: @josegonzalez/@michaelshobbs Official user-env-compile plugin
- - Uses ENV and APP/ENV files
- - Supports old `BUILD_ENV` files (which are likely in wide-use)
- - Allows user's to override globals with app-specific configuration
- - Migrate `$DOKKU_ROOT/BUILD_ENV` to `$DOKKU_ROOT/ENV` if the former exists and the latter does not
- - Drop `BUILD_ENV` support in favor of just `ENV` via a `mv` command
- - Add default ENV with `CURL_TIMEOUT` and `CURL_CONNECT_TIMEOUT`
+ - Uses ENV and APP/ENV files
+ - Supports old `BUILD_ENV` files (which are likely in wide-use)
+ - Allows user's to override globals with app-specific configuration
+ - Migrate `$DOKKU_ROOT/BUILD_ENV` to `$DOKKU_ROOT/ENV` if the former exists and the latter does not
+ - Drop `BUILD_ENV` support in favor of just `ENV` via a `mv` command
+ - Add default ENV with `CURL_TIMEOUT` and `CURL_CONNECT_TIMEOUT`
- #811: @abossard Increased `server_names_hash_bucket_size` in nginx.conf to 512
- #814: @josegonzalez Source files in $DOKKU_ROOT/.dokkurc directory and add `dokku trace` command
- #816: @josegonzalez Add documentation for user-env feature
@@ -4973,25 +10275,25 @@ This release pegs Dokku to Docker 1.6.2. Docker 1.7.0 introduced changes in `doc
## 0.2.0 (2013-11-24)
-* Added DOKKU_TRACE variable for verbose trace information
-* Added an installer (for pre-built images)
-* Application config (environment variable management)
-* Backup/import plugin
-* Basic hooks/plugin system
-* Cache dir is preserved across builds
-* Command to delete an application
-* Exposed commands over SSH using sshcommand
-* Git handling is moved to a plugin
-* Integration test coverage
-* Pulled nginx vhosts out into plugin
-* Run command
-* Separated dokku and buildstep more cleanly
-* Uses latest version of Docker again
+- Added DOKKU_TRACE variable for verbose trace information
+- Added an installer (for pre-built images)
+- Application config (environment variable management)
+- Backup/import plugin
+- Basic hooks/plugin system
+- Cache dir is preserved across builds
+- Command to delete an application
+- Exposed commands over SSH using sshcommand
+- Git handling is moved to a plugin
+- Integration test coverage
+- Pulled nginx vhosts out into plugin
+- Run command
+- Separated dokku and buildstep more cleanly
+- Uses latest version of Docker again
## 0.1.0 (2013-06-15)
- * First release
- * Bootstrap script for Ubuntu system
- * Basic push / deploy with git
- * Hostname support with Nginx
- * Support for Java, Ruby, Node.js buildpacks
+- First release
+ - Bootstrap script for Ubuntu system
+ - Basic push / deploy with git
+ - Hostname support with Nginx
+ - Support for Java, Ruby, Node.js buildpacks
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
index a2799d88f84..73adb6ecf9c 100644
--- a/ISSUE_TEMPLATE.md
+++ b/ISSUE_TEMPLATE.md
@@ -2,7 +2,7 @@
>
> If you'd like to sponsor specific functionality, see the project's [Sponsoring](https://github.com/dokku/.github/blob/master/SPONSORING.md) document.
>
-> If you need help figuring out how to use a specific buildpack, are seeing an issue in during the buildpack process, or are having issues using multiple buildpacks, please see our [slack channels or github discussion board](https://dokku.com/docs/getting-started/where-to-get-help/#monitored-locations). Issues pertaining to buildpacks may be closed and locked.
+> If you need help figuring out how to use a specific buildpack, are seeing an issue in during the buildpack process, or are having issues using multiple buildpacks, please see our [chat channels or github discussion board](https://dokku.com/docs/getting-started/where-to-get-help/#monitored-locations). Issues pertaining to buildpacks may be closed and locked.
>
> If you need support for a version of Dokku that is more than a year old, your issue may be closed without an answer. Please upgrade to a recent version.
@@ -31,7 +31,7 @@
> For problems affecting all applications, the report output for a broken application is useful for our debugging.
> In these cases, you may run `dokku report` without any arguments to display the top-level reporting information.
-### How (deb/make/rpm) and where (AWS, VirtualBox, physical, etc.) was Dokku installed?
+### How (deb/make) and where (AWS, VirtualBox, physical, etc.) was Dokku installed?
### Additional information
@@ -39,10 +39,10 @@
- The nginx configuration (if applicable) via `dokku nginx:show-config APP_NAME`
- Link to the exact repository being deployed (if possible/applicable):
- If a deploy is failing or behaving unexpectedly:
- - Application name
- - The type of application being deployed (node, php, python, ruby, etc.)
- - If using buildpacks, which custom buildpacks are in use
- - If using a `Dockerfile`, the contents of that file
- - If it exists, the contents of your `Procfile`.
+ - Application name
+ - The type of application being deployed (node, php, python, ruby, etc.)
+ - If using buildpacks, which custom buildpacks are in use
+ - If using a `Dockerfile`, the contents of that file
+ - If it exists, the contents of your `Procfile`.
- Output of failing Dokku commands after running `dokku trace:on`
(BEWARE: `trace:on` will print environment variables for some commands, be sure you're not exposing any sensitive information when posting issues. You may replace these values with XXXXXX):
diff --git a/Makefile b/Makefile
index a6e9b3972bd..6fafe4b3c28 100644
--- a/Makefile
+++ b/Makefile
@@ -1,20 +1,17 @@
DOKKU_VERSION ?= master
-DOCKER_IMAGE_LABELER_VERSION ?= 0.2.2
-HEROKUISH_VERSION ?= 0.5.25
-NETRC_VERSION ?= 0.3.0
-PLUGN_VERSION ?= 0.6.1
-PROCFILE_VERSION ?= 0.11.0
-SIGIL_VERSION ?= 0.6.0
-SSHCOMMAND_VERSION ?= 0.12.0
-DOCKER_IMAGE_LABELER_URL ?= https://github.com/dokku/docker-image-labeler/releases/download/v${DOCKER_IMAGE_LABELER_VERSION}/docker-image-labeler_${DOCKER_IMAGE_LABELER_VERSION}_linux_x86_64.tgz
-NETRC_URL ?= https://github.com/dokku/netrc/releases/download/v${NETRC_VERSION}/netrc_${NETRC_VERSION}_linux_x86_64.tgz
-PLUGN_URL ?= https://github.com/dokku/plugn/releases/download/v${PLUGN_VERSION}/plugn_${PLUGN_VERSION}_linux_x86_64.tgz
-PROCFILE_UTIL_URL ?= https://github.com/josegonzalez/go-procfile-util/releases/download/v${PROCFILE_VERSION}/procfile-util_${PROCFILE_VERSION}_linux_x86_64.tgz
-SIGIL_URL ?= https://github.com/gliderlabs/sigil/releases/download/v${SIGIL_VERSION}/sigil_${SIGIL_VERSION}_Linux_x86_64.tgz
-SSHCOMMAND_URL ?= https://github.com/dokku/sshcommand/releases/download/v${SSHCOMMAND_VERSION}/sshcommand_${SSHCOMMAND_VERSION}_linux_x86_64.tgz
+TARGETARCH ?= amd64
+
+DOCKER_IMAGE_LABELER_URL ?= $(shell jq -r --arg name docker-image-labeler --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+DOCKER_CONTAINER_HEALTHCHECKER_URL ?= $(shell jq -r --arg name docker-container-healthchecker --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+LAMBDA_BUILDER_URL ?= $(shell jq -r --arg name lambda-builder --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+NETRC_URL ?= $(shell jq -r --arg name netrc --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+PLUGN_URL ?= $(shell jq -r --arg name plugn --arg arch $(TARGETARCH) '.predependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+PROCFILE_UTIL_URL ?= $(shell jq -r --arg name procfile-util --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+SIGIL_URL ?= $(shell jq -r --arg name gliderlabs-sigil --arg arch $(TARGETARCH) '.predependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
+SSHCOMMAND_URL ?= $(shell jq -r --arg name sshcommand --arg arch $(TARGETARCH) '.dependencies[] | select(.name == $$name) | .urls[$$arch]' contrib/dependencies.json)
STACK_URL ?= https://github.com/gliderlabs/herokuish.git
-PREBUILT_STACK_URL ?= gliderlabs/herokuish:latest-20
+PREBUILT_STACK_URL ?= gliderlabs/herokuish:latest-24
DOKKU_LIB_ROOT ?= /var/lib/dokku
PLUGINS_PATH ?= ${DOKKU_LIB_ROOT}/plugins
CORE_PLUGINS_PATH ?= ${DOKKU_LIB_ROOT}/core-plugins
@@ -36,12 +33,12 @@ endif
include common.mk
-.PHONY: all apt-update install version copyfiles copyplugin man-db plugins dependencies docker-image-labeler netrc sshcommand procfile-util plugn docker aufs stack count vagrant-acl-add vagrant-dokku go-build
+.PHONY: all apt-update install version copyfiles copyplugin man-db plugins dependencies docker-image-labeler lambda-builder netrc sshcommand procfile-util plugn docker aufs stack count vagrant-acl-add vagrant-dokku go-build
+include docs.mk
include tests.mk
include package.mk
include deb.mk
-include rpm.mk
include arch.mk
all:
@@ -57,7 +54,7 @@ go-build:
basedir=$(PWD); \
for dir in plugins/*; do \
if [ -e $$dir/Makefile ]; then \
- $(MAKE) -e -C $$dir $(PLUGIN_MAKE_TARGET) || exit $$? ;\
+ GO_ARGS='$(GO_ARGS)' CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) GOWORK=off $(MAKE) -e -C $$dir $(PLUGIN_MAKE_TARGET) || exit $$? ;\
fi ;\
done
@@ -67,7 +64,7 @@ ifndef PLUGIN_NAME
$(error PLUGIN_NAME not specified)
endif
if [ -e plugins/$(PLUGIN_NAME)/Makefile ]; then \
- $(MAKE) -e -C plugins/$(PLUGIN_NAME) $(PLUGIN_MAKE_TARGET) || exit $$? ;\
+ GO_ARGS='$(GO_ARGS)' CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) GOWORK=off $(MAKE) -e -C plugins/$(PLUGIN_NAME) $(PLUGIN_MAKE_TARGET) || exit $$? ;\
fi
go-clean:
@@ -78,9 +75,12 @@ go-clean:
fi ;\
done
-copyfiles:
- $(MAKE) go-build || exit 1
+copydokku:
cp dokku /usr/local/bin/dokku
+ chmod 0755 /usr/local/bin/dokku
+
+copyfiles: copydokku
+ $(MAKE) go-build || exit 1
mkdir -p ${CORE_PLUGINS_PATH} ${PLUGINS_PATH}
rm -rf ${CORE_PLUGINS_PATH}/*
test -d ${CORE_PLUGINS_PATH}/enabled || PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn init
@@ -131,7 +131,7 @@ plugin-dependencies: plugn procfile-util
plugins: plugn procfile-util docker
sudo -E dokku plugin:install --core
-dependencies: apt-update docker-image-labeler netrc sshcommand plugn procfile-util docker help2man man-db sigil dos2unix jq parallel
+dependencies: apt-update jq docker-image-labeler docker-container-healthchecker lambda-builder netrc sshcommand plugn procfile-util docker help2man man-db sigil dos2unix parallel
$(MAKE) -e stack
apt-update:
@@ -153,28 +153,36 @@ man-db:
apt-get -qq -y --no-install-recommends install man-db
docker-image-labeler:
- wget -qO /tmp/docker-image-labeler_latest.tgz ${DOCKER_IMAGE_LABELER_URL}
- tar xzf /tmp/docker-image-labeler_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/docker-image-labeler ${DOCKER_IMAGE_LABELER_URL}
+ chmod +x /usr/local/bin/docker-image-labeler
+
+docker-container-healthchecker:
+ wget -qO /usr/local/bin/docker-container-healthchecker ${DOCKER_CONTAINER_HEALTHCHECKER_URL}
+ chmod +x /usr/local/bin/docker-container-healthchecker
+
+lambda-builder:
+ wget -qO /usr/local/bin/lambda-builder ${LAMBDA_BUILDER_URL}
+ chmod +x /usr/local/bin/lambda-builder
netrc:
- wget -qO /tmp/netrc_latest.tgz ${NETRC_URL}
- tar xzf /tmp/netrc_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/netrc ${NETRC_URL}
+ chmod +x /usr/local/bin/netrc
procfile-util:
- wget -qO /tmp/procfile-util_latest.tgz ${PROCFILE_UTIL_URL}
- tar xzf /tmp/procfile-util_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/procfile-util ${PROCFILE_UTIL_URL}
+ chmod +x /usr/local/bin/procfile-util
plugn:
- wget -qO /tmp/plugn_latest.tgz ${PLUGN_URL}
- tar xzf /tmp/plugn_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/plugn ${PLUGN_URL}
+ chmod +x /usr/local/bin/plugn
sigil:
- wget -qO /tmp/sigil_latest.tgz ${SIGIL_URL}
- tar xzf /tmp/sigil_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/sigil ${SIGIL_URL}
+ chmod +x /usr/local/bin/sigil
sshcommand:
- wget -qO /tmp/sshcommand_latest.tgz ${SSHCOMMAND_URL}
- tar xzf /tmp/sshcommand_latest.tgz -C /usr/local/bin
+ wget -qO /usr/local/bin/sshcommand ${SSHCOMMAND_URL}
+ chmod +x /usr/local/bin/sshcommand
sshcommand create dokku /usr/local/bin/dokku
docker:
@@ -218,3 +226,8 @@ vagrant-acl-add:
vagrant-dokku:
vagrant ssh -- "sudo -H -u root bash -c 'dokku $(RUN_ARGS)'"
+
+IMAGE_TAG ?= dokku/dokku:latest
+
+test-image-healthcheck:
+ IMAGE_TAG=$(IMAGE_TAG) ./tests/image/healthcheck.sh
diff --git a/README.md b/README.md
index 7dfdbd7aed1..45e993060d2 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
# Dokku
-[](https://github.com/dokku/dokku/actions?query=workflow%3ACI)
+[](https://github.com/dokku/dokku/actions?query=branch%3Amaster)
[](https://packagecloud.io/dokku/dokku)
[](https://aur.archlinux.org/packages/dokku/)
-[](https://glider-slackin.herokuapp.com/)
+[](https://slack.dokku.com/)
[](https://dokku.com/docs/getting-started/installation/)
[](#sponsors)
[](#backers)
@@ -15,80 +15,67 @@ Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen.
Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/dokku#sponsor)]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+[](https://opencollective.com/dokku/sponsor/0/website)
+[](https://opencollective.com/dokku/sponsor/1/website)
+[](https://opencollective.com/dokku/sponsor/2/website)
+[](https://opencollective.com/dokku/sponsor/3/website)
+[](https://opencollective.com/dokku/sponsor/4/website)
+[](https://opencollective.com/dokku/sponsor/5/website)
+[](https://opencollective.com/dokku/sponsor/6/website)
+[](https://opencollective.com/dokku/sponsor/7/website)
+[](https://opencollective.com/dokku/sponsor/8/website)
+[](https://opencollective.com/dokku/sponsor/9/website)
+[](https://opencollective.com/dokku/sponsor/10/website)
+[](https://opencollective.com/dokku/sponsor/11/website)
+[](https://opencollective.com/dokku/sponsor/12/website)
+[](https://opencollective.com/dokku/sponsor/13/website)
+[](https://opencollective.com/dokku/sponsor/14/website)
+[](https://opencollective.com/dokku/sponsor/5/website)
+[](https://opencollective.com/dokku/sponsor/16/website)
+[](https://opencollective.com/dokku/sponsor/17/website)
+[](https://opencollective.com/dokku/sponsor/18/website)
## Backers
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/dokku#backer)]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+[](https://opencollective.com/dokku/backer/0/website)
+[](https://opencollective.com/dokku/backer/1/website)
+[](https://opencollective.com/dokku/backer/2/website)
+[](https://opencollective.com/dokku/backer/3/website)
+[](https://opencollective.com/dokku/backer/4/website)
+[](https://opencollective.com/dokku/backer/5/website)
+[](https://opencollective.com/dokku/backer/6/website)
+[](https://opencollective.com/dokku/backer/7/website)
+[](https://opencollective.com/dokku/backer/8/website)
+[](https://opencollective.com/dokku/backer/9/website)
+[](https://opencollective.com/dokku/backer/10/website)
+[](https://opencollective.com/dokku/backer/11/website)
+[](https://opencollective.com/dokku/backer/12/website)
+[](https://opencollective.com/dokku/backer/13/website)
+[](https://opencollective.com/dokku/backer/14/website)
+[](https://opencollective.com/dokku/backer/15/website)
+[](https://opencollective.com/dokku/backer/16/website)
+[](https://opencollective.com/dokku/backer/17/website)
+[](https://opencollective.com/dokku/backer/18/website)
+[](https://opencollective.com/dokku/backer/19/website)
+[](https://opencollective.com/dokku/backer/20/website)
+[](https://opencollective.com/dokku/backer/21/website)
+[](https://opencollective.com/dokku/backer/22/website)
+[](https://opencollective.com/dokku/backer/23/website)
+[](https://opencollective.com/dokku/backer/24/website)
+[](https://opencollective.com/dokku/backer/25/website)
+[](https://opencollective.com/dokku/backer/26/website)
+[](https://opencollective.com/dokku/backer/27/website)
+[](https://opencollective.com/dokku/backer/28/website)
+[](https://opencollective.com/dokku/backer/29/website)
## Requirements
A fresh VM running any of the following operating systems:
-- Ubuntu 18.04/20.04 x64 - Any currently supported release
-- Debian 9+ x64
-- CentOS 7 x64 *(experimental)*
-- Arch Linux x64 *(experimental)*
+- Ubuntu 22.04 / 24.04 (amd64/arm64) - Any currently supported release
+- Debian 11+ (amd64/arm64)
An SSH keypair that can be used for application deployment. If this exists before installation, it will be automatically imported into dokku.
Otherwise, you will need to import the keypair manually after installation using `dokku ssh-keys:add`.
@@ -98,8 +85,8 @@ Otherwise, you will need to import the keypair manually after installation using
To install the latest stable release, run the following commands as a user who has access to `sudo`:
```shell
-wget https://raw.githubusercontent.com/dokku/dokku/v0.26.8/bootstrap.sh
-sudo DOKKU_TAG=v0.26.8 bash bootstrap.sh
+wget -NP . https://dokku.com/install/v0.38.25/bootstrap.sh
+sudo DOKKU_TAG=v0.38.25 bash bootstrap.sh
```
You can then proceed to configure your server domain (via `dokku domains:set-global`) and user access (via `dokku ssh-keys:add`) to complete the installation.
@@ -112,15 +99,15 @@ If you wish for a more unattended installation method, see [these](https://dokku
## Documentation
-Full documentation - including advanced installation docs - are available online at [https://dokku.com/docs/getting-started/installation/](https://dokku.com/docs/getting-started/installation/).
+Full documentation - including advanced installation docs - are available online at .
## Support
-You can use [GitHub Issues](https://github.com/dokku/dokku/issues), check [Troubleshooting](https://dokku.com/docs/getting-started/troubleshooting/) in the documentation, or join us on [Gliderlabs Slack in the #dokku channel](https://glider-slackin.herokuapp.com/).
+You can use [GitHub Issues](https://github.com/dokku/dokku/issues), check [Troubleshooting](https://dokku.com/docs/getting-started/troubleshooting/) in the documentation, or join us on [Gliderlabs Slack in the #dokku channel](https://slack.dokku.com/).
## Contribution
-After checking [GitHub Issues](https://github.com/dokku/dokku/issues), the [Troubleshooting Guide](https://dokku.com/docs/getting-started/troubleshooting/) or having a chat with us on [Gliderlabs Slack in the #dokku channel](https://glider-slackin.herokuapp.com/), feel free to fork and create a Pull Request.
+After checking [GitHub Issues](https://github.com/dokku/dokku/issues), the [Troubleshooting Guide](https://dokku.com/docs/getting-started/troubleshooting/) or having a chat with us on [Gliderlabs Slack in the #dokku channel](https://slack.dokku.com/), feel free to fork and create a Pull Request.
While we may not merge your PR as is, they serve to start conversations and improve the general Dokku experience for all users.
diff --git a/Vagrantfile b/Vagrantfile
index d461f02a0cb..1c4552eaa2f 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -1,16 +1,15 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
-BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-18.04"
+BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-24.04"
BOX_CPUS = ENV["BOX_CPUS"] || "1"
BOX_MEMORY = ENV["BOX_MEMORY"] || "1024"
DOKKU_DOMAIN = ENV["DOKKU_DOMAIN"] || "dokku.me"
DOKKU_IP = ENV["DOKKU_IP"] || "10.0.0.2"
-FORWARDED_PORT = (ENV["FORWARDED_PORT"] || '8080').to_i
PREBUILT_STACK_URL = File.exist?("#{File.dirname(__FILE__)}/stack.tgz") ? 'file:///root/dokku/stack.tgz' : nil
PUBLIC_KEY_PATH = "#{Dir.home}/.ssh/id_rsa.pub"
-make_cmd = "DEBIAN_FRONTEND=noninteractive make -e install"
+make_cmd = "TARGETARCH=$(dpkg --print-architecture) DEBIAN_FRONTEND=noninteractive make -e install"
if PREBUILT_STACK_URL
make_cmd = "PREBUILT_STACK_URL='#{PREBUILT_STACK_URL}' #{make_cmd}"
end
@@ -40,10 +39,11 @@ Vagrant::configure("2") do |config|
end
config.vm.define "empty", autostart: false
+ config.vm.synced_folder ".", "/vagrant", type: "nfs", nfs_version: 4, nfs_udp: false
+
config.vm.define "dokku", primary: true do |vm|
- vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku"
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
+ vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku", type: "nfs", nfs_version: 4, nfs_udp: false
vm.vm.hostname = "#{DOKKU_DOMAIN}"
vm.vm.network :private_network, ip: DOKKU_IP
@@ -55,7 +55,7 @@ Vagrant::configure("2") do |config|
vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
end
- vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq >/dev/null && apt-get -qq -y --no-install-recommends install git build-essential >/dev/null && cd /root/dokku && #{make_cmd}"
+ vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq >/dev/null && apt-get -qq -y --no-install-recommends install git build-essential jq nginx >/dev/null && cd /root/dokku && #{make_cmd}"
vm.vm.provision :shell do |s|
s.inline = <<-EOT
echo '"\e[5~": history-search-backward' > /root/.inputrc
@@ -72,46 +72,33 @@ Vagrant::configure("2") do |config|
# For windows users. Sharing folder from windows creates problem with sym links and so, sync the repo instead from GOS.
config.vm.define "dokku-windows", autostart: false do |vm|
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
vm.vm.hostname = "#{DOKKU_DOMAIN}"
vm.vm.network :private_network, ip: DOKKU_IP
- vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq >/dev/null && apt-get -qq -y --no-install-recommends install git dos2unix >/dev/null"
+ vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq >/dev/null && apt-get -qq -y --no-install-recommends install git dos2unix nginx >/dev/null"
vm.vm.provision :shell, :inline => "cd /vagrant/ && export DOKKU_BRANCH=`git symbolic-ref -q --short HEAD 2>/dev/null` && export DOKKU_TAG=`git describe --tags --exact-match 2>/dev/null` && cd /root/ && cp /vagrant/bootstrap.sh ./ && dos2unix bootstrap.sh && bash bootstrap.sh"
end
config.vm.define "dokku-deb", autostart: false do |vm|
- vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku"
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
+ vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku", type: "nfs", nfs_version: 4, nfs_udp: false
vm.vm.hostname = "#{DOKKU_DOMAIN}"
vm.vm.network :private_network, ip: DOKKU_IP
vm.vm.provision :shell, :inline => "cd /root/dokku && make install-from-deb"
end
- config.vm.define "dokku-rpm", autostart: false do |vm|
- vm.vm.box = "centos/7"
- vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku"
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
- vm.vm.hostname = "#{DOKKU_DOMAIN}"
- vm.vm.network :private_network, ip: DOKKU_IP
- vm.vm.provision :shell, :inline => "cd /root/dokku && bash bootstrap.sh"
- end
-
config.vm.define "build", autostart: false do |vm|
- vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku"
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
+ vm.vm.synced_folder File.dirname(__FILE__), "/root/dokku", type: "nfs", nfs_version: 4, nfs_udp: false
vm.vm.hostname = "#{DOKKU_DOMAIN}"
vm.vm.network :private_network, ip: DOKKU_IP
vm.vm.provision :shell, :inline => "export DEBIAN_FRONTEND=noninteractive && apt-get update -qq >/dev/null && apt-get -qq -y --no-install-recommends install git >/dev/null && cd /root/dokku && #{make_cmd}"
- vm.vm.provision :shell, :inline => "export IS_RELEASE=true && cd /root/dokku && make deb-all rpm-all"
+ vm.vm.provision :shell, :inline => "export IS_RELEASE=true && cd /root/dokku && make deb-all"
end
config.vm.define "build-arch", autostart: false do |vm|
vm.vm.box = "bugyt/archlinux"
- vm.vm.synced_folder File.dirname(__FILE__), "/dokku"
+ vm.vm.synced_folder File.dirname(__FILE__), "/dokku", type: "nfs", nfs_version: 4, nfs_udp: false
if Pathname.new("#{File.dirname(__FILE__)}/../dokku-arch").exist?
- vm.vm.synced_folder "#{File.dirname(__FILE__)}/../dokku-arch", "/dokku-arch"
+ vm.vm.synced_folder "#{File.dirname(__FILE__)}/../dokku-arch", "/dokku-arch", type: "nfs", nfs_version: 4, nfs_udp: false
end
- vm.vm.network :forwarded_port, guest: 80, host: FORWARDED_PORT
vm.vm.hostname = "#{DOKKU_DOMAIN}"
vm.vm.network :private_network, ip: DOKKU_IP
vm.vm.provision :shell, :inline => "cd /dokku && make arch-all", privileged: false
diff --git a/bootstrap.sh b/bootstrap.sh
index 9869aaa3bb5..b3653a7563a 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -3,7 +3,7 @@ set -eo pipefail
[[ $TRACE ]] && set -x
# A script to bootstrap dokku.
-# It expects to be run on Ubuntu 18.04/20.04, or CentOS 7 via 'sudo'
+# It expects to be run on Ubuntu 22.04/24.04 via 'sudo`
# If installing a tag higher than 0.3.13, it may install dokku via a package (so long as the package is higher than 0.3.13)
# It checks out the dokku source code from GitHub into ~/dokku and then runs 'make install' from dokku source.
@@ -12,7 +12,7 @@ set -eo pipefail
# That's good because it prevents our output overlapping with wget's.
# It also means that we can't run a partially downloaded script.
-SUPPORTED_VERSIONS="Debian [9, 10, 11], CentOS [7], Fedora (partial) [33, 34], Ubuntu [18.04, 20.04]"
+SUPPORTED_VERSIONS="Debian [11, 12, 13], Ubuntu [22.04, 24.04]"
log-fail() {
declare desc="log fail formatter"
@@ -28,7 +28,7 @@ ensure-environment() {
echo "Preparing to install $DOKKU_TAG from $DOKKU_REPO..."
fi
- hostname -f >/dev/null 2>&1 || {
+ hostname -f &>/dev/null || {
log-fail "This installation script requires that you have a hostname set for the instance. Please set a hostname for 127.0.0.1 in your /etc/hosts"
}
@@ -48,9 +48,15 @@ install-requirements() {
apt-get update -qq >/dev/null
apt-get -qq -y --no-install-recommends install gpg-agent
fi
- if ! dpkg -l | grep -q software-properties-common; then
+ if ! command -v lsb_release &>/dev/null; then
apt-get update -qq >/dev/null
- apt-get -qq -y --no-install-recommends install software-properties-common
+ apt-get -qq -y --no-install-recommends install lsb-release
+ fi
+ if [[ "$DOKKU_DISTRO_VERSION" -lt "13" ]]; then
+ if ! dpkg -l | grep -q software-properties-common; then
+ apt-get update -qq >/dev/null
+ apt-get -qq -y --no-install-recommends install software-properties-common
+ fi
fi
;;
ubuntu)
@@ -63,7 +69,7 @@ install-requirements() {
apt-get -qq -y --no-install-recommends install software-properties-common
fi
- add-apt-repository universe >/dev/null
+ add-apt-repository -y universe >/dev/null
apt-get update -qq >/dev/null
;;
esac
@@ -122,7 +128,22 @@ install-dokku-from-source() {
log-fail "This installation script requires apt-get. For manual installation instructions, consult https://dokku.com/docs/getting-started/advanced-installation/"
fi
- apt-get -qq -y --no-install-recommends install sudo git make software-properties-common
+ apt-get -qq -y --no-install-recommends install sudo git make
+ case "$DOKKU_DISTRO" in
+ debian)
+ if [[ "$DOKKU_DISTRO_VERSION" -lt "13" ]]; then
+ if ! dpkg -l | grep -q software-properties-common; then
+ apt-get -qq -y --no-install-recommends install software-properties-common
+ fi
+ fi
+ ;;
+ ubuntu)
+ if ! dpkg -l | grep -q software-properties-common; then
+ apt-get -qq -y --no-install-recommends install software-properties-common
+ fi
+ ;;
+ esac
+
cd /root
if [[ ! -d /root/dokku ]]; then
git clone "$DOKKU_REPO" /root/dokku
@@ -139,9 +160,6 @@ install-dokku-from-package() {
debian | ubuntu)
install-dokku-from-deb-package "$@"
;;
- centos | fedora | rhel)
- install-dokku-from-rpm-package "$@"
- ;;
*)
log-fail "Unsupported Linux distribution. For manual installation instructions, consult https://dokku.com/docs/getting-started/advanced-installation/"
;;
@@ -163,7 +181,7 @@ install-dokku-from-deb-package() {
local NO_INSTALL_RECOMMENDS=${DOKKU_NO_INSTALL_RECOMMENDS:=""}
local OS_ID
- if ! in-array "$DOKKU_DISTRO_VERSION" "18.04" "20.04" "9" "10" "11"; then
+ if ! in-array "$DOKKU_DISTRO_VERSION" "22.04" "24.04" "10" "11" "12" "13"; then
log-fail "Unsupported Linux distribution. Only the following versions are supported: $SUPPORTED_VERSIONS"
fi
@@ -171,10 +189,6 @@ install-dokku-from-deb-package() {
NO_INSTALL_RECOMMENDS=" --no-install-recommends "
fi
- echo "--> Initial apt-get update"
- apt-get update -qq >/dev/null
- apt-get -qq -y --no-install-recommends install apt-transport-https
-
if ! command -v docker &>/dev/null; then
echo "--> Installing docker"
if uname -r | grep -q linode; then
@@ -188,31 +202,31 @@ install-dokku-from-deb-package() {
wget -nv -O - https://get.docker.com/ | sh
fi
- OS_ID="$(lsb_release -cs 2>/dev/null || echo "bionic")"
+ OS_ID="$(lsb_release -cs 2>/dev/null || echo "noble")"
if ! in-array "$DOKKU_DISTRO" "debian" "ubuntu" "raspbian"; then
DOKKU_DISTRO="ubuntu"
- OS_ID="bionic"
+ OS_ID="noble"
fi
if [[ "$DOKKU_DISTRO" == "ubuntu" ]]; then
- OS_IDS=("bionic" "focal")
+ OS_IDS=("jammy" "noble")
if ! in-array "$OS_ID" "${OS_IDS[@]}"; then
- OS_ID="bionic"
+ OS_ID="noble"
fi
elif [[ "$DOKKU_DISTRO" == "debian" ]]; then
- OS_IDS=("stretch" "buster" "bullseye")
+ OS_IDS=("bullseye" "bookworm" "trixie")
if ! in-array "$OS_ID" "${OS_IDS[@]}"; then
- OS_ID="bullseye"
+ OS_ID="bookworm"
fi
elif [[ "$DOKKU_DISTRO" == "raspbian" ]]; then
- OS_IDS=("buster")
+ OS_IDS=("bullseye" "bookworm" "trixie")
if ! in-array "$OS_ID" "${OS_IDS[@]}"; then
- OS_ID="buster"
+ OS_ID="bookworm"
fi
fi
echo "--> Installing dokku"
- wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
+ wget -qO- https://packagecloud.io/dokku/dokku/gpgkey | sudo tee /etc/apt/trusted.gpg.d/dokku.asc
echo "deb https://packagecloud.io/dokku/dokku/$DOKKU_DISTRO/ $OS_ID main" | tee /etc/apt/sources.list.d/dokku.list
apt-get update -qq >/dev/null
@@ -223,48 +237,15 @@ install-dokku-from-deb-package() {
[[ -n $DOKKU_NGINX_ENABLE ]] && echo "dokku dokku/nginx_enable string $DOKKU_NGINX_ENABLE" | sudo debconf-set-selections
if [[ -n $DOKKU_CHECKOUT ]]; then
- # shellcheck disable=SC2086
apt-get -qq -y $NO_INSTALL_RECOMMENDS install "dokku=$DOKKU_CHECKOUT"
else
- # shellcheck disable=SC2086
apt-get -qq -y $NO_INSTALL_RECOMMENDS install dokku
fi
}
-install-dokku-from-rpm-package() {
- local DOKKU_CHECKOUT="$1"
-
- if ! in-array "$DOKKU_DISTRO_VERSION" "7"; then
- log-fail "Unsupported Linux distribution. Only the following versions are supported: $SUPPORTED_VERSIONS"
- fi
-
- echo "--> Installing docker"
- curl -fsSL https://get.docker.com/ | sh
-
- echo "--> Installing epel for nginx packages to be available"
- yum install -y epel-release
-
- echo "--> Installing herokuish and dokku"
- curl -s https://packagecloud.io/install/repositories/dokku/dokku/script.rpm.sh | bash
- if [[ -n $DOKKU_CHECKOUT ]]; then
- yum -y install herokuish "dokku-$DOKKU_CHECKOUT"
- else
- yum -y install herokuish dokku
- fi
-
- echo "--> Enabling docker and nginx on system startup"
- systemctl enable docker
- systemctl enable nginx
-
- echo "--> Starting nginx"
- systemctl start nginx
-}
-
main() {
export DOKKU_DISTRO DOKKU_DISTRO_VERSION
- # shellcheck disable=SC1091
DOKKU_DISTRO=$(. /etc/os-release && echo "$ID")
- # shellcheck disable=SC1091
DOKKU_DISTRO_VERSION=$(. /etc/os-release && echo "$VERSION_ID")
export DEBIAN_FRONTEND=noninteractive
diff --git a/common.mk b/common.mk
index 4cc40f52433..0160634aaad 100644
--- a/common.mk
+++ b/common.mk
@@ -1,7 +1,7 @@
GO_ARGS ?=
GO_PLUGIN_MAKE_TARGET ?= build
GO_REPO_ROOT := /go/src/github.com/dokku/dokku
-BUILD_IMAGE := golang:1.16.10
+BUILD_IMAGE := golang:1.26.2
GO_BUILD_CACHE ?= /tmp/dokku-go-build-cache
GO_MOD_CACHE ?= /tmp/dokku-go-mod-mod
GO_ROOT_MOUNT ?= $$PWD/../..:$(GO_REPO_ROOT)
@@ -21,17 +21,17 @@ build-in-docker: clean
-e GO111MODULE=on \
-w $(GO_REPO_ROOT)/plugins/$(PLUGIN_NAME) \
$(BUILD_IMAGE) \
- bash -c "GO_ARGS='$(GO_ARGS)' CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) make -j4 $(GO_PLUGIN_MAKE_TARGET)" || exit $$?
+ bash -c "GO_ARGS='$(GO_ARGS)' CGO_ENABLED=0 GOOS=linux GOARCH=$(GOARCH) GOWORK=off make -j4 $(GO_PLUGIN_MAKE_TARGET)" || exit $$?
clean:
rm -rf $(BUILD)
find . -xtype l -delete
commands: **/**/commands.go
- go build -ldflags="-s -w" $(GO_ARGS) -o commands src/commands/commands.go
+ GOARCH=$(GOARCH) go build -mod=readonly -ldflags="-s -w" $(GO_ARGS) -o commands src/commands/commands.go
subcommands:
- go build -ldflags="-s -w" $(GO_ARGS) -o subcommands/subcommands src/subcommands/subcommands.go
+ GOARCH=$(GOARCH) go build -mod=readonly -ldflags="-s -w" $(GO_ARGS) -o subcommands/subcommands src/subcommands/subcommands.go
$(MAKE) $(SUBCOMMANDS)
subcommands/%:
@@ -41,7 +41,7 @@ src-clean:
rm -rf .gitignore src vendor Makefile *.go glide.* go.sum go.mod
triggers:
- go build -ldflags="-s -w" $(GO_ARGS) -o triggers src/triggers/triggers.go
+ GOARCH=$(GOARCH) go build -mod=readonly -ldflags="-s -w" $(GO_ARGS) -o triggers src/triggers/triggers.go
$(MAKE) $(TRIGGERS)
triggers/%:
diff --git a/contrib/build-base.Dockerfile b/contrib/build-base.Dockerfile
index f553a8cc96f..17259793fa9 100644
--- a/contrib/build-base.Dockerfile
+++ b/contrib/build-base.Dockerfile
@@ -1,6 +1,24 @@
-FROM ubuntu:18.04
+FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
-RUN apt-get update -qq && apt-get -qq -y --no-install-recommends install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
-RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
+RUN apt-get update -qq && apt-get -qq -y --no-install-recommends install \
+ adduser \
+ build-essential \
+ ca-certificates \
+ coreutils \
+ curl \
+ gcc \
+ git \
+ help2man \
+ jq \
+ libc-bin \
+ lintian \
+ man-db \
+ openssh-client \
+ python3 \
+ rpm \
+ ruby-dev \
+ sudo \
+ wget
+RUN command -v fpm || gem install fpm
diff --git a/contrib/build-docs b/contrib/build-docs
new file mode 100755
index 00000000000..db04310232f
--- /dev/null
+++ b/contrib/build-docs
@@ -0,0 +1,167 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+readonly ROOT_DIR="$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)"
+
+main() {
+ pushd "$ROOT_DIR" >/dev/null || return 1
+ rm -rf docs-main tmp/docs-source tmp/docs-build # tmp/docs-build
+ cp -r docs docs-main
+
+ echo "====> Generating docs image"
+ make docs-build-image
+
+ echo "====> Fetching latest docs"
+ git clone -q https://github.com/dokku/docs.git tmp/docs-build
+
+ echo "====> Processing version: latest"
+ rm -rf tmp/docs-build/docs
+ git clone -q https://github.com/dokku/dokku.git tmp/docs-source
+
+ rm -rf docs/assets
+ mkdir -p docs/assets
+ cp -r docs-main/assets/extra.css docs/assets/extra.css
+ cp -r docs-main/assets/favicons docs/assets/favicons
+ cp -r docs-main/assets/dokku-logo.svg docs/assets/dokku-logo.svg
+
+ rm -rf tmp/docs-build/assets
+ cp -r docs-main/assets tmp/docs-build/assets
+ cp docs-main/_build/app-nginx.conf.sigil tmp/docs-build/app-nginx.conf.sigil
+ mkdir -p tmp/docs-build/nginx.conf.d
+ touch tmp/docs-build/.static
+ echo "[]" >tmp/docs-build/versions.json
+
+ sed -i.bak "s/outdated/outdated_hidden/g" docs/_overrides/main.html && rm docs/_overrides/main.html.bak
+ echo "----> Generating docs"
+ make docs-build
+ if [[ -n "$GITHUB_ACTION" ]]; then
+ sudo chown -R "$(whoami)" site
+ fi
+
+ rm -rf site/_build
+ mv site tmp/docs-build/docs
+ mv docs/home.html tmp/docs-build/index.html
+ sed -i.bak "s/{{NAME}}~{{REF}}/docs/g" tmp/docs-build/index.html && rm tmp/docs-build/index.html.bak
+ sed -i.bak "s/{{NAME}}/docs/g" tmp/docs-build/index.html && rm tmp/docs-build/index.html.bak
+ sed -i.bak 's/="\/docs\/"/="\/"/g' tmp/docs-build/index.html && rm tmp/docs-build/index.html.bak
+
+ jq -C -r '.["max-versions"][]' docs-main/assets/versions.json | while read -r current_version; do
+ major="$(echo "$current_version" | cut -d'.' -f1)"
+ minor="$(echo "$current_version" | cut -d'.' -f2)"
+ patch="$(echo "$current_version" | cut -d'.' -f3)"
+ while true; do
+ if [[ "$patch" -lt 0 ]]; then
+ break
+ fi
+ version="${major}.${minor}.${patch}"
+ echo "====> Processing version: ${major}.${minor}.${patch}"
+
+ if [[ "$major" -lt 1 ]]; then
+ if [[ "$current_version" != "$version" ]]; then
+ echo " Writing rewrite rule"
+ echo "rewrite ^/docs~v$version/(.*)$ /docs~v$current_version/\$1 redirect;" >"tmp/docs-build/nginx.conf.d/$version.conf"
+ echo " Removing old docs"
+ rm -rf "tmp/docs-build/docs~v${version}"
+ patch=$((patch - 1))
+ continue
+ fi
+ fi
+
+ jq --arg title "v$version" --arg version "docs~v$version" '. += [{"title": $title, "version": $version, "aliases": []}]' tmp/docs-build/versions.json >tmp/docs-build/versions.json.bak
+ mv tmp/docs-build/versions.json.bak tmp/docs-build/versions.json
+ if [[ -d "tmp/docs-build/docs~v${version}" ]]; then
+ echo " ! Docs exist, skipping regeneration"
+ rm -rf "tmp/docs-build/docs~v${version}/assets/favicons"
+ cp -r docs-main/assets/favicons "tmp/docs-build/docs~v${version}/assets/favicons"
+ cp -r docs-main/assets/dokku-logo.svg "tmp/docs-build/docs~v${version}/assets/dokku-logo.svg"
+ cp -r docs-main/assets/extra.css "tmp/docs-build/docs~v${version}/assets/extra.css"
+ patch=$((patch - 1))
+ continue
+ fi
+
+ git -C tmp/docs-source checkout -q -- .
+ git -C tmp/docs-source checkout -q "tags/v${version}" -b "v${version}-branch"
+ rm -rf docs
+ mv tmp/docs-source/docs docs
+
+ rm -rf docs/assets
+ mkdir -p docs/assets
+ cp -r docs-main/assets/favicons docs/assets/favicons
+ cp -r docs-main/assets/dokku-logo.svg docs/assets/dokku-logo.svg
+ cp -r docs-main/assets/extra.css docs/assets/extra.css
+
+ cp -r docs-main/_build docs/_build
+ cp -r docs-main/_overrides docs/_overrides
+ git checkout -q -- mkdocs.yml
+ sed -i.bak "s/site_dir: site/site_dir: docs~v$version/g" mkdocs.yml && rm mkdocs.yml.bak
+ if [[ ! -f docs/template.html ]]; then
+ if [[ "$patch" -eq 0 ]]; then
+ break
+ fi
+
+ continue
+ fi
+
+ echo "----> Generating docs"
+ if ! make docs-build; then
+ continue
+ fi
+
+ if [[ -d "docs~v${version}" ]]; then
+ if [[ -n "$GITHUB_ACTION" ]]; then
+ sudo chown -R "$(whoami)" "docs~v${version}"
+ fi
+
+ rm -rf "docs~v${version}/_build"
+ mv "docs~v${version}" "tmp/docs-build/docs~v${version}"
+ fi
+
+ if [[ "$patch" -eq 0 ]]; then
+ break
+ fi
+ patch=$((patch - 1))
+ done
+ done
+
+ echo "====> Rebuild versions"
+ if [[ -f "tmp/docs-build/versions.json" ]]; then
+ python3 contrib/sort-mkdocs-versions
+ else
+ echo " No version file exists"
+ fi
+
+ echo "====> Cleanup main repo"
+ rm -rf docs
+ mv docs-main docs
+ git checkout -- mkdocs.yml docs
+
+ echo "====> Checking for file changes"
+ changes=$(git -C tmp/docs-build ls-files -dmo)
+ if [[ -z "$changes" ]]; then
+ echo " ! No doc changes found"
+ exit 0
+ fi
+
+ if [[ "$changes" == "docs/sitemap.xml.gz" ]]; then
+ echo " ! No doc changes found"
+ git -C tmp/docs-build checkout -- docs/sitemap.xml.gz
+ exit 0
+ fi
+
+ echo "====> Changes found"
+ echo "$changes"
+
+ echo "====> Committing changes"
+ git -C tmp/docs-build add .
+ git -C tmp/docs-build commit -m "chore: regenerate docs"
+
+ echo "====> Pushing changes"
+ if [[ -n "$BOT_GITHUB_USERNAME" ]] && [[ -n "$BOT_GITHUB_API_TOKEN" ]]; then
+ git -C tmp/docs-build remote set-url origin "https://$BOT_GITHUB_USERNAME:$BOT_GITHUB_API_TOKEN@github.com/dokku/docs.git"
+ fi
+
+ git -C tmp/docs-build push origin master
+
+}
+
+main "$@"
diff --git a/contrib/build-dokku.Dockerfile b/contrib/build-dokku.Dockerfile
index afadbb4bc85..7f08388fa6f 100644
--- a/contrib/build-dokku.Dockerfile
+++ b/contrib/build-dokku.Dockerfile
@@ -1,30 +1,29 @@
-FROM dokku/build-base:0.0.1 AS builder
+FROM dokku/build-base:0.1.2 AS builder
ENV DEBIAN_FRONTEND=noninteractive
-RUN apt-get update -qq && apt-get -qq -y --no-install-recommends install gcc git build-essential wget ruby-dev ruby1.9.1 lintian rpm help2man man-db
-RUN command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
-
ARG GOLANG_VERSION
-
-RUN wget -qO /tmp/go${GOLANG_VERSION}.linux-amd64.tar.gz https://storage.googleapis.com/golang/go${GOLANG_VERSION}.linux-amd64.tar.gz \
- && tar -C /usr/local -xzf /tmp/go${GOLANG_VERSION}.linux-amd64.tar.gz \
- && cp /usr/local/go/bin/* /usr/local/bin
-
ARG WORKDIR=/go/src/github.com/dokku/dokku
WORKDIR ${WORKDIR}
+RUN wget -qO /tmp/go${GOLANG_VERSION}.linux.tar.gz "https://go.dev/dl/go${GOLANG_VERSION}.linux-$(dpkg --print-architecture).tar.gz" \
+ && tar -C /usr/local -xzf /tmp/go${GOLANG_VERSION}.linux.tar.gz \
+ && cp /usr/local/go/bin/* /usr/local/bin \
+ && mkdir -p ${WORKDIR}/contrib
+
COPY Makefile ${WORKDIR}/
COPY *.mk ${WORKDIR}/
+COPY contrib/dependencies.json ${WORKDIR}/contrib/dependencies.json
-RUN make deb-setup rpm-setup sshcommand plugn
+RUN make deb-setup sshcommand plugn
COPY . ${WORKDIR}
ENV GOPATH=/go
+ENV GOROOT=/usr/local/go
-FROM builder as amd64
+FROM builder AS amd64
ARG PLUGIN_MAKE_TARGET
ARG DOKKU_VERSION=master
@@ -37,9 +36,9 @@ RUN PLUGIN_MAKE_TARGET=${PLUGIN_MAKE_TARGET} \
IS_RELEASE=${IS_RELEASE} \
SKIP_GO_CLEAN=true \
make version copyfiles \
- && make deb-dokku rpm-dokku
+ && make deb-dokku
-FROM builder as armhf
+FROM builder AS arm64
COPY --from=amd64 /tmp /tmp
COPY --from=amd64 /usr/local/share/man/man1/dokku.1 /usr/local/share/man/man1/dokku.1-generated
@@ -56,7 +55,7 @@ RUN PLUGIN_MAKE_TARGET=${PLUGIN_MAKE_TARGET} \
DOKKU_GIT_REV=${DOKKU_GIT_REV} \
IS_RELEASE=${IS_RELEASE} \
SKIP_GO_CLEAN=true \
- GOARCH=arm make version copyfiles \
- && DOKKU_ARCHITECTURE=armhf GOARCH=arm make deb-dokku
+ GOARCH=arm64 make version copyfiles \
+ && DOKKU_ARCHITECTURE=arm64 GOARCH=arm64 make deb-dokku
RUN ls -lha /tmp/
diff --git a/contrib/copy-packages b/contrib/copy-packages
index b2959ec9bbf..12458bf20b2 100644
--- a/contrib/copy-packages
+++ b/contrib/copy-packages
@@ -5,19 +5,17 @@ import shutil
import subprocess
from requests.auth import HTTPBasicAuth
-PACKAGECLOUD_TOKEN = os.getenv('DOKKU_PACKAGECLOUD_TOKEN')
+PACKAGECLOUD_TOKEN = os.getenv("DOKKU_PACKAGECLOUD_TOKEN")
def download_file(filename, url):
r = requests.get(url, stream=True)
- with open(filename, 'wb') as f:
+ with open(filename, "wb") as f:
shutil.copyfileobj(r.raw, f)
def upload_file(filename):
- versions = [
- "focal"
- ]
+ versions = ["noble"]
cmd_template = "package_cloud push dokku/dokku/ubuntu/{0} {1}"
for version in versions:
cmd = cmd_template.format(version, filename)
@@ -25,21 +23,22 @@ def upload_file(filename):
def main():
- auth = HTTPBasicAuth(PACKAGECLOUD_TOKEN, '')
- base = requests.get('https://packagecloud.io/api/v1/repos/dokku/dokku/packages/deb/ubuntu/bionic.json',
- auth=auth)
+ auth = HTTPBasicAuth(PACKAGECLOUD_TOKEN, "")
+ base = requests.get(
+ "https://packagecloud.io/api/v1/repos/dokku/dokku/packages/deb/ubuntu/jammy.json",
+ auth=auth,
+ )
data = base.json()
urls = []
for package in data:
- urls.append(package['versions_url'])
+ urls.append(package["versions_url"])
download_urls = {}
for url in urls:
- base = requests.get('https://packagecloud.io{0}'.format(url),
- auth=auth)
+ base = requests.get("https://packagecloud.io{0}".format(url), auth=auth)
data = base.json()
for version in data:
- download_urls['downloads/' + version['filename']] = version['download_url']
+ download_urls["downloads/" + version["filename"]] = version["download_url"]
for filename, download_url in download_urls.items():
print("downloading {0}".format(filename))
diff --git a/contrib/dependencies.json b/contrib/dependencies.json
new file mode 100644
index 00000000000..e78b51a463a
--- /dev/null
+++ b/contrib/dependencies.json
@@ -0,0 +1,104 @@
+{
+ "dependencies": [
+ {
+ "name": "docker-container-healthchecker",
+ "version": "0.15.2",
+ "urls": {
+ "amd64": "https://github.com/dokku/docker-container-healthchecker/releases/download/v0.15.2/docker-container-healthchecker-linux-amd64",
+ "arm64": "https://github.com/dokku/docker-container-healthchecker/releases/download/v0.15.2/docker-container-healthchecker-linux-arm64"
+ }
+ },
+ {
+ "name": "docker-image-labeler",
+ "version": "0.9.0",
+ "urls": {
+ "amd64": "https://github.com/dokku/docker-image-labeler/releases/download/v0.9.0/docker-image-labeler-linux-amd64",
+ "arm64": "https://github.com/dokku/docker-image-labeler/releases/download/v0.9.0/docker-image-labeler-linux-arm64"
+ }
+ },
+ {
+ "name": "lambda-builder",
+ "version": "0.9.3",
+ "urls": {
+ "amd64": "https://github.com/dokku/lambda-builder/releases/download/v0.9.3/lambda-builder-linux-amd64",
+ "arm64": "https://github.com/dokku/lambda-builder/releases/download/v0.9.3/lambda-builder-linux-arm64"
+ }
+ },
+ {
+ "name": "netrc",
+ "version": "0.11.0",
+ "urls": {
+ "amd64": "https://github.com/dokku/netrc/releases/download/v0.11.0/netrc-linux-amd64",
+ "arm64": "https://github.com/dokku/netrc/releases/download/v0.11.0/netrc-linux-arm64"
+ }
+ },
+ {
+ "name": "pack",
+ "version": "0.40.8",
+ "urls": {
+ "amd64": "https://github.com/buildpacks/pack/releases/download/v0.40.8/pack-v0.40.8-linux.tgz",
+ "arm64": "https://github.com/buildpacks/pack/releases/download/v0.40.8/pack-v0.40.8-linux-arm64.tgz"
+ }
+ },
+ {
+ "name": "procfile-util",
+ "version": "0.20.7",
+ "urls": {
+ "amd64": "https://github.com/dokku/procfile-util/releases/download/v0.20.7/procfile-util-linux-amd64",
+ "arm64": "https://github.com/dokku/procfile-util/releases/download/v0.20.7/procfile-util-linux-arm64"
+ }
+ },
+ {
+ "name": "sshcommand",
+ "version": "0.20.1",
+ "urls": {
+ "amd64": "https://github.com/dokku/sshcommand/releases/download/v0.20.1/sshcommand",
+ "arm64": "https://github.com/dokku/sshcommand/releases/download/v0.20.1/sshcommand"
+ }
+ }
+ ],
+ "predependencies": [
+ {
+ "name": "gliderlabs-sigil",
+ "version": "0.12.0",
+ "urls": {
+ "amd64": "https://github.com/gliderlabs/sigil/releases/download/v0.12.0/sigil-linux-amd64",
+ "arm64": "https://github.com/gliderlabs/sigil/releases/download/v0.12.0/sigil-linux-arm64"
+ }
+ },
+ {
+ "name": "plugn",
+ "version": "0.17.0",
+ "urls": {
+ "amd64": "https://github.com/dokku/plugn/releases/download/v0.17.0/plugn-linux-amd64",
+ "arm64": "https://github.com/dokku/plugn/releases/download/v0.17.0/plugn-linux-arm64"
+ }
+ }
+ ],
+ "recommendations": [
+ {
+ "name": "dokku-event-listener",
+ "version": "0.20.0",
+ "urls": {
+ "amd64": "https://github.com/dokku/dokku-event-listener/releases/download/v0.20.0/dokku-event-listener-linux-amd64",
+ "arm64": "https://github.com/dokku/dokku-event-listener/releases/download/v0.20.0/dokku-event-listener-linux-arm64"
+ }
+ },
+ {
+ "name": "dokku-update",
+ "version": "0.9.8",
+ "urls": {
+ "amd64": "https://github.com/dokku/dokku-update/releases/download/v0.9.8/dokku-update",
+ "arm64": "https://github.com/dokku/dokku-update/releases/download/v0.9.8/dokku-update"
+ }
+ },
+ {
+ "name": "herokuish",
+ "version": "0.11.13",
+ "urls": {
+ "amd64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.13/herokuish_0.11.13_linux_x86_64.tgz",
+ "arm64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.13/herokuish_0.11.13_linux_x86_64.tgz"
+ }
+ }
+ ]
+}
diff --git a/contrib/dokku-docker-bin.sh b/contrib/dokku-docker-bin.sh
index 3bc36232294..9619f465164 100755
--- a/contrib/dokku-docker-bin.sh
+++ b/contrib/dokku-docker-bin.sh
@@ -4,5 +4,4 @@ set -eo pipefail
DOKKU_DOCKER_CONTAINER_NAME=${DOKKU_DOCKER_CONTAINER_NAME:=dokku}
# TODO: handle cases where we need a tty
-# shellcheck disable=SC2086
docker exec $DOKKU_DOCKER_ENV -i "$DOKKU_DOCKER_CONTAINER_NAME" dokku "$@"
diff --git a/contrib/dokku_client.sh b/contrib/dokku_client.sh
index 7db4416673f..2151568b62d 100755
--- a/contrib/dokku_client.sh
+++ b/contrib/dokku_client.sh
@@ -1,8 +1,9 @@
#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
-export DOKKU_PORT=${DOKKU_PORT:=22}
+export DOKKU_PORT=${DOKKU_PORT:=}
export DOKKU_HOST=${DOKKU_HOST:=}
+export DOKKU_APP_PATH=${DOKKU_APP_PATH:=}
fn-random-number() {
[[ -n "$1" ]] && RANGE="$1"
@@ -49,7 +50,7 @@ fn-dokku-host() {
declare DOKKU_GIT_REMOTE="$1" DOKKU_HOST="$2"
if [[ -z "$DOKKU_HOST" ]]; then
- if [[ -d .git ]] || git rev-parse --git-dir >/dev/null 2>&1; then
+ if [[ -d .git ]] || git rev-parse --git-dir &>/dev/null; then
DOKKU_HOST=$(git remote -v 2>/dev/null | grep -Ei "^${DOKKU_GIT_REMOTE}\s" | head -n 1 | cut -f1 -d' ' | cut -f2 -d '@' | cut -f1 -d':' 2>/dev/null || true)
fi
fi
@@ -61,9 +62,43 @@ fn-dokku-host() {
echo "$DOKKU_HOST"
}
+fn-dokku-app() {
+ declare DOKKU_GIT_REMOTE="$1" DOKKU_REMOTE_HOST="$2"
+ remote_output="$(git remote -v 2>/dev/null | grep -Ei "^${DOKKU_GIT_REMOTE}\s" | head -n 1 | awk '{print $2}')"
+
+ # check if there is a scheme
+ if echo "$remote_output" | grep -qEi "ssh://"; then
+ echo "$remote_output" | grep -Ei "ssh://dokku@$DOKKU_REMOTE_HOST" | cut -f2 -d'@' | cut -f2 -d'/' 2>/dev/null
+ else
+ echo "$remote_output" | grep -Ei "dokku@$DOKKU_REMOTE_HOST" | cut -f2 -d'@' | cut -f2 -d':' 2>/dev/null
+ fi
+}
+
+fn-dokku-port() {
+ declare DOKKU_GIT_REMOTE="$1" DOKKU_REMOTE_HOST="$2"
+ remote_output="$(git remote -v 2>/dev/null | grep -Ei "^${DOKKU_GIT_REMOTE}\s" | head -n 1 | awk '{print $2}')"
+
+ if echo "$remote_output" | grep -qEi "ssh://"; then
+ local output="$(echo "$remote_output" | grep -Ei "ssh://dokku@$DOKKU_REMOTE_HOST" | cut -f2 -d'@' | cut -f1 -d'/' 2>/dev/null)"
+ # check if output has a : and if so, get the port
+ if echo "$output" | grep -qEi ":"; then
+ echo "$output" | cut -f2 -d':' 2>/dev/null
+ else
+ echo "22"
+ fi
+ else
+ echo "22"
+ fi
+}
+
+fn-get-remote() {
+ git config dokku.remote 2>/dev/null || echo "dokku"
+}
+
main() {
declare CMD="$1" APP_ARG="$2"
- local APP="" DOKKU_GIT_REMOTE="dokku" DOKKU_REMOTE_HOST=""
+
+ local APP="" DOKKU_GIT_REMOTE="$(fn-get-remote)" DOKKU_REMOTE_HOST=""
local cmd_set=false next_index=1 skip=false args=("$@")
for arg in "$@"; do
@@ -80,6 +115,10 @@ main() {
APP=${args[$next_index]}
skip=true
shift 2
+ elif [[ "$arg" == "--app-path" ]]; then
+ DOKKU_APP_PATH=${args[$next_index]}
+ skip=true
+ shift 2
elif [[ "$arg" == "--remote" ]]; then
DOKKU_GIT_REMOTE=${args[$next_index]}
skip=true
@@ -99,22 +138,41 @@ main() {
next_index=$((next_index + 1))
done
+ if [[ -n "$DOKKU_APP_PATH" ]]; then
+ pushd "$DOKKU_APP_PATH" &>/dev/null || exit 1
+ trap 'popd &>/dev/null || true' RETURN INT TERM
+ fi
+
DOKKU_REMOTE_HOST="$(fn-dokku-host "$DOKKU_GIT_REMOTE" "$DOKKU_HOST")"
- if [[ -z "$DOKKU_REMOTE_HOST" ]]; then
+ if [[ -z "$DOKKU_REMOTE_HOST" ]] && [[ "$CMD" != remote ]] && [[ "$CMD" != remote:* ]]; then
fn-client-help-msg
fi
if [[ -z "$APP" ]]; then
- if [[ -d .git ]] || git rev-parse --git-dir >/dev/null 2>&1; then
+ if [[ -d .git ]] || git rev-parse --git-dir &>/dev/null; then
set +e
- APP=$(git remote -v 2>/dev/null | grep -Ei "^${DOKKU_GIT_REMOTE}\s" | grep -Ei "dokku@$DOKKU_REMOTE_HOST" | head -n 1 | cut -f2 -d'@' | cut -f1 -d' ' | cut -f2 -d':' 2>/dev/null)
+ APP="$(fn-dokku-app "$DOKKU_GIT_REMOTE" "$DOKKU_REMOTE_HOST")"
set -e
else
echo " ! This is not a git repository" 1>&2
fi
fi
+ if [[ -z "$DOKKU_PORT" ]]; then
+ DOKKU_PORT="$(fn-dokku-port "$DOKKU_GIT_REMOTE" "$DOKKU_REMOTE_HOST")"
+ fi
+
case "$CMD" in
+ remote:show)
+ echo "dokku-app: $APP"
+ echo "dokku-git-remote: $DOKKU_GIT_REMOTE"
+ echo "dokku-host: $DOKKU_HOST"
+ echo "dokku-port: $DOKKU_PORT"
+ echo "dokku-remote-host: $DOKKU_REMOTE_HOST"
+ echo "dokku-ssh-user: dokku"
+ echo "dokku-constructed-remote: ssh://dokku@$DOKKU_REMOTE_HOST:$DOKKU_PORT/$APP"
+ exit 0
+ ;;
apps:create)
if [[ -z "$APP" ]] && [[ -z "$APP_ARG" ]]; then
APP=$(fn-random-name)
@@ -125,7 +183,7 @@ main() {
ssh -p "$DOKKU_PORT" "dokku@$DOKKU_REMOTE_HOST" apps
exit 1
else
- APP=$(random_name)
+ APP=$(fn-random-name)
counter=$((counter + 1))
fi
done
@@ -143,16 +201,60 @@ main() {
apps:destroy)
fn-is-git-repo && fn-has-dokku-remote && git remote remove "$DOKKU_GIT_REMOTE"
;;
+ remote)
+ echo "$DOKKU_GIT_REMOTE"
+ exit 0
+ ;;
+ remote:add)
+ shift 1
+ git remote add "$@"
+ exit "$?"
+ ;;
+ remote:list)
+ git remote
+ exit "$?"
+ ;;
+ remote:set)
+ shift 1
+ git config dokku.remote "$@"
+ exit "$?"
+ ;;
+ remote:remove)
+ shift 1
+ git remote remove "$@"
+ local exit_code="$?"
+ if [[ "$(git config dokku.remote)" == "$1" ]]; then
+ git config --unset dokku.remote
+ fi
+ exit "$exit_code"
+ ;;
+ remote:unset)
+ if [[ -n "$(git config dokku.remote)" ]]; then
+ git config --unset dokku.remote
+ exit "$?"
+ fi
+ exit 0
+ ;;
esac
[[ " apps certs help ls nginx shell storage trace version " == *" $CMD "* ]] && unset APP
- [[ " certs:chain domains:add-global domains:remove-global domains:set-global ps:restore " == *" $CMD "* ]] && unset APP
+ [[ " certs:chain domains:add-global domains:clear-global domains:remove-global domains:set-global ps:restore " == *" $CMD "* ]] && unset APP
+ [[ " storage:ensure-directory " == *" $CMD "* ]] && unset APP
+ [[ " network:create network:destroy network:exists network:info network:list network:rebuildall " == *" $CMD "* ]] && unset APP
+ [[ " logs:vector-logs logs:vector-start logs:vector-stop " == *" $CMD "* ]] && unset APP
+ [[ " scheduler-k3s:cluster:add scheduler-k3s:cluster:list scheduler-k3s:cluster:remove " == *" $CMD "* ]] && unset APP
+ [[ " scheduler-k3s:ensure-charts scheduler-k3s:initialize scheduler-k3s:show-kubeconfig scheduler-k3s:uninstall " == *" $CMD "* ]] && unset APP
+ [[ " scheduler-k3s:profiles:add scheduler-k3s:profiles:list scheduler-k3s:profiles:remove " == *" $CMD "* ]] && unset APP
[[ "$CMD" =~ events*|plugin*|ssh-keys* ]] && unset APP
[[ -n "$APP_ARG" ]] && [[ "$APP_ARG" == "--global" ]] && unset APP
- [[ -n "$@" ]] && [[ -n "$APP" ]] && app_arg="--app $APP"
+ if [[ -n "$@" ]] && [[ -n "$APP" ]]; then
+ set -- "$APP" "$@"
+ set -- "--app" "$@"
+ fi
# echo "ssh -o LogLevel=QUIET -p $DOKKU_PORT -t dokku@$DOKKU_REMOTE_HOST -- $app_arg $@"
- # shellcheck disable=SC2068,SC2086
- ssh -o LogLevel=QUIET -p $DOKKU_PORT -t dokku@$DOKKU_REMOTE_HOST -- $app_arg $@ || {
+ local ssh_args=("-o" "LogLevel=QUIET" "-p" "$DOKKU_PORT" "-t" "dokku@$DOKKU_REMOTE_HOST" "--")
+ ssh_args+=("$@")
+ ssh "${ssh_args[@]}" || {
ssh_exit_code="$?"
echo " ! Failed to execute dokku command over ssh: exit code $?" 1>&2
echo " ! If there was no output from Dokku, ensure your configured SSH Key can connect to the remote server" 1>&2
diff --git a/contrib/images/digitalocean/files/etc/nginx/sites-available/digitalocean b/contrib/images/digitalocean/files/etc/nginx/sites-available/digitalocean
new file mode 100644
index 00000000000..9e9b34ce931
--- /dev/null
+++ b/contrib/images/digitalocean/files/etc/nginx/sites-available/digitalocean
@@ -0,0 +1,95 @@
+# You may add here your
+# server {
+# ...
+# }
+# statements for each of your virtual hosts to this file
+
+##
+# You should look at the following URL's in order to grasp a solid understanding
+# of Nginx configuration files in order to fully unleash the power of Nginx.
+# http://wiki.nginx.org/Pitfalls
+# http://wiki.nginx.org/QuickStart
+# http://wiki.nginx.org/Configuration
+#
+# Generally, you will want to move this file somewhere, and start with a clean
+# file but keep this around for reference. Or just disable in sites-enabled.
+#
+# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
+##
+
+server {
+ listen 80 default_server;
+ listen [::]:80 default_server ipv6only=on;
+
+ root /var/www/html;
+ index index.php index.html index.htm;
+
+ # Make site accessible from http://localhost/
+ server_name localhost;
+
+ location / {
+ # First attempt to serve request as file, then
+ # as directory, then fall back to displaying a 404.
+ try_files $uri $uri/ =404;
+ # Uncomment to enable naxsi on this location
+ # include /etc/nginx/naxsi.rules
+ }
+
+ error_page 404 /404.html;
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+
+ location ~ \.php$ {
+ include snippets/fastcgi-php.conf;
+ fastcgi_pass unix:/run/php/php7.4-fpm.sock;
+ }
+
+ # deny access to .htaccess files, if Apache's document root
+ # concurs with nginx's one
+ #
+ #location ~ /\.ht {
+ # deny all;
+ #}
+}
+
+
+# another virtual host using mix of IP-, name-, and port-based configuration
+#
+#server {
+# listen 8000;
+# listen somename:8080;
+# server_name somename alias another.alias;
+# root html;
+# index index.html index.htm;
+#
+# location / {
+# try_files $uri $uri/ =404;
+# }
+#}
+
+
+# HTTPS server
+#
+#server {
+# listen 443;
+# server_name localhost;
+#
+# root html;
+# index index.html index.htm;
+#
+# ssl on;
+# ssl_certificate cert.pem;
+# ssl_certificate_key cert.key;
+#
+# ssl_session_timeout 5m;
+#
+# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
+# ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
+# ssl_prefer_server_ciphers on;
+#
+# location / {
+# try_files $uri $uri/ =404;
+# }
+#}
diff --git a/contrib/images/digitalocean/files/etc/update-motd.d/99-one-click b/contrib/images/digitalocean/files/etc/update-motd.d/99-one-click
new file mode 100755
index 00000000000..c4c8f37ddd6
--- /dev/null
+++ b/contrib/images/digitalocean/files/etc/update-motd.d/99-one-click
@@ -0,0 +1,21 @@
+#!/bin/sh
+#
+# Configured as part of the DigitalOcean 1-Click Image build process
+
+myip=$(hostname -I | awk '{print$1}')
+cat < >(tee /var/log/one_click_setup.log) 2>&1
+
+ufw --force enable
+printf "dokku dokku/hostname string %s" hostname | debconf-set-selections
+
+export DEBIAN_FRONTEND=noninteractive
+export LANG=C
+export LC_ALL=C
+
+# Install Dokku....
+for count in {1..30}; do
+ dpkg -i /var/lib/digitalocean/debs/*deb || /bin/true
+ apt-get -f install || /bin/true
+
+ version=$(dpkg-query --showformat='${Version}' -W dokku)
+ if [[ -n "$version" ]]; then
+ ran=0
+ exit 0
+ else
+ count=$((count + 1))
+ fi
+ sleep 5
+done
diff --git a/contrib/images/digitalocean/files/var/lib/cloud/scripts/per-once/002_enable_ssh b/contrib/images/digitalocean/files/var/lib/cloud/scripts/per-once/002_enable_ssh
new file mode 100755
index 00000000000..48bd764a51c
--- /dev/null
+++ b/contrib/images/digitalocean/files/var/lib/cloud/scripts/per-once/002_enable_ssh
@@ -0,0 +1,9 @@
+#!/bin/bash
+exec > >(tee /var/log/one_click_setup.log) 2>&1
+
+# Remove the force command
+sed -e '/Match user root/d' \
+ -e '/.*ForceCommand.*droplet.*/d' \
+ -i /etc/ssh/sshd_config
+
+systemctl restart ssh
diff --git a/contrib/images/digitalocean/files/var/www/html/index.html b/contrib/images/digitalocean/files/var/www/html/index.html
new file mode 100644
index 00000000000..989a2af6a96
--- /dev/null
+++ b/contrib/images/digitalocean/files/var/www/html/index.html
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/contrib/images/digitalocean/in_parts/011-docker b/contrib/images/digitalocean/in_parts/011-docker
new file mode 100755
index 00000000000..ef8da1f0a59
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/011-docker
@@ -0,0 +1,45 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+export DEBIAN_FRONTEND=noninteractive
+
+pkgs=(ca-certificates
+ curl
+ jq
+ linux-image-extra-virtual
+)
+
+echo '--> Updating apt repositories'
+apt-get -qqy update
+
+echo '--> Updating all packages'
+apt-get -qqy -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' full-upgrade
+
+echo "--> Installing basic dependencies: ${pkgs[*]}"
+apt-get -qqy install "${pkgs[@]}"
+
+echo '--> Setting up docker apt repository'
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
+
+cat >/etc/apt/sources.list.d/docker.list < Installing docker-ce'
+apt-get -y update
+apt-get -y install docker-ce docker-buildx-plugin docker-compose-plugin
+
+echo '--> Enabling docker-ce'
+systemctl enable docker
+systemctl start docker
+
+echo '--> Enabling docker live-restore'
+if [[ ! -f /etc/docker/daemon.json ]]; then
+ echo "{}" >/etc/docker/daemon.json
+fi
+
+config="$(jq '. + {"live-restore": true}' /etc/docker/daemon.json)"
+echo "$config" >/etc/docker/daemon.json
+systemctl reload docker
+docker info | grep -i live
diff --git a/contrib/images/digitalocean/in_parts/011-ssh-message b/contrib/images/digitalocean/in_parts/011-ssh-message
new file mode 100755
index 00000000000..83db94286d7
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/011-ssh-message
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+echo '--> Prevent login until after setup is complete'
+# Be a bit of a dork about login in
+cat >>/etc/ssh/sshd_config < Install core dependencies for dokku'
+apt-get -y install "${pkgs[@]}"
+
+echo '--> Setting up dokku apt repository'
+curl -fsSL https://packagecloud.io/dokku/dokku/gpgkey -o /etc/apt/keyrings/dokku.asc
+
+cat >/etc/apt/sources.list.d/dokku.list < Install dependencies for dokku from new repository'
+apt-get -y clean
+apt-get -y update
+apt-get -y install "${dokku_pkgs[@]}"
+rm -f /etc/nginx/sites-enabled/default
+
+echo '--> Pre-cache dokku bits that are must run on boot'
+apt-get -y clean
+apt-get -y install --download-only "dokku=${DOKKU_VERSION}" dokku-event-listener herokuish
+
+mkdir -p /var/lib/digitalocean/debs
+cp -au /var/cache/apt/archives/*deb /var/lib/digitalocean/debs
diff --git a/contrib/images/digitalocean/in_parts/012-grub-opts b/contrib/images/digitalocean/in_parts/012-grub-opts
new file mode 100755
index 00000000000..fbb043cb596
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/012-grub-opts
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+echo '--> Update grub boot loader'
+sed -e 's|GRUB_CMDLINE_LINUX="|GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1|g' \
+ -i /etc/default/grub
+
+update-grub
diff --git a/contrib/images/digitalocean/in_parts/014-docker-dns b/contrib/images/digitalocean/in_parts/014-docker-dns
new file mode 100755
index 00000000000..e3b509edc49
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/014-docker-dns
@@ -0,0 +1,7 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+echo '--> Enable Google DNS for Docker'
+sed -e 's|#DOCKER_OPTS|DOCKER_OPTS|g' \
+ -i /etc/default/docker
diff --git a/contrib/images/digitalocean/in_parts/014-ufw-rules b/contrib/images/digitalocean/in_parts/014-ufw-rules
new file mode 100755
index 00000000000..957728b28eb
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/014-ufw-rules
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+echo '--> Enable and configure UFW'
+sed -e 's|DEFAULT_FORWARD_POLICY=.*|DEFAULT_FORWARD_POLICY="ACCEPT"|g' \
+ -i /etc/default/ufw
+
+ufw limit ssh
+ufw allow 'Nginx Full'
+
+ufw --force enable
diff --git a/contrib/images/digitalocean/in_parts/099-application_tag b/contrib/images/digitalocean/in_parts/099-application_tag
new file mode 100755
index 00000000000..97a1f1617d0
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/099-application_tag
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -eo pipefail
+set -o errexit
+
+echo '--> Write the application info'
+application_version="$DOKKU_VERSION"
+build_date="$(date -I)"
+distro_arch="$(uname -m)"
+distro_codename="$(lsb_release -sc)"
+distro_release="$(lsb_release -sr)"
+distro="$(lsb_release -si)"
+
+cat >/var/lib/digitalocean/application.info < Cleaning up tmp dir'
+# Ensure /tmp exists and has the proper permissions before
+# checking for security updates
+# https://github.com/digitalocean/marketplace-partners/issues/94
+if [[ ! -d /tmp ]]; then
+ mkdir /tmp
+fi
+chmod 1777 /tmp
+rm -rf /tmp/* /var/tmp/*
+
+echo '--> Cleaning up apt'
+export DEBIAN_FRONTEND=noninteractive
+apt-get -y update
+apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes
+apt-get -y autoremove
+apt-get -y autoclean
+apt-get -y purge droplet-agent
+
+echo '--> Clearing history'
+history -c
+cat /dev/null >/root/.bash_history
+unset HISTFILE
+
+echo '--> Clearing log files'
+find /var/log -mtime -1 -type f -exec truncate -s 0 {} \;
+rm -rf /var/log/*.gz /var/log/*.[0-9] /var/log/*-????????
+cat /dev/null >/var/log/lastlog
+cat /dev/null >/var/log/wtmp
+rm -rf /var/lib/cloud/instances/*
+rm -rf /tmp/* /var/tmp/*
+
+echo '--> Removing keys'
+rm -f /root/.ssh/authorized_keys /etc/ssh/*key*
+touch /etc/ssh/revoked_keys
+chmod 600 /etc/ssh/revoked_keys
+
+echo '--> DO Directory contents'
+ls -lah /opt/digitalocean || true
+
+echo '--> Securely erase the unused portion of the filesystem'
+printf "\n\033[0;32mWriting zeros to the remaining disk space to securely
+erase the unused portion of the file system.
+Depending on your disk size this may take several minutes.
+The secure erase will complete successfully when you see:\033[0m
+ dd: writing to '/zerofile': No space left on device\n
+Beginning secure erase now\n"
+
+dd if=/dev/zero of=/zerofile bs=4096 || rm /zerofile
diff --git a/contrib/images/digitalocean/in_parts/100-image-check b/contrib/images/digitalocean/in_parts/100-image-check
new file mode 100755
index 00000000000..763020b6dc7
--- /dev/null
+++ b/contrib/images/digitalocean/in_parts/100-image-check
@@ -0,0 +1,631 @@
+#!/bin/bash
+
+# DigitalOcean Marketplace Image Validation Tool
+# Š 2021-2022 DigitalOcean LLC.
+# This code is licensed under Apache 2.0 license (see LICENSE.md for details)
+
+VERSION="v. 1.8.1"
+RUNDATE=$(date)
+
+# Script should be run with SUDO
+if [ "$EUID" -ne 0 ]; then
+ echo "[Error] - This script must be run with sudo or as the root user."
+ exit 1
+fi
+
+STATUS=0
+PASS=0
+WARN=0
+FAIL=0
+
+# $1 == command to check for
+# returns: 0 == true, 1 == false
+cmdExists() {
+ if command -v "$1" >/dev/null 2>&1; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+function getDistro {
+ if [ -f /etc/os-release ]; then
+ # freedesktop.org and systemd
+ . /etc/os-release
+ OS=$NAME
+ VER=$VERSION_ID
+ elif type lsb_release >/dev/null 2>&1; then
+ # linuxbase.org
+ OS=$(lsb_release -si)
+ VER=$(lsb_release -sr)
+ elif [ -f /etc/lsb-release ]; then
+ # For some versions of Debian/Ubuntu without lsb_release command
+ . /etc/lsb-release
+ OS=$DISTRIB_ID
+ VER=$DISTRIB_RELEASE
+ elif [ -f /etc/debian_version ]; then
+ # Older Debian/Ubuntu/etc.
+ OS=Debian
+ VER=$(cat /etc/debian_version)
+ elif [ -f /etc/SuSe-release ]; then
+ # Older SuSE/etc.
+ :
+ elif [ -f /etc/redhat-release ]; then
+ # Older Red Hat, CentOS, etc.
+ VER=$(cut -d" " -f3 ", also works for BSD, etc.
+ OS=$(uname -s)
+ VER=$(uname -r)
+ fi
+}
+function loadPasswords {
+ SHADOW=$(cat /etc/shadow)
+}
+
+function checkAgent {
+ # Check for the presence of the DO directory in the filesystem
+ if [ -d /opt/digitalocean ]; then
+ echo -en "\e[41m[FAIL]\e[0m DigitalOcean directory detected.\n"
+ ((FAIL++))
+ STATUS=2
+ if [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]]; then
+ echo "To uninstall the agent: 'sudo yum remove droplet-agent'"
+ echo "To remove the DO directory: 'find /opt/digitalocean/ -type d -empty -delete'"
+ elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
+ echo "To uninstall the agent and remove the DO directory: 'sudo apt-get purge droplet-agent'"
+ fi
+ else
+ echo -en "\e[32m[PASS]\e[0m DigitalOcean Monitoring agent was not found\n"
+ ((PASS++))
+ fi
+}
+
+function checkLogs {
+ cp_ignore="/var/log/cpanel-install.log"
+ echo -en "\nChecking for log files in /var/log\n\n"
+ # Check if there are log archives or log files that have not been recently cleared.
+ for f in /var/log/*-????????; do
+ [[ -e $f ]] || break
+ if [ "${f}" != "${cp_ignore}" ]; then
+ echo -en "\e[93m[WARN]\e[0m Log archive ${f} found; Contents:\n"
+ cat "${f}"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ done
+ for f in /var/log/*.[0-9]; do
+ [[ -e $f ]] || break
+ echo -en "\e[93m[WARN]\e[0m Log archive ${f} found; Contents:\n"
+ cat "${f}"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ done
+ for f in /var/log/*.log; do
+ [[ -e $f ]] || break
+ if [[ "${f}" = '/var/log/lfd.log' && "$(grep -E -v '/var/log/messages has been reset| Watching /var/log/messages' "${f}" | wc -c)" -gt 50 ]]; then
+ if [ "${f}" != "${cp_ignore}" ]; then
+ echo -en "\e[93m[WARN]\e[0m un-cleared log file, ${f} found; Contents:\n"
+ cat "${f}"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ elif [[ "${f}" != '/var/log/lfd.log' && "$(wc -c <"${f}")" -gt 50 ]]; then
+ if [ "${f}" != "${cp_ignore}" ]; then
+ echo -en "\e[93m[WARN]\e[0m un-cleared log file, ${f} found; Contents:\n"
+ cat "${f}"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ fi
+ done
+}
+function checkTMP {
+ # Check the /tmp directory to ensure it is empty. Warn on any files found.
+ if [[ -n "$(ls -A /tmp)" ]]; then
+ echo -en "\e[93m[WARN]\e[0m /tmp directory is not empty; Contents\n"
+ ls -A /tmp
+ ((WARN++))
+ return 1
+ fi
+
+ echo -en "\e[32m[PASS]\e[0m /tmp directory is empty\n"
+ return 0
+}
+function checkRoot {
+ user="root"
+ uhome="/root"
+ for usr in $SHADOW; do
+ IFS=':' read -r -a u <<<"$usr"
+ if [[ "${u[0]}" == "${user}" ]]; then
+ if [[ ${u[1]} == "!" ]] || [[ ${u[1]} == "!!" ]] || [[ ${u[1]} == "*" ]]; then
+ echo -en "\e[32m[PASS]\e[0m User ${user} has no password set.\n"
+ ((PASS++))
+ else
+ echo -en "\e[41m[FAIL]\e[0m User ${user} has a password set on their account.\n"
+ ((FAIL++))
+ STATUS=2
+ fi
+ fi
+ done
+ if [ -d ${uhome}/ ]; then
+ if [ -d ${uhome}/.ssh/ ]; then
+ if ls ${uhome}/.ssh/* >/dev/null 2>&1; then
+ for key in "${uhome}"/.ssh/*; do
+ if [ "${key}" == "${uhome}/.ssh/authorized_keys" ]; then
+
+ if [ "$(wc -c <"${key}")" -gt 50 ]; then
+ echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a populated authorized_keys file in \e[93m${key}\e[0m\n"
+ akey=$(cat "${key}")
+ echo "File Contents:"
+ echo "$akey"
+ echo "--------------"
+ ((FAIL++))
+ STATUS=2
+ fi
+ elif [ "${key}" == "${uhome}/.ssh/id_rsa" ]; then
+ if [ "$(wc -c <"${key}")" -gt 0 ]; then
+ echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a private key file in \e[93m${key}\e[0m\n"
+ akey=$(cat "${key}")
+ echo "File Contents:"
+ echo "$akey"
+ echo "--------------"
+ ((FAIL++))
+ STATUS=2
+ else
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has empty private key file in \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ elif [ "${key}" != "${uhome}/.ssh/known_hosts" ]; then
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a file in their .ssh directory at \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ else
+ if [ "$(wc -c <"${key}")" -gt 50 ]; then
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a populated known_hosts file in \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ fi
+ done
+ else
+ echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m has no SSH keys present\n"
+ fi
+ else
+ echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have an .ssh directory\n"
+ fi
+ if [ -f /root/.bash_history ]; then
+
+ BH_S=$(wc -c = 1000 && $1 != "nobody" {print $1}' /dev/null 2>&1; then
+ for key in "${uhome}"/.ssh/*; do
+ if [ "${key}" == "${uhome}/.ssh/authorized_keys" ]; then
+ if [ "$(wc -c <"${key}")" -gt 50 ]; then
+ echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a populated authorized_keys file in \e[93m${key}\e[0m\n"
+ akey=$(cat "${key}")
+ echo "File Contents:"
+ echo "$akey"
+ echo "--------------"
+ ((FAIL++))
+ STATUS=2
+ fi
+ elif [ "${key}" == "${uhome}/.ssh/id_rsa" ]; then
+ if [ "$(wc -c <"${key}")" -gt 0 ]; then
+ echo -en "\e[41m[FAIL]\e[0m User \e[1m${user}\e[0m has a private key file in \e[93m${key}\e[0m\n"
+ akey=$(cat "${key}")
+ echo "File Contents:"
+ echo "$akey"
+ echo "--------------"
+ ((FAIL++))
+ STATUS=2
+ else
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has empty private key file in \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ elif [ "${key}" != "${uhome}/.ssh/known_hosts" ]; then
+
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a file in their .ssh directory named \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+
+ else
+ if [ "$(wc -c <"${key}")" -gt 50 ]; then
+ echo -en "\e[93m[WARN]\e[0m User \e[1m${user}\e[0m has a known_hosts file in \e[93m${key}\e[0m\n"
+ ((WARN++))
+ if [[ $STATUS != 2 ]]; then
+ STATUS=1
+ fi
+ fi
+ fi
+
+ done
+ else
+ echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m has no SSH keys present\n"
+ fi
+ else
+ echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have an .ssh directory\n"
+ fi
+ else
+ echo -en "\e[32m[ OK ]\e[0m User \e[1m${user}\e[0m does not have a directory in /home\n"
+ fi
+
+ # Check for an uncleared .bash_history for this user
+ if [ -f "${uhome}/.bash_history" ]; then
+ BH_S=$(wc -c <"${uhome}/.bash_history")
+
+ if [[ $BH_S -lt 200 ]]; then
+ echo -en "\e[32m[PASS]\e[0m ${user}'s Bash History appears to have been cleared\n"
+ ((PASS++))
+ else
+ echo -en "\e[41m[FAIL]\e[0m ${user}'s Bash History should be cleared to prevent sensitive information from leaking\n"
+ ((FAIL++))
+ STATUS=2
+
+ fi
+ echo -en "\n\n"
+ fi
+ fi
+ done
+}
+function checkFirewall {
+
+ if [[ $OS == "Ubuntu" ]]; then
+ fw="ufw"
+ ufwa=$(ufw status | head -1 | sed -e "s/^Status:\ //")
+ if [[ $ufwa == "active" ]]; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]]; then
+ if [ -f /usr/lib/systemd/system/csf.service ]; then
+ fw="csf"
+ if systemctl status $fw >/dev/null 2>&1; then
+
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ elif cmdExists "firewall-cmd"; then
+ if [[ $(systemctl is-active firewalld >/dev/null 2>&1 && echo 1 || echo 0) ]]; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ else
+ fw="firewalld"
+ if [[ $(systemctl is-active firewalld >/dev/null 2>&1 && echo 1 || echo 0) ]]; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ fi
+ elif [[ "$OS" =~ Debian.* ]]; then
+ # user could be using a number of different services for managing their firewall
+ # we will check some of the most common
+ if cmdExists 'ufw'; then
+ fw="ufw"
+ ufwa=$(ufw status | head -1 | sed -e "s/^Status:\ //")
+ if [[ $ufwa == "active" ]]; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ elif cmdExists "firewall-cmd"; then
+ fw="firewalld"
+ if [[ $(systemctl is-active --quiet $fw) ]]; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ else
+ # user could be using vanilla iptables, check if kernel module is loaded
+ fw="iptables"
+ if lsmod | grep -q '^ip_tables' 2>/dev/null; then
+ FW_VER="\e[32m[PASS]\e[0m Firewall service (${fw}) is active\n"
+ ((PASS++))
+ else
+ FW_VER="\e[93m[WARN]\e[0m No firewall is configured. Ensure ${fw} is installed and configured\n"
+ ((WARN++))
+ fi
+ fi
+ fi
+
+}
+function checkUpdates {
+ if [[ $OS == "Ubuntu" ]] || [[ "$OS" =~ Debian.* ]]; then
+ # Ensure /tmp exists and has the proper permissions before
+ # checking for security updates
+ # https://github.com/digitalocean/marketplace-partners/issues/94
+ if [[ ! -d /tmp ]]; then
+ mkdir /tmp
+ fi
+ chmod 1777 /tmp
+
+ echo -en "\nUpdating apt package database to check for security updates, this may take a minute...\n\n"
+ apt-get -y update >/dev/null
+
+ uc=$(apt-get --just-print upgrade | grep -i "security" -c)
+ if [[ $uc -gt 0 ]]; then
+ update_count=$((uc / 2))
+ else
+ update_count=0
+ fi
+
+ if [[ $update_count -gt 0 ]]; then
+ echo -en "\e[41m[FAIL]\e[0m There are ${update_count} security updates available for this image that have not been installed.\n"
+ echo -en
+ echo -en "Here is a list of the security updates that are not installed:\n"
+ sleep 2
+ apt-get --just-print upgrade | grep -i security | awk '{print $2}' | awk '!seen[$0]++'
+ echo -en
+ ((FAIL++))
+ STATUS=2
+ else
+ echo -en "\e[32m[PASS]\e[0m There are no pending security updates for this image.\n\n"
+ ((PASS++))
+ fi
+ elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]]; then
+ echo -en "\nChecking for available security updates, this may take a minute...\n\n"
+
+ update_count=$(yum check-update --security --quiet | wc -l)
+ if [[ $update_count -gt 0 ]]; then
+ echo -en "\e[41m[FAIL]\e[0m There are ${update_count} security updates available for this image that have not been installed.\n"
+ ((FAIL++))
+ STATUS=2
+ else
+ echo -en "\e[32m[PASS]\e[0m There are no pending security updates for this image.\n"
+ ((PASS++))
+ fi
+ else
+ echo "Error encountered"
+ exit 1
+ fi
+
+ return 1
+}
+function checkCloudInit {
+
+ if hash cloud-init 2>/dev/null; then
+ CI="\e[32m[PASS]\e[0m Cloud-init is installed.\n"
+ ((PASS++))
+ else
+ CI="\e[41m[FAIL]\e[0m No valid verison of cloud-init was found.\n"
+ ((FAIL++))
+ STATUS=2
+ fi
+ return 1
+}
+
+clear
+echo "DigitalOcean Marketplace Image Validation Tool ${VERSION}"
+echo "Executed on: ${RUNDATE}"
+echo "Checking local system for Marketplace compatibility..."
+
+getDistro
+
+echo -en "\n\e[1mDistribution:\e[0m ${OS}\n"
+echo -en "\e[1mVersion:\e[0m ${VER}\n\n"
+
+ost=0
+osv=0
+
+if [[ $OS == "Ubuntu" ]]; then
+ ost=1
+ if [[ $VER == "24.04" ]] || [[ $VER == "22.10" ]] || [[ $VER == "22.04" ]] || [[ $VER == "20.04" ]] || [[ $VER == "18.04" ]] || [[ $VER == "16.04" ]]; then
+ osv=1
+ fi
+
+elif [[ "$OS" =~ Debian.* ]]; then
+ ost=1
+ case "$VER" in
+ 9)
+ osv=1
+ ;;
+ 10)
+ osv=1
+ ;;
+ 11)
+ osv=1
+ ;;
+ 12)
+ osv=1
+ ;;
+ *)
+ osv=2
+ ;;
+ esac
+
+elif [[ $OS == "CentOS Linux" ]]; then
+ ost=1
+ if [[ $VER == "8" ]]; then
+ osv=1
+ elif [[ $VER == "7" ]]; then
+ osv=1
+ elif [[ $VER == "6" ]]; then
+ osv=1
+ else
+ osv=2
+ fi
+elif [[ $OS == "CentOS Stream" ]]; then
+ ost=1
+ if [[ $VER == "8" ]]; then
+ osv=1
+ else
+ osv=2
+ fi
+elif [[ $OS == "Rocky Linux" ]]; then
+ ost=1
+ if [[ $VER =~ 8\. ]] || [[ $VER =~ 9\. ]]; then
+ osv=1
+ else
+ osv=2
+ fi
+elif [[ $OS == "AlmaLinux" ]]; then
+ ost=1
+ if [[ "$VERSION" =~ 8.* ]] || [[ "$VERSION" =~ 9.* ]]; then
+ osv=1
+ else
+ osv=2
+ fi
+else
+ ost=0
+fi
+
+if [[ $ost == 1 ]]; then
+ echo -en "\e[32m[PASS]\e[0m Supported Operating System Detected: ${OS}\n"
+ ((PASS++))
+else
+ echo -en "\e[41m[FAIL]\e[0m ${OS} is not a supported Operating System\n"
+ ((FAIL++))
+ STATUS=2
+fi
+
+if [[ $osv == 1 ]]; then
+ echo -en "\e[32m[PASS]\e[0m Supported Release Detected: ${VER}\n"
+ ((PASS++))
+elif [[ $ost == 1 ]]; then
+ echo -en "\e[41m[FAIL]\e[0m ${OS} ${VER} is not a supported Operating System Version\n"
+ ((FAIL++))
+ STATUS=2
+else
+ echo "Exiting..."
+ exit 1
+fi
+
+checkCloudInit
+
+echo -en "${CI}"
+
+checkFirewall
+
+echo -en "${FW_VER}"
+
+checkUpdates
+
+loadPasswords
+
+checkLogs
+
+echo -en "\n\nChecking all user-created accounts...\n"
+checkUsers
+
+echo -en "\n\nChecking the root account...\n"
+checkRoot
+
+echo -en "\n\nChecking the /tmp directory...\n"
+checkTMP
+
+checkAgent
+
+# Summary
+echo -en "\n\n---------------------------------------------------------------------------------------------------\n"
+
+if [[ $STATUS == 0 ]]; then
+ echo -en "Scan Complete.\n\e[32mAll Tests Passed!\e[0m\n"
+elif [[ $STATUS == 1 ]]; then
+ echo -en "Scan Complete. \n\e[93mSome non-critical tests failed. Please review these items.\e[0m\e[0m\n"
+else
+ echo -en "Scan Complete. \n\e[41mOne or more tests failed. Please review these items and re-test.\e[0m\n"
+fi
+echo "---------------------------------------------------------------------------------------------------"
+echo -en "\e[1m${PASS} Tests PASSED\e[0m\n"
+echo -en "\e[1m${WARN} WARNINGS\e[0m\n"
+echo -en "\e[1m${FAIL} Tests FAILED\e[0m\n"
+echo -en "---------------------------------------------------------------------------------------------------\n"
+
+if [[ $STATUS == 0 ]]; then
+ echo -en "We did not detect any issues with this image. Please be sure to manually ensure that all software installed on the base system is functional, secure and properly configured (or facilities for configuration on first-boot have been created).\n\n"
+ exit 0
+elif [[ $STATUS == 1 ]]; then
+ echo -en "Please review all [WARN] items above and ensure they are intended or resolved. If you do not have a specific requirement, we recommend resolving these items before image submission\n\n"
+ exit 0
+else
+ echo -en "Some critical tests failed. These items must be resolved and this scan re-run before you submit your image to the DigitalOcean Marketplace.\n\n"
+ exit 1
+fi
diff --git a/contrib/images/digitalocean/packer.pkr.hcl b/contrib/images/digitalocean/packer.pkr.hcl
new file mode 100644
index 00000000000..40076b1f613
--- /dev/null
+++ b/contrib/images/digitalocean/packer.pkr.hcl
@@ -0,0 +1,71 @@
+packer {
+ required_plugins {
+ digitalocean = {
+ version = ">= 1.0.4"
+ source = "github.com/digitalocean/digitalocean"
+ }
+ }
+}
+
+variable "dokku_version" {
+ type = string
+}
+
+source "digitalocean" "ubuntu" {
+ image = "ubuntu-24-04-x64"
+ region = "nyc1"
+ size = "s-1vcpu-512mb-10gb"
+ ssh_username = "root"
+ snapshot_name = "dokku-${var.dokku_version}-snapshot-{{timestamp}}"
+}
+
+build {
+ name = "dokku"
+ sources = [
+ "source.digitalocean.ubuntu"
+ ]
+
+ provisioner "shell" {
+ inline = [
+ "echo '--> Waiting until cloud-init is complete'",
+ "/usr/bin/cloud-init status --wait",
+ ]
+ valid_exit_codes = [0, 2]
+ }
+
+ provisioner "file" {
+ source = "${path.root}/files/etc/"
+ destination = "/etc/"
+ }
+
+ provisioner "file" {
+ source = "${path.root}/files/var/"
+ destination = "/var/"
+ }
+
+ provisioner "shell" {
+ environment_vars = [
+ "DOKKU_VERSION=${var.dokku_version}",
+ "DEBIAN_FRONTEND=noninteractive",
+ "LC_ALL=C",
+ "LANG=en_US.UTF-8",
+ "LC_CTYPE=en_US.UTF-8",
+ ]
+
+ scripts = [
+ "${path.root}/in_parts/011-docker",
+ "${path.root}/in_parts/011-ssh-message",
+ "${path.root}/in_parts/012-dokku-packages",
+ "${path.root}/in_parts/012-grub-opts",
+ "${path.root}/in_parts/014-docker-dns",
+ "${path.root}/in_parts/014-ufw-rules",
+ "${path.root}/in_parts/099-application_tag",
+ "${path.root}/in_parts/099-cleanup",
+ "${path.root}/in_parts/100-image-check",
+ ]
+ }
+
+ post-processor "manifest" {
+ output = "digitalocean-manifest.json"
+ }
+}
diff --git a/contrib/packer.json b/contrib/packer.json
deleted file mode 100644
index 96a60e5b2f4..00000000000
--- a/contrib/packer.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "builders": [
- {
- "type": "digitalocean",
- "region": "nyc3",
- "image": "ubuntu-14-04-x64"
- }
- ],
- "provisioners": [
- {
- "type": "file",
- "source": "deb.mk",
- "destination": "/tmp/Makefile"
- },
- {
- "type": "shell",
- "inline": [
- "echo '--> Waiting 30 seconds for core services to be available'",
- "sleep 30",
-
- "echo '--> Updating apt repositories'",
- "sudo apt-get update -qq >/dev/null",
-
- "echo '--> Installing make requirement'",
- "sudo apt-get -qq -y --no-install-recommends install build-essential",
-
- "cd /tmp && make install-from-deb",
- "rm /root/.ssh/authorized_keys"
- ]
- }
- ]
-}
diff --git a/contrib/release-dokku b/contrib/release-dokku
index faa929f249a..3f69153e729 100755
--- a/contrib/release-dokku
+++ b/contrib/release-dokku
@@ -9,19 +9,16 @@ readonly DOKKU_GIT_REV="$(git rev-parse HEAD)"
trap "rm -rf '$TMP_WORK_DIR' >/dev/null" RETURN INT TERM EXIT
log-info() {
- # shellcheck disable=SC2034
declare desc="Log info formatter"
echo "$*"
}
log-error() {
- # shellcheck disable=SC2034
declare desc="Log error formatter"
echo "! $*" 1>&2
}
log-fail() {
- # shellcheck disable=SC2034
declare desc="Log fail formatter"
log-error "$*"
exit 1
@@ -134,11 +131,10 @@ fn-publish-package() {
local OS_ID ex
[[ "$IS_RELEASE" == "true" ]] && REPOSITORY=dokku/dokku
- [[ "$RELEASE_TYPE" == "rpm" ]] && DIST=el/7
[[ "$RELEASE_TYPE" == "raspbian" ]] && DIST=raspbian
if [[ "$RELEASE_TYPE" == "raspbian" ]]; then
- OS_IDS=("buster")
+ OS_IDS=("bullseye" "bookworm" "trixie")
for OS_ID in "${OS_IDS[@]}"; do
log-info "(release-dokku) pushing deb to packagecloud.com/${REPOSITORY}/${DIST}"
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
@@ -148,7 +144,7 @@ fn-publish-package() {
fi
done
elif [[ "$DIST" == "ubuntu" ]]; then
- OS_IDS=("bionic" "focal")
+ OS_IDS=("jammy" "noble")
for OS_ID in "${OS_IDS[@]}"; do
log-info "(release-dokku) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
@@ -159,7 +155,7 @@ fn-publish-package() {
done
DIST=debian
- OS_IDS=("stretch" "buster" "bullseye")
+ OS_IDS=("bullseye" "bookworm" "trixie")
for OS_ID in "${OS_IDS[@]}"; do
log-info "(release-dokku) pushing ${RELEASE_TYPE} to packagecloud.com/${REPOSITORY}/${DIST}"
package_cloud push "${REPOSITORY}/${DIST}/${OS_ID}" "$PACKAGE_NAME"
@@ -187,8 +183,12 @@ fn-replace-version() {
fn-repo-merged-requests() {
declare desc="Retrieves all pull request ids since a given release of dokku"
- declare TAG="$1"
- git log "v${TAG}..HEAD" --oneline | grep "Merge pull request" | cut -d' ' -f 5 | cut -d '#' -f2
+ declare CURRENT_VERSION="$1" NEXT_VERSION="$2" IS_PATCH="$3"
+ if [[ "$IS_PATCH" == "true" ]]; then
+ git log "v${CURRENT_VERSION}..HEAD" --oneline | grep "Merge pull request" | cut -d' ' -f 5 | cut -d '#' -f2
+ else
+ curl -u "$RELEASE_GITHUB_USERNAME:$RELEASE_GITHUB_API_TOKEN" --fail -sS "https://api.github.com/search/issues?q=repo:dokku/dokku+milestone:v${NEXT_VERSION}+is:pr&per_page=100" | jq '.items[].number'
+ fi
}
fn-repo-push-tags() {
@@ -205,7 +205,7 @@ fn-repo-push-tags() {
fn-repo-update() {
declare desc="Updates files within the repository for a given release"
- declare IS_RELEASE="$1" CURRENT_VERSION="$2" NEXT_VERSION="$3"
+ declare IS_RELEASE="$1" CURRENT_VERSION="$2" NEXT_VERSION="$3" IS_PATCH="$4"
log-info "(release-dokku) Replacing ${CURRENT_VERSION} with ${NEXT_VERSION}"
for f in plugins/*/plugin.toml; do
@@ -224,15 +224,15 @@ fn-repo-update() {
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/style.css
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/development/release-process.md
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/getting-started/install/docker.md
- fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/getting-started/installation.md
- fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/home.html
+ fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/getting-started/installation/index.md
+ fn-replace-version "v$CURRENT_VERSION" "v$NEXT_VERSION" docs/home.html
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/template.html
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" README.md
if [[ "$RELEASE" == 'patch' ]]; then
fn-replace-version "$CURRENT_VERSION" "$NEXT_VERSION" docs/assets/versions.json
else
- versions=$(python -c 'import json,sys;d=json.load(sys.stdin);d["max-versions"].append("'"${NEXT_VERSION}"'"); print(json.dumps(d, indent=2, sort_keys=True))' docs/assets/versions.json
git add docs/assets/versions.json
fi
@@ -242,24 +242,34 @@ fn-repo-update() {
fi
log-info "(release-dokku) Adding HISTORY.md, committing and tagging"
- fn-repo-update-history-and-commit "$CURRENT_VERSION" "$NEXT_VERSION"
+ fn-repo-update-history-and-commit "$CURRENT_VERSION" "$NEXT_VERSION" "$IS_PATCH"
git tag "v${NEXT_VERSION}"
}
fn-repo-update-history-and-commit() {
declare desc="Updates the history file and commits the changes"
- declare CURRENT_VERSION="$1" NEXT_VERSION="$2"
+ declare CURRENT_VERSION="$1" NEXT_VERSION="$2" IS_PATCH="$3"
local PULL_REQUEST_ID TITLE AUTHOR TYPE CHANGELOG_TEXT
- local COMMIT_MESSAGE HISTORY HISTORY_CONTENTS HISTORY_DOCUMENTATION HISTORY_ENHANCEMENT HISTORY_BC_BREAK HISTORY_REFACTOR HISTORY_BUG HISTORY_OTHER HISTORY_TESTS ISSUE_FILE
+ local COMMIT_MESSAGE HISTORY HISTORY_CONTENTS HISTORY_BUG HISTORY_DEPENDENCY HISTORY_DEPRECATION HISTORY_DOCUMENTATION HISTORY_ENHANCEMENT HISTORY_BC_BREAK HISTORY_REFACTOR HISTORY_REMOVAL HISTORY_SECURITY HISTORY_OTHER HISTORY_TESTS ISSUE_FILE
pushd "$ROOT_DIR" >/dev/null
mkdir -p /tmp/github-data
- for PULL_REQUEST_ID in $(fn-repo-merged-requests "$CURRENT_VERSION"); do
+ for PULL_REQUEST_ID in $(fn-repo-merged-requests "$CURRENT_VERSION" "$NEXT_VERSION" "$IS_PATCH"); do
ISSUE_FILE="/tmp/github-data/${PULL_REQUEST_ID}.json"
if [[ ! -f "$ISSUE_FILE" ]]; then
- curl -sS "https://api.github.com/repos/dokku/dokku/issues/${PULL_REQUEST_ID}" >"$ISSUE_FILE"
+ while true; do
+ if OUTPUT=$(curl -u "$RELEASE_GITHUB_USERNAME:$RELEASE_GITHUB_API_TOKEN" --fail -sS "https://api.github.com/repos/dokku/dokku/issues/${PULL_REQUEST_ID}" 2>&1); then
+ echo "$OUTPUT" >"$ISSUE_FILE"
+ break
+ fi
+
+ log-error "Error while fetching info for pull/$PULL_REQUEST_ID, sleeping for 5 seconds"
+ log-error "$OUTPUT"
+ sleep 5
+ log-info " Retrying pull/$PULL_REQUEST_ID"
+ done
fi
TITLE="$(jq -r '.title' "$ISSUE_FILE")"
@@ -267,16 +277,26 @@ fn-repo-update-history-and-commit() {
TYPE="$(jq -r '.labels[] | select( .name | contains("type") ) | .name' "$ISSUE_FILE" | cut -d' ' -f2)"
CHANGELOG_TEXT="- #${PULL_REQUEST_ID}: @${AUTHOR} ${TITLE}"
- if [[ "$TYPE" == "bc-break" ]]; then
+ if [[ "$TYPE" == "release" ]]; then
+ continue
+ elif [[ "$TYPE" == "bc-break" ]]; then
HISTORY_BC_BREAK="${HISTORY_BC_BREAK}"$'\n'"$CHANGELOG_TEXT"
elif [[ "$TYPE" == "bug" ]]; then
HISTORY_BUG="${HISTORY_BUG}"$'\n'"$CHANGELOG_TEXT"
+ elif [[ "$TYPE" == "dependencies" ]]; then
+ HISTORY_DEPENDENCY="${HISTORY_DEPENDENCY}"$'\n'"$CHANGELOG_TEXT"
+ elif [[ "$TYPE" == "deprecation" ]]; then
+ HISTORY_DEPRECATION="${HISTORY_DEPRECATION}"$'\n'"$CHANGELOG_TEXT"
elif [[ "$TYPE" == "documentation" ]]; then
HISTORY_DOCUMENTATION="${HISTORY_DOCUMENTATION}"$'\n'"$CHANGELOG_TEXT"
elif [[ "$TYPE" == "enhancement" ]]; then
HISTORY_ENHANCEMENT="${HISTORY_ENHANCEMENT}"$'\n'"$CHANGELOG_TEXT"
elif [[ "$TYPE" == "refactor" ]]; then
HISTORY_REFACTOR="${HISTORY_REFACTOR}"$'\n'"$CHANGELOG_TEXT"
+ elif [[ "$TYPE" == "removal" ]]; then
+ HISTORY_REMOVAL="${HISTORY_REMOVAL}"$'\n'"$CHANGELOG_TEXT"
+ elif [[ "$TYPE" == "security" ]]; then
+ HISTORY_SECURITY="${HISTORY_SECURITY}"$'\n'"$CHANGELOG_TEXT"
elif [[ "$TYPE" == "tests" ]]; then
HISTORY_TESTS="${HISTORY_TESTS}"$'\n'"$CHANGELOG_TEXT"
else
@@ -288,7 +308,7 @@ fn-repo-update-history-and-commit() {
HISTORY="${HISTORY}"$'\n\n'"## ${NEXT_VERSION}"
HISTORY="${HISTORY}"$'\n\n'"Install/update via the bootstrap script:"
HISTORY="${HISTORY}"$'\n\n'"\`\`\`shell"
- HISTORY="${HISTORY}"$'\n'"wget https://raw.githubusercontent.com/dokku/dokku/v${NEXT_VERSION}/bootstrap.sh"
+ HISTORY="${HISTORY}"$'\n'"wget -NP . https://dokku.com/install/v${NEXT_VERSION}/bootstrap.sh"
HISTORY="${HISTORY}"$'\n'"sudo DOKKU_TAG=v${NEXT_VERSION} bash bootstrap.sh"
HISTORY="${HISTORY}"$'\n'"\`\`\`"
@@ -296,6 +316,11 @@ fn-repo-update-history-and-commit() {
HISTORY="${HISTORY}"$'\n\n'"See the [${NEXT_VERSION} migration guide](/docs/appendices/${NEXT_VERSION}-migration-guide.md) for more information on migrating to ${NEXT_VERSION}."
fi
+ if [[ "$HISTORY_SECURITY" ]]; then
+ HISTORY="${HISTORY}"$'\n\n'"### Security"
+ HISTORY="${HISTORY}"$'\n'"$HISTORY_SECURITY"
+ fi
+
if [[ "$HISTORY_BC_BREAK" ]]; then
HISTORY="${HISTORY}"$'\n\n'"### Backwards Compatibility Breaks"
HISTORY="${HISTORY}"$'\n'"$HISTORY_BC_BREAK"
@@ -311,6 +336,16 @@ fn-repo-update-history-and-commit() {
HISTORY="${HISTORY}"$'\n'"$HISTORY_ENHANCEMENT"
fi
+ if [[ "$HISTORY_REMOVAL" ]]; then
+ HISTORY="${HISTORY}"$'\n\n'"### Removals"
+ HISTORY="${HISTORY}"$'\n'"$HISTORY_REMOVAL"
+ fi
+
+ if [[ "$HISTORY_DEPRECATION" ]]; then
+ HISTORY="${HISTORY}"$'\n\n'"### Deprecations"
+ HISTORY="${HISTORY}"$'\n'"$HISTORY_DEPRECATION"
+ fi
+
if [[ "$HISTORY_REFACTOR" ]]; then
HISTORY="${HISTORY}"$'\n\n'"### Refactors"
HISTORY="${HISTORY}"$'\n'"$HISTORY_REFACTOR"
@@ -326,6 +361,11 @@ fn-repo-update-history-and-commit() {
HISTORY="${HISTORY}"$'\n'"$HISTORY_TESTS"
fi
+ if [[ "$HISTORY_DEPENDENCY" ]]; then
+ HISTORY="${HISTORY}"$'\n\n'"### Dependencies"
+ HISTORY="${HISTORY}"$'\n'"$HISTORY_DEPENDENCY"
+ fi
+
if [[ "$HISTORY_OTHER" ]]; then
HISTORY="${HISTORY}"$'\n\n'"### Other"
HISTORY="${HISTORY}"$'\n'"$HISTORY_OTHER"
@@ -350,13 +390,29 @@ fn-require-bin() {
fn-build-docker-image() {
declare desc="Builds the dokku docker image and tags it with the given version"
- declare VERSION="$1"
- docker build -t "dokku/dokku:$VERSION" .
+ declare VERSION="$1" IS_RELEASE="$2"
+
+ if [[ "$IS_RELEASE" == "true" ]]; then
+ docker buildx build \
+ --platform linux/arm64,linux/amd64 \
+ --progress plain \
+ --push \
+ --label "org.opencontainers.image.version=$VERSION" \
+ --tag "dokku/dokku:latest" \
+ --tag "dokku/dokku:$VERSION" .
+ elif [[ "$SKIP_IMAGE_BUILD" != "true" ]]; then
+ docker buildx build \
+ --platform linux/arm64,linux/amd64 \
+ --progress plain \
+ --label "org.opencontainers.image.version=$VERSION" \
+ --tag "dokku/dokku:latest" \
+ --tag "dokku/dokku:$(echo "$VERSION" | tr + -)" .
+ fi
}
main() {
declare RELEASE="$1"
- local CURRENT_VERSION NEXT_VERSION IS_RELEASE
+ local CURRENT_VERSION NEXT_VERSION IS_PATCH IS_RELEASE
local VALID_RELEASE_LEVELS=("major" "minor" "patch" "betafish" "build")
if [[ "$RELEASE" == '--trace' ]]; then
@@ -387,36 +443,35 @@ main() {
NEXT_VERSION="$(fn-version-next "$CURRENT_VERSION" "$RELEASE")"
IS_RELEASE="$(fn-is-release "$RELEASE")"
+ IS_PATCH="false"
+ if [[ "$RELEASE" == "patch" ]]; then
+ IS_PATCH="true"
+ fi
+
echo "v${NEXT_VERSION}" >build/next-version
- fn-repo-update "$IS_RELEASE" "$CURRENT_VERSION" "$NEXT_VERSION"
+ fn-repo-update "$IS_RELEASE" "$CURRENT_VERSION" "$NEXT_VERSION" "$IS_PATCH"
fn-build-dokku "$IS_RELEASE" "$NEXT_VERSION" || log-fail "Error building package"
- fn-extract-package "$IS_RELEASE" "dokku_${NEXT_VERSION}_armhf.deb" || log-fail "Error extracting deb package"
+ fn-extract-package "$IS_RELEASE" "dokku_${NEXT_VERSION}_arm64.deb" || log-fail "Error extracting deb package"
fn-extract-package "$IS_RELEASE" "dokku_${NEXT_VERSION}_amd64.deb" || log-fail "Error extracting deb package"
- fn-extract-package "$IS_RELEASE" "dokku-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error extracting rpm package"
- cp -f "build/dokku_${NEXT_VERSION}_amd64.deb" build/dokku.deb
+ mkdir -p build/package
+ cp -f "build/dokku_${NEXT_VERSION}_amd64.deb" build/package/dokku-amd64.deb
+ cp -f "build/dokku_${NEXT_VERSION}_arm64.deb" build/package/dokku-arm64.deb
if [[ "$RELEASE" != "build" ]]; then
- fn-publish-package "$IS_RELEASE" "raspbian" "build/dokku_${NEXT_VERSION}_armhf.deb" || log-fail "Error publishing deb package"
+ fn-publish-package "$IS_RELEASE" "deb" "build/dokku_${NEXT_VERSION}_arm64.deb" || log-fail "Error publishing deb package"
fn-publish-package "$IS_RELEASE" "deb" "build/dokku_${NEXT_VERSION}_amd64.deb" || log-fail "Error publishing deb package"
- fn-publish-package "$IS_RELEASE" "rpm" "build/dokku-${NEXT_VERSION}-1.x86_64.rpm" || log-fail "Error publishing rpm package"
- fn-build-docker-image "$NEXT_VERSION" || log-fail "Error building docker image"
+ fn-build-docker-image "$NEXT_VERSION" "$IS_RELEASE" || log-fail "Error building docker image"
- if [[ "$IS_RELEASE" == "true" ]]; then
- docker tag "dokku/dokku:$NEXT_VERSION" "dokku/dokku:latest"
- docker push "dokku/dokku:$NEXT_VERSION"
- docker push "dokku/dokku:latest"
- fi
fn-repo-push-tags "$IS_RELEASE"
+ else
+ fn-build-docker-image "$NEXT_VERSION" "$IS_RELEASE" || log-fail "Error building docker image"
fi
if [[ "$IS_RELEASE" != "true" ]]; then
git reset -q HEAD plugins/*/plugin.toml
git checkout -- plugins/*/plugin.toml
fi
-
- echo "build/dokku_${NEXT_VERSION}_amd64.deb" >build/deb-filename
- echo "build/dokku-${NEXT_VERSION}-1.x86_64.rpm" >build/rpm-filename
}
main "$@"
diff --git a/contrib/release-plugin b/contrib/release-plugin
index e0cbc55f20d..f034414b2c4 100755
--- a/contrib/release-plugin
+++ b/contrib/release-plugin
@@ -7,19 +7,16 @@ readonly TMP_WORK_DIR="$(mktemp -d "/tmp/dokku-plugin-release.XXXXXX")"
trap "rm -rf '$TMP_WORK_DIR' >/dev/null" RETURN INT TERM EXIT
log-info() {
- # shellcheck disable=SC2034
declare desc="Log info formatter"
echo "$*"
}
log-error() {
- # shellcheck disable=SC2034
declare desc="Log error formatter"
echo "! $*" 1>&2
}
log-fail() {
- # shellcheck disable=SC2034
declare desc="Log fail formatter"
log-error "$*"
exit 1
diff --git a/contrib/sort-mkdocs-versions b/contrib/sort-mkdocs-versions
new file mode 100644
index 00000000000..21ef2002058
--- /dev/null
+++ b/contrib/sort-mkdocs-versions
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+import json
+
+
+def main():
+ version_file = "tmp/docs-build/versions.json"
+ data = []
+ with open(version_file) as f:
+ data = json.load(f)
+
+ versions = []
+ for info in data:
+ if info["title"] == "latest":
+ continue
+ versions.append(info["title"].removeprefix("v"))
+
+ versions.sort(key=lambda x: list(map(int, x.split('.'))), reverse=True)
+ data = [
+ {
+ "aliases": ["latest"],
+ "title": "latest",
+ "version": "docs",
+ }
+ ]
+
+ for version in versions:
+ data.append({
+ "aliases": [],
+ "title": f"v{version}",
+ "version": f"docs~v{version}",
+ })
+
+ with open(version_file, "w") as f:
+ json.dump(data, f, indent=4)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/contrib/update-deb-dependencies b/contrib/update-deb-dependencies
new file mode 100755
index 00000000000..84be4ccf6ec
--- /dev/null
+++ b/contrib/update-deb-dependencies
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+import json
+import re
+
+
+def main():
+ """
+ updates the control file with the tested debian dependencies
+ """
+ deps = {}
+ with open("contrib/dependencies.json", encoding="utf-8") as handle:
+ deps = json.load(handle)
+
+ control_lines = []
+ with open("debian/control", encoding="utf-8") as handle:
+ control_lines = [line for line in handle.readlines()]
+
+ for key in ["dependencies", "predependencies", "recommendations"]:
+ for dependency in deps[key]:
+ name = dependency["name"]
+ version = dependency["version"]
+ pattern = re.compile(rf"(?= {version})", line)
+
+ with open("debian/control", mode="w", encoding="utf-8") as handle:
+ handle.writelines(control_lines)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/contrib/write-mkdocs b/contrib/write-mkdocs
new file mode 100644
index 00000000000..50fbf98c6f1
--- /dev/null
+++ b/contrib/write-mkdocs
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+import os
+import pathlib
+import shutil
+import sys
+
+import yaml
+from bs4 import BeautifulSoup
+
+
+def get_nav_from_selector(soup: BeautifulSoup, selector: str, docs_dir: str):
+ """
+ Generates navigation from template file
+ """
+ navigation = []
+ header_name = ""
+ for anchor in soup.select(selector):
+ classes = anchor.get("class", [])
+ if classes is None:
+ continue
+
+ if "disabled" in classes:
+ header_name = anchor.text
+ navigation.append({header_name: []})
+
+ href = anchor.get("href", "")
+ if href is None:
+ continue
+
+ href = str(href)
+ if href == "#":
+ continue
+
+ url = href.replace("{{NAME}}", "")
+ filename = url.replace("http://progrium.viewdocs.io/dokku/", "")
+ filename = filename.replace("http://dokku.viewdocs.io/dokku/", "")
+ filename = filename.strip("/") + ".md"
+ filename = filename.removeprefix("dokku/")
+
+ ignore_errors_for = [
+ "getting-started/installation.md",
+ "getting-started/upgrading.md",
+ ]
+ if not os.path.exists(docs_dir + "/" + filename):
+ if filename not in ignore_errors_for:
+ print("error fetching markdown file:", filename)
+ continue
+
+ for nav in navigation:
+ if header_name in nav:
+ if filename == "getting-started/installation.md":
+ child_dir = "getting-started/install/"
+ children = os.listdir(docs_dir + "/" + child_dir)
+ children = [child_dir + c for c in children]
+ children.sort()
+ children.insert(0, "getting-started/advanced-installation.md")
+ if os.path.exists(docs_dir + "/" + filename):
+ children.insert(0, filename)
+ else:
+ children.insert(0, "getting-started/installation/index.md")
+ nav[header_name].append(
+ {
+ "Getting Started with Dokku": children,
+ }
+ )
+ continue
+
+ if filename == "getting-started/upgrading.md":
+ child_dir = "appendices/"
+ children = os.listdir(docs_dir + "/" + child_dir)
+
+ children.sort(
+ key=lambda x: list(map(int, x.split("-")[0].split("."))) if "." in x else [-1, -1, -1],
+ reverse=True,
+ )
+ children = [child_dir + c for c in children]
+ if os.path.exists(docs_dir + "/" + filename):
+ children.insert(0, filename)
+ else:
+ children.insert(0, "getting-started/upgrading/index.md")
+ nav[header_name].append(
+ {
+ "Upgrading": children,
+ }
+ )
+ continue
+
+ nav[header_name].append(filename)
+ return navigation
+
+
+def generate_nav(src: str, dest: str) -> None:
+ """
+ Writes out navigation information to the mkdocs yaml file
+ """
+ navigation = []
+ repo_dir = pathlib.Path(__file__).parent.parent.resolve()
+ docs_dir = str(repo_dir) + "/docs"
+ with open(docs_dir + "/template.html", encoding="utf-8") as response:
+ soup = BeautifulSoup(response, "html.parser")
+ selectors = [
+ ".container .row .list-group a",
+ ".container-fluid .row .list-group a",
+ ]
+ for selector in selectors:
+ navigation = get_nav_from_selector(soup, selector, docs_dir)
+ if len(navigation) > 0:
+ break
+
+ if len(navigation) == 0:
+ print("No navigation found")
+ sys.exit(1)
+
+ with open(src, encoding="utf-8") as handler:
+ data = yaml.unsafe_load(handler)
+ data["nav"] = [
+ {"Docs": navigation},
+ {"Pro": "https://pro.dokku.com/docs/getting-started/"},
+ {"Blog": "https://dokku.com/blog/"},
+ {"Tutorials": "https://dokku.com/tutorials/"},
+ {
+ "Purchase Dokku Pro": "https://dokku.dpdcart.com/cart/add?product_id=217344&method_id=236878"
+ },
+ ]
+
+ with open(dest, mode="wt", encoding="utf-8") as handler:
+ yaml.dump(data, handler)
+
+
+def main():
+ """
+ Main command that performs doc manipulation
+ """
+ print("----> Copying mkdocs.yml")
+ print(" Generating navigation")
+ generate_nav("/usr/src/source/mkdocs.yml", "/usr/src/app/mkdocs.yml")
+
+ if os.path.exists("/usr/src/app/docs"):
+ print(" Removing old docs folder")
+ shutil.rmtree("/usr/src/app/docs")
+
+ print(" Performing copy")
+ shutil.copytree("/usr/src/source/docs", "/usr/src/app/docs")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/deb.mk b/deb.mk
index 049df7f7332..528c0177e39 100644
--- a/deb.mk
+++ b/deb.mk
@@ -11,16 +11,12 @@ endif
.PHONY: install-from-deb deb-all deb-dokku deb-setup
install-from-deb:
- @echo "--> Initial apt-get update"
- sudo apt-get update -qq >/dev/null
- sudo apt-get -qq -y --no-install-recommends install apt-transport-https
-
@echo "--> Installing docker"
wget -nv -O - https://get.docker.com/ | sh
@echo "--> Installing dokku"
- wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
- @echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ $(shell lsb_release -cs 2>/dev/null || echo "bionic") main" | sudo tee /etc/apt/sources.list.d/dokku.list
+ wget -qO- https://packagecloud.io/dokku/dokku/gpgkey | sudo tee /etc/apt/trusted.gpg.d/dokku.asc
+ @echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ $(shell lsb_release -cs 2>/dev/null || echo "noble") main" | sudo tee /etc/apt/sources.list.d/dokku.list
sudo apt-get update -qq >/dev/null
sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get -qq -y --no-install-recommends install dokku
@@ -31,7 +27,7 @@ deb-all: deb-setup deb-dokku
deb-setup:
@echo "-> Updating deb repository and installing build requirements"
@sudo apt-get update -qq >/dev/null
- @sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get -qq -y --no-install-recommends install gcc git build-essential wget ruby-dev ruby1.9.1 lintian >/dev/null 2>&1
+ @sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get -qq -y --no-install-recommends install gcc git build-essential wget ruby-dev lintian >/dev/null 2>&1
@command -v fpm >/dev/null || sudo gem install fpm --no-ri --no-rdoc
@ssh -o StrictHostKeyChecking=no git@github.com || true
@@ -43,10 +39,11 @@ ifneq (,$(findstring false,$(IS_RELEASE)))
sed -i.bak -e "s/^/`date +%s`:/" /tmp/build-dokku/var/lib/dokku/STABLE_VERSION && rm /tmp/build-dokku/var/lib/dokku/STABLE_VERSION.bak
endif
+ contrib/update-deb-dependencies
cp -r debian /tmp/build-dokku/DEBIAN
sed -i.bak "s/^Architecture: .*/Architecture: $(DOKKU_ARCHITECTURE)/g" /tmp/build-dokku/DEBIAN/control && rm /tmp/build-dokku/DEBIAN/control.bak
rm -f /tmp/build-dokku/DEBIAN/lintian-overrides
cp debian/lintian-overrides /tmp/build-dokku/usr/share/lintian/overrides/dokku
sed -i.bak "s/^Version: .*/Version: `cat /tmp/build-dokku/var/lib/dokku/STABLE_VERSION`/g" /tmp/build-dokku/DEBIAN/control && rm /tmp/build-dokku/DEBIAN/control.bak
dpkg-deb --build /tmp/build-dokku "$(BUILD_DIRECTORY)/dokku_`cat /tmp/build-dokku/var/lib/dokku/VERSION`_$(DOKKU_ARCHITECTURE).deb"
- lintian "$(BUILD_DIRECTORY)/dokku_`cat /tmp/build-dokku/var/lib/dokku/VERSION`_$(DOKKU_ARCHITECTURE).deb"
+ lintian "$(BUILD_DIRECTORY)/dokku_`cat /tmp/build-dokku/var/lib/dokku/VERSION`_$(DOKKU_ARCHITECTURE).deb" || true
diff --git a/debian/config b/debian/config
index e4bcc25be12..2a7b4576a22 100755
--- a/debian/config
+++ b/debian/config
@@ -3,7 +3,6 @@ set -eo pipefail
[[ $TRACE ]] && set -x
if [[ -e /usr/share/debconf/confmodule ]]; then
- # shellcheck disable=SC1091
. /usr/share/debconf/confmodule
fi
@@ -15,5 +14,6 @@ db_input "high" "dokku/hostname" || true
db_input "high" "dokku/vhost_enable" || true
if [ "$ACTION" != "reconfigure" ]; then
db_input "high" "dokku/key_file" || true
+ db_input "high" "dokku/install_default_site" || true
fi
db_go || true
diff --git a/debian/control b/debian/control
index 1433fe1cf2e..bb2350c5a92 100644
--- a/debian/control
+++ b/debian/control
@@ -1,11 +1,11 @@
Package: dokku
-Version: 0.26.8
+Version: 0.38.25
Section: web
Priority: optional
Architecture: amd64
-Depends: locales, git, cpio, curl, man-db, netcat, sshcommand (>= 0.12.0), docker-engine-cs (>= 17.05.0) | docker-engine (>= 17.05.0) | docker-io (>= 17.05.0) | docker.io (>= 17.05.0) | docker-ce (>= 17.05.0) | docker-ee (>= 17.05.0) | moby-engine, docker-image-labeler (>= 0.2.2), net-tools, netrc, software-properties-common, parallel, procfile-util (>= 0.11.0), python-software-properties | python3-software-properties, rsync, rsyslog, dos2unix, jq, unzip
-Recommends: herokuish (>= 0.3.4), bash-completion, dokku-update, dokku-event-listener
-Pre-Depends: gliderlabs-sigil, nginx (>= 1.8.0) | openresty, dnsutils, cgroupfs-mount | cgroup-lite, plugn (>= 0.3.0), sudo, python3, debconf
+Depends: apache2-utils, locales, git, cpio, cron | cron-daemon, curl, logrotate, man-db, netcat, sshcommand, docker-engine-cs (>= 19.03.0) | docker-engine (>= 19.03.0) | docker-io (>= 19.03.0) | docker.io (>= 19.03.0) | docker-ce (>= 19.03.0) | docker-ee (>= 19.03.0) | moby-engine, docker-compose-plugin | moby-compose | docker-compose, docker-buildx-plugin | moby-buildx | docker-buildx, docker-container-healthchecker, docker-image-labeler, lambda-builder, net-tools, netrc, parallel, procfile-util, rsync, dos2unix, unzip, util-linux
+Recommends: herokuish, bash-completion, dokku-update, dokku-event-listener
+Pre-Depends: gliderlabs-sigil, jq, nginx (>= 1.8.0) | openresty, bind9-dnsutils, debconf, plugn, sudo, python3, rsyslog
Maintainer: Jose Diaz-Gonzalez
Description: Docker-powered PaaS that helps build and manage the lifecycle of applications
Dokku is an extensible, open source Platform as a Service
diff --git a/debian/postinst b/debian/postinst
index d7dab6306cd..6edbbed79ef 100755
--- a/debian/postinst
+++ b/debian/postinst
@@ -3,12 +3,10 @@ set -eo pipefail
[[ $TRACE ]] && set -x
if [[ -e /usr/share/debconf/confmodule ]]; then
- # shellcheck disable=SC1091
. /usr/share/debconf/confmodule
fi
if [[ -r /etc/default/dokku ]]; then
- # shellcheck disable=SC1091
source /etc/default/dokku
fi
@@ -26,6 +24,40 @@ call-sshcommand() {
fi
}
+setup-docker-live-restore() {
+ # skip if running in docker-based installation
+ if [[ "$DOKKU_INIT_SYSTEM" == "sv" ]]; then
+ return
+ fi
+
+ # allow disabling via /etc/default/dokku
+ if [[ "$DOKKU_LIVE_RESTORE" == "false" ]]; then
+ return
+ fi
+
+ live_restore="$(docker info --format '{{ .LiveRestoreEnabled }}' || true)"
+ if [ "$live_restore" = "true" ]; then
+ echo "Docker live-restore is already enabled"
+ return
+ fi
+
+ echo "Enabling docker live-restore"
+ if [[ ! -f /etc/docker/daemon.json ]]; then
+ mkdir -p /etc/docker
+ echo "{}" >/etc/docker/daemon.json
+ fi
+
+ config="$(jq '. + {"live-restore": true}' /etc/docker/daemon.json)"
+ echo "$config" >/etc/docker/daemon.json
+ if command -v systemctl &>/dev/null; then
+ if ! systemctl reload docker; then
+ echo "Unable to reload docker, please reload manually" 1>&2
+ fi
+ else
+ echo "Unable to reload docker, please reload manually" 1>&2
+ fi
+}
+
setup-user() {
echo "Setting up dokku user"
call-sshcommand create dokku /usr/bin/dokku
@@ -86,7 +118,8 @@ setup-plugins() {
PLUGIN_PATH="${DOKKU_LIB_ROOT}/plugins" plugn enable "$plugin"
fi
done
- find -L "${DOKKU_LIB_ROOT}" -type l -delete
+ find -L "${DOKKU_LIB_ROOT}/core-plugins" -type l -delete
+ find -L "${DOKKU_LIB_ROOT}/plugins" -type l -delete
chown dokku:dokku -R "${DOKKU_LIB_ROOT}/plugins" "${DOKKU_LIB_ROOT}/core-plugins"
echo "Install all core plugins"
@@ -102,6 +135,85 @@ setup-sshcommand() {
fi
}
+disable-default-vhost-path() {
+ local path="$1"
+ local backup_path="${path}.dokku-disabled"
+
+ if [ ! -e "$path" ] && [ ! -L "$path" ]; then
+ return
+ fi
+
+ if [ -e "$backup_path" ] || [ -L "$backup_path" ]; then
+ return
+ fi
+
+ case "$path" in
+ /etc/nginx/sites-enabled/*)
+ rm -f "$path"
+ echo "Removed conflicting nginx default at $path" 1>&2
+ return
+ ;;
+ esac
+
+ if [ -L "$path" ]; then
+ rm -f "$path"
+ echo "Removed conflicting nginx default symlink at $path" 1>&2
+ return
+ fi
+
+ mv -n "$path" "$backup_path"
+ echo "Disabled $path (renamed to $backup_path)" 1>&2
+}
+
+setup-default-site() {
+ db_get "dokku/install_default_site"
+ if [ "$RET" != "true" ]; then
+ return
+ fi
+
+ local nginx_bin nginx_version major minor patch
+ nginx_bin="$(command -v nginx || true)"
+ if [ -z "$nginx_bin" ]; then
+ return
+ fi
+
+ nginx_version="$("$nginx_bin" -v 2>&1 | cut -d'/' -f 2 | awk '{print $1}')"
+ major="$(echo "$nginx_version" | awk -F. '{print $1}')"
+ minor="$(echo "$nginx_version" | awk -F. '{print $2}')"
+ patch="$(echo "$nginx_version" | awk -F. '{print $3}')"
+
+ # ssl_reject_handshake requires nginx >= 1.19.4; older nginx gets the
+ # HTTP-only catch-all so the SSL listen lines do not require a cert.
+ local default_vhost_basename="default-site.conf"
+ if [ "${major:-0}" -lt 2 ]; then
+ if [ "${major:-0}" -lt 1 ] || [ "${minor:-0}" -lt 19 ] || { [ "${minor:-0}" -eq 19 ] && [ "${patch:-0}" -lt 4 ]; }; then
+ default_vhost_basename="default-site-legacy.conf"
+ fi
+ fi
+
+ local default_vhost_target="/etc/nginx/conf.d/00-default-vhost.conf"
+ local default_vhost_source="${DOKKU_LIB_ROOT}/core-plugins/available/nginx-vhosts/templates/${default_vhost_basename}"
+
+ if [ -e "$default_vhost_target" ]; then
+ return
+ fi
+
+ if [ ! -f "$default_vhost_source" ]; then
+ return
+ fi
+
+ for path in /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default /etc/nginx/conf.d/default.conf; do
+ disable-default-vhost-path "$path"
+ done
+
+ echo "Installing nginx default catch-all site at $default_vhost_target"
+ install -m 0644 -o root -g root "$default_vhost_source" "$default_vhost_target"
+
+ if command -v dokku &>/dev/null; then
+ dokku nginx:reload || true
+ fi
+}
+
dpkg-handling() {
if [ -f "${DOKKU_ROOT}/VHOST" ]; then
echo "VHOST file detected, skipping modification"
@@ -111,6 +223,7 @@ dpkg-handling() {
db_get "dokku/hostname"
echo "Setting VHOST contents to $RET"
echo "$RET" >"${DOKKU_ROOT}/VHOST"
+ chown dokku:dokku "${DOKKU_ROOT}/VHOST"
fi
fi
@@ -125,13 +238,9 @@ dpkg-handling() {
case "$1" in
abort-upgrade | abort-remove | abort-deconfigure) ;;
- \
- configure)
+ configure)
mandb
[ ! -x /usr/bin/docker.io ] || ln -sf /usr/bin/docker.io /usr/local/bin/docker
- if [[ -f /sbin/modprobe ]]; then
- modprobe aufs || echo "WARNING: Restart server to finish installing dokku!"
- fi
setup-user
setup-storage
@@ -139,6 +248,10 @@ case "$1" in
dpkg-handling
setup-plugins
setup-sshcommand
+ setup-docker-live-restore
+ if [ -z "$2" ]; then
+ setup-default-site
+ fi
;;
*)
diff --git a/debian/postrm b/debian/postrm
index 6c15a4d0940..78f3b83de4a 100755
--- a/debian/postrm
+++ b/debian/postrm
@@ -3,7 +3,6 @@ set -eo pipefail
[[ $TRACE ]] && set -x
if [[ -e /usr/share/debconf/confmodule ]]; then
- # shellcheck disable=SC1091
. /usr/share/debconf/confmodule
fi
diff --git a/debian/preinst b/debian/preinst
index 7493eca0543..fb7104341dd 100755
--- a/debian/preinst
+++ b/debian/preinst
@@ -3,7 +3,6 @@ set -eo pipefail
[[ $TRACE ]] && set -x
if [[ -e /usr/share/debconf/confmodule ]]; then
- # shellcheck disable=SC1091
. /usr/share/debconf/confmodule
fi
@@ -22,11 +21,9 @@ case "$1" in
upgrade) ;;
- \
- abort-upgrade) ;;
+ abort-upgrade) ;;
- \
- *)
+ *)
echo "preinst called with unknown argument \`$1'" >&2
exit 1
;;
diff --git a/debian/prerm b/debian/prerm
index 33ec447df77..751e338a516 100755
--- a/debian/prerm
+++ b/debian/prerm
@@ -11,39 +11,39 @@ ps_backtrace() {
exit 1
fi
- declare -i pid=$1
+ declare -i pid="$1"
ppid=0
header_modifier=""
while :; do
- if [ $ppid -ne 0 ]; then
+ if [[ "$ppid" -ne 0 ]]; then
header_modifier=h
fi
- ppid=$(ps -o ppid= $pid)
- ps uww $header_modifier -p $pid
- if [ $pid -eq 1 ]; then
+ ppid="$(ps -o ppid= "$pid")"
+ ps uww $header_modifier -p "$pid"
+ if [[ "$pid" -eq 1 ]] || [[ "$pid" -eq 0 ]]; then
break
fi
- pid=$ppid
+ pid="$ppid"
done
}
main() {
# HACK: Ensure that we only delete data when purging dokku from the system
- if ps_backtrace $BASHPID 2>/dev/null | grep dpkg | grep -- "--purge" >/dev/null; then
+ if ps_backtrace "$BASHPID" 2>/dev/null | grep dpkg | grep -- "--purge" >/dev/null; then
echo "Processing purge"
echo "Destroying deployed applications"
for app in $(DOKKU_QUIET_OUTPUT=1 dokku apps:list); do
- dokku --force apps:destroy $app
+ dokku --force apps:destroy "$app"
done
# HACK: Only disable core plugins, as we don't know what data users store in non-core plugin directories
echo "Disabling all core plugins"
- find ${DOKKU_LIB_ROOT}/core-plugins/available -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
- if [ ! -d ${DOKKU_LIB_ROOT}/plugins/available/$plugin ]; then
- rm ${DOKKU_LIB_ROOT}/plugins/available/$plugin
- PLUGIN_PATH=${DOKKU_LIB_ROOT}/core-plugins plugn disable $plugin
- PLUGIN_PATH=${DOKKU_LIB_ROOT}/plugins plugn disable $plugin
+ find "${DOKKU_LIB_ROOT}/core-plugins/available" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read -r plugin; do
+ if [[ ! -d "${DOKKU_LIB_ROOT}/plugins/available/$plugin" ]]; then
+ rm "${DOKKU_LIB_ROOT}/plugins/available/$plugin"
+ PLUGIN_PATH="${DOKKU_LIB_ROOT}/core-plugins" plugn disable "$plugin"
+ PLUGIN_PATH="${DOKKU_LIB_ROOT}/plugins" plugn disable "$plugin"
fi
done
else
diff --git a/debian/templates b/debian/templates
index 93e7a9768d4..51403a24eec 100644
--- a/debian/templates
+++ b/debian/templates
@@ -22,3 +22,8 @@ Template: dokku/nginx_enable
Description: Enable nginx-vhosts plugin?
Type: boolean
Default: true
+
+Template: dokku/install_default_site
+Description: Install a catch-all nginx default site on fresh install?
+Type: boolean
+Default: true
diff --git a/docker/etc/cron.d/docker-builder-prune b/docker/etc/cron.d/docker-builder-prune
new file mode 100644
index 00000000000..975ce4f53e1
--- /dev/null
+++ b/docker/etc/cron.d/docker-builder-prune
@@ -0,0 +1,4 @@
+PATH=/usr/local/bin:/usr/bin:/bin
+SHELL=/bin/bash
+
+5 4 * * * root /usr/local/bin/docker builder prune -f >>/var/log/dokku/builder-prune.log 2>&1
diff --git a/docker/etc/my_init.d/10_dokku_init b/docker/etc/my_init.d/10_dokku_init
index f495142d4d7..c740a3a093b 100755
--- a/docker/etc/my_init.d/10_dokku_init
+++ b/docker/etc/my_init.d/10_dokku_init
@@ -3,19 +3,28 @@ set -eo pipefail
log-info() {
declare desc="Log info formatter"
- echo " $*" 1>&2
+ echo " $*" 1>&2
}
log-fail() {
declare desc="Log fail formatter"
- echo "! $*" 1>&2
+ echo " ! $*" 1>&2
exit 1
}
+log-warn() {
+ declare desc="Log fail formatter"
+ echo " ! $*" 1>&2
+}
+
support-userns() {
chown 0:0 /usr/bin/sudo
chmod 4755 /usr/bin/sudo
- chown 0:0 /usr/lib/sudo/sudoers.so
+ if [[ -f /usr/lib/sudo/sudoers.so ]]; then
+ chown 0:0 /usr/lib/sudo/sudoers.so
+ elif [[ -f /usr/libexec/sudo/sudoers.so ]]; then
+ chown 0:0 /usr/libexec/sudo/sudoers.so
+ fi
chown -R 0:0 /etc/sudoers
chown -R 0:0 /etc/sudoers.d
chown -R 0:0 /run/sshd
@@ -26,47 +35,70 @@ main() {
support-userns
+ rm -f /var/run/dokku/ready
+ mkdir -p /var/run/dokku
+
if [[ ! -d /mnt/dokku ]]; then
log-info "Creating missing /mnt/dokku"
mkdir -p /mnt/dokku
fi
- directories=("/etc/ssh" "/home/dokku" "/var/lib/dokku/config" "/var/lib/dokku/data")
+ directories=("/etc/ssh" "/home/dokku" "/var/lib/dokku/config" "/var/lib/dokku/data" "/var/lib/dokku/services")
for dir in "${directories[@]}"; do
if [[ ! -e "$dir" ]]; then
log-info "Copying ${dir} skel into place"
mkdir -p "/mnt/dokku${dir}"
- rsync -a "/skel${dir}/" "${dir}/" || log-fail "Unable to copy ${dir} skel into place"
+ if [[ -d "/skel${dir}" ]]; then
+ rsync -a "/skel${dir}/" "${dir}/" || log-fail "Unable to copy ${dir} skel into place"
+ fi
fi
# chown mount directories to "dokku:dokku"
- if [[ "$dir" != "/etc/ssh" ]]; then
+ if [[ "$dir" == "/var/lib/dokku/services" ]]; then
+ chown dokku:dokku /var/lib/dokku/services
+ elif [[ "$dir" != "/etc/ssh" ]]; then
find "$dir" -print0 | xargs -0 chown -h dokku:dokku
fi
done
+ touch /etc/default/dokku
+ echo "export DOKKU_INIT_SYSTEM=sv" >>/etc/default/dokku
+ if [[ -x /usr/local/bin/docker ]]; then
+ echo "export DOCKER_BIN=/usr/local/bin/docker" >>/etc/default/dokku
+ fi
+
+ if [[ -n "$DOKKU_HOST_ROOT" ]]; then
+ echo "export DOKKU_HOST_ROOT=$DOKKU_HOST_ROOT" >>/etc/default/dokku
+ chown dokku:dokku /etc/default/dokku
+ fi
+
+ if [[ -n "$DOKKU_LIB_HOST_ROOT" ]]; then
+ echo "export DOKKU_LIB_HOST_ROOT=$DOKKU_LIB_HOST_ROOT" >>/etc/default/dokku
+ chown dokku:dokku /etc/default/dokku
+ fi
+
if [[ -f /mnt/dokku/plugin-list ]]; then
while read line; do
- dokku plugin:install "$(echo "$line" | awk '{print $2}')" "$(echo "$line" | cut -d':' -f1)"
+ local plugin_name="$(echo "$line" | awk -F: '{print $1}')"
+ if dokku plugin:installed "$plugin_name"; then
+ log-warn "Skipping already installed plugin: $plugin_name"
+ else
+ dokku plugin:install "$(echo "$line" | awk -F': ' '{print $2}')" --name "$plugin_name"
+ fi
done "/home/dokku/.dokkurc/DOCKER_BIN"
- fi
-
- if [[ -n "$DOKKU_HOST_ROOT" ]]; then
- touch /etc/default/dokku
- echo "export DOKKU_HOST_ROOT=$DOKKU_HOST_ROOT" >>/etc/default/dokku
- chown dokku:dokku /etc/default/dokku
- fi
+ echo "dokku dokku/skip_key_file boolean true" | debconf-set-selections
+ echo "dokku dokku/key_file string /root/.ssh/id_rsa.pub" | debconf-set-selections
NGINX_ROOT="/etc/nginx"
if [[ -x /usr/bin/openresty ]]; then
diff --git a/docker/etc/nginx/conf.d/zz-dokku-health.conf b/docker/etc/nginx/conf.d/zz-dokku-health.conf
new file mode 100644
index 00000000000..92c1475e387
--- /dev/null
+++ b/docker/etc/nginx/conf.d/zz-dokku-health.conf
@@ -0,0 +1,16 @@
+# Internal health endpoint for the official dokku/dokku Docker image.
+# Bound to loopback so it is reachable only from inside the container
+# and never conflicts with user app vhosts on 80/443.
+server {
+ listen 127.0.0.1:18080;
+ server_name _;
+ access_log off;
+ default_type text/plain;
+
+ location = /_dokku/health {
+ if (-f /var/run/dokku/ready) {
+ return 200 "ok\n";
+ }
+ return 503 "not ready\n";
+ }
+}
diff --git a/docker/etc/runit/runsvdir/default/dokku-restore/finish b/docker/etc/runit/runsvdir/default/dokku-restore/finish
index ea80c20c0f5..39a01df0bfe 100755
--- a/docker/etc/runit/runsvdir/default/dokku-restore/finish
+++ b/docker/etc/runit/runsvdir/default/dokku-restore/finish
@@ -10,6 +10,10 @@ if [[ "$1" -ne 0 ]]; then
fi
echo "Done restoring dokku apps."
-exec sleep infinity
-exit 0
+while ! (echo >/dev/tcp/127.0.0.1/22) >/dev/null 2>&1; do sleep 1; done
+while ! (echo >/dev/tcp/127.0.0.1/80) >/dev/null 2>&1; do sleep 1; done
+touch /var/run/dokku/ready
+echo "Dokku is ready."
+
+exec sleep infinity
diff --git a/docker/etc/ssh/sshd_config b/docker/etc/ssh/sshd_config
new file mode 100644
index 00000000000..634ce8b2770
--- /dev/null
+++ b/docker/etc/ssh/sshd_config
@@ -0,0 +1,133 @@
+# $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
+
+# This is the sshd server system-wide configuration file. See
+# sshd_config(5) for more information.
+
+# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+# The strategy used for options in the default sshd_config shipped with
+# OpenSSH is to specify options with their default value where
+# possible, but leave them commented. Uncommented options change a
+# default value.
+
+UseDNS no
+
+Port 22
+Port 22333
+#AddressFamily any
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+
+# Disable legacy (protocol version 1) support in the server for new
+# installations. In future the default will change to require explicit
+# activation of protocol 1
+Protocol 2
+
+# HostKey for protocol version 1
+#HostKey /etc/ssh_host_key
+# HostKeys for protocol version 2
+#HostKey /etc/ssh_host_rsa_key
+#HostKey /etc/ssh_host_dsa_key
+
+# Lifetime and size of ephemeral version 1 server key
+#KeyRegenerationInterval 1h
+#ServerKeyBits 1024
+
+# Logging
+# obsoletes QuietMode and FascistLogging
+SyslogFacility AUTHPRIV
+#LogLevel INFO
+
+# Authentication:
+
+#LoginGraceTime 2m
+#PermitRootLogin yes
+#StrictModes yes
+#MaxAuthTries 6
+#MaxSessions 10
+
+#RSAAuthentication yes
+#PubkeyAuthentication yes
+#AuthorizedKeysFile .ssh/authorized_keys
+
+# For this to work you will also need host keys in /etc/ssh_known_hosts
+#RhostsRSAAuthentication no
+# similar for protocol version 2
+#HostbasedAuthentication no
+# Change to yes if you don't trust ~/.ssh/known_hosts for
+# RhostsRSAAuthentication and HostbasedAuthentication
+#IgnoreUserKnownHosts no
+# Don't read the user's ~/.rhosts and ~/.shosts files
+#IgnoreRhosts yes
+
+# To disable tunneled clear text passwords, change to no here! Also,
+# remember to set the UsePAM setting to 'no'.
+PasswordAuthentication no
+#PermitEmptyPasswords no
+
+# SACL options
+# The default for the SACLSupport option is now "no", as this option has been
+# depreciated in favor of SACL enforcement in the PAM configuration (/etc/pam.d/sshd).
+#SACLSupport no
+
+# Change to no to disable s/key passwords
+# Disabled for passenger-docker. We only allow key authentication.
+ChallengeResponseAuthentication no
+
+# Kerberos options
+#KerberosAuthentication no
+#KerberosOrLocalPasswd yes
+#KerberosTicketCleanup yes
+
+# GSSAPI options
+#GSSAPIAuthentication no
+#GSSAPICleanupCredentials yes
+#GSSAPIStrictAcceptorCheck yes
+#GSSAPIKeyExchange no
+
+# Set this to 'yes' to enable PAM authentication, account processing,
+# and session processing. If this is enabled, PAM authentication will
+# be allowed through the ChallengeResponseAuthentication and
+# PasswordAuthentication. Depending on your PAM configuration,
+# PAM authentication via ChallengeResponseAuthentication may bypass
+# the setting of "PermitRootLogin without-password".
+# If you just want the PAM account and session checks to run without
+# PAM authentication, then enable this but set PasswordAuthentication
+# and ChallengeResponseAuthentication to 'no'.
+# Also, PAM will deny null passwords by default. If you need to allow
+# null passwords, add the " nullok" option to the end of the
+# securityserver.so line in /etc/pam.d/sshd.
+UsePAM yes
+
+#AllowAgentForwarding yes
+#AllowTcpForwarding yes
+#GatewayPorts no
+X11Forwarding yes
+#X11DisplayOffset 10
+#X11UseLocalhost yes
+#PrintMotd yes
+#PrintLastLog yes
+#TCPKeepAlive yes
+#UseLogin no
+#UsePrivilegeSeparation yes
+#PermitUserEnvironment no
+#Compression delayed
+#ClientAliveInterval 0
+#ClientAliveCountMax 3
+#UseDNS yes
+#PidFile /var/run/sshd.pid
+#MaxStartups 10
+#PermitTunnel no
+#ChrootDirectory none
+
+# no default banner path
+#Banner none
+
+# override default of no subsystems
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+# Example of overriding settings on a per-user basis
+#Match User anoncvs
+# X11Forwarding no
+# AllowTcpForwarding no
+# ForceCommand cvs server
\ No newline at end of file
diff --git a/docker/etc/sudoers.d/dokku-docker b/docker/etc/sudoers.d/dokku-docker
index ae9a60f3f71..f3dc76faa3c 100644
--- a/docker/etc/sudoers.d/dokku-docker
+++ b/docker/etc/sudoers.d/dokku-docker
@@ -1 +1 @@
-dokku ALL=NOPASSWD:SETENV:/usr/bin/docker,/usr/bin/docker-image-labeler,/usr/bin/pack
+dokku ALL=NOPASSWD:SETENV:/usr/bin/docker,/usr/bin/docker-container-healthchecker,/usr/bin/docker-image-labeler,/usr/bin/lambda-builder,/usr/bin/nixpacks,/usr/bin/railpack,/usr/bin/pack
diff --git a/docker/usr/local/bin/lambda-builder b/docker/usr/local/bin/lambda-builder
new file mode 100644
index 00000000000..cc1b50e9c4d
--- /dev/null
+++ b/docker/usr/local/bin/lambda-builder
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -eo pipefail
+[[ $TRACE ]] && set -x
+
+main() {
+ declare desc="re-runs lambda-builder commands as sudo"
+ local LAMBDA_BUILDER_BIN=""
+ if [[ -x "/usr/bin/lambda-builder" ]]; then
+ LAMBDA_BUILDER_BIN="/usr/bin/lambda-builder"
+ fi
+
+ if [[ -z "$LAMBDA_BUILDER_BIN" ]]; then
+ echo "! No lambda-builder binary found" 1>&2
+ exit 1
+ fi
+
+ sudo -E "$LAMBDA_BUILDER_BIN" "$@"
+}
+
+main "$@"
diff --git a/docker/usr/local/bin/nixpacks b/docker/usr/local/bin/nixpacks
new file mode 100644
index 00000000000..e690254b9cd
--- /dev/null
+++ b/docker/usr/local/bin/nixpacks
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -eo pipefail
+[[ $TRACE ]] && set -x
+
+main() {
+ declare desc="re-runs nixpacks commands as sudo"
+ local NIXPACKS_BIN=""
+ if [[ -x "/usr/bin/nixpacks" ]]; then
+ NIXPACKS_BIN="/usr/bin/nixpacks"
+ fi
+
+ if [[ -z "$NIXPACKS_BIN" ]]; then
+ echo "! No nixpacks binary found" 1>&2
+ exit 1
+ fi
+
+ sudo -E "$NIXPACKS_BIN" "$@"
+}
+
+main "$@"
diff --git a/docker/usr/local/bin/railpack b/docker/usr/local/bin/railpack
new file mode 100644
index 00000000000..35bee71d2fe
--- /dev/null
+++ b/docker/usr/local/bin/railpack
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -eo pipefail
+[[ $TRACE ]] && set -x
+
+main() {
+ declare desc="re-runs railpack commands as sudo"
+ local RAILPACK_BIN=""
+ if [[ -x "/usr/bin/railpack" ]]; then
+ RAILPACK_BIN="/usr/bin/railpack"
+ fi
+
+ if [[ -z "$RAILPACK_BIN" ]]; then
+ echo "! No railpack binary found" 1>&2
+ exit 1
+ fi
+
+ sudo -E "$RAILPACK_BIN" "$@"
+}
+
+main "$@"
diff --git a/docs.mk b/docs.mk
new file mode 100644
index 00000000000..f9c1f4717b0
--- /dev/null
+++ b/docs.mk
@@ -0,0 +1,19 @@
+.PHONY: docs-build-image
+docs-build-image:
+ docker build -f docs/_build/Dockerfile --progress plain -t app/mkdocs .
+
+.PHONY: docs-build
+docs-build:
+ @docker run --rm -p 3487:3487 -v "$(PWD):/usr/src/source" --name docs-serve app/mkdocs build
+
+.PHONY: docs-serve
+docs-serve:
+ docker run --rm -p 3487:3487 -v "$(PWD):/usr/src/source" --name docs-serve app/mkdocs serve
+
+.PHONY: docs-deps
+docs-deps:
+ @docker run --rm -p 3487:3487 -v "$(PWD):/usr/src/app" app/mkdocs deps
+
+.PHONY: docs-enter
+docs-enter:
+ docker exec -it docs-serve bash
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 00000000000..00e8acd4abc
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,161 @@
+# Dokku Documentation
+
+This documentation covers the installation, configuration, and usage of Dokku - a Docker-powered PaaS that provides a Heroku-like experience.
+
+## Getting Started
+
+- [Installation](getting-started/installation/index.md) - Install Dokku on your server
+ - [Debian](getting-started/install/debian.md)
+ - [Docker](getting-started/install/docker.md)
+ - [DigitalOcean](getting-started/install/digitalocean.md)
+ - [Azure](getting-started/install/azure.md)
+ - [DreamHost](getting-started/install/dreamhost.md)
+ - [Vagrant](getting-started/install/vagrant.md)
+- [Advanced Installation](getting-started/advanced-installation.md) - Custom installation options
+- [Upgrading](getting-started/upgrading/index.md) - Upgrade to newer Dokku versions
+- [Uninstalling](getting-started/uninstalling.md) - Remove Dokku from your server
+- [Troubleshooting](getting-started/troubleshooting.md) - Common issues and solutions
+- [Where to Get Help](getting-started/where-to-get-help.md) - Support resources
+
+## Deployment
+
+- [Application Deployment](deployment/application-deployment.md) - Deploy your first app
+- [Application Management](deployment/application-management.md) - Manage deployed applications
+- [Logs](deployment/logs.md) - View application logs
+- [Remote Commands](deployment/remote-commands.md) - Run commands remotely
+- [User Management](deployment/user-management.md) - Manage SSH access
+- [Zero Downtime Deploys](deployment/zero-downtime-deploys.md) - Deploy without interruption
+
+### Deployment Methods
+
+- [Git](deployment/methods/git.md) - Deploy via git push
+- [Archive](deployment/methods/archive.md) - Deploy from tar/zip archives
+- [Image](deployment/methods/image.md) - Deploy from Docker images
+
+### Builders
+
+- [Builder Management](deployment/builders/builder-management.md) - Configure build systems
+- [Buildpack Management](deployment/builders/buildpack-management.md) - Manage buildpack settings
+- [Herokuish Buildpacks](deployment/builders/herokuish-buildpacks.md) - Heroku-compatible buildpacks
+- [Cloud Native Buildpacks](deployment/builders/cloud-native-buildpacks.md) - CNB support
+- [Dockerfiles](deployment/builders/dockerfiles.md) - Build from Dockerfile
+- [Nixpacks](deployment/builders/nixpacks.md) - Nixpacks builder
+- [Railpack](deployment/builders/railpack.md) - Railpack builder
+- [Lambda](deployment/builders/lambda.md) - Lambda-style functions
+- [Null Builder](deployment/builders/null.md) - Skip the build phase
+
+### Schedulers
+
+- [Scheduler Management](deployment/schedulers/scheduler-management.md) - Configure schedulers
+- [Docker Local](deployment/schedulers/docker-local.md) - Default Docker scheduler
+- [K3s](deployment/schedulers/k3s.md) - Lightweight Kubernetes
+- [Kubernetes](deployment/schedulers/kubernetes.md) - External Kubernetes clusters
+- [Nomad](deployment/schedulers/nomad.md) - HashiCorp Nomad
+- [Null Scheduler](deployment/schedulers/null.md) - Skip scheduling
+
+### Continuous Integration
+
+- [Generic CI](deployment/continuous-integration/generic.md) - General CI/CD setup
+- [GitHub Actions](deployment/continuous-integration/github-actions.md)
+- [GitLab CI](deployment/continuous-integration/gitlab-ci.md)
+- [Woodpecker CI](deployment/continuous-integration/woodpecker-ci.md)
+
+## Configuration
+
+- [Environment Variables](configuration/environment-variables.md) - Configure app environment
+- [Domains](configuration/domains.md) - Custom domain management
+- [SSL/TLS](configuration/ssl.md) - HTTPS and certificates
+
+## Networking
+
+- [Proxy Management](networking/proxy-management.md) - Reverse proxy configuration
+- [Port Management](networking/port-management.md) - Port mapping and exposure
+- [DNS](networking/dns.md) - DNS configuration
+- [Network](networking/network.md) - Docker network management
+
+### Proxies
+
+- [Nginx](networking/proxies/nginx.md) - Default proxy
+- [Caddy](networking/proxies/caddy.md)
+- [HAProxy](networking/proxies/haproxy.md)
+- [Traefik](networking/proxies/traefik.md)
+- [OpenResty](networking/proxies/openresty.md)
+
+## Processes
+
+- [Process Management](processes/process-management.md) - Scale and manage processes
+- [Scheduled Cron Tasks](processes/scheduled-cron-tasks.md) - Scheduled jobs
+- [One-off Tasks](processes/one-off-tasks.md) - Run one-time commands
+- [Entering Containers](processes/entering-containers.md) - Access running containers
+
+## Advanced Usage
+
+- [Persistent Storage](advanced-usage/persistent-storage.md) - Mount volumes
+- [Docker Options](advanced-usage/docker-options.md) - Custom Docker run arguments
+- [Resource Management](advanced-usage/resource-management.md) - CPU and memory limits
+- [Plugin Management](advanced-usage/plugin-management.md) - Install and manage plugins
+- [Registry Management](advanced-usage/registry-management.md) - Docker registry integration
+- [Repository Management](advanced-usage/repository-management.md) - Git repository settings
+- [Build Tracking](advanced-usage/builds.md) - Inspect, cancel, and manage builds
+- [Deployment Tasks](advanced-usage/deployment-tasks.md) - Pre/post deploy hooks
+- [Event Logs](advanced-usage/event-logs.md) - Dokku event history
+- [Backup and Recovery](advanced-usage/backup-recovery.md) - Data backup strategies
+
+## Development
+
+- [Architecture](development/architecture.md) - Internal architecture overview for contributors
+- [Plugin Creation](development/plugin-creation.md) - Build custom plugins
+- [Plugin Triggers](development/plugin-triggers.md) - Available plugin hooks
+- [Testing](development/testing.md) - Test Dokku and plugins
+- [Release Process](development/release-process.md) - How Dokku releases work
+
+## Community
+
+- [Plugins](community/plugins.md) - Community-maintained plugins
+- [Clients](community/clients.md) - API clients and tools
+
+## Enterprise
+
+- [Dokku Pro](enterprise/pro.md) - Commercial features and support
+
+## Appendices
+
+### Migration Guides
+
+- [0.38.0](appendices/0.38.0-migration-guide.md)
+- [0.37.0](appendices/0.37.0-migration-guide.md)
+- [0.36.0](appendices/0.36.0-migration-guide.md)
+- [0.35.0](appendices/0.35.0-migration-guide.md)
+- [0.34.0](appendices/0.34.0-migration-guide.md)
+- [0.33.0](appendices/0.33.0-migration-guide.md)
+- [0.32.0](appendices/0.32.0-migration-guide.md)
+- [0.31.0](appendices/0.31.0-migration-guide.md)
+- [0.30.0](appendices/0.30.0-migration-guide.md)
+- [0.29.0](appendices/0.29.0-migration-guide.md)
+- [0.28.0](appendices/0.28.0-migration-guide.md)
+- [0.27.0](appendices/0.27.0-migration-guide.md)
+- [0.26.0](appendices/0.26.0-migration-guide.md)
+- [0.25.0](appendices/0.25.0-migration-guide.md)
+- [0.24.0](appendices/0.24.0-migration-guide.md)
+- [0.23.0](appendices/0.23.0-migration-guide.md)
+- [0.22.0](appendices/0.22.0-migration-guide.md)
+- [0.21.0](appendices/0.21.0-migration-guide.md)
+- [0.20.0](appendices/0.20.0-migration-guide.md)
+- [0.10.0](appendices/0.10.0-migration-guide.md)
+- [0.9.0](appendices/0.9.0-migration-guide.md)
+- [0.8.0](appendices/0.8.0-migration-guide.md)
+- [0.7.0](appendices/0.7.0-migration-guide.md)
+- [0.6.0](appendices/0.6.0-migration-guide.md)
+- [0.5.0](appendices/0.5.0-migration-guide.md)
+
+### File Formats
+
+- [app.json](appendices/file-formats/app-json.md) - Application configuration
+- [Procfile](appendices/file-formats/procfile.md) - Process definitions
+- [Dockerfile](appendices/file-formats/dockerfile.md) - Docker build instructions
+- [.buildpacks](appendices/file-formats/buildpacks-file.md) - Buildpack configuration
+- [project.toml](appendices/file-formats/project-toml.md) - CNB configuration
+- [nixpacks.toml](appendices/file-formats/nixpacks-toml.md) - Nixpacks configuration
+- [railpack.json](appendices/file-formats/railpack-json.md) - Railpack configuration
+- [lambda.yml](appendices/file-formats/lambda-yml.md) - Lambda configuration
+- [nginx.conf.sigil](appendices/file-formats/nginx-conf-sigil.md) - Nginx template customization
diff --git a/docs/_build/Dockerfile b/docs/_build/Dockerfile
new file mode 100644
index 00000000000..b56a07f2e44
--- /dev/null
+++ b/docs/_build/Dockerfile
@@ -0,0 +1,12 @@
+FROM python:3.15.0b4-alpine
+
+WORKDIR /usr/src/app
+
+COPY docs/_build/requirements.txt .
+
+RUN apk add --no-cache bash build-base yaml && \
+ pip install --no-cache-dir -r requirements.txt
+
+COPY docs/_build/entrypoint /bin/entrypoint
+
+ENTRYPOINT [ "/bin/entrypoint" ]
diff --git a/docs/_build/app-nginx.conf.sigil b/docs/_build/app-nginx.conf.sigil
new file mode 100644
index 00000000000..fff079520d4
--- /dev/null
+++ b/docs/_build/app-nginx.conf.sigil
@@ -0,0 +1,26 @@
+worker_processes 1;
+error_log stderr;
+pid nginx.pid;
+daemon off;
+
+events {
+ worker_connections 768;
+}
+
+http {
+ types_hash_max_size 2048;
+ include mime.types;
+ charset UTF-8;
+ server {
+ listen {{ $.PORT }};
+ server_name _;
+ root /app/www;
+ index index.html;
+ port_in_redirect off;
+
+ include /app/www/nginx.conf.d/*.conf;
+ location / {
+ try_files $uri $uri/ =404;
+ }
+ }
+}
diff --git a/docs/_build/entrypoint b/docs/_build/entrypoint
new file mode 100755
index 00000000000..9d01485286a
--- /dev/null
+++ b/docs/_build/entrypoint
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+write-mkdocs() {
+ if [[ -f /usr/src/source/contrib/write-mkdocs ]]; then
+ if ! python3 /usr/src/source/contrib/write-mkdocs; then
+ exit 0
+ fi
+ fi
+}
+
+main() {
+ declare CMD="$1" ARGS=("${@:2}")
+
+ if [[ "$CMD" == "build" ]]; then
+ write-mkdocs
+ echo "----> Executing mkdocs build"
+ mkdocs build
+ site_dir="$(grep site_dir mkdocs.yml | awk '{print $2}')"
+ cp -r "/usr/src/app/${site_dir}" "/usr/src/source/${site_dir}"
+
+ return $?
+ fi
+
+ if [[ "$CMD" == "deps" ]]; then
+ exec pip freeze
+ fi
+
+ if [[ "$CMD" == "serve" ]]; then
+ write-mkdocs
+ exec mkdocs serve -a 0.0.0.0:3487
+ fi
+
+ exec "$CMD" "${ARGS[@]}"
+}
+
+main "$@"
diff --git a/docs/_build/hooks.py b/docs/_build/hooks.py
new file mode 100644
index 00000000000..fe3ac182305
--- /dev/null
+++ b/docs/_build/hooks.py
@@ -0,0 +1,407 @@
+#!/usr/bin/env python
+
+import posixpath
+import re
+
+from collections.abc import Callable
+from re import Match
+from mkdocs.config.defaults import MkDocsConfig
+from mkdocs.structure.files import File, Files
+from mkdocs.structure.pages import Page
+
+
+def on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: Files) -> str | None:
+ resp = re_on_page_markdown(markdown, page=page, config=config, files=files)
+ if not resp:
+ return resp
+
+
+ modifiers: list[Callable[[list[str], str], tuple[list[str], bool]]] = [
+ modify_content_noop,
+ modify_content_links,
+ modify_content_stripspace,
+ modify_content_admonition,
+ modify_content_terminal_example,
+ ]
+
+ is_modified = False
+ lines = resp.split("\n")
+ for modifier in modifiers:
+ lines, modified = modifier(lines, page.file.src_path)
+ if modified:
+ is_modified = True
+
+ if is_modified:
+ resp = "\n".join(lines)
+
+ return resp
+
+
+def modify_content_noop(lines: list[str], _) -> tuple[list[str], bool]:
+ """
+ Simply returns the lines as is
+ """
+ modified = False
+ updated_lines = []
+ for line in lines:
+ updated_lines.append(line)
+ return updated_lines, modified
+
+
+def modify_content_links(lines: list[str], filename: str) -> tuple[list[str], bool]:
+ """
+ Modifies links to be relative instead of absolute
+ """
+ filename = filename.replace("/usr/src/source/docs/", "")
+ parts = filename.split("/")
+ parts.pop()
+ replacement = "](" + "/".join([".." for _ in parts]) + "/"
+ modified = False
+ updated_lines = []
+ for line in lines:
+ if "](/docs/" in line:
+ line = line.replace("](/docs/", replacement)
+ modified = True
+
+ updated_lines.append(line)
+ return updated_lines, modified
+
+
+def modify_content_stripspace(lines: list[str], _) -> tuple[list[str], bool]:
+ """
+ Removes trailing whitespace from each line
+ """
+ modified = False
+ updated_lines = []
+ for line in lines:
+ line = line.rstrip()
+ updated_lines.append(line)
+ return updated_lines, modified
+
+
+def is_github_new(line: str, next_line: str | None) -> bool:
+ """
+ Checks if a given line is a github "new as of" admonition
+ """
+ if not next_line:
+ return False
+
+ return line.startswith("> [!IMPORTANT]") and "new as of" in next_line.lower()
+
+
+def is_github_note(line: str) -> bool:
+ """
+ Checks if a given line is a github "note" admonition
+ """
+ return line.startswith("> [!NOTE]")
+
+
+def is_github_warning(line: str) -> bool:
+ """
+ Checks if a given line is a github "warning" admonition
+ """
+ return line.startswith("> [!WARNING]")
+
+
+def is_info(line: str) -> bool:
+ """
+ Checks if a given line is an "info" admonition
+ """
+ return line.startswith("> ")
+
+
+def is_new(line: str) -> bool:
+ """
+ Checks if a given line is a "new as of" admonition
+ """
+ return line.startswith("> ") and "new as of" in line.lower()
+
+
+def is_note(line: str) -> bool:
+ """
+ Checks if a given line is a "note" admonition
+ """
+ return line.startswith("> Note:")
+
+
+def is_warning(line: str) -> bool:
+ """
+ Checks if a given line is a "warning" admonition
+ """
+ return line.startswith("> Warning:")
+
+
+def modify_content_admonition(lines: list[str], filename: str) -> tuple[list[str], bool]:
+ """
+ Applies adminition info to each line in the output
+ """
+ modified = False
+ updated_lines = []
+ admonition_lines = []
+ is_admonition = False
+ replace_new_in_next_line = False
+ for index, line in enumerate(lines):
+ next_line: str | None = None
+ if index + 1 < len(lines):
+ next_line = lines[index + 1]
+
+ if replace_new_in_next_line:
+ line = line.replace("New as of", "Introduced in")
+ line = line.replace("new as of", "introduced in")
+ replace_new_in_next_line = False
+
+ if is_github_new(line, next_line):
+ line = line.replace("> [!IMPORTANT]", '!!! tip "New"')
+ is_admonition = True
+ admonition_lines.append(line)
+ admonition_lines.append("")
+ replace_new_in_next_line = True
+ elif is_github_note(line):
+ line = line.replace("> [!NOTE]", '!!! note "Note"')
+ is_admonition = True
+ admonition_lines.append(line)
+ admonition_lines.append("")
+ elif is_github_warning(line):
+ line = line.replace("> [!WARNING]", '!!! warning "Warning"')
+ is_admonition = True
+ admonition_lines.append(line)
+ admonition_lines.append("")
+ elif is_new(line):
+ print("is_new")
+ line = line.replace("> ", '!!! tip "New"\n\n ')
+ line = line.replace("New as of", "Introduced in")
+ line = line.replace("new as of", "introduced in")
+ is_admonition = True
+ admonition_lines.append(line)
+ elif is_note(line):
+ print("is_note")
+ line = line.replace("> Note: ", '!!! note "Note"\n\n ')
+ is_admonition = True
+ admonition_lines.append(line)
+ elif is_warning(line):
+ print("is_warning")
+ line = line.replace("> Warning: ", '!!! warning "Warning"\n\n ')
+ is_admonition = True
+ admonition_lines.append(line)
+ elif is_info(line):
+ if not is_admonition:
+ line = line.replace("> ", '!!! info "Info"\n\n ')
+ elif line in [">", "> "]:
+ line = ""
+ else:
+ line = " " + line.removeprefix("> ")
+ is_admonition = True
+ admonition_lines.append(line)
+ elif is_admonition and line in [">", "> "]:
+ line = ""
+ admonition_lines.append(line)
+ elif is_admonition and line.startswith("> "):
+ line = " " + line.removeprefix("> ")
+ admonition_lines.append(line)
+ elif line == "":
+ is_admonition = False
+ if len(admonition_lines) > 0:
+ modified = True
+ updated_lines.extend(admonition_lines)
+ admonition_lines = []
+ updated_lines.append("")
+ else:
+ updated_lines.append(line)
+ return updated_lines, modified
+
+
+def is_shell_codeblock_start(line: str) -> bool:
+ """
+ Checks to see if a line starts a codeblock
+ """
+ return line == "```shell"
+
+
+def modify_content_terminal_example(lines: list[str], _) -> tuple[list[str], bool]:
+ """
+ Modifies content so that terminal output is shown appropriately
+ """
+ modified = False
+ updated_lines = []
+ command_block = []
+ example_block = []
+ in_command_block = False
+ in_example_block = False
+ previous_block = ""
+ next_line_must_be = None
+ for line in lines:
+ if is_shell_codeblock_start(line):
+ command_block.append(line)
+ modified = True
+ in_command_block = True
+ continue
+ elif in_command_block:
+ command_block.append(line)
+ if line == "```":
+ in_command_block = False
+ previous_block = "command_block"
+ next_line_must_be = ""
+ continue
+ elif line == "```":
+ if previous_block == "":
+ updated_lines.append(line)
+ continue
+ if previous_block == "command_block":
+ example_block.append(line)
+
+ if in_example_block:
+ previous_block = ""
+ in_example_block = False
+ updated_lines.append('=== "Shell"')
+ updated_lines.append("")
+ for command_line in command_block:
+ updated_lines.append(f" {command_line}")
+ command_block = []
+
+ updated_lines.append("")
+ updated_lines.append('=== "Output"')
+ updated_lines.append("")
+ for example_line in example_block:
+ updated_lines.append(f" {example_line}")
+ example_block = []
+ else:
+ in_example_block = True
+ continue
+ elif previous_block == "command_block":
+ if next_line_must_be is None:
+ if in_example_block:
+ example_block.append(line)
+ else:
+ updated_lines.extend(command_block)
+ updated_lines.append("")
+ updated_lines.append(line)
+ command_block = []
+ previous_block = ""
+ continue
+ if next_line_must_be == "":
+ if line == "":
+ next_line_must_be = None
+ continue
+
+ updated_lines.append(line)
+
+ if len(command_block) > 0:
+ updated_lines.extend(command_block)
+
+ return updated_lines, modified
+
+
+def re_on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: Files) -> str | None:
+ """
+ This hook is called after the page's markdown is loaded from file and can be
+ """
+
+ def replace(match: Match):
+ badge_type, args = match.groups()
+ args = args.strip()
+ if badge_type == "version":
+ return _badge_for_version(args, page, files)
+ if badge_type == "scheduler":
+ return _badge_for_scheduler(args, page, files)
+ if type == "flag":
+ return flag(args, page, files)
+
+ # Otherwise, raise an error
+ raise RuntimeError(f"Unknown shortcode: {badge_type}")
+
+ return re.sub(r"", replace, markdown, flags=re.I | re.M)
+
+
+def _badge(icon: str, text: str = "", badge_type: str = ""):
+ """
+ Create badge
+ """
+ classes = f"mdx-badge mdx-badge--{badge_type}" if badge_type else "mdx-badge"
+ text = f"{text}{{ data-preview='' }}" if text.endswith(")") else text
+ return "".join(
+ [
+ f'',
+ *([f'{icon}'] if icon else []),
+ *([f'{text}'] if text else []),
+ "",
+ ]
+ )
+
+
+def _badge_for_scheduler(text: str, page: Page, files: Files):
+ """
+ Create badge for scheduler
+ """
+
+ # Return badge
+ icon = "simple-docker"
+ if text in ["kubernetes", "k3s"]:
+ icon = "simple-kubernetes"
+ text = "k3s"
+ elif text == "nomad":
+ icon = "simple-nomad"
+ elif text in ["docker", "docker-local"]:
+ icon = "simple-docker"
+ text = "docker-local"
+
+ href = f"https://dokku.com/docs/deployment/schedulers/{text}/"
+ return _badge(
+ icon=f"[:{icon}:]({href} '{text}')",
+ text=f"[{text}]({href})",
+ )
+
+
+def _badge_for_version(text: str, page: Page, files: Files):
+ """
+ Create badge for version
+ """
+
+ # Return badge
+ icon = "material-tag-outline"
+ href = f"https://github.com/dokku/dokku/releases/tag/v{text}"
+ return _badge(
+ icon=f"[:{icon}:]({href} 'Since {text}')",
+ text=f"[{text}]({href})",
+ )
+
+
+def flag(args: str, page: Page, files: Files):
+ """
+ Create flag
+ """
+
+ flag_type, *_ = args.split(" ", 1)
+ if flag_type == "experimental":
+ return _badge_for_experimental(page, files)
+ raise RuntimeError(f"Unknown flag type: {flag_type}")
+
+
+def _badge_for_experimental(page: Page, files: Files):
+ """
+ Create badge for experimental
+ """
+
+ icon = "material-flask-outline"
+ href = _resolve_path("conventions.md#experimental", page, files)
+ return _badge(icon=f"[:{icon}:]({href} 'Experimental')")
+
+
+def _resolve_path(path: str, page: Page, files: Files):
+ """
+ Resolve path of file relative to given page - the posixpath always includes
+ one additional level of `..` which we need to remove
+ """
+
+ path, anchor, *_ = f"{path}#".split("#")
+ path = _resolve(files.get_file_from_path(path), page)
+ return "#".join([path, anchor]) if anchor else path
+
+
+def _resolve(file: File, page: Page):
+ """
+ Resolve path of file relative to given page - the posixpath always includes
+ one additional level of `..` which we need to remove
+ """
+
+ path = posixpath.relpath(file.src_uri, page.file.src_uri)
+ return posixpath.sep.join(path.split(posixpath.sep)[1:])
diff --git a/docs/_build/requirements.txt b/docs/_build/requirements.txt
new file mode 100644
index 00000000000..dfd4dafa978
--- /dev/null
+++ b/docs/_build/requirements.txt
@@ -0,0 +1,23 @@
+beautifulsoup4==4.15.0
+click==8.4.2
+ghp-import==2.1.0
+importlib-metadata==9.0.0
+Jinja2==3.1.6
+Markdown>=3.10.2,<3.11
+MarkupSafe==3.0.3
+mergedeep==1.3.4
+mkdocs==1.6.1
+mkdocs-exclude==1.0.2
+mkdocs-material==9.7.7
+mkdocs-material-extensions==1.3.1
+packaging==26.2
+Pygments==2.20.0
+pymdown-extensions==11.0.1
+pyparsing==3.3.2
+python-dateutil==2.9.0.post0
+PyYAML==6.0.3
+pyyaml_env_tag==1.1
+six==1.17.0
+soupsieve==2.9.1
+watchdog==6.0.0
+zipp==4.1.0
diff --git a/docs/_overrides/main.html b/docs/_overrides/main.html
new file mode 100644
index 00000000000..8233afc3bce
--- /dev/null
+++ b/docs/_overrides/main.html
@@ -0,0 +1,56 @@
+
+
+{% extends "base.html" %}
+
+
+{% block extrahead %}
+
+
+
+{% endblock %}
+
+
+{% block announce %}
+
+ For updates follow @dokku on
+
+ {% include ".icons/fontawesome/brands/twitter.svg" %}
+
+ Twitter
+
+{% endblock %}
+
+
+{% block scripts %}
+ {{ super() }}
+
+
+
+{% endblock %}
+
+{% block outdated %}
+ You're not viewing the latest version.
+
+ Click here to go to latest.
+
+{% endblock %}
diff --git a/docs/advanced-usage/backup-recovery.md b/docs/advanced-usage/backup-recovery.md
index df487834b68..fae61cc6d6b 100644
--- a/docs/advanced-usage/backup-recovery.md
+++ b/docs/advanced-usage/backup-recovery.md
@@ -6,7 +6,8 @@ The best plan for disaster recovery is to always keep multiple (remote) copies o
## TLDR
-> Warning: This method has many caveats. Please read this entire document before assuming these backups work as expected, and test your backups on a regular basis.
+> [!WARNING]
+> This method has many caveats. Please read this entire document before assuming these backups work as expected, and test your backups on a regular basis.
### Creating a backup
@@ -95,6 +96,14 @@ System administrators are highly encouraged to store persistent data in app-spec
See the [persistent storage documentation](/docs/advanced-usage/persistent-storage.md) for more information on how to attach persistent storage to your app.
+### Restoring on a machine with a different CPU Architecture
+
+When restoring a backup on a machine that has a different CPU architecture, you will need to clear out the `~/.basher` as it's not portable across different CPU architectures. Do so with the following command immediately after restoring your dokku configs:
+
+```shell
+rm -rf /home/dokku/.basher
+```
+
## Recovering app code
In case of an emergency when your git repo and backups are completely lost, you can recover the last pushed copy from your remote Dokku server (assuming you still have the ssh key).
diff --git a/docs/advanced-usage/builds.md b/docs/advanced-usage/builds.md
new file mode 100644
index 00000000000..1e80bca4308
--- /dev/null
+++ b/docs/advanced-usage/builds.md
@@ -0,0 +1,197 @@
+# Build Tracking
+
+> [!IMPORTANT]
+> New as of 0.38.0
+
+Every deploy that flows through Dokku - whether triggered by `git push`, `ps:rebuild`, `ps:restart`, `config:set`, or `git:from-archive` / `git:from-image` / `git:sync` / `git:load-image` - is recorded as a structured build record on disk. The `builds` plugin lets operators inspect what is currently deploying, look up the result of an old deploy, and stream the captured build log without depending on `journalctl`.
+
+```
+builds:cancel # Cancel a running build for an app
+builds:info [--format json] # Show details for a single build
+builds:list [] [--format json] [--kind ...] [--status ...]
+ # List builds (running across all apps, or running + history for one)
+builds:output [|current] # Show build output (tail for live, cat for finished)
+builds:prune [--all-apps] # Reap abandoned records and apply retention
+builds:report [] [] # Display a build report
+builds:set [--global|] [] # Set or clear a builds property
+```
+
+## Build records
+
+Every build is identified by a sortable base36 ULID-style id (`DOKKU_BUILD_ID`) generated at deploy start. For each build, Dokku writes:
+
+- `$DOKKU_LIB_ROOT/data/builds//.json` - the structured record
+- `$DOKKU_LIB_ROOT/data/builds//.log` - the captured stdout/stderr of the deploy
+
+Output is also tagged into syslog as `dokku-` so `journalctl -t dokku-` continues to work. The on-disk log file is the durable source of truth and is read for `builds:output` even when journald has rotated old entries away.
+
+### Record schema
+
+```json
+{
+ "id": "01j8c4xv7bk5w3",
+ "app": "myapp",
+ "kind": "build",
+ "pid": 12345,
+ "started_at": "2026-04-30T13:50:00Z",
+ "finished_at": "2026-04-30T13:51:14Z",
+ "status": "succeeded",
+ "source": "git-hook",
+ "exit_code": 0
+}
+```
+
+- **kind** - `build` for paths that produce a new image (`git push`, `git:*`, `ps:rebuild`); `deploy` for paths that re-deploy an existing image (`ps:restart`, `ps:start`, `dokku deploy`, `config:set`).
+- **status** - on-disk values are `running | succeeded | failed | canceled`. `abandoned` is a fifth display-only value computed at read time for `running` records whose PID is no longer alive; it is never persisted to the record.
+- **source** - the user-typed command that originated the deploy (e.g. `git-hook`, `ps:restart`, `config-redeploy`, `git:sync`).
+
+## Listing builds
+
+Without an app argument, `builds:list` shows currently-running builds across every app on the host:
+
+```shell
+dokku builds:list
+```
+
+```
+=====> Currently running builds
+App Build ID Kind PID Source Started
+myapp 01j8c4xv7bk5w3 build 12345 git-hook 2026-04-30T13:50:00Z
+```
+
+With an app, `builds:list` returns running builds plus the most recent finalized records up to the configured retention:
+
+```shell
+dokku builds:list myapp
+```
+
+Filter by kind or status:
+
+```shell
+dokku builds:list myapp --kind build
+dokku builds:list myapp --status running
+dokku builds:list --format json
+```
+
+## Inspecting a single build
+
+```shell
+dokku builds:info myapp 01j8c4xv7bk5w3
+```
+
+```
+=====> Build 01j8c4xv7bk5w3
+ Build ID: 01j8c4xv7bk5w3
+ App: myapp
+ Kind: build
+ Status: succeeded
+ PID: 12345
+ Source: git-hook
+ Started: 2026-04-30T13:50:00Z
+ Finished: 2026-04-30T13:51:14Z
+ Duration: 1m14s
+ Exit Code: 0
+ Log: /var/lib/dokku/data/builds/myapp/01j8c4xv7bk5w3.log
+```
+
+JSON output includes the same fields plus a computed `log_path`:
+
+```shell
+dokku builds:info myapp 01j8c4xv7bk5w3 --format json | jq .
+```
+
+## Streaming build output
+
+```shell
+# tail -f the live build, or cat the log for a finished one
+dokku builds:output myapp 01j8c4xv7bk5w3
+
+# resolve "current" from the in-flight deploy
+dokku builds:output myapp current
+```
+
+If the on-disk log file is missing (for example, a build from before this plugin was installed), `builds:output` falls back to `journalctl -t dokku-`.
+
+## Cancelling a build
+
+`builds:cancel` reads the active `.deploy.lock` for an app, looks up the matching build record, and sends `SIGQUIT` to the deploy's process group. The record is finalized as `canceled` (or `failed` if the process had already exited without finalizing - in that case Dokku marks the record so it doesn't sit in `running` forever).
+
+```shell
+dokku builds:cancel myapp
+```
+
+If the record is already finalized when cancel runs, no signal is sent and the record is left untouched.
+
+## Retention
+
+Build records are pruned by count, not by age. The default retention is **20** records per app. Live in-flight deploys are never pruned regardless of count.
+
+Set a per-app retention:
+
+```shell
+dokku builds:set myapp retention 50
+```
+
+Set the global default:
+
+```shell
+dokku builds:set --global retention 10
+```
+
+Clear an override (falls back to the global value, then the default):
+
+```shell
+dokku builds:set myapp retention
+```
+
+## Manual pruning
+
+`builds:prune` invokes the same logic that runs at the end of every deploy - it reaps abandoned records (status=running with a dead PID, finalized as `failed`) and trims the directory to the configured retention. Useful after lowering retention via `builds:set` or to clean up after a host reboot:
+
+```shell
+dokku builds:prune myapp
+dokku builds:prune --all-apps
+```
+
+## Reports
+
+```shell
+dokku builds:report
+dokku builds:report myapp
+dokku builds:report myapp --build-status
+```
+
+Available flags:
+
+- `--build-id`, `--build-kind`, `--build-status`, `--build-pid`, `--build-source`, `--build-started-at`, `--build-finished-at`, `--build-exit-code`: details of the most recent build for the app
+- `--builds-retention`: per-app retention override (empty if none)
+- `--builds-global-retention`: global retention override (empty if none)
+- `--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.
+
+## Properties
+
+### Settable properties
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `builds:report`. The JSON keys emitted by `builds:report --format json` are the same names with the leading `--builds-` stripped (e.g. `retention`, `global-retention`, `computed-retention`). Legacy keys with the `builds-` prefix (e.g. `builds-retention`) are also emitted during the 0.38.x deprecation window and will be removed in a future major release. Status keys (`build-id`, `build-status`, etc.) have no plugin prefix and are unaffected.
+
+| 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 |
diff --git a/docs/advanced-usage/deployment-tasks.md b/docs/advanced-usage/deployment-tasks.md
index 6b18c7f7f93..1c278a80328 100644
--- a/docs/advanced-usage/deployment-tasks.md
+++ b/docs/advanced-usage/deployment-tasks.md
@@ -1,5 +1,6 @@
# Deployment Tasks
+> [!IMPORTANT]
> New as of 0.5.0
## Usage
@@ -17,30 +18,30 @@ To support this, Dokku provides support for a special `release` command within y
Each "phase" has different expectations and limitations:
- `app.json`: `scripts.dokku.predeploy`
- - When to use: This should be used if your app does not support arbitrary build commands and you need to make changes to the built image.
- - Are changes committed to the image at this phase: Yes
- - Example use-cases
- - Bundling assets in a slightly different way
- - Installing a custom package from source or copying a binary into place
+ - When to use: This should be used if your app does not support arbitrary build commands and you need to make changes to the built image.
+ - Are changes committed to the image at this phase: Yes
+ - Example use-cases
+ - Bundling assets in a slightly different way
+ - Installing a custom package from source or copying a binary into place
- `app.json`: `scripts.dokku.postdeploy`
- - When to use: This should be used in conjunction with external systems to signal the completion of your deploy.
- - Are changes committed to the image at this phase: No
- - Example use-cases
- - Notifying slack that your app is deployed
- - Coordinating traffic routing with a central load balancer
+ - When to use: This should be used in conjunction with external systems to signal the completion of your deploy.
+ - Are changes committed to the image at this phase: No
+ - Example use-cases
+ - Notifying slack that your app is deployed
+ - Coordinating traffic routing with a central load balancer
- `app.json`: `scripts.postdeploy`
- - When to use: This should be used when you wish to run a command _once_, after the app is created and not on subsequent deploys to the app.
- - Are changes committed to the image at this phase: No
- - Example use-cases
- - Setting up OAuth clients and DNS
- - Loading seed/test data into the appâs test database
+ - When to use: This should be used when you wish to run a command _once_, after the app is created and not on subsequent deploys to the app.
+ - Are changes committed to the image at this phase: No
+ - Example use-cases
+ - Setting up OAuth clients and DNS
+ - Loading seed/test data into the appâs test database
- `Procfile`: `release`
- - When to use: This should be used in conjunction with external systems to signal the completion of your app image build.
- - Are changes committed to the image at this phase: No
- - Example use-cases
- - Sending CSS, JS, and other assets from your appâs slug to a CDN or S3 bucket
- - Priming or invalidating cache stores
- - Running database migrations
+ - When to use: This should be used in conjunction with external systems to signal the completion of your app image build.
+ - Are changes committed to the image at this phase: No
+ - Example use-cases
+ - Sending CSS, JS, and other assets from your appâs slug to a CDN or S3 bucket
+ - Priming or invalidating cache stores
+ - Running database migrations
Additionally, if using a Dockerfile with an `ENTRYPOINT`, the deployment task is passed to that entrypoint as is. The exceptions are if the entrypoint is one of the following:
@@ -55,12 +56,19 @@ Please keep the above in mind when utilizing deployment tasks.
### Changing the `app.json` location
-When deploying a monorepo, it may be desirable to specify the specific path of the `app.json` file to use for a given app. This can be done via the `app-json:set` command. If a value is specified and that file does not exist within the repository, Dokku will continue the build process as if the repository has no `app.json` file.
+The `app.json` is expected to be found in a specific directory, depending on the deploy approach:
+
+- The `WORKDIR` of the Docker image for deploys resulting from `git:from-image` and `git:load-image` commands.
+- The root of the source code tree for all other deploys (git push, `git:from-archive`, `git:sync`).
+
+Sometimes it may be desirable to set a different path for a given app, e.g. when deploying from a monorepo. This can be done via the `appjson-path` property:
```shell
-dokku app-json:set node-js-app appjson-path second-app.json
+dokku app-json:set node-js-app appjson-path .dokku/app.json
```
+The value is the path to the desired file *relative* to the base search directory, and will never be treated as absolute paths in any context. If that file does not exist within the repository, Dokku will continue the build process as if the repository has no `app.json`.
+
The default value may be set by passing an empty value for the option:
```shell
@@ -81,6 +89,7 @@ dokku app-json:set --global appjson-path
### Displaying app-json reports for an app
+> [!IMPORTANT]
> New as of 0.25.0
You can get a report about the app's storage status using the `app-json:report` command:
@@ -92,18 +101,20 @@ dokku app-json:report
```
=====> node-js-app app-json information
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
=====> python-sample app-json information
App-json computed appjson path: app.json
- App-json global appjson path: app.json
+ App-json global appjson path:
App-json appjson path:
=====> ruby-sample app-json information
App-json computed appjson path: app.json
- App-json global appjson path: app.json
+ App-json global 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.
```shell
@@ -113,7 +124,7 @@ dokku app-json:report node-js-app
```
=====> node-js-app app-json information
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
```
@@ -137,9 +148,8 @@ Dokku provides limited support for the `app.json` manifest from Heroku (document
- `scripts.dokku.postdeploy`: This is run _after_ an app's containers are scheduled. Changes made to your image are _not_ committed at this phase.
- `scripts.postdeploy`: This is run _after_ an app's containers are scheduled. Changes made to your image are _not_ committed at this phase.
-For buildpack-based deployments, the location of the `app.json` file should be at the root of your repository. Dockerfile-based app deploys should have the `app.json` in the configured `WORKDIR` directory; otherwise Dokku defaults to the buildpack app behavior of looking in `/app`.
-
-> Warning: Any failed `app.json` deployment task will fail the deploy. In the case of either phase, a failure will not affect any running containers.
+> [!WARNING]
+> Any failed `app.json` deployment task will fail the deploy. In the case of either phase, a failure will not affect any running containers.
The following is an example `app.json` file. Please note that only the `scripts.dokku.predeploy` and `scripts.dokku.postdeploy` tasks are supported by Dokku at this time. All other fields will be ignored and can be omitted.
@@ -157,6 +167,7 @@ The following is an example `app.json` file. Please note that only the `scripts.
#### Procfile Release command
+> [!IMPORTANT]
> New as of 0.14.0
The `Procfile` also supports a special `release` command which acts in a similar way to the [Heroku Release Phase](https://devcenter.heroku.com/articles/release-phase). This command is executed _after_ an app's docker image is built, but _before_ any containers are scheduled. This is also run _after_ any command executed by `scripts.dokku.predeploy`.
@@ -169,4 +180,5 @@ release: curl https://some.external.api.service.com/deployment?state=built
Unlike the `scripts.dokku.predeploy` command, changes made during by the `release` command are _not_ persisted to disk.
-> Warning: scaling the release command up will likely result in unspecified issues within your deployment, and is highly discouraged.
+> [!WARNING]
+> scaling the release command up will likely result in unspecified issues within your deployment, and is highly discouraged.
diff --git a/docs/advanced-usage/docker-options.md b/docs/advanced-usage/docker-options.md
index 16e82cd3ef3..054904e34b6 100644
--- a/docs/advanced-usage/docker-options.md
+++ b/docs/advanced-usage/docker-options.md
@@ -1,57 +1,103 @@
# Docker Container Options
+> [!IMPORTANT]
> New as of 0.3.17
-Pass [container options](https://docs.docker.com/engine/reference/run/) to the `docker run` command during Dokku's `build`, `deploy` and `run` phases
-
```
-docker-options:add OPTION # Add Docker option to app for phase (comma-separated phase list)
-docker-options:clear [...] # Clear a docker options from application
-docker-options:remove OPTION # Remove Docker option from app for phase (comma-separated phase list)
-docker-options:report [] [] # Displays a docker options report for one or more apps
+docker-options:add [--process PROC...] OPTION # Add Docker option to app for phase
+docker-options:clear [--process PROC...] [...] # Clear docker options from app
+docker-options:list [--process PROC] --phase PHASE # List docker options for one process+phase pair
+docker-options:remove [--process PROC...] OPTION # Remove Docker option from app for phase
+docker-options:report [] [] [--format json|stdout] # Displays a docker options report for one or more apps
```
-> When specifying multiple phases, they **must** be comma-separated _without_ spaces in between each phase, like so:
->
-> ```shell
-> dokku docker-options:add node-js-app deploy,run "-v /var/log/node-js-app:/app/logs"
-> ```
+The `docker-options` plugin allows users to specify custom [container options](https://docs.docker.com/engine/reference/run/) for containers created by Dokku at various phases.
+
+## Usage
+
+### Background
+
+#### Phases
+
+Dokku deploys your app in multiple "phases" and the `docker-options` plugin allows you to pass arguments to their underlying docker container:
-## About Dokku phases
+- `build`: The `build` phase is used to provide container options that are available during the build process for use by the various builders.
+ - A given builder may strip out or ignore options that are unsupported by the builder in question - as an example, the `dockerfile` builder does not support mounted volumes.
+- `deploy`: The `deploy` phase is used to provide container options that are set on _deployed_ process types. This covers every process type specified in an app `Procfile` as well as any default processes your app may deploy.
+ - The `deploy` phase is usually the correct phase to add options for running containers.
+- `run`: The `run` phase is used to provide container options to one-off containers created by `dokku run`, `dokku run:detached`, and any cron tasks specified in your `app.json`.
-Dokku deploys your application in multiple "phases" and the `docker-options` plugin allows you to pass arguments to their underlying docker container:
+> [!IMPORTANT]
+> The `run` phase does _not_ correspond 1-to-1 to `docker run` or `docker container run` commands. Specifying a container option at the `run` phase will only be invoked on containers created by the `run` plugin and cron tasks. Please be sure to specify options at the correct phase for your use-case.
-- `build`: the container that executes the appropriate buildpack
-- `deploy`: the container that executes your running/deployed application
-- `run`: the container that executes any arbitrary command via `dokku run`
+Adding or removing docker-options will not apply to any running containers, and only applies to containers created _after_ the options have been modified. As such, changing an app's docker options must be followed by a `dokku ps:rebuild` or a deploy in order to take effect.
-Manipulation of docker options will not restart running containers. This enables multiple options to be set/unset before final application. As such, changing an app's docker options must be followed by a `dokku ps:rebuild` in order to take effect.
+#### Supported Docker Options
-More information on supported Docker options can be found here: https://docs.docker.com/engine/reference/commandline/run/.
+More information on supported Docker options can be found [here](https://docs.docker.com/engine/reference/commandline/run/).
Container options configured via the `docker-options` plugin are not used to modify the process a container runs. Container options are the `[OPTIONS]` portion of the following, where `[CONTAINER_COMMAND]` and `[ARG]` are the process and the arguments passed to it that are launched in the created container: `docker run [OPTIONS] [CONTAINER_COMMAND] [ARG...]`. Please see the documentation for [customizing the run command](/docs/deployment/builders/dockerfiles.md#customizing-the-run-command) or use a [Procfile](/docs/deployment/builders/dockerfiles.md#procfiles-and-multiple-processes) to modify the command used by a Dockerfile-based container.
-## Examples
+#### Mounting volumes and host directories
-### Add Docker options
+Docker supports volume and host directory mounting via the `-v` or `--volume` flags. In order to simplify usage, Dokku provides a `storage` plugin as an abstraction to interact with persistent storage. In most cases, the Dokku project recommends using the persistent storage plugin over directly manipulating docker options at different phases. See the [persistent storage documentation](/docs/advanced-usage/persistent-storage.md) for more information on how to attach persistent storage to your app.
-Add some options for the deployed/running app and when executing [`dokku run`](/docs/processes/one-off-tasks.md):
+### Commands
+
+#### Add Docker options
+
+To add a docker option to an app, use the `docker-options:add` command. This takes an app name, a comma-separated list of phases, and the docker-option to add.
```shell
-# Mount a host volume in a Docker container: "-v /host/path:/container/path"
-dokku docker-options:add node-js-app deploy "-v /var/log/node-js-app:/app/logs"
-dokku docker-options:add node-js-app run "-v /var/log/node-js-app:/app/logs"
+dokku docker-options:add node-js-app deploy "--ulimit nofile=12"
```
-> Note: When [mounting a host directory](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems) in a Dokku app you should first create that directory as user `dokku` and then mount the directory under `/app` in the container using `docker-options` as above. Otherwise the app will lack write permission in the directory.
+Multiple phases can be specified by using a comma when specifying phases:
+
+```shell
+dokku docker-options:add node-js-app deploy,run "--ulimit nofile=12"
+```
-### Remove a Docker option
+Multiple docker options can also be specified in a single call. Each `--flag [value]` group is detected on flag boundaries, shell-tokenized for quoting safety, and stored as its own entry so it round-trips through `docker-options:report` and `docker-options:list`:
```shell
-dokku docker-options:remove node-js-app run "-v /var/log/node-js-app:/app/logs"
+dokku docker-options:add node-js-app deploy "--ulimit nofile=12" "--shm-size 256m"
```
-### Clear all Docker options for an app
+Option values are stored and passed to the container verbatim. Quoting only controls how a value is split into words - no shell expansion is performed, so `$(...)`, backticks, `$VAR`, and globs are treated literally rather than being interpreted by the shell. This is what lets values such as a Traefik router rule be applied as-is:
+
+```shell
+dokku docker-options:add node-js-app deploy '--label "traefik.http.routers.web.rule=Host(`node-js-app.example.com`) && PathPrefix(`/api`)"'
+```
+
+A misplaced `--process PROC` (i.e. one specified after the app name instead of before it) is honored as a subcommand flag rather than stored as a docker option, so the example above and the equivalent process-scoped form below behave identically:
+
+```shell
+dokku docker-options:add --process web node-js-app deploy "--ulimit nofile=12" "--shm-size 256m"
+dokku docker-options:add node-js-app deploy "--ulimit nofile=12" "--shm-size 256m" --process web
+```
+
+#### Remove a Docker option
+
+To remove docker options from an app, use the `docker-options:remove` command. This takes an app name, a comma-separated list of phases, and the docker-option to remove.
+
+```shell
+dokku docker-options:remove node-js-app run "--ulimit nofile=12"
+```
+
+Multiple phases can be specified by using a comma when specifying phases:
+
+```shell
+dokku docker-options:remove node-js-app deploy,run "--ulimit nofile=12"
+```
+
+Multiple docker options can also be removed in a single call, mirroring the splitting that `docker-options:add` performs:
+
+```shell
+dokku docker-options:remove node-js-app deploy "--ulimit nofile=12" "--shm-size 256m"
+```
+
+#### Clear all Docker options for an app
Docker options can be removed for a specific app using the `docker-options:clear` command.
@@ -82,8 +128,9 @@ dokku docker-options:clear node-js-app build,run
-----> Clearing docker-options for node-js-app on phase run
```
-### Displaying docker-options reports for an app
+#### Displaying docker-options reports for an app
+> [!IMPORTANT]
> New as of 0.8.1
You can get a report about the app's docker-options status using the `docker-options:report` command:
@@ -95,8 +142,8 @@ dokku docker-options:report
```
=====> node-js-app docker options information
Docker options build:
- Docker options deploy: -v /var/log/node-js-app:/app/logs
- Docker options run: -v /var/log/node-js-app:/app/logs
+ Docker options deploy: --ulimit nofile=12 --shm-size 256m
+ Docker options run: --ulimit nofile=12 --shm-size 256m
=====> python-sample docker options information
Docker options build:
Docker options deploy:
@@ -125,3 +172,99 @@ You can pass flags which will output only the value of the specific information
```shell
dokku docker-options:report node-js-app --docker-options-build
```
+
+When process-specific options are configured (see below), the report exposes one additional dynamic flag per configured `process.deploy` pair, named `--docker-options-deploy.`:
+
+```shell
+dokku docker-options:report node-js-app --docker-options-deploy.web
+```
+
+A machine-readable JSON view is available via `--format json`:
+
+```shell
+dokku docker-options:report node-js-app --format json
+```
+
+The JSON report includes the existing string keys (`build`, `deploy`, `run`, and `deploy.` when configured) plus parallel `-list` keys for the same shorthand keys. Each `-list` value is a JSON array with one element per option as originally stored via `docker-options:add`, which allows export tooling to round-trip options that contain spaces without splitting the legacy space-joined strings. Empty phases emit an empty array (`[]`). The deprecated `docker-options-*` prefixed keys are unchanged and do not gain `-list` companions.
+
+```json
+{
+ "build": "",
+ "build-list": [],
+ "deploy": "-v /logs:/logs --memory=512m",
+ "deploy-list": ["-v /logs:/logs", "--memory=512m"],
+ "run": "",
+ "run-list": [],
+ "deploy.web": "-p 8080:5000",
+ "deploy.web-list": ["-p 8080:5000"],
+ "docker-options-build": "",
+ "docker-options-deploy": "-v /logs:/logs --memory=512m",
+ "docker-options-run": "",
+ "docker-options-deploy.web": "-p 8080:5000"
+}
+```
+
+### Process-Specific Options
+
+> [!IMPORTANT]
+> New as of 0.38.0
+
+Docker options can be scoped to specific process types declared in the app's `Procfile` by passing one or more `--process` flags. This is useful when a deploy-phase option (for example a port mapping) makes sense for one process type but would conflict with another - the canonical case being a `web` process that needs `-p 6789:5000` published while the `worker` process must not bind that port.
+
+Process scoping is supported only for the `deploy` phase. The `build` phase runs once per app and the `run` phase covers ad-hoc commands and cron tasks where no Procfile process type is in play; both reject `--process`.
+
+There is no `--global` flag. Omitting `--process` keeps the historical behavior of applying the option to every container in the app. Avoiding a `--global` flag here is intentional: elsewhere in Dokku `--global` means "across all apps" (e.g. `dokku config:set --global`), which would be misleading in this plugin where the scope is always one app.
+
+#### Setting process-specific options
+
+```shell
+# Add a port mapping only to the web process
+dokku docker-options:add --process web node-js-app deploy "-p 6789:5000"
+
+# Add a GPU mount only to the worker process
+dokku docker-options:add --process worker node-js-app deploy "--gpus all"
+```
+
+Multiple `--process` flags can be combined to apply the same option to several process types in one call:
+
+```shell
+dokku docker-options:add --process web --process api node-js-app deploy "-v /shared:/shared"
+```
+
+If `--process` names a process type that is not currently declared in the app's `Procfile`, the command succeeds but emits a warning. This allows configuring options ahead of a deploy that adds the new process type.
+
+The `_default_` value is reserved internally and cannot be passed to `--process`.
+
+#### Removing and clearing process-specific options
+
+```shell
+# Remove a single option from one process
+dokku docker-options:remove --process web node-js-app deploy "-p 6789:5000"
+
+# Clear every option for a process+phase
+dokku docker-options:clear --process worker node-js-app deploy
+```
+
+Without `--process`, `:remove` and `:clear` operate on the default scope only - per-process lists are left untouched.
+
+#### Listing options for a process and phase
+
+The `docker-options:list` command prints the options stored for a single process+phase pair, one option per line. Omitting `--process` lists the default scope.
+
+```shell
+dokku docker-options:list node-js-app --process web --phase deploy
+dokku docker-options:list node-js-app --phase deploy
+```
+
+## Properties
+
+### Internal properties
+
+The following properties are recorded internally by the docker-options plugin and are not exposed via `docker-options:report`:
+
+| Property | Scope | Description | Source |
+|---|---|---|---|
+| `migrated-from-files` | global | Global migration sentinel that records that the legacy `DOCKER_OPTIONS_` flat-file store has been drained into plugin properties | `plugins/docker-options/functions.go` writes `"true"` once the install-time migration runs |
+| `migrated-build` | per-app | Per-app marker recording that the app's legacy `DOCKER_OPTIONS_BUILD` file was drained into the `_default_.build` property list. Only set when the legacy file contained non-empty content | `plugins/docker-options/functions.go` writes `"true"` after the per-phase drain |
+| `migrated-deploy` | per-app | Per-app marker recording that the app's legacy `DOCKER_OPTIONS_DEPLOY` file was drained into the `_default_.deploy` property list. Only set when the legacy file contained non-empty content | `plugins/docker-options/functions.go` writes `"true"` after the per-phase drain |
+| `migrated-run` | per-app | Per-app marker recording that the app's legacy `DOCKER_OPTIONS_RUN` file was drained into the `_default_.run` property list. Only set when the legacy file contained non-empty content | `plugins/docker-options/functions.go` writes `"true"` after the per-phase drain |
diff --git a/docs/advanced-usage/event-logs.md b/docs/advanced-usage/event-logs.md
index 645b6f77f0c..68b8336a5ca 100644
--- a/docs/advanced-usage/event-logs.md
+++ b/docs/advanced-usage/event-logs.md
@@ -1,5 +1,6 @@
# Dokku Event Logs
+> [!IMPORTANT]
> New as of 0.3.21
Docker provides an _events_ command to show system's real time events. Likewise, Dokku can record events as syslog entries and also provides a plugin to display the last ones.
@@ -33,7 +34,6 @@ dokku events
Jul 3 16:09:48 dokku.me dokku[127630]: INVOKED: pre-release-buildpack( pythonapp )
Jul 3 16:10:02 dokku.me dokku[128095]: INVOKED: docker-args-run( rubyapp )
Jul 3 16:10:02 dokku.me dokku[128114]: INVOKED: docker-args-run( nhl )
-Jul 3 16:10:03 dokku.me dokku[128136]: INVOKED: post-release-buildpack( pythonapp )
Jul 3 16:10:03 dokku.me dokku[128195]: INVOKED: pre-deploy( pythonapp )
Jul 3 16:10:23 dokku.me dokku[129253]: INVOKED: docker-args-deploy( pythonapp )
Jul 3 16:10:24 dokku.me dokku[129451]: INVOKED: check-deploy( pythonapp 6274ced0d4be11af4490cd18abaf77cdd593f025133f403d984e80d86a39acec web 5000 10.0.16.80 )
@@ -68,8 +68,6 @@ post-build-dockerfile
post-delete
post-deploy
post-domains-update
-post-release-buildpack
-post-release-dockerfile
pre-build-buildpack
pre-build-dockerfile
pre-delete
@@ -78,4 +76,4 @@ pre-release-buildpack
pre-release-dockerfile
receive-app
update
-```
\ No newline at end of file
+```
diff --git a/docs/advanced-usage/persistent-storage.md b/docs/advanced-usage/persistent-storage.md
index 1edc4d40480..2dc09dc250e 100644
--- a/docs/advanced-usage/persistent-storage.md
+++ b/docs/advanced-usage/persistent-storage.md
@@ -1,38 +1,96 @@
# Persistent Storage
-> New as of 0.5.0
+> [!IMPORTANT]
+> New as of 0.5.0. Named storage entries new as of 0.38.0.
-The preferred method to mount external containers to a Dokku managed container, is to use the Dokku storage plugin.
+The preferred method to attach persistent storage to a Dokku-managed container is the Dokku storage plugin.
```
-storage:ensure-directory [--chown option] # Creates a persistent storage directory in the recommended storage path
-storage:list # List bind mounts for app's container(s) (host:container)
-storage:mount # Create a new bind mount
-storage:report [] [] # Displays a checks report for one or more apps
-storage:unmount # Remove an existing bind mount
+storage:create [] [flags] # Register a named storage entry
+storage:destroy [--force] # Remove a named storage entry (must be unmounted from every app first)
+storage:ensure-directory [--chown option] # [DEPRECATED] use storage:create instead
+storage:exec [-- ...] # Run a command (or shell) in a temporary container that mounts the entry
+storage:info [--format text|json] # Show details for one storage entry
+storage:list [--format text|json] # List bind mounts for an app's container(s) (legacy host:container view)
+storage:list-entries [--scheduler s] [--format text|json] # List registered storage entries
+storage:mount --container-dir [flags] # Mount a named entry into an app
+storage:mount # [LEGACY] colon-form mount, docker-local only
+storage:report [] [] # Display a storage report for one or more apps
+storage:report --global # Display a cluster-wide entry inventory
+storage:set [flags] # Update a storage entry in place
+storage:unmount [--container-dir ] # Remove an attachment
+storage:wait # Block until a k3s entry's PVC is bound
```
-> The storage plugin is compatible with storage mounts created with the docker-options. The storage plugin will only list mounts from the deploy/run phase.
+A storage entry is the source of truth for the underlying volume - a host directory on docker-local, or a PersistentVolumeClaim on k3s. Multiple apps can mount the same entry, and an attachment carries the per-app details (container path, phases, subpath, readonly, process type). Names are globally unique across the install and must be DNS-1123 labels (lowercase letters, digits, dashes) of 45 characters or less so they can be used verbatim as Helm release and PVC names.
+
+The legacy `storage:mount :` form continues to work on docker-local. On a k3s app it is rejected; create a named entry with `storage:create --scheduler k3s` and mount it instead. Existing colon-form mounts are migrated automatically the first time the new code runs - they show up as `legacy-` entries in `storage:list-entries`.
The storage plugin supports the following mount points:
-- explicit paths that exist on the host
-- docker volumes
+- explicit paths that exist on the host (docker-local)
+- docker volumes (docker-local)
+- PersistentVolumeClaims provisioned via a StorageClass (k3s)
+- hostPath-backed PVs (k3s)
## Usage
+### Listing persistent storage
+
+Persistent storage bind mounts are specified on a per-app basis, and can be listed with the `storage:list` command:
+
+```shell
+dokku storage:list node-js-app
+```
+
+```
+-----> node-js-app volume bind-mounts:
+ /var/lib/dokku/data/storage/node-js-app:/app/storage
+```
+
+The output format can also be set to `json` for programmatic access:
+
+```shell
+dokku storage:list node-js-app --format json
+```
+
+```
+[
+ {
+ "entry_name": "node-js-app",
+ "host_path": "/var/lib/dokku/data/storage/node-js-app",
+ "container_path": "/app/storage"
+ }
+]
+```
+
+Each entry mirrors the underlying attachment. `readonly` (boolean) and `volume_options` (string) reflect `Attachment.Readonly` and `Attachment.VolumeOptions` directly and are only present when set, so external tooling can drift-detect attachments against the raw attachment fields. For example, a mount created with `--volume-options noexec,nosuid --volume-readonly` renders as:
+
+```
+[
+ {
+ "entry_name": "node-js-data",
+ "host_path": "/var/lib/dokku/data/storage/node-js-data",
+ "container_path": "/app/storage",
+ "readonly": true,
+ "volume_options": "noexec,nosuid"
+ }
+]
+```
+
### Creating storage directories
+> [!IMPORTANT]
> New as of 0.25.5
A storage directory can be created with the `storage:ensure-directory` command. This command will create a subdirectory in the recommended `/var/lib/dokku/data/storage` path - created during Dokku installation - and prepare it for use with an app.
```shell
-dokku storage:ensure-directory lollipop
+dokku storage:ensure-directory node-js-app
```
```
------> Ensuring /var/lib/dokku/data/storage/lollipop exists
+-----> Ensuring /var/lib/dokku/data/storage/node-js-app exists
Setting directory ownership to 32767:32767
Directory ready for mounting
```
@@ -40,16 +98,23 @@ dokku storage:ensure-directory lollipop
By default, permissions are set for usage with Herokuish buildpacks. These permissions can be changed via the `--chown` option according to the following table:
- `--chown herokuish` (default): Use `32767:32767` as the folder permissions.
- - This is used for apps deployed with Buildpacks via Herokuish.
+ - This is used for apps deployed with Buildpacks via Herokuish.
- `--chown heroku`: Use `1000:1000` as the folder permissions.
- - This is used for apps deployed with Cloud Native Buildpacks using the `heroku/buildpacks` builder.
-- `--chown packeto`: Use `2000:2000` as the folder permissions.
- - This is used for apps deployed with Cloud Native Buildpacks using the `cloudfoundry/cnb` or `packeto` builders.
+ - This is used for apps deployed with Cloud Native Buildpacks using the `heroku/builder` builder.
+- `--chown paketo`: Use `2000:2000` as the folder permissions.
+ - This is used for apps deployed with Cloud Native Buildpacks using the `cloudfoundry/cnb` or `paketo` builders.
+- `--chown root`: Use `0:0` as the folder permissions.
+ - This is used for containers that run their processes as root, as is typical for most Dockerfile or Docker image deploys.
- `--chown false`: Skips the `chown` call.
+- `--chown `: Use `:` as the folder permissions, where `` is a custom numeric user/group id.
+ - This is used for containers that run their processes as a uid/gid that doesn't correspond to any of the above named options.
Users deploying via Dockerfile will want to specify `--chown false` and manually `chown` the created directory if the user and/or group id of the runnning process in the deployed container do not correspond to any of the above options.
-> Warning: Failing to set the correct directory ownership may result in issues in persisting files written to the mounted storage directory.
+The `--chown` flag - whether on `storage:create` or `storage:ensure-directory` - only manages the default `/var/lib/dokku/data/storage/` location. If a custom `` is passed to `storage:create`, the chown call is refused and the operator must chown the path themselves.
+
+> [!WARNING]
+> Failing to set the correct directory ownership may result in issues in persisting files written to the mounted storage directory.
### Mounting storage into apps
@@ -69,6 +134,17 @@ In the first example, Dokku will then mount the shared contents of `/var/lib/dok
> If the `/storage` path within the container had pre-existing content, the container files will be over-written. This may be an issue for users that create assets at build time but then mount a directory at the same place during runtime. Files are not merged.
+For named storage entries, additional Docker mount options can be passed via `--volume-options`. The value is a comma-separated mount-options string stored verbatim on the attachment and rendered into the `-v` flag at deploy time. This is useful for SELinux labels (`Z`, `z`) or hardening flags (`noexec,nosuid`):
+
+```shell
+dokku storage:create node-js-data
+dokku storage:mount node-js-app node-js-data --container-dir /app/storage --volume-options Z
+```
+
+When combined with `--volume-readonly`, the rendered options become `ro,` - for example, `--volume-options noexec,nosuid --volume-readonly` renders as `:ro,noexec,nosuid`.
+
+Re-running `storage:mount` against a named entry with the same `--container-dir` and `--process-type` updates the existing attachment's mount-time attributes (`--phase`, `--volume-subpath`, `--volume-readonly`, `--volume-chown`, `--volume-options`) in place rather than appending a duplicate. This is the idempotent equivalent of `storage:set` for entries, and lets declarative tooling change a mount-time attribute without an unmount-then-remount dance that would briefly drop the volume from `storage:report`. Mount-time fields are rewritten wholesale, not merged - omitting a flag on a re-mount clears any previously-set value. The legacy `host:container[:opts]` form still rejects duplicates with `Mount path already exists.`.
+
Once persistent storage is mounted, the app requires a restart. See the [process scaling documentation](/docs/processes/process-management.md) for more information.
```shell
@@ -93,8 +169,39 @@ Once persistent storage is unmounted, the app requires a restart. See the [proce
dokku ps:restart app-name
```
+### Destroying storage entries
+
+A named storage entry can be removed with the `storage:destroy` command. The entry must first be unmounted from every app that mounts it.
+
+```shell
+dokku storage:destroy rdmtest-entry
+```
+
+As the command is destructive - removing the registry entry and, depending on the scheduler and reclaim policy, the underlying volume - it will default to asking for confirmation before executing the removal.
+
+```
+ ! WARNING: Potentially Destructive Action
+ ! This command will destroy storage entry rdmtest-entry.
+ ! To proceed, type "rdmtest-entry"
+> rdmtest-entry
+-----> Storage entry rdmtest-entry destroyed
+```
+
+The confirmation may be avoided by providing the `--force` flag, which is useful for non-interactive or automated callers:
+
+```shell
+dokku storage:destroy rdmtest-entry --force
+```
+
+The global `--force` flag is also supported:
+
+```shell
+dokku --force storage:destroy rdmtest-entry
+```
+
### Displaying storage reports for an app
+> [!IMPORTANT]
> New as of 0.8.1
You can get a report about the app's storage status using the `storage:report` command:
@@ -137,6 +244,60 @@ You can pass flags which will output only the value of the specific information
dokku storage:report node-js-app --storage-deploy-mounts
```
+In addition to the aggregated `Storage build/deploy/run mounts:` lines, the report emits one flat dotted key per attachment field, indexed from `1`. The key shape is `--storage-attachment..` for each of `entry-name`, `host-path`, `container-path`, `phases`, `process-type`, `subpath`, `readonly`, `volume-options`, and `volume-chown`. Fields render as empty strings when unset, and attachments are ordered by lex-sort of the index (so `10` sorts before `2`):
+
+```shell
+dokku storage:create node-js-data
+dokku storage:mount node-js-app node-js-data --container-dir /app/storage --volume-options Z --volume-chown herokuish --volume-subpath uploads
+dokku storage:report node-js-app
+```
+
+```
+=====> node-js-app storage information
+ Storage attachment 1 container path: /app/storage
+ Storage attachment 1 entry name: node-js-data
+ Storage attachment 1 host path: /var/lib/dokku/data/storage/node-js-data
+ Storage attachment 1 phases: deploy,run
+ Storage attachment 1 process type: _default_
+ Storage attachment 1 readonly: false
+ Storage attachment 1 subpath: uploads
+ Storage attachment 1 volume chown: herokuish
+ Storage attachment 1 volume options: Z
+ Storage build mounts:
+ Storage deploy mounts: -v /var/lib/dokku/data/storage/node-js-data:/app/storage:Z
+ Storage run mounts: -v /var/lib/dokku/data/storage/node-js-data:/app/storage:Z
+```
+
+The same keys are exposed in JSON output, both in the stripped (`attachment.1.volume-options`) and legacy (`storage-attachment.1.volume-options`) forms:
+
+```shell
+dokku storage:report node-js-app --format json | jq '. | with_entries(select(.key | startswith("attachment.")))'
+```
+
+```json
+{
+ "attachment.1.container-path": "/app/storage",
+ "attachment.1.entry-name": "node-js-data",
+ "attachment.1.host-path": "/var/lib/dokku/data/storage/node-js-data",
+ "attachment.1.phases": "deploy,run",
+ "attachment.1.process-type": "_default_",
+ "attachment.1.readonly": "false",
+ "attachment.1.subpath": "uploads",
+ "attachment.1.volume-chown": "herokuish",
+ "attachment.1.volume-options": "Z"
+}
+```
+
+A single attachment field can be fetched directly via the info-flag form:
+
+```shell
+dokku storage:report node-js-app --storage-attachment.1.volume-options
+```
+
+```
+Z
+```
+
## Use Cases
### Sharing storage across deploys
@@ -165,14 +326,27 @@ dokku docker-options:add node-js-app build "-v /tmp/python-test:/opt/test"
You cannot use mounted volumes during the build phase of a Dockerfile deploy. This is because Docker does not support volumes when executing `docker build`.
-> Note: **This can cause data loss** if you bind a mount under `/app` in buildpack apps as herokuish will attempt to remove the original app path during the build phase.
+> [!WARNING]
+> **This can cause data loss** if you bind a mount under `/app` in buildpack apps as herokuish will attempt to remove the original app path during the build phase.
## App User and Persistent Storage file ownership (buildpack apps only)
+> [!IMPORTANT]
> New as of 0.7.1
By default, Dokku will execute your buildpack app processes as the `herokuishuser` user. You may override this by setting the `DOKKU_APP_USER` config variable.
-> NOTE: this user must exist in your herokuish image.
+> [!NOTE]
+> this user must exist in your herokuish image.
+
+Additionally, the default `docker-local` scheduler that comes with Dokku will ensure your storage mounts are owned by either `herokuishuser` or the overridden value you have set in `DOKKU_APP_USER`. See the [docker-local scheduler documentation](/docs/deployment/schedulers/docker-local.md#disabling-chown-of-persistent-storage) docs for more information.
+
+## Properties
+
+### Internal properties
+
+The following property is recorded internally by the storage plugin and is not exposed via `storage:report`:
-Additionally, the default `docker-local` scheduler that comes with Dokku will ensure your storage mounts are owned by either `herokuishuser` or the overridden value you have set in `DOKKU_APP_USER`. See the [docker-local scheduler documentation](/docs/advanced-usage/schedulers/docker-local.md#disabling-chown-of-persistent-storage) docs for more information.
+| Property | Scope | Description | Source |
+|---|---|---|---|
+| `legacy-mounts-migrated` | per-app | Per-app marker recording that the app's legacy `-v` docker-options entries were drained into named storage entries plus attachments. Only set when at least one `-v` line was actually migrated; apps that have never had legacy mounts never receive this marker | `plugins/storage/migrate.go` writes `"true"` after a successful drain |
diff --git a/docs/advanced-usage/plugin-management.md b/docs/advanced-usage/plugin-management.md
index f736c238c4f..0f0e1b1b415 100644
--- a/docs/advanced-usage/plugin-management.md
+++ b/docs/advanced-usage/plugin-management.md
@@ -1,17 +1,18 @@
# Plugin Management
+> [!IMPORTANT]
> New as of 0.4.0
```
plugin:disable # Disable an installed plugin (third-party only)
plugin:enable # Enable a previously disabled plugin
-plugin:install [--core|git-url [--committish tag|branch|commit|--name custom-plugin-name]] # Optionally download git-url (with custom tag/committish) & run install trigger for active plugins (or only core ones)
+plugin:install [--core|git-url] [--committish branch|commit|tag] [--name custom-plugin-name] [--skip-install-trigger] # Optionally download git-url (and pin to the specified branch/commit/tag) & run install trigger for active plugins (or only core ones)
plugin:installed # Checks if a plugin is installed
plugin:install-dependencies [--core] # Run install-dependencies trigger for active plugins (or only core ones)
-plugin:list # Print active plugins
+plugin:list [--format stdout|json] # Print active plugins
plugin:trigger . # Trigger an arbitrary plugin hook
plugin:uninstall # Uninstall a plugin (third-party only)
-plugin:update [name [committish]] # Optionally update named plugin from git (with custom tag/committish) & run update trigger for active plugins
+plugin:update [name [branch|commit|tag]] # Optionally update named plugin from git (and pin to the specified branch/commit/tag) & run update trigger for active plugins
```
```shell
@@ -35,38 +36,72 @@ dokku plugin:list
```
plugn: dev
- 00_dokku-standard 0.26.8 enabled dokku core standard plugin
- 20_events 0.26.8 enabled dokku core events logging plugin
- app-json 0.26.8 enabled dokku core app-json plugin
- apps 0.26.8 enabled dokku core apps plugin
- build-env 0.26.8 enabled dokku core build-env plugin
- buildpacks 0.26.8 enabled dokku core buildpacks plugin
- certs 0.26.8 enabled dokku core certificate management plugin
- checks 0.26.8 enabled dokku core checks plugin
- common 0.26.8 enabled dokku core common plugin
- config 0.26.8 enabled dokku core config plugin
- docker-options 0.26.8 enabled dokku core docker-options plugin
- domains 0.26.8 enabled dokku core domains plugin
- enter 0.26.8 enabled dokku core enter plugin
- git 0.26.8 enabled dokku core git plugin
- logs 0.26.8 enabled dokku core logs plugin
- network 0.26.8 enabled dokku core network plugin
- nginx-vhosts 0.26.8 enabled dokku core nginx-vhosts plugin
- plugin 0.26.8 enabled dokku core plugin plugin
- proxy 0.26.8 enabled dokku core proxy plugin
- ps 0.26.8 enabled dokku core ps plugin
- repo 0.26.8 enabled dokku core repo plugin
- resource 0.26.8 enabled dokku core resource plugin
- scheduler-docker-local 0.26.8 enabled dokku core scheduler-docker-local plugin
- shell 0.26.8 enabled dokku core shell plugin
- ssh-keys 0.26.8 enabled dokku core ssh-keys plugin
- storage 0.26.8 enabled dokku core storage plugin
- tags 0.26.8 enabled dokku core tags plugin
- tar 0.26.8 enabled dokku core tar plugin
- trace 0.26.8 enabled dokku core trace plugin
-```
-
-> Warning: All plugin commands other than `plugin:list` and `plugin:help` require sudo access and must be run directly from the Dokku server.
+ 00_dokku-standard 0.38.25 enabled dokku core standard plugin
+ 20_events 0.38.25 enabled dokku core events logging plugin
+ app-json 0.38.25 enabled dokku core app-json plugin
+ apps 0.38.25 enabled dokku core apps plugin
+ build-env 0.38.25 enabled dokku core build-env plugin
+ buildpacks 0.38.25 enabled dokku core buildpacks plugin
+ certs 0.38.25 enabled dokku core certificate management plugin
+ checks 0.38.25 enabled dokku core checks plugin
+ common 0.38.25 enabled dokku core common plugin
+ config 0.38.25 enabled dokku core config plugin
+ docker-options 0.38.25 enabled dokku core docker-options plugin
+ domains 0.38.25 enabled dokku core domains plugin
+ enter 0.38.25 enabled dokku core enter plugin
+ git 0.38.25 enabled dokku core git plugin
+ logs 0.38.25 enabled dokku core logs plugin
+ network 0.38.25 enabled dokku core network plugin
+ nginx-vhosts 0.38.25 enabled dokku core nginx-vhosts plugin
+ plugin 0.38.25 enabled dokku core plugin plugin
+ proxy 0.38.25 enabled dokku core proxy plugin
+ ps 0.38.25 enabled dokku core ps plugin
+ repo 0.38.25 enabled dokku core repo plugin
+ resource 0.38.25 enabled dokku core resource plugin
+ scheduler-docker-local 0.38.25 enabled dokku core scheduler-docker-local plugin
+ shell 0.38.25 enabled dokku core shell plugin
+ ssh-keys 0.38.25 enabled dokku core ssh-keys plugin
+ storage 0.38.25 enabled dokku core storage plugin
+ tags 0.38.25 enabled dokku core tags plugin
+ tar 0.38.25 enabled dokku core tar plugin
+ trace 0.38.25 enabled dokku core trace plugin
+```
+
+The list can also be emitted as JSON via the `--format json` flag. In addition to the name, version, enabled state, and description shown in the default output, the JSON output includes whether a plugin is a core plugin and - for git-based third-party plugins - the install source (the git remote URL, the currently checked-out commit, and the followed branch). This is useful for tooling that reconstructs a server's set of installed plugins:
+
+```shell
+dokku plugin:list --format json
+```
+
+```json
+[
+ {
+ "name": "apps",
+ "version": "0.38.25",
+ "enabled": true,
+ "core": true,
+ "description": "dokku core apps plugin",
+ "source_url": "",
+ "committish": "",
+ "branch": ""
+ },
+ {
+ "name": "postgres",
+ "version": "1.42.0",
+ "enabled": true,
+ "core": false,
+ "description": "dokku postgres service plugin",
+ "source_url": "https://github.com/dokku/dokku-postgres.git",
+ "committish": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
+ "branch": "master"
+ }
+]
+```
+
+The `source_url`, `committish`, and `branch` fields are only populated for plugins installed from a git repository. They are empty for core plugins as well as for plugins installed from a tarball or a local `file://` path. When a plugin is pinned to a specific commit or tag (a detached checkout), the `branch` field is empty while `committish` still reports the exact commit.
+
+> [!WARNING]
+> All plugin commands other than `plugin:list` and `plugin:help` require sudo access and must be run directly from the Dokku server.
### Checking if a plugin is installed
@@ -78,6 +113,9 @@ dokku plugin:installed postgres
### Installing a plugin
+> [!NOTE]
+> Plugins installed in this method within a [docker-based installation](/docs/getting-started/install/docker.md) of Dokku do not persist across installs. Please see the [plugin installation section](/docs/getting-started/install/docker.md#plugin-installation) of the docker-based installation docs for further details.
+
Installing a plugin is easy as well using the `plugin:install` command. This command will also trigger the `install` pluginhook on all existing plugins.
The most common usage is to install a plugin from a url. This url may be any of the following:
@@ -123,6 +161,12 @@ The `--core` flag may also be indicated as the sole argument, though it is only
dokku plugin:install --core
```
+If installing plugins in a Dockerfile, you will want to skip the `install` trigger. This will be run on container boot.
+
+```shell
+dokku plugin:install https://github.com/dokku/smoke-test-plugin.git --name smoke-test-plugin --skip-install-trigger
+```
+
Finally, all flags may be omitted to trigger the `install` procedures for both core and third-party plugins:
```shell
@@ -163,6 +207,12 @@ An optional commit SHA-like object may be specified.
dokku plugin:update postgres 2.0.0
```
+Any future invocation of `plugin:update` will respect the previously specified SHA-like object. To follow a particular branch again, specify that branch:
+
+```shell
+dokku plugin:update postgres main
+```
+
### Uninstalling a plugin
Third party plugins can be uninstalled using the `plugin:uninstall` command:
diff --git a/docs/advanced-usage/registry-management.md b/docs/advanced-usage/registry-management.md
index c7882b760b8..c483eff37b7 100644
--- a/docs/advanced-usage/registry-management.md
+++ b/docs/advanced-usage/registry-management.md
@@ -1,11 +1,13 @@
# Registry Management
+> [!IMPORTANT]
> New as of 0.25.0
```
-registry:login [--password-stdin] [] # Login to a docker registry
-registry:report [] [] # Displays a registry report for one or more apps
-registry:set () # Set or clear a registry property for an app
+registry:login [--global|--password-stdin] [] [] # Login to a docker registry
+registry:logout [--global] [] # Logout from a docker registry
+registry:report [] [] # Displays a registry report for one or more apps
+registry:set |--global () # Set or clear a registry property for an app
```
The registry plugin enables interacting with remote registries, which is useful when either deploying images via `git:from-image` or when interacting with custom schedulers to deploy built image artifacts.
@@ -14,34 +16,75 @@ The registry plugin enables interacting with remote registries, which is useful
### Logging into a registry
-The `registry:login` command can be used to log into a docker registry. The following are examples for logging into various common registries:
+The `registry:login` command can be used to log into a docker registry. Credentials can be stored globally (for all apps) or on a per-app basis.
+
+#### Global login
+
+To log in globally (credentials shared by all apps), use the `--global` flag:
```shell
# hub.docker.com
-dokku registry:login docker.io $USERNAME $PASSWORD
+dokku registry:login --global docker.io $USERNAME $PASSWORD
# digitalocean
# the username and password are both defined as the same api token
-dokku registry:login registry.digitalocean.com $DIGITALOCEAN_API_TOKEN $DIGITALOCEAN_API_TOKEN
+dokku registry:login --global registry.digitalocean.com $DIGITALOCEAN_API_TOKEN $DIGITALOCEAN_API_TOKEN
# github container registry
# see the following link for information on retrieving a personal access token
# https://docs.github.com/en/packages/guides/pushing-and-pulling-docker-images#authenticating-to-github-container-registry
-dokku registry:login ghcr.io $USERNAME $REGISTRY_PAT_TOKEN
+dokku registry:login --global ghcr.io $USERNAME $REGISTRY_PAT_TOKEN
# quay
# a robot user may be used to login
-dokku registry:login quay.io $USERNAME $PASSWORD
+dokku registry:login --global quay.io $USERNAME $PASSWORD
+```
+
+> [!NOTE]
+> For backwards compatibility, if the `--global` flag is omitted and only three arguments are provided (server, username, password), the command will behave as a global login but will show a deprecation warning.
+
+#### Per-app login
+
+To log in for a specific app, specify the app name as the first argument:
+
+```shell
+# log into docker.io for a specific app
+dokku registry:login node-js-app docker.io $USERNAME $PASSWORD
+
+# log into ghcr.io for a specific app
+dokku registry:login node-js-app ghcr.io $USERNAME $REGISTRY_PAT_TOKEN
```
-For security reasons, the password may also be specified as stdin by specifying the `--password-stdin` flag. This is supported regardless of the registry being logged into.
+Per-app credentials are stored in `/var/lib/dokku/config/registry/$APP/config.json` and are automatically used for docker operations (build, push, pull) for that specific app.
+
+#### Password via stdin
+
+For security reasons, the password may also be specified as stdin by specifying the `--password-stdin` flag. This is supported for both global and per-app logins:
```shell
-echo "$PASSWORD" | dokku registry:login --password-stdin docker.io $USERNAME
+# global login via stdin
+echo "$PASSWORD" | dokku registry:login --global --password-stdin docker.io $USERNAME
+
+# per-app login via stdin
+echo "$PASSWORD" | dokku registry:login node-js-app --password-stdin docker.io $USERNAME
```
For certain Docker registries - such as Amazon ECR or Google's GCR registries - users may instead wish to use a docker credential helper to automatically authenticate against a server; please see the documentation regarding the credential helper in question for further setup instructions.
+### Logging out from a registry
+
+The `registry:logout` command can be used to log out from a docker registry:
+
+```shell
+# global logout
+dokku registry:logout --global docker.io
+
+# per-app logout
+dokku registry:logout node-js-app docker.io
+```
+
+When an app is destroyed, any per-app registry credentials are automatically removed.
+
### Setting a remote server
To specify a remote server registry for pushes, set the `server` property via the `registry:set` command. The default value for this property is empty string. Setting the value to `docker.io` or `hub.docker.com` will result in the computed value being empty string (as that is the default, implicit registry), while any non-zero length value will have a `/` appended to it if there is not one already.
@@ -69,22 +112,22 @@ dokku registry:set --global server
The following are the values that should be used for common remote servers:
- Amazon Elastic Container Registry:
- - value: `$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/`
- - notes: The `$AWS_ACCOUNT_ID` and `$AWS_REGION` should match the values for your account and region, respectively. Additionally, an IAM profile that allows `push` access to the repository specified by `image-repo` should be attached to your Dokku server.
+ - value: `$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/`
+ - notes: The `$AWS_ACCOUNT_ID` and `$AWS_REGION` should match the values for your account and region, respectively. Additionally, an IAM profile that allows `push` access to the repository specified by `image-repo` should be attached to your Dokku server.
- Azure Container Registry:
- - value `$REGISTRY_NAME.azurecr.io/`
- - notes: The `$AKS_REGISTRY_NAME` should match the name of the registry created on your account.
+ - value `$REGISTRY_NAME.azurecr.io/`
+ - notes: The `$AKS_REGISTRY_NAME` should match the name of the registry created on your account.
- Docker Hub:
- - value: `docker.io/`
- - notes: Requires owning the namespace used in the `image-repo` value.
+ - value: `docker.io/`
+ - notes: Requires owning the namespace used in the `image-repo` value.
- Digitalocean:
- - value: `registry.digitalocean.com/`
- - notes: Requires setting the correct `image-repo` value for your registry.
+ - value: `registry.digitalocean.com/`
+ - notes: Requires setting the correct `image-repo` value for your registry.
- Github Container Registry:
- - value: `ghcr.io/`
- - notes: Requires that the authenticated user has access to the namespace used in the `image-repo` value.
+ - value: `ghcr.io/`
+ - notes: Requires that the authenticated user has access to the namespace used in the `image-repo` value.
- Quay.io:
- - value: `quay.io/`
+ - value: `quay.io/`
### Specifying an image repository name
@@ -98,7 +141,31 @@ Setting the property value to an empty string will reset the value to the system
```shell
# per-app
-dokku registry:set node-js-app push-on-release
+dokku registry:set node-js-app image-repo
+```
+
+### Templating the image repository name
+
+Instead of setting the image repository name on a per-app basis, it can be set via a template with the `image-repo-template` property. The property can be set globally or for a specific app, with the per-app value overriding the global value when both are present:
+
+```shell
+# globally
+dokku registry:set --global image-repo-template "my-awesome-prefix/{{ .AppName }}"
+
+# per-app
+dokku registry:set node-js-app image-repo-template "my-awesome-prefix/{{ .AppName }}-prod"
+```
+
+Dokku uses a Golang template and has access to the `AppName` variable as shown above. The per-app `image-repo` property always takes precedence over the rendered template when both are set.
+
+Setting the property value to an empty string will reset the value to the system default. Resetting the value can be done per app or globally.
+
+```shell
+# per-app
+dokku registry:set node-js-app image-repo-template
+
+# globally
+dokku registry:set --global image-repo-template
```
### Pushing images on build
@@ -124,3 +191,53 @@ dokku registry:set node-js-app push-on-release
# globally
dokku registry:set --global push-on-release
```
+
+#### Recovering from local image GC
+
+When `push-on-release` is enabled, Dokku treats the remote registry as the canonical store for app images. If a local image disappears - for example because a `docker image prune` cron ran, the host rebooted, or an operator removed it manually - subsequent commands that need the image (`ps:restart`, `ps:scale`, `dokku run`, `domains:add`, `certs:add`, etc.) will pull the missing tag back from the registry automatically. Per-app registry credentials configured via `registry:login` are honored during the pull. This recovery covers the deployed numeric tag pushed by the registry plugin - a missing `latest` tag will be ignored.
+
+### Push extra tags
+
+To push the image on release with extra tags, set the `push-extra-tags` to a comma-separated list of tags via the `registry:set` command. The default value for this property is empty. Setting the property will result in the image being tagged with extra tags every release.
+
+```shell
+# multiple-tags
+dokku registry:set node-js-app push-extra-tags foo,bar
+```
+The `push-extra-tags` can be set to a single tag too.
+
+```shell
+# single tag
+dokku registry:set node-js-app push-extra-tags foo
+```
+
+This property can be set for a single app or globally via the `--global` flag. When set globally, the app-specific value will always overide the global value. The default global value for this property is `false`.
+
+```shell
+dokku registry:set --global push-extra-tags foo,bar
+```
+
+Setting the property value to an empty string will reset the value to the system default. Resetting the value can be done per app or globally.
+
+```shell
+# per-app
+dokku registry:set node-js-app push-extra-tags
+
+# globally
+dokku registry:set --global push-extra-tags
+```
+
+## Properties
+
+### Settable properties
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `registry:report`. The JSON keys emitted by `registry:report --format json` are the same names with the leading `--registry-` stripped (e.g. `image-repo`, `global-server`, `computed-push-on-release`). Legacy keys with the `registry-` prefix (e.g. `registry-image-repo`) are also emitted during the 0.38.x deprecation window and will be removed in a future major release.
+
+| Property | Scope | Default | Report flags | Description |
+|---|---|---|---|---|
+| `image-repo` | app only | `dokku/` | `--registry-image-repo`, `--registry-computed-image-repo` | Repository name used when pushing the app's image (overrides the global template) |
+| `image-repo-template` | app + global | none | `--registry-image-repo-template`, `--registry-global-image-repo-template`, `--registry-computed-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`, `--registry-global-push-extra-tags`, `--registry-computed-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 |
diff --git a/docs/advanced-usage/repository-management.md b/docs/advanced-usage/repository-management.md
index e8235f86326..5e1c67ccfcb 100644
--- a/docs/advanced-usage/repository-management.md
+++ b/docs/advanced-usage/repository-management.md
@@ -1,5 +1,6 @@
# Repository Management
+> [!IMPORTANT]
> New as of 0.6.0
```
diff --git a/docs/advanced-usage/resource-management.md b/docs/advanced-usage/resource-management.md
index 24ebaf7356c..804397489a1 100644
--- a/docs/advanced-usage/resource-management.md
+++ b/docs/advanced-usage/resource-management.md
@@ -1,5 +1,6 @@
# Resource Management
+> [!IMPORTANT]
> New as of 0.15.0
```
@@ -16,7 +17,8 @@ The resource plugin is meant to allow users to limit or reserve resources for a
By default, Dokku allows unlimited resource access to apps deployed on a server. In some cases, it may be desirable to limit this on a per-app or per-process-type basis. The `resource` plugin allows management of both resource "limits" and resource "reservations", where each resource request type has specific meaning to the scheduler in use for a given app.
-> Warning: The meaning of a values and it's units are specific to the scheduler in use for a given app. If a value is incorrect for a scheduler, this may result in containers failing to start correctly. If a scheduler does not support a given resource type combination, it will be ignored. All resource commands require an app rebuild or deploy in order to take effect.
+> [!WARNING]
+> The meaning of a values and it's units are specific to the scheduler in use for a given app. If a value is incorrect for a scheduler, this may result in containers failing to start correctly. If a scheduler does not support a given resource type combination, it will be ignored. All resource commands require an app rebuild or deploy in order to take effect.
Valid resource options include:
@@ -28,9 +30,9 @@ Valid resource options include:
- `--network-egress`
- `--nvidia-gpu`
-See the [Supported Resource Management Properties](/docs/advanced-usage/schedulers/docker-local.md#supported-resource-management-properties) section of the docker local scheduler documentation for more information on how each resource limit maps to Docker.
+See the [Supported Resource Management Properties](/docs/deployment/schedulers/docker-local.md#supported-resource-management-properties) section of the docker local scheduler documentation for more information on how each resource limit maps to Docker.
-Resource limits and reservations are applied only during the `run` and `deploy` phases of an application, and will not impact the `build` phase of an application.
+Resource reservations are applied only during the `run` and `deploy` phases of an application. Resource limits also apply during the `build` phase when explicitly configured against the `build` process type - see [Build-time Resource Limits](#build-time-resource-limits) below.
### Resource Limits
@@ -118,6 +120,40 @@ dokku resource:limit --process-type web node-js-app
nvidia-gpu:
```
+#### Build-time Resource Limits
+
+> [!IMPORTANT]
+> New as of 0.38.0
+
+Resource limits may be applied to the build container by using the special `build` process type. This allows constraining memory and CPU usage during the `build` phase, which is otherwise unconstrained.
+
+```shell
+dokku resource:limit --memory 4g --process-type build node-js-app
+```
+
+```
+=====> Setting resource limits for node-js-app (build)
+ memory: 4g
+```
+
+Build-time limits are applied via the `docker-args-process-build` plugin trigger. They do not inherit from default (`_default_`) limits - only limits explicitly set against the `build` process type are applied at build time. This is intentional: build phases often require more memory than the runtime process, and silently inheriting a small runtime limit would cause confusing OOM failures.
+
+> [!WARNING]
+> Do not use `build` as a runtime process type in your `Procfile`. The `build` name is reserved by the resource plugin to scope limits to the build container, and using it as a Procfile entry will cause those limits to be applied to that runtime container as well.
+
+Supported limits per builder:
+
+| Builder | `--cpu` | `--memory` | `--memory-swap` | `--nvidia-gpu` |
+|------------|---------|------------|-----------------|----------------|
+| herokuish | yes | yes | yes | yes |
+| dockerfile | no | yes | yes | no |
+| pack | no | no | no | no |
+| nixpacks | no | no | no | no |
+| railpack | no | no | no | no |
+| lambda | no | no | no | no |
+
+Resource keys outside the supported set for a builder are silently ignored. Reservations (`resource:reserve`) are never applied at build time - only limits.
+
#### Clearing Resource Limits
In cases where the values are incorrect - or there is no desire to limit resources - resource limits may be cleared using the `resource:limit-clear` command.
diff --git a/docs/appendices/0.10.0-migration-guide.md b/docs/appendices/0.10.0-migration-guide.md
index 95940eeb9ba..ec3aa37336a 100644
--- a/docs/appendices/0.10.0-migration-guide.md
+++ b/docs/appendices/0.10.0-migration-guide.md
@@ -4,10 +4,10 @@
By default, Dokku will ship a PCI Compliant nginx configuration. For developers whose users are on older browsers or mobile devices, you may need to ship a custom `nginx.conf.sigil` to enable ciphers for older browsers.
-See the [nginx customization](/docs/configuration/nginx/#customizing-the-nginx-configuration) docs for more details.
+See the [nginx customization](/docs/networking/proxies/nginx.md#customizing-the-nginx-configuration) docs for more details.
## Nginx Error Pages
We now ship with nicer error pages by default. You are free to customize your Dokku installation via a custom `nginx.conf.sigil` to change what error pages are displayed in different circumstances.
-See the [nginx customization](/docs/configuration/nginx/#customizing-the-nginx-configuration) docs for more details.
+See the [nginx customization](/docs/networking/proxies/nginx.md#customizing-the-nginx-configuration) docs for more details.
diff --git a/docs/appendices/0.21.0-migration-guide.md b/docs/appendices/0.21.0-migration-guide.md
index 2f16cdb6ec0..a2131da6a44 100644
--- a/docs/appendices/0.21.0-migration-guide.md
+++ b/docs/appendices/0.21.0-migration-guide.md
@@ -8,7 +8,7 @@ The `tls` name is no longer a reserved app name, and can be used by applications
- `git#git_deploy_branch()` is deprecated in favor of `plugn trigger git-deploy-branch`.
- The `config` command is deprecated in favor of `config:show`.
- - Usage of this command in conjunction with either the `--export` or `--shell` flag is deprecated in favor of `config:export --format` with the correct format value (`exports` or `shell`, respectively).
+ - Usage of this command in conjunction with either the `--export` or `--shell` flag is deprecated in favor of `config:export --format` with the correct format value (`exports` or `shell`, respectively).
- The `nginx:build-config` command is deprecated in favor of `proxy:build-config`.
## Removals
diff --git a/docs/appendices/0.23.0-migration-guide.md b/docs/appendices/0.23.0-migration-guide.md
index b46cb8bc434..2853eafde9d 100644
--- a/docs/appendices/0.23.0-migration-guide.md
+++ b/docs/appendices/0.23.0-migration-guide.md
@@ -4,5 +4,5 @@
- The `plugin:list` command no longer outputs the version for the `plugn` binary.
- Users building docker images that run Dokku will need to use a new sudoer wrapper for the `docker-image-labeler` binary to work correctly. A reference version has been placed in the `docker` skeleton directory. This should only impact platform developers, and users of our Docker image will already have the file available.
-- The `dokku` user's cron is now in use by Dokku itself. Customizations will be overwritten. Users are encouraged to use a cron entry in `/etc/cron.d/dokku` to avoid this issue.
+- The `dokku` user's cron is now in use by Dokku itself. Customizations will be overwritten. Users are encouraged to use a cron file at `/etc/cron.d/dokku` to avoid this issue.
- As of 0.23.0, Dokku will now inject the `max-size` log driver option for applications. This is restricted to app-configured log driver values empty, `local` or `json-file` in 0.23.1 to increase setup compatibility. Users who configure alternative log drivers at the system level will need to either set the global `max-size` property to `unlimited` or switch to the built-in `vector` logging support.
diff --git a/docs/appendices/0.25.0-migration-guide.md b/docs/appendices/0.25.0-migration-guide.md
index 0730217dbfd..c6ebb660988 100644
--- a/docs/appendices/0.25.0-migration-guide.md
+++ b/docs/appendices/0.25.0-migration-guide.md
@@ -7,7 +7,9 @@ The [dokku-registry](https://github.com/dokku/dokku-registry) plugin is now buil
- Builder plugins should call `post-release-builder` at the end of the build.
- The `push` and `pull` command are not implemented. Users wishing to deploy a remote image should use `git:from-image`. Image pushing is not available at this time.
- At this time, remote docker repositories are not automatically created for AWS, and users must create those repositories for their applications as necessary. This may be implemented in the future.
-- Docker images are only pushed when configured to do so. See the [registry management documentation](/docs/deployment/registry-management.md) for more details.
+- Docker images are only pushed when configured to do so. See the [registry management documentation](/docs/advanced-usage/registry-management.md) for more details.
+
+Before upgrading, uninstall the registry plugin via `dokku plugin:uninstall registry`. Not doing so will cause issues with Dokku.
## Other
@@ -17,7 +19,7 @@ The [dokku-registry](https://github.com/dokku/dokku-registry) plugin is now buil
- The `dokku run` command now always removes the ephemeral container on exit. Users that need a persistent container should instead specify a `console` process type in their `Procfile` specifying an available shell (usually either `bash` or `sh`) and scale that container appropriately.
- The `pre-deploy` plugin trigger is now called internally by Dokku. Scheduler plugins should avoid calling this trigger, as any image changes introduced by subsequent trigger calls will be ignored.
- The default image used for Herokuish Buildpack builds is now `gliderlabs/herokuish:latest-20`, and is based on both the `heroku-20` stack as well as Ubuntu 20.04. Users that wish to stick with the old, `heroku-18`/Ubuntu 18.04 builder may specify `gliderlabs/herokuish:latest-18` as their builder image. Please see the [herokuish buildpack deployment documentation](/docs/deployment/builders/herokuish-buildpacks.md#customizing-the-buildpack-stack-builder) for more information on how to specify a custom buildpack stack builder.
- - This change does not impact any users of Cloud Native Buildpacks.
+ - This change does not impact any users of Cloud Native Buildpacks.
- We fixed an issue that required extracting Procfiles at the beginning of a deploy. Due to this change, a `Dockerfile` app contains a `Procfile` that does not specify a `web` process will fail to start. Usage of a `Procfile` with _only_ a `release` command should be replaced with a `scripts.dokku.postdeploy` deployment task in the `app.json` file. The alternative is to define the `web` process in the `Procfile`. See the [deployment task documentation](/docs/advanced-usage/deployment-tasks.md) for more information.
### Deprecations
diff --git a/docs/appendices/0.26.0-migration-guide.md b/docs/appendices/0.26.0-migration-guide.md
index b752e8cc2c4..dbb3af106cd 100644
--- a/docs/appendices/0.26.0-migration-guide.md
+++ b/docs/appendices/0.26.0-migration-guide.md
@@ -9,4 +9,4 @@
- The `scheduler` plugin now controls the scheduler in use for deploys. Apps will have their `DOKKU_SCHEDULER` environment variables migrated to the scheduler plugin, after which that value will be removed from said app. Please see the [scheduler documentation](/docs/deployment/schedulers/scheduler-management.md) for more information.
- The `deploy-source` metadata from `apps:report` is now no longer computed on the fly, but hydrated at deploy time via the `deploy-source-set` trigger. This value may be empty until your next deploy.
- - Additionally, the `deploy-source` trigger has now been removed.
+ - Additionally, the `deploy-source` trigger has now been removed.
diff --git a/docs/appendices/0.27.0-migration-guide.md b/docs/appendices/0.27.0-migration-guide.md
new file mode 100644
index 00000000000..1519f4b5b91
--- /dev/null
+++ b/docs/appendices/0.27.0-migration-guide.md
@@ -0,0 +1,14 @@
+# 0.27.0 Migration Guide
+
+## Changes
+
+- Renaming an application will now only rename domains that are associated with global domains. As an example:
+
+ ```shell
+ dokku domains:set-global dokku.me
+ dokku apps:create node-js-app
+ dokku domains:set node-js-app node-js-app.dokku.me node-js-app.dokku.com
+ dokku apps:rename node-js-app other-name
+ dokku domains:report node-js-app --domains-app-vhosts
+ # output: other-name.dokku.me node-js-app.dokku.com
+ ```
diff --git a/docs/appendices/0.28.0-migration-guide.md b/docs/appendices/0.28.0-migration-guide.md
new file mode 100644
index 00000000000..e308cf388ae
--- /dev/null
+++ b/docs/appendices/0.28.0-migration-guide.md
@@ -0,0 +1,25 @@
+# 0.28.0 Migration Guide
+
+## Removals
+
+Support for the following operating systems has been removed:
+
+- CentOS 7
+- Debian 9 (Stretch)
+- Fedora
+- OpenSuse
+
+Dokku will no longer provide packages for RPM based systems. Debian 9 users _may_ use new Debian packages, though support is not guaranteed.
+
+All users are encouraged to install Dokku via the [Docker-based installation method](/docs/getting-started/install/docker.md), or switch to a supported operating system.
+
+## Deprecations
+
+Ubuntu 18.04 is now a deprecated installation target. The operating system will be considered EOL by Canonical in April 2023. Users are encouraged to upgrade to Ubuntu 22.04 or consider switching their instllation method to the [Docker-based installation method](/docs/getting-started/install/docker.md) to avoid any disruption in usage.
+
+## Additions
+
+New in 0.28.0 are the Caddy, Haproxy and Traefik plugins. As community plugins wrapping these proxies exist, users should:
+
+- Recommended: Uninstall the community plugin in question and switch all config to the new plugins.
+- Upgrade the community plugin to a version that does not use the `proxy:set` value of `caddy`, `haproxy` or `traefik`.
diff --git a/docs/appendices/0.29.0-migration-guide.md b/docs/appendices/0.29.0-migration-guide.md
new file mode 100644
index 00000000000..bd1e08ea654
--- /dev/null
+++ b/docs/appendices/0.29.0-migration-guide.md
@@ -0,0 +1,19 @@
+# 0.29.0 Migration Guide
+
+## Changes
+
+- The output of `run:detached` now uses the container name - eg. `node-js-app.run.1` - vs the container id.
+- The ID of `cron` tasks is now base36-encoded instead of base64-encoded.
+- The `nginx.conf.sigil` is now extracted when source code is extracted for a build and not from the built image. Users can specify alternative paths via the `nginx-conf-sigil-path` property of the `nginx` plugin. See the [nginx documentation](/docs/networking/proxies/nginx.md#customizing-the-nginx-configuration) for more information on how to configure the `nginx.conf.sigil` path for your application.
+ - For deploys via `git:from-image`, the `nginx.conf.sigil` file will be extracted from the source image, respecting the value of `nginx-conf-sigil-path`.
+- The `Procfile` is now extracted when source code is extracted for a build and not from the built image. Users can specify alternative paths via the `procfile-path` property of the `ps` plugin. See the [process management documentation](/docs/processes/process-management.md#changing-the-procfile-location) for more information on how to configure the `Procfile` path for your application.
+ - For deploys via `git:from-image`, the `Procfile` file will be extracted from the source image, respecting the value of `procfile-path`.
+- The existing `pre-restore` hook has been renamed to `scheduler-pre-restore`. There is a new `pre-restore` hook that is triggered within the `ps:restore` command prior to restoring any apps.
+- Nginx init commands are now performed via systemctl on Ubuntu systems when `/usr/bin/systemctl` is available.
+
+## Removals
+
+- The `DOKKU_WAIT_TO_RETIRE` environment variable has been migrated to a `checks` property named `wait-to-retire` and will be ignored if set as an environment variable.
+- The `domains-setup` trigger has been removed. Initial app domains will now be automatically setup during app creation.
+- The `URLS` file containing generated urls for an app is no longer generated or referenced. Users should retrieve app urls via the new `domains-urls` plugin trigger.
+- The common function `get_app_urls` has been removed. Users should retrieve app urls via the new `domains-urls` plugin trigger.
diff --git a/docs/appendices/0.30.0-migration-guide.md b/docs/appendices/0.30.0-migration-guide.md
new file mode 100644
index 00000000000..531a417ea21
--- /dev/null
+++ b/docs/appendices/0.30.0-migration-guide.md
@@ -0,0 +1,41 @@
+# 0.30.0 Migration Guide
+
+> **Important**: Due to the removal of `DOKKU_SCALE` support, users with a version older than 0.25.x are heavily encouraged to upgrade to 0.29.x prior to 0.30.x. Not doing so will result in all app containers stopping on rebuild due to having no scale settings.
+
+## Deprecations
+
+- Support for Ubuntu 18.04 has been deprecated. Please upgrade your host OS in advance of the [End Of Life in April 2023](https://wiki.ubuntu.com/BionicBeaver/ReleaseNotes).
+
+## Changes
+
+- The `app.json` file is now extracted from the source code instead of the built image. For deploys via `git:from-image`, the file is extracted from the built image.
+
+## Removals
+
+- Support for [SPDY](https://en.wikipedia.org/wiki/SPDY) has been removed. No major browser supports it as of 2021. Custom `nginx.conf.sigil` templates referencing spdy-related variables will continue to build until the 1.0.0 release.
+- Support for the `DOKKU_SCALE` file - deprecated in 0.25.0 - has been removed in favor of the `formation` key in the `app.json` file. Please see the [process management documentation](/docs/processes/process-management.md#manually-managing-process-scaling) for more information on how to use the `formation` key of the `app.json` file.
+- The deprecated `--detach` global flag for `dokku run` was removed. Please see the [one-off tasks documentation](/docs/processes/one-off-tasks.md#running-a-detached-container) for more information on running detached containers.
+- The following deprecated trigger have been removed in favor of the `post-release-builder` trigger. See the [plugin triggers documentation](https://dokku.com/docs/development/plugin-triggers/#post-release-builder) for more details.
+ - `post-release-buildpack`
+ - `post-release-dockerfile`
+ - `post-release-pack`
+- The ability to call `logs:failed` without specifying an app or `--all` flag has been removed. This was deprecated in 0.22.0. Please see the [logs:failed](/docs/deployment/logs.md#failed-deploy-logs).
+- The following app shell functions - deprecated since 0.20.0 - have been removed in favor of their plugin trigger equivalents. Sourcing the `app/functions` file will fail going forward.
+ - `apps#apps_create()` is removed in favor of `plugn trigger app-create`.
+ - `apps#apps_destroy()` is removed in favor of `plugn trigger app-destroy`.
+ - `apps#apps_exists()` is removed in favor of `plugn trigger app-exists`.
+ - `apps#apps_maybe_create()` is removed in favor of `plugn trigger app-maybe-create`.
+- The following common shell functions have been removed:
+ - `common#is_container_running()` (deprecated since 0.12.6) is removed in favor of `common#is_container_status()`.
+ - `common#is_app_running()` (deprecated since 0.22.0) is removed in favor of `ps#fn-ps-is-app-running()`.
+- The global `--rm-container` and `--rm` flags - deprecated since 0.25.0 - have been removed.
+- The following git shell functions have been removed:
+ - `git#use_git_worktree()` (deprecated since 0.23.7) has been removed. There is no alternative as the function has been made internal.
+ - `git#git_deploy_branch()`(deprecated since 0.21.0) has been removed in favor of `plugn trigger git-deploy-branch`.
+- The following nginx commands - deprecated since 0.20.0 - have been removed:
+ - `nginx:show-conf` has been removed in favor of `nginx:show-config`.
+ - `nginx:validate` has been removed in favor of `nginx:validate-config`.
+ - `nginx:build-config` - deprecated since 0.21.0 - has been removed in favor of `proxy:build-config`.
+- The following proxy functions - deprecated since 0.20.0 - have been removed in favor of their plugin trigger equivalents. Sourcing the `proxy/functions` file will fail going forward.
+ - `proxy#is_app_proxy_enabled()` is removed in favor of `plugn trigger proxy-is-enabled`.
+ - `proxy#get_app_proxy_type()` is removed in favor of `plugn trigger proxy-type`.
diff --git a/docs/appendices/0.31.0-migration-guide.md b/docs/appendices/0.31.0-migration-guide.md
new file mode 100644
index 00000000000..a5636568b2e
--- /dev/null
+++ b/docs/appendices/0.31.0-migration-guide.md
@@ -0,0 +1,36 @@
+# 0.31.0 Migration Guide
+
+## Changes
+
+- Herokuish build cache is now mounted from a docker volume - eg. `cache-node-js-app` - instead of the local filesystem. All existing app cache will be cleared upon upgrading past 0.29.0.
+- The `vector` container integration now mounts config to `/etc/vector` instead of the path `/etc/vector/vector.json`, allowing users the ability to provide extra configuration for Vector Sinks. To take advantage of the new functionality, the vector container should be stopped (via `dokku logs:vector-stop`) and then started (via `dokku logs:vector-start`).
+- The `traefik` integration now mounts config to `/data` instead of the path `/acme.json`, fixing permissions issues under certain architectures. To take advantage of the new functionality, the traefik container should be stopped (via `dokku traefik:stop`) and then started (via `dokku traefik:start`).
+- Users no longer need to clear the `source-image` git property when transitioning from image-based deploys (`git:from-image` and `git:load-image`) to other deployment methods (git push, `git:from-archive`, `git:sync`).
+- For deploys via the `git:from-image` and `git:load-image` commands, the `CHECKS` file is now extracted from the configured `WORKDIR` property of the image. For all other deploys - git push, `git:from-archive`, `git:sync` - will have the `CHECKS` extracted directly from the source code. The filename in both cases is `CHECKS` and cannot be modified.
+- Port mappings are now auto-detected during the build process. Users may override detected port mappings via the `ports` plugin. A default port mapping of `http:80:5000` will be used if none is otherwise specified.
+- Users building docker images that run Dokku will need to use a new sudoer wrapper for the `docker-container-healthchecker` binary to work correctly. A reference version has been placed in the `docker` skeleton directory. This should only impact platform developers, and users of our Docker image will already have the file available.
+- The default image used for Herokuish Buildpack builds is now `gliderlabs/herokuish:latest-22`, and is based on both the `heroku-22` stack as well as Ubuntu 22.04. Users that wish to stick with the old, `heroku-20`/Ubuntu 20.04 builder may specify `gliderlabs/herokuish:latest-20` as their builder image. Please see the [herokuish buildpack deployment documentation](/docs/deployment/builders/herokuish-buildpacks.md#customizing-the-buildpack-stack-builder) for more information on how to specify a custom buildpack stack builder.
+- The default image used for Cloud Native Buildpack builds is now `heroku/builder:22`, and is based on both the `heroku-22` stack as well as Ubuntu 22.04. Users that wish to stick with the old, `heroku-20`/Ubuntu 20.04 builder may specify `heroku/buildpacks:20` as their builder image. Please see the [herokuish buildpack deployment documentation](/docs/deployment/builders/herokuish-buildpacks.md#customizing-the-buildpack-stack-builder) for more information on how to specify a custom buildpack stack builder.
+
+## Deprecations
+
+- The `proxy:ports*` commands have been replaced with the new `ports` plugin. Users will be able to use the old `proxy:ports*` commands for a single minor release, and they will be removed in the next minor release.
+- The `common#get_available_port()` function has been deprecated and will be removed in the next release. Users should avoid interacting with this function and instead use the `ports-get-available` plugin trigger for fetching an available port.
+- The `proxy-configure-ports` plugin trigger has been deprecated and will be removed in the next release. Users should instead trigger the `ports-configure` plugin trigger.
+- The `common#get_dockerfile_exposed_ports()` function is deprecated and will be removed in the next release. There is no replacement for this as it's only use in Dokku core was in the `builder-dockerfile` plugin.
+- The `common#get_exposed_ports_from_image()` function is deprecated and will be removed in the next release. There is no replacement for this as it's only use in Dokku core was during the build process.
+- The environment variable `DOKKU_PROXY_PORT_MAP` has been migrated to the properties system. Direct changes to the value will be ignored, and users should interact with port maps via the `ports` plugin.
+- The `CHECKS` file is deprecated in favor of defining healthchecks in the `app.json` file. The [docker-container-healthchecker](https://github.com/dokku/docker-container-healthchecker) tool can be used to generate healthcheck entries in `app.json` format from existing `CHECKS` files. See the [zero-downtime deploy documentation](/docs/deployment/zero-downtime-deploys.md) for more information on how the new zero downtime check format works.
+- ARM support is now deprecated, and will be removed in the next minor release. ARM releases are not tested in CI and do not get testing locally. Users of ARM installations on platforms such as the Raspberry PI should consider migrating to ARM64. ARM64 will continue to be supported by Dokku, and there are no plans to remove support for ARM64.
+
+## Un-Deprecations
+
+- The bare `apps` and `config` cli aliases are no longer deprecated. This better follows Heroku's output and is more useful to users. The subcommands will be treated as the primary, documented versions, while the aliases are there for convenience.
+
+## Removals
+
+- The variable `RAW_TCP_PORTS` is no longer exposed for `nginx.conf.sigil` templating.
+- The environment variable `DOKKU_DOCKERFILE_PORTS` is no longer in use. Users wishing to change port mappings should instead use the `ports` plugin.
+- The `common#get_app_raw_tcp_ports()` function has been removed in the next release. Users should instead use the `ports-get` plugin trigger for fetching ports for an app.
+- The plugin trigger `network-compute-ports` has been removed. It's only use was in the `scheduler-docker-local` plugin, for exposing ports. It's functionality is now implemented via the `ports` plugin.
+- The plugin trigger `network-get-port` has been removed. It's only use was in the `scheduler-docker-local` plugin, for recording ports. It's functionality is now implemented via the `ports` plugin.
diff --git a/docs/appendices/0.32.0-migration-guide.md b/docs/appendices/0.32.0-migration-guide.md
new file mode 100644
index 00000000000..9775e01d14d
--- /dev/null
+++ b/docs/appendices/0.32.0-migration-guide.md
@@ -0,0 +1,30 @@
+# 0.32.0 Migration Guide
+
+## Deprecations
+
+- The following `pre-build-*` plugin triggers have been deprecated and will be removed in the next release. Users should instead trigger the `pre-build` plugin trigger.
+ - pre-build-buildpack
+ - pre-build-dockerfile
+ - pre-build-lambda
+ - pre-build-pack
+- The following `pre-release-*` plugin triggers have been deprecated and will be removed in the next release. Users should instead trigger the `pre-release-builder` plugin trigger.
+ - pre-release-buildpack
+ - pre-release-dockerfile
+ - pre-release-lambda
+ - pre-release-pack
+- The following `post-build-*` plugin triggers have been deprecated and will be removed in the next release. Users should instead trigger the `post-build` plugin trigger.
+ - post-build-buildpack
+ - post-build-dockerfile
+ - post-build-lambda
+ - post-build-pack
+- The `CHECKS` file was deprecated in the previous release in favor of defining healthchecks in the `app.json` file. It's support and auto-migration to healthchecks in the `app.json` file will be removed in the next release. See the [zero-downtime deploy documentation](/docs/deployment/zero-downtime-deploys.md) for more information on how the new zero downtime check format works.
+
+## Removals
+
+- ARM support has been removed. Users of ARM installations on platforms such as the Raspberry PI should consider migrating to ARM64. ARM64 will continue to be supported by Dokku, and there are no plans to remove support for ARM64.
+- The following proxy-port related code has been removed. It is replaced by the `ports` plugin and it's related plugin triggers.
+ - `proxy:ports-*` commands
+ - `proxy-configure-ports` plugin trigger
+ - `common#get_available_port()`
+ - `common#get_dockerfile_exposed_ports()`
+ - `common#get_exposed_ports_from_image()`
diff --git a/docs/appendices/0.33.0-migration-guide.md b/docs/appendices/0.33.0-migration-guide.md
new file mode 100644
index 00000000000..cd00662bdc1
--- /dev/null
+++ b/docs/appendices/0.33.0-migration-guide.md
@@ -0,0 +1,3 @@
+# 0.33.0 Migration Guide
+
+Dokku 0.33.0 did not introduce any refactors, removals, or deprecations, and focused solely on system improvements.
diff --git a/docs/appendices/0.34.0-migration-guide.md b/docs/appendices/0.34.0-migration-guide.md
new file mode 100644
index 00000000000..d6d1578431f
--- /dev/null
+++ b/docs/appendices/0.34.0-migration-guide.md
@@ -0,0 +1,23 @@
+# 0.34.0 Migration Guide
+
+## Removals
+
+- The `disable-chown` property of the `scheduler-docker-local` plugin has been removed. Mounted paths will no longer have file permissions changed during the pre-deploy phase. Files baked into the container image for herokuish builds will always be owned by the correct user.
+- The `git:unlock` command has been removed. It was previously used to "unlock" a temporary directory that already existed. The directory the `git:unlock` command used to cleanup is now properly removed on exit of the `git:from-image` command.
+- The k3s plugin no longer supports port mappings other than `https:443` and `http:80`. If no matching port map is specified, Dokku will use expose the app on the first port mapping, with priority given to `https` mappings over `http`.
+- Golang functions to invoke plugin triggers named `PlugnTrigger*` have been removed in favor of `CallPlugnTrigger`.
+
+## Changes
+
+- The k3s scheduler now creates an Ingress object per domain instead of one per port mapping. This will cause a short amount of downtime during the next app deploy after upgrading to 0.34.0
+- App lock files have been removed from the `/home/dokku` directory and moved into the `data/apps` directory.
+- Logs are now rotated via `copytruncate` instead of `create` in logrotate.
+- The k3s scheduler now defaults to nginx as it's default proxy implementation. The traefik proxy implementation is still available, though users will need to set the global `ingress-class` k3s property to `traefik` via the following command:
+
+ ```shell
+ dokku scheduler-k3s:set --global ingress-class traefik
+ ```
+
+## Deprecations
+
+The `pre-deploy` plugin trigger is deprecated as of `0.34.4`. It is currently invoked during the `post-release-builder` plugin trigger, where image mutation is heavily discouraged. Users should instead move any trigger usage to the `pre-release-builder` plugin trigger. The `pre-deploy` plugin trigger will be removed in a future release.
diff --git a/docs/appendices/0.35.0-migration-guide.md b/docs/appendices/0.35.0-migration-guide.md
new file mode 100644
index 00000000000..e12bbc38325
--- /dev/null
+++ b/docs/appendices/0.35.0-migration-guide.md
@@ -0,0 +1,17 @@
+# 0.35.0 Migration Guide
+
+## Changes
+
+- The provided `dokku/dokku:latest` Docker image now runs Ubuntu 24.04 Noble. Users that install custom packages within their docker-based installations should be sure to check package compatibility with Ubuntu 24.04.
+- The default image used for Cloud Native Buildpack builds is now `heroku/builder:24`, and is based on both the `heroku-24` stack as well as Ubuntu 24.04. Users that wish to stick with the old, `heroku-22`/Ubuntu 22.04 builder may specify `heroku/buildpacks:22` as their builder image. Please see the [cloud native buildpack deployment documentation](/docs/deployment/builders/cloud-native-buildpacks.md#customizing-the-buildpack-stack-builder) for more information on how to specify a custom buildpack stack builder.
+- The default image used for Herokuish Buildpack builds is now `gliderlabs/herokuish:latest-24`, and is based on both the `heroku-24` stack as well as Ubuntu 24.04. Users that wish to stick with the old, `heroku-22`/Ubuntu 22.04 builder may specify `gliderlabs/herokuish:latest-22` as their builder image. Please see the [herokuish buildpack deployment documentation](/docs/deployment/builders/herokuish-buildpacks.md#customizing-the-buildpack-stack-builder) for more information on how to specify a custom buildpack stack builder.
+- The `vector` image used by Dokku for enhanced logging support has been upgraded from 0.39.x to 0.41.x. To take advantage of the new image, execute the following commands:
+ ```
+ dokku logs:vector-stop
+ dokku logs:vector-start
+ ```
+- The `openresty` image used by Dokku for proxying via openresty has been upgraded from 0.8.0 to 0.9.0. To take advantage of the new image, execute the following commands:
+ ```
+ dokku openresty:stop
+ dokku openresty:start
+ ```
diff --git a/docs/appendices/0.36.0-migration-guide.md b/docs/appendices/0.36.0-migration-guide.md
new file mode 100644
index 00000000000..2caeca2885c
--- /dev/null
+++ b/docs/appendices/0.36.0-migration-guide.md
@@ -0,0 +1,12 @@
+# 0.36.0 Migration Guide
+
+## Changes
+
+- Process stop timeouts are now configured via the `ps` property `stop-timeout-seconds`. Existing `DOKKU_DOCKER_STOP_TIMEOUT` environment variables will be automatically migrated to the new value.
+- Processes now default to a `30` second stop timeout.
+- The `domains:clear` command no longer runs domain setup after clearing the domains. Use `domains:reset` or run `domains:setup` manually to have the same effect.
+- The deprecated `DOKKU_DISABLE_ANSI_PREFIX_REMOVAL` setting has been removed. Dokku deploys no longer use shell escape codes to modify output, and thus deploy output may now contain `remote:` as a prefix in each lines output.
+
+## Deprecations
+
+Ubuntu 20.04 is now a deprecated installation target. The operating system will be considered EOL by Canonical in April 2025. Users are encouraged to upgrade to Ubuntu 24.04 or consider switching their instllation method to the [Docker-based installation method](/docs/getting-started/install/docker.md) to avoid any disruption in usage.
diff --git a/docs/appendices/0.37.0-migration-guide.md b/docs/appendices/0.37.0-migration-guide.md
new file mode 100644
index 00000000000..b06b9c81d1e
--- /dev/null
+++ b/docs/appendices/0.37.0-migration-guide.md
@@ -0,0 +1,15 @@
+# 0.37.0 Migration Guide
+
+## Changes
+
+- The `app.json` file format is now parsed as JSONC and supports inline comments.
+- The `scheduler-k3s:cluster-add` command is now `scheduler-k3s:cluster:add`.
+- The `scheduler-k3s:cluster-list` command is now `scheduler-k3s:cluster:list`.
+- The `scheduler-k3s:cluster-remove` command is now `scheduler-k3s:cluster:remove`.
+
+## Removals
+
+- Support for the `DOKKU_DOCKERFILE_CACHE_BUILD` environment variable has been removed. Use the `docker-options` plugin to set build arguments for your app instead.
+- Support for the `DOKKU_DOCKER_BUILD_OPTS` environment variable has been removed. Use the `docker-options` plugin to set build arguments for your app instead.
+- Support for the `no-cache` nixpacks property has been removed. Use the `docker-options` plugin to set build arguments for your app instead.
+- Support for customizing the label-key for the caddy proxy has been removed. Always use `caddy.` as a prefix for your caddy directives.
diff --git a/docs/appendices/0.38.0-migration-guide.md b/docs/appendices/0.38.0-migration-guide.md
new file mode 100644
index 00000000000..254446dc43d
--- /dev/null
+++ b/docs/appendices/0.38.0-migration-guide.md
@@ -0,0 +1,69 @@
+# 0.38.0 Migration Guide
+
+## Changes
+
+- Dokku now generates a minimal nginx configuration for apps without running `web` processes (undeployed apps, apps with no `web` process type, or apps with stopped web processes). This configuration returns `502 Bad Gateway` responses, ensuring the app's domain resolves and monitoring tools can detect non-200 status codes. The configuration is automatically replaced with the full proxy configuration once the app is deployed with running `web` processes. See the [nginx documentation](/docs/networking/proxies/nginx.md#nginx-configuration-for-undeployed-apps) for more details.
+- Users with custom `nginx.conf.sigil` templates that reference `DOKKU_APP_WEB_LISTENERS` should be aware that this variable may now be empty when the template is rendered for apps without running web processes. Custom templates should handle this case gracefully, for example by using a conditional to serve an error page instead of proxying:
+
+ ```
+ location / {
+ {{ if $.DOKKU_APP_WEB_LISTENERS }}
+ proxy_pass http://{{ $.APP }}-{{ $upstream_port }};
+ {{ else }}
+ return 502;
+ {{ end }}
+ }
+ ```
+
+- The path on disk to both the global `ENV` file and app `ENV` files have been moved. Users should reference environment variables via the provided plugin triggers rather than directly sourcing the ENV files. Existing ENV files are left untouched and will be removed on the subsequent Dokku install.
+- During a fresh apt install, the upstream nginx default vhost files (`/etc/nginx/sites-enabled/default`, `/etc/nginx/sites-available/default`, and `/etc/nginx/conf.d/default.conf`) are renamed to `${path}.dokku-disabled` (not deleted) to avoid a `duplicate default server for 0.0.0.0:80` error. Operators with local customizations can recover them by inspecting the `.dokku-disabled` siblings. Upgrade-in-place installs do not touch any existing nginx files.
+- Fresh apt installs now ship a catch-all default site at `/etc/nginx/conf.d/00-default-vhost.conf` that rejects requests with unknown Host headers using `ssl_reject_handshake on` (HTTPS) and `return 444` (HTTP). This replaces the manual workaround previously documented in the nginx docs. The behavior can be opted out at install time via the `dokku/install_default_site` debconf prompt. On nginx older than 1.19.4 (e.g., Debian Bullseye's nginx 1.18.0), the postinst installs an HTTP-only variant of the catch-all that omits the SSL listener and `ssl_reject_handshake`, since that directive is unsupported on those versions. See the [Default site documentation](/docs/networking/proxies/nginx.md#default-site).
+- 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.
+- 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 `-global-` 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 `-computed-` 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 `app-json`, `builder-dockerfile`, `builder-herokuish`, `builder-lambda`, `builder-nixpacks`, `builder-pack`, `builder-railpack`, `caddy`, `checks`, `git`, `haproxy`, `logs`, `network`, `nginx`, `openresty`, `proxy`, `registry`, `scheduler`, `scheduler-k3s` and `traefik`. External tooling that read `-global-` and depended on the default value should switch to `-computed-`. The bare `-` keys for caddy/haproxy/traefik/openresty global-only properties (`caddy-image`, `haproxy-log-level`, `traefik-api-enabled`, `openresty-image`, `openresty-letsencrypt-email`, `openresty-letsencrypt-server`, `openresty-allowed-letsencrypt-domains-func-base64`, etc.) have also been replaced by the `global-` and `computed-` pair.
+- The `ps` and `cron` plugins now follow the same `-global-` / `-computed-` convention. The `ps:report` keys `stop-timeout-seconds`, `global-stop-timeout-seconds`, and `computed-stop-timeout-seconds` have been renamed to `ps-stop-timeout-seconds`, `ps-global-stop-timeout-seconds`, and `ps-computed-stop-timeout-seconds`. The `cron:report` keys `cron-mailfrom` and `cron-mailto` have been renamed to `cron-global-mailfrom` and `cron-global-mailto`, and new `cron-computed-mailfrom` and `cron-computed-mailto` keys have been added. The corresponding user-facing `--` arguments to `ps:report` and `cron:report` were renamed alongside the JSON keys; no aliases are kept. Additionally, both `ps:report --global` and `cron:report --global` now emit the `-computed-` keys for every settable global property with a default (`ps-computed-procfile-path`, `ps-computed-stop-timeout-seconds`, `cron-computed-maintenance`, `cron-computed-mailfrom`, `cron-computed-mailto`), matching the shape used by the other plugins.
+- A second round of `:report` additions surfaces every remaining settable-but-unreported property under the same raw/global/computed convention so external tooling can verify drift via `:report --format json` without falling back to a generic bash task. The `ps` plugin gains `--ps-dockerfile-start-cmd` and `--ps-computed-dockerfile-start-cmd`, `--ps-start-cmd` and `--ps-computed-start-cmd`, and the `--ps-skip-deploy` / `--ps-global-skip-deploy` / `--ps-computed-skip-deploy` triple (default `false`). The `builder` plugin gains the `--builder-skip-cleanup` triple (default `false`). The `scheduler` plugin gains the `--scheduler-shell` triple. The `proxy` plugin gains the `--proxy-proxy-port` and `--proxy-proxy-ssl-port` triples and exposes the raw `disabled` property as `--proxy-disabled` / `--proxy-computed-disabled`, alongside the existing inverted `--proxy-enabled`. The `openresty` plugin gains `--openresty-global-log-level` and `--openresty-computed-log-level` (default `ERROR`). The `nginx` plugin gains the `--nginx-nginx-service-command` triple. The `scheduler-k3s` plugin gains `--scheduler-k3s-global-token`, but the value is masked as `*******` in default stdout output; the raw value is returned only when the report is requested via `--format json` or when this flag is queried explicitly by name. The traefik `dns-provider-` keys now follow the same explicit-query rule - previously they were unmasked only for `--format json`, but a query like `dokku traefik:report --traefik-dns-provider-cf_api_key` now returns the actual value instead of `*******`.
+- All Go-implemented plugins (`app-json`, `apps`, `builder`, `buildpacks`, `builds`, `cron`, `docker-options`, `logs`, `network`, `ports`, `proxy`, `ps`, `registry`, `resource`, `scheduler`, `scheduler-k3s`, `storage`) now emit JSON keys from `:report --format json` without the `-` head segment, matching the shape bash plugins have always emitted. For example, `dokku ps:report myapp --format json` now contains `stop-timeout-seconds`, `global-stop-timeout-seconds`, and `computed-stop-timeout-seconds` keys. The CLI flag names (`--ps-stop-timeout-seconds`, etc.) are unchanged, and `:set` semantics are unchanged. For backwards compatibility during the 0.38.x patch series, the old `-` JSON keys are emitted side-by-side with the new keys, so external scripts reading either shape continue to work. The legacy keys will be dropped in a future major release. External JSON consumers should migrate to the new key shape.
+- 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.
+- **New in 0.38.25:** Values supplied through docker options, `dokku run`'s `-e`/`--env` flag, and `--ttl-seconds` are no longer evaluated by the shell when assembling a container's arguments; they are now tokenized and passed through verbatim. This closes a command-injection vector where a `$(...)` or backtick expression in one of these values executed on the host as the `dokku` user during build, deploy, or run. As a result, shell metacharacters such as `$(...)`, backticks, `$VAR`, and globs in these values are treated literally instead of being expanded, and `--ttl-seconds` must now be a plain integer. Existing Traefik docker-options labels (those whose label key begins with `traefik.`) whose backticks were stored with a stray backslash are repaired automatically the first time `dokku` runs after the upgrade, so they become valid on the next deploy.
+- 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 :` 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-` entries in `storage:list-entries`. The migration is idempotent and tied to a per-app flag file at `$DOKKU_LIB_ROOT/config/storage/.migrated/`; 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 []` (the path defaults to the same `$DOKKU_LIB_ROOT/data/storage/` 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.
+
+### TLS handshake behavior change
+
+With the new catch-all installed on nginx 1.19.4+, an HTTPS request to a hostname that matches a configured dokku app but where the app has no TLS certificate configured will have its TLS handshake rejected by the catch-all (via `ssl_reject_handshake on`). Previously, nginx fell through to the lexicographically first port-443 server block and presented that block's certificate, producing a cert-mismatch error on the client. The new behavior is a correctness improvement, but operators who deliberately relied on the old fall-through certificate (for monitoring probes, for example) need to either configure a certificate for the target app or remove the catch-all on that host. Existing apps that already have certificates configured are unaffected: nginx selects the right server block via SNI before TLS completion, so the catch-all is never consulted for legitimate requests.
+
+This change does not apply to nginx older than 1.19.4 (e.g., Debian Bullseye's nginx 1.18.0), where the catch-all is installed as an HTTP-only variant. On those systems, HTTPS handshakes to unknown hosts continue to fall through to the first port-443 server block as before.
+
+### Environment variables migrated to plugin properties
+
+A number of `DOKKU_*` config environment variables have been replaced with properly-namespaced plugin properties. Existing values are migrated automatically the first time `dokku` runs after the upgrade, and the original config variable is unset. No manual action is required.
+
+Going forward, configure these settings using the property commands listed below. Setting the deprecated env vars via `dokku config:set` will no longer have any effect.
+
+| Deprecated Env Var | Replacement Command |
+|---|---|
+| `DOKKU_APP_PROXY_TYPE` | `dokku proxy:set type ` |
+| `DOKKU_APP_RESTORE` | `dokku ps:set restore ` |
+| `DOKKU_APP_SHELL` | `dokku scheduler:set shell ` |
+| `DOKKU_CHECKS_DISABLED` | `dokku checks:disable [proctypes]` |
+| `DOKKU_CHECKS_ENABLED` | `dokku checks:enable [proctypes]` |
+| `DOKKU_CHECKS_SKIPPED` | `dokku checks:skip [proctypes]` |
+| `DOKKU_CHECKS_WAIT` | `dokku checks:set wait ` |
+| `DOKKU_CHECKS_TIMEOUT` | `dokku checks:set timeout ` |
+| `DOKKU_CHECKS_ATTEMPTS` | `dokku checks:set attempts ` |
+| `DOKKU_DEFAULT_CHECKS_WAIT` | `dokku checks:set --global default-wait ` |
+| `DOKKU_DISABLE_APP_AUTOCREATION` | `dokku apps:set --global disable-autocreation ` |
+| `DOKKU_DISABLE_PROXY` | `dokku proxy:disable ` / `dokku proxy:enable ` |
+| `DOKKU_DOCKERFILE_START_CMD` | `dokku ps:set dockerfile-start-cmd ` |
+| `DOKKU_PROXY_PORT` | `dokku proxy:set proxy-port ` |
+| `DOKKU_PROXY_SSL_PORT` | `dokku proxy:set proxy-ssl-port ` |
+| `DOKKU_SKIP_ALL_CHECKS` | `dokku checks:disable ` |
+| `DOKKU_SKIP_CLEANUP` | `dokku builder:set skip-cleanup ` |
+| `DOKKU_SKIP_DEFAULT_CHECKS` | `dokku checks:skip ` |
+| `DOKKU_SKIP_DEPLOY` | `dokku ps:set skip-deploy ` |
+| `DOKKU_START_CMD` | `dokku ps:set start-cmd ` |
+
+`DOKKU_PARALLEL_ARGUMENTS` is removed entirely; it has no replacement.
+
+`DOKKU_SKIP_CLEANUP` continues to be honored when set in `/etc/environment` or `~dokku/.dokkurc/*` so that bootstrap-time configuration keeps working, but the `builder skip-cleanup` property is the canonical interface and takes precedence when set.
diff --git a/docs/appendices/0.5.0-migration-guide.md b/docs/appendices/0.5.0-migration-guide.md
index 2daba27dd7b..fe0f1fd6bc3 100644
--- a/docs/appendices/0.5.0-migration-guide.md
+++ b/docs/appendices/0.5.0-migration-guide.md
@@ -3,23 +3,23 @@
## `nginx-vhosts` plugin
- The nginx-vhosts template language is now [sigil](https://github.com/gliderlabs/sigil)
- - No need to escape literal `$` characters (or other "bash-isms")
- - Template variables are represented as {{ .VARIABLE_NAME }}
- - A detailed list of template variables can be found [here](/docs/configuration/nginx.md#available-template-variables)
+ - No need to escape literal `$` characters (or other "bash-isms")
+ - Template variables are represented as {{ .VARIABLE_NAME }}
+ - A detailed list of template variables can be found [here](/docs/networking/proxies/nginx.md#available-template-variables)
- A custom nginx-vhosts template must be named `nginx.conf.sigil`
- - The default path for this custom template is the root of your repo (i.e. `/app` in the container or `WORKDIR` if defined in a dockerfile app)
- - Dokku no longer looks for this file in `/home/dokku/node-js-app` on the Dokku server
- - Check out an example template [here](/docs/configuration/nginx.md)
+ - The default path for this custom template is the root of your repo (i.e. `/app` in the container or `WORKDIR` if defined in a dockerfile app)
+ - Dokku no longer looks for this file in `/home/dokku/node-js-app` on the Dokku server
+ - Check out an example template [here](/docs/networking/proxies/nginx.md)
- Support for server-wide SSL certs have been dropped in favor of using the `certs` plugin
- - `dokku certs:add node-js-app < certs.tar`
+ - `dokku certs:add node-js-app < certs.tar`
- All domains for an SSL-enabled app will be redirected to https by default
- - This can be overridden with a custom template
+ - This can be overridden with a custom template
- Replaced "magic" `NO_VHOST` variable with `domains:enable/disable`
- Simplified zero downtime control
- - `checks:enable/disable`
+ - `checks:enable/disable`
## Dockerfile apps with exposed ports
- Dockerfiles with `EXPOSE` clauses will get [all **tcp** ports proxied by default](/docs/deployment/builders/dockerfiles.md#exposed-ports)
- - Note that nginx will proxy the same port numbers to listen publicly
- - UDP ports can be exposed by disabling the [nginx proxy](/docs/networking/proxy-management.md) with `dokku proxy:disable node-js-app`
+ - Note that nginx will proxy the same port numbers to listen publicly
+ - UDP ports can be exposed by disabling the [nginx proxy](/docs/networking/proxy-management.md) with `dokku proxy:disable node-js-app`
diff --git a/docs/appendices/0.6.0-migration-guide.md b/docs/appendices/0.6.0-migration-guide.md
index 23fd4e76707..fe9cd724738 100644
--- a/docs/appendices/0.6.0-migration-guide.md
+++ b/docs/appendices/0.6.0-migration-guide.md
@@ -3,30 +3,30 @@
## Zero-downtime deployment
- You can now **actually** disable zero-downtime deployments per-app and per-process-type
- - Some config variables have been moved around
- - `DOKKU_CHECKS_ENABLED` has been migrated to `DOKKU_CHECKS_SKIPPED`
- - `DOKKU_CHECKS_DISABLED` is now a thing
- - The values for the above can be a comma-separated list of process-types or the literal string `_all_`
- - See the [updated `checks`](/docs/deployment/zero-downtime-deploys.md) docs for more info
+ - Some config variables have been moved around
+ - `DOKKU_CHECKS_ENABLED` has been migrated to `DOKKU_CHECKS_SKIPPED`
+ - `DOKKU_CHECKS_DISABLED` is now a thing
+ - The values for the above can be a comma-separated list of process-types or the literal string `_all_`
+ - See the [updated `checks`](/docs/deployment/zero-downtime-deploys.md) docs for more info
## Proxy port mapping
- You can now configure host -> container proxy port mappings
- - The UI is handled by the [proxy](/docs/networking/proxy-management.md) interface plugin by setting the `DOKKU_PROXY_PORT_MAP` config variable in the format of `scheme:host-port:container-port`. The default `nginx-vhosts` proxy plugin supports both the `http` and `https` schemes.
+ - The UI is handled by the [proxy](/docs/networking/proxy-management.md) interface plugin by setting the `DOKKU_PROXY_PORT_MAP` config variable in the format of `scheme:host-port:container-port`. The default `nginx-vhosts` proxy plugin supports both the `http` and `https` schemes.
- Default port mappings
- - buildpack apps will be set to `http:80:5000` and will also include `https:443:5000` if SSL is enabled.
- - dockerfile apps with explicitly exposed ports (i.e. using the `EXPOSE` directive) will be configured with a listener on each exposed port that proxies to the same port of the deployed application container.
- - You may override this behavior with the [`proxy:ports-*` commands](/docs/networking/proxy-management.md) or by directly setting `DOKKU_PROXY_PORT_MAP` with the `config:set` command
- - dockerfile apps without explicitly exposed ports will behave the same as a buildpack app
- - NOTE: These defaults **are not** automatically changed on subsequent pushes and must be manipulated with the aforementioned commands
+ - buildpack apps will be set to `http:80:5000` and will also include `https:443:5000` if SSL is enabled.
+ - dockerfile apps with explicitly exposed ports (i.e. using the `EXPOSE` directive) will be configured with a listener on each exposed port that proxies to the same port of the deployed application container.
+ - You may override this behavior with the [`proxy:ports-*` commands](/docs/networking/proxy-management.md) or by directly setting `DOKKU_PROXY_PORT_MAP` with the `config:set` command
+ - dockerfile apps without explicitly exposed ports will behave the same as a buildpack app
+ - NOTE: These defaults **are not** automatically changed on subsequent pushes and must be manipulated with the aforementioned commands
## Calling the `dokku` binary
- Plugins should *not* call the `dokku` binary directly. Clients using the `--app` argument are potentially broken, amongst others, when doing so. Instead, please source the `functions` file for a given plugin when attempting to call Dokku internal functions. As a result, the following Dokku commands are no longer publicly exposed:
- - `dokku build`
- - `dokku receive`
- - `dokku release`
- - `dokku tar:build`
- - `dokku tar:build-locked`
- - `dokku git:build`
- - `dokku git:build-locked`
+ - `dokku build`
+ - `dokku receive`
+ - `dokku release`
+ - `dokku tar:build`
+ - `dokku tar:build-locked`
+ - `dokku git:build`
+ - `dokku git:build-locked`
diff --git a/docs/appendices/0.8.0-migration-guide.md b/docs/appendices/0.8.0-migration-guide.md
index 6247a3e5153..f0881b0d1ff 100644
--- a/docs/appendices/0.8.0-migration-guide.md
+++ b/docs/appendices/0.8.0-migration-guide.md
@@ -2,13 +2,13 @@
## Domain Management
-You can now set global and app domains via `domains:set` and `domains:set-global`. See the [domains documentation](/docs/configuration/domains/) for more details.
+You can now set global and app domains via `domains:set` and `domains:set-global`. See the [domains documentation](/docs/configuration/domains.md) for more details.
## Plugin Uninstallation
A new `uninstall` plugin trigger was introduced. This functionality may be in use for newer plugins, so be aware that older Dokku versions may require manual cleanup.
-See the [uninstall trigger documentation](/docs/development/plugin-triggers/#uninstall) for implementation instructions.
+See the [uninstall trigger documentation](/docs/development/plugin-triggers.md#uninstall) for implementation instructions.
## Deployment Tasks
diff --git a/docs/appendices/file-formats/app-json.md b/docs/appendices/file-formats/app-json.md
new file mode 100644
index 00000000000..4146aeb8225
--- /dev/null
+++ b/docs/appendices/file-formats/app-json.md
@@ -0,0 +1,301 @@
+# app.json
+
+`app.json` is a manifest format for describing web apps. It declares cron tasks, healthchecks, and other information required to run an app on Dokku. This document describes the schema in detail.
+
+> [!IMPORTANT]
+> While the `app.json` format used by Dokku is based on the one [supported by Heroku](https://devcenter.heroku.com/articles/app-json-schema), not all Heroku functionality is supported by Dokku.
+
+## Buildpacks
+
+```json
+{
+ "buildpacks": [
+ {
+ "url": "heroku/python"
+ },
+ {
+ "url": "https://github.com/heroku/heroku-buildpack-nodejs.git"
+ }
+ ]
+}
+```
+
+(list, optional) A list of buildpacks to use when deploying the app. Each entry is an object with a `url` property. Buildpacks specified via the `buildpacks:add` or `buildpacks:set` commands take precedence over those specified in `app.json`. Buildpack URLs may use the shorthand format (e.g., `heroku/python`) which will be expanded to the full GitHub URL.
+
+- `url`: (string, required) The URL or shorthand reference of the buildpack.
+
+## Cron
+
+```json
+{
+ "cron": [
+ {
+ "command": "echo 'hello'",
+ "schedule": "0 1 * * *"
+ }
+ ]
+}
+```
+
+(list, optional) A list of cron resources. Keys are the names of the process types. The values are an object containing one or more of the following properties:
+
+- `command`: (string, required)
+- `maintenance`: (boolean, optional)
+- `schedule`: (string, required)
+- `concurrency_policy`: (string, optional, default: `allow`, options: `allow`, `forbid`, `replace`)
+
+## Env
+
+```json
+{
+ "env": {
+ "SIMPLE_VAR": "default_value",
+ "SECRET_KEY": {
+ "description": "A secret key for signing tokens",
+ "generator": "secret"
+ },
+ "DATABASE_URL": {
+ "description": "PostgreSQL connection string",
+ "required": true
+ },
+ "OPTIONAL_VAR": {
+ "description": "An optional configuration value",
+ "value": "default",
+ "required": false
+ },
+ "SYNC_VAR": {
+ "description": "A variable that updates on every deploy",
+ "value": "synced_value",
+ "sync": true
+ }
+ }
+}
+```
+
+(object, optional) A key-value object for environment variable configuration. Keys are the variable names. Values can be either a string (used as the default value) or an object with the following properties:
+
+- `description`: (string, optional) Human-readable explanation of the variable's purpose
+- `value`: (string, optional) Default value for the variable
+- `required`: (boolean, optional, default: `true`) Whether the variable must have a value
+- `generator`: (string, optional) Function to generate the value. Currently only `"secret"` is supported, which generates a 64-character cryptographically secure hex string
+- `sync`: (boolean, optional, default: `false`) If `true`, the value will be set on every deploy, overwriting any existing value
+
+### Behavior
+
+Environment variables from `app.json` are processed during the first deploy, before the predeploy script runs. The behavior depends on the variable configuration:
+
+1. **Variables with `value` or simple string**: The default value is set if the variable doesn't already exist
+2. **Variables with `generator: "secret"`**: A random 64-character hex string is generated if the variable doesn't exist
+3. **Required variables without a value or generator**: If a TTY is available, the user is prompted for a value. Otherwise, the deploy fails with an error
+4. **Optional variables without a value**: Skipped silently if no TTY is available
+
+On subsequent deploys:
+- Variables are NOT re-set unless `sync: true` is specified
+- Variables with `sync: true` are always set to their configured value, overwriting any manual changes
+- Variables that already have values are not modified
+
+### Examples
+
+**Simple default value:**
+```json
+{
+ "env": {
+ "WEB_CONCURRENCY": "5"
+ }
+}
+```
+
+**Generated secret (recommended for API keys, tokens, etc.):**
+```json
+{
+ "env": {
+ "SECRET_KEY_BASE": {
+ "description": "Base secret for session encryption",
+ "generator": "secret"
+ }
+ }
+}
+```
+
+**Required variable that must be provided:**
+```json
+{
+ "env": {
+ "DATABASE_URL": {
+ "description": "PostgreSQL connection URL",
+ "required": true
+ }
+ }
+}
+```
+
+**Variable that stays in sync with app.json:**
+```json
+{
+ "env": {
+ "FEATURE_FLAGS": {
+ "value": "new_ui,dark_mode",
+ "sync": true
+ }
+ }
+}
+```
+
+## Formation
+
+```json
+{
+ "formation": {
+ "web": {
+ "max_parallel": 1,
+ "quantity": 1
+ }
+ }
+}
+```
+
+(object, optional) A key-value object for process type configuration. Keys are the names of the process types. The values are an object containing one or more of the following properties:
+
+- `autoscaling` (map of string to object, optional) autoscaling rules. See the autoscaling section for more details
+- `max_parallel`: (int, optional) number of instances to deploy in parallel at a given time
+- `quantity`: (int, optional) number of processes to maintain. Default 1 for web processes, 0 for all others.
+- `service`: (map of string to oject, optional) governs how non-web processes are exposed as services on the network
+
+### Autoscaling
+
+```json
+{
+ "formation": {
+ "web": {
+ "autoscaling": {
+ "cooldown_period_seconds": 300,
+ "max_quantity": 10,
+ "min_quantity": 1,
+ "polling_interval_seconds": 30,
+ "triggers": {
+ "http": {
+ "metadata": {
+ "url": "https://example.com/health"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+(object, optional) A key-value object for autoscaling configuration. Keys are the names of the process types. The values are an object containing one or more of the following properties:
+
+- `cooldown_period_seconds`: (int, optional)
+- `max_quantity`: (int, optional)
+- `min_quantity`: (int, optional)
+- `polling_interval_seconds`: (int, optional)
+- `triggers`: (object, optional)
+
+An autoscaling trigger consists of the following properties:
+
+- `name`: (string, optional)
+- `type`: (string, optional)
+- `metadata`: (object, optional)
+
+### Service
+
+```json
+{
+ "formation": {
+ "internal-web": {
+ "service": {
+ "exposed": true
+ }
+ }
+ }
+}
+```
+
+(object, optional) A key-value object specifying how to expose non-web processes as services.
+
+- `service`: (boolean, optional) Whether to expose a process as a network service. The `PORT` variable will be set to 5000.
+
+## Healthchecks
+
+```json
+{
+ "healthchecks": {
+ "web": [
+ {
+ "type": "startup",
+ "name": "web check",
+ "description": "Checking if the app responds to the /health/ready endpoint",
+ "path": "/health/ready",
+ "attempts": 3
+ }
+ ]
+ }
+}
+```
+
+(object, optional) A key-value object specifying healthchecks to run for a given process type.
+
+- `attempts`: (int, optional)
+- `command`: (list of strings, optional)
+- `content`: (string, optional)
+- `httpHeaders`: (list of header objects, optional)
+- `initialDelay`: (int, optional)
+- `listening`: (boolean, optional)
+- `name`: (string, optional)
+- `path`: (string, optional)
+- `port`: (int, optional)
+- `scheme`: (string, optional)
+- `timeout`: (int, optional)
+- `type`: (string, optional)
+- `uptime`: (int, optional)
+- `wait`: (int, optional)
+- `warn`: (boolean, optional)
+- `onFailure`: (object, optional)
+
+## Scripts
+
+```json
+{
+ "scripts": {
+ "dokku": {
+ "predeploy": "touch /app/predeploy.test",
+ "postdeploy": "curl https://some.external.api.service.com/deployment?state=success"
+ },
+ "postdeploy": "curl https://some.external.api.service.com/created?state=success"
+ }
+}
+```
+
+(object, optional) A key-value object specifying scripts or shell commands to execute at different stages in the build/release process.
+
+- `dokku.predeploy`: (string, optional)
+ - When to use: This should be used if your app does not support arbitrary build commands and you need to make changes to the built image.
+ - Are changes committed to the image at this phase: Yes
+ - Example use-cases
+ - Bundling assets in a slightly different way
+ - Installing a custom package from source or copying a binary into place
+- `dokku.postdeploy`: (string, optional)
+ - When to use: This should be used in conjunction with external systems to signal the completion of your deploy.
+ - Are changes committed to the image at this phase: No
+ - Example use-cases
+ - Notifying slack that your app is deployed
+ - Coordinating traffic routing with a central load balancer
+- `postdeploy`: (string, optional)
+ - When to use: This should be used when you wish to run a command _once_, after the app is created and not on subsequent deploys to the app.
+ - Are changes committed to the image at this phase: No
+ - Example use-cases
+ - Setting up OAuth clients and DNS
+ - Loading seed/test data into the appâs test database
+
+## Properties
+
+### Settable properties
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `app-json:report`. The JSON keys emitted by `app-json:report --format json` are the same names with the leading `--app-json-` stripped (e.g. `appjson-path`, `global-appjson-path`, `computed-appjson-path`). Legacy keys with the `app-json-` prefix are also emitted during the 0.38.x deprecation window and will be removed in a future major release.
+
+| 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 |
diff --git a/docs/appendices/file-formats/buildpacks-file.md b/docs/appendices/file-formats/buildpacks-file.md
new file mode 100644
index 00000000000..ac2b38548c2
--- /dev/null
+++ b/docs/appendices/file-formats/buildpacks-file.md
@@ -0,0 +1,14 @@
+# .buildpacks
+
+The `.buildpacks` file is used to specify the buildpacks for an application. It is a list of buildpack URLs.
+
+```shell
+https://github.com/heroku/heroku-buildpack-nodejs.git
+https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+When installed, a buildpack is checked to see if it is a git repository via `git ls-remote`. If it is not, the buildpack is checked to see if it ends in `.tgz`, `.tar.gz`, `.tbz`, `tar.bz`, or `.tar` and is downloaded/extracted before being executed.
+
+If the buildpack is located on Github, a shorthand can be used in the form of `organization/buildpack-name`. This will be expanded to the `https://github.com/organization/heroku-buildpack-buildpack-name.git`. The `heroku-community` organization name is treated as `heroku`.
+
+Comments are not allowed in the `.buildpacks` file.
diff --git a/docs/appendices/file-formats/dockerfile.md b/docs/appendices/file-formats/dockerfile.md
new file mode 100644
index 00000000000..59b21ccdea3
--- /dev/null
+++ b/docs/appendices/file-formats/dockerfile.md
@@ -0,0 +1,3 @@
+# Dockerfile
+
+A Dockerfile is used to build a Docker image for an application. Please refer to the [Dockerfile reference](https://docs.docker.com/reference/dockerfile/) for more information.
diff --git a/docs/appendices/file-formats/lambda-yml.md b/docs/appendices/file-formats/lambda-yml.md
new file mode 100644
index 00000000000..f390fe09ff1
--- /dev/null
+++ b/docs/appendices/file-formats/lambda-yml.md
@@ -0,0 +1,16 @@
+# lambda.yml
+
+The `lambda.yml` file is used to configure a Lambda application.
+
+```yaml
+---
+build_image: mlupin/docker-lambda:dotnetcore3.1-build
+builder: dotnet
+run_image: mlupin/docker-lambda:dotnetcore3.1
+```
+
+## Fields
+
+`build_image`: A docker image that is accessible by the docker daemon. The `build_image` should be based on an existing Lambda image - builders may fail if they cannot run within the specified `build_image`. The build will fail if the image is inaccessible by the docker daemon.
+`builder`: The name of a builder. This may be used if multiple builders match and a specific builder is desired. If an invalid builder is specified, the build will fail.
+`run_image`: A docker image that is accessible by the docker daemon. The `run_image` should be based on an existing Lambda image - built images may fail to start if they are not compatible with the produced artifact. The generation of the `run_image` will fail if the image is inaccessible by the docker daemon.
diff --git a/docs/appendices/file-formats/nginx-conf-sigil.md b/docs/appendices/file-formats/nginx-conf-sigil.md
new file mode 100644
index 00000000000..3de3fdbf64f
--- /dev/null
+++ b/docs/appendices/file-formats/nginx-conf-sigil.md
@@ -0,0 +1,65 @@
+# nginx.conf.sigil
+
+The `nginx.conf.sigil` file is used to configure the nginx server for an application. The default template can be found [here](https://github.com/dokku/dokku/blob/master/plugins/nginx-vhosts/templates/nginx.conf.sigil). Dokku uses a tool named [sigil](https://github.com/gliderlabs/sigil) to generate the nginx configuration based on the template provided.
+
+## Validation
+
+A custom `nginx.conf.sigil` is pre-validated at the start of every deploy, immediately after it is extracted from the source tree and before the build phase runs. Pre-validation renders the template via sigil with the same parameters used at deploy time, wraps the rendered config in a minimal `events`/`http` scaffold, and runs `nginx -t` against the result. The deploy is aborted if either the sigil render or the `nginx -t` check fails, so build work is not wasted on a syntactically invalid template. When no app listeners exist yet (typical for first deploys), pre-validation injects a placeholder `127.0.0.1:5000` listener for `DOKKU_APP_WEB_LISTENERS` so that the rendered upstream block has a static server entry and `nginx -t` does not bail out on "host not found in upstream".
+
+Pre-validation is skipped when the proxy type is not `nginx` or when `disable-custom-config` is set to `true` for the app.
+
+### Custom nginx modules
+
+Pre-validation runs `nginx -t` against a minimal wrapper config that does _not_ include the top-level `load_module` directives from the global `/etc/nginx/nginx.conf`. A `nginx.conf.sigil` that uses a directive provided by a dynamically loaded module - such as `image_filter`, provided by the [ngx_http_image_filter_module](https://nginx.org/en/docs/http/ngx_http_image_filter_module.html) - therefore fails pre-validation with an `unknown directive` error, even though `nginx -t` succeeds against the real server config where the module is loaded.
+
+The `load_module` directive cannot be added to the app's `nginx.conf.sigil` to work around this, as that file is included inside the `http { }` block while `load_module` is only valid in nginx's top-level main context.
+
+To make pre-validation aware of a module, override the wrapper template used for validation. The [`nginx-app-template-source`](/docs/development/plugin-triggers.md#nginx-app-template-source) trigger returns the path to the `sigil` template used to generate a given nginx configuration file, and its `validate-config` template type controls the pre-validation wrapper. Create a [custom plugin](/docs/development/plugin-creation.md) that implements the trigger and returns a `validate.conf.sigil` that adds the required `load_module` line at the top of the wrapper.
+
+The trigger file (named `nginx-app-template-source` and marked executable):
+
+```shell
+#!/usr/bin/env bash
+
+set -eo pipefail
+[[ $DOKKU_TRACE ]] && set -x
+
+APP="$1"
+TEMPLATE_TYPE="$2"
+if [[ "$TEMPLATE_TYPE" == "validate-config" ]]; then
+ echo "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/validate.conf.sigil"
+fi
+```
+
+The custom `validate.conf.sigil`, which is the [default wrapper](https://github.com/dokku/dokku/blob/master/plugins/nginx-vhosts/templates/validate.conf.sigil) with the required `load_module` line added at the top. Use the same `load_module` line that the host's global `/etc/nginx/nginx.conf` uses:
+
+```
+load_module modules/ngx_http_image_filter_module.so;
+events { worker_connections 768; }
+http {
+ access_log off;
+ error_log /dev/null;
+ include {{ $.NGINX_CONF }};
+}
+```
+
+The same override also governs the standalone `dokku nginx:validate-config` command, which renders the `validate-config` template as well.
+
+## HTTP/2
+
+nginx 1.25.1 deprecated the `http2` parameter on the `listen` directive in favor of a standalone `http2 on;` directive. Custom `nginx.conf.sigil` templates that hardcode `listen ... ssl http2;` will produce `nginx: [warn] the "listen ... http2" directive is deprecated` warnings when run against nginx 1.25.1 or newer.
+
+Dokku exposes the `HTTP2_DIRECTIVE_SUPPORTED` template variable, set to `"true"` when the host nginx is 1.25.1 or newer, so a single template can render the correct syntax against either version. The default template uses this pattern:
+
+```
+{{ if eq $.HTTP2_DIRECTIVE_SUPPORTED "true" }}
+listen [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }} ssl;
+listen {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }} ssl;
+http2 on;
+{{ else }}
+listen [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }} ssl http2;
+listen {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }} ssl http2;
+{{ end }}
+```
+
+Dokku logs a deprecation warning during deploys when a custom template still uses the `listen ... http2` form, so the offending template can be located via the deploy output.
diff --git a/docs/appendices/file-formats/nixpacks-toml.md b/docs/appendices/file-formats/nixpacks-toml.md
new file mode 100644
index 00000000000..3d1baff00ba
--- /dev/null
+++ b/docs/appendices/file-formats/nixpacks-toml.md
@@ -0,0 +1,3 @@
+# nixpacks.toml
+
+The `nixpacks.toml` file is used to configure an application when built with the `nixpacks` builder. Please refer to the [nixpacks.toml documentation](https://nixpacks.com/docs/configuration/file.md) for more information.
diff --git a/docs/appendices/file-formats/procfile.md b/docs/appendices/file-formats/procfile.md
new file mode 100644
index 00000000000..270988f58d9
--- /dev/null
+++ b/docs/appendices/file-formats/procfile.md
@@ -0,0 +1,48 @@
+# Procfile
+
+A Procfile is a file that was [promoted by Heroku](https://blog.heroku.com/the_new_heroku_1_process_model_procfile) for their platform as an easy way to specify one or more distinct processes to run within Heroku. This format has since been picked up by various other tools and platforms.
+
+## General Overview
+
+The `procfile-util` tool expects a Procfile to be defined as one or more lines containing one of:
+
+- a comment (preceeded by a `#` symbol or two `//` characters)
+- a process-type/command combination (with optional trailing whitespace or trailing comment)
+ - when there is a trailing comment, the `#` symbol/`//` characters _must_ be preceeded by one or more `whitespace` characters.
+- a blank line (with optional trailing whitespace)
+
+Comments and blank lines are ignored, while process-type/command combinations look like the following:
+
+```
+:
+```
+
+The syntax is defined as follows:
+
+- `` â any character in the class `[A-Za-z0-9_-]+`, a process type is a name for your command, such as `web`, `worker`, `urgentworker`, `clock`, etc.
+- `` â a command used to launch the process, such as `rake jobs:work`
+
+Additional rules are as follows:
+
+- contain at most 63 characters
+
+A Procfile that does not match any of the above rules will be considered invalid, and not be processed. This is to avoid issues where a Procfile may contain merge conflicts or other improper content, thus resulting in unwanted runtime behavior for applications.
+
+Finally, process types within a Procfile may not overlap and must be unique. Rather than assuming that the last or first specified is correct, `procfile-util` will fail to parse the Procfile with the relevant error.
+
+### Strict Mode
+
+> Strict mode can be triggered on `procfile-util` via the `--strict` flag.
+
+In strict mode, the character set of a process type changes.
+
+- `` â a valid DNS Label Name as per [RFC 1123](https://tools.ietf.org/html/rfc1123), a process type is a name for your command, such as `web`, `worker`, `urgentworker`, `clock`, etc.
+
+This syntax differs common interpretations of valid `` values in that we define the process type as a DNS Label name, versus the regex `[A-Za-z0-9_]+`. The reason for this is that processes defined within Procfiles are commonly used in DNS entries. Rather than have a second level of platform-specific validation in place, this project implicitly defines the format for the process-type.
+
+Given the above, a valid process type can be generalized to the following rules (as taken from the [Kubernetes documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names)):
+
+- contain at most 63 characters
+- contain only lowercase alphanumeric characters or '-'
+- start with an alphanumeric character
+- end with an alphanumeric character
diff --git a/docs/appendices/file-formats/project-toml.md b/docs/appendices/file-formats/project-toml.md
new file mode 100644
index 00000000000..f5411a75cea
--- /dev/null
+++ b/docs/appendices/file-formats/project-toml.md
@@ -0,0 +1,3 @@
+# project.toml
+
+The project descriptor file allows app developers to provide configuration for apps deployed to Dokku via the `pack` builder. Please refer to the [project.toml documentation](https://buildpacks.io/docs/reference/config/project-descriptor/) for more information.
diff --git a/docs/appendices/file-formats/railpack-json.md b/docs/appendices/file-formats/railpack-json.md
new file mode 100644
index 00000000000..d6e390fb410
--- /dev/null
+++ b/docs/appendices/file-formats/railpack-json.md
@@ -0,0 +1,3 @@
+# railpack.json
+
+The `railpack.json` file is used to configure an application when built with the `railpack` builder. Please refer to the [railpack.json documentation](https://railpack.com/config/file) for more information.
diff --git a/docs/assets/dokku-logo.svg b/docs/assets/dokku-logo.svg
new file mode 100644
index 00000000000..29ada9ae083
--- /dev/null
+++ b/docs/assets/dokku-logo.svg
@@ -0,0 +1,31 @@
+
diff --git a/docs/assets/extra.css b/docs/assets/extra.css
new file mode 100644
index 00000000000..c9ff785f566
--- /dev/null
+++ b/docs/assets/extra.css
@@ -0,0 +1,23 @@
+:root > * {
+ --md-primary-fg-color: #2A8FBD;
+ --md-primary-fg-color--light: #ECB7B7;
+ --md-primary-fg-color--dark: #90030C;
+}
+
+.md-typeset .mdx-badge {
+ font-size: .80em;
+}
+
+.md-typeset .mdx-badge__icon {
+ background: var(--md-accent-fg-color--transparent);
+ padding: 0.2rem;
+ border-top-left-radius: 0.1rem;
+ border-bottom-left-radius: 0.1rem
+}
+
+.md-typeset .mdx-badge__text {
+ box-shadow: 0 0 0 1px inset var(--md-accent-fg-color--transparent);
+ padding: 0.2rem 0.3rem;
+ border-bottom-right-radius: 0.1rem;
+ border-top-right-radius: 0.1rem;
+}
diff --git a/docs/assets/favicons/browserconfig.xml b/docs/assets/favicons/browserconfig.xml
index 490d70f88e4..16326705dc8 100644
--- a/docs/assets/favicons/browserconfig.xml
+++ b/docs/assets/favicons/browserconfig.xml
@@ -2,10 +2,10 @@
-
-
-
-
+
+
+
+ #da532c
diff --git a/docs/assets/favicons/manifest.json b/docs/assets/favicons/manifest.json
index 5420399351c..2b8bdc40db9 100644
--- a/docs/assets/favicons/manifest.json
+++ b/docs/assets/favicons/manifest.json
@@ -2,37 +2,37 @@
"name": "Dokku",
"icons": [
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-36x36.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-48x48.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-72x72.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-96x96.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-144x144.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
- "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.26.8\/docs\/assets\/favicons\/android-chrome-192x192.png",
+ "src": "https:\/\/cdn.jsdelivr.net\/dokku\/dokku@v0.38.25\/docs\/assets\/favicons\/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"
diff --git a/docs/assets/placeholder-avatar.jpg b/docs/assets/placeholder-avatar.jpg
new file mode 100644
index 00000000000..26c0e491876
Binary files /dev/null and b/docs/assets/placeholder-avatar.jpg differ
diff --git a/docs/assets/social/discord.png b/docs/assets/social/discord.png
new file mode 100644
index 00000000000..57a4ff53f44
Binary files /dev/null and b/docs/assets/social/discord.png differ
diff --git a/docs/assets/social/github.png b/docs/assets/social/github.png
new file mode 100644
index 00000000000..f3959d46bc7
Binary files /dev/null and b/docs/assets/social/github.png differ
diff --git a/docs/assets/social/irc.png b/docs/assets/social/irc.png
new file mode 100644
index 00000000000..cfe5aa54af6
Binary files /dev/null and b/docs/assets/social/irc.png differ
diff --git a/docs/assets/social/slack.png b/docs/assets/social/slack.png
new file mode 100644
index 00000000000..ca910f44cde
Binary files /dev/null and b/docs/assets/social/slack.png differ
diff --git a/docs/assets/style.css b/docs/assets/style.css
index 3153156c17b..402f14c45f9 100644
--- a/docs/assets/style.css
+++ b/docs/assets/style.css
@@ -1,251 +1,687 @@
:root {
- color-scheme: light dark;
+ /* Used on the hero background */
+ --primary-blue: #2A8FBD;
+ --dropdown-hover: #277FA930;
+ --cta-color: #79ACCA;
+ --cta-hover-color: #97C0D9;
+ --text-blue: #297BAB;
+ --badge-color: #09CACE5C;
+ --badge-circle-color: #297BAC;
+ --badge-hover-color: #10E3E85C;
+ --explore-cta-hover: #ffffffe8;
+ /* Used on anchor tag on blue background */
+ --transparent-white: #fffc;
+ /* Used for section background */
+ --slate-bg: #F5F5F5;
+ --slate-border: #DADADA;
+ --animation-speed: 40s;
+ /* Used on the code showcase */
+ --gradient-shadow: linear-gradient(45deg, #2A8FBD, #679ab2, #ffffff, #81ccef, #2abbbd, #c9e0eb, #66c1eb, #40809e, #2A8FBD);
+
+ --darkmode-light: #11398c;
+ --darkmode-button-light: #325fae;
+ --darkmode-button-light-hover: #254989;
+ --darkmode-dark: #0a2d75;
+
+ /* Avatar section darkmode fade */
+ --avatar-before-gradient: rgba(0, 0, 0, 0) linear-gradient(90deg, white 2.52%, rgba(255, 255, 255, 0) 100%) repeat scroll 0% 0%;
+ --avatar-darkmode-before-gradient: rgba(0, 0, 0, 0) linear-gradient(90deg, #0.38.25 2.52%, rgba(255, 255, 255, 0) 100%) repeat scroll 0% 0%;
+ --avatar-after-gradient: rgba(0, 0, 0, 0) linear-gradient(270deg, white 2.52%, rgba(255, 255, 255, 0) 100%) repeat scroll 0% 0%;
+ --avatar-darkmode-after-gradient: rgba(0, 0, 0, 0) linear-gradient(270deg, #0.38.25 2.52%, rgba(255, 255, 255, 0) 100%) repeat scroll 0% 0%;
}
+
body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
- font-size: 62.5%;
- font-weight: 400;
- padding-bottom: 40px;
- color: #5a5a5a;
- -webkit-font-smoothing: antialiased;
+ font-family: 'Lato', sans-serif;
}
-h1 {
- color: #5a5a5a;
- font-weight: 400;
- line-height: 1.1;
- margin-bottom: 12px;
- margin-top: 12px;
- text-rendering: optimizelegibility;
+
+.btn-check:active+.btn:focus,
+.btn-check:checked+.btn:focus,
+.btn.active:focus,
+.btn.show:focus,
+.btn:active:focus {
+ box-shadow: none;
}
-.header {
- background-color: #2a8fbd;
- padding: 22px 0;
+
+.fit-content {
+ width: fit-content;
}
-.header .heading {
- color: #fff;
- font-size: 2.4em;
- margin: 7px 0 0 0;
- padding: 0 0 0 1em;
+
+
+/* Common */
+
+.cta-arrow {
+ position: relative;
+ margin-left: 5px;
+ stroke-width: 2px;
+ fill: none;
+ stroke: currentColor;
}
-.header a {
- color: #fff;
- background-position: center left;
- display: block;
- width: 100%;
- height: 100%;
- -webkit-background-size: contain;
- -moz-background-size: contain;
- background-size: contain;
- background-repeat: no-repeat;
+
+.cta-arrow .cta-arrow__tip {
+ transition: transform .2s;
}
-.header .nav-item a {
- font-size: 1.6em;
+
+.cta-arrow .cta-arrow__line {
+ opacity: 0;
+ transition: opacity .2s;
}
-.header .navbar-brand a {
- background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.26.8/docs/assets/dokku.png);
- text-indent: 40px;
+
+a:hover>.cta-arrow .cta-arrow__line {
+ opacity: 1;
}
-.blurb {
- color: #424242;
- background-color: #ededed;
- background-image: url(https://cdn.jsdelivr.net/gh/dokku/dokku@v0.26.8/docs/assets/gplaypattern.png);
- padding: 45px 0;
- text-align: center;
+
+a:hover>.cta-arrow .cta-arrow__tip {
+ transform: translateX(3px);
+}
+
+
+/* Navigation */
+
+.navbar-toggler,
+.navbar-toggler:focus {
+ border: none;
+ box-shadow: none;
+
}
-.blurb h2 {
- font-size: 3.5em;
+
+.navbar-brand {
+ color: white;
+ font-weight: bold;
}
-.blurb p {
- font-size: 1.9em;
- font-weight: 300;
- margin: 18px 0;
- text-align: center;
+
+.navbar-brand:hover {
+ color: white;
+}
+
+.nav-item .btn:hover {
+ border-color: transparent;
+ background-color: var(--dropdown-hover);
}
-.blurb .btn-lg {
- font-size: 2.2em;
+
+.nav-item .dropdown-menu strong {
+ width: max-content;
}
+
+.nav-item .dropdown-menu a,
+.nav-item .dropdown-menu a:hover {
+ color: var(--text-blue);
+}
+
+.nav-item a {
+ font-weight: bolder;
+ color: var(--transparent-white);
+ transition: all .2s;
+}
+
+.nav-item a:hover,
+.nav-item a:focus {
+ color: white;
+}
+
+a.dropdown-toggle.show {
+ color: white;
+}
+
+.nav-item .cta,
+.nav-item .cta:focus {
+ background-color: var(--cta-color);
+ box-shadow: none;
+ border: none;
+ color: white;
+}
+
+.nav-item .cta:hover {
+ background-color: var(--cta-hover-color);
+ color: white;
+}
+
+.dropdown-menu.show {
+ box-shadow: 0px 0px 5px 0px #a1e1ff;
+ border: none;
+ margin-top: 10px;
+}
+
+ul.navbar-nav li.nav-item {
+ height: max-content;
+ transition: transform .2s;
+}
+
+
+/* hero section */
+
+.hero-section {
+ background: radial-gradient(56.99% 613.79% at 24.22% 51.49%, rgba(40, 39, 107, 0.2) 0%, rgba(0, 0, 0, 0.098) 100%), linear-gradient(0deg, #2A8FBD, #2A8FBD), linear-gradient(0deg, #28276C, #28276C);
+}
+
+.hero-section .badge-link {
+ font-weight: normal;
+ color: white;
+ text-decoration: none;
+ display: inline-block;
+}
+
+.hero-section .badge {
+ background-color: var(--badge-color);
+ font-size: 16px;
+ transition: background-color .2s;
+}
+
+.hero-section .badge-link:hover .badge {
+ background-color: var(--badge-hover-color);
+}
+
+.hero-section .cta {
+ background-color: var(--cta-color);
+ border: none;
+}
+
+.hero-section .cta:hover {
+ background-color: var(--cta-hover-color);
+}
+
+.hero-section .badge .circle {
+ width: 8px;
+ height: 8px;
+ display: inline-block;
+ background: var(--badge-circle-color);
+ border-radius: 100%;
+}
+
+.hero-heading {
+ font-weight: bolder;
+ font-size: 42px;
+}
+
+.hero-section .explore-cta {
+ background-color: white;
+ color: var(--primary-blue);
+}
+
+.hero-section .explore-cta:hover {
+ background-color: var(--explore-cta-hover);
+ color: var(--primary-blue);
+}
+
+.hero-section main {
+ padding-top: 5em;
+ padding-bottom: 5em;
+}
+
+.hero-section code {
+ background-color: var(--badge-color);
+ color: white;
+ font-family: inherit;
+ border-radius: 2px;
+}
+
+a.platform {
+ font-weight: 900;
+ color: inherit;
+ opacity: .8;
+ transition: all .2s;
+ text-decoration: none;
+}
+
+a.platform:hover {
+ color: inherit;
+ opacity: 1;
+}
+
+
+/* Quickstart code */
+
.quickstart-code {
- display: block;
+ position: relative;
line-height: 1.3em;
- margin: 45px auto;
- max-width: 860px;
+ filter: drop-shadow(0px 0px 8px #3B3D84);
padding: 0;
}
+
+.quickstart-code:before,
+.quickstart-code:after {
+ content: "";
+ position: absolute;
+ border-radius: 5px;
+ top: -2px;
+ left: -2px;
+ background: var(--gradient-shadow);
+ background-size: 400%;
+ width: calc(100% + 4px);
+ height: calc(100% + 4px);
+ z-index: -1;
+ animation: animate 60s linear infinite;
+}
+
+.quickstart-code:after {
+ filter: blur(30px);
+}
+
+@keyframes animate {
+ 0% {
+ background-position: 0 0;
+ }
+
+ 50% {
+ background-position: 300% 0;
+ }
+
+ 100% {
+ background-position: 0 0;
+ }
+}
+
.quickstart-code .title {
background-color: #dfdfdf;
background-image: linear-gradient(top, #f7f7f7 0%, #dfdfdf 7%, #ccc 100%);
border-radius: 5px 5px 0 0;
- box-shadow: 0 3px 0 rgba(0, 0, 0, 0.5);
color: #444;
display: block;
- font-size: 1.6em;
+ font-size: 1em;
font-weight: 400;
- margin: 0 20px;
+ margin: 0px;
padding: 3px 0;
text-align: center;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
}
-.quickstart-code .tabs {
- background-color: #bcbcbc;
- border-top: 1px solid #686868;
- color: #444;
- display: flex;
- display: -webkit-flex;
- font-weight: bold;
- margin: 0 20px;
- padding: 0;
- text-align: center;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.quickstart-code .tab {
- border-right: 1px solid #686868;
- cursor: pointer;
- flex: 1;
- -webkit-flex: 1;
-}
-.quickstart-code .tab-active {
- background-color: #ededed;
- border-radius: 0 0 5px 5px;
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
-}
-.quickstart-code .tab:last-of-type {
- border-right: none;
-}
+
.quickstart-code .shell {
- background-color: #171717;
+ background-color: #555699;
border-radius: 0 0 5px 5px;
border-top: 1px solid #bcbcbc;
- box-shadow: 0 5px 30px rgba(0, 0, 0, 0.3);
- display: none;
- font-size: 1.4em;
+ display: block;
+ font-size: 1em;
font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
- margin: 0 20px;
+ margin: 0px;
padding: 20px;
text-shadow: none;
}
-.quickstart-code .shell-active {
- display: block;
-}
+
.quickstart-code .line {
display: block;
margin: 0;
padding: 0;
}
-.quickstart-code .line span {
- display: inline-block;
-}
+
.quickstart-code .line .output {
- color: #aaa;
-}
-.quickstart-code .path {
- color: #2a8fbd;
- content: '~';
- user-select: none;
+ color: #b7e2f9;
}
+
.quickstart-code .prompt {
color: #f90;
user-select: none;
}
+
.quickstart-code .command {
color: #ffc;
+ line-break: anywhere;
}
-.alternate-instructions {
- display: block;
- font-size: 1.6em;
- line-height: 1.3em;
- margin: 45px auto;
- max-width: 860px;
+
+
+/* Powered by */
+
+.powered-by {
+ padding-top: 8rem;
+ padding-bottom: 8rem;
+}
+
+.copy-caption {
+ color: var(--primary-blue);
+ border-left: 5px solid var(--primary-blue);
+}
+
+.copy-title {
+ font-size: 38px;
+}
+
+.copy-body {
+ line-height: 28px;
+ font-size: 18px;
+}
+
+.copy-body p {
+ margin-bottom: 1.3em;
+}
+
+a.copy-cta-btn {
+ color: var(--primary-blue);
+ background-color: transparent;
+ border-color: transparent;
+ border: none;
padding: 0;
- text-align: center;
+ vertical-align: baseline;
}
-.marketing .col-lg-4 {
- margin-bottom: 20px;
- text-align: center;
+
+a.copy-cta-btn:hover {
+ color: var(--primary-blue);
+ background-color: transparent;
+ border: transparent;
+}
+
+.powered-by_brands img {
+ max-width: 300px;
+}
+
+
+/* Getting started */
+.getting-started {
+ margin-bottom: -20%;
+ z-index: 1;
+}
+
+.getting-started .container {
+ position: relative;
+ z-index: 1;
}
-.marketing .col-lg-4 p {
+
+.getting-started::after {
+ position: absolute;
+ content: "";
+ top: 30%;
+ left: 0;
+ right: 0;
+ bottom: 20%;
+ background: linear-gradient(0deg, rgba(52, 52, 87, 0.2) -40.97%, rgba(0, 0, 0, 0) 103.19%), #2781AB;
+ z-index: 0;
+}
+
+.nav-tabs {
+ width: fit-content;
+ margin: 0 auto;
+ padding: 10px;
+ background-color: #4794B8;
+ border-radius: 20px 20px 0px 0px;
+}
+
+.nav-tabs .nav-link {
+ background: rgba(85, 86, 153, 0.72);
+ border-radius: 0px;
+ padding: 0.6em 3em;
+ color: var(--transparent-white);
+ font-weight: bold;
+ border: 0px;
+ position: relative;
+ font-size: 1em;
+}
+
+.nav-tabs .nav-link:hover {
+ color: white;
+}
+
+.nav-tabs .nav-link:hover svg path {
+ fill: white;
+}
+
+.nav-tabs .nav-link svg {
margin-right: 10px;
- margin-left: 10px;
}
-.featurette-divider {
- margin: 20px 0;
+
+.nav-tabs .nav-link svg path {
+ fill: var(--bs-gray-300);
+ transition: all .2s
}
-.featurette-heading {
- font-weight: normal;
- line-height: 1;
- letter-spacing: -1px;
+
+.nav-tabs .nav-link.active {
+ background: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), #555699;
+ color: white;
}
-.featurette-heading .text-muted {
- font-weight: 300;
+
+.nav-tabs .nav-link.active svg path {
+ fill: white;
}
-.featurette img {
- width: 400px;
+
+.nav-tabs .nav-link.active::after {
+ content: '';
+ position: absolute;
+ margin-left: -10px;
+ left: 50%;
+ bottom: 0px;
+ height: 0;
+ width: 0;
+ border-bottom: 10px solid #4794B8;
+ border-left: 10px solid transparent;
+ border-right: 10px solid transparent;
}
-.slack-channel,
-.sponsors {
- background-color: #EEF1F7;
- font-size: 1.6em;
- font-weight: 300;
- margin-bottom: 2.5em;
- padding-top: 2.5em;
- padding-bottom: 2.5em;
- text-align: center
+
+.nav-tabs .nav-link:nth-child(1) {
+ border-radius: 15px 0px 0px 0px;
}
-.slack-channel .inline-container {
- display: inline-block;
- margin-left: 0.5em
+
+.nav-tabs .nav-link:nth-child(3) {
+ border-radius: 0px 15px 0px 0px;
+}
+
+.tab-content {
+ margin: 0 auto;
+ margin-top: -10px;
+ background: #4794B8;
+ box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.25);
+ border-radius: 7px;
+ padding: 10px;
+ padding-bottom: 0px;
}
-.slack-button {
- background-image: -webkit-linear-gradient(#FCFCFC, #EAEAEA);
- background-image: linear-gradient(#FCFCFC, #EAEAEA);
- border: 1px solid #ddd;
- padding: 0.25rem 0.5rem;
+
+.tab-pane {
+ margin-top: -20px;
}
-.slack-button img {
- height: 1em;
+
+.tab-pane img {
+ width: 100%;
+ padding-top: 20px;
+ padding-bottom: 20px;
}
-.sponsors {
- background-color: #272822;
- color: #FCFCFC;
+
+/* Plugins section */
+
+section.plugins {
+ padding-top: 25%;
+ padding-bottom: 8rem;
+ background: var(--slate-bg);
+ border-width: 2px 2px;
+ border-style: solid;
+ border-color: var(--slate-border);
}
-.sponsors a {
- color: #f0ad4e;
+
+section.plugins svg {
+ transform: scale(1.3);
}
-.sponsors .backer img,
-.sponsors .sponsor img {
- -webkit-border-radius: 3px;
- border-radius: 3px;
- border: 8px solid gray;
- margin: 20px auto 20px auto;
- max-width: 192px;
+
+g#plugins:hover,
+g#plugins:hover g {
+ -webkit-animation-play-state: paused !important;
+ -moz-animation-play-state: paused !important;
+ -o-animation-play-state: paused !important;
+ animation-play-state: paused !important;
+}
+
+
+/* Support Us */
+
+section.supportus {
+ padding-top: 8rem;
+ padding-bottom: 8rem;
+}
+
+.supportus .copy-body {
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+.supportus a.opencollective {
+ color: var(--primary-blue);
+ text-decoration: none;
+ font-weight: bold;
}
-.sponsors .backer img {
- -webkit-border-radius: 50%;
+
+.avatar-section {
+ margin-top: 5em;
+ overflow: hidden;
+ position: relative;
+}
+
+.avatar-section:before,
+.avatar-section:after {
+ content: "";
+ position: absolute;
+ top: 0px;
+ width: 12%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 2;
+}
+
+.avatar-section:before {
+ left: 0px;
+ background: var(--avatar-before-gradient);
+}
+
+.avatar-section:after {
+ right: 0px;
+ background: var(--avatar-after-gradient);
+}
+
+.avatar-row {
+ width: max-content;
+}
+
+.infinite-scroll {
+ animation: 48s linear 0s infinite normal none running scroll;
+}
+
+.avatar-row:hover {
+ -webkit-animation-play-state: paused;
+ -moz-animation-play-state: paused;
+ -o-animation-play-state: paused;
+ animation-play-state: paused;
+}
+
+.avatar-row:nth-child(2) {
+ animation-duration: 60s;
+}
+
+.avatar {
+ width: 80px;
+ height: 80px;
border-radius: 50%;
- border: 0;
+ display: flex;
+ justify-content: center;
+ overflow: hidden;
+ flex-shrink: 0;
}
-.sponsors img:hover {
- -moz-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
- -webkit-box-shadow: 4px 4px 8px 0px rgba(0,0,0,0.75);
- box-shadow: 0px 0px 32px 0px rgba(0,0,0,0.75);
+
+.avatar img {
+ flex-shrink: 0;
+ min-width: 100%;
+ min-height: 100%
}
-.sponsors .fund-link {
- display: block;
- font-size: .8em;
+
+.avatar-link {
+ padding: 5px;
+ margin-right: 20px;
+ margin-bottom: 20px;
+ background: white;
+ border-radius: 50%;
+ filter: drop-shadow(rgba(0, 0, 0, 0.1) 0px 4px 6px);
+ transition: transform .2s linear;
+}
+
+.avatar-link:hover {
+ transform: scaleX(1.1) scaleY(1.1);
}
+
+@keyframes scroll {
+ from {
+ transform: translateX(0%);
+ }
+
+ to {
+ transform: translateX(-50%);
+ }
+}
+
+
+/* pro-cta section */
+
+section.pro-cta {
+ background: var(--slate-bg);
+ border-width: 2px 2px;
+ border-style: solid;
+ border-color: var(--slate-border);
+}
+
+
+/* Footer */
+
+footer {
+ background: var(--primary-blue);
+}
+
+footer p {
+ font-size: 1em;
+}
+
+footer a {
+ color: inherit;
+ font-weight: 900;
+ opacity: .9;
+ transition: all .2s;
+ text-decoration: none;
+}
+
+footer a:hover {
+ color: inherit;
+ opacity: 1;
+}
+
+
+/* Accessibility */
+
+@media (prefers-reduced-motion) {
+
+ g#plugins,
+ g#plugins g,
+ .avatar-row,
+ .quickstart-code:before,
+ .quickstart-code:after {
+ -webkit-animation-play-state: paused !important;
+ -moz-animation-play-state: paused !important;
+ -o-animation-play-state: paused !important;
+ animation-play-state: paused !important;
+ }
+}
+
+/* Documentation */
.list-group-item {
border: none;
font-size: 14px;
font-weight: normal;
padding: .2rem .5rem;
color: #157577;
+ transition: all .1s;
}
+
a.list-group-item {
- color: #666
+ color: #666;
+ font-size: 1em;
+}
+
+a.list-group-item:focus,
+a.list-group-item:hover,
+button.list-group-item:focus,
+button.list-group-item:hover {
+ color: #555;
+ text-decoration: none;
+ background-color: #f5f5f5;
}
-.list-group-item.disabled:first-child, .list-group-item.disabled:first-child:focus, .list-group-item.disabled:first-child:hover {
+
+.list-group-item.disabled:first-child,
+.list-group-item.disabled:first-child:focus,
+.list-group-item.disabled:first-child:hover {
margin-top: 0;
}
-.list-group-item.disabled, .list-group-item.disabled:focus, .list-group-item.disabled:hover {
+
+.list-group-item.disabled,
+.list-group-item.disabled:focus,
+.list-group-item.disabled:hover {
background: none;
color: #bbb;
cursor: default;
@@ -254,28 +690,32 @@ a.list-group-item {
margin-top: 2em;
text-transform: uppercase;
}
+
.table-of-contents {
font-size: 1.2em;
padding: 1em;
margin: 0 0 0.5em 0.5em;
}
+
.table-of-contents ul {
margin-bottom: 0;
padding-left: 20px;
}
+
.anchorjs-link {
color: #24cbce;
}
+
.markdown-body {
-webkit-font-smoothing: antialiased;
box-sizing: border-box;
color: rgb(71, 74, 84);
- font-size: 1.6em;
+ font-size: 1.1em;
font-weight: normal;
- height: 20px;
- line-height: 1.5;
+ line-height: 1.7;
text-align: left;
}
+
.markdown-body h1 {
border-bottom: 1px solid #dfdfdf;
color: #444;
@@ -283,32 +723,40 @@ a.list-group-item {
padding-bottom: 1em;
margin-top: 0;
text-rendering: optimizelegibility;
+ font-weight: 900;
}
+
.markdown-body h2 {
font-size: 1.3em;
font-weight: 700;
color: #555;
margin-top: 2em;
text-transform: uppercase;
+ font-weight: 900;
}
+
.markdown-body h3 {
font-size: 1.2em;
font-weight: 700;
color: #555;
margin: 1em 0;
}
+
.markdown-body h4 {
font-size: 1.1em;
font-weight: 700;
color: #555;
margin: 1em 0;
}
-.markdown-body h1 + h2 {
+
+.markdown-body h1+h2 {
margin-top: 1em;
}
+
.highlight-show-language {
position: relative;
}
+
.highlight-show-language-label {
color: black;
background-color: #CFCFCF;
@@ -334,11 +782,13 @@ a.list-group-item {
-o-transform: none;
transform: none;
}
+
.highlight-output pre {
color: #fff;
background-color: #000;
padding: 10px;
}
+
code {
padding: 0;
padding-top: 0.2em;
@@ -351,18 +801,23 @@ code {
border-radius: 3px;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
}
+
code:before {
letter-spacing: -0.2em;
content: "\00a0";
}
+
code:after {
letter-spacing: -0.2em;
content: "\00a0";
}
-pre code:before, pre code:after {
+
+pre code:before,
+pre code:after {
letter-spacing: 0;
content: "";
}
+
pre {
display: block;
line-height: 1.428571429;
@@ -377,38 +832,48 @@ pre {
color: #4d4d4c;
margin: 2em 0;
}
+
blockquote {
border-left: 4px solid #5bc0de;
background-color: #f4f8fa;
padding: 15px 15px 1px;
margin-bottom: 30px;
}
+
.new-as-of {
border-left: 4px solid #d1f2a5;
background-color: #effab4;
}
+
.not-yet-released {
border-left: 4px solid #ef5b58;
background-color: #f9ad76;
}
+
.warning {
border-left: 4px solid #cd2512;
background-color: #d1675f;
color: white;
}
+
.fa:before {
-webkit-font-smoothing: antialiased
}
+
.clearfix {
*zoom: 1
}
-.clearfix:before, .clearfix:after {
+
+.clearfix:before,
+.clearfix:after {
display: table;
content: ""
}
+
.clearfix:after {
clear: both
}
+
.improve-slideout {
position: fixed;
bottom: 66%;
@@ -418,15 +883,18 @@ blockquote {
-o-transition-duration: 0.3s;
transition-duration: 0.3s;
background: #363637;
- padding: 5px 0 4px;
+ padding: 0px 0 3px;
z-index: 90;
}
+
.improve-slideout:hover {
right: 205px;
}
+
.improve-slideout:hover .improve-slideout-inner {
right: 0;
}
+
.improve-slideout-inner {
position: fixed;
bottom: 66%;
@@ -439,17 +907,20 @@ blockquote {
padding: 4px 12px;
width: 205px;
}
+
.improve-slideout-inner h6 {
color: #363637;
font-weight: 700;
text-transform: uppercase;
margin: 0;
- font-size: 1.3em;
+ font-size: 1em;
}
+
.git-improve {
- vertical-align: -2px;
+ vertical-align: baseline;
padding-left: 8px;
}
+
.back-to-contents {
position: fixed;
bottom: calc(66% - 34px);
@@ -458,31 +929,41 @@ blockquote {
padding: 5px 0 4px;
z-index: 90;
}
+
.icon-improve {
color: #bdbdb5;
padding: 2px 9px 0 10px;
}
+
a .fa {
display: inline-block;
text-decoration: inherit
}
+
li .fa {
display: inline-block
}
-li .fa-large:before, li .fa-large:before {
+
+li .fa-large:before,
+li .fa-large:before {
width: 1.875em
}
+
ul.fas {
list-style-type: none;
margin-left: 2em;
text-indent: -0.8em
}
+
ul.fas li .fa {
width: 0.8em
}
-ul.fas li .fa-large:before, ul.fas li .fa-large:before {
+
+ul.fas li .fa-large:before,
+ul.fas li .fa-large:before {
vertical-align: baseline
}
+
.rst-versions {
position: fixed;
bottom: 0;
@@ -494,13 +975,16 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif;
z-index: 400
}
+
.rst-versions a {
color: #7c8e98;
text-decoration: none
}
+
.rst-versions .rst-badge-small {
display: none
}
+
.rst-versions .rst-current-version {
padding: 12px;
background-color: #2475c3;
@@ -510,31 +994,40 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
color: #d8edf8;
*zoom: 1
}
-.rst-versions .rst-current-version:before, .rst-versions .rst-current-version:after {
+
+.rst-versions .rst-current-version:before,
+.rst-versions .rst-current-version:after {
display: table;
content: ""
}
+
.rst-versions .rst-current-version:after {
clear: both
}
+
.rst-versions .rst-current-version .fa {
color: #fcfcfc
}
+
.rst-versions .rst-current-version .fa-book {
float: left;
line-height: 30px
}
+
.rst-versions .rst-current-version .icon-book {
float: left
}
+
.rst-versions .rst-current-version.rst-out-of-date {
background-color: #E74C3C;
color: #fff
}
+
.rst-versions .rst-current-version.rst-active-old-version {
background-color: #F1C40F;
color: #000
}
+
.rst-versions.rst-badge {
border: none;
bottom: 20px;
@@ -542,25 +1035,36 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
left: auto;
max-height: 600px;
max-width: 300px;
- overflow: scroll;
+ overflow: hidden;
right: 20px;
width: auto;
}
+
+.rst-versions.rst-badge.shift-up {
+ overflow-y: scroll;
+ height: calc(100vh - 100px);
+}
+
.rst-versions.rst-badge .icon-book {
float: none
}
+
.rst-versions.rst-badge .fa-book {
float: none
}
+
.rst-versions.rst-badge.shift-up .rst-current-version {
text-align: right
}
+
.rst-versions.rst-badge.shift-up .rst-current-version .fa-book {
float: left
}
+
.rst-versions.rst-badge.shift-up .rst-current-version .icon-book {
float: left
}
+
.rst-versions.rst-badge .rst-current-version {
width: auto;
height: 30px;
@@ -569,17 +1073,21 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
display: block;
text-align: center
}
+
.rst-other-versions {
display: none;
padding: 12px;
text-align: left;
}
+
.shift-up .rst-other-versions {
display: block;
}
+
.rst-other-versions a {
border: 0;
}
+
.rst-other-versions hr {
display: block;
border: 0;
@@ -587,19 +1095,24 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
padding: 0;
border-top: solid 1px #d6edf9
}
+
.rst-other-versions dl {
margin: 0;
}
+
.rst-other-versions dd {
display: inline-block;
margin: 0
}
+
.rst-other-versions dd a {
display: inline-block;
padding: 6px;
color: #fcfcfc
}
-.dev-warning, .outdated-warning {
+
+.dev-warning,
+.outdated-warning {
position: absolute;
top: 0;
width: 100%;
@@ -613,121 +1126,218 @@ ul.fas li .fa-large:before, ul.fas li .fa-large:before {
background-image: -ms-linear-gradient(-45deg, rgba(0, 0, 0, 0.04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.04) 50%, rgba(0, 0, 0, 0.04) 75%, transparent 75%, transparent);
background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.04) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.04) 50%, rgba(0, 0, 0, 0.04) 75%, transparent 75%, transparent);
font-family: "Roboto", Corbel, Avenir, "Lucida Grande", "Lucida Sans", sans-serif;
- font-size: 1.6em;
+ font-size: 1.1em;
text-align: center;
background-color: #ffe761;
}
-@media screen and (max-width: 768px) {
- .rst-versions {
- width: 85%;
- display: none
+
+/* Large devices (desktops, 992px and up) */
+@media (max-width: 992px) {
+ .nav-item a.cta {
+ width: 100%;
}
- .rst-versions.shift {
- display: block
+
+ .powered-by {
+ padding-bottom: 4rem;
}
- img {
- width: 100%;
- height: auto
+
+ .nav-tabs .nav-link {
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: 0.8em;
+ padding: 1.2em 1.2em;
}
-}
-.button.slack-button > img {
- width: inherit;
+ .nav-tabs .nav-link svg {
+ margin-right: 5px;
+ width: 25px;
+ height: 25px;
+ }
+
+ section.plugins {
+ padding-top: 30%;
+ }
+
+ section.plugins svg {
+ transform: scale(1.1);
+ }
}
-@media (min-width: 768px) {
- .col-md-offset-right-2 {
- margin-right: 20.666667%;
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: var(--darkmode-dark);
+ color: white;
+ }
+
+ header,
+ footer {
+ background: #0b1f4c !important;
}
- .quickstart-code {
- line-height: 22px;
+
+ .hero-section .cta {
+ background-color: var(--darkmode-button-light);
}
- .featurette-heading {
- font-size: 5em;
+
+ .hero-section .cta:hover {
+ background-color: var(--darkmode-button-light-hover);
}
-}
-@media (min-width: 992px) {
- .featurette img {
- width: 300px;
+
+ .hero-section .explore-cta {
+ color: white;
}
- .featurette-heading {
- margin-top: 30px;
+
+ .hero-section .explore-cta:hover {
+ color: white;
}
-}
-@media (max-width: 992px) {
- .featurette img {
- width: 200px;
+
+ .getting-started::after {
+ background: linear-gradient(0deg, rgba(52, 52, 87, 0.2) -40.97%, rgba(0, 0, 0, 0) 103.19%),
+ #0.38.25;
+ }
+
+ .tab-content {
+ background: #0.38.25;
+ }
+
+ .nav-tabs {
+ background: #0.38.25;
+ }
+
+ .powered-by_brands {
+ filter: contrast(2);
+ }
+
+ div.quickstart-code {
+ filter: none;
+ }
+
+ .quickstart-code .shell {
+ background: #313274;
+ }
+
+ section.powered-by {
+ background: var(--darkmode-light);
+ }
+
+ section.plugins {
+ background: var(--darkmode-dark);
+ border-width: 0px;
+ }
+
+ section.supportus {
+ background: var(--darkmode-light);
+ border-width: 0px;
+ }
+
+ section.pro-cta {
+ background: var(--darkmode-dark);
+ border-width: 0px;
+ }
+
+ .avatar-section:before {
+ background: var(--avatar-darkmode-before-gradient);
+ }
+
+ .avatar-section:after {
+ background: var(--avatar-darkmode-after-gradient);
+ }
+
+ .blurb {
+ filter: invert(1);
+ }
+
+ .slack-channel {
+ background-color: #110e09;
+ }
+
+ code {
+ background-color: #052148;
+ color: #bbb;
+ }
+
+ pre {
+ background-color: #052148;
+ color: #bbb;
+ border: 1px solid #052148;
+ box-shadow: 0 0 0 3px #07387b;
+ }
+
+ .list-group-item.disabled,
+ .list-group-item.disabled:focus,
+ .list-group-item.disabled:hover {
+ color: var(--bs-gray-100);
+ }
+
+ a.list-group-item {
+ background-color: var(--darkmode-dark);
+ color: var(--bs-gray-500);
+ }
+
+ a.list-group-item:focus,
+ a.list-group-item:hover,
+ button.list-group-item:focus,
+ button.list-group-item:hover {
+ color: white;
+ background-color: var(--darkmode-button-light-hover);
+ }
+
+ blockquote {
+ background-color: rgba(0, 82, 204, 0.18);
+ border-left: 4px solid rgba(108, 169, 255, 0.3);
+ ;
+ color: rgb(108, 169, 255);
+ }
+
+ blockquote.warning {
+ border-left: 4px solid rgba(239, 136, 84, 0.3);
+ background-color: rgba(235, 100, 32, 0.18);
+ color: rgb(239, 136, 84);
+ }
+
+ blockquote.new-as-of {
+ border-left: 4px solid rgba(11, 216, 73, 0.3);
+ background-color: rgba(9, 171, 60, 0.18);
+ color: rgb(11, 216, 73);
+ }
+
+ .dev-warning,
+ .outdated-warning {
+ background-color: #4e440d;
+ color: #fff;
+ }
+
+ .table-striped tbody tr:nth-of-type(odd) {
+ background-color: #080808
+ }
+
+ .table-hover tbody tr:hover {
+ background-color: #3b3b3b;
+ color: #bbb;
+ }
+
+ .table td,
+ .table th {
+ border-top: 1px solid #131110;
+ }
+
+ .table thead th {
+ border-bottom: 2px solid #131110;
+ }
+
+ .markdown-body {
+ color: var(--bs-gray-400);
+ }
+
+ .markdown-body h1 {
+ color: white;
+ }
+
+ .markdown-body h2,
+ .markdown-body h3,
+ .markdown-body h4 {
+ color: var(--bs-gray-300);
+ }
+
+ .markdown-body a {
+ color: #ffffff;
}
-}
-@media (prefers-color-scheme: dark) {
- body {
- background-color: rgb(13, 17, 23);
- }
- .header {
- background-color: #0b1f4c;
- }
- .blurb {
- filter: invert(1);
- }
- .slack-channel {
- background-color: #110e09;
- }
-
- code {
- background-color: rgb(22, 27, 34);
- color: #bbb;
- }
- pre {
- background-color: rgb(22, 27, 34);
- color: #bbb;
- border: 1px solid #555;
- box-shadow: 0 0 0 3px #111;
- }
- .highlight-show-language-label {
- filter: invert(1);
- }
- .list-group-item {
- background-color: rgb(13, 17, 23);
- }
- blockquote {
- background-color: rgba(0, 82, 204, 0.18);
- border-left: 4px solid rgba(108, 169, 255, 0.3);;
- color: rgb(108, 169, 255);
- }
- blockquote.warning {
- border-left: 4px solid rgba(239, 136, 84, 0.3);
- background-color: rgba(235, 100, 32, 0.18);
- color: rgb(239, 136, 84);
- }
- blockquote.new-as-of {
- border-left: 4px solid rgba(11, 216, 73, 0.3);
- background-color: rgba(9, 171, 60, 0.18);
- color: rgb(11, 216, 73);
- }
- .dev-warning, .outdated-warning {
- background-color: #4e440d;
- color: #fff;
- }
- .table-striped tbody tr:nth-of-type(odd) {
- background-color: #080808
- }
- .table-hover tbody tr:hover {
- background-color: #3b3b3b;
- color: #bbb;
- }
- .table td, .table th {
- border-top: 1px solid #131110;
- }
- .table thead th {
- border-bottom: 2px solid #131110;
- }
- .markdown-body {
- color: rgb(184, 181, 171);
- }
- .markdown-body h1 {
- color: #bbb;
- }
- .markdown-body h2, .markdown-body h3, .markdown-body h4 {
- color: #aaa;
- }
}
diff --git a/docs/assets/universe/universe animation.keyshape b/docs/assets/universe/universe animation.keyshape
new file mode 100644
index 00000000000..1cc50819ca4
Binary files /dev/null and b/docs/assets/universe/universe animation.keyshape differ
diff --git a/docs/assets/universe/universe animation.svg b/docs/assets/universe/universe animation.svg
new file mode 100644
index 00000000000..a2056619e59
--- /dev/null
+++ b/docs/assets/universe/universe animation.svg
@@ -0,0 +1,303 @@
+
+
+
\ No newline at end of file
diff --git a/docs/assets/versions.json b/docs/assets/versions.json
index 16a21eb22b8..9490ee32549 100644
--- a/docs/assets/versions.json
+++ b/docs/assets/versions.json
@@ -23,6 +23,18 @@
"0.23.9",
"0.24.10",
"0.25.7",
- "0.26.8"
+ "0.26.8",
+ "0.27.10",
+ "0.28.4",
+ "0.29.4",
+ "0.30.11",
+ "0.31.5",
+ "0.32.4",
+ "0.33.9",
+ "0.34.9",
+ "0.35.20",
+ "0.36.11",
+ "0.37.10",
+ "0.38.25"
]
}
diff --git a/docs/community/clients.md b/docs/community/clients.md
index 914ce0f9c67..3f5d16359b1 100644
--- a/docs/community/clients.md
+++ b/docs/community/clients.md
@@ -18,16 +18,6 @@ npm install -g dokku-toolbelt
See [documentation here](https://www.npmjs.com/package/dokku-toolbelt) for more information.
-## (python) dokku-client
-
-dokku-client is an extensible python-based cli wrapper for remote Dokku hosts. You can install it via the following shell command (assuming you have python and pip installed):
-
-```shell
-pip install dokku-client
-```
-
-See [documentation here](https://github.com/adamcharnock/dokku-client) for more information.
-
## (ruby) Dokku CLI
Dokku CLI is a rubygem that acts as a client for your Dokku installation. You can install it via the following shell command (assuming you have ruby and rubygems installed):
@@ -38,26 +28,6 @@ gem install dokku-cli
See [documentation here](https://github.com/SebastianSzturo/dokku-cli) for more information.
-## (ruby) DokkuClient
-
-DokkuClient is another rubygem that acts as a client for your Dokku installation with built-in support for certain external plugins. You can install it via the following shell command (assuming you have ruby and rubygems installed):
-
-```shell
-gem install dokku_client
-```
-
-See [documentation here](https://github.com/netguru/dokku_client) for more information.
-
-## (ruby) Dokkufy
-
-Dokkufy is a rubygem that handles automation of certain tasks, such as Dokku setup, plugin installation, etc. You can install it via the following shell command (assuming you have ruby and rubygems installed):
-
-```shell
-gem install dokkufy
-```
-
-See [documentation here](https://github.com/cbetta/dokkufy) for more information.
-
## (ruby) Dockland
Dockland is a rubygem that acts as a client for your Dokku installation. You can install it via the following shell command (assuming you have ruby and rubygems installed):
diff --git a/docs/community/plugins.md b/docs/community/plugins.md
index aa3301d05c4..85018d0c573 100644
--- a/docs/community/plugins.md
+++ b/docs/community/plugins.md
@@ -24,28 +24,39 @@ The following plugins are available and provided by Dokku maintainers. Please f
| Plugin | Author | Compatibility |
| ------------------------------------------------------------------------------------------------- | --------------------- | --------------------- |
-| [CouchDB](https://github.com/dokku/dokku-couchdb) | [dokku][] | 0.4.0+ |
-| [Elasticsearch](https://github.com/dokku/dokku-elasticsearch-plugin) | [dokku][] | 0.4.0+ |
-| [Grafana/Graphite/Statsd](https://github.com/dokku/dokku-graphite-grafana) | [dokku][] | 0.4.0+ |
-| [MariaDB](https://github.com/dokku/dokku-mariadb-plugin) | [dokku][] | 0.4.0+ |
-| [Memcached](https://github.com/dokku/dokku-memcached-plugin) | [dokku][] | 0.4.0+ |
-| [Mongo](https://github.com/dokku/dokku-mongo-plugin) | [dokku][] | 0.4.0+ |
-| [MySQL](https://github.com/dokku/dokku-mysql-plugin) | [dokku][] | 0.4.0+ |
-| [Nats](https://github.com/dokku/dokku-nats) | [dokku][] | 0.4.0+ |
-| [Postgres](https://github.com/dokku/dokku-postgres-plugin) | [dokku][] | 0.4.0+ |
-| [RabbitMQ](https://github.com/dokku/dokku-rabbitmq-plugin) | [dokku][] | 0.4.0+ |
-| [Redis](https://github.com/dokku/dokku-redis-plugin) | [dokku][] | 0.4.0+ |
-| [RethinkDB](https://github.com/dokku/dokku-rethinkdb-plugin) | [dokku][] | 0.4.0+ |
+| [Clickhouse](https://github.com/dokku/dokku-clickhouse) | [dokku][] | 0.4.0+ |
| [Copy Files to Image](https://github.com/dokku/dokku-copyfiles-to-image) | [dokku][] | 0.4.0+ |
+| [CouchDB](https://github.com/dokku/dokku-couchdb) | [dokku][] | 0.4.0+ |
+| [Cron Restart](https://github.com/dokku/dokku-cron-restart) | [dokku][] | 0.30.0+ |
+| [Elasticsearch](https://github.com/dokku/dokku-elasticsearch) | [dokku][] | 0.4.0+ |
+| [Grafana/Graphite/Statsd](https://github.com/dokku/dokku-graphite) | [dokku][] | 0.4.0+ |
| [HTTP Auth](https://github.com/dokku/dokku-http-auth) | [dokku][] | 0.4.0+ |
| [Let's Encrypt](https://github.com/dokku/dokku-letsencrypt) | [dokku][] | 0.4.0+ |
| [Maintenance mode](https://github.com/dokku/dokku-maintenance) | [dokku][] | 0.4.0+ |
+| [MariaDB](https://github.com/dokku/dokku-mariadb) | [dokku][] | 0.4.0+ |
+| [Meilisearch](https://github.com/dokku/dokku-meilisearch) | [dokku][] | 0.4.0+ |
+| [Memcached](https://github.com/dokku/dokku-memcached) | [dokku][] | 0.4.0+ |
+| [Mongo](https://github.com/dokku/dokku-mongo) | [dokku][] | 0.4.0+ |
+| [MySQL](https://github.com/dokku/dokku-mysql) | [dokku][] | 0.4.0+ |
+| [Nats](https://github.com/dokku/dokku-nats) | [dokku][] | 0.4.0+ |
+| [Omnisci](https://github.com/dokku/dokku-omnisci) | [dokku][] | 0.4.0+ |
+| [Postgres](https://github.com/dokku/dokku-postgres) | [dokku][] | 0.4.0+ |
+| [Pushpin](https://github.com/dokku/dokku-pushpin) | [dokku][] | 0.4.0+ |
+| [RabbitMQ](https://github.com/dokku/dokku-rabbitmq) | [dokku][] | 0.4.0+ |
| [Redirect](https://github.com/dokku/dokku-redirect) | [dokku][] | 0.4.0+ |
-| [Registry](https://github.com/dokku/dokku-registry) | [dokku][] | 0.12.0+
+| [Redis](https://github.com/dokku/dokku-redis) | [dokku][] | 0.4.0+ |
+| [Registry](https://github.com/dokku/dokku-registry) | [dokku][] | 0.12.0+ |
+| [RethinkDB](https://github.com/dokku/dokku-rethinkdb) | [dokku][] | 0.4.0+ |
+| [Scheduler Kubernetes](https://github.com/dokku/dokku-scheduler-kubernetes) | [dokku][] | 0.4.0+ |
+| [Scheduler Nomad](https://github.com/dokku/dokku-scheduler-nomad) | [dokku][] | 0.4.0+ |
+| [Solr](https://github.com/dokku/dokku-solr) | [dokku][] | 0.4.0+ |
+| [SSH Hostkeys](https://github.com/cedricziel/dokku-hostkeys-plugin) | [dokku][] | 0.4.0+ |
+| [Typesense](https://github.com/dokku/dokku-typesense) | [dokku][] | 0.4.0+ |
## Community plugins
-> Warning: The following plugins have been supplied by our community and may not have been tested by Dokku maintainers.
+> [!WARNING]
+> The following plugins have been supplied by our community and may not have been tested by Dokku maintainers.
### Datastores
@@ -59,6 +70,13 @@ The following plugins are available and provided by Dokku maintainers. Please f
| [PostgreSQL](https://github.com/jlachowski/dokku-pg-plugin) | [jlachowski][] | 0.3.x |
| [PostgreSQL (single container)](https://github.com/ohardy/dokku-psql) | [ohardy][] | 0.3.x |
| [PostgreSQL (single container)](https://github.com/Flink/dokku-psql-single-container) | [flink][] | 0.3.26+ |
+| [Edgedb](https://github.com/IgnisDa/dokku-edgedb) | [ignisda][] | 0.27.0+ |
+
+#### NewSQL
+
+| Plugin | Author | Compatibility |
+| ------------------------------------------------------- | ----------- | ------------- |
+| [Surrealdb](https://github.com/IgnisDa/dokku-surrealdb) | [ignisda][] | 0.27.0+ |
#### Caching
@@ -86,79 +104,57 @@ The following plugins are available and provided by Dokku maintainers. Please f
| [InfluxDB](https://github.com/basgys/dokku-influxdb) | [basgys][] | 0.4.x |
| [RethinkDB](https://github.com/stuartpb/dokku-rethinkdb-plugin) | [stuartpb][] | 0.3.x |
| [Headless Chrome](https://github.com/lazyatom/dokku-chrome) | [lazyatom][] | 0.8.1+ |
+| [HTTP OAuth](https://github.com/cheif/dokku-http-oauth) | [cheif][] | 0.4.0+ |
### Plugins Implementing New Dokku Functionality
| Plugin | Author | Compatibility |
| ------------------------------------------------------------------------------------------------- | --------------------- | --------------------- |
| [App name as env](https://github.com/cjblomqvist/dokku-app-name-env) | [cjblomqvist][] | 0.3.x |
-| [Docker Direct](https://github.com/josegonzalez/dokku-docker-direct) | [josegonzalez][] | 0.4.0+ |
+| [APT](https://github.com/dokku-community/dokku-apt) | [dokku-community][] | 0.18.x+ |
+| [Auto Sync](https://github.com/IdeaSynthesis/dokku-autosync)1 | [fomojola][] | 0.8.1+ |
+| [Deploy Webhook](https://github.com/IdeaSynthesis/dokku-deploy-webhook)2 | [fomojola][] | 0.8.1+ |
+| [DNS](https://github.com/deanmarano/dokku-dns) | [deanmarano][] | 0.31.0+ |
+| [Docker auto persist volumes](https://github.com/Flink/dokku-docker-auto-volumes) | [flink][] | 0.4.0+ |
+| [Docker Direct](https://github.com/dokku-community/dokku-docker-direct) | [josegonzalez][] | 0.4.0+ |
| [Dokku Clone](https://github.com/crisward/dokku-clone) | [crisward][] | 0.4.0+ |
-| [Dokku Copy App Config Files](https://github.com/josegonzalez/dokku-supply-config) | [josegonzalez][] | 0.4.0+ |
-| [Dockerfile custom path](https://github.com/mimischi/dokku-dockerfile) | [mimischi][] | 0.8.0+ |
-| [Dokku Require](https://github.com/crisward/dokku-require)1 | [crisward][] | 0.4.0+ |
+| [Dokku Copy App Config Files](https://github.com/dokku-community/dokku-supply-config) | [josegonzalez][] | 0.4.0+ |
+| [Dokku Require](https://github.com/crisward/dokku-require)3 | [crisward][] | 0.4.0+ |
| [Global Certificates](https://github.com/josegonzalez/dokku-global-cert) | [josegonzalez][] | 0.5.0+ |
| [Graduate (Environment Management)](https://github.com/glassechidna/dokku-graduate) | [benjamin-dobell][] | 0.4.0+ |
-| [Haproxy tcp load balancer](https://github.com/256dpi/dokku-haproxy) | [256dpi][] | 0.4.0+ |
+| [Host post-build command hook](https://github.com/baikunz/dokku-post-deploy-script) | [baikunz][] | 0.4.0+ |
+| [Host pre-build command hook](https://github.com/fteychene/dokku-build-hook) | [fteychene][] | 0.4.0+ |
| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
| [HTTP Auth Secure Apps](https://github.com/matto1990/dokku-secure-apps) | [matto1990][] | 0.4.0+ |
+| [Image Size Limit](https://github.com/Tashows/dokku-image-size-limit) | [Tashows][] | |
+| [Litestream](https://github.com/AxelTheGerman/dokku-litestream)4 | [AxelTheGerman][] | 0.27.0+ |
| [Monit (Health Checks)](https://github.com/mbreit/dokku-monit) | [mbreit][] | 0.8.0+ |
-| [Nuke Containers](https://github.com/josegonzalez/dokku-nuke) | [josegonzalez][] | 0.4.0+ |
-| [Open App Ports](https://github.com/josegonzalez/dokku-ports) | [josegonzalez][] | 0.3.x |
+| [Monit](https://github.com/cjblomqvist/dokku-monit) | [cjblomqvist][] | 0.3.x |
+| [Multicast DNS (mDNS)](https://github.com/calyhre/dokku-mdns) | [calyhre][] | 0.33.0+ |
+| [Nuke Containers](https://github.com/dokku-community/dokku-nuke) | [josegonzalez][] | 0.4.0+ |
| [Proctype Filter](https://github.com/michaelshobbs/dokku-proctype-filter) | [michaelshobbs][] | 0.4.0+ |
| [robots.txt](https://notabug.org/candlewaster/dokku-robots.txt) | [candlewaster][] | 0.4.x |
-| [SSH Deployment Keys](https://github.com/cedricziel/dokku-deployment-keys)2 | [cedricziel][] | 0.4.0+ |
-| [SSH Hostkeys](https://github.com/cedricziel/dokku-hostkeys-plugin)3 | [cedricziel][] | 0.3.x |
-| [Application build hook](https://github.com/fteychene/dokku-build-hook) | [fteychene][] | 0.4.0+ |
-| [Post Deploy Script](https://github.com/baikunz/dokku-post-deploy-script) | [baikunz][] | 0.4.0+ |
-| [Auto Sync](https://github.com/IdeaSynthesis/dokku-autosync)4 | [fomojola][] | 0.8.1+ |
-| [Deploy Webhook](https://github.com/IdeaSynthesis/dokku-deploy-webhook)5 | [fomojola][] | 0.8.1+ |
-
-1 Extends app.json support to include creating volumes and creating / linking databases on push
+| [Tor](https://github.com/michaelshobbs/dokku-tor) | [michaelshobbs][] | 0.4.0+ |
+| [UFW](https://github.com/dokku-community/dokku-ufw) | [josegonzalez][] | 0.3.x |
+| [User Access](https://github.com/mainto/dokku-access) | [mainto][] | 0.4.0+ |
+| [User ACL](https://github.com/dokku-community/dokku-acl) | [maciej Åebkowski][] | 0.4.0+ |
-2 Adds the possibility to add SSH deployment keys to receive private hosted packages
+1 Adds the ability to sync an application repo with a remote GitHub repo (useful for automated rebuilds without needing a git push from an external system
-3 Adds the ability to add custom hosts to the containers known_hosts file to be able to ssh them easily (useful with deployment keys)
+2 Adds the ability to invoke a post-deploy webhook with the IP, port and app name, all with a single config:set).
-4 Adds the ability to sync an application repo with a remote GitHub repo (useful for automated rebuilds without needing a git push from an external system
+3 Extends app.json support to include creating volumes and creating / linking databases on push
-5 Adds the ability to invoke a post-deploy webhook with the IP, port and app name, all with a single config:set).
+4 Adds SQLite replication to external object storage via [Litestream](https://litestream.io)
### Other Plugins
| Plugin | Author | Compatibility |
| ------------------------------------------------------------------------------------------------- | --------------------- | --------------------- |
-| [Airbrake deploy](https://github.com/Flink/dokku-airbrake-deploy) | [flink][] | 0.4.0+ |
-| [APT](https://github.com/dokku-community/dokku-apt) | [dokku-community][] | 0.18.x+ |
-| [Bower install](https://github.com/alexanderbeletsky/dokku-bower-install) | [alexanderbeletsky][] | 0.3.x |
-| [Bower/Grunt](https://github.com/thrashr888/dokku-bower-grunt-build-plugin) | [thrashr888][] | 0.3.x |
-| [Bower/Gulp](https://github.com/gdi2290/dokku-bower-gulp-build-plugin) | [gdi2290][] | 0.3.x |
-| [Bower/Gulp](https://github.com/jagandecapri/dokku-bower-gulp-build-plugin) | [jagandecapri][] | 0.3.x |
-| [Builders: bower, compass, gulp, grunt](https://github.com/ignlg/dokku-builders-plugin) | [ignlg][] | 0.4.0+ |
| [Chef cookbook](https://github.com/nickcharlton/dokku-cookbook) | [nickcharlton][] | |
-| [Docker auto persist volumes](https://github.com/Flink/dokku-docker-auto-volumes) | [flink][] | 0.4.0+ |
-| [Hostname](https://github.com/michaelshobbs/dokku-hostname) | [michaelshobbs][] | 0.4.0+ |
-| [Limit (Resource management)](https://github.com/sarendsen/dokku-limit) | [sarendsen][] | 0.9.0+ |
-| [Logspout](https://github.com/michaelshobbs/dokku-logspout) | [michaelshobbs][] | 0.4.0+ |
-| [Syslog](https://github.com/michaelshobbs/dokku-syslog) | [michaelshobbs][] | 0.10.4+ |
-| [Long Timeout](https://github.com/investtools/dokku-long-timeout-plugin) | [investtools][] | 0.4.0+ |
-| [Monit](https://github.com/cjblomqvist/dokku-monit) | [cjblomqvist][] | 0.3.x |
-| [Monorepo](https://github.com/iamale/dokku-monorepo) | [iamale][] | 0.4.0+ |
-| [Multi Dockerfile](https://github.com/artofrawr/dokku-multi-dockerfile) | [artofrawr][] | 0.4.0+ |
-| [Node](https://github.com/ademuk/dokku-nodejs) | [ademuk][] | 0.3.x |
-| [Node](https://github.com/pnegahdar/dokku-node) | [pnegahdar][] | 0.3.x |
-| [Rollbar](https://github.com/iloveitaly/dokku-rollbar) | [iloveitaly][] | 0.5.0+ |
-| [Slack Notifications](https://github.com/ribot/dokku-slack) | [ribot][] | 0.4.0+ |
-| [Telegram Notifications](https://github.com/m0rth1um/dokku-telegram) | [m0rth1um][] | 0.4.0+ |
-| [Tor](https://github.com/michaelshobbs/dokku-tor) | [michaelshobbs][] | 0.4.0+ |
-| [User ACL](https://github.com/dokku-community/dokku-acl) | [maciej Åebkowski][] | 0.4.0+ |
-| [Webhooks](https://github.com/nickstenning/dokku-webhooks) | [nickstenning][] | 0.3.x |
-| [Wkhtmltopdf](https://github.com/mbriskar/dokku-wkhtmltopdf) | [mbriskar][] | 0.4.0+ |
-| [Dokku Wordpress](https://github.com/dokku-community/dokku-wordpress) | [dokku-community][] | 0.4.0+ |
-| [Access](https://github.com/mainto/dokku-access) | [mainto][] | 0.4.0+ |
-| [Dokku Nginx Trust Proxy](https://github.com/kingsquare/dokku-nginx-vhost-trustproxy) | [kingsquare][] | 0.4.0+ |
-| [Fonts](https://github.com/ollej/dokku-fonts) | [ollej][] | 0.19.11+ |
| [Discourse](https://github.com/badsyntax/dokku-discourse) | [badsyntax][] | 0.21.4+ |
+| [Tailscale](https://github.com/andrew-womeldorf/dokku-tailscale) | [andrew-womeldorf][] | 0.34.4+ |
+| [Wordpress](https://github.com/dokku-community/dokku-wordpress) | [dokku-community][] | 0.4.0+ |
### Deprecated Plugins
@@ -166,23 +162,41 @@ The following plugins have been removed as their functionality is now in Dokku C
| Plugin | Author | In Dokku Since |
| ------------------------------------------------------------------------------------------------- | --------------------- | ----------------------------------------- |
+| [Airbrake deploy](https://github.com/Flink/dokku-airbrake-deploy) | [flink][] | v0.5.0 (deployment tasks) |
| [App User](https://github.com/michaelshobbs/dokku-app-user) | [michaelshobbs][] | v0.7.1 (herokuish 0.3.18) |
-| [Custom Domains](https://github.com/neam/dokku-custom-domains) | [neam][] | v0.3.10 (domains plugin) |
+| [Bower/Grunt](https://github.com/thrashr888/dokku-bower-grunt-build-plugin) | [thrashr888][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Bower/Gulp](https://github.com/gdi2290/dokku-bower-gulp-build-plugin) | [gdi2290][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Bower install](https://github.com/alexanderbeletsky/dokku-bower-install) | [alexanderbeletsky][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Bower/Gulp](https://github.com/jagandecapri/dokku-bower-gulp-build-plugin) | [jagandecapri][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Builders: bower, compass, gulp, grunt](https://github.com/ignlg/dokku-builders-plugin) | [ignlg][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Custom Domains](https://github.com/neam/dokku-custom-domains) | [neam][] | v0.3.10 (domains plugin) |
| [Debug](https://github.com/josegonzalez/dokku-debug) | [josegonzalez][] | v0.3.9 (trace command) |
+| [Dockerfile custom path](https://github.com/mimischi/dokku-dockerfile) | [mimischi][] | v0.25.0 (monorepo support) |
| [Docker Options](https://github.com/dyson/dokku-docker-options) | [dyson][] | v0.3.17 (docker-options plugin) |
| [Dokku Name](https://github.com/alex-sherwin/dokku-name) | [alex-sherwin][] | v0.4.2 (named containers plugin) |
| [Events Logger](https://github.com/alessio/dokku-events) | [alessio][] | v0.3.21 (events plugin) |
+| [Fonts](https://github.com/ollej/dokku-fonts) | [ollej][] | v0.5.0 (deployment tasks) |
| [git rev-parse HEAD in env](https://github.com/dokku-community/dokku-git-rev) | [cjblomqvist][] | v0.12.0 (enhanced core git plugin) |
| [Host Port binding](https://github.com/stuartpb/dokku-bind-port) | [stuartpb][] | v0.3.17 (docker-options plugin) |
| [Link Containers](https://github.com/rlaneve/dokku-link) | [rlaneve][] | v0.3.17 (docker-options plugin) |
| [List Containers](https://github.com/josegonzalez/dokku-list) | [josegonzalez][] | v0.3.14 (ps plugin) |
+| [Logspout](https://github.com/michaelshobbs/dokku-logspout) | [michaelshobbs][] | v0.22.6 (vector log shipping) |
+| [Long Timeout](https://github.com/investtools/dokku-long-timeout-plugin) | [investtools][] | v0.21.0 (proxy-read-timeout nginx setting)|
+| [Monorepo](https://github.com/iamale/dokku-monorepo) | [iamale][] | v0.25.0 (monorepo builder support) |
| [Multi-Buildpack](https://github.com/pauldub/dokku-multi-buildpack) | [pauldub][] | v0.4.0 (herokuish) |
| [Multiple Domains](https://github.com/wmluke/dokku-domains-plugin)1 | [wmluke][] | v0.3.10 (domains plugin) |
+| [Multi Dockerfile](https://github.com/artofrawr/dokku-multi-dockerfile) | [artofrawr][] | v0.25.0 (monorepo support) |
| [Named-containers](https://github.com/Flink/dokku-named-containers) | [flink][] | v0.4.2 (named-containers plugin) |
+| [Nginx Trust Proxy](https://github.com/kingsquare/dokku-nginx-vhost-trustproxy) | [kingsquare][] | v0.23.0 (nginx x-forwarded-* properties) |
+| [Node](https://github.com/ademuk/dokku-nodejs) | [ademuk][] | v0.5.0 (deployment tasks and .buildpacks) |
+| [Node](https://github.com/pnegahdar/dokku-node) | [pnegahdar][] | v0.5.0 (deployment tasks and .buildpacks) |
| [Nginx-Alt](https://github.com/mikexstudios/dokku-nginx-alt) | [mikexstudios][] | v0.3.10 (domains plugin) |
| [Persistent Storage](https://github.com/dyson/dokku-persistent-storage) | [dyson][] | v0.3.17 (docker-options plugin) |
| [Pre-Deploy Tasks](https://github.com/michaelshobbs/dokku-app-predeploy-tasks) | [michaelshobbs][] | v0.5.0 (deployment tasks) |
| [PrimeCache](https://github.com/darkpixel/dokku-prime-cache) | [darkpixel][] | v0.3.0 (zero downtime deploys) |
+| [Rollbar](https://github.com/iloveitaly/dokku-rollbar) | [iloveitaly][] | v0.5.0 (deployment tasks) |
+| [Syslog](https://github.com/michaelshobbs/dokku-syslog) | [michaelshobbs][] | v0.22.6 (vector log shipping) |
+| [Haproxy tcp load balancer](https://github.com/256dpi/dokku-haproxy) | [256dpi][] | v0.28.0 (haproxt plugin) |
| [Process Manager: Circus](https://github.com/apmorton/dokku-circus) | [apmorton][] | v0.3.14/0.7.0 (ps/restart policy plugin) |
| [Process Manager: Forego](https://github.com/Flink/dokku-forego) | [flink][] | v0.3.14/0.7.0 (ps plugin) |
| [Process Manager: Forego](https://github.com/iskandar/dokku-forego) | [iskandar][] | v0.3.14/0.7.0 (ps plugin) |
@@ -191,13 +205,18 @@ The following plugins have been removed as their functionality is now in Dokku C
| [Process Manager: Supervisord](https://github.com/statianzo/dokku-supervisord) | [statianzo][] | v0.3.14/0.7.0 (ps plugin) |
| [Rebuild application](https://github.com/scottatron/dokku-rebuild) | [scottatron][] | v0.3.14 (ps plugin) |
| [Reset mtime](https://github.com/mixxorz/dokku-docker-reset-mtime) | [mixxorz][] | Docker 1.8+ |
+| [SSH Deployment Keys](https://github.com/cedricziel/dokku-deployment-keys) | [dokku][] | v0.33.0 (git plugin) |
| [Supply env vars to buildpacks](https://github.com/cameron-martin/dokku-build-env)2 | [cameron-martin][] | v0.3.9 (build-env plugin) |
+| [Slack Notifications](https://github.com/ribot/dokku-slack) | [ribot][] | v0.5.0 (deployment tasks) |
+| [Telegram Notifications](https://github.com/m0rth1um/dokku-telegram) | [m0rth1um][] | v0.5.0 (deployment tasks) |
| [user-env-compile](https://github.com/motin/dokku-user-env-compile)2 | [motin][] | v0.3.9 (build-env plugin) |
| [user-env-compile](https://github.com/musicglue/dokku-user-env-compile)2 | [musicglue][] | v0.3.9 (build-env plugin) |
| [Volume (persistent storage)](https://github.com/ohardy/dokku-volume) | [ohardy][] | v0.5.0 (storage plugin) |
+| [Webhooks](https://github.com/nickstenning/dokku-webhooks) | [nickstenning][] | v0.5.0 (deployment tasks) |
+| [Wkhtmltopdf](https://github.com/mbriskar/dokku-wkhtmltopdf) | [mbriskar][] | v0.5.0 (deployment tasks) |
1 Conflicts with [VHOSTS Custom Configuration](https://github.com/neam/dokku-nginx-vhosts-custom-configuration)
-2 Similar to the heroku-labs feature (see https://devcenter.heroku.com/articles/labs-user-env-compile)
+2 Similar to the [heroku-labs feature](https://devcenter.heroku.com/articles/labs-user-env-compile)
### Unmaintained Plugins
@@ -221,9 +240,9 @@ The following plugins are no longer maintained by their developers.
| [Neo4j](https://github.com/Aomitayo/dokku-neo4j-plugin) | [aomitayo][] | |
| [PostGIS](https://github.com/fermuch/dokku-pg-plugin) | [fermuch][] | |
| [PostgreSQL (single container)](https://github.com/jeffutter/dokku-postgresql-plugin) | [jeffutter][] | This plugin creates a single postgresql container that all your apps can use. Thus only one instance of postgresql running (good for servers without a ton of memory). |
-| [RiakCS (single container)](https://github.com/jeffutter/dokku-riakcs-plugin) | [jeffutter][] | Incompatible with 0.2.0 |
| [Redis](https://github.com/luxifer/dokku-redis-plugin) | [luxifer][] | |
| [Redis](https://github.com/sekjun9878/dokku-redis-plugin) | [sekjun9878][] | 0.3.26+ |
+| [RiakCS (single container)](https://github.com/jeffutter/dokku-riakcs-plugin) | [jeffutter][] | Incompatible with 0.2.0 |
1 Forked from [jezdez/dokku-elasticsearch-plugin](https://github.com/jezdez/dokku-elasticsearch-plugin): uses Elasticsearch 1.2 (instead of 0.90), doesn't depend on dokku-link, runs as elasticsearch user instead of root, and turns off multicast autodiscovery for use in a VPS environment.
@@ -235,21 +254,26 @@ The following plugins are no longer maintained by their developers.
[alexanderbeletsky]: https://github.com/alexanderbeletsky
[alexkruegger]: https://github.com/alexkruegger
[aluxian]: https://github.com/aluxian
+[andrew-womeldorf]: https://github.com/andrew-womeldorf
[aomitayo]: https://github.com/aomitayo
[apmorton]: https://github.com/apmorton
[artofrawr]: https://github.com/artofrawr
+[AxelTheGerman]: https://github.com/AxelTheGerman
[badsyntax]: https://github.com/badsyntax
[basgys]: https://github.com/basgys
[benjamin-dobell]: https://github.com/benjamin-dobell
[blag]: https://github.com/blag
+[calyhre]: https://github.com/calyhre
[cameron-martin]: https://github.com/cameron-martin
[candlewaster]: https://notabug.org/candlewaster
[cedricziel]: https://github.com/cedricziel
[cef]: https://github.com/cef
+[cheif]: https://github.com/cheif
[cjblomqvist]: https://github.com/cjblomqvist
[crisward]: https://github.com/crisward
[cu12]: https://github.com/cu12
[darkpixel]: https://github.com/darkpixel
+[deanmarano]: https://github.com/deanmarano
[dokku]: https://github.com/dokku
[dokku-community]: https://github.com/dokku-community
[dyson]: https://github.com/dyson
@@ -301,11 +325,12 @@ The following plugins are no longer maintained by their developers.
[sekjun9878]: https://github.com/sekjun9878
[statianzo]: https://github.com/statianzo
[stuartpb]: https://github.com/stuartpb
+[Tashows]: https://github.com/Tashows
[thrashr888]: https://github.com/thrashr888
[wmluke]: https://github.com/wmluke
[zenedith]: https://github.com/zenedith
[fteychene]: https://github.com/fteychene
-[sarendsen]: https://github.com/sarendsen
[baikunz]: https://github.com/baikunz
[lazyatom]: https://github.com/lazyatom
[ollej]: https://github.com/ollej
+[ignisda]: https://github.com/IgnisDa
diff --git a/docs/community/tutorials/run-on-external-volume.md b/docs/community/tutorials/run-on-external-volume.md
deleted file mode 100644
index 19027a03ad9..00000000000
--- a/docs/community/tutorials/run-on-external-volume.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# Run Dokku on External Volume
-
-In order to leverage cloud-provider facilities like _attachable volumes_, (_a.k.a. block storage_)
-the following is an easy tutorial to achieve Dokku runs on them.
-
-> Warning: If the block storage is not available and attached on boot it is possible that containers will not correctly start. Please keep this in mind when considering moving Dokku and/or Docker to network attached storage.
-
-## Tutorial
-
-The following is intended to be executed on the dokku host machine as `root`.
-Say, _for instance_, that our volume is mapped into the systems as `/dev/vdb1`.
-
-Stop docker daemon
-
-```shell
-systemctl stop docker
-```
-
-Prepare the filesystem:
-
-```shell
-mkfs -t ext4 /dev/vdb1
-mkdir /mnt/volume
-mount /dev/vdb1 /mnt/volume
-```
-
-Move the old data directories:
-
-```shell
-mv /home/dokku /home/dokku.OLD
-mv /var/lib/docker /var/lib/docker.OLD
-mv /var/lib/dokku /var/lib/dokku.OLD
-```
-
-Move the data on the volume
-
-```shell
-mkdir /mnt/volume/home/
-mkdir -p /mnt/volume/var/lib/
-mv /home/dokku.OLD /mnt/volume/home/dokku
-mv /var/lib/dokku.OLD /mnt/volume/var/lib/dokku
-mv /var/lib/docker.OLD /mnt/volume/var/lib/docker
-```
-
-Prepare the mountpoints
-
-```shell
-mkdir /home/dokku
-mkdir /var/lib/dokku
-mkdir /var/lib/docker
-chown dokku:dokku /home/dokku # respect the original ownership
-chmod 711 /var/lib/docker # respect the original permissions
-```
-
-Mount bind
-
-```shell
-mount -o bind /mnt/volume/home/dokku /home/dokku
-mount -o bind /mnt/volume/var/lib/dokku /var/lib/dokku
-mount -o bind /mnt/volume/var/lib/docker /var/lib/docker
-```
-
-Start docker daemon
-
-```shell
-systemctl start docker
-```
-
-At this point all should be working fine, please check it out.
-
-Then, let the changes be reboot-persistent
-
-```shell
-echo '/dev/vdb1 /mnt/volume ext4 defaults 0 2' | sudo tee -a /etc/fstab
-echo '/mnt/volume/home/dokku /home/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
-echo '/mnt/volume/var/lib/dokku /var/lib/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
-echo '/mnt/volume/var/lib/docker /var/lib/docker none defaults,bind 0 0' | sudo tee -a /etc/fstab
-```
diff --git a/docs/configuration/domains.md b/docs/configuration/domains.md
index c3e28f77fa8..c1944279dc1 100644
--- a/docs/configuration/domains.md
+++ b/docs/configuration/domains.md
@@ -1,5 +1,6 @@
# Domain Configuration
+> [!IMPORTANT]
> New as of 0.3.10
```
@@ -12,6 +13,7 @@ domains:enable # Enable VHOST support
domains:remove [ ...] # Remove domains from app
domains:remove-global [ ...] # Remove global domain names
domains:report [|--global] [] # Displays a domains report for one or more apps
+domains:reset # Reset app domains to global-configured domains
domains:set [ ...] # Set domains for app
domains:set-global [ ...] # Set global domain names
```
@@ -32,7 +34,7 @@ If an FQDN such as `dokku.org` is used as the application name, the global virtu
You can optionally override this in a plugin by implementing the `nginx-hostname` plugin trigger. If the `nginx-hostname` plugin has no output, the normal hostname algorithm will be executed. See the [plugin trigger documentation](/docs/development/plugin-triggers.md#nginx-hostname) for more information.
-## Disabling VHOSTS
+## Enabling and disabling VHOSTS
If desired, it is possible to disable vhosts with the domains plugin.
@@ -40,7 +42,20 @@ If desired, it is possible to disable vhosts with the domains plugin.
dokku domains:disable node-js-app
```
-On subsequent deploys, the nginx virtualhost will be discarded. This is useful when deploying internal-facing services that should not be publicly routeable. As of 0.4.0, nginx will still be configured to proxy your app on some random high port. This allows internal services to maintain the same port between deployments. You may change this port by setting `DOKKU_PROXY_PORT` and/or `DOKKU_PROXY_SSL_PORT` (for services configured to use SSL.)
+Vhosts can also be disabled for all apps:
+
+```shell
+dokku domains:disable --all
+```
+
+On subsequent deploys, the nginx virtualhost will be discarded. This is useful when deploying internal-facing services that should not be publicly routeable. As of 0.4.0, nginx will still be configured to proxy your app on some random high port. This allows internal services to maintain the same port between deployments. The non-SSL and SSL ports used can be customized via `dokku proxy:set proxy-port ` and `dokku proxy:set proxy-ssl-port ` - see the [proxy management documentation](/docs/networking/proxy-management.md#setting-proxy-ports) for details.
+
+To re-enable, run the `domains:enable` subcommand:
+
+```shell
+dokku domains:enable node-js-app
+dokku domains:enable --all
+```
The domains plugin allows you to specify custom domains for applications. This plugin is aware of any ssl certificates that are imported via `certs:add`. Be aware that disabling domains (with `domains:disable`) will override any custom domains.
@@ -61,10 +76,14 @@ dokku domains:remove node-js-app dokku.me
# set all custom domains for app
dokku domains:set node-js-app dokku.me dokku.org
+
+# delete all app domains and configure available global domains on it
+dokku domains:reset node-js-app
```
## Displaying domains reports for an app
+> [!IMPORTANT]
> New as of 0.8.1
You can get a report about the app's domains status using the `domains:report` command:
@@ -113,4 +132,4 @@ dokku domains:report node-js-app --domains-app-enabled
## Default site
-This is specific to your proxy plugin of choice. See the [nginx documentation](/docs/configuration/nginx.md#default-site) for more information on how to configure this for the default nginx proxy implementation.
+This is specific to your proxy plugin of choice. See the [nginx documentation](/docs/networking/proxies/nginx.md#default-site) for more information on how to configure this for the default nginx proxy implementation.
diff --git a/docs/configuration/environment-variables.md b/docs/configuration/environment-variables.md
index 2914a6d0394..80e9bb65644 100644
--- a/docs/configuration/environment-variables.md
+++ b/docs/configuration/environment-variables.md
@@ -8,27 +8,30 @@ The `config` plugin provides the following commands to manage your variables:
config:show (|--global) Pretty-print an app or global environment
config:bundle (|--global) [--merged] Bundle environment into tarfile
config:clear (|--global) Clears environment variables
-config:export (|--global) [--envfile] Export a global or app environment
+config:export (|--global) [--format ] Export a global or app environment
config:get (|--global) KEY Display a global or app-specific config value
config:keys (|--global) [--merged] Show keys set in environment
config:set [--encoded] [--no-restart] (|--global) KEY1=VALUE1 [KEY2=VALUE2 ...] Set one or more config vars
config:unset [--no-restart] (|--global) KEY1 [KEY2 ...] Unset one or more config vars
```
-> For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available _only_ during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860).
+
+> For security reasons - and as per [docker recommendations](https://github.com/docker/docker/issues/13490) - Dockerfile-based deploys have variables available _only_ during runtime, as noted in [this issue](https://github.com/dokku/dokku/issues/1860). Consider using [build arguments](/docs/deployment/builders/dockerfiles.md#build-time-configuration-variables) to expose variables during build-time for Dockerfile apps.
Environment variables are available both at run time and during the application build/compilation step for buildpack-based deploys.
For buildpack deploys, Dokku will create a `/app/.env` file that can be used for legacy buildpacks. Note that this is _not_ updated when `config:set` or `config:unset` is called, and is only written during a `deploy` or `ps:rebuild`. Developers are encouraged to instead read from the application environment directly, as the proper values will be available then.
-> Note: Global `ENV` files are sourced before app-specific `ENV` files. This means that app-specific variables will take precedence over global variables. Configuring your global `ENV` file is manual, and should be considered potentially dangerous as configuration applies to all applications.
+> [!NOTE]
+> Global environment variables are sourced before app-specific environment variables. This means that app-specific variables will take precedence over global variables. Configuring global environment variables should be considered potentially dangerous as configuration applies to all applications.
You can set multiple environment variables at once:
```shell
-dokku config:set node-js-app ENV=prod COMPILE_ASSETS=1
+dokku config:set node-js-app APP_ENV=prod COMPILE_ASSETS=1
```
-> Note: Whitespace and special characters get tricky. If you are using dokku locally you don't need to do any special escaping. If you are using dokku over ssh you will need to backslash-escape spaces:
+Whitespace and special characters get tricky. If you are using dokku locally you don't need to do any special escaping. If you are using dokku over ssh you will need to backslash-escape spaces:
+
```shell
dokku config:set node-js-app KEY="VAL\ WITH\ SPACES"
```
@@ -36,13 +39,26 @@ dokku config:set node-js-app KEY="VAL\ WITH\ SPACES"
Dokku can also read base64 encoded values. That's the easiest way to set a value with newlines or spaces. To set a value with newlines you need to base64 encode it first and pass the `--encoded` flag:
```shell
-dokku config:set --encoded node-js-app KEY="$(base64 ~/.ssh/id_rsa)"
+dokku config:set --encoded node-js-app KEY="$(base64 -w 0 ~/.ssh/id_rsa)"
+```
+
+Decoded values are stored byte-for-byte exactly as they were encoded. Be aware that `echo "value" | base64` appends a trailing `\n` before encoding because `echo` always adds a newline, and that newline becomes part of the stored value. This is rarely what you want for short inline values - use `printf '%s'` or `echo -n` instead:
+
+```shell
+dokku config:set --encoded node-js-app KEY="$(printf '%s' "myvalue" | base64 -w 0)"
+dokku config:set --encoded node-js-app KEY="$(echo -n "myvalue" | base64 -w 0)"
+```
+
+For multi-line values from a file (such as an SSH private key), `cat` and `base64 -w 0` preserve the file contents exactly:
+
+```shell
+dokku config:set --encoded node-js-app KEY="$(cat ~/.ssh/id_rsa | base64 -w 0)"
```
When setting or unsetting environment variables, you may wish to avoid an application restart. This is useful when developing plugins or when setting multiple environment variables in a scripted manner. To do so, use the `--no-restart` flag:
```shell
-dokku config:set --no-restart node-js-app ENV=prod
+dokku config:set --no-restart node-js-app APP_ENV=prod
```
If you wish to have the variables output in an `eval`-compatible form, you can use the `config:export` command
@@ -51,29 +67,58 @@ If you wish to have the variables output in an `eval`-compatible form, you can u
dokku config:export node-js-app
# outputs variables in the form:
#
-# export ENV='prod'
+# export APP_ENV='prod'
# export COMPILE_ASSETS='1'
# source in all the node-js-app app environment variables
eval $(dokku config:export node-js-app)
```
-You can control the format of the exported variables with the `--format` flag.
-`--format=shell` will output the variables in a single-line for usage in command-line utilities:
+You can control the format of the exported variables with the `--format` flag. `--format=shell` will output the variables in a single-line for usage in command-line utilities:
```shell
dokku config:export --format shell node-js-app
# outputs variables in the form:
#
-# ENV='prod' COMPILE_ASSETS='1'
+# APP_ENV='prod' COMPILE_ASSETS='1'
```
+## Setting Environment Variables via app.json
+
+Environment variables can also be declared in an `app.json` file in your repository root. This is useful for setting default values, generating secrets, or requiring certain variables to be set before deployment.
+
+```json
+{
+ "env": {
+ "SIMPLE_VAR": "default_value",
+ "SECRET_KEY": {
+ "description": "A secret key for signing tokens",
+ "generator": "secret"
+ },
+ "DATABASE_URL": {
+ "description": "PostgreSQL connection string",
+ "required": true
+ }
+ }
+}
+```
+
+Environment variables from `app.json` are processed during the first deploy, before the predeploy script runs. Variables can be configured as:
+
+- **Simple string values**: Set as defaults if not already configured
+- **Generated secrets**: Use `"generator": "secret"` to auto-generate a 64-character hex string
+- **Required variables**: Use `"required": true` to prompt for or require a value
+- **Synced variables**: Use `"sync": true` to update the value on every deploy
+
+For full details on the `env` schema and behavior, see the [app.json documentation](/docs/appendices/file-formats/app-json.md#env).
+
## Special Config Variables
The following config variables have special meanings and can be set in a variety of ways. Unless specified via global app config, the values may not be passed into applications. Usage of these values within applications should be considered unsafe, as they are an internal configuration values that may be moved to the internal properties system in the future.
-> Warning: This list is not exhaustive, and may vary from version to version.
+> [!WARNING]
+> This list is not exhaustive, and may vary from version to version.
| Name | Default | How to modify | Description |
| ------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
@@ -92,37 +137,18 @@ The following config variables have special meanings and can be set in a variety
| `DOKKU_APP_NAME` | none | `--app APP` flag | Name of application to work on. Respected by core plugins. |
| `DOKKU_APPS_FORCE_DELETE` | none | `--force` flag | Whether to force delete an application. Also used by other plugins for destructive actions. |
| `DOKKU_CHECKS_URL` | `https://dokku.com/docs/deployment/zero-downtime-deploys/` | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` | Url displayed during deployment when no CHECKS file exists. |
-| `DOKKU_DETACH_CONTAINER` | none | `--detach` flag | Deprecated: Whether to detach a container started via `dokku run`. |
| `DOKKU_QUIET_OUTPUT` | none | `--quiet` flag | Silences certain header output for `dokku` commands. |
| `DOKKU_RM_CONTAINER` | none | `dokku config:set` | Deprecated: Whether to keep `dokku run` containers around or not. |
| `DOKKU_TRACE` | none | `dokku trace:on` `dokku trace:off` `--trace` flag | Turn on very verbose debugging. |
-| `DOKKU_APP_PROXY_TYPE` | `nginx` | `dokku proxy:set` | |
-| `DOKKU_APP_RESTORE` | `1` | `dokku config:set` `dokku ps:stop` | |
-| `DOKKU_APP_SHELL` | `/bin/bash` | `dokku config:set` | Allows users to change the default shell used by Dokku for `dokku enter` and execution of deployment tasks. |
-| `DOKKU_APP_TYPE` | `herokuish` | Auto-detected by using buildpacks or dockerfile | |
-| `DOKKU_CHECKS_DISABLED` | none | `dokku checks:disable` | |
-| `DOKKU_CHECKS_ENABLED` | none | `dokku checks:enable` | |
-| `DOKKU_CHECKS_SKIPPED` | none | `dokku checks:skip` | |
-| `DOKKU_CHECKS_WAIT` | `5` | `dokku config:set` | Wait this many seconds for the container to start before running checks.
-| `DOKKU_CHECKS_TIMEOUT` | `30` | `dokku config:set` | Wait this many seconds for each response before marking it as a failure.
-| `DOKKU_CHECKS_ATTEMPTS` | `5` | `dokku config:set` | Number of retries for to run for a specific check before marking it as a failure
-| `DOKKU_DEFAULT_CHECKS_WAIT` | `10` | `dokku config:set` | If no user-defined checks are specified - or if the process being checked is not a `web` process - this is the period of time Dokku will wait before checking that a container is still running. |
-| `DOKKU_DISABLE_PROXY` | none | `dokku proxy:disable` `dokku proxy:enable` | Disables the proxy in front of your application, resulting in publicly routing the docker container. |
-| `DOKKU_DISABLE_ANSI_PREFIX_REMOVAL` | none | `dokku config:set` `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` | Disables removal of the ANSI prefix during deploys. Can be used in cases where the client deployer does not understand ansi escape codes. |
-| `DOKKU_DISABLE_APP_AUTOCREATION` | none | `dokku config:set` | Disables automatic creation of a non-existent app on deploy. |
-| `DOKKU_DOCKER_STOP_TIMEOUT` | `10` | `dokku config:set` | Configurable grace period given to the `docker stop` command. If a container has not stopped by this time, a `kill -9` signal or equivalent is sent in order to force-terminate the container. Both the `ps:stop` and `apps:destroy` commands _also_ respect this value. If not specified, the docker defaults for the [docker stop command](https://docs.docker.com/engine/reference/commandline/stop/) will be used.|
-| `DOKKU_DOCKERFILE_CACHE_BUILD` | none | `dokku config:set` | |
-| `DOKKU_DOCKERFILE_PORTS` | dockerfile ports | `dokku config:set` | |
-| `DOKKU_DOCKERFILE_START_CMD` | none | `dokku config:set` | |
-| `DOKKU_PARALLEL_ARGUMENTS`. | none | `dokku config:set` | Allows passing custom arguments to parallel for `ps:*all` commands |
-| `DOKKU_PROXY_PORT` | automatically assigned | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` `dokku config:set` | |
-| `DOKKU_PROXY_SSL_PORT` | automatically assigned | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` `dokku config:set` | |
-| `DOKKU_PROXY_PORT_MAP` | automatically assigned | `dokku proxy:ports-add` `dokku proxy:ports-remove`, `dokku proxy:ports-clear` | |
-| `DOKKU_SKIP_ALL_CHECKS` | none | `dokku config:set` | |
-| `DOKKU_SKIP_CLEANUP` | | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` | When a deploy is triggered, if this is set to a non-empty value, then old docker containers and images will not be removed. |
-| `DOKKU_SKIP_DEFAULT_CHECKS` | | `dokku config:set` | |
-| `DOKKU_SKIP_DEPLOY` | | `dokku config:set` | |
-| `DOKKU_START_CMD` | none | `dokku config:set` | Command to run instead of `/start $PROC_TYPE` |
| `DOKKU_SYSTEM_GROUP` | `dokku` | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` | System group to chown files as. |
| `DOKKU_SYSTEM_USER` | `dokku` | `/etc/environment` `~dokku/.dokkurc` `~dokku/.dokkurc/*` | System user to chown files as. |
-| `DOKKU_WAIT_TO_RETIRE` | `60` | `dokku config:set` | After a successful deploy, the grace period given to old containers before they are stopped/terminated. This is useful for ensuring completion of long-running http connections. |
+
+## 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 |
diff --git a/docs/configuration/nginx.md b/docs/configuration/nginx.md
deleted file mode 100644
index f4c72494e53..00000000000
--- a/docs/configuration/nginx.md
+++ /dev/null
@@ -1,417 +0,0 @@
-# Nginx Configuration
-
-Dokku uses nginx as its server for routing requests to specific applications. By default, access and error logs are written for each app to `/var/log/nginx/${APP}-access.log` and `/var/log/nginx/${APP}-error.log` respectively
-
-```
-nginx:access-logs [-t] # Show the nginx access logs for an application (-t follows)
-nginx:error-logs [-t] # Show the nginx error logs for an application (-t follows)
-nginx:report [] [] # Displays a nginx report for one or more apps
-nginx:set () # Set or clear an nginx property for an app
-nginx:show-config # Display app nginx config
-nginx:validate-config [] [--clean] # Validates and optionally cleans up invalid nginx configurations
-```
-
-## Usage
-
-### Request Proxying
-
-By default, the `web` process is the only process proxied by the nginx proxy implementation. Proxying to other process types may be handled by a custom `nginx.conf.sigil` file, as generally described [below](/docs/configuration/nginx.md#customizing-the-nginx-configuration)
-
-Nginx will proxy the requests in a [round-robin balancing fashion](http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream) to the different deployed (scaled) containers running the `web` proctype. This way, the host's resources can be fully leveraged for single-threaded applications (e.g. `dokku ps:scale node-js-app web=4` on a 4-core machine)
-
-### Binding to specific addresses
-
-> New as of 0.19.2
-
-By default, nginx will listen to all interfaces (`[::]` for IPv6, `0.0.0.0` for IPv4) when proxying requests to applications. This may be changed using the `bind-address-ipv4` and `bind-address-ipv6` properties. This is useful in cases where the proxying should be internal to a network or if there are multiple network interfaces that should respond with different content.
-
-```shell
-dokku nginx:set node-js-app bind-address-ipv4 127.0.0.1
-dokku nginx:set node-js-app bind-address-ipv6 ::1
-```
-
-This may be reverted by setting an empty bind address.
-
-```shell
-dokku nginx:set node-js-app bind-address-ipv4
-dokku nginx:set node-js-app bind-address-ipv6
-```
-
-> Warning: Validation is not performed on either value.
-
-Users with apps that contain a custom `nginx.conf.sigil` file will need to modify the files to respect the new `NGINX_BIND_ADDRESS_IPV4` and `NGINX_BIND_ADDRESS_IPV6` variables.
-
-### HSTS Header
-
-> New as of 0.20.0
-
-If SSL certificates are present, HSTS will be automatically enabled. It can be toggled via `nginx:set`:
-
-```shell
-dokku nginx:set node-js-app hsts true
-dokku nginx:set node-js-app hsts false
-```
-
-The following options are also available via the `nginx:set` command:
-
-- `hsts` (type: boolean, default: `true`): Enables or disables HSTS for your application.
-- `hsts-include-subdomains` (type: boolean, default: `true`): Tells the browser that the HSTS policy also applies to all subdomains of the current domain.
-- `hsts-max-age` (type: integer, default: `15724800`): Time in seconds to cache HSTS configuration.
-- `hsts-preload` (type: boolean, default: `false`): Tells most major web browsers to include the domain in their HSTS preload lists.
-
-Beware that if you enable the header and a subsequent deploy of your application results in an HTTP deploy (for whatever reason), the way the header works means that a browser will not attempt to request the HTTP version of your site if the HTTPS version fails until the max-age is reached.
-
-#### Globally disabling the HSTS Header
-
-HSTS Header can be disabled for all apps by setting the `hsts` property to false after passing the `--global` flag to `nginx:set`. Changing this value globally or on a per-app basis will require rebuilding the nginx config via the `proxy:build-config` command.
-
-```shell
-dokku nginx:set --global hsts false
-```
-
-Once the HSTS setting is disabled globally, it can be re-enabled on a per-app basis by setting the `hsts` property as normal.
-
-```shell
-dokku nginx:set node-js-app hsts true
-```
-
-### Checking access logs
-
-You may check nginx access logs via the `nginx:access-logs` command. This assumes that app access logs are being stored in `/var/log/nginx/$APP-access.log`, as is the default in the generated `nginx.conf`.
-
-```shell
-dokku nginx:access-logs node-js-app
-```
-
-You may also follow the logs by specifying the `-t` flag.
-
-```shell
-dokku nginx:access-logs node-js-app -t
-```
-
-### Checking error logs
-
-You may check nginx error logs via the `nginx:error-logs` command. This assumes that app error logs are being stored in `/var/log/nginx/$APP-error.log`, as is the default in the generated `nginx.conf`.
-
-```shell
-dokku nginx:error-logs node-js-app
-```
-
-You may also follow the logs by specifying the `-t` flag.
-
-```shell
-dokku nginx:error-logs node-js-app -t
-```
-
-### Changing log path
-
-> New as of 0.20.1
-
-The path to where log files are stored can be changed by calling the `nginx:set` command with the following options:
-
-- `access-log-path` (type: string, default: `${NGINX_LOG_ROOT}/${APP}-access.log`): Log path for nginx access logs
-- `error-log-path` (type: string, default: `${NGINX_LOG_ROOT}/${APP}-error.log`): Log path for nginx error logs
-
-The defaults should not be changed without verifying that the paths will be writeable by nginx. However, this setting is useful for enabling or disabling logging by setting the values to `off`.
-
-```shell
-dokku nginx:set node-js-app access-log-path off
-dokku nginx:set node-js-app error-log-path off
-```
-
-The default value may be set by passing an empty value for the option:
-
-```shell
-dokku nginx:set node-js-app access-log-path
-dokku nginx:set node-js-app error-log-path
-```
-
-In all cases, the nginx config must be regenerated after setting the above values.
-
-### Changing log format
-
-> New as of 0.22.0
-
-The format of the access log can be changed by calling the `nginx:set` command as follows:
-
-```shell
-dokku nginx:set node-js-app access-log-format custom-format
-```
-
-Prior to changing the log-format, log formats should be specified at a file such as `/etc/nginx/conf.d/00-log-formats.conf`. This will ensure they are available within your app's nginx context. For instance, the following may be added to the above file. It only needs to be specified once to be used for all apps.
-
-```nginx
-# /etc/nginx/conf.d/00-log-formats.conf
-# escape=json was added in nginx 1.11.8
-log_format json_combined escape=json
- '{'
- '"time_local":"$time_local",'
- '"remote_addr":"$remote_addr",'
- '"remote_user":"$remote_user",'
- '"request":"$request",'
- '"status":"$status",'
- '"body_bytes_sent":"$body_bytes_sent",'
- '"request_time":"$request_time",'
- '"http_referrer":"$http_referer",'
- '"http_user_agent":"$http_user_agent"'
- '}';
-```
-
-Next, the format should be set for the given app.
-
-```shell
-dokku nginx:set node-js-app access-log-format json_combined
-```
-
-Finally, a proxy rebuild will change the format as desired.
-
-```shell
-dokku proxy:build-config node-js-app
-```
-
-### Specifying a read timeout
-
-> New as of 0.21.0
-
-When proxying requests to your applications, it may be useful to specify a proxy read timeout. This can be done via the `nginx:set` command as follows:
-
-```shell
-dokku nginx:set node-js-app proxy-read-timeout 120s
-```
-
-The default value is `60s`, and all numeric values _must_ have a trailing time value specified (`s` for seconds, `m` for minutes).
-
-The default value may be set by passing an empty value for the option:
-
-```shell
-dokku nginx:set node-js-app proxy-read-timeout
-```
-
-In all cases, the nginx config must be regenerated after setting the above value.
-
-### Specifying a custom client_max_body_size
-
-> New as of 0.23.0
-
-Users can override the default `client_max_body_size` value - which limits file uploads - via `nginx:set`. Changing this value will only apply to every `server` stanza of the default `nginx.conf.sigil`; users of custom `nginx.conf.sigil` files must update their templates to support the new value.
-
-```shell
-dokku nginx:set node-js-app client-max-body-size 50m
-```
-
-The default value is empty string, which will result in nginx falling back to any configured, higher-level defaults (or `1m` if unconfigued; all numerical values _must_ have a size unit specified (`k` for kilobytes, `m` for megabytes).
-
-The default value may be set by passing an empty value for the option:
-
-```shell
-dokku nginx:set node-js-app client-max-body-size
-```
-
-In all cases, the nginx config must be regenerated after setting the above value.
-
-Changing this value when using the PHP buildpack (or any other buildpack that uses an intermediary server) will require changing the value in the server config shipped with that buildpack. Consult your buildpack documentation for further details.
-
-### Showing the nginx config
-
-For debugging purposes, it may be useful to show the nginx config. This can be achieved via the `nginx:show-config` command.
-
-```shell
-dokku nginx:show-config node-js-app
-```
-
-### Validating nginx configs
-
-It may be desired to validate an nginx config outside of the deployment process. To do so, run the `nginx:validate-config` command. With no arguments, this will validate all app nginx configs, one at a time. A minimal wrapper nginx config is generated for each app's nginx config, upon which `nginx -t` will be run.
-
-```shell
-dokku nginx:validate-config
-```
-
-As app nginx configs are actually executed within a shared context, it is possible for an individual config to be invalid when being validated standalone but _also_ be valid within the global server context. As such, the exit code for the `nginx:validate-config` command is the exit code of `nginx -t` against the server's real nginx config.
-
-The `nginx:validate-config` command also takes an optional `--clean` flag. If specified, invalid nginx configs will be removed.
-
-> Warning: Invalid app nginx config's will be removed _even if_ the config is valid in the global server context.
-
-```shell
-dokku nginx:validate-config --clean
-```
-
-The `--clean` flag may also be specified for a given app:
-
-```shell
-dokku nginx:validate-config node-js-app --clean
-```
-
-### Customizing the nginx configuration
-
-> New as of 0.5.0
-
-Dokku uses a templating library by the name of [sigil](https://github.com/gliderlabs/sigil) to generate nginx configuration for each app. You may also provide a custom template for your application as follows:
-
-- Copy the following example template to a file named `nginx.conf.sigil` and either:
- - If using a buildpack application, you __must__ check it into the root of your app repo.
- - If using a dockerfile or docker image for deploys, either:
- - If `WORKDIR` is specified, add the file to the `WORKDIR` specified in the last Dockerfile stage (example: `WORKDIR /app` and `ADD nginx.conf.sigil /app`).
- - If no `WORKDIR` is specified, add the file to the root (`/`) of the docker image (example: `ADD nginx.conf.sigil /`).
-
-> When using a custom `nginx.conf.sigil` file, depending upon your application configuration, you _may_ be exposing the file externally. As this file is extracted before the container is run, you can, safely delete it in a custom `entrypoint.sh` configured in a Dockerfile `ENTRYPOINT`.
-
-> The default template is available [here](https://github.com/dokku/dokku/blob/master/plugins/nginx-vhosts/templates/nginx.conf.sigil), and can be used as a guide for your own, custom `nginx.conf.sigil` file. Please refer to the appropriate template file version for your Dokku version.
-
-While enabled by default, using a custom nginx config can be disabled via `nginx:set`. This may be useful in cases where you do not want to allow users to override any higher-level customization of app nginx config.
-
-```shell
-# enable fetching custom config (default)
-dokku nginx:set node-js-app disable-custom-config false
-
-# disable fetching custom config
-dokku nginx:set node-js-app disable-custom-config true
-```
-
-Unsetting this value is the same as enabling custom nginx config usage.
-
-#### Available template variables
-
-```
-{{ .APP }} Application name
-{{ .APP_SSL_PATH }} Path to SSL certificate and key
-{{ .DOKKU_ROOT }} Global Dokku root directory (ex: app dir would be `{{ .DOKKU_ROOT }}/{{ .APP }}`)
-{{ .PROXY_PORT }} Non-SSL nginx listener port (same as `DOKKU_PROXY_PORT` config var)
-{{ .PROXY_SSL_PORT }} SSL nginx listener port (same as `DOKKU_PROXY_SSL_PORT` config var)
-{{ .NOSSL_SERVER_NAME }} List of non-SSL VHOSTS
-{{ .PROXY_PORT_MAP }} List of port mappings (same as `DOKKU_PROXY_PORT_MAP` config var)
-{{ .PROXY_UPSTREAM_PORTS }} List of configured upstream ports (derived from `DOKKU_PROXY_PORT_MAP` config var)
-{{ .RAW_TCP_PORTS }} List of exposed tcp ports as defined by Dockerfile `EXPOSE` directive (**Dockerfile apps only**)
-{{ .SSL_INUSE }} Boolean set when an app is SSL-enabled
-{{ .SSL_SERVER_NAME }} List of SSL VHOSTS
-```
-
-Finally, each process type has it's network listeners - a list of IP:PORT pairs for the respective app containers - exposed via an `.DOKKU_APP_${PROCESS_TYPE}_LISTENERS` variable - the `PROCESS_TYPE` will be upper-cased with hyphens transformed into underscores. Users can use the new variables to expose non-web processes via the nginx proxy.
-
-> Note: Application environment variables are available for use in custom templates. To do so, use the form of `{{ var "FOO" }}` to access a variable named `FOO`.
-
-#### Customizing via configuration files included by the default templates
-
-The default nginx.conf template will include everything from your apps `nginx.conf.d/` subdirectory in the main `server {}` block (see above):
-
-```
-include {{ .DOKKU_ROOT }}/{{ .APP }}/nginx.conf.d/*.conf;
-```
-
-That means you can put additional configuration in separate files. To increase the client request header timeout, the following can be performed:
-
-```shell
-mkdir /home/dokku/node-js-app/nginx.conf.d/
-echo 'client_header_timeout 50s;' > /home/dokku/node-js-app/nginx.conf.d/timeout.conf
-chown dokku:dokku /home/dokku/node-js-app/nginx.conf.d/upload.conf
-service nginx reload
-```
-
-The example above uses additional configuration files directly on the Dokku host. Unlike the `nginx.conf.sigil` file, these additional files will not be copied over from your application repo, and thus need to be placed in the `/home/dokku/node-js-app/nginx.conf.d/` directory manually.
-
-For PHP Buildpack users, you will also need to provide a `Procfile` and an accompanying `nginx.conf` file to customize the nginx config _within_ the container. The following are example contents for your `Procfile`
-
-```
-web: vendor/bin/heroku-php-nginx -C nginx.conf -i php.ini php/
-```
-
-Your `nginx.conf` file - not to be confused with Dokku's `nginx.conf.sigil` - would also need to be configured as shown in this example:
-
-```
-client_header_timeout 50s;
-location / {
- index index.php;
- try_files $uri $uri/ /index.php$is_args$args;
-}
-```
-
-Please adjust the `Procfile` and `nginx.conf` file as appropriate.
-
-### Custom Error Pages
-
-By default, Dokku provides custom error pages for the following three categories of errors:
-
-- 4xx: For all non-404 errors with a 4xx response code.
-- 404: For "404 Not Found" errors.
-- 5xx: For all 5xx error responses
-
-These are provided as an alternative to the generic Nginx error page, are shared for _all_ applications, and their contents are located on disk at `/var/lib/dokku/data/nginx-vhosts/dokku-errors`. To customize them for a specific app, create a custom `nginx.conf.sigil` as described above and change the paths to point elsewhere.
-
-### Default site
-
-By default, Dokku will route any received request with an unknown HOST header value to the lexicographically first site in the nginx config stack. If this is not the desired behavior, you may want to add the following configuration to the global nginx configuration.
-
-Create the file at `/etc/nginx/conf.d/00-default-vhost.conf`:
-
-```nginx
-server {
- listen 80 default_server;
- listen [::]:80 default_server;
-
- server_name _;
- access_log off;
- return 410;
-}
-
-# To handle HTTPS requests, you can uncomment the following section.
-#
-# Please note that in order to let this work as expected, you need a valid
-# SSL certificate for any domains being served. Browsers will show SSL
-# errors in all other cases.
-#
-# Note that the key and certificate files in the below example need to
-# be copied into /etc/nginx/ssl/ folder.
-#
-# server {
-# listen 443 ssl;
-# listen [::]:443 ssl;
-# server_name _;
-# ssl_certificate /etc/nginx/ssl/cert.crt;
-# ssl_certificate_key /etc/nginx/ssl/cert.key;
-# access_log off;
-# return 410;
-# }
-```
-
-Make sure to reload nginx after creating this file by running `service nginx reload`.
-
-This will catch all unknown HOST header values and return a `410 Gone` response. You can replace the `return 410;` with `return 444;` which will cause nginx to not respond to requests that do not match known domains (connection refused).
-
-The configuration file must be loaded before `/etc/nginx/conf.d/dokku.conf`, so it can not be arranged as a vhost in `/etc/nginx/sites-enabled` that is only processed afterwards.
-
-Alternatively, you may push an app to your Dokku host with a name like "00-default". As long as it lists first in `ls /home/dokku/*/nginx.conf | head`, it will be used as the default nginx vhost.
-
-## Other
-
-### Domains plugin
-
-See the [domain configuration documentation](/docs/configuration/domains.md) for more information on how to configure domains for your app.
-
-### Customizing hostnames
-
-See the [customizing hostnames documentation](/docs/configuration/domains.md#customizing-hostnames) for more information on how to configure domains for your app.
-
-### Disabling VHOSTS
-
-See the [disabling vhosts documentation](/docs/configuration/domains.md#disabling-vhosts) for more information on how to disable domain usage for your app.
-
-### Running behind a load balancer
-
-See the [load balancer documentation](/docs/configuration/ssl.md#running-behind-a-load-balancer) for more information on how to configure your nginx config for running behind a network load balancer.
-
-### SSL Configuration
-
-See the [ssl documentation](/docs/configuration/ssl.md) for more information on how to configure SSL certificates for your application.
-
-### Disabling Nginx
-
-See the [proxy documentation](/docs/networking/proxy-management.md) for more information on how to disable nginx as the proxy implementation for your app.
-
-### Managing Proxy Port mappings
-
-See the [proxy documentation](/docs/networking/proxy-management.md#proxy-port-mapping) for more information on how to manage ports proxied for your app.
-
-### 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.
diff --git a/docs/configuration/ssl.md b/docs/configuration/ssl.md
index 5b6bfe149f1..a5f492f2416 100644
--- a/docs/configuration/ssl.md
+++ b/docs/configuration/ssl.md
@@ -1,5 +1,6 @@
# SSL Configuration
+> [!IMPORTANT]
> New as of 0.4.0
Dokku supports SSL/TLS certificate inspection and CSR/Self-signed certificate generation via the `certs` plugin. Note that whenever SSL/TLS support is enabled SPDY is also enabled.
@@ -33,21 +34,26 @@ tar cvf cert-key.tar server.crt server.key
dokku certs:add node-js-app < cert-key.tar
```
-> Note: If your `.crt` file came alongside a `.ca-bundle`, you'll want to concatenate those into a single `.crt` file before adding it to the `.tar`.
+> [!NOTE]
+> If your `.crt` file came alongside a `.ca-bundle`, you'll want to concatenate those into a single `.crt` file before adding it to the `.tar`.
```shell
cat yourdomain_com.crt yourdomain_com.ca-bundle > server.crt
```
+> [!NOTE]
+> Archives passed to `certs:add` are validated before extraction to prevent path traversal and symlink escape attacks. Archives containing absolute paths, parent directory traversal entries, or symlinks pointing outside the extraction directory will be rejected.
+
#### SSL and Multiple Domains
When an SSL certificate is associated to an application, the certificate will be associated with _all_ domains currently associated with said application. Your certificate _should_ be associated with all of those domains, otherwise accessing the application will result in SSL errors. If you wish to remove one of the domains from the application, refer to the [domain configuration documentation](/docs/configuration/domains.md).
-Note that with the default nginx template, requests will be redirected to the `https` version of the domain. If this is not the desired state of request resolution, you may customize the nginx template in use. For more details, see the [nginx documentation](/docs/configuration/nginx.md).
+Note that with the default nginx template, requests will be redirected to the `https` version of the domain. If this is not the desired state of request resolution, you may customize the nginx template in use. For more details, see the [nginx documentation](/docs/networking/proxies/nginx.md).
### Certificate generation
-> Note: Using this method will create a self-signed certificate, which is only recommended for development or staging use, not production environments.
+> [!NOTE]
+> Using this method will create a self-signed certificate, which is only recommended for development or staging use, not production environments.
The `certs:generate` command will walk you through the correct `openssl` commands to create a key, csr and a self-signed cert for a given app/domain. We automatically put the self-signed cert in place as well as add the specified domain to the application configuration.
@@ -69,6 +75,7 @@ dokku certs:show node-js-app key > server.key
### Displaying certificate reports for an app
+> [!IMPORTANT]
> New as of 0.8.1
You can get a report about the apps ssl status using the `certs:report` command:
@@ -124,45 +131,39 @@ dokku certs:report node-js-app --ssl-enabled
## HSTS Header
-The [HSTS header](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) is an HTTP header that can inform browsers that all requests to a given site should be made via HTTPS. Dokku does enables this header by default for HTTPS requests.
+The [HSTS header](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) is an HTTP header that can inform browsers that all requests to a given site should be made via HTTPS. Dokku enables this header by default for HTTPS requests.
-See the [NGINX HSTS documentation](/docs/configuration/nginx.md#hsts-header) for more information on how the HSTS configuration can be managed for your application.
+See the [NGINX HSTS documentation](/docs/networking/proxies/nginx.md#hsts-header) for more information on how the HSTS configuration can be managed for your application.
## HTTP/2 support
Certain versions of nginx have bugs that prevent [HTTP/2](https://nginx.org/en/docs/http/ngx_http_v2_module.html) from properly responding to all clients, thus causing applications to be unavailable. For HTTP/2 to be enabled in your applications' nginx configs, you need to have installed nginx 1.11.5 or higher. See [issue 2435](https://github.com/dokku/dokku/issues/2435) for more details.
-## Running behind a load balancer
+### SSL Port Exposure
-Your application has access to the HTTP headers `X-Forwarded-Proto`, `X-Forwarded-Port` and `X-Forwarded-For`. These headers indicate the protocol of the original request (HTTP or HTTPS), the port number, and the IP address of the client making the request, respectively. The default configuration is for Nginx to set these headers.
+When your app is served from port `80` then the `/home/dokku/APP/nginx.conf` file will automatically be updated to instruct nginx to respond to ssl on port 443 as a new cert is added. If your app uses a non-standard port (perhaps you have a dockerfile deploy exposing port `99999`) you may need to manually expose an ssl port via `dokku ports:add https:443:99999`.
-If your server runs behind an HTTP(S) load balancer, then Nginx will see all requests as coming from the load balancer. If your load balancer sets the `X-Forwarded-` headers, you can tell Nginx to pass these headers from load balancer to your application via `nginx:set`:
+If an `https:443:*` port mapping already exists when a certificate is installed or renewed, Dokku will preserve it rather than rewriting it from the `http:80:*` mappings. This allows apps that terminate TLS inside the container (for example, with a configuration like `http:80:80 https:443:443`) to keep their explicit mapping across `dokku certs:add` and unattended renewals.
-```shell
-dokku nginx:set node-js-app x-forwarded-for-value "\$http_x_forwarded_for"
-dokku nginx:set node-js-app x-forwarded-port-value "\$http_x_forwarded_port"
-dokku nginx:set node-js-app x-forwarded-proto-value "\$http_x_forwarded_proto"
-```
+## Other
-Only use this option if:
-1. All requests are terminated at the load balancer, and forwarded to Nginx
-2. The load balancer is configured to send the `X-Forwarded-` headers (this may be off by default)
+### Running behind a proxy (`X-Forwarded-Ssl`, etc.)
-If it's possible to make HTTP(S) requests directly to Nginx, bypassing the load balancer, or if the load balancer is not configured to set these headers, then it becomes possible for a client to set these headers to arbitrary values.
+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.).
-The `x-forwarded-ssl` property may also be set for application frameworks that require this value. Note that this is a non-standard version of setting `x-forwarded-proto` to `https`, and should only be done as a last resort.
+## Properties
-```shell
-# force-setting value to `on`
-dokku nginx:set node-js-app x-forwarded-ssl on
+### Read-only flags
-# force-setting value to `off`
-dokku nginx:set node-js-app x-forwarded-ssl on
-
-# removing the value from nginx.conf (default)
-dokku nginx:set node-js-app x-forwarded-ssl
-```
-
-### SSL Port Exposure
+The following flags surface in `certs:report` but are not managed by `certs:set` - they are derived from the on-disk certificate:
-When your app is served from port `80` then the `/home/dokku/APP/nginx.conf` file will automatically be updated to instruct nginx to respond to ssl on port 443 as a new cert is added. If your app uses a non-standard port (perhaps you have a dockerfile deploy exposing port `99999`) you may need to manually expose an ssl port via `dokku proxy:ports-add https:443:99999`.
+| 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 |
diff --git a/docs/deployment/application-deployment.md b/docs/deployment/application-deployment.md
index 3b142716994..9f45c4d401c 100644
--- a/docs/deployment/application-deployment.md
+++ b/docs/deployment/application-deployment.md
@@ -1,6 +1,7 @@
-# Deploying to Dokku
+# Deploying an Application
-> Note: This walkthrough uses the hostname `dokku.me` in commands. When deploying to your own server, you should substitute the domain `dokku.me` for the domain name or IP address associated with your server. Users of the Vagrant VM included with Dokku can use `dokku.me` which points to the IP of the VM.
+> [!NOTE]
+> This walkthrough uses the hostname `dokku.me` in commands. When deploying to your own server, you should substitute the domain `dokku.me` for the domain name or IP address associated with your server. Users of the Vagrant VM included with Dokku can use `dokku.me` which points to the IP of the VM.
## Deploy tutorial
@@ -8,7 +9,6 @@ Once you have configured Dokku with at least one user, you can deploy applicatio
```shell
# from your local machine
-# SSH access to github must be enabled on this host
git clone https://github.com/heroku/ruby-getting-started
```
@@ -53,7 +53,8 @@ Dokku supports linking a single service to multiple applications as well as link
### Deploy the app
-> Warning: Your app should respect the `PORT` environment variable, otherwise it may not respond to web requests. You can find more information in the [port management documentation](/docs/networking/port-management.md).**
+> [!WARNING]
+> Your app should respect the `PORT` environment variable, otherwise it may not respond to web requests. You can find more information in the [port management documentation](/docs/networking/port-management.md).**
Now you can deploy the `ruby-getting-started` app to your Dokku server. All you have to do is add a remote to name the app. Applications are created on-the-fly on the Dokku server.
@@ -62,16 +63,18 @@ Now you can deploy the `ruby-getting-started` app to your Dokku server. All you
# the remote username *must* be dokku or pushes will fail
cd ruby-getting-started
git remote add dokku dokku@dokku.me:ruby-getting-started
-git push dokku main:master
+git push dokku main
```
-> Note: Some tools may not support the short-upstream syntax referenced above, and you may need to prefix
+> [!NOTE]
+> Some tools may not support the short-upstream syntax referenced above, and you may need to prefix
> the upstream with the scheme `ssh://` like so: `ssh://dokku@dokku.me:ruby-getting-started`
> Please see the [Git](https://git-scm.com/docs/git-clone#_git_urls_a_id_urls_a) documentation for more details.
-> Note: Your private key should be registered with `ssh-agent` in your local development environment. If you get a `permission denied` error when pushing, you can register your private key as follows: `ssh-add -k ~/`.
+> [!NOTE]
+> Your private key should be registered with `ssh-agent` in your local development environment. If you get a `permission denied` error when pushing, you can register your private key as follows: `ssh-add -k ~/`.
-After running `git push dokku main:master`, you should have output similar to this in your terminal:
+After running `git push dokku main`, you should have output similar to this in your terminal:
```
Counting objects: 231, done.
@@ -103,9 +106,9 @@ Once the deploy is complete, the application's web URL will be generated as abov
Dokku supports deploying applications in a few ways:
- [Heroku buildpacks](https://devcenter.heroku.com/articles/buildpacks) via [Herokuish](https://github.com/gliderlabs/herokuish#buildpacks): See the [herokuish buildpacks documentation](/docs/deployment/builders/herokuish-buildpacks.md) to learn about the different ways to specify a buildpack.
- - This is the default method used by Dokku.
+ - This is the default method used by Dokku.
- [Dockerfile](https://docs.docker.com/reference/builder/): See the [dockerfile documentation](/docs/deployment/builders/dockerfiles.md) to learn about the different ways to configure Dockerfile-based deploys.
-- [Docker Image](https://docs.docker.com/get-started/overview/#docker-objects): See the [docker image documentation](/docs/deployment/methods/images.md) to learn about how to deploy a Docker Image.
+- [Docker Image](https://docs.docker.com/get-started/overview/#docker-objects): See the [docker image documentation](/docs/deployment/methods/git.md#initializing-an-app-repository-from-a-docker-image) to learn about how to deploy a Docker Image.
### Setting up SSL
@@ -125,8 +128,8 @@ As an alternative, the Dokku project offers an optional letsencrypt plugin that
# plugin installation requires root, hence the user change
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
-# configure the plugin
-dokku config:set --global DOKKU_LETSENCRYPT_EMAIL=your-email@your.domain.com
+# set global email for letsencrypt
+dokku letsencrypt:set --global email your-email@your.domain.com
# set a custom domain that you own for your application
dokku domains:set ruby-getting-started ruby-getting-started.your.domain.com
@@ -140,16 +143,16 @@ dokku letsencrypt:cron-job --add
### Skipping deployment
-If you only want to rebuild and tag a container, you can skip the deployment phase by setting `$DOKKU_SKIP_DEPLOY` to `true` by running:
+If you only want to rebuild and tag a container, you can skip the deployment phase by setting the `skip-deploy` property to `true`:
``` shell
# on the Dokku host
-dokku config:set ruby-getting-started DOKKU_SKIP_DEPLOY=true
+dokku ps:set ruby-getting-started skip-deploy true
```
### Redeploying or restarting
-If you need to redeploy or restart your app:
+If you need to redeploy or restart your app:
```shell
# on the Dokku host
@@ -169,7 +172,8 @@ ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
ssh -T git@github.com
```
-> Warning: if the buildpack or Dockerfile build process require SSH key access for other reasons, the above may not always apply.
+> [!WARNING]
+> if the buildpack or Dockerfile build process require SSH key access for other reasons, the above may not always apply.
## Deploying to subdomains
@@ -180,7 +184,7 @@ If you do not enter a fully qualified domain name when pushing your app, Dokku d
# the remote username *must* be dokku or pushes will fail
# the below example assumes your app server domain or IP is dokku.me. Push in the form of: dokku@{serveripordomain}:{dokkuappname}
git remote add dokku dokku@dokku.me:ruby-getting-started
-git push dokku main:master
+git push dokku main
```
```
@@ -194,7 +198,7 @@ You can also specify the fully qualified name as follows:
# from your local machine
# the remote username *must* be dokku or pushes will fail
git remote add dokku dokku@dokku.me:app.dokku.me
-git push dokku main:master
+git push dokku main
```
```
@@ -208,7 +212,7 @@ This is useful when you want to deploy to the root domain:
# from your local machine
# the remote username *must* be dokku or pushes will fail
git remote add dokku dokku@dokku.me:dokku.me
-git push dokku main:master
+git push dokku main
```
```
@@ -242,7 +246,7 @@ See the [Dockerfile documentation](/docs/deployment/builders/dockerfiles.md) for
## Image tagging
-See the [image tagging documentation](/docs/deployment/methods/images.md) for more information on how Docker images can be tagged and deployed for a given application.
+See the [image tagging documentation](/docs/deployment/methods/git.md#initializing-an-app-repository-from-a-docker-image) for more information on how Docker images can be tagged and deployed for a given application.
## Specifying a custom buildpack
diff --git a/docs/deployment/application-management.md b/docs/deployment/application-management.md
index 92e9cfa448c..31812a570d8 100644
--- a/docs/deployment/application-management.md
+++ b/docs/deployment/application-management.md
@@ -1,5 +1,6 @@
# Application Management
+> [!IMPORTANT]
> New as of 0.3.1
```
@@ -7,11 +8,12 @@ apps:clone # Clones an app
apps:create # Create a new app
apps:destroy # Permanently destroy an app
apps:exists # Checks if an app exists
-apps:list # List your apps
+apps:list [--format stdout|json] # List your apps
apps:lock # Locks an app for deployment
apps:locked # Checks if an app is locked for deployment
apps:rename # Rename an app
apps:report [] [] # Display report about an app
+apps:set [--global] () # Set or clear an apps property for an app
apps:unlock # Unlocks an app for deployment
```
@@ -19,6 +21,7 @@ apps:unlock # Unlocks an app for deployment
### Listing applications
+> [!IMPORTANT]
> New as of 0.8.1. Use the `apps` command for older versions.
You can easily list all available applications using the `apps:list` command:
@@ -44,6 +47,18 @@ node-js-app
python-app
```
+You can also retrieve the list of apps as a JSON array by using the `--format json` flag, which is useful for programmatic consumption:
+
+```shell
+dokku apps:list --format json
+```
+
+```json
+["node-js-app","python-app"]
+```
+
+When no apps exist, the JSON output is an empty array (`[]`).
+
### Checking if an application exists
For CI/CD pipelines, it may be useful to see if an application exists before creating a "review" application for a specific branch. You can do so via the `apps:exists` command:
@@ -76,6 +91,20 @@ Once created, you can configure the application as normal, and deploy the applic
- Create and link datastores.
- Set environment variables.
+### Disabling automatic app creation
+
+By default, pushing to a git remote for an app that does not yet exist on the Dokku host will cause the app to be created automatically. On shared or production hosts this may be undesirable - operators may prefer that an explicit `apps:create` is required first. The `disable-autocreation` global property controls this behavior:
+
+```shell
+dokku apps:set --global disable-autocreation true
+```
+
+While set, pushes targeting an app that does not exist will be rejected. The default behavior may be restored by passing an empty value:
+
+```shell
+dokku apps:set --global disable-autocreation
+```
+
### Removing a deployed app
In some cases, you may need to destroy an application, whether it is because the application is temporary or because it was misconfigured. In these cases, you can use the `apps:destroy` command. Performing any destructive actions in Dokku requires confirmation, and this command will ask for the name of the application being deleted before doing so.
@@ -117,6 +146,7 @@ Destroying an application will unlink all linked services and destroy any config
### Renaming a deployed app
+> [!IMPORTANT]
> New as of 0.4.7
You can rename a deployed app using the `apps:rename` command. Note that the application *must* have been deployed at least once, or the rename will not complete successfully:
@@ -150,8 +180,15 @@ By default, Dokku will deploy the renamed app, though you can skip the deploy by
dokku apps:rename --skip-deploy node-js-app io-js-app
```
+Remember to also change your git remote on your local machine in order to make `git push dokku main` work again. For this you can use `git remote set-url`.
+
+```shell
+git remote set-url dokku dokku@dokku.me:io-js-app
+```
+
### Cloning an existing app
+> [!IMPORTANT]
> New as of 0.11.5
You can clone an existing app using the `apps:clone` command. Note that the application *must* have been deployed at least once, or cloning will not complete successfully:
@@ -171,7 +208,8 @@ This will copy all of your app's contents into a new app directory with the name
- SSL certificates will not be copied to the new app.
- Port mappings with the scheme `https` and host-port `443` will be skipped.
-> Warning: If you have exposed specific ports via `docker-options` plugin, or performed anything that cannot be done against multiple applications, `apps:clone` may result in errors.
+> [!WARNING]
+> If you have exposed specific ports via `docker-options` plugin, or performed anything that cannot be done against multiple applications, `apps:clone` may result in errors.
By default, Dokku will deploy this new app, though you can skip the deploy by using the `--skip-deploy` flag:
@@ -187,6 +225,7 @@ dokku apps:clone --ignore-existing node-js-app io-js-app
### Locking app deploys
+> [!IMPORTANT]
> New as of 0.11.6
If you wish to disable deploying for a period of time, this can be done via deploy locks. Normally, deploy locks exist only for the duration of a deploy so as to avoid deploys from colliding, but a deploy lock can be created by running the `apps:lock` command.
@@ -201,11 +240,13 @@ dokku apps:lock node-js-app
### Unlocking app deploys
+> [!IMPORTANT]
> New as of 0.11.6
In some cases, it may be necessary to remove an existing deploy lock. This can be performed via the `apps:unlock` command.
-> Warning: Removing the deploy lock *will not* stop in progress deploys. At this time, in progress deploys will need to be manually terminated by someone with server access.
+> [!WARNING]
+> Removing the deploy lock *will not* stop in progress deploys. At this time, in progress deploys will need to be manually terminated by someone with server access.
```shell
dokku apps:unlock node-js-app
@@ -219,6 +260,7 @@ dokku apps:unlock node-js-app
### Checking lock status
+> [!IMPORTANT]
> New as of 0.13.0
In some cases, you may wish to inspect the state of an app lock. To do so, you can issue an `apps:lock` command. This will exit non-zero if there is no app lock in place.
@@ -233,6 +275,7 @@ Deploy lock does not exist
### Displaying reports for an app
+> [!IMPORTANT]
> New as of 0.8.1
You can get a report about the deployed apps using the `apps:report` command:
@@ -281,3 +324,26 @@ You can pass flags which will output only the value of the specific information
```shell
dokku apps:report node-js-app --app-dir
```
+
+## Properties
+
+### Settable properties
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `apps:report`. The JSON keys emitted by `apps:report --format json` are the same names with the leading `--app-` stripped (e.g. `global-disable-autocreation`). Legacy keys with the `app-` prefix (e.g. `app-global-disable-autocreation`) are also emitted during the 0.38.x deprecation window and will be removed in a future major release.
+
+| Property | Scope | Default | Report flags | Description |
+|---|---|---|---|---|
+| `disable-autocreation` | global only | `false` | `--app-global-disable-autocreation` | When `true`, pushes to a remote for an app that does not yet exist are rejected instead of auto-creating the app |
+
+### 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 |
diff --git a/docs/deployment/builders/builder-management.md b/docs/deployment/builders/builder-management.md
index e15e239b825..fd2b43c8084 100644
--- a/docs/deployment/builders/builder-management.md
+++ b/docs/deployment/builders/builder-management.md
@@ -1,5 +1,6 @@
# Builder Management
+> [!IMPORTANT]
> New as of 0.24.0
```
@@ -17,6 +18,7 @@ Dokku supports the following built-in builders:
- `builder-dockerfile`: Builds apps using a `Dockerfile` via `docker build`. See the [dockerfile builder documentation](/docs/deployment/builders/dockerfiles.md) for more information on how this builder functions.
- `builder-herokuish`: Builds apps with Heroku's v2a Buildpack specification via `gliderlabs/herokuish`. See the [herokuish builder documentation](/docs/deployment/builders/herokuish-buildpacks.md) for more information on how this builder functions.
+- `builder-lambda`: Builds AWS Lambda functions in an environment simulating AWS Lambda runtimes via [lambda-builder](https://github.com/dokku/lambda-builder). See the [lambda builder documentation](/docs/deployment/builders/lambda.md) for more information on how this builder functions.
- `builder-null`: Does nothing during the build phase. See the [null builder documentation](/docs/deployment/builders/null.md) for more information on how this builder functions.
- `builder-pack`: Builds apps with Cloud Native Buildpacks via the `pack-cli` tool. See the [cloud native buildpacks builder documentation](/docs/deployment/builders/cloud-native-buildpacks.md) for more information on how this builder functions.
@@ -24,7 +26,7 @@ Builders run a detection script against a source code repository, and the first
### Overriding the auto-selected builder
-If desired, the builder can be specified via the `builder:set` command by speifying a value for `selected`. The selected builder will always be used.
+If desired, the builder can be specified via the `builder:set` command by specifying a value for `selected`. The selected builder will always be used.
```shell
dokku builder:set node-js-app selected dockerfile
@@ -42,6 +44,9 @@ The `selected` property can also be set globally. The global default is an empty
dokku builder:set --global selected herokuish
```
+> [!WARNING]
+> Selecting a global builder will result in _all_ applications using that builder unless a manual override is selected.
+
The default value may be set by passing an empty value for the option.
```shell
@@ -50,7 +55,8 @@ dokku builder:set --global selected
#### Changing the build directory
-> Warning: Please keep in mind that setting a custom build directory will result in loss of any changes to the top-level directory, such as the `git.keep-git-dir` property.
+> [!WARNING]
+> Please keep in mind that setting a custom build directory will result in loss of any changes to the top-level directory, such as the `git.keep-git-dir` property.
When deploying a monorepo, it may be desirable to specify the specific build directory to use for a given app. This can be done via the `builder:set` command. If a value is specified and that directory does not exist within the repository, the build will fail.
@@ -76,6 +82,28 @@ The default value may be set by passing an empty value for the option.
dokku builder:set --global build-dir
```
+#### Skipping container and image cleanup
+
+After a successful deploy, Dokku removes old containers and images that are no longer referenced by the app. On hosts where image rebuilds are expensive or where operators want to retain prior images for manual rollback, this cleanup can be disabled per-app or globally via the `skip-cleanup` property:
+
+```shell
+dokku builder:set node-js-app skip-cleanup true
+```
+
+The property can also be set globally:
+
+```shell
+dokku builder:set --global skip-cleanup true
+```
+
+The default behavior (cleanup enabled) may be restored by passing an empty value:
+
+```shell
+dokku builder:set node-js-app skip-cleanup
+```
+
+For backwards compatibility with bootstrap-time configuration, the `DOKKU_SKIP_CLEANUP` environment variable in `/etc/environment` or `~dokku/.dokkurc/*` is still honored when the `skip-cleanup` property is unset. The property is the canonical interface and takes precedence when set.
+
### Displaying builder reports for an app
You can get a report about the app's builder status using the `builder:report` command:
@@ -130,17 +158,38 @@ dokku builder:report node-js-app --builder-selected
To create a custom builder, the following triggers must be implemented:
- `builder-build`:
- - arguments: `BUILDER_TYPE` `APP` `SOURCECODE_WORK_DIR`
- - description: Creates a docker image named with the output of `common#get_app_image_name $APP`.
+ - arguments: `BUILDER_TYPE` `APP` `SOURCECODE_WORK_DIR`
+ - description: Creates a docker image named with the output of `common#get_app_image_name $APP`.
- `builder-detect`:
- - arguments: `APP` `SOURCECODE_WORK_DIR`
- - description: Outputs the name of the builder (without the `builder-` prefix) to use to build the app.
+ - arguments: `APP` `SOURCECODE_WORK_DIR`
+ - description: Outputs the name of the builder (without the `builder-` prefix) to use to build the app.
- `builder-release`:
- - arguments: `BUILDER_TYPE` `APP` `IMAGE_AG`
- - description: A post-build, pre-release trigger that can be used to post-process the image. Usually simply tags and labels the image appropriately.
+ - arguments: `BUILDER_TYPE` `APP` `IMAGE_AG`
+ - description: A post-build, pre-release trigger that can be used to post-process the image. Usually simply tags and labels the image appropriately.
Custom plugins names _must_ have the prefix `builder-` or builder overriding via `builder:set` may not function as expected.
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.
+
+## Properties
+
+### Settable properties
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `builder:report`. The JSON keys emitted by `builder:report --format json` are the same names with the leading `--builder-` stripped (e.g. `selected`, `global-selected`, `computed-selected`). Legacy keys with the `builder-` prefix are also emitted during the 0.38.x deprecation window and will be removed in a future major release.
+
+| 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 | `false` | `--builder-skip-cleanup`, `--builder-global-skip-cleanup`, `--builder-computed-skip-cleanup` | 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 |
diff --git a/docs/deployment/builders/buildpack-management.md b/docs/deployment/builders/buildpack-management.md
new file mode 100644
index 00000000000..4255960d2be
--- /dev/null
+++ b/docs/deployment/builders/buildpack-management.md
@@ -0,0 +1,225 @@
+# Buildpacks Management
+
+> [!NOTE]
+> Buildpacks commands apply to both herokuish and CNB-based builds
+
+```
+buildpacks:add [--index 1] # Add new app buildpack while inserting into list of buildpacks if necessary
+buildpacks:clear # Clear all buildpacks set on the app
+buildpacks:list # List all buildpacks for an app
+buildpacks:remove # Remove a buildpack set on the app
+buildpacks:report [] [] # Displays a buildpack report for one or more apps
+buildpacks:set [--index 1] # Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
+buildpacks:set --replace [ ...] # Replace the entire ordered buildpack list with the specified buildpacks
+```
+
+## Usage
+
+### Listing Buildpacks in Use
+
+The `buildpacks:list` command can be used to show buildpacks that have been set for an app. This will omit any auto-detected buildpacks.
+
+```shell
+# running for an app with no buildpacks specified
+dokku buildpacks:list node-js-app
+```
+
+```
+-----> test buildpack urls
+```
+
+```shell
+# running for an app with two buildpacks specified
+dokku buildpacks:list node-js-app
+```
+
+```
+-----> test buildpack urls
+ https://github.com/heroku/heroku-buildpack-python.git
+ https://github.com/heroku/heroku-buildpack-nodejs.git
+```
+
+### Adding custom buildpacks
+
+> Please check the documentation for your particular buildpack as you may need to include configuration files (such as a Procfile) in your project root.
+
+To add a custom buildpack, use the `buildpacks:add` command:
+
+```shell
+dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-nodejs.git
+```
+
+When no buildpacks are currently specified, the specified buildpack will be the only one executed for detection and compilation.
+
+Multiple buildpacks may be specified by using the `buildpacks:add` command multiple times.
+
+```shell
+dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+dokku buildpacks:add node-js-app https://github.com/heroku/heroku-buildpack-nodejs.git
+```
+
+Buildpacks are executed in order, may be inserted at a specified index via the `--index` flag. This flag is specified starting at a 1-index value.
+
+```shell
+# will add the golang buildpack at the second position, bumping all proceeding ones by 1 position
+dokku buildpacks:add --index 2 node-js-app https://github.com/heroku/heroku-buildpack-golang.git
+```
+
+### Overwriting a buildpack position
+
+In some cases, it may be necessary to swap out a given buildpack. Rather than needing to re-specify each buildpack, the `buildpacks:set` command can be used to overwrite a buildpack at a given position.
+
+```shell
+dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+By default, this will overwrite the _first_ buildpack specified. To specify an index, the `--index` flag may be used. This flag is specified starting at a 1-index value, and defaults to `1`.
+
+```shell
+# the following are equivalent commands
+dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+dokku buildpacks:set --index 1 node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+If the index specified is larger than the number of buildpacks currently configured, the buildpack will be appended to the end of the list.
+
+```shell
+dokku buildpacks:set --index 99 node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+### Replacing the entire buildpack list
+
+To replace the complete ordered buildpack list in a single command, use the `--replace` flag. This is useful for tooling that needs to apply a full buildpack list atomically instead of running `buildpacks:clear` followed by multiple `buildpacks:add` calls.
+
+```shell
+dokku buildpacks:set --replace node-js-app https://github.com/heroku/heroku-buildpack-ruby.git https://github.com/heroku/heroku-buildpack-nodejs.git
+```
+
+The buildpacks are executed in the order they are specified, and the previous list is discarded. If any specified buildpack is invalid, the existing list is left unchanged.
+
+A single buildpack may also be specified to replace the entire list with just that buildpack:
+
+```shell
+dokku buildpacks:set --replace node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+> [!NOTE]
+> The `--replace` flag cannot be combined with the `--index` flag. To remove all buildpacks, use the `buildpacks:clear` command instead of `--replace` with no buildpacks.
+
+### Removing a buildpack
+
+> At least one of a buildpack or index must be specified
+
+A single buildpack can be removed by name via the `buildpacks:remove` command.
+
+```shell
+dokku buildpacks:remove node-js-app https://github.com/heroku/heroku-buildpack-ruby.git
+```
+
+Buildpacks can also be removed by index via the `--index` flag. This flag is specified starting at a 1-index value.
+
+```shell
+dokku buildpacks:remove node-js-app --index 1
+```
+
+### Clearing all buildpacks
+
+> This does not affect automatically detected buildpacks, nor does it impact any specified `BUILDPACK_URL` environment variable.
+
+The `buildpacks:clear` command can be used to clear all configured buildpacks for a specified app.
+
+```shell
+dokku buildpacks:clear node-js-app
+```
+
+### Using a specific buildpack version
+
+> Always remember to pin your buildpack versions when using the multi-buildpacks method, or you may find deploys changing your deployed environment.
+
+By default, builders will pin their vendored buildpacks, resulting in a consistent build result for your application. There may be occasions where the pinned version results in a broken deploy, or does not have a particular feature that is required to build your project. To use a more recent version of a given buildpack, the buildpack may be specified _without_ a Git commit SHA like so:
+
+```shell
+# using the latest nodejs buildpack
+dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-nodejs
+```
+
+This will use the latest commit on the `master` branch of the specified buildpack. To pin to a newer version of a buildpack, a sha may also be specified by using the form `REPOSITORY_URL#COMMIT_SHA`, where `COMMIT_SHA` is any tree-ish git object - usually a git tag.
+
+```shell
+# using v87 of the nodejs buildpack
+dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-nodejs#v87
+```
+
+### Specifying buildpacks via app.json
+
+Buildpacks can also be specified in the `app.json` file at the root of your repository:
+
+```json
+{
+ "buildpacks": [
+ {
+ "url": "heroku/python"
+ }
+ ]
+}
+```
+
+Buildpacks configured via `buildpacks:add` or `buildpacks:set` commands take precedence over those specified in `app.json`. If no buildpacks are configured via commands and `app.json` contains a `buildpacks` entry, those buildpacks will be used.
+
+Shorthand buildpack references (e.g., `heroku/python`) are expanded to full GitHub URLs automatically.
+
+### Displaying buildpack reports for an app
+
+You can get a report about the app's buildpacks status using the `buildpacks:report` command:
+
+```shell
+dokku buildpacks:report
+```
+
+```
+=====> node-js-app buildpacks information
+ Buildpacks computed stack: gliderlabs/herokuish:v0.7.0-22
+ Buildpacks global stack: gliderlabs/herokuish:latest-24
+ Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
+ Buildpacks stack: gliderlabs/herokuish:v0.7.0-20
+=====> python-sample buildpacks information
+ Buildpacks computed stack: gliderlabs/herokuish:latest-24
+ Buildpacks global stack: gliderlabs/herokuish:latest-24
+ Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git,https://github.com/heroku/heroku-buildpack-python.git
+ Buildpacks stack:
+=====> ruby-sample buildpacks information
+ Buildpacks computed stack: gliderlabs/herokuish:latest-24
+ Buildpacks global stack: gliderlabs/herokuish:latest-24
+ Buildpacks list:
+ Buildpacks stack:
+```
+
+You can run the command for a specific app also.
+
+```shell
+dokku buildpacks:report node-js-app
+```
+
+```
+=====> node-js-app buildpacks information
+ Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
+```
+
+You can pass flags which will output only the value of the specific information you want. For example:
+
+```shell
+dokku buildpacks:report node-js-app --buildpacks-list
+```
+
+## Properties
+
+### Settable properties
+
+These properties are managed via `buildpacks:set-property` (the legacy command name for this plugin).
+
+> [!NOTE]
+> The `Report flags` column lists the CLI argument names accepted by `buildpacks:report`. The JSON keys emitted by `buildpacks:report --format json` are the same names with the leading `--buildpacks-` stripped (e.g. `stack`, `global-stack`, `computed-stack`). Legacy keys with the `buildpacks-` prefix are also emitted during the 0.38.x deprecation window and will be removed in a future major release.
+
+| 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`) |
diff --git a/docs/deployment/builders/cloud-native-buildpacks.md b/docs/deployment/builders/cloud-native-buildpacks.md
index 572a6d2c473..7728978aa85 100644
--- a/docs/deployment/builders/cloud-native-buildpacks.md
+++ b/docs/deployment/builders/cloud-native-buildpacks.md
@@ -1,14 +1,21 @@
-# Cloud Native Buildpacks (Experimental)
+# Cloud Native Buildpacks
+> [!IMPORTANT]
> New as of 0.22.0
+```
+builder-pack:report [