From 7e2ce3ffc27acac1abe9dc7e5a88e4e2fd087473 Mon Sep 17 00:00:00 2001 From: cong meng Date: Thu, 29 Apr 2021 16:25:09 +1200 Subject: [PATCH 01/10] feat(edge) EE-596 Update the version of agent to 2.4.0 in agent deploy command on the adding edge screen (#5021) Co-authored-by: Simon Meng --- .../views/endpoints/edit/endpointController.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/portainer/views/endpoints/edit/endpointController.js b/app/portainer/views/endpoints/edit/endpointController.js index d1f121cd7..cb66d330b 100644 --- a/app/portainer/views/endpoints/edit/endpointController.js +++ b/app/portainer/views/endpoints/edit/endpointController.js @@ -62,7 +62,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent' + ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent:2.4.0' ); } else if ($scope.state.deploymentTab === 2 && $scope.state.platformType === 'windows') { clipboard.copyText( @@ -70,7 +70,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent' + ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent:2.4.0' ); } else if ($scope.state.deploymentTab === 1 && $scope.state.platformType === 'linux') { clipboard.copyText( @@ -78,7 +78,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - " -e CAP_HOST_MANAGEMENT=1 --mode global --constraint 'node.platform.os == linux' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes --mount type=bind,src=//,dst=/host --mount type=volume,src=portainer_agent_data,dst=/data portainer/agent" + " -e CAP_HOST_MANAGEMENT=1 --mode global --constraint 'node.platform.os == linux' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes --mount type=bind,src=//,dst=/host --mount type=volume,src=portainer_agent_data,dst=/data portainer/agent:2.4.0" ); } else if ($scope.state.deploymentTab === 1 && $scope.state.platformType === 'windows') { clipboard.copyText( @@ -86,7 +86,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --mode global --constraint node.platform.os==windows --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes --mount type=volume,src=portainer_agent_data,dst=C:\\data portainer/agent' + ' -e CAP_HOST_MANAGEMENT=1 --mode global --constraint node.platform.os==windows --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes --mount type=volume,src=portainer_agent_data,dst=C:\\data portainer/agent:2.4.0' ); } else { clipboard.copyText('curl https://downloads.portainer.io/portainer-edge-agent-setup.sh | bash -s -- ' + $scope.randomEdgeID + ' ' + $scope.endpoint.EdgeKey); @@ -258,7 +258,7 @@ angular -e EDGE_KEY=${edgeKey} \\ -e CAP_HOST_MANAGEMENT=1 \\ --name portainer_edge_agent \\ - portainer/agent`; + portainer/agent:2.4.0`; } function buildWindowsStandaloneCommand(edgeId, edgeKey) { @@ -272,7 +272,7 @@ angular -e EDGE_KEY=${edgeKey} \\ -e CAP_HOST_MANAGEMENT=1 \\ --name portainer_edge_agent \\ - portainer/agent`; + portainer/agent:2.4.0`; } function buildLinuxSwarmCommand(edgeId, edgeKey) { @@ -294,7 +294,7 @@ docker service create \\ --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \\ --mount type=bind,src=//,dst=/host \\ --mount type=volume,src=portainer_agent_data,dst=/data \\ - portainer/agent`; + portainer/agent:2.4.0`; } function buildWindowsSwarmCommand(edgeId, edgeKey) { @@ -314,7 +314,7 @@ docker service create \\ --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine \\ --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes \\ --mount type=volume,src=portainer_agent_data,dst=C:\\data \\ - portainer/agent`; + portainer/agent:2.4.0`; } initView(); From 317ebe2bfc30733fc3f6c05b2c703be0d8336b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Busso?= Date: Wed, 5 May 2021 16:24:20 +1200 Subject: [PATCH 02/10] Revert "feat(edge) EE-596 Update the version of agent to 2.4.0 in agent deploy command on the adding edge screen (#5021)" (#5031) This reverts commit 7e2ce3ffc27acac1abe9dc7e5a88e4e2fd087473. --- .../views/endpoints/edit/endpointController.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/portainer/views/endpoints/edit/endpointController.js b/app/portainer/views/endpoints/edit/endpointController.js index cb66d330b..d1f121cd7 100644 --- a/app/portainer/views/endpoints/edit/endpointController.js +++ b/app/portainer/views/endpoints/edit/endpointController.js @@ -62,7 +62,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent:2.4.0' + ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent' ); } else if ($scope.state.deploymentTab === 2 && $scope.state.platformType === 'windows') { clipboard.copyText( @@ -70,7 +70,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent:2.4.0' + ' -e CAP_HOST_MANAGEMENT=1 --name portainer_edge_agent portainer/agent' ); } else if ($scope.state.deploymentTab === 1 && $scope.state.platformType === 'linux') { clipboard.copyText( @@ -78,7 +78,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - " -e CAP_HOST_MANAGEMENT=1 --mode global --constraint 'node.platform.os == linux' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes --mount type=bind,src=//,dst=/host --mount type=volume,src=portainer_agent_data,dst=/data portainer/agent:2.4.0" + " -e CAP_HOST_MANAGEMENT=1 --mode global --constraint 'node.platform.os == linux' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes --mount type=bind,src=//,dst=/host --mount type=volume,src=portainer_agent_data,dst=/data portainer/agent" ); } else if ($scope.state.deploymentTab === 1 && $scope.state.platformType === 'windows') { clipboard.copyText( @@ -86,7 +86,7 @@ angular $scope.randomEdgeID + ' -e EDGE_KEY=' + $scope.endpoint.EdgeKey + - ' -e CAP_HOST_MANAGEMENT=1 --mode global --constraint node.platform.os==windows --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes --mount type=volume,src=portainer_agent_data,dst=C:\\data portainer/agent:2.4.0' + ' -e CAP_HOST_MANAGEMENT=1 --mode global --constraint node.platform.os==windows --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes --mount type=volume,src=portainer_agent_data,dst=C:\\data portainer/agent' ); } else { clipboard.copyText('curl https://downloads.portainer.io/portainer-edge-agent-setup.sh | bash -s -- ' + $scope.randomEdgeID + ' ' + $scope.endpoint.EdgeKey); @@ -258,7 +258,7 @@ angular -e EDGE_KEY=${edgeKey} \\ -e CAP_HOST_MANAGEMENT=1 \\ --name portainer_edge_agent \\ - portainer/agent:2.4.0`; + portainer/agent`; } function buildWindowsStandaloneCommand(edgeId, edgeKey) { @@ -272,7 +272,7 @@ angular -e EDGE_KEY=${edgeKey} \\ -e CAP_HOST_MANAGEMENT=1 \\ --name portainer_edge_agent \\ - portainer/agent:2.4.0`; + portainer/agent`; } function buildLinuxSwarmCommand(edgeId, edgeKey) { @@ -294,7 +294,7 @@ docker service create \\ --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \\ --mount type=bind,src=//,dst=/host \\ --mount type=volume,src=portainer_agent_data,dst=/data \\ - portainer/agent:2.4.0`; + portainer/agent`; } function buildWindowsSwarmCommand(edgeId, edgeKey) { @@ -314,7 +314,7 @@ docker service create \\ --mount type=npipe,src=\\\\.\\pipe\\docker_engine,dst=\\\\.\\pipe\\docker_engine \\ --mount type=bind,src=C:\\ProgramData\\docker\\volumes,dst=C:\\ProgramData\\docker\\volumes \\ --mount type=volume,src=portainer_agent_data,dst=C:\\data \\ - portainer/agent:2.4.0`; + portainer/agent`; } initView(); From dcc77e50e5a864794d80bdf194ef412122d7d00e Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Wed, 5 May 2021 11:16:59 +0300 Subject: [PATCH 03/10] fix(docker/images): show image selector advanced mode (#5032) --- app/docker/components/imageRegistry/por-image-registry.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/docker/components/imageRegistry/por-image-registry.html b/app/docker/components/imageRegistry/por-image-registry.html index 77ca79c82..97b5c07e4 100644 --- a/app/docker/components/imageRegistry/por-image-registry.html +++ b/app/docker/components/imageRegistry/por-image-registry.html @@ -1,6 +1,6 @@ -
-
+
+
From 564bea75758fe57307d4b7776a0c397f26d040b1 Mon Sep 17 00:00:00 2001 From: Hui Date: Wed, 5 May 2021 20:26:31 +1200 Subject: [PATCH 04/10] fix(ACI): ACI UAC breaks when redeploying container with same name asone already existing EE-645 (#5030) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add existing continer instance checking logic * modify response status code and err message * return json instead of plain text for err msg * Update api/http/proxy/factory/azure/containergroup.go * Update api/http/proxy/factory/azure/containergroup.go * Update api/http/proxy/factory/azure/containergroup.go Co-authored-by: Stéphane Busso --- .../proxy/factory/azure/containergroup.go | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/api/http/proxy/factory/azure/containergroup.go b/api/http/proxy/factory/azure/containergroup.go index c3383035c..242968de5 100644 --- a/api/http/proxy/factory/azure/containergroup.go +++ b/api/http/proxy/factory/azure/containergroup.go @@ -23,6 +23,36 @@ func (transport *Transport) proxyContainerGroupRequest(request *http.Request) (* } func (transport *Transport) proxyContainerGroupPutRequest(request *http.Request) (*http.Response, error) { + //add a lock before processing existense check + transport.mutex.Lock() + defer transport.mutex.Unlock() + + //generate a temp http GET request based on the current PUT request + validationRequest := &http.Request{ + Method: http.MethodGet, + URL: request.URL, + Header: http.Header{ + "Authorization": []string{request.Header.Get("Authorization")}, + }, + } + + //fire the request to Azure API to validate if there is an existing container instance with the same name + //positive - reject the request + //negative - continue the process + validationResponse, err := http.DefaultTransport.RoundTrip(validationRequest) + if err != nil { + return validationResponse, err + } + + if validationResponse.StatusCode >= 200 && validationResponse.StatusCode < 300 { + resp := &http.Response{} + errObj := map[string]string{ + "message": "A container instance with the same name already exists inside the selected resource group", + } + err = responseutils.RewriteResponse(resp, errObj, http.StatusConflict) + return resp, err + } + response, err := http.DefaultTransport.RoundTrip(request) if err != nil { return response, err From b7980f1b60fcba55c601dbe9a535a89f61873048 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Fri, 7 May 2021 00:49:56 +0300 Subject: [PATCH 05/10] fix(k8s/ingress): remove only selected ingress (#5035) * fix(k8s/ingress): remove only selected ingress * fix(k8s/ingress): remove ingress from namespace --- app/kubernetes/ingress/service.js | 5 ++--- app/kubernetes/services/resourcePoolService.js | 2 +- app/kubernetes/views/configure/configureController.js | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/kubernetes/ingress/service.js b/app/kubernetes/ingress/service.js index 01fc26b44..dae395870 100644 --- a/app/kubernetes/ingress/service.js +++ b/app/kubernetes/ingress/service.js @@ -77,12 +77,11 @@ export function KubernetesIngressService($async, KubernetesIngresses) { }); } - function _delete(ingress) { + function _delete(namespace, ingressClassName) { return $async(async () => { try { const params = new KubernetesCommonParams(); - params.id = ingress.Name; - const namespace = ingress.Namespace; + params.id = ingressClassName; await KubernetesIngresses(namespace).delete(params).$promise; } catch (err) { throw new PortainerError('Unable to delete ingress', err); diff --git a/app/kubernetes/services/resourcePoolService.js b/app/kubernetes/services/resourcePoolService.js index f492c6ef4..ac38e2d4f 100644 --- a/app/kubernetes/services/resourcePoolService.js +++ b/app/kubernetes/services/resourcePoolService.js @@ -93,7 +93,7 @@ export function KubernetesResourcePoolService($async, KubernetesNamespaceService const patch = _.without(newIngresses, ...create); const createPromises = _.map(create, (i) => KubernetesIngressService.create(i)); - const delPromises = _.map(del, (i) => KubernetesIngressService.delete(i)); + const delPromises = _.map(del, (i) => KubernetesIngressService.delete(i.Namespace, i.Name)); const patchPromises = _.map(patch, (ing) => { const old = _.find(oldIngresses, { Name: ing.Name }); ing.Paths = angular.copy(old.Paths); diff --git a/app/kubernetes/views/configure/configureController.js b/app/kubernetes/views/configure/configureController.js index a66bf5a19..a3c5b4e5e 100644 --- a/app/kubernetes/views/configure/configureController.js +++ b/app/kubernetes/views/configure/configureController.js @@ -150,7 +150,7 @@ class KubernetesConfigureController { ingressesToDel.forEach((ingress) => { resourcePools.forEach((resourcePool) => { - promises.push(this.KubernetesIngressService.delete({ IngressClass: ingress, Namespace: resourcePool.Namespace.Name })); + promises.push(this.KubernetesIngressService.delete(resourcePool.Namespace.Name, ingress.Name)); }); }); From 886d6764be47ad273c280cc9f5177f44d51783a0 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Tue, 11 May 2021 00:24:29 +0300 Subject: [PATCH 06/10] fix(docker): set image pulls as valid if failed fetching (#5055) --- .../imageRegistry/por-image-registry-rate-limits.controller.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/docker/components/imageRegistry/por-image-registry-rate-limits.controller.js b/app/docker/components/imageRegistry/por-image-registry-rate-limits.controller.js index 83e9876e4..d823c848d 100644 --- a/app/docker/components/imageRegistry/por-image-registry-rate-limits.controller.js +++ b/app/docker/components/imageRegistry/por-image-registry-rate-limits.controller.js @@ -23,6 +23,7 @@ export default class porImageRegistryContainerController { } catch (e) { // eslint-disable-next-line no-console console.error('Failed loading DockerHub pull rate limits', e); + this.setValidity(true); } } else { this.setValidity(true); From 0ac62747122dfc23ad778327177749f764aa5f61 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Tue, 11 May 2021 01:59:42 +0300 Subject: [PATCH 07/10] fix(docker/services): create a service webhook (#5052) --- app/docker/views/services/create/createServiceController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/docker/views/services/create/createServiceController.js b/app/docker/views/services/create/createServiceController.js index 6e766602d..6aa70264c 100644 --- a/app/docker/views/services/create/createServiceController.js +++ b/app/docker/views/services/create/createServiceController.js @@ -499,7 +499,7 @@ angular.module('portainer.docker').controller('CreateServiceController', [ const resourceControl = data.Portainer.ResourceControl; const userId = Authentication.getUserDetails().ID; const rcPromise = ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl); - const webhookPromise = $q.when(endpoint.Type !== 4 && $scope.formValues.Webhook && WebhookService.createServiceWebhook(serviceId, endpoint.ID)); + const webhookPromise = $q.when(endpoint.Type !== 4 && $scope.formValues.Webhook && WebhookService.createServiceWebhook(serviceId, endpoint.Id)); return $q.all([rcPromise, webhookPromise]); }) .then(function success() { From 3641158dafdec1026e2c48a9d3281503ac29f7fe Mon Sep 17 00:00:00 2001 From: dbuduev Date: Wed, 12 May 2021 09:05:00 +1200 Subject: [PATCH 08/10] fix: docker-compose use custom config.json to access private images (#5058) cherry-picking commit a6b289c9. Co-authored-by: Dmitry Salakhov --- api/cmd/portainer/main.go | 2 +- api/exec/compose_wrapper.go | 6 +++++- api/exec/compose_wrapper_integration_test.go | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api/cmd/portainer/main.go b/api/cmd/portainer/main.go index 6ae3368d6..91bfce5f3 100644 --- a/api/cmd/portainer/main.go +++ b/api/cmd/portainer/main.go @@ -76,7 +76,7 @@ func initDataStore(dataStorePath string, fileService portainer.FileService) port } func initComposeStackManager(assetsPath string, dataStorePath string, reverseTunnelService portainer.ReverseTunnelService, proxyManager *proxy.Manager) portainer.ComposeStackManager { - composeWrapper := exec.NewComposeWrapper(assetsPath, proxyManager) + composeWrapper := exec.NewComposeWrapper(assetsPath, dataStorePath, proxyManager) if composeWrapper != nil { return composeWrapper } diff --git a/api/exec/compose_wrapper.go b/api/exec/compose_wrapper.go index 918411685..87aef1724 100644 --- a/api/exec/compose_wrapper.go +++ b/api/exec/compose_wrapper.go @@ -16,17 +16,19 @@ import ( // ComposeWrapper is a wrapper for docker-compose binary type ComposeWrapper struct { binaryPath string + dataPath string proxyManager *proxy.Manager } // NewComposeWrapper returns a docker-compose wrapper if corresponding binary present, otherwise nil -func NewComposeWrapper(binaryPath string, proxyManager *proxy.Manager) *ComposeWrapper { +func NewComposeWrapper(binaryPath, dataPath string, proxyManager *proxy.Manager) *ComposeWrapper { if !IsBinaryPresent(programPath(binaryPath, "docker-compose")) { return nil } return &ComposeWrapper{ binaryPath: binaryPath, + dataPath: dataPath, proxyManager: proxyManager, } } @@ -84,6 +86,8 @@ func (w *ComposeWrapper) command(command []string, stack *portainer.Stack, endpo var stderr bytes.Buffer cmd := exec.Command(program, args...) + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, fmt.Sprintf("DOCKER_CONFIG=%s", w.dataPath)) cmd.Stderr = &stderr out, err := cmd.Output() diff --git a/api/exec/compose_wrapper_integration_test.go b/api/exec/compose_wrapper_integration_test.go index 766622614..42c4af1c1 100644 --- a/api/exec/compose_wrapper_integration_test.go +++ b/api/exec/compose_wrapper_integration_test.go @@ -42,7 +42,7 @@ func Test_UpAndDown(t *testing.T) { stack, endpoint := setup(t) - w := NewComposeWrapper("", nil) + w := NewComposeWrapper("", "", nil) err := w.Up(stack, endpoint) if err != nil { From a21798f51809fc23d9ed490247a6c2c82d7f4097 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Wed, 12 May 2021 03:29:35 +0300 Subject: [PATCH 09/10] fix(docker/containers): show sysctl control (#5051) --- api/portainer.go | 2 +- .../views/containers/create/createContainerController.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/api/portainer.go b/api/portainer.go index 0f6a72568..e0fd9b08d 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -336,7 +336,7 @@ type ( // Whether non-administrator should be able to use container capabilities AllowContainerCapabilitiesForRegularUsers bool `json:"allowContainerCapabilitiesForRegularUsers" example:"true"` // Whether non-administrator should be able to use sysctl settings - AllowSysctlSettingForRegularUsers bool `json:"AllowSysctlSettingForRegularUsers" example:"true"` + AllowSysctlSettingForRegularUsers bool `json:"allowSysctlSettingForRegularUsers" example:"true"` // Whether host management features are enabled EnableHostManagementFeatures bool `json:"enableHostManagementFeatures" example:"true"` } diff --git a/app/docker/views/containers/create/createContainerController.js b/app/docker/views/containers/create/createContainerController.js index 768d1e589..19965b7ae 100644 --- a/app/docker/views/containers/create/createContainerController.js +++ b/app/docker/views/containers/create/createContainerController.js @@ -972,9 +972,7 @@ angular.module('portainer.docker').controller('CreateContainerController', [ } async function shouldShowSysctls() { - const { allowSysctlSettingForRegularUsers } = $scope.applicationState.application; - - return allowSysctlSettingForRegularUsers || Authentication.isAdmin(); + return endpoint.SecuritySettings.allowSysctlSettingForRegularUsers || Authentication.isAdmin(); } async function checkIfContainerCapabilitiesEnabled() { From 43702c251664506bba0e3eefc81100ea86e4b86f Mon Sep 17 00:00:00 2001 From: yi-portainer Date: Thu, 13 May 2021 18:30:34 +1200 Subject: [PATCH 10/10] * update portainer version to 2.5.0 --- api/portainer.go | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/portainer.go b/api/portainer.go index e0fd9b08d..282a8b5f4 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -1327,7 +1327,7 @@ type ( const ( // APIVersion is the version number of the Portainer API - APIVersion = "2.4.0" + APIVersion = "2.5.0" // DBVersion is the version number of the Portainer database DBVersion = 27 // ComposeSyntaxMaxVersion is a maximum supported version of the docker compose syntax diff --git a/package.json b/package.json index 1c5572bb8..fc2c4144f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Portainer.io", "name": "portainer", "homepage": "http://portainer.io", - "version": "2.4.0", + "version": "2.5.0", "repository": { "type": "git", "url": "git@github.com:portainer/portainer.git"