Portainer - 2.20.0


See Upgrading Portainer instructions.

Overview of changes

Introducing the new Portainer CE 2.20.0 release. This is an STS (Short-Term Support) release.

As you gear up for the transition to Portainer CE 2.20.0, our latest STS (Short-Term Support) installment, ensuring a smooth upgrade is key. We urge you to back up your configurations via the Portainer UI beforehand. This backup acts as your safety net, ensuring you can gracefully revert to the prior version or state if the new frontier proves too wild. Additionally, pore over the release notes for catching any compatibility issues, understanding deprecated functionalities, and identifying essential tweaks to your current setup. Your diligence will pave the way for a seamless update.

A Short-Term Support release can be considered as "bleeding-edge" as it will contain the latest features and functionality we've developed. The STS releases (including this one) will go through a significant amount of pre-release testing, but there may be changes that could cause regressions and features that might see further iterations. As such, if stability is a crucial concern for your setup we wouldn't recommend deploying STS releases on production environments.

Read more in our "Portainer 2.20 STS" blog

Breaking Changes

  • Introduced a requirement to specify the current user's password when adding an API token via the UI or the POST /users/{id}/tokens API endpoint.
  • Fixed issue when deploying Docker stacks from Git-based custom templates where a user could edit the content via the web editor, when they should only have been able to deploy the content from Git.

Deprecation Notice

  • DEPRECATED API endpoint GET /kubernetes/{id}/namespaces/{namespace}/configuration. Following Portainer 2.19 split of K8s ConfigMaps and Secrets to two UI tabs and K8s API proxy use, the original endpoint combining both resource types is marked deprecated.
  • DEPRECATED API endpoint GET+POST /endpoints/{id}/kubernetes/helm/repositories, MOVED Helm UI option to Advanced Deployment/Create from Manifest screen + now allow users to delete their Helm repos. New endpoint GET+POST /users/{id}/helm/repositories added.

Resolved CVEs

  • Updated various packages to resolve CVEs. portainer/portainer#9224
  • Resolved CVEs for Portainer agent
  • Resolved CVEs for Portainer CE and BE


  • Fixed issue where admin users were unable to update a Git-based edge stack created by another user.
  • Fixed issue where the "Retry deployment" toggle did not persist when editing an edge stack.
  • Fixed issue clearing logs for edge jobs, addressing an error related to the absence of the specified directory
  • Resolved an issue by implementing timeouts for the agent during snapshot building, preventing it from getting stuck indefinitely or taking excessive time in unresponsive Docker daemon scenarios
  • Fixed an issue where the Edge Agent was resetting EndpointId to 0 and polling global-key incorrectly when disconnected from Portainer server, even with disabled edge compute features
  • Fixed an issue where a dynamic edge group would erroneously create a stack even if no environment was present


  • Updated the documentation link for Swarm agent setup in the UI to ensure it directs users to the correct documentation.
  • Updated the Quick Setup wizard to provide a more accurate message, eliminating misleading connection failure notifications when adding the local environment via Agent deployment.


  • Fixed issue where Docker Images List breaks when an image has no tags.


  • Updated the version of the kubectl client in the kubectl shell console. portainer/portainer#11303
  • Fixed the stripping of labels from certain Kubernetes resources - Ingress, ConfigMap or Secret - when form-editing them. portainer/portainer#11147
  • Resolved an issue where, on adding a Helm repo, a timeout could sometimes occur. portainer/portainer#11137
  • Resolved an issue where the upgrade to BE from CE within Portainer on MicroK8s was failing because the wait time was too short.
  • Fixed an issue where namespaces 'set to system' from within Portainer weren't being detected as system. portainer/portainer#11146
  • Fixed 'Unable to determine which association to use to convert form' error when adding a service to a Kubernetes pod that had been deployed external to Portainer. portainer/portainer#11136
  • Corrected a minor UI issue introduced in 2.19.0, where, on create of Kubernetes application, if the user scrolled down and clicked 'Add persisted folder' without populating name and image fields, the focus would jump up to the first empty required field. portainer/portainer#11155
  • Fixed an issue introduced in 2.19 in the ConfigMaps and Secrets lists where a check was no longer made against them for deployments of type Pod and hence an 'Unused' badge in those instances was then not shown. portainer/portainer#11145
  • Fixed a 'this.formValues.Services is undefined' error that was shown when editing a pod created via manifest. portainer/portainer#11152
  • Resolved an issue where ConfigMaps and Secrets created via manifest were incorrectly shown with the 'External' badge. portainer/portainer#11169
  • Corrected showing of a blank screen when editing a Kubernetes application that had been deployed external to Portainer, so that the Edit application screen is now shown. portainer/portainer#11161
  • Introduced a per-user option to enable five-minute data caching for non-edge Kubernetes environments - to improve performance. portainer/portainer#11118
  • Fixed the Kubernetes Application details screen not showing referenced resources for an app that had used 'envFrom:' in its manifest to load an entire ConfigMap or Secret as environment variables instead of referencing individual values via 'valueFrom:'. portainer/portainer#11144
  • Introduced a setting to turn off the Stacks functionality within the Kubernetes side of Portainer. portainer/portainer#11119
  • Renamed the Kubernetes Advanced Deployment screen to be 'Create from Manifest'. portainer/portainer#11128
  • Corrected display of a very high 'CPU used' value in the Kubernetes Cluster details screen when micro-CPU units were being used. portainer/portainer#11154
  • DEPRECATED API endpoint GET+POST /endpoints/{id}/kubernetes/helm/repositories, MOVED Helm UI option to Advanced Deployment/Create from Manifest screen + now allow users to delete their Helm repos. New endpoint GET+POST /users/{id}/helm/repositories added. portainer/portainer#11127
  • Resolved issues that occurred around editing a Kubernetes application when a namespace had resource quotas set, where the application's (pre-edit) existing resource usage was not being taken into account. portainer/portainer#11143
  • Introduced a change so that, on deletion of an ECR or other registry, any related Kubernetes registry secret will now be removed. Note that this type of secret is auto created when assigning a registry to a namespace in a Kubernetes environment. portainer/portainer#11158
  • Migrated the Kubernetes Application Details screen's YAML, Events and Containers sections plus any of the screen's remaining code from Angular to React. portainer/portainer#11121
  • Fixed an issue around the display of incorrect search results for Kubernetes applications that are exposed via an ingress. portainer/portainer#11160
  • Corrected the Kubernetes Volume Details screen to show the Shared Access Policy of the Volume rather than (erroneously) of the StorageClass. portainer/portainer#11163
  • Corrected the deploying of a Kubernetes Daemonset with shared storage so that RWX access is granted to the Persistent Volume Claim, as relevant. portainer/portainer#11168
  • Migrated the Kubernetes Cluster Setup screen from Angular to React and improved loading of its elements. portainer/portainer#11122
  • Introduced a change so that, on assigning a user access to a Kubernetes environment that is down, the access is enabled when the environment next connects. portainer/portainer#11157
  • Corrected the display of the 'Allow resource over-commit' setting in Portainer CE, which was showing as off even though the functionality has always operated as though it is on. Note that no actual changes to functionality have been made. portainer/portainer#11142
  • Fixed a console error that could arise in the Kubernetes Add/Edit Application screen when updating resource sliders. portainer/portainer#11159
  • Corrected the labelling of the Stack field in the Kubernetes Advanced Deployment (now 'Create from Manifest') screen. Also clarified the labelling of Namespace and Name concepts. portainer/portainer#11120
  • Updated the Ingress list screen to indicate system resources correctly. portainer/portainer#11162
  • Migrated the CE Kubernetes Nodes list table (as seen in the Cluster Details screen) from Angular to React. portainer/portainer#11125
  • Fixed incorrect display of an error message when adding a Kubernetes secret under certain circumstances. portainer/portainer#11156
  • Made changes to allow stopping of a replicated Kubernetes application by scaling it to zero instances. portainer/portainer#11117
  • Migrated most of the components of the Kubernetes Create and Edit application screens from Angular to React. portainer/portainer#11123
  • Migrated the Kubernetes Add Namespace screen from Angular to React. portainer/portainer#11124
  • Ensured confirmed support of vanilla Kubernetes 1.29 clusters. portainer/portainer#11129


  • Fixed an issue that caused local stacks to be overwritten by orphaned stacks with the same name on the regular stack listing page
  • Added version path to in-app documentation links to support long-term support (LTS) vs. short-term support (STS) releases. portainer/portainer#11375
  • Fixed issue where users could erroneously edit web editor content in Git-based custom templates.
  • Resolved an issue with restoring from backup where portainer_data was stored on a network volume. portainer/portainer#11150
  • Resolved 'Unable to download backup' error that sometimes occurred when initiating database backup if portainer_data was sited on a network volume. portainer/portainer#11153
  • Fixed an issue where the cursor would jump to the end of the field after entering a character while editing environment variables for a stack.
  • Fixed issue where sorting images by tags in the Images view of a Docker/Swarm environment had no effect, ensuring that images are now sorted in tag order when clicking on the Tags column header.
  • Fixed an issue where users were unable to edit the YAML provided by a selected Custom template when deploying a stack.
  • Improved GitOps auto updates to prevent piling up when the deployment time exceeds the polling interval.
  • Resolved an issue with the upgrade and rollback process where the database was being backed up to a name that the rollback was not expecting. portainer/portainer#10751
  • Fixed a minor typo in the 'Back up Portainer' settings section. portainer/portainer#11138
  • Fixed an invalid commit link in the Stack details screen that could occur if the original copy/pasted Git URL of the stack was a GitHub repo URL with an extension of .git. portainer/portainer#11140
  • Fixed inconsistency in container counting between the environment tile on the home page and the containers tile on the environment's Dashboard.
  • Introducing 'Auto-Complete' branch selection for Git repositories in stack creation
  • Introduced a UI fix to show a 'disabled input' cursor on hover of a toggle that's disabled for change (similar to existing disabled fill-ins, etc.). portainer/portainer#11165
  • Provided information text to notify users that the GPU feature supports only Nvidia graphics cards, addressing any potential confusion
  • Fixed an issue where the "Force HTTPS only" toggle in the SSL certificates section was not functioning as expected.
  • Resolved an issue in GitLab registry handling, ensuring that Portainer continues loading images seamlessly despite errors such as deleted repositories, preventing 401 errors from affecting the display.
  • Enhanced version details popup to display the current Git commit hash and specific server environment variables for improved transparency and troubleshooting.
  • Fixed a minor UI issue with the Environment -> Manage access screen enabling the 'Create access' button even though no changes had been made. portainer/portainer#11141
  • Enlarged a too-small font used in the Web editor's search/replace feature. portainer/portainer#11175
  • Improved security by storing sensitive JWT tokens in a more secure manner, enhancing protection for user authentication in the local browser storage
  • Implemented improvements to restrict access to specific environment group details
  • Enhanced measures to prevent global admins from accessing each other's tokens through direct HTTP requests. This ensures data privacy and aligns with intended access levels in the User Interface.
  • Fixed an issue where the "Save Settings" button remained disabled after changing Advanced Options for a Git stack
  • Fixed issue where sorting by the "Updated" column in the Stacks view of a Docker environment incorrectly sorted based on the "Created" column instead.
  • Resolved an issue where attempting to upgrade from CE to EE using a 3NF license key in versions prior to 2.18.4 resulted in a failed license validation.
  • Implemented displaying of the exit code for containers in the Portainer UI.
  • Improved Portainer navigation so all submenus now have their top-level option moved down to be the first option within their submenu and they always open to that. Implemented several other small menu improvements. portainer/portainer#11116
  • Fixed an issue where the client secret field appeared blank when editing an OAuth configuration under 'Settings - Authentication'.
  • Improved the functionality around changing a linked environment's IP address so Portainer Server no longer needs restarting for the update to apply. portainer/portainer#11151
  • Improved security by adding a dropdown to hide environment variables in the stack UI on the details page, preventing potential exposure of sensitive information in public or share environments.
  • Resolved an issue where hiding a container would incorrectly label the associated container image as Unused. We now ensure accurate representation and address potential user confusion and unintended image deletion.
  • Introduced 'noindex' meta-tag to the Portainer login page to denote to search engines that the page should not be indexed and served in search results. portainer/portainer#11164
  • Fixed a console error that occurred when resizing the browser window on the containers page, particularly during an active exec console session.
  • Improved styling and layout of headings and sub-headings throughout the user interface to improve legibility and hierarchy within pages. portainer/portainer#11166
  • Introduced success notification that was missing when adding a user to a team. portainer/portainer#11170
  • Improved styling of toggles throughout the user interface to make it clearer whether they are on or off, both when they are enabled for change or disabled for change. portainer/portainer#11167
  • Improved high contrast mode so that field borders, box selector text and expiry banners are easier to make out. portainer/portainer#11173
  • Improved high contrast mode to introduce a border around modals and tooltips so they are easier to distinguish from the rest of the screen. portainer/portainer#11174
  • Resolved an issue where adding an environment to a newly created group didn't move it from 'available environment' to 'associated environment'; this now functions correctly.
  • Introduced support for input, copy and paste of extended Unicode characters in Docker container and Kubernetes kubectl shell consoles. portainer/portainer#5780


  • Updated Chisel to version 1.9 to facilitate the upgrade of Golang to version 1.20 for improved performance and compatibility
  • Updated the logging library to restore colored console logs from the Portainer binary, enhancing readability and improving visibility for users.

API Docs

  • Corrected Swagger API documentation for the GET+POST /users/{id}/tokens endpoint so the example response describes the digest format correctly as a string, rather than (erroneously) as a list of integers. portainer/portainer#11172
  • Resolved further Swagger API documentation problems including issues definition of GET /edge_stacks/{id}/logs/{endpoint_id}/file, GET /kubernetes/{id}/max_resource_limits and GET /kubernetes/{id}/namespaces/{namespace}/role_bindings. portainer/portainer#11171
  • Updated Swagger API documentation to ensure consistency in property naming conventions by using PascalCase instead of camelCase.
  • Corrected Swagger API documentation which listed creation of custom template POST endpoints as /custom_templates/file (or repository or string), but should have listed them as /custom_templates/create/file (or repository or string). portainer/portainer#11149
  • Corrected API endpoint GET /webhooks documentation to describe filters parameter as a JSON string. portainer/portainer#11148

API Changes

  • Introduced a requirement to specify the current user's password when adding an API token via the UI or the POST /users/{id}/tokens API endpoint. portainer/portainer#11126
  • Enhanced the system version API endpoint's response to now include the Portainer version type, distinguishing between Community Edition and Business Edition.

Deprecated Endpoints

  • POST /custom_templates/file Create a custom template
  • POST /custom_templates/repository Create a custom template
  • POST /custom_templates/string Create a custom template
  • POST /kubernetes/{id}/namespaces/{namespace} Create a kubernetes namespace

New Endpoints

  • POST /custom_templates/create/file Create a custom template
  • POST /custom_templates/create/repository Create a custom template
  • POST /custom_templates/create/string Create a custom template
  • GET /docker/{environmentId}/images Fetch images
  • PUT /endpoints/{id}/forceupdateservice force update a docker service
  • GET /kubernetes/{id}/namespaces/{namespace}/configuration Get ConfigMaps and Secrets
  • DELETE /stacks/name/{name} Remove Kubernetes stacks by name
  • POST /templates/{id}/file Get a template's file
  • GET /users/{id}/helm/repositories List a users helm repositories
  • POST /users/{id}/helm/repositories Create a user helm repository
  • DELETE /users/{id}/helm/repositories/{repositoryID} Delete a users helm repositoryies
  • GET /users/me Inspect the current user user
  • POST /kubernetes/{id}/namespaces Create a kubernetes namespace

Modified Endpoints

  • POST /auth Authenticate
  • POST /auth/oauth/validate Authenticate with OAuth
  • POST /custom_templates Create a custom template
  • GET /custom_templates List available custom templates
  • PUT /custom_templates/{id} Update a template
  • GET /custom_templates/{id} Inspect a custom template
  • GET /edge_groups list EdgeGroups
  • POST /edge_stacks/create/repository Create an EdgeStack from a git repository
  • GET /edge_templates Fetches the list of Edge Templates
  • POST /endpoints Create a new environment(endpoint)
  • GET /endpoints List environments(endpoints)
  • PUT /endpoints/{id} Update an environment(endpoint)
  • GET /endpoints/{id} Inspect an environment(endpoint)
  • GET /endpoints/{id}/edge/stacks/{stackId} Inspect an Edge Stack for an Environment(Endpoint)
  • PUT /endpoints/{id}/settings Update settings for an environment(endpoint)
  • PUT /kubernetes/{id}/namespaces/{namespace} Updates a kubernetes namespace
  • PUT /settings Update Portainer settings
  • GET /settings Retrieve Portainer settings
  • PUT /stacks/{id}/git/redeploy Redeploy a stack
  • GET /status/version Check for portainer updates
  • GET /system/info Retrieve system info
  • GET /system/version Check for portainer updates
  • GET /templates List available templates
  • POST /users Create a new user
  • GET /users List users
  • PUT /users/{id} Update a user
  • GET /users/{id} Inspect a user
  • POST /users/{id}/tokens Generate an API key for a user
  • GET /users/{id}/tokens Get all API keys for a user
  • POST /users/admin/init Initialize administrator account
  • GET /webhooks List webhooks


March 19, 2024, 1:12 a.m.
Release 2.20.0
Register or login to:
  • 🔍View and search all Portainer releases.
  • 🛠️Create and share lists to track your tools.
  • 🚨Setup notifications for major, security, feature or patch updates.
  • 🚀Much more coming soon!
Continue with GitHub
Continue with Google