mirror of
https://github.com/dokku/dokku.git
synced 2025-12-29 00:25:08 +01:00
# History ## 0.29.0 Install/update via the bootstrap script: ```shell wget https://raw.githubusercontent.com/dokku/dokku/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
583 lines
30 KiB
HTML
583 lines
30 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
|
<meta name="description" content="">
|
|
<meta name="author" content="">
|
|
<title>Dokku - {{DOC_TITLE}}</title>
|
|
|
|
<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-57x57.png">
|
|
<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-60x60.png">
|
|
<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-72x72.png">
|
|
<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-76x76.png">
|
|
<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-114x114.png">
|
|
<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-120x120.png">
|
|
<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-144x144.png">
|
|
<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-152x152.png">
|
|
<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/apple-touch-icon-180x180.png">
|
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/favicon-32x32.png" sizes="32x32">
|
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/android-chrome-192x192.png" sizes="192x192">
|
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/favicon-96x96.png" sizes="96x96">
|
|
<link rel="icon" type="image/png" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/favicon-16x16.png" sizes="16x16">
|
|
<link rel="manifest" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/manifest.json">
|
|
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/favicon.ico">
|
|
<meta name="apple-mobile-web-app-title" content="Dokku">
|
|
<meta name="application-name" content="Dokku">
|
|
<meta name="msapplication-TileColor" content="#da532c">
|
|
<meta name="msapplication-TileImage" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/mstile-144x144.png">
|
|
<meta name="msapplication-config" content="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/favicons/browserconfig.xml">
|
|
<meta name="theme-color" content="#ffffff">
|
|
|
|
<script>
|
|
if ('{{DOC}}' == 'index.md') {
|
|
var indexLink = '/{{NAME}}/';
|
|
if ('{{REF}}' !== 'master') {
|
|
indexLink = '/{{NAME}}~{{REF}}/';
|
|
}
|
|
window.location.replace(window.location.origin + indexLink);
|
|
}
|
|
</script>
|
|
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
|
|
|
|
<!-- Font (Lato) -->
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700;900&display=swap" rel="stylesheet">
|
|
|
|
<link href="https://cdn.jsdelivr.net/gh/dokku/dokku@v0.29.0/docs/assets/style.css" rel="stylesheet">
|
|
<!-- <link href="./assets/style.css" rel="stylesheet"> -->
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
|
|
</head>
|
|
<body>
|
|
<div class="dev-warning doc-floating-warning" style="display:none">
|
|
This document is for dokku's development version, which can be significantly different from previous releases. For older releases, use the version selector floating in the bottom right corner of this page.
|
|
</div>
|
|
<header class="hero-section">
|
|
<nav class="navbar navbar-expand-md navbar-dark py-3" id="mainNav">
|
|
<div class="container top-50 px-4 px-lg-5">
|
|
<a class="navbar-brand d-flex" href="/{{NAME}}/">
|
|
<img class="me-3" src="./assets/dokku-logo.svg" alt="" width="55">
|
|
<span class="align-self-center d-block">Dokku</span>
|
|
</a>
|
|
<button class="navbar-toggler navbar-toggler-right" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
|
|
<div class="collapse navbar-collapse" id="navbarResponsive">
|
|
<ul class="navbar-nav ms-auto my-2 my-lg-0">
|
|
<li class="nav-item"><a class="nav-link mx-0 mx-md-2 underline" href="https://dokku.com/blog/">Blog</a></li>
|
|
<li class="nav-item"><a class="nav-link mx-0 mx-md-2 underline" href="https://github.com/dokku/dokku/">Code</a></li>
|
|
<li class="nav-item"><a class="nav-link mx-0 mx-md-2 underline" href="/{{NAME}}/getting-started/installation/">Docs</a></li>
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle mx-0 mx-md-2 underline" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
Social
|
|
</a>
|
|
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
|
<div class="d-grid gap-2">
|
|
<a href="https://discord.gg/YQjANGMZvu" class="btn rounded-2 d-flex align-items-center py-2 px-3 lh-sm text-start mx-2">
|
|
<img class="me-3" alt="discord" src="./assets/social/discord.png" width="25px" />
|
|
<div>
|
|
<strong class="d-block">Discord</strong>
|
|
</div>
|
|
</a>
|
|
<a href="https://slack.dokku.com/" class="btn rounded-2 d-flex align-items-center py-2 px-3 lh-sm text-start mx-2">
|
|
<img class="me-3" alt="slack" src="./assets/social/slack.png" width="25px" />
|
|
<div>
|
|
<strong class="d-block">Slack</strong>
|
|
</div>
|
|
</a>
|
|
<a href="https://webchat.libera.chat/?channels=dokku" class="btn rounded-2 d-flex align-items-center py-2 px-3 lh-sm text-start mx-2">
|
|
<img class="me-3" alt="irc" src="./assets/social/irc.png" width="25px" />
|
|
<div>
|
|
<strong class="d-block">IRC</strong>
|
|
</div>
|
|
</a>
|
|
<a href="https://github.com/dokku/dokku/discussions" class="btn rounded-2 d-flex align-items-center py-2 px-3 lh-sm text-start mx-2">
|
|
<img class="me-3" alt="github" src="./assets/social/github.png" width="25px" />
|
|
<div>
|
|
<strong class="d-block">GitHub Discussions</strong>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</ul>
|
|
</li>
|
|
<li class="nav-item"><a class="nav-link mx-0 mx-md-2 underline" href="https://pro.dokku.com/">Pro</a></li>
|
|
<li class="nav-item"><a class="btn btn-primary mx-0 mx-md-3 cta" href="/{{NAME}}/getting-started/installation/">Get Started</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
|
|
<div class="container">
|
|
<div class="improve-slideout">
|
|
<i class="fa fa-pencil icon-improve"></i>
|
|
<a href="https://github.com/{{USER}}/{{NAME}}/edit/master/docs/{{DOC}}" target="_blank">
|
|
<div class="improve-slideout-inner"><h6>Improve This Doc <i class="fa fa-github git-improve"></i></h6></div>
|
|
</a>
|
|
</div>
|
|
<a class="back-to-contents" href="#page-contents"><i class="fa fa-arrow-circle-up icon-improve" title="Back to Contents"></i></a>
|
|
|
|
<div class="row">
|
|
<div class="col-4 col-md-3" style="padding-top:16px">
|
|
<div class="list-group">
|
|
<a href="#" class="list-group-item disabled">Getting Started</a>
|
|
<a href="/{{NAME}}/getting-started/installation/" class="list-group-item">Getting Started with Dokku</a>
|
|
<a href="/{{NAME}}/getting-started/upgrading/" class="list-group-item">Upgrading Dokku</a>
|
|
<a href="/{{NAME}}/getting-started/uninstalling/" class="list-group-item">Uninstalling Dokku</a>
|
|
<a href="/{{NAME}}/getting-started/troubleshooting/" class="list-group-item">Troubleshooting</a>
|
|
<a href="/{{NAME}}/getting-started/where-to-get-help/" class="list-group-item">Getting Help</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Commercial</a>
|
|
<a href="/{{NAME}}/enterprise/pro/" class="list-group-item">Dokku Pro</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Deployment</a>
|
|
|
|
<a href="/{{NAME}}/deployment/application-deployment/" class="list-group-item">Deploying an Application</a>
|
|
<a href="/{{NAME}}/deployment/application-management/" class="list-group-item">Application Management</a>
|
|
<a href="/{{NAME}}/deployment/logs/" class="list-group-item">Application Logs</a>
|
|
<a href="/{{NAME}}/deployment/remote-commands/" class="list-group-item">Remote Commands</a>
|
|
<a href="/{{NAME}}/deployment/user-management/" class="list-group-item">User Management</a>
|
|
<a href="/{{NAME}}/deployment/zero-downtime-deploys/" class="list-group-item">Zero Downtime Deploy Checks</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Builders</a>
|
|
|
|
<a href="/{{NAME}}/deployment/builders/builder-management/" class="list-group-item">Builder Management</a>
|
|
<a href="/{{NAME}}/deployment/builders/cloud-native-buildpacks/" class="list-group-item">Cloud Native Buildpacks</a>
|
|
<a href="/{{NAME}}/deployment/builders/herokuish-buildpacks/" class="list-group-item">Herokuish Buildpacks</a>
|
|
<a href="/{{NAME}}/deployment/builders/dockerfiles/" class="list-group-item">Dockerfile Deployment</a>
|
|
<a href="/{{NAME}}/deployment/builders/lambda/" class="list-group-item">Lambda Builder</a>
|
|
<a href="/{{NAME}}/deployment/builders/null/" class="list-group-item">Null Builder</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Deployment Methods</a>
|
|
<a href="/{{NAME}}/deployment/methods/git/" class="list-group-item">Git Deployment</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Configuration</a>
|
|
|
|
<a href="/{{NAME}}/configuration/environment-variables/" class="list-group-item">Environment Variables</a>
|
|
<a href="/{{NAME}}/configuration/domains/" class="list-group-item">Domain Configuration</a>
|
|
<a href="/{{NAME}}/configuration/ssl/" class="list-group-item">SSL Configuration</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Interacting with Processes</a>
|
|
|
|
<a href="/{{NAME}}/processes/entering-containers/" class="list-group-item">Entering Containers</a>
|
|
<a href="/{{NAME}}/processes/one-off-tasks/" class="list-group-item">One-Off Tasks</a>
|
|
<a href="/{{NAME}}/processes/process-management/" class="list-group-item">Process Management</a>
|
|
<a href="/{{NAME}}/processes/scheduled-cron-tasks/" class="list-group-item">Scheduled Cron Tasks</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Network Management</a>
|
|
|
|
<a href="/{{NAME}}/networking/dns/" class="list-group-item">DNS Configuration</a>
|
|
<a href="/{{NAME}}/networking/network/" class="list-group-item">Network Management</a>
|
|
<a href="/{{NAME}}/networking/port-management/" class="list-group-item">Port Management</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Proxy Configuration</a>
|
|
|
|
<a href="/{{NAME}}/networking/proxy-management/" class="list-group-item">Proxy Management</a>
|
|
<a href="/{{NAME}}/networking/proxies/caddy/" class="list-group-item">Caddy Proxy</a>
|
|
<a href="/{{NAME}}/networking/proxies/nginx/" class="list-group-item">Nginx Proxy</a>
|
|
<a href="/{{NAME}}/networking/proxies/traefik/" class="list-group-item">Traefik Proxy</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Advanced Usage</a>
|
|
|
|
<a href="/{{NAME}}/advanced-usage/backup-recovery/" class="list-group-item">Backup and Recovery</a>
|
|
<a href="/{{NAME}}/advanced-usage/deployment-tasks/" class="list-group-item">Deployment Tasks</a>
|
|
<a href="/{{NAME}}/advanced-usage/docker-options/" class="list-group-item">Docker Container Options</a>
|
|
<a href="/{{NAME}}/advanced-usage/registry-management/" class="list-group-item">Docker Registry Management</a>
|
|
<a href="/{{NAME}}/advanced-usage/event-logs/" class="list-group-item">Event Logs</a>
|
|
<a href="/{{NAME}}/advanced-usage/persistent-storage/" class="list-group-item">Persistent Storage</a>
|
|
<a href="/{{NAME}}/advanced-usage/plugin-management/" class="list-group-item">Plugin Management</a>
|
|
<a href="/{{NAME}}/advanced-usage/repository-management/" class="list-group-item">Repository Management</a>
|
|
<a href="/{{NAME}}/advanced-usage/resource-management/" class="list-group-item">Resource Management</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Schedulers</a>
|
|
|
|
<a href="/{{NAME}}/deployment/schedulers/scheduler-management/" class="list-group-item">Scheduler Management</a>
|
|
<a href="/{{NAME}}/deployment/schedulers/docker-local/" class="list-group-item">Docker Local</a>
|
|
<a href="/{{NAME}}/deployment/schedulers/kubernetes/" class="list-group-item">Kubernetes</a>
|
|
<a href="/{{NAME}}/deployment/schedulers/nomad/" class="list-group-item">Nomad</a>
|
|
<a href="/{{NAME}}/deployment/schedulers/null/" class="list-group-item">Null Scheduler</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Development</a>
|
|
|
|
<a href="/{{NAME}}/development/plugin-creation/" class="list-group-item">Plugin Creation</a>
|
|
<a href="/{{NAME}}/development/plugin-triggers/" class="list-group-item">Plugin Triggers</a>
|
|
<a href="/{{NAME}}/development/testing/" class="list-group-item">Running Tests</a>
|
|
<a href="/{{NAME}}/development/release-process/" class="list-group-item">Release Process</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Continuous Integration</a>
|
|
<a href="/{{NAME}}/deployment/continuous-integration/github-actions/" class="list-group-item">GitHub Actions</a>
|
|
<a href="/{{NAME}}/deployment/continuous-integration/gitlab-ci/" class="list-group-item">GitLab CI</a>
|
|
<a href="/{{NAME}}/deployment/continuous-integration/generic/" class="list-group-item">Generic</a>
|
|
|
|
<a href="#" class="list-group-item disabled">Community Contributions</a>
|
|
<a href="/{{NAME}}/community/clients/" class="list-group-item">Clients</a>
|
|
<a href="/{{NAME}}/community/plugins/" class="list-group-item">Plugins</a>
|
|
</div>
|
|
</div>
|
|
<div class="col-8 col-md-9 markdown-body" style="padding-top:16px">
|
|
{{CONTENT}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rst-versions rst-badge" data-toggle="rst-versions">
|
|
<span class="rst-current-version" data-toggle="rst-current-version" data-doc="{{DOC}}" data-ref="{{REF}}">
|
|
<span class="fa fa-book"> </span>
|
|
v: {{REF}}
|
|
<span class="fa fa-caret-down"></span>
|
|
</span>
|
|
<div class="rst-other-versions">
|
|
<dl>
|
|
<dt>Versions</dt>
|
|
</dl>
|
|
|
|
<dl>
|
|
<dt>On GitHub</dt>
|
|
<dd>
|
|
<a href="https://github.com/{{USER}}/{{NAME}}/blob/master/docs/{{DOC}}" target="_blank">View</a>
|
|
</dd>
|
|
<dd>
|
|
<a href="https://github.com/{{USER}}/{{NAME}}/edit/master/docs/{{DOC}}" target="_blank">Edit</a>
|
|
</dd>
|
|
</dl>
|
|
<hr>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="dev-warning doc-floating-warning" style="display:none">
|
|
This document is for dokku's development version, which can be significantly different from previous releases. For older releases, use the version selector floating in the bottom right corner of this page.
|
|
</div>
|
|
|
|
<!-- Footer section -->
|
|
<footer class="px-4 px-lg-5 text-start mt-5">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-lg-12 align-self-start text-white">
|
|
<p class="m-0 py-3">© 2013-2022 Dokku. Website designed & developed by <a href="https://yasoob.me" class="text-decoration-none text-white">Yasoob Khalid</a></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/1.3.0/anchor.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
|
|
|
|
<script src="https://dokku.dpdcart.com/dpd.js"></script>
|
|
<script>
|
|
// Source: https://github.com/Alhadis/Snippets/blob/master/js/polyfills/IE8-child-elements.js
|
|
if (!('nextElementSibling' in document.documentElement)) {
|
|
Object.defineProperty(Element.prototype, 'nextElementSibling', {
|
|
get: function () {
|
|
var e = this.nextSibling;
|
|
while (e && 1 !== e.nodeType) {
|
|
e = e.nextSibling;
|
|
}
|
|
return e;
|
|
}
|
|
});
|
|
}
|
|
// Source: https://jonlabelle.com/snippets/view/javascript/wrap-an-html-element-in-javascript
|
|
HTMLElement.prototype.wrap = function (elms) {
|
|
if (!elms.length) elms = [elms];
|
|
for (var i = elms.length - 1; i >= 0; i--) {
|
|
var child = (i > 0) ? this.cloneNode(true) : this;
|
|
var el = elms[i];
|
|
var parent = el.parentNode;
|
|
var sibling = el.nextSibling;
|
|
child.appendChild(el);
|
|
if (sibling) {
|
|
parent.insertBefore(child, sibling);
|
|
} else {
|
|
parent.appendChild(child);
|
|
}
|
|
}
|
|
};
|
|
|
|
document.addEventListener('DOMContentLoaded', function (e) {
|
|
var markdownBody = document.querySelectorAll('.markdown-body')[0],
|
|
isRedirect = markdownBody.innerHTML.trim().indexOf('<p>See the <a href=') === 0;
|
|
if (isRedirect) {
|
|
var redirectUrl = markdownBody.getElementsByTagName('a')[0].href;
|
|
window.location.replace(redirectUrl);
|
|
}
|
|
anchors.options.visible = 'always';
|
|
anchors.add('.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6');
|
|
|
|
var tables = document.querySelectorAll('table'),
|
|
blockquotes = document.querySelectorAll('blockquote'),
|
|
versionList = document.querySelectorAll('.rst-other-versions dl')[0],
|
|
backToContentsEl = document.querySelectorAll('.back-to-contents')[0]
|
|
currentVersionEl = document.querySelectorAll('.rst-current-version')[0],
|
|
currentVersion = currentVersionEl.getAttribute('data-ref'),
|
|
versionContainer = document.querySelectorAll('.rst-versions.rst-badge')[0],
|
|
pageHeader = document.querySelectorAll('.markdown-body p')[0],
|
|
headers = document.querySelectorAll('h2, h3, h4'),
|
|
classNames = ['table', 'table-striped', 'table-hover', 'table-condensed'],
|
|
localPath = location.pathname.split('/').splice(2).join('/'),
|
|
addClass = function (el, className) {
|
|
if (el.classList) {
|
|
el.classList.add(className);
|
|
} else {
|
|
el.className += ' ' + className;
|
|
}
|
|
},
|
|
addListener = function (elem, type, fn) {
|
|
if (elem.addEventListener) {
|
|
elem.addEventListener(type, fn, false);
|
|
} else if (elem.attachEvent) {
|
|
elem.attachEvent('on' + type, function() {
|
|
return fn.call(elem, window.event);
|
|
});
|
|
} else {
|
|
elem['on' + type] = fn;
|
|
}
|
|
},
|
|
hasClass = function (el, className) {
|
|
if (el.classList) {
|
|
return el.classList.contains(className);
|
|
} else {
|
|
return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
|
|
}
|
|
},
|
|
removeClass = function (el, className) {
|
|
if (el.classList) {
|
|
el.classList.remove(className);
|
|
} else {
|
|
el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');;
|
|
}
|
|
},
|
|
languageClass = function (el) {
|
|
if (!hasClass(el, 'highlight')) {
|
|
return;
|
|
}
|
|
var classes = [];
|
|
if (el.classList) {
|
|
classes = el.classList.value.split(/\s+/);
|
|
} else {
|
|
classes = el.className.split(/\s+/);
|
|
}
|
|
var language = null;
|
|
for (i = 0; i < classes.length; i++) {
|
|
if (classes[i].lastIndexOf('highlight-source-', 0) === 0) {
|
|
language = classes[i].replace('highlight-source-', '');
|
|
break;
|
|
}
|
|
}
|
|
return language;
|
|
};
|
|
|
|
addListener(backToContentsEl, 'click', function(e) {
|
|
e.preventDefault();
|
|
var scrollToTop = window.setInterval(function() {
|
|
var pos = window.pageYOffset;
|
|
if ( pos > 0 ) {
|
|
window.scrollTo( 0, pos - 20 );
|
|
} else {
|
|
window.clearInterval( scrollToTop );
|
|
}
|
|
}, 1);
|
|
return false;
|
|
});
|
|
|
|
var ls2 = {
|
|
save : function (key, jsonData, expirationMS) {
|
|
if (typeof (Storage) === 'undefined') { return false; }
|
|
var record = {value: JSON.stringify(jsonData), timestamp: new Date().getTime()/1000 + expirationMS}
|
|
localStorage.setItem(key, JSON.stringify(record));
|
|
return jsonData;
|
|
},
|
|
load : function (key) {
|
|
if (typeof (Storage) === 'undefined') { return false; }
|
|
var record = JSON.parse(localStorage.getItem(key));
|
|
if (!record){return false;}
|
|
return (new Date().getTime()/1000 < record.timestamp && JSON.parse(record.value));
|
|
}
|
|
};
|
|
|
|
var ToC =
|
|
'<nav role="navigation" class="table-of-contents">' +
|
|
'<ul>';
|
|
|
|
var newLine, el, title, link, currentDepth, count = 0, lastNodeDepth = null;
|
|
Array.prototype.forEach.call(headers, function (el, i) {
|
|
count++;
|
|
title = el.innerText || element.textContent;
|
|
link = '#' + el.getAttribute('id');
|
|
currentDepth = parseInt(el.nodeName.replace('H', ''), 10);
|
|
|
|
newLine =
|
|
'<li>' +
|
|
'<a href="' + link + '" class="current-depth-' + currentDepth + '">' +
|
|
title +
|
|
'</a>' +
|
|
'</li>';
|
|
|
|
if (currentDepth === lastNodeDepth || lastNodeDepth === null) {
|
|
} else if (currentDepth > lastNodeDepth) {
|
|
newLine = '<ul>' + newLine;
|
|
} else if (currentDepth < lastNodeDepth) {
|
|
newLine = '</ul>' + newLine;
|
|
}
|
|
ToC += newLine;
|
|
|
|
lastNodeDepth = currentDepth;
|
|
});
|
|
ToC += '</ul></nav>';
|
|
|
|
if (count > 1) {
|
|
var navItems = document.querySelectorAll('.list-group-item');
|
|
Array.prototype.forEach.call(navItems, function(el, i){
|
|
if (el.getAttribute('href') == location.pathname) {
|
|
el.insertAdjacentHTML('afterEnd', ToC);
|
|
}
|
|
});
|
|
}
|
|
|
|
Array.prototype.forEach.call(blockquotes, function (el, i) {
|
|
if (el.innerHTML.toLowerCase().indexOf('warning') !== -1) {
|
|
addClass(el, 'warning');
|
|
el.innerHTML = el.innerHTML.replace('Warning', '<strong>Warning</strong>')
|
|
} else if (el.innerHTML.toLowerCase().indexOf('new as of') !== -1) {
|
|
addClass(el, 'new-as-of');
|
|
} else if (el.innerHTML.toLowerCase().indexOf('not yet released') !== -1) {
|
|
addClass(el, 'not-yet-released');
|
|
}
|
|
});
|
|
Array.prototype.forEach.call(classNames, function (className, i) {
|
|
Array.prototype.forEach.call(tables, function (el, i) {
|
|
addClass(el, className);
|
|
});
|
|
});
|
|
|
|
var addLanguageLabel = function (el, language) {
|
|
var labelWrapper = document.createElement('div'),
|
|
label = document.createElement('div');
|
|
|
|
labelWrapper.setAttribute('class', 'highlight-show-language');
|
|
label.setAttribute('class', 'highlight-show-language-label');
|
|
label.appendChild(document.createTextNode(language));
|
|
labelWrapper.appendChild(label);
|
|
el.insertBefore(labelWrapper, el.firstChild);
|
|
};
|
|
|
|
var highlightElements = document.querySelectorAll('pre');
|
|
Array.prototype.forEach.call(highlightElements, function(el, i) {
|
|
var language = languageClass(el.parentElement);
|
|
if (typeof (language) === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
addLanguageLabel(el.parentElement, language);
|
|
|
|
var nextEl = el.parentElement.nextElementSibling;
|
|
if (nextEl !== null && nextEl.nodeName.toLowerCase() === 'pre') {
|
|
var wrapper = document.createElement('div');
|
|
wrapper.setAttribute('class', 'highlight-output');
|
|
wrapper.wrap(nextEl);
|
|
addLanguageLabel(wrapper, 'output');
|
|
addClass(el, 'highlight-has-output');
|
|
}
|
|
});
|
|
|
|
addListener(currentVersionEl, 'click', function() {
|
|
if (hasClass(versionContainer, 'shift-up')) {
|
|
removeClass(versionContainer, 'shift-up');
|
|
} else {
|
|
addClass(versionContainer, 'shift-up');
|
|
}
|
|
});
|
|
|
|
var range = function(start, count) {
|
|
return Array.apply(0, Array(count))
|
|
.map(function (element, index) {
|
|
return index + start;
|
|
});
|
|
}
|
|
|
|
var parseVersions = function(version, versions) {
|
|
var pieces = version.split('.'),
|
|
prefix = pieces.slice(0, 2).join('.') + '.',
|
|
maxPatchVersion = parseInt(pieces.slice(2, 3)[0], 10),
|
|
versionRange = range(0, maxPatchVersion + 1);
|
|
|
|
for (var i in versionRange) {
|
|
versions.push(prefix.concat(versionRange[i]));
|
|
}
|
|
return versions;
|
|
}
|
|
|
|
var addVersionLink = function(version) {
|
|
var a = document.createElement('a'),
|
|
dd = document.createElement('dd'),
|
|
ref = 'dokku~v' + version,
|
|
versionName = 'v' + version;
|
|
if (version == 'master') {
|
|
ref = 'dokku';
|
|
versionName = 'master';
|
|
}
|
|
|
|
a.setAttribute('href', '/' + ref + '/' + localPath);
|
|
a.appendChild(document.createTextNode(versionName));
|
|
if (versionName == currentVersion) {
|
|
var strong = document.createElement('strong');
|
|
strong.appendChild(a);
|
|
dd.appendChild(strong);
|
|
} else {
|
|
dd.appendChild(a);
|
|
}
|
|
versionList.appendChild(dd);
|
|
};
|
|
|
|
var processVersions = function(data) {
|
|
var versions = [];
|
|
for (var key in data['max-versions']) {
|
|
if (!data['max-versions'].hasOwnProperty(key)) {
|
|
continue;
|
|
}
|
|
|
|
versions = parseVersions(data['max-versions'][key], versions);
|
|
}
|
|
|
|
addVersionLink('master');
|
|
versions.reverse();
|
|
Array.prototype.forEach.call(versions, function (version, i) {
|
|
addVersionLink(version);
|
|
});
|
|
};
|
|
|
|
if (currentVersion === 'master') {
|
|
document.querySelectorAll('.dev-warning')[0].style.position = 'relative';
|
|
Array.prototype.forEach.call(document.querySelectorAll('.dev-warning'), function (el, i) {
|
|
el.style.display = '';
|
|
});
|
|
}
|
|
|
|
data = ls2.load('max-versions');
|
|
if (!data) {
|
|
var request = new XMLHttpRequest();
|
|
request.open('GET', '/dokku/assets/versions.json', true);
|
|
request.setRequestHeader('Cache-Control', 'no-cache, no-store');
|
|
|
|
request.onload = function() {
|
|
if (request.status >= 200 && request.status < 400) {
|
|
var data = JSON.parse(request.responseText);
|
|
// store for 1 day
|
|
ls2.save('max-versions', data, 86400);
|
|
processVersions(data);
|
|
}
|
|
};
|
|
|
|
request.onerror = function() {
|
|
// There was a connection error of some sort
|
|
};
|
|
|
|
request.send();
|
|
} else {
|
|
processVersions(data);
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|