diff --git a/.gitbook/assets/2.,9-environments-access-1.gif b/.gitbook/assets/2.,9-environments-access-1.gif new file mode 100644 index 00000000..5470c370 Binary files /dev/null and b/.gitbook/assets/2.,9-environments-access-1.gif differ diff --git a/.gitbook/assets/2.10-authentication-ad-1.gif b/.gitbook/assets/2.10-authentication-ad-1.gif new file mode 100644 index 00000000..a5943366 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-ad-1.gif differ diff --git a/.gitbook/assets/2.10-authentication-ldap-1.gif b/.gitbook/assets/2.10-authentication-ldap-1.gif new file mode 100644 index 00000000..aaea33c0 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-ldap-1.gif differ diff --git a/.gitbook/assets/2.10-authentication-ldap-autopopulate.png b/.gitbook/assets/2.10-authentication-ldap-autopopulate.png new file mode 100644 index 00000000..905d06b0 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-ldap-autopopulate.png differ diff --git a/.gitbook/assets/2.10-authentication-ldap-configuration.png b/.gitbook/assets/2.10-authentication-ldap-configuration.png new file mode 100644 index 00000000..cba30854 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-ldap-configuration.png differ diff --git a/.gitbook/assets/2.10-authentication-ldap-servertype.png b/.gitbook/assets/2.10-authentication-ldap-servertype.png new file mode 100644 index 00000000..d6368d4d Binary files /dev/null and b/.gitbook/assets/2.10-authentication-ldap-servertype.png differ diff --git a/.gitbook/assets/2.10-authentication-oauth-1.gif b/.gitbook/assets/2.10-authentication-oauth-1.gif new file mode 100644 index 00000000..8d0ab712 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-oauth-1.gif differ diff --git a/.gitbook/assets/2.10-authentication-oauth-teammembership.png b/.gitbook/assets/2.10-authentication-oauth-teammembership.png new file mode 100644 index 00000000..f1a19dea Binary files /dev/null and b/.gitbook/assets/2.10-authentication-oauth-teammembership.png differ diff --git a/.gitbook/assets/2.10-authentication-splash.png b/.gitbook/assets/2.10-authentication-splash.png new file mode 100644 index 00000000..51c45120 Binary files /dev/null and b/.gitbook/assets/2.10-authentication-splash.png differ diff --git a/.gitbook/assets/2.10-automatic-updates.png b/.gitbook/assets/2.10-automatic-updates.png new file mode 100644 index 00000000..a420c24d Binary files /dev/null and b/.gitbook/assets/2.10-automatic-updates.png differ diff --git a/.gitbook/assets/2.10-changewindow.png b/.gitbook/assets/2.10-changewindow.png new file mode 100644 index 00000000..dafec71f Binary files /dev/null and b/.gitbook/assets/2.10-changewindow.png differ diff --git a/.gitbook/assets/2.10-edge-agent-deploy-1.png b/.gitbook/assets/2.10-edge-agent-deploy-1.png new file mode 100644 index 00000000..31e717a3 Binary files /dev/null and b/.gitbook/assets/2.10-edge-agent-deploy-1.png differ diff --git a/.gitbook/assets/2.10-edge-agent-deploy-2.png b/.gitbook/assets/2.10-edge-agent-deploy-2.png new file mode 100644 index 00000000..dae35edf Binary files /dev/null and b/.gitbook/assets/2.10-edge-agent-deploy-2.png differ diff --git a/.gitbook/assets/2.10-environments-access-1.gif b/.gitbook/assets/2.10-environments-access-1.gif new file mode 100644 index 00000000..17881ef9 Binary files /dev/null and b/.gitbook/assets/2.10-environments-access-1.gif differ diff --git a/.gitbook/assets/2.10-environments-access-groups-1.gif b/.gitbook/assets/2.10-environments-access-groups-1.gif new file mode 100644 index 00000000..4654bc9c Binary files /dev/null and b/.gitbook/assets/2.10-environments-access-groups-1.gif differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-1.gif b/.gitbook/assets/2.10-environments-add-k8s-1.gif new file mode 100644 index 00000000..d6811932 Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-1.gif differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-lb.png b/.gitbook/assets/2.10-environments-add-k8s-lb.png new file mode 100644 index 00000000..37880b56 Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-lb.png differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-networking.png b/.gitbook/assets/2.10-environments-add-k8s-networking.png new file mode 100644 index 00000000..5528efe1 Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-networking.png differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-nodeport.png b/.gitbook/assets/2.10-environments-add-k8s-nodeport.png new file mode 100644 index 00000000..9044179f Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-nodeport.png differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-resources.png b/.gitbook/assets/2.10-environments-add-k8s-resources.png new file mode 100644 index 00000000..f66d9b6c Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-resources.png differ diff --git a/.gitbook/assets/2.10-environments-add-k8s-security.png b/.gitbook/assets/2.10-environments-add-k8s-security.png new file mode 100644 index 00000000..88476a3a Binary files /dev/null and b/.gitbook/assets/2.10-environments-add-k8s-security.png differ diff --git a/.gitbook/assets/2.10-helm.png b/.gitbook/assets/2.10-helm.png new file mode 100644 index 00000000..9ccdaa80 Binary files /dev/null and b/.gitbook/assets/2.10-helm.png differ diff --git a/.gitbook/assets/2.10-install-setup-license.png b/.gitbook/assets/2.10-install-setup-license.png new file mode 100644 index 00000000..39171b55 Binary files /dev/null and b/.gitbook/assets/2.10-install-setup-license.png differ diff --git a/.gitbook/assets/2.10-install-setup-wizard.png b/.gitbook/assets/2.10-install-setup-wizard.png new file mode 100644 index 00000000..666e4328 Binary files /dev/null and b/.gitbook/assets/2.10-install-setup-wizard.png differ diff --git a/.gitbook/assets/2.10-k8s-applications-manifest-force-redeployment.png b/.gitbook/assets/2.10-k8s-applications-manifest-force-redeployment.png new file mode 100644 index 00000000..a30b3783 Binary files /dev/null and b/.gitbook/assets/2.10-k8s-applications-manifest-force-redeployment.png differ diff --git a/.gitbook/assets/2.10-k8s-cluster-setup-1.gif b/.gitbook/assets/2.10-k8s-cluster-setup-1.gif new file mode 100644 index 00000000..0441071c Binary files /dev/null and b/.gitbook/assets/2.10-k8s-cluster-setup-1.gif differ diff --git a/.gitbook/assets/2.10-k8s-cluster-setup-4.png b/.gitbook/assets/2.10-k8s-cluster-setup-4.png new file mode 100644 index 00000000..36b68a04 Binary files /dev/null and b/.gitbook/assets/2.10-k8s-cluster-setup-4.png differ diff --git a/.gitbook/assets/2.10-k8s-cluster-setup-changewindow.png b/.gitbook/assets/2.10-k8s-cluster-setup-changewindow.png new file mode 100644 index 00000000..50bca548 Binary files /dev/null and b/.gitbook/assets/2.10-k8s-cluster-setup-changewindow.png differ diff --git a/.gitbook/assets/2.10-k8s-namespaces-manage-1.gif b/.gitbook/assets/2.10-k8s-namespaces-manage-1.gif new file mode 100644 index 00000000..14404aa6 Binary files /dev/null and b/.gitbook/assets/2.10-k8s-namespaces-manage-1.gif differ diff --git a/.gitbook/assets/2.10-k8s-namespaces-manage-3.png b/.gitbook/assets/2.10-k8s-namespaces-manage-3.png new file mode 100644 index 00000000..06fdf03e Binary files /dev/null and b/.gitbook/assets/2.10-k8s-namespaces-manage-3.png differ diff --git a/.gitbook/assets/2.10-k8s-namespaces-manage-4.png b/.gitbook/assets/2.10-k8s-namespaces-manage-4.png new file mode 100644 index 00000000..176bb11c Binary files /dev/null and b/.gitbook/assets/2.10-k8s-namespaces-manage-4.png differ diff --git a/.gitbook/assets/2.10-kubectl-shell.png b/.gitbook/assets/2.10-kubectl-shell.png new file mode 100644 index 00000000..e0108f47 Binary files /dev/null and b/.gitbook/assets/2.10-kubectl-shell.png differ diff --git a/.gitbook/assets/2.10-stacks-edit-3.png b/.gitbook/assets/2.10-stacks-edit-3.png new file mode 100644 index 00000000..ae9af09a Binary files /dev/null and b/.gitbook/assets/2.10-stacks-edit-3.png differ diff --git a/.gitbook/assets/2.10-themes.png b/.gitbook/assets/2.10-themes.png new file mode 100644 index 00000000..74274b1a Binary files /dev/null and b/.gitbook/assets/2.10-themes.png differ diff --git a/.gitbook/assets/2.10-users-roles-1.png b/.gitbook/assets/2.10-users-roles-1.png new file mode 100644 index 00000000..1f7f3b8c Binary files /dev/null and b/.gitbook/assets/2.10-users-roles-1.png differ diff --git a/.gitbook/assets/2.10-users-roles-2.gif b/.gitbook/assets/2.10-users-roles-2.gif new file mode 100644 index 00000000..ee1c3e91 Binary files /dev/null and b/.gitbook/assets/2.10-users-roles-2.gif differ diff --git a/.gitbook/assets/2.10-users-roles-3.png b/.gitbook/assets/2.10-users-roles-3.png new file mode 100644 index 00000000..54915306 Binary files /dev/null and b/.gitbook/assets/2.10-users-roles-3.png differ diff --git a/.gitbook/assets/2.11-access-token-add-2.png b/.gitbook/assets/2.11-access-token-add-2.png new file mode 100644 index 00000000..df2a3132 Binary files /dev/null and b/.gitbook/assets/2.11-access-token-add-2.png differ diff --git a/.gitbook/assets/2.11-access-token-add.png b/.gitbook/assets/2.11-access-token-add.png new file mode 100644 index 00000000..854bd834 Binary files /dev/null and b/.gitbook/assets/2.11-access-token-add.png differ diff --git a/.gitbook/assets/2.11-account-settings-accesstokens (1).png b/.gitbook/assets/2.11-account-settings-accesstokens (1).png new file mode 100644 index 00000000..3de4b251 Binary files /dev/null and b/.gitbook/assets/2.11-account-settings-accesstokens (1).png differ diff --git a/.gitbook/assets/2.11-account-settings-accesstokens.png b/.gitbook/assets/2.11-account-settings-accesstokens.png new file mode 100644 index 00000000..3de4b251 Binary files /dev/null and b/.gitbook/assets/2.11-account-settings-accesstokens.png differ diff --git a/.gitbook/assets/2.11-edge-agent-add-1.png b/.gitbook/assets/2.11-edge-agent-add-1.png new file mode 100644 index 00000000..0bccf6ee Binary files /dev/null and b/.gitbook/assets/2.11-edge-agent-add-1.png differ diff --git a/.gitbook/assets/2.11-edge-agent-deploy-1.png b/.gitbook/assets/2.11-edge-agent-deploy-1.png new file mode 100644 index 00000000..a1c66c3a Binary files /dev/null and b/.gitbook/assets/2.11-edge-agent-deploy-1.png differ diff --git a/.gitbook/assets/2.11-helm-global-repo-warning.png b/.gitbook/assets/2.11-helm-global-repo-warning.png new file mode 100644 index 00000000..54fcb694 Binary files /dev/null and b/.gitbook/assets/2.11-helm-global-repo-warning.png differ diff --git a/.gitbook/assets/2.11-images-import-2.png b/.gitbook/assets/2.11-images-import-2.png new file mode 100644 index 00000000..b8fd8ee9 Binary files /dev/null and b/.gitbook/assets/2.11-images-import-2.png differ diff --git a/.gitbook/assets/2.11-images-import-3.png b/.gitbook/assets/2.11-images-import-3.png new file mode 100644 index 00000000..8bc5c101 Binary files /dev/null and b/.gitbook/assets/2.11-images-import-3.png differ diff --git a/.gitbook/assets/2.11-images-import-4.png b/.gitbook/assets/2.11-images-import-4.png new file mode 100644 index 00000000..94b46ecb Binary files /dev/null and b/.gitbook/assets/2.11-images-import-4.png differ diff --git a/.gitbook/assets/2.11-kubeconfig-2.png b/.gitbook/assets/2.11-kubeconfig-2.png new file mode 100644 index 00000000..268000c5 Binary files /dev/null and b/.gitbook/assets/2.11-kubeconfig-2.png differ diff --git a/.gitbook/assets/2.11-registries-add-aws-ecr-2.png b/.gitbook/assets/2.11-registries-add-aws-ecr-2.png new file mode 100644 index 00000000..f1f46b8d Binary files /dev/null and b/.gitbook/assets/2.11-registries-add-aws-ecr-2.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-config.png b/.gitbook/assets/2.11.1-applications-add-config.png new file mode 100644 index 00000000..947d7cc5 Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-config.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-deployment.png b/.gitbook/assets/2.11.1-applications-add-deployment.png new file mode 100644 index 00000000..d6e8c03f Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-deployment.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-env.png b/.gitbook/assets/2.11.1-applications-add-env.png new file mode 100644 index 00000000..4398a427 Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-env.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-persist.png b/.gitbook/assets/2.11.1-applications-add-persist.png new file mode 100644 index 00000000..cba3f236 Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-persist.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-placement.png b/.gitbook/assets/2.11.1-applications-add-placement.png new file mode 100644 index 00000000..d2c0167d Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-placement.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-publish.png b/.gitbook/assets/2.11.1-applications-add-publish.png new file mode 100644 index 00000000..f94ba7ff Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-publish.png differ diff --git a/.gitbook/assets/2.11.1-applications-add-resource.png b/.gitbook/assets/2.11.1-applications-add-resource.png new file mode 100644 index 00000000..76b2b215 Binary files /dev/null and b/.gitbook/assets/2.11.1-applications-add-resource.png differ diff --git a/.gitbook/assets/2.11.1-edge-devices-fdo.png b/.gitbook/assets/2.11.1-edge-devices-fdo.png new file mode 100644 index 00000000..1c8fa1f8 Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-devices-fdo.png differ diff --git a/.gitbook/assets/2.11.1-edge-devices-openamt-activating.png b/.gitbook/assets/2.11.1-edge-devices-openamt-activating.png new file mode 100644 index 00000000..8e857052 Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-devices-openamt-activating.png differ diff --git a/.gitbook/assets/2.11.1-edge-devices-openamt-completed.png b/.gitbook/assets/2.11.1-edge-devices-openamt-completed.png new file mode 100644 index 00000000..092eb375 Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-devices-openamt-completed.png differ diff --git a/.gitbook/assets/2.11.1-edge-devices-openamt-functions.png b/.gitbook/assets/2.11.1-edge-devices-openamt-functions.png new file mode 100644 index 00000000..01308f94 Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-devices-openamt-functions.png differ diff --git a/.gitbook/assets/2.11.1-edge-devices-openamt-list.png b/.gitbook/assets/2.11.1-edge-devices-openamt-list.png new file mode 100644 index 00000000..d904dc6b Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-devices-openamt-list.png differ diff --git a/.gitbook/assets/2.11.1-edge-information.png b/.gitbook/assets/2.11.1-edge-information.png new file mode 100644 index 00000000..f4bf7926 Binary files /dev/null and b/.gitbook/assets/2.11.1-edge-information.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-basic.png b/.gitbook/assets/2.11.1-settings-edgecompute-basic.png new file mode 100644 index 00000000..82daed22 Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-basic.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles-edit.png b/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles-edit.png new file mode 100644 index 00000000..72d6c61e Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles-edit.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles.png b/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles.png new file mode 100644 index 00000000..70556ae2 Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-deviceprofiles.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-fdo.png b/.gitbook/assets/2.11.1-settings-edgecompute-fdo.png new file mode 100644 index 00000000..972706d9 Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-fdo.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-openamt.png b/.gitbook/assets/2.11.1-settings-edgecompute-openamt.png new file mode 100644 index 00000000..ca08cd23 Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-openamt.png differ diff --git a/.gitbook/assets/2.11.1-settings-edgecompute-settings.png b/.gitbook/assets/2.11.1-settings-edgecompute-settings.png new file mode 100644 index 00000000..f75d5804 Binary files /dev/null and b/.gitbook/assets/2.11.1-settings-edgecompute-settings.png differ diff --git a/.gitbook/assets/2.11.1-stacks-edit-actions.png b/.gitbook/assets/2.11.1-stacks-edit-actions.png new file mode 100644 index 00000000..9187aea3 Binary files /dev/null and b/.gitbook/assets/2.11.1-stacks-edit-actions.png differ diff --git a/.gitbook/assets/2.12-home-splash.png b/.gitbook/assets/2.12-home-splash.png new file mode 100644 index 00000000..ecddc141 Binary files /dev/null and b/.gitbook/assets/2.12-home-splash.png differ diff --git a/.gitbook/assets/2.12-images-import-1.gif b/.gitbook/assets/2.12-images-import-1.gif new file mode 100644 index 00000000..a1ea7210 Binary files /dev/null and b/.gitbook/assets/2.12-images-import-1.gif differ diff --git a/.gitbook/assets/2.12-kubeconfig-1.gif b/.gitbook/assets/2.12-kubeconfig-1.gif new file mode 100644 index 00000000..9180f510 Binary files /dev/null and b/.gitbook/assets/2.12-kubeconfig-1.gif differ diff --git a/.gitbook/assets/2.12-registries-add-ecr-1.gif b/.gitbook/assets/2.12-registries-add-ecr-1.gif new file mode 100644 index 00000000..275b13ff Binary files /dev/null and b/.gitbook/assets/2.12-registries-add-ecr-1.gif differ diff --git a/.gitbook/assets/2.12-registries-add-quay-1.gif b/.gitbook/assets/2.12-registries-add-quay-1.gif new file mode 100644 index 00000000..784340a3 Binary files /dev/null and b/.gitbook/assets/2.12-registries-add-quay-1.gif differ diff --git a/.gitbook/assets/2.12-services-add-1.gif b/.gitbook/assets/2.12-services-add-1.gif new file mode 100644 index 00000000..b42a1894 Binary files /dev/null and b/.gitbook/assets/2.12-services-add-1.gif differ diff --git a/.gitbook/assets/2.12-services-configure-1.gif b/.gitbook/assets/2.12-services-configure-1.gif new file mode 100644 index 00000000..b7ce45e9 Binary files /dev/null and b/.gitbook/assets/2.12-services-configure-1.gif differ diff --git a/.gitbook/assets/2.12-services-logs-1.gif b/.gitbook/assets/2.12-services-logs-1.gif new file mode 100644 index 00000000..06ff46c8 Binary files /dev/null and b/.gitbook/assets/2.12-services-logs-1.gif differ diff --git a/.gitbook/assets/2.12-services-rollback-1.gif b/.gitbook/assets/2.12-services-rollback-1.gif new file mode 100644 index 00000000..a81860b3 Binary files /dev/null and b/.gitbook/assets/2.12-services-rollback-1.gif differ diff --git a/.gitbook/assets/2.12-services-scale-1.gif b/.gitbook/assets/2.12-services-scale-1.gif new file mode 100644 index 00000000..b908a17e Binary files /dev/null and b/.gitbook/assets/2.12-services-scale-1.gif differ diff --git a/.gitbook/assets/2.12-services-tasks-1.gif b/.gitbook/assets/2.12-services-tasks-1.gif new file mode 100644 index 00000000..f158389c Binary files /dev/null and b/.gitbook/assets/2.12-services-tasks-1.gif differ diff --git a/.gitbook/assets/2.12-services-tasks-actions.png b/.gitbook/assets/2.12-services-tasks-actions.png new file mode 100644 index 00000000..0ae22cdf Binary files /dev/null and b/.gitbook/assets/2.12-services-tasks-actions.png differ diff --git a/.gitbook/assets/2.12-settings-edgecompute-1.gif b/.gitbook/assets/2.12-settings-edgecompute-1.gif new file mode 100644 index 00000000..965444c6 Binary files /dev/null and b/.gitbook/assets/2.12-settings-edgecompute-1.gif differ diff --git a/.gitbook/assets/2.12-stacks-add-automatic-polling.png b/.gitbook/assets/2.12-stacks-add-automatic-polling.png new file mode 100644 index 00000000..ee42819a Binary files /dev/null and b/.gitbook/assets/2.12-stacks-add-automatic-polling.png differ diff --git a/.gitbook/assets/2.12-stacks-add-automatic-webhook.png b/.gitbook/assets/2.12-stacks-add-automatic-webhook.png new file mode 100644 index 00000000..9f115c45 Binary files /dev/null and b/.gitbook/assets/2.12-stacks-add-automatic-webhook.png differ diff --git a/.gitbook/assets/2.12-stacks-add-pull-latest-force.png b/.gitbook/assets/2.12-stacks-add-pull-latest-force.png new file mode 100644 index 00000000..10d22d27 Binary files /dev/null and b/.gitbook/assets/2.12-stacks-add-pull-latest-force.png differ diff --git a/.gitbook/assets/2.12-whatsnew-apiaccess.png b/.gitbook/assets/2.12-whatsnew-apiaccess.png new file mode 100644 index 00000000..0fd13d9f Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-apiaccess.png differ diff --git a/.gitbook/assets/2.12-whatsnew-ecr.png b/.gitbook/assets/2.12-whatsnew-ecr.png new file mode 100644 index 00000000..98205e83 Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-ecr.png differ diff --git a/.gitbook/assets/2.12-whatsnew-fdo.png b/.gitbook/assets/2.12-whatsnew-fdo.png new file mode 100644 index 00000000..915a2830 Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-fdo.png differ diff --git a/.gitbook/assets/2.12-whatsnew-kubeconfig.png b/.gitbook/assets/2.12-whatsnew-kubeconfig.png new file mode 100644 index 00000000..d8356d57 Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-kubeconfig.png differ diff --git a/.gitbook/assets/2.12-whatsnew-openamt.png b/.gitbook/assets/2.12-whatsnew-openamt.png new file mode 100644 index 00000000..803385cf Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-openamt.png differ diff --git a/.gitbook/assets/2.12-whatsnew-pull-latest.png b/.gitbook/assets/2.12-whatsnew-pull-latest.png new file mode 100644 index 00000000..90b4a1fb Binary files /dev/null and b/.gitbook/assets/2.12-whatsnew-pull-latest.png differ diff --git a/.gitbook/assets/2.12.2-container-webhook.gif b/.gitbook/assets/2.12.2-container-webhook.gif new file mode 100644 index 00000000..a6ee102d Binary files /dev/null and b/.gitbook/assets/2.12.2-container-webhook.gif differ diff --git a/.gitbook/assets/2.12.2-containers-add-webhooks.png b/.gitbook/assets/2.12.2-containers-add-webhooks.png new file mode 100644 index 00000000..2426fccb Binary files /dev/null and b/.gitbook/assets/2.12.2-containers-add-webhooks.png differ diff --git a/.gitbook/assets/2.12.2-containers-view-status.png b/.gitbook/assets/2.12.2-containers-view-status.png new file mode 100644 index 00000000..11b0d972 Binary files /dev/null and b/.gitbook/assets/2.12.2-containers-view-status.png differ diff --git a/.gitbook/assets/2.12.2-containers-webhooks-url.png b/.gitbook/assets/2.12.2-containers-webhooks-url.png new file mode 100644 index 00000000..75615a27 Binary files /dev/null and b/.gitbook/assets/2.12.2-containers-webhooks-url.png differ diff --git a/.gitbook/assets/2.12.2-edge-agent-add-1.png b/.gitbook/assets/2.12.2-edge-agent-add-1.png new file mode 100644 index 00000000..08ca5105 Binary files /dev/null and b/.gitbook/assets/2.12.2-edge-agent-add-1.png differ diff --git a/.gitbook/assets/2.12.2-edge-agent-add-2.png b/.gitbook/assets/2.12.2-edge-agent-add-2.png new file mode 100644 index 00000000..e077aac5 Binary files /dev/null and b/.gitbook/assets/2.12.2-edge-agent-add-2.png differ diff --git a/.gitbook/assets/2.12.2-edge-agent-add-nomad.png b/.gitbook/assets/2.12.2-edge-agent-add-nomad.png new file mode 100644 index 00000000..c951833d Binary files /dev/null and b/.gitbook/assets/2.12.2-edge-agent-add-nomad.png differ diff --git a/.gitbook/assets/2.12.2-edge-stacks-add-deploytype.png b/.gitbook/assets/2.12.2-edge-stacks-add-deploytype.png new file mode 100644 index 00000000..cc28b16c Binary files /dev/null and b/.gitbook/assets/2.12.2-edge-stacks-add-deploytype.png differ diff --git a/.gitbook/assets/2.12.2-nomad-dashboard-clusterinfo.png b/.gitbook/assets/2.12.2-nomad-dashboard-clusterinfo.png new file mode 100644 index 00000000..e6d2000c Binary files /dev/null and b/.gitbook/assets/2.12.2-nomad-dashboard-clusterinfo.png differ diff --git a/.gitbook/assets/2.12.2-nomad-dashboard-tiles.png b/.gitbook/assets/2.12.2-nomad-dashboard-tiles.png new file mode 100644 index 00000000..96646b11 Binary files /dev/null and b/.gitbook/assets/2.12.2-nomad-dashboard-tiles.png differ diff --git a/.gitbook/assets/2.12.2-nomad-jobs-detail.png b/.gitbook/assets/2.12.2-nomad-jobs-detail.png new file mode 100644 index 00000000..d3c39032 Binary files /dev/null and b/.gitbook/assets/2.12.2-nomad-jobs-detail.png differ diff --git a/.gitbook/assets/2.12.2-nomad-jobs-list.png b/.gitbook/assets/2.12.2-nomad-jobs-list.png new file mode 100644 index 00000000..9368598d Binary files /dev/null and b/.gitbook/assets/2.12.2-nomad-jobs-list.png differ diff --git a/.gitbook/assets/2.12.2-nomad-jobs.gif b/.gitbook/assets/2.12.2-nomad-jobs.gif new file mode 100644 index 00000000..5682333e Binary files /dev/null and b/.gitbook/assets/2.12.2-nomad-jobs.gif differ diff --git a/.gitbook/assets/2.12.2-stacks-add-webhook.png b/.gitbook/assets/2.12.2-stacks-add-webhook.png new file mode 100644 index 00000000..1e500e75 Binary files /dev/null and b/.gitbook/assets/2.12.2-stacks-add-webhook.png differ diff --git a/.gitbook/assets/2.12.2-stacks-edit-editor-webhook.png b/.gitbook/assets/2.12.2-stacks-edit-editor-webhook.png new file mode 100644 index 00000000..4921fd5c Binary files /dev/null and b/.gitbook/assets/2.12.2-stacks-edit-editor-webhook.png differ diff --git a/.gitbook/assets/2.12.2-stacks-webhook.gif b/.gitbook/assets/2.12.2-stacks-webhook.gif new file mode 100644 index 00000000..a148dfaf Binary files /dev/null and b/.gitbook/assets/2.12.2-stacks-webhook.gif differ diff --git a/.gitbook/assets/2.12.2-stacks-webhooks-url.png b/.gitbook/assets/2.12.2-stacks-webhooks-url.png new file mode 100644 index 00000000..0bc156c8 Binary files /dev/null and b/.gitbook/assets/2.12.2-stacks-webhooks-url.png differ diff --git a/.gitbook/assets/2.13-accountsettings-1.gif b/.gitbook/assets/2.13-accountsettings-1.gif new file mode 100644 index 00000000..e0ab694f Binary files /dev/null and b/.gitbook/assets/2.13-accountsettings-1.gif differ diff --git a/.gitbook/assets/2.13-blog-edge-waitingroom-device.png b/.gitbook/assets/2.13-blog-edge-waitingroom-device.png new file mode 100644 index 00000000..d9e90f63 Binary files /dev/null and b/.gitbook/assets/2.13-blog-edge-waitingroom-device.png differ diff --git a/.gitbook/assets/2.13-edge-devices-list.png b/.gitbook/assets/2.13-edge-devices-list.png new file mode 100644 index 00000000..c53cb997 Binary files /dev/null and b/.gitbook/assets/2.13-edge-devices-list.png differ diff --git a/.gitbook/assets/2.13-edge-devices-waitingroom-splash.png b/.gitbook/assets/2.13-edge-devices-waitingroom-splash.png new file mode 100644 index 00000000..25ae898a Binary files /dev/null and b/.gitbook/assets/2.13-edge-devices-waitingroom-splash.png differ diff --git a/.gitbook/assets/2.13-home-splash.png b/.gitbook/assets/2.13-home-splash.png new file mode 100644 index 00000000..f60ec9e0 Binary files /dev/null and b/.gitbook/assets/2.13-home-splash.png differ diff --git a/.gitbook/assets/2.13-kaas-1.gif b/.gitbook/assets/2.13-kaas-1.gif new file mode 100644 index 00000000..9085623a Binary files /dev/null and b/.gitbook/assets/2.13-kaas-1.gif differ diff --git a/.gitbook/assets/2.13-kaas-civo-options.png b/.gitbook/assets/2.13-kaas-civo-options.png new file mode 100644 index 00000000..71fa5a2f Binary files /dev/null and b/.gitbook/assets/2.13-kaas-civo-options.png differ diff --git a/.gitbook/assets/2.13-kaas-civo-progress.png b/.gitbook/assets/2.13-kaas-civo-progress.png new file mode 100644 index 00000000..eb5a7988 Binary files /dev/null and b/.gitbook/assets/2.13-kaas-civo-progress.png differ diff --git a/.gitbook/assets/2.13-kaas-do-options.png b/.gitbook/assets/2.13-kaas-do-options.png new file mode 100644 index 00000000..e99ca3cb Binary files /dev/null and b/.gitbook/assets/2.13-kaas-do-options.png differ diff --git a/.gitbook/assets/2.13-kaas-do-progress.png b/.gitbook/assets/2.13-kaas-do-progress.png new file mode 100644 index 00000000..d1110758 Binary files /dev/null and b/.gitbook/assets/2.13-kaas-do-progress.png differ diff --git a/.gitbook/assets/2.13-kaas-linode-options.png b/.gitbook/assets/2.13-kaas-linode-options.png new file mode 100644 index 00000000..f0519e5e Binary files /dev/null and b/.gitbook/assets/2.13-kaas-linode-options.png differ diff --git a/.gitbook/assets/2.13-kaas-linode-progress.png b/.gitbook/assets/2.13-kaas-linode-progress.png new file mode 100644 index 00000000..440f0212 Binary files /dev/null and b/.gitbook/assets/2.13-kaas-linode-progress.png differ diff --git a/.gitbook/assets/2.13-settings-cloud-splash.png b/.gitbook/assets/2.13-settings-cloud-splash.png new file mode 100644 index 00000000..39ca9368 Binary files /dev/null and b/.gitbook/assets/2.13-settings-cloud-splash.png differ diff --git a/.gitbook/assets/2.13-settings-edge-auto-configuration.png b/.gitbook/assets/2.13-settings-edge-auto-configuration.png new file mode 100644 index 00000000..91534091 Binary files /dev/null and b/.gitbook/assets/2.13-settings-edge-auto-configuration.png differ diff --git a/.gitbook/assets/2.13-settings-edge-auto-deploy.png b/.gitbook/assets/2.13-settings-edge-auto-deploy.png new file mode 100644 index 00000000..c72fbe95 Binary files /dev/null and b/.gitbook/assets/2.13-settings-edge-auto-deploy.png differ diff --git a/.gitbook/assets/2.13-settings-edge-compute.png b/.gitbook/assets/2.13-settings-edge-compute.png new file mode 100644 index 00000000..a7f68ab2 Binary files /dev/null and b/.gitbook/assets/2.13-settings-edge-compute.png differ diff --git a/.gitbook/assets/2.13-upgrade-nomad-edgeinfo.png b/.gitbook/assets/2.13-upgrade-nomad-edgeinfo.png new file mode 100644 index 00000000..189f520b Binary files /dev/null and b/.gitbook/assets/2.13-upgrade-nomad-edgeinfo.png differ diff --git a/.gitbook/assets/2.13-upgrade-nomad-script.png b/.gitbook/assets/2.13-upgrade-nomad-script.png new file mode 100644 index 00000000..5adb12fe Binary files /dev/null and b/.gitbook/assets/2.13-upgrade-nomad-script.png differ diff --git a/.gitbook/assets/2.13-whatsnew-home-page-filtering.png b/.gitbook/assets/2.13-whatsnew-home-page-filtering.png new file mode 100644 index 00000000..2ca88a5a Binary files /dev/null and b/.gitbook/assets/2.13-whatsnew-home-page-filtering.png differ diff --git a/.gitbook/assets/2.13-whatsnew-kaas.png b/.gitbook/assets/2.13-whatsnew-kaas.png new file mode 100644 index 00000000..81c82fa2 Binary files /dev/null and b/.gitbook/assets/2.13-whatsnew-kaas.png differ diff --git a/.gitbook/assets/2.13-whatsnew-passwords.png b/.gitbook/assets/2.13-whatsnew-passwords.png new file mode 100644 index 00000000..5e07dc97 Binary files /dev/null and b/.gitbook/assets/2.13-whatsnew-passwords.png differ diff --git a/.gitbook/assets/2.14-account-settings-changepassword.png b/.gitbook/assets/2.14-account-settings-changepassword.png new file mode 100644 index 00000000..677b5c46 Binary files /dev/null and b/.gitbook/assets/2.14-account-settings-changepassword.png differ diff --git a/.gitbook/assets/2.14-account-settings.gif b/.gitbook/assets/2.14-account-settings.gif new file mode 100644 index 00000000..54a09319 Binary files /dev/null and b/.gitbook/assets/2.14-account-settings.gif differ diff --git a/.gitbook/assets/2.14-containers-splash.png b/.gitbook/assets/2.14-containers-splash.png new file mode 100644 index 00000000..b227661c Binary files /dev/null and b/.gitbook/assets/2.14-containers-splash.png differ diff --git a/.gitbook/assets/2.14-environments-add-aci-details.png b/.gitbook/assets/2.14-environments-add-aci-details.png new file mode 100644 index 00000000..dda3344a Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-aci-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-docker-agent.png b/.gitbook/assets/2.14-environments-add-docker-agent.png new file mode 100644 index 00000000..b934a6fb Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-docker-agent.png differ diff --git a/.gitbook/assets/2.14-environments-add-docker-api-notls-1.png b/.gitbook/assets/2.14-environments-add-docker-api-notls-1.png new file mode 100644 index 00000000..76540e80 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-docker-api-notls-1.png differ diff --git a/.gitbook/assets/2.14-environments-add-docker-api.png b/.gitbook/assets/2.14-environments-add-docker-api.png new file mode 100644 index 00000000..ca48d98e Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-docker-api.png differ diff --git a/.gitbook/assets/2.14-environments-add-edge-details.png b/.gitbook/assets/2.14-environments-add-edge-details.png new file mode 100644 index 00000000..0114219c Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-edge-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-edge-docker.png b/.gitbook/assets/2.14-environments-add-edge-docker.png new file mode 100644 index 00000000..f56ef82d Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-edge-docker.png differ diff --git a/.gitbook/assets/2.14-environments-add-edge-metadata.png b/.gitbook/assets/2.14-environments-add-edge-metadata.png new file mode 100644 index 00000000..b92461c0 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-edge-metadata.png differ diff --git a/.gitbook/assets/2.14-environments-add-k8s-command.png b/.gitbook/assets/2.14-environments-add-k8s-command.png new file mode 100644 index 00000000..d1d680a5 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-k8s-command.png differ diff --git a/.gitbook/assets/2.14-environments-add-k8s-import-details.png b/.gitbook/assets/2.14-environments-add-k8s-import-details.png new file mode 100644 index 00000000..c883389b Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-k8s-import-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-aks-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-aks-credentials.png new file mode 100644 index 00000000..83da4b05 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-aks-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-aks-details.png b/.gitbook/assets/2.14-environments-add-kaas-aks-details.png new file mode 100644 index 00000000..67942239 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-aks-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-civo-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-civo-credentials.png new file mode 100644 index 00000000..d67d032a Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-civo-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-civo-details.png b/.gitbook/assets/2.14-environments-add-kaas-civo-details.png new file mode 100644 index 00000000..6b838ec2 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-civo-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-do-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-do-credentials.png new file mode 100644 index 00000000..7f686592 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-do-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-do-details.png b/.gitbook/assets/2.14-environments-add-kaas-do-details.png new file mode 100644 index 00000000..ad3461d7 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-do-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-eks-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-eks-credentials.png new file mode 100644 index 00000000..89a2e05b Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-eks-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-eks-details.png b/.gitbook/assets/2.14-environments-add-kaas-eks-details.png new file mode 100644 index 00000000..1d5106e3 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-eks-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-gke-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-gke-credentials.png new file mode 100644 index 00000000..3c6b8eee Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-gke-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-gke-details.png b/.gitbook/assets/2.14-environments-add-kaas-gke-details.png new file mode 100644 index 00000000..cdd34026 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-gke-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-linode-credentials.png b/.gitbook/assets/2.14-environments-add-kaas-linode-credentials.png new file mode 100644 index 00000000..8aa8041a Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-linode-credentials.png differ diff --git a/.gitbook/assets/2.14-environments-add-kaas-linode-details.png b/.gitbook/assets/2.14-environments-add-kaas-linode-details.png new file mode 100644 index 00000000..7e1be988 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-kaas-linode-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-metadata.png b/.gitbook/assets/2.14-environments-add-metadata.png new file mode 100644 index 00000000..a75d1173 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-metadata.png differ diff --git a/.gitbook/assets/2.14-environments-add-nomad-details-2.png b/.gitbook/assets/2.14-environments-add-nomad-details-2.png new file mode 100644 index 00000000..4b12acf5 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-nomad-details-2.png differ diff --git a/.gitbook/assets/2.14-environments-add-nomad-details.png b/.gitbook/assets/2.14-environments-add-nomad-details.png new file mode 100644 index 00000000..2d241dd0 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-nomad-details.png differ diff --git a/.gitbook/assets/2.14-environments-add-swarm-command-windows.png b/.gitbook/assets/2.14-environments-add-swarm-command-windows.png new file mode 100644 index 00000000..4b0efc5f Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-swarm-command-windows.png differ diff --git a/.gitbook/assets/2.14-environments-add-swarm-command.png b/.gitbook/assets/2.14-environments-add-swarm-command.png new file mode 100644 index 00000000..825b3d8c Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-swarm-command.png differ diff --git a/.gitbook/assets/2.14-environments-add-swarm-details.png b/.gitbook/assets/2.14-environments-add-swarm-details.png new file mode 100644 index 00000000..2d64620b Binary files /dev/null and b/.gitbook/assets/2.14-environments-add-swarm-details.png differ diff --git a/.gitbook/assets/2.14-environments-add.gif b/.gitbook/assets/2.14-environments-add.gif new file mode 100644 index 00000000..bcbec384 Binary files /dev/null and b/.gitbook/assets/2.14-environments-add.gif differ diff --git a/.gitbook/assets/2.14-services-splash.png b/.gitbook/assets/2.14-services-splash.png new file mode 100644 index 00000000..7e470c68 Binary files /dev/null and b/.gitbook/assets/2.14-services-splash.png differ diff --git a/.gitbook/assets/2.14-settings-authentication-splash.png b/.gitbook/assets/2.14-settings-authentication-splash.png new file mode 100644 index 00000000..aa0895d9 Binary files /dev/null and b/.gitbook/assets/2.14-settings-authentication-splash.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-aks.png b/.gitbook/assets/2.14-settings-cloud-add-aks.png new file mode 100644 index 00000000..764f7d1b Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-aks.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-civo.png b/.gitbook/assets/2.14-settings-cloud-add-civo.png new file mode 100644 index 00000000..9d473ee9 Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-civo.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-do.png b/.gitbook/assets/2.14-settings-cloud-add-do.png new file mode 100644 index 00000000..00f23455 Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-do.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-eks.png b/.gitbook/assets/2.14-settings-cloud-add-eks.png new file mode 100644 index 00000000..c7511dff Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-eks.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-gke.png b/.gitbook/assets/2.14-settings-cloud-add-gke.png new file mode 100644 index 00000000..bdffe603 Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-gke.png differ diff --git a/.gitbook/assets/2.14-settings-cloud-add-linode.png b/.gitbook/assets/2.14-settings-cloud-add-linode.png new file mode 100644 index 00000000..9346b7b6 Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud-add-linode.png differ diff --git a/.gitbook/assets/2.14-settings-cloud.png b/.gitbook/assets/2.14-settings-cloud.png new file mode 100644 index 00000000..fcc81e83 Binary files /dev/null and b/.gitbook/assets/2.14-settings-cloud.png differ diff --git a/.gitbook/assets/2.14-settings-edge-deploymentscript.png b/.gitbook/assets/2.14-settings-edge-deploymentscript.png new file mode 100644 index 00000000..8d046754 Binary files /dev/null and b/.gitbook/assets/2.14-settings-edge-deploymentscript.png differ diff --git a/.gitbook/assets/2.14-settings-edge-deploymentsync.png b/.gitbook/assets/2.14-settings-edge-deploymentsync.png new file mode 100644 index 00000000..80efb911 Binary files /dev/null and b/.gitbook/assets/2.14-settings-edge-deploymentsync.png differ diff --git a/.gitbook/assets/2.14-stacks-splash.png b/.gitbook/assets/2.14-stacks-splash.png new file mode 100644 index 00000000..7f7e6ab0 Binary files /dev/null and b/.gitbook/assets/2.14-stacks-splash.png differ diff --git a/.gitbook/assets/2.14-templates-custom-variables-compose.png b/.gitbook/assets/2.14-templates-custom-variables-compose.png new file mode 100644 index 00000000..0dc18b11 Binary files /dev/null and b/.gitbook/assets/2.14-templates-custom-variables-compose.png differ diff --git a/.gitbook/assets/2.14-templates-custom-variables-deploy.png b/.gitbook/assets/2.14-templates-custom-variables-deploy.png new file mode 100644 index 00000000..9e3fbe55 Binary files /dev/null and b/.gitbook/assets/2.14-templates-custom-variables-deploy.png differ diff --git a/.gitbook/assets/2.14-templates-custom-variables-k8s-deploy.png b/.gitbook/assets/2.14-templates-custom-variables-k8s-deploy.png new file mode 100644 index 00000000..2f5df3c5 Binary files /dev/null and b/.gitbook/assets/2.14-templates-custom-variables-k8s-deploy.png differ diff --git a/.gitbook/assets/2.14-templates-custom-variables-k8s.png b/.gitbook/assets/2.14-templates-custom-variables-k8s.png new file mode 100644 index 00000000..8ab78ccb Binary files /dev/null and b/.gitbook/assets/2.14-templates-custom-variables-k8s.png differ diff --git a/.gitbook/assets/2.14-whats-new-environment-wizard.png b/.gitbook/assets/2.14-whats-new-environment-wizard.png new file mode 100644 index 00000000..12cb98fc Binary files /dev/null and b/.gitbook/assets/2.14-whats-new-environment-wizard.png differ diff --git a/.gitbook/assets/2.14-whats-new-image-indicators.png b/.gitbook/assets/2.14-whats-new-image-indicators.png new file mode 100644 index 00000000..f7b6a2fc Binary files /dev/null and b/.gitbook/assets/2.14-whats-new-image-indicators.png differ diff --git a/.gitbook/assets/2.14-whats-new-kaas-providers.png b/.gitbook/assets/2.14-whats-new-kaas-providers.png new file mode 100644 index 00000000..ed106d89 Binary files /dev/null and b/.gitbook/assets/2.14-whats-new-kaas-providers.png differ diff --git a/.gitbook/assets/2.14-whats-new-kubeconfig.png b/.gitbook/assets/2.14-whats-new-kubeconfig.png new file mode 100644 index 00000000..9b10b581 Binary files /dev/null and b/.gitbook/assets/2.14-whats-new-kubeconfig.png differ diff --git a/.gitbook/assets/2.14-whats-new-password-length.png b/.gitbook/assets/2.14-whats-new-password-length.png new file mode 100644 index 00000000..a5877f20 Binary files /dev/null and b/.gitbook/assets/2.14-whats-new-password-length.png differ diff --git a/.gitbook/assets/2.15-accountsettings-apitokens.png b/.gitbook/assets/2.15-accountsettings-apitokens.png new file mode 100644 index 00000000..4db6a8fb Binary files /dev/null and b/.gitbook/assets/2.15-accountsettings-apitokens.png differ diff --git a/.gitbook/assets/2.15-accountsettings-changepw.png b/.gitbook/assets/2.15-accountsettings-changepw.png new file mode 100644 index 00000000..05efd6fb Binary files /dev/null and b/.gitbook/assets/2.15-accountsettings-changepw.png differ diff --git a/.gitbook/assets/2.15-accountsettings-theme.png b/.gitbook/assets/2.15-accountsettings-theme.png new file mode 100644 index 00000000..75a879c4 Binary files /dev/null and b/.gitbook/assets/2.15-accountsettings-theme.png differ diff --git a/.gitbook/assets/2.15-accountsettings.gif b/.gitbook/assets/2.15-accountsettings.gif new file mode 100644 index 00000000..64cc868b Binary files /dev/null and b/.gitbook/assets/2.15-accountsettings.gif differ diff --git a/.gitbook/assets/2.15-aci-add-settings.png b/.gitbook/assets/2.15-aci-add-settings.png new file mode 100644 index 00000000..9a3b2ca3 Binary files /dev/null and b/.gitbook/assets/2.15-aci-add-settings.png differ diff --git a/.gitbook/assets/2.15-aci-add.gif b/.gitbook/assets/2.15-aci-add.gif new file mode 100644 index 00000000..9aa400f3 Binary files /dev/null and b/.gitbook/assets/2.15-aci-add.gif differ diff --git a/.gitbook/assets/2.15-aci-dashboard.png b/.gitbook/assets/2.15-aci-dashboard.png new file mode 100644 index 00000000..b608b987 Binary files /dev/null and b/.gitbook/assets/2.15-aci-dashboard.png differ diff --git a/.gitbook/assets/2.15-aci-remove-confirm.png b/.gitbook/assets/2.15-aci-remove-confirm.png new file mode 100644 index 00000000..6e9e592c Binary files /dev/null and b/.gitbook/assets/2.15-aci-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-aci-remove.gif b/.gitbook/assets/2.15-aci-remove.gif new file mode 100644 index 00000000..3f6b076c Binary files /dev/null and b/.gitbook/assets/2.15-aci-remove.gif differ diff --git a/.gitbook/assets/2.15-aci_env.png b/.gitbook/assets/2.15-aci_env.png new file mode 100644 index 00000000..8309b3c2 Binary files /dev/null and b/.gitbook/assets/2.15-aci_env.png differ diff --git a/.gitbook/assets/2.15-aci_more-settings.png b/.gitbook/assets/2.15-aci_more-settings.png new file mode 100644 index 00000000..178f8120 Binary files /dev/null and b/.gitbook/assets/2.15-aci_more-settings.png differ diff --git a/.gitbook/assets/2.15-add_env.gif b/.gitbook/assets/2.15-add_env.gif new file mode 100644 index 00000000..09a5422e Binary files /dev/null and b/.gitbook/assets/2.15-add_env.gif differ diff --git a/.gitbook/assets/2.15-admin-registries-dockerhub-hide.png b/.gitbook/assets/2.15-admin-registries-dockerhub-hide.png new file mode 100644 index 00000000..83b19ae3 Binary files /dev/null and b/.gitbook/assets/2.15-admin-registries-dockerhub-hide.png differ diff --git a/.gitbook/assets/2.15-admin-registries.png b/.gitbook/assets/2.15-admin-registries.png new file mode 100644 index 00000000..ddd134c5 Binary files /dev/null and b/.gitbook/assets/2.15-admin-registries.png differ diff --git a/.gitbook/assets/2.15-advanced-accesscontrol-admin.png b/.gitbook/assets/2.15-advanced-accesscontrol-admin.png new file mode 100644 index 00000000..d1cd6366 Binary files /dev/null and b/.gitbook/assets/2.15-advanced-accesscontrol-admin.png differ diff --git a/.gitbook/assets/2.15-advanced-accesscontrol-public.png b/.gitbook/assets/2.15-advanced-accesscontrol-public.png new file mode 100644 index 00000000..6c7fdc3b Binary files /dev/null and b/.gitbook/assets/2.15-advanced-accesscontrol-public.png differ diff --git a/.gitbook/assets/2.15-advanced-accesscontrol-restricted.png b/.gitbook/assets/2.15-advanced-accesscontrol-restricted.png new file mode 100644 index 00000000..a49d5f2a Binary files /dev/null and b/.gitbook/assets/2.15-advanced-accesscontrol-restricted.png differ diff --git a/.gitbook/assets/2.15-advanced-edgeagent-command.png b/.gitbook/assets/2.15-advanced-edgeagent-command.png new file mode 100644 index 00000000..2c21d7f6 Binary files /dev/null and b/.gitbook/assets/2.15-advanced-edgeagent-command.png differ diff --git a/.gitbook/assets/2.15-advanced-edgeagent-pollfreq.png b/.gitbook/assets/2.15-advanced-edgeagent-pollfreq.png new file mode 100644 index 00000000..ba8789f0 Binary files /dev/null and b/.gitbook/assets/2.15-advanced-edgeagent-pollfreq.png differ diff --git a/.gitbook/assets/2.15-api-access-create.png b/.gitbook/assets/2.15-api-access-create.png new file mode 100644 index 00000000..5aa709c6 Binary files /dev/null and b/.gitbook/assets/2.15-api-access-create.png differ diff --git a/.gitbook/assets/2.15-api-access-created.png b/.gitbook/assets/2.15-api-access-created.png new file mode 100644 index 00000000..f05b27a6 Binary files /dev/null and b/.gitbook/assets/2.15-api-access-created.png differ diff --git a/.gitbook/assets/2.15-app_templates.png b/.gitbook/assets/2.15-app_templates.png new file mode 100644 index 00000000..383f21a5 Binary files /dev/null and b/.gitbook/assets/2.15-app_templates.png differ diff --git a/.gitbook/assets/2.15-backup-restore-file.png b/.gitbook/assets/2.15-backup-restore-file.png new file mode 100644 index 00000000..0b1897b4 Binary files /dev/null and b/.gitbook/assets/2.15-backup-restore-file.png differ diff --git a/.gitbook/assets/2.15-backup-restore-s3.png b/.gitbook/assets/2.15-backup-restore-s3.png new file mode 100644 index 00000000..44f365e1 Binary files /dev/null and b/.gitbook/assets/2.15-backup-restore-s3.png differ diff --git a/.gitbook/assets/2.15-connect_docker_agent.png b/.gitbook/assets/2.15-connect_docker_agent.png new file mode 100644 index 00000000..d5e591fd Binary files /dev/null and b/.gitbook/assets/2.15-connect_docker_agent.png differ diff --git a/.gitbook/assets/2.15-connect_docker_api.png b/.gitbook/assets/2.15-connect_docker_api.png new file mode 100644 index 00000000..436c1eb5 Binary files /dev/null and b/.gitbook/assets/2.15-connect_docker_api.png differ diff --git a/.gitbook/assets/2.15-container-edit-confirm.png b/.gitbook/assets/2.15-container-edit-confirm.png new file mode 100644 index 00000000..559a897e Binary files /dev/null and b/.gitbook/assets/2.15-container-edit-confirm.png differ diff --git a/.gitbook/assets/2.15-container-ownership-confirm.png b/.gitbook/assets/2.15-container-ownership-confirm.png new file mode 100644 index 00000000..33a46a2e Binary files /dev/null and b/.gitbook/assets/2.15-container-ownership-confirm.png differ diff --git a/.gitbook/assets/2.15-container-remove-confirm.png b/.gitbook/assets/2.15-container-remove-confirm.png new file mode 100644 index 00000000..b8611161 Binary files /dev/null and b/.gitbook/assets/2.15-container-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-capabilities.png b/.gitbook/assets/2.15-containers-advanced-capabilities.png new file mode 100644 index 00000000..b07e2ee3 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-capabilities.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-command.png b/.gitbook/assets/2.15-containers-advanced-command.png new file mode 100644 index 00000000..d4584633 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-command.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-env.png b/.gitbook/assets/2.15-containers-advanced-env.png new file mode 100644 index 00000000..6666b9f8 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-env.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-gpu.png b/.gitbook/assets/2.15-containers-advanced-gpu.png new file mode 100644 index 00000000..46171ecd Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-gpu.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-labels.png b/.gitbook/assets/2.15-containers-advanced-labels.png new file mode 100644 index 00000000..5d16d36b Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-labels.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-network.png b/.gitbook/assets/2.15-containers-advanced-network.png new file mode 100644 index 00000000..c4dd260b Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-network.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-resources.png b/.gitbook/assets/2.15-containers-advanced-resources.png new file mode 100644 index 00000000..c908b73d Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-resources.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-restart.png b/.gitbook/assets/2.15-containers-advanced-restart.png new file mode 100644 index 00000000..719438eb Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-restart.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-runtime.png b/.gitbook/assets/2.15-containers-advanced-runtime.png new file mode 100644 index 00000000..037803d2 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-runtime.png differ diff --git a/.gitbook/assets/2.15-containers-advanced-volumes.png b/.gitbook/assets/2.15-containers-advanced-volumes.png new file mode 100644 index 00000000..3490b7b2 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced-volumes.png differ diff --git a/.gitbook/assets/2.15-containers-advanced.png b/.gitbook/assets/2.15-containers-advanced.png new file mode 100644 index 00000000..29df91a7 Binary files /dev/null and b/.gitbook/assets/2.15-containers-advanced.png differ diff --git a/.gitbook/assets/2.15-create_custom_template.png b/.gitbook/assets/2.15-create_custom_template.png new file mode 100644 index 00000000..1ea818ad Binary files /dev/null and b/.gitbook/assets/2.15-create_custom_template.png differ diff --git a/.gitbook/assets/2.15-create_first_user (1).png b/.gitbook/assets/2.15-create_first_user (1).png new file mode 100644 index 00000000..35b1dd7b Binary files /dev/null and b/.gitbook/assets/2.15-create_first_user (1).png differ diff --git a/.gitbook/assets/2.15-create_first_user (2).png b/.gitbook/assets/2.15-create_first_user (2).png new file mode 100644 index 00000000..35b1dd7b Binary files /dev/null and b/.gitbook/assets/2.15-create_first_user (2).png differ diff --git a/.gitbook/assets/2.15-create_first_user.png b/.gitbook/assets/2.15-create_first_user.png new file mode 100644 index 00000000..35b1dd7b Binary files /dev/null and b/.gitbook/assets/2.15-create_first_user.png differ diff --git a/.gitbook/assets/2.15-custom-templates (1).gif b/.gitbook/assets/2.15-custom-templates (1).gif new file mode 100644 index 00000000..b8475eed Binary files /dev/null and b/.gitbook/assets/2.15-custom-templates (1).gif differ diff --git a/.gitbook/assets/2.15-custom-templates (2).gif b/.gitbook/assets/2.15-custom-templates (2).gif new file mode 100644 index 00000000..b8475eed Binary files /dev/null and b/.gitbook/assets/2.15-custom-templates (2).gif differ diff --git a/.gitbook/assets/2.15-custom-templates.gif b/.gitbook/assets/2.15-custom-templates.gif new file mode 100644 index 00000000..b8475eed Binary files /dev/null and b/.gitbook/assets/2.15-custom-templates.gif differ diff --git a/.gitbook/assets/2.15-custom_temp_build_method.png b/.gitbook/assets/2.15-custom_temp_build_method.png new file mode 100644 index 00000000..3b2c7632 Binary files /dev/null and b/.gitbook/assets/2.15-custom_temp_build_method.png differ diff --git a/.gitbook/assets/2.15-docker-apptemplates-list.png b/.gitbook/assets/2.15-docker-apptemplates-list.png new file mode 100644 index 00000000..3cca2015 Binary files /dev/null and b/.gitbook/assets/2.15-docker-apptemplates-list.png differ diff --git a/.gitbook/assets/2.15-docker-dashboard-swarm.png b/.gitbook/assets/2.15-docker-dashboard-swarm.png new file mode 100644 index 00000000..25a4853b Binary files /dev/null and b/.gitbook/assets/2.15-docker-dashboard-swarm.png differ diff --git a/.gitbook/assets/2.15-docker-dashboard-tiles.png b/.gitbook/assets/2.15-docker-dashboard-tiles.png new file mode 100644 index 00000000..5f11b75c Binary files /dev/null and b/.gitbook/assets/2.15-docker-dashboard-tiles.png differ diff --git a/.gitbook/assets/2.15-docker-deploy-stack-wordpress.png b/.gitbook/assets/2.15-docker-deploy-stack-wordpress.png new file mode 100644 index 00000000..2be6d383 Binary files /dev/null and b/.gitbook/assets/2.15-docker-deploy-stack-wordpress.png differ diff --git a/.gitbook/assets/2.15-docker-host-details.png b/.gitbook/assets/2.15-docker-host-details.png new file mode 100644 index 00000000..63fdb27f Binary files /dev/null and b/.gitbook/assets/2.15-docker-host-details.png differ diff --git a/.gitbook/assets/2.15-docker-host-engine.png b/.gitbook/assets/2.15-docker-host-engine.png new file mode 100644 index 00000000..1e978165 Binary files /dev/null and b/.gitbook/assets/2.15-docker-host-engine.png differ diff --git a/.gitbook/assets/2.15-docker-host-pci.png b/.gitbook/assets/2.15-docker-host-pci.png new file mode 100644 index 00000000..b7fb1421 Binary files /dev/null and b/.gitbook/assets/2.15-docker-host-pci.png differ diff --git a/.gitbook/assets/2.15-docker-stacks-list.png b/.gitbook/assets/2.15-docker-stacks-list.png new file mode 100644 index 00000000..44db233c Binary files /dev/null and b/.gitbook/assets/2.15-docker-stacks-list.png differ diff --git a/.gitbook/assets/2.15-docker-standalone-dashboard.png b/.gitbook/assets/2.15-docker-standalone-dashboard.png new file mode 100644 index 00000000..3ab38b90 Binary files /dev/null and b/.gitbook/assets/2.15-docker-standalone-dashboard.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-1.png b/.gitbook/assets/2.15-docker-templates-custom-1.png new file mode 100644 index 00000000..b442eb81 Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-1.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-repo.png b/.gitbook/assets/2.15-docker-templates-custom-repo.png new file mode 100644 index 00000000..a0091839 Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-repo.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-upload.png b/.gitbook/assets/2.15-docker-templates-custom-upload.png new file mode 100644 index 00000000..4caa7e79 Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-upload.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-variables-create.png b/.gitbook/assets/2.15-docker-templates-custom-variables-create.png new file mode 100644 index 00000000..c82e0350 Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-variables-create.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-variables-set.png b/.gitbook/assets/2.15-docker-templates-custom-variables-set.png new file mode 100644 index 00000000..62decf91 Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-variables-set.png differ diff --git a/.gitbook/assets/2.15-docker-templates-custom-webeditor.png b/.gitbook/assets/2.15-docker-templates-custom-webeditor.png new file mode 100644 index 00000000..92c8552f Binary files /dev/null and b/.gitbook/assets/2.15-docker-templates-custom-webeditor.png differ diff --git a/.gitbook/assets/2.15-docker-wordpress-stack-deployed.png b/.gitbook/assets/2.15-docker-wordpress-stack-deployed.png new file mode 100644 index 00000000..c056879e Binary files /dev/null and b/.gitbook/assets/2.15-docker-wordpress-stack-deployed.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_git.gif b/.gitbook/assets/2.15-docker_add_stack_git.gif new file mode 100644 index 00000000..deb95e1a Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_git.gif differ diff --git a/.gitbook/assets/2.15-docker_add_stack_git_auth.png b/.gitbook/assets/2.15-docker_add_stack_git_auth.png new file mode 100644 index 00000000..ad4a15af Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_git_auth.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_git_auto_update_polling.png b/.gitbook/assets/2.15-docker_add_stack_git_auto_update_polling.png new file mode 100644 index 00000000..a15b20b4 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_git_auto_update_polling.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_git_auto_update_webhook.png b/.gitbook/assets/2.15-docker_add_stack_git_auto_update_webhook.png new file mode 100644 index 00000000..1ecd7456 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_git_auto_update_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_git_pull_latest_image.png b/.gitbook/assets/2.15-docker_add_stack_git_pull_latest_image.png new file mode 100644 index 00000000..a086ac8a Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_git_pull_latest_image.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_upload.gif b/.gitbook/assets/2.15-docker_add_stack_upload.gif new file mode 100644 index 00000000..e23af2a7 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_upload.gif differ diff --git a/.gitbook/assets/2.15-docker_add_stack_upload_env_var (1).png b/.gitbook/assets/2.15-docker_add_stack_upload_env_var (1).png new file mode 100644 index 00000000..126fb929 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_upload_env_var (1).png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_upload_env_var.png b/.gitbook/assets/2.15-docker_add_stack_upload_env_var.png new file mode 100644 index 00000000..126fb929 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_upload_env_var.png differ diff --git a/.gitbook/assets/2.15-docker_add_stack_web_editor.gif b/.gitbook/assets/2.15-docker_add_stack_web_editor.gif new file mode 100644 index 00000000..02c10330 Binary files /dev/null and b/.gitbook/assets/2.15-docker_add_stack_web_editor.gif differ diff --git a/.gitbook/assets/2.15-docker_api_more_settings (1).png b/.gitbook/assets/2.15-docker_api_more_settings (1).png new file mode 100644 index 00000000..08472f72 Binary files /dev/null and b/.gitbook/assets/2.15-docker_api_more_settings (1).png differ diff --git a/.gitbook/assets/2.15-docker_api_more_settings (2).png b/.gitbook/assets/2.15-docker_api_more_settings (2).png new file mode 100644 index 00000000..08472f72 Binary files /dev/null and b/.gitbook/assets/2.15-docker_api_more_settings (2).png differ diff --git a/.gitbook/assets/2.15-docker_api_more_settings.png b/.gitbook/assets/2.15-docker_api_more_settings.png new file mode 100644 index 00000000..08472f72 Binary files /dev/null and b/.gitbook/assets/2.15-docker_api_more_settings.png differ diff --git a/.gitbook/assets/2.15-docker_configs_config_list.png b/.gitbook/assets/2.15-docker_configs_config_list.png new file mode 100644 index 00000000..f04a86b1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_configs_config_list.png differ diff --git a/.gitbook/assets/2.15-docker_configs_configs_add.gif b/.gitbook/assets/2.15-docker_configs_configs_add.gif new file mode 100644 index 00000000..72bf86a3 Binary files /dev/null and b/.gitbook/assets/2.15-docker_configs_configs_add.gif differ diff --git a/.gitbook/assets/2.15-docker_configs_configs_remove.gif b/.gitbook/assets/2.15-docker_configs_configs_remove.gif new file mode 100644 index 00000000..5bc22a7f Binary files /dev/null and b/.gitbook/assets/2.15-docker_configs_configs_remove.gif differ diff --git a/.gitbook/assets/2.15-docker_configs_myconfig.png b/.gitbook/assets/2.15-docker_configs_myconfig.png new file mode 100644 index 00000000..36f5a1f5 Binary files /dev/null and b/.gitbook/assets/2.15-docker_configs_myconfig.png differ diff --git a/.gitbook/assets/2.15-docker_container_actions.png b/.gitbook/assets/2.15-docker_container_actions.png new file mode 100644 index 00000000..6d579457 Binary files /dev/null and b/.gitbook/assets/2.15-docker_container_actions.png differ diff --git a/.gitbook/assets/2.15-docker_container_adv_container_settings.png b/.gitbook/assets/2.15-docker_container_adv_container_settings.png new file mode 100644 index 00000000..91f4d378 Binary files /dev/null and b/.gitbook/assets/2.15-docker_container_adv_container_settings.png differ diff --git a/.gitbook/assets/2.15-docker_container_network_port_config.png b/.gitbook/assets/2.15-docker_container_network_port_config.png new file mode 100644 index 00000000..b44e7728 Binary files /dev/null and b/.gitbook/assets/2.15-docker_container_network_port_config.png differ diff --git a/.gitbook/assets/2.15-docker_container_webhook.png b/.gitbook/assets/2.15-docker_container_webhook.png new file mode 100644 index 00000000..43460f3d Binary files /dev/null and b/.gitbook/assets/2.15-docker_container_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_containers_add_container.gif b/.gitbook/assets/2.15-docker_containers_add_container.gif new file mode 100644 index 00000000..92ed5c5f Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_add_container.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container-stats-proc.png b/.gitbook/assets/2.15-docker_containers_container-stats-proc.png new file mode 100644 index 00000000..3bd74868 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container-stats-proc.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_access_control.png b/.gitbook/assets/2.15-docker_containers_container_access_control.png new file mode 100644 index 00000000..a0fae5d4 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_access_control.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_add_volumes.png b/.gitbook/assets/2.15-docker_containers_container_add_volumes.png new file mode 100644 index 00000000..a0ed7bf8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_add_volumes.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_adv_volume_mapping.png b/.gitbook/assets/2.15-docker_containers_container_adv_volume_mapping.png new file mode 100644 index 00000000..2936b735 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_adv_volume_mapping.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_console.gif b/.gitbook/assets/2.15-docker_containers_container_console.gif new file mode 100644 index 00000000..9ae05ed1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_console.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_console_connect.png b/.gitbook/assets/2.15-docker_containers_container_console_connect.png new file mode 100644 index 00000000..156933d6 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_console_connect.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_console_execute.png b/.gitbook/assets/2.15-docker_containers_container_console_execute.png new file mode 100644 index 00000000..ed804628 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_console_execute.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_create_image.png b/.gitbook/assets/2.15-docker_containers_container_create_image.png new file mode 100644 index 00000000..adf5d850 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_create_image.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_details.gif b/.gitbook/assets/2.15-docker_containers_container_details.gif new file mode 100644 index 00000000..9b0d1732 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_details.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_edit.gif b/.gitbook/assets/2.15-docker_containers_container_edit.gif new file mode 100644 index 00000000..bb2aa1d8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_edit.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_inspect.gif b/.gitbook/assets/2.15-docker_containers_container_inspect.gif new file mode 100644 index 00000000..dc7b2648 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_inspect.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_inspect.png b/.gitbook/assets/2.15-docker_containers_container_inspect.png new file mode 100644 index 00000000..aa928e5e Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_inspect.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_inspect_text.png b/.gitbook/assets/2.15-docker_containers_container_inspect_text.png new file mode 100644 index 00000000..d047bd9b Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_inspect_text.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_log_viewer_settings.png b/.gitbook/assets/2.15-docker_containers_container_log_viewer_settings.png new file mode 100644 index 00000000..fba3f1b2 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_log_viewer_settings.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_logs.gif b/.gitbook/assets/2.15-docker_containers_container_logs.gif new file mode 100644 index 00000000..315ff0e8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_logs.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_remove.gif b/.gitbook/assets/2.15-docker_containers_container_remove.gif new file mode 100644 index 00000000..b0d3e4cc Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_remove.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_stats.gif b/.gitbook/assets/2.15-docker_containers_container_stats.gif new file mode 100644 index 00000000..a3512470 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_stats.gif differ diff --git a/.gitbook/assets/2.15-docker_containers_container_stats_usage.png b/.gitbook/assets/2.15-docker_containers_container_stats_usage.png new file mode 100644 index 00000000..a0cc2cde Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_stats_usage.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_status.png b/.gitbook/assets/2.15-docker_containers_container_status.png new file mode 100644 index 00000000..98d11a3d Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_status.png differ diff --git a/.gitbook/assets/2.15-docker_containers_container_webhook.png b/.gitbook/assets/2.15-docker_containers_container_webhook.png new file mode 100644 index 00000000..398cca1c Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_container_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_containers_containers.png b/.gitbook/assets/2.15-docker_containers_containers.png new file mode 100644 index 00000000..ff362e29 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_containers.png differ diff --git a/.gitbook/assets/2.15-docker_containers_details_actions.png b/.gitbook/assets/2.15-docker_containers_details_actions.png new file mode 100644 index 00000000..1c048631 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_details_actions.png differ diff --git a/.gitbook/assets/2.15-docker_containers_image_config.png b/.gitbook/assets/2.15-docker_containers_image_config.png new file mode 100644 index 00000000..e2b03c94 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_image_config.png differ diff --git a/.gitbook/assets/2.15-docker_containers_image_config_simple.png b/.gitbook/assets/2.15-docker_containers_image_config_simple.png new file mode 100644 index 00000000..5b695443 Binary files /dev/null and b/.gitbook/assets/2.15-docker_containers_image_config_simple.png differ diff --git a/.gitbook/assets/2.15-docker_create_stack_template.gif b/.gitbook/assets/2.15-docker_create_stack_template.gif new file mode 100644 index 00000000..3210fae3 Binary files /dev/null and b/.gitbook/assets/2.15-docker_create_stack_template.gif differ diff --git a/.gitbook/assets/2.15-docker_deploy_container_nginx.png b/.gitbook/assets/2.15-docker_deploy_container_nginx.png new file mode 100644 index 00000000..f30aa8f5 Binary files /dev/null and b/.gitbook/assets/2.15-docker_deploy_container_nginx.png differ diff --git a/.gitbook/assets/2.15-docker_deploy_container_nginx_adv_opts.png b/.gitbook/assets/2.15-docker_deploy_container_nginx_adv_opts.png new file mode 100644 index 00000000..332adadb Binary files /dev/null and b/.gitbook/assets/2.15-docker_deploy_container_nginx_adv_opts.png differ diff --git a/.gitbook/assets/2.15-docker_deploy_container_template.gif b/.gitbook/assets/2.15-docker_deploy_container_template.gif new file mode 100644 index 00000000..17043a31 Binary files /dev/null and b/.gitbook/assets/2.15-docker_deploy_container_template.gif differ diff --git a/.gitbook/assets/2.15-docker_editing_stack_editor.png b/.gitbook/assets/2.15-docker_editing_stack_editor.png new file mode 100644 index 00000000..da4416a6 Binary files /dev/null and b/.gitbook/assets/2.15-docker_editing_stack_editor.png differ diff --git a/.gitbook/assets/2.15-docker_events_events_list.png b/.gitbook/assets/2.15-docker_events_events_list.png new file mode 100644 index 00000000..76ca79d5 Binary files /dev/null and b/.gitbook/assets/2.15-docker_events_events_list.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_change_windows_settings (1).png b/.gitbook/assets/2.15-docker_hosts_change_windows_settings (1).png new file mode 100644 index 00000000..2d025263 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_change_windows_settings (1).png differ diff --git a/.gitbook/assets/2.15-docker_hosts_change_windows_settings.png b/.gitbook/assets/2.15-docker_hosts_change_windows_settings.png new file mode 100644 index 00000000..2d025263 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_change_windows_settings.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_engine_details.png b/.gitbook/assets/2.15-docker_hosts_engine_details.png new file mode 100644 index 00000000..5a234b43 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_engine_details.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_features_config.png b/.gitbook/assets/2.15-docker_hosts_features_config.png new file mode 100644 index 00000000..91bf6ae9 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_features_config.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_host_details.png b/.gitbook/assets/2.15-docker_hosts_host_details.png new file mode 100644 index 00000000..8c9e2dee Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_host_details.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_registries.gif b/.gitbook/assets/2.15-docker_hosts_registries.gif new file mode 100644 index 00000000..0457419c Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_registries.gif differ diff --git a/.gitbook/assets/2.15-docker_hosts_registries_access.png b/.gitbook/assets/2.15-docker_hosts_registries_access.png new file mode 100644 index 00000000..2998f139 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_registries_access.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_registries_manage_access.png b/.gitbook/assets/2.15-docker_hosts_registries_manage_access.png new file mode 100644 index 00000000..d6decd27 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_registries_manage_access.png differ diff --git a/.gitbook/assets/2.15-docker_hosts_security_settings.png b/.gitbook/assets/2.15-docker_hosts_security_settings.png new file mode 100644 index 00000000..b24f8417 Binary files /dev/null and b/.gitbook/assets/2.15-docker_hosts_security_settings.png differ diff --git a/.gitbook/assets/2.15-docker_images_build_URL.png b/.gitbook/assets/2.15-docker_images_build_URL.png new file mode 100644 index 00000000..69445d73 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_URL.png differ diff --git a/.gitbook/assets/2.15-docker_images_build_deployment.png b/.gitbook/assets/2.15-docker_images_build_deployment.png new file mode 100644 index 00000000..9c88c31f Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_deployment.png differ diff --git a/.gitbook/assets/2.15-docker_images_build_image.gif b/.gitbook/assets/2.15-docker_images_build_image.gif new file mode 100644 index 00000000..d003f1c1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_image.gif differ diff --git a/.gitbook/assets/2.15-docker_images_build_image_URL.gif b/.gitbook/assets/2.15-docker_images_build_image_URL.gif new file mode 100644 index 00000000..2b1c1309 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_image_URL.gif differ diff --git a/.gitbook/assets/2.15-docker_images_build_image_export.gif b/.gitbook/assets/2.15-docker_images_build_image_export.gif new file mode 100644 index 00000000..fb55820a Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_image_export.gif differ diff --git a/.gitbook/assets/2.15-docker_images_build_image_import.gif b/.gitbook/assets/2.15-docker_images_build_image_import.gif new file mode 100644 index 00000000..1d2f74ce Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_image_import.gif differ diff --git a/.gitbook/assets/2.15-docker_images_build_image_upload.gif b/.gitbook/assets/2.15-docker_images_build_image_upload.gif new file mode 100644 index 00000000..1839d0cb Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_image_upload.gif differ diff --git a/.gitbook/assets/2.15-docker_images_build_upload.png b/.gitbook/assets/2.15-docker_images_build_upload.png new file mode 100644 index 00000000..33b81b21 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_upload.png differ diff --git a/.gitbook/assets/2.15-docker_images_build_web_editor.png b/.gitbook/assets/2.15-docker_images_build_web_editor.png new file mode 100644 index 00000000..68d82640 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_build_web_editor.png differ diff --git a/.gitbook/assets/2.15-docker_images_import_simple.png b/.gitbook/assets/2.15-docker_images_import_simple.png new file mode 100644 index 00000000..cdccd019 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_import_simple.png differ diff --git a/.gitbook/assets/2.15-docker_images_pull_image_simple.png b/.gitbook/assets/2.15-docker_images_pull_image_simple.png new file mode 100644 index 00000000..8666e1da Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_pull_image_simple.png differ diff --git a/.gitbook/assets/2.15-docker_images_pull_images (1).png b/.gitbook/assets/2.15-docker_images_pull_images (1).png new file mode 100644 index 00000000..9979cbb6 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_pull_images (1).png differ diff --git a/.gitbook/assets/2.15-docker_images_pull_images.png b/.gitbook/assets/2.15-docker_images_pull_images.png new file mode 100644 index 00000000..9979cbb6 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_pull_images.png differ diff --git a/.gitbook/assets/2.15-docker_images_upload_file.png b/.gitbook/assets/2.15-docker_images_upload_file.png new file mode 100644 index 00000000..a1249930 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_upload_file.png differ diff --git a/.gitbook/assets/2.15-docker_images_upload_file_tag_image.png b/.gitbook/assets/2.15-docker_images_upload_file_tag_image.png new file mode 100644 index 00000000..daf47291 Binary files /dev/null and b/.gitbook/assets/2.15-docker_images_upload_file_tag_image.png differ diff --git a/.gitbook/assets/2.15-docker_inspect_redeploy_git_repo.png b/.gitbook/assets/2.15-docker_inspect_redeploy_git_repo.png new file mode 100644 index 00000000..ee47ab18 Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_redeploy_git_repo.png differ diff --git a/.gitbook/assets/2.15-docker_inspect_stack.gif b/.gitbook/assets/2.15-docker_inspect_stack.gif new file mode 100644 index 00000000..8c1eab73 Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_stack.gif differ diff --git a/.gitbook/assets/2.15-docker_inspect_stack_details_wp.png b/.gitbook/assets/2.15-docker_inspect_stack_details_wp.png new file mode 100644 index 00000000..0ebcdfc8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_stack_details_wp.png differ diff --git a/.gitbook/assets/2.15-docker_inspect_view_standalone_container.png b/.gitbook/assets/2.15-docker_inspect_view_standalone_container.png new file mode 100644 index 00000000..5367f36e Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_view_standalone_container.png differ diff --git a/.gitbook/assets/2.15-docker_inspect_view_standalone_containers (1).png b/.gitbook/assets/2.15-docker_inspect_view_standalone_containers (1).png new file mode 100644 index 00000000..52ca291e Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_view_standalone_containers (1).png differ diff --git a/.gitbook/assets/2.15-docker_inspect_view_standalone_containers.png b/.gitbook/assets/2.15-docker_inspect_view_standalone_containers.png new file mode 100644 index 00000000..09abbdbd Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_view_standalone_containers.png differ diff --git a/.gitbook/assets/2.15-docker_inspect_view_swarm_services.png b/.gitbook/assets/2.15-docker_inspect_view_swarm_services.png new file mode 100644 index 00000000..fb36d813 Binary files /dev/null and b/.gitbook/assets/2.15-docker_inspect_view_swarm_services.png differ diff --git a/.gitbook/assets/2.15-docker_networks_add_network.gif b/.gitbook/assets/2.15-docker_networks_add_network.gif new file mode 100644 index 00000000..303a8735 Binary files /dev/null and b/.gitbook/assets/2.15-docker_networks_add_network.gif differ diff --git a/.gitbook/assets/2.15-docker_networks_add_network.png b/.gitbook/assets/2.15-docker_networks_add_network.png new file mode 100644 index 00000000..ac677f9c Binary files /dev/null and b/.gitbook/assets/2.15-docker_networks_add_network.png differ diff --git a/.gitbook/assets/2.15-docker_networks_add_network_adv_config.png b/.gitbook/assets/2.15-docker_networks_add_network_adv_config.png new file mode 100644 index 00000000..13924126 Binary files /dev/null and b/.gitbook/assets/2.15-docker_networks_add_network_adv_config.png differ diff --git a/.gitbook/assets/2.15-docker_networks_networks_list.png b/.gitbook/assets/2.15-docker_networks_networks_list.png new file mode 100644 index 00000000..cba2f572 Binary files /dev/null and b/.gitbook/assets/2.15-docker_networks_networks_list.png differ diff --git a/.gitbook/assets/2.15-docker_secrets_secret_add.gif b/.gitbook/assets/2.15-docker_secrets_secret_add.gif new file mode 100644 index 00000000..f18fe8a2 Binary files /dev/null and b/.gitbook/assets/2.15-docker_secrets_secret_add.gif differ diff --git a/.gitbook/assets/2.15-docker_secrets_secret_create.png b/.gitbook/assets/2.15-docker_secrets_secret_create.png new file mode 100644 index 00000000..2642e112 Binary files /dev/null and b/.gitbook/assets/2.15-docker_secrets_secret_create.png differ diff --git a/.gitbook/assets/2.15-docker_secrets_secret_remove.gif b/.gitbook/assets/2.15-docker_secrets_secret_remove.gif new file mode 100644 index 00000000..a6bb041c Binary files /dev/null and b/.gitbook/assets/2.15-docker_secrets_secret_remove.gif differ diff --git a/.gitbook/assets/2.15-docker_secrets_secrets_list.png b/.gitbook/assets/2.15-docker_secrets_secrets_list.png new file mode 100644 index 00000000..0574ccfb Binary files /dev/null and b/.gitbook/assets/2.15-docker_secrets_secrets_list.png differ diff --git a/.gitbook/assets/2.15-docker_service_create_service.png b/.gitbook/assets/2.15-docker_service_create_service.png new file mode 100644 index 00000000..0111cbf6 Binary files /dev/null and b/.gitbook/assets/2.15-docker_service_create_service.png differ diff --git a/.gitbook/assets/2.15-docker_services.gif b/.gitbook/assets/2.15-docker_services.gif new file mode 100644 index 00000000..42bb3f67 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services.gif differ diff --git a/.gitbook/assets/2.15-docker_services_add_service.gif b/.gitbook/assets/2.15-docker_services_add_service.gif new file mode 100644 index 00000000..b041bc8d Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_add_service.gif differ diff --git a/.gitbook/assets/2.15-docker_services_change_container_image.png b/.gitbook/assets/2.15-docker_services_change_container_image.png new file mode 100644 index 00000000..8e1c10a4 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_change_container_image.png differ diff --git a/.gitbook/assets/2.15-docker_services_configure.gif b/.gitbook/assets/2.15-docker_services_configure.gif new file mode 100644 index 00000000..5e1f533c Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_configure.gif differ diff --git a/.gitbook/assets/2.15-docker_services_list (1).png b/.gitbook/assets/2.15-docker_services_list (1).png new file mode 100644 index 00000000..cf6ae5b0 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_list (1).png differ diff --git a/.gitbook/assets/2.15-docker_services_list (2).png b/.gitbook/assets/2.15-docker_services_list (2).png new file mode 100644 index 00000000..cf6ae5b0 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_list (2).png differ diff --git a/.gitbook/assets/2.15-docker_services_list.png b/.gitbook/assets/2.15-docker_services_list.png new file mode 100644 index 00000000..cf6ae5b0 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_list.png differ diff --git a/.gitbook/assets/2.15-docker_services_scale.gif b/.gitbook/assets/2.15-docker_services_scale.gif new file mode 100644 index 00000000..90f9bed1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_scale.gif differ diff --git a/.gitbook/assets/2.15-docker_services_service_actions.png b/.gitbook/assets/2.15-docker_services_service_actions.png new file mode 100644 index 00000000..e4ab5f64 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_actions.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_configs.png b/.gitbook/assets/2.15-docker_services_service_configs.png new file mode 100644 index 00000000..295953f8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_configs.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_container_labels.png b/.gitbook/assets/2.15-docker_services_service_container_labels.png new file mode 100644 index 00000000..d2bb4d68 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_container_labels.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_details (1).png b/.gitbook/assets/2.15-docker_services_service_details (1).png new file mode 100644 index 00000000..d5088680 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_details (1).png differ diff --git a/.gitbook/assets/2.15-docker_services_service_details.png b/.gitbook/assets/2.15-docker_services_service_details.png new file mode 100644 index 00000000..d5088680 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_details.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_env_var.png b/.gitbook/assets/2.15-docker_services_service_env_var.png new file mode 100644 index 00000000..a0998b68 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_env_var.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_host_entries.png b/.gitbook/assets/2.15-docker_services_service_host_entries.png new file mode 100644 index 00000000..ff9c89f8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_host_entries.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_labels.png b/.gitbook/assets/2.15-docker_services_service_labels.png new file mode 100644 index 00000000..eb58759c Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_labels.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_log_viewer_settings.png b/.gitbook/assets/2.15-docker_services_service_log_viewer_settings.png new file mode 100644 index 00000000..5476dd1b Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_log_viewer_settings.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_logging_driver.png b/.gitbook/assets/2.15-docker_services_service_logging_driver.png new file mode 100644 index 00000000..b0e638ad Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_logging_driver.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_logs.gif b/.gitbook/assets/2.15-docker_services_service_logs.gif new file mode 100644 index 00000000..fafe1cbf Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_logs.gif differ diff --git a/.gitbook/assets/2.15-docker_services_service_mounts_bind.png b/.gitbook/assets/2.15-docker_services_service_mounts_bind.png new file mode 100644 index 00000000..d1cd5655 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_mounts_bind.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_mounts_volume.png b/.gitbook/assets/2.15-docker_services_service_mounts_volume.png new file mode 100644 index 00000000..f8ea1f33 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_mounts_volume.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_networks.png b/.gitbook/assets/2.15-docker_services_service_networks.png new file mode 100644 index 00000000..f099a01c Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_networks.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_placement_constraint.png b/.gitbook/assets/2.15-docker_services_service_placement_constraint.png new file mode 100644 index 00000000..d9d57081 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_placement_constraint.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_placement_pref.png b/.gitbook/assets/2.15-docker_services_service_placement_pref.png new file mode 100644 index 00000000..2c042ed9 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_placement_pref.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_published_ports.png b/.gitbook/assets/2.15-docker_services_service_published_ports.png new file mode 100644 index 00000000..50c14a48 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_published_ports.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_resource_limits.png b/.gitbook/assets/2.15-docker_services_service_resource_limits.png new file mode 100644 index 00000000..6932cceb Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_resource_limits.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_restart_policy.png b/.gitbook/assets/2.15-docker_services_service_restart_policy.png new file mode 100644 index 00000000..ba59e58d Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_restart_policy.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_rollback.gif b/.gitbook/assets/2.15-docker_services_service_rollback.gif new file mode 100644 index 00000000..f13ddeb9 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_rollback.gif differ diff --git a/.gitbook/assets/2.15-docker_services_service_secrets.png b/.gitbook/assets/2.15-docker_services_service_secrets.png new file mode 100644 index 00000000..29d66b6e Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_secrets.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_tasks.gif b/.gitbook/assets/2.15-docker_services_service_tasks.gif new file mode 100644 index 00000000..5c1845c8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_tasks.gif differ diff --git a/.gitbook/assets/2.15-docker_services_service_update_config.png b/.gitbook/assets/2.15-docker_services_service_update_config.png new file mode 100644 index 00000000..7517935a Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_update_config.png differ diff --git a/.gitbook/assets/2.15-docker_services_service_webhook.png b/.gitbook/assets/2.15-docker_services_service_webhook.png new file mode 100644 index 00000000..94d113f0 Binary files /dev/null and b/.gitbook/assets/2.15-docker_services_service_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_stack_create_custom_template_web_editor.png b/.gitbook/assets/2.15-docker_stack_create_custom_template_web_editor.png new file mode 100644 index 00000000..9aa9940d Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_create_custom_template_web_editor.png differ diff --git a/.gitbook/assets/2.15-docker_stack_create_template.gif b/.gitbook/assets/2.15-docker_stack_create_template.gif new file mode 100644 index 00000000..b81ae7da Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_create_template.gif differ diff --git a/.gitbook/assets/2.15-docker_stack_create_template_title.png b/.gitbook/assets/2.15-docker_stack_create_template_title.png new file mode 100644 index 00000000..fc6ba8ea Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_create_template_title.png differ diff --git a/.gitbook/assets/2.15-docker_stack_create_webhook.png b/.gitbook/assets/2.15-docker_stack_create_webhook.png new file mode 100644 index 00000000..b5221b06 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_create_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_stack_delete_stack.gif b/.gitbook/assets/2.15-docker_stack_delete_stack.gif new file mode 100644 index 00000000..6e3b053a Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_delete_stack.gif differ diff --git a/.gitbook/assets/2.15-docker_stack_duplication.png b/.gitbook/assets/2.15-docker_stack_duplication.png new file mode 100644 index 00000000..739a8df8 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_duplication.png differ diff --git a/.gitbook/assets/2.15-docker_stack_enable_stack_webhook.gif b/.gitbook/assets/2.15-docker_stack_enable_stack_webhook.gif new file mode 100644 index 00000000..15fe952d Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_enable_stack_webhook.gif differ diff --git a/.gitbook/assets/2.15-docker_stack_inspect_wp_details.png b/.gitbook/assets/2.15-docker_stack_inspect_wp_details.png new file mode 100644 index 00000000..3859c895 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_inspect_wp_details.png differ diff --git a/.gitbook/assets/2.15-docker_stack_migrate_areyousure.png b/.gitbook/assets/2.15-docker_stack_migrate_areyousure.png new file mode 100644 index 00000000..bacac46c Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_migrate_areyousure.png differ diff --git a/.gitbook/assets/2.15-docker_stack_migrate_areyousure2.png b/.gitbook/assets/2.15-docker_stack_migrate_areyousure2.png new file mode 100644 index 00000000..72c786c1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_migrate_areyousure2.png differ diff --git a/.gitbook/assets/2.15-docker_stack_migration.png b/.gitbook/assets/2.15-docker_stack_migration.png new file mode 100644 index 00000000..ebf48ac1 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_migration.png differ diff --git a/.gitbook/assets/2.15-docker_stack_web_editor_webhook.png b/.gitbook/assets/2.15-docker_stack_web_editor_webhook.png new file mode 100644 index 00000000..03c1574d Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_web_editor_webhook.png differ diff --git a/.gitbook/assets/2.15-docker_stack_wed_editor_env_var.png b/.gitbook/assets/2.15-docker_stack_wed_editor_env_var.png new file mode 100644 index 00000000..0a9cb3c7 Binary files /dev/null and b/.gitbook/assets/2.15-docker_stack_wed_editor_env_var.png differ diff --git a/.gitbook/assets/2.15-docker_summary_tiles.png b/.gitbook/assets/2.15-docker_summary_tiles.png new file mode 100644 index 00000000..3f25f4c3 Binary files /dev/null and b/.gitbook/assets/2.15-docker_summary_tiles.png differ diff --git a/.gitbook/assets/2.15-docker_swarm_add_registries.gif b/.gitbook/assets/2.15-docker_swarm_add_registries.gif new file mode 100644 index 00000000..62d94d80 Binary files /dev/null and b/.gitbook/assets/2.15-docker_swarm_add_registries.gif differ diff --git a/.gitbook/assets/2.15-docker_swarm_cluster_info.png b/.gitbook/assets/2.15-docker_swarm_cluster_info.png new file mode 100644 index 00000000..7555e194 Binary files /dev/null and b/.gitbook/assets/2.15-docker_swarm_cluster_info.png differ diff --git a/.gitbook/assets/2.15-docker_swarm_cluster_visualizer.png b/.gitbook/assets/2.15-docker_swarm_cluster_visualizer.png new file mode 100644 index 00000000..5aa73124 Binary files /dev/null and b/.gitbook/assets/2.15-docker_swarm_cluster_visualizer.png differ diff --git a/.gitbook/assets/2.15-docker_swarm_registries_manage_access.gif b/.gitbook/assets/2.15-docker_swarm_registries_manage_access.gif new file mode 100644 index 00000000..3510d862 Binary files /dev/null and b/.gitbook/assets/2.15-docker_swarm_registries_manage_access.gif differ diff --git a/.gitbook/assets/2.15-docker_swarm_registry_manage_access.png b/.gitbook/assets/2.15-docker_swarm_registry_manage_access.png new file mode 100644 index 00000000..07453117 Binary files /dev/null and b/.gitbook/assets/2.15-docker_swarm_registry_manage_access.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_add_volume.gif b/.gitbook/assets/2.15-docker_volumes_add_volume.gif new file mode 100644 index 00000000..713e50ad Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_add_volume.gif differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume.png b/.gitbook/assets/2.15-docker_volumes_create_volume.png new file mode 100644 index 00000000..652d9073 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_cifs.png b/.gitbook/assets/2.15-docker_volumes_create_volume_cifs.png new file mode 100644 index 00000000..61ff89ce Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_cifs.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_cifs_settings.png b/.gitbook/assets/2.15-docker_volumes_create_volume_cifs_settings.png new file mode 100644 index 00000000..19cb024b Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_cifs_settings.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_nfs (1).png b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs (1).png new file mode 100644 index 00000000..7f0ca5cc Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs (1).png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_nfs.png b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs.png new file mode 100644 index 00000000..6b4013be Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_nfs_settings.png b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs_settings.png new file mode 100644 index 00000000..dff28807 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_nfs_settings.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_create_volume_tmpfs.png b/.gitbook/assets/2.15-docker_volumes_create_volume_tmpfs.png new file mode 100644 index 00000000..5f4a634e Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_create_volume_tmpfs.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_volume_adv_settings.png b/.gitbook/assets/2.15-docker_volumes_volume_adv_settings.png new file mode 100644 index 00000000..1d1ec54b Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volume_adv_settings.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_volume_browse.gif b/.gitbook/assets/2.15-docker_volumes_volume_browse.gif new file mode 100644 index 00000000..7860e223 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volume_browse.gif differ diff --git a/.gitbook/assets/2.15-docker_volumes_volume_browser_files.png b/.gitbook/assets/2.15-docker_volumes_volume_browser_files.png new file mode 100644 index 00000000..acfafc9a Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volume_browser_files.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_volume_console_exec_tmpfs.png b/.gitbook/assets/2.15-docker_volumes_volume_console_exec_tmpfs.png new file mode 100644 index 00000000..b042e796 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volume_console_exec_tmpfs.png differ diff --git a/.gitbook/assets/2.15-docker_volumes_volume_remove.gif b/.gitbook/assets/2.15-docker_volumes_volume_remove.gif new file mode 100644 index 00000000..ee516dc2 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volume_remove.gif differ diff --git a/.gitbook/assets/2.15-docker_volumes_volumes.png b/.gitbook/assets/2.15-docker_volumes_volumes.png new file mode 100644 index 00000000..192d7f54 Binary files /dev/null and b/.gitbook/assets/2.15-docker_volumes_volumes.png differ diff --git a/.gitbook/assets/2.15-edge-devices-fdo.png b/.gitbook/assets/2.15-edge-devices-fdo.png new file mode 100644 index 00000000..34daafd9 Binary files /dev/null and b/.gitbook/assets/2.15-edge-devices-fdo.png differ diff --git a/.gitbook/assets/2.15-edge-devices-list.png b/.gitbook/assets/2.15-edge-devices-list.png new file mode 100644 index 00000000..5ae2c0a9 Binary files /dev/null and b/.gitbook/assets/2.15-edge-devices-list.png differ diff --git a/.gitbook/assets/2.15-edge-devices-waitingroom.png b/.gitbook/assets/2.15-edge-devices-waitingroom.png new file mode 100644 index 00000000..f9aea439 Binary files /dev/null and b/.gitbook/assets/2.15-edge-devices-waitingroom.png differ diff --git a/.gitbook/assets/2.15-edge-groups-dynamic.png b/.gitbook/assets/2.15-edge-groups-dynamic.png new file mode 100644 index 00000000..5b635d9f Binary files /dev/null and b/.gitbook/assets/2.15-edge-groups-dynamic.png differ diff --git a/.gitbook/assets/2.15-edge-groups-name.png b/.gitbook/assets/2.15-edge-groups-name.png new file mode 100644 index 00000000..474596e5 Binary files /dev/null and b/.gitbook/assets/2.15-edge-groups-name.png differ diff --git a/.gitbook/assets/2.15-edge-groups-static.png b/.gitbook/assets/2.15-edge-groups-static.png new file mode 100644 index 00000000..4d93c5b0 Binary files /dev/null and b/.gitbook/assets/2.15-edge-groups-static.png differ diff --git a/.gitbook/assets/2.15-edge-groups.gif b/.gitbook/assets/2.15-edge-groups.gif new file mode 100644 index 00000000..0a911d50 Binary files /dev/null and b/.gitbook/assets/2.15-edge-groups.gif differ diff --git a/.gitbook/assets/2.15-edge-jobs-config.png b/.gitbook/assets/2.15-edge-jobs-config.png new file mode 100644 index 00000000..4f37445b Binary files /dev/null and b/.gitbook/assets/2.15-edge-jobs-config.png differ diff --git a/.gitbook/assets/2.15-edge-jobs-targetenvs.png b/.gitbook/assets/2.15-edge-jobs-targetenvs.png new file mode 100644 index 00000000..c4310789 Binary files /dev/null and b/.gitbook/assets/2.15-edge-jobs-targetenvs.png differ diff --git a/.gitbook/assets/2.15-edge-jobs.gif b/.gitbook/assets/2.15-edge-jobs.gif new file mode 100644 index 00000000..d50ee9b2 Binary files /dev/null and b/.gitbook/assets/2.15-edge-jobs.gif differ diff --git a/.gitbook/assets/2.15-edge-stacks-add-buildmethod.png b/.gitbook/assets/2.15-edge-stacks-add-buildmethod.png new file mode 100644 index 00000000..ba5bd596 Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-add-buildmethod.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-add-deptype.png b/.gitbook/assets/2.15-edge-stacks-add-deptype.png new file mode 100644 index 00000000..7b58e5af Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-add-deptype.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-add-name.png b/.gitbook/assets/2.15-edge-stacks-add-name.png new file mode 100644 index 00000000..2d31acb8 Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-add-name.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-add-registry.png b/.gitbook/assets/2.15-edge-stacks-add-registry.png new file mode 100644 index 00000000..5ecbf5d5 Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-add-registry.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-add.gif b/.gitbook/assets/2.15-edge-stacks-add.gif new file mode 100644 index 00000000..9a55a121 Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-add.gif differ diff --git a/.gitbook/assets/2.15-edge-stacks-edit-env.png b/.gitbook/assets/2.15-edge-stacks-edit-env.png new file mode 100644 index 00000000..de17a11f Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-edit-env.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-edit.png b/.gitbook/assets/2.15-edge-stacks-edit.png new file mode 100644 index 00000000..c2c00571 Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-edit.png differ diff --git a/.gitbook/assets/2.15-edge-stacks-list.png b/.gitbook/assets/2.15-edge-stacks-list.png new file mode 100644 index 00000000..4bc37eec Binary files /dev/null and b/.gitbook/assets/2.15-edge-stacks-list.png differ diff --git a/.gitbook/assets/2.15-edge_agent_env_var.png b/.gitbook/assets/2.15-edge_agent_env_var.png new file mode 100644 index 00000000..2db8f1b9 Binary files /dev/null and b/.gitbook/assets/2.15-edge_agent_env_var.png differ diff --git a/.gitbook/assets/2.15-edge_agent_more_settings.png b/.gitbook/assets/2.15-edge_agent_more_settings.png new file mode 100644 index 00000000..8cf4f0d3 Binary files /dev/null and b/.gitbook/assets/2.15-edge_agent_more_settings.png differ diff --git a/.gitbook/assets/2.15-edge_env_url.png b/.gitbook/assets/2.15-edge_env_url.png new file mode 100644 index 00000000..9d79ba43 Binary files /dev/null and b/.gitbook/assets/2.15-edge_env_url.png differ diff --git a/.gitbook/assets/2.15-environments-add-swarm-agent-config.png b/.gitbook/assets/2.15-environments-add-swarm-agent-config.png new file mode 100644 index 00000000..2d6fb440 Binary files /dev/null and b/.gitbook/assets/2.15-environments-add-swarm-agent-config.png differ diff --git a/.gitbook/assets/2.15-environments-add-swarm-agent.png b/.gitbook/assets/2.15-environments-add-swarm-agent.png new file mode 100644 index 00000000..3d8dadd2 Binary files /dev/null and b/.gitbook/assets/2.15-environments-add-swarm-agent.png differ diff --git a/.gitbook/assets/2.15-home-buildinfo.png b/.gitbook/assets/2.15-home-buildinfo.png new file mode 100644 index 00000000..a3d7c3b6 Binary files /dev/null and b/.gitbook/assets/2.15-home-buildinfo.png differ diff --git a/.gitbook/assets/2.15-home.png b/.gitbook/assets/2.15-home.png new file mode 100644 index 00000000..3dae38f9 Binary files /dev/null and b/.gitbook/assets/2.15-home.png differ diff --git a/.gitbook/assets/2.15-host-registries-add.gif b/.gitbook/assets/2.15-host-registries-add.gif new file mode 100644 index 00000000..c284b429 Binary files /dev/null and b/.gitbook/assets/2.15-host-registries-add.gif differ diff --git a/.gitbook/assets/2.15-images-export-confirm.png b/.gitbook/assets/2.15-images-export-confirm.png new file mode 100644 index 00000000..2aaae209 Binary files /dev/null and b/.gitbook/assets/2.15-images-export-confirm.png differ diff --git a/.gitbook/assets/2.15-images-splash.png b/.gitbook/assets/2.15-images-splash.png new file mode 100644 index 00000000..d5c65415 Binary files /dev/null and b/.gitbook/assets/2.15-images-splash.png differ diff --git a/.gitbook/assets/2.15-install-agent-edge-name.png b/.gitbook/assets/2.15-install-agent-edge-name.png new file mode 100644 index 00000000..332e5c3f Binary files /dev/null and b/.gitbook/assets/2.15-install-agent-edge-name.png differ diff --git a/.gitbook/assets/2.15-install-agent-edge-vars.png b/.gitbook/assets/2.15-install-agent-edge-vars.png new file mode 100644 index 00000000..04f3e1d8 Binary files /dev/null and b/.gitbook/assets/2.15-install-agent-edge-vars.png differ diff --git a/.gitbook/assets/2.15-install-agent-nomad-moresettings.png b/.gitbook/assets/2.15-install-agent-nomad-moresettings.png new file mode 100644 index 00000000..9290c31a Binary files /dev/null and b/.gitbook/assets/2.15-install-agent-nomad-moresettings.png differ diff --git a/.gitbook/assets/2.15-install-server-setup-license.png b/.gitbook/assets/2.15-install-server-setup-license.png new file mode 100644 index 00000000..98357449 Binary files /dev/null and b/.gitbook/assets/2.15-install-server-setup-license.png differ diff --git a/.gitbook/assets/2.15-install-server-setup-matomo.png b/.gitbook/assets/2.15-install-server-setup-matomo.png new file mode 100644 index 00000000..fcfab6e9 Binary files /dev/null and b/.gitbook/assets/2.15-install-server-setup-matomo.png differ diff --git a/.gitbook/assets/2.15-install-server-setup-user.png b/.gitbook/assets/2.15-install-server-setup-user.png new file mode 100644 index 00000000..1ff40e7b Binary files /dev/null and b/.gitbook/assets/2.15-install-server-setup-user.png differ diff --git a/.gitbook/assets/2.15-install-server-setup-wizard.png b/.gitbook/assets/2.15-install-server-setup-wizard.png new file mode 100644 index 00000000..7d0756cc Binary files /dev/null and b/.gitbook/assets/2.15-install-server-setup-wizard.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-detach-confirm.png b/.gitbook/assets/2.15-k8s-applications-detach-confirm.png new file mode 100644 index 00000000..d1809a69 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-detach-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-edit-git-edit.png b/.gitbook/assets/2.15-k8s-applications-edit-git-edit.png new file mode 100644 index 00000000..718ed2d0 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-edit-git-edit.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-edit-git-message.png b/.gitbook/assets/2.15-k8s-applications-edit-git-message.png new file mode 100644 index 00000000..1cd2d0ae Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-edit-git-message.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-inspect-actions.png b/.gitbook/assets/2.15-k8s-applications-inspect-actions.png new file mode 100644 index 00000000..b587aa51 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-inspect-actions.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-inspect-config.png b/.gitbook/assets/2.15-k8s-applications-inspect-config.png new file mode 100644 index 00000000..2c3a4ca6 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-inspect-config.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-inspect-events.png b/.gitbook/assets/2.15-k8s-applications-inspect-events.png new file mode 100644 index 00000000..58e9a0aa Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-inspect-events.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-inspect-yaml.png b/.gitbook/assets/2.15-k8s-applications-inspect-yaml.png new file mode 100644 index 00000000..14f71413 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-inspect-yaml.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-polling.png b/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-polling.png new file mode 100644 index 00000000..58a41c97 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-polling.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-webhook.png b/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-webhook.png new file mode 100644 index 00000000..e05becb0 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-manifest-autoupdates-webhook.png differ diff --git a/.gitbook/assets/2.15-k8s-applications-remove-confirm.png b/.gitbook/assets/2.15-k8s-applications-remove-confirm.png new file mode 100644 index 00000000..4f9639e0 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-applications-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-apps.png b/.gitbook/assets/2.15-k8s-cluster-node-apps.png new file mode 100644 index 00000000..bcfb9bb0 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-apps.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-details.png b/.gitbook/assets/2.15-k8s-cluster-node-details.png new file mode 100644 index 00000000..24e5e030 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-details.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-events.png b/.gitbook/assets/2.15-k8s-cluster-node-events.png new file mode 100644 index 00000000..f9fd0a97 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-events.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-labels.png b/.gitbook/assets/2.15-k8s-cluster-node-labels.png new file mode 100644 index 00000000..7185f298 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-labels.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-resource.png b/.gitbook/assets/2.15-k8s-cluster-node-resource.png new file mode 100644 index 00000000..b797381f Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-resource.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node-taints.png b/.gitbook/assets/2.15-k8s-cluster-node-taints.png new file mode 100644 index 00000000..d7628e19 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node-taints.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-node.gif b/.gitbook/assets/2.15-k8s-cluster-node.gif new file mode 100644 index 00000000..1e718d30 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-node.gif differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries-access.png b/.gitbook/assets/2.15-k8s-cluster-registries-access.png new file mode 100644 index 00000000..6f0f7627 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries-access.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries-add.gif b/.gitbook/assets/2.15-k8s-cluster-registries-add.gif new file mode 100644 index 00000000..eaab2dd2 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries-add.gif differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries-browse.png b/.gitbook/assets/2.15-k8s-cluster-registries-browse.png new file mode 100644 index 00000000..f9959025 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries-browse.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries-createaccess.png b/.gitbook/assets/2.15-k8s-cluster-registries-createaccess.png new file mode 100644 index 00000000..212c5aa3 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries-createaccess.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries-manage.png b/.gitbook/assets/2.15-k8s-cluster-registries-manage.png new file mode 100644 index 00000000..67d36ded Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries-manage.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-registries.gif b/.gitbook/assets/2.15-k8s-cluster-registries.gif new file mode 100644 index 00000000..1dd2614c Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-registries.gif differ diff --git a/.gitbook/assets/2.15-k8s-cluster-securitypolicies.gif b/.gitbook/assets/2.15-k8s-cluster-securitypolicies.gif new file mode 100644 index 00000000..866f0cd8 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-securitypolicies.gif differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup-changewindow.png b/.gitbook/assets/2.15-k8s-cluster-setup-changewindow.png new file mode 100644 index 00000000..19e7c5e3 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup-changewindow.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup-networking.png b/.gitbook/assets/2.15-k8s-cluster-setup-networking.png new file mode 100644 index 00000000..f67bfb6e Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup-networking.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup-resources.png b/.gitbook/assets/2.15-k8s-cluster-setup-resources.png new file mode 100644 index 00000000..b2eda850 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup-resources.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup-security.png b/.gitbook/assets/2.15-k8s-cluster-setup-security.png new file mode 100644 index 00000000..51d1ecbc Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup-security.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup-storage.png b/.gitbook/assets/2.15-k8s-cluster-setup-storage.png new file mode 100644 index 00000000..295ec302 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup-storage.png differ diff --git a/.gitbook/assets/2.15-k8s-cluster-setup.gif b/.gitbook/assets/2.15-k8s-cluster-setup.gif new file mode 100644 index 00000000..7231928b Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster-setup.gif differ diff --git a/.gitbook/assets/2.15-k8s-cluster.gif b/.gitbook/assets/2.15-k8s-cluster.gif new file mode 100644 index 00000000..924438fe Binary files /dev/null and b/.gitbook/assets/2.15-k8s-cluster.gif differ diff --git a/.gitbook/assets/2.15-k8s-configs-remove-confirm.png b/.gitbook/assets/2.15-k8s-configs-remove-confirm.png new file mode 100644 index 00000000..193c7bb1 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-configs-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-helm-charts.png b/.gitbook/assets/2.15-k8s-helm-charts.png new file mode 100644 index 00000000..0fdaf280 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-helm-charts.png differ diff --git a/.gitbook/assets/2.15-k8s-helm-info.png b/.gitbook/assets/2.15-k8s-helm-info.png new file mode 100644 index 00000000..271f7449 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-helm-info.png differ diff --git a/.gitbook/assets/2.15-k8s-kubeconfig-confirm.png b/.gitbook/assets/2.15-k8s-kubeconfig-confirm.png new file mode 100644 index 00000000..1a8cec95 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-kubeconfig-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-kubeconfig.gif b/.gitbook/assets/2.15-k8s-kubeconfig.gif new file mode 100644 index 00000000..c9cb73cf Binary files /dev/null and b/.gitbook/assets/2.15-k8s-kubeconfig.gif differ diff --git a/.gitbook/assets/2.15-k8s-namespaces-remove-confirm.png b/.gitbook/assets/2.15-k8s-namespaces-remove-confirm.png new file mode 100644 index 00000000..fdc90ab4 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-namespaces-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-templates-remove-confirm.png b/.gitbook/assets/2.15-k8s-templates-remove-confirm.png new file mode 100644 index 00000000..69180fd7 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-templates-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-volumes-inspect-events.png b/.gitbook/assets/2.15-k8s-volumes-inspect-events.png new file mode 100644 index 00000000..db8a0d0b Binary files /dev/null and b/.gitbook/assets/2.15-k8s-volumes-inspect-events.png differ diff --git a/.gitbook/assets/2.15-k8s-volumes-remove-confirm.png b/.gitbook/assets/2.15-k8s-volumes-remove-confirm.png new file mode 100644 index 00000000..2d2970bb Binary files /dev/null and b/.gitbook/assets/2.15-k8s-volumes-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-k8s-volumes-remove.gif b/.gitbook/assets/2.15-k8s-volumes-remove.gif new file mode 100644 index 00000000..bd865656 Binary files /dev/null and b/.gitbook/assets/2.15-k8s-volumes-remove.gif differ diff --git a/.gitbook/assets/2.15-k8s_agent.png b/.gitbook/assets/2.15-k8s_agent.png new file mode 100644 index 00000000..6ca55572 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_agent.png differ diff --git a/.gitbook/assets/2.15-k8s_env_url.png b/.gitbook/assets/2.15-k8s_env_url.png new file mode 100644 index 00000000..d74a0a24 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_env_url.png differ diff --git a/.gitbook/assets/2.15-k8s_import_kubeconfig.png b/.gitbook/assets/2.15-k8s_import_kubeconfig.png new file mode 100644 index 00000000..a6f907e9 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_import_kubeconfig.png differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_add_custom_templates.gif b/.gitbook/assets/2.15-k8s_kubernetes_add_custom_templates.gif new file mode 100644 index 00000000..fd4da83f Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_add_custom_templates.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_applications_add_manifest.gif b/.gitbook/assets/2.15-k8s_kubernetes_applications_add_manifest.gif new file mode 100644 index 00000000..28810152 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_applications_add_manifest.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_applications_delete_app.gif b/.gitbook/assets/2.15-k8s_kubernetes_applications_delete_app.gif new file mode 100644 index 00000000..b12b195f Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_applications_delete_app.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app (1).gif b/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app (1).gif new file mode 100644 index 00000000..975da2ba Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app (1).gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app.gif b/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app.gif new file mode 100644 index 00000000..975da2ba Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_applications_edit_app.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_applications_inspect_app.gif b/.gitbook/assets/2.15-k8s_kubernetes_applications_inspect_app.gif new file mode 100644 index 00000000..3cf55df1 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_applications_inspect_app.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_apps_add_with_form.gif b/.gitbook/assets/2.15-k8s_kubernetes_apps_add_with_form.gif new file mode 100644 index 00000000..033ecd24 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_apps_add_with_form.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_configmap_create_form.gif b/.gitbook/assets/2.15-k8s_kubernetes_configmap_create_form.gif new file mode 100644 index 00000000..948c92bf Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_configmap_create_form.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_configmap_remove_configmap.gif b/.gitbook/assets/2.15-k8s_kubernetes_configmap_remove_configmap.gif new file mode 100644 index 00000000..eebd0250 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_configmap_remove_configmap.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_custom_templates.gif b/.gitbook/assets/2.15-k8s_kubernetes_custom_templates.gif new file mode 100644 index 00000000..96b61a54 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_custom_templates.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_delete_custom_templates.gif b/.gitbook/assets/2.15-k8s_kubernetes_delete_custom_templates.gif new file mode 100644 index 00000000..a630ca96 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_delete_custom_templates.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_edit_custom_templates.gif b/.gitbook/assets/2.15-k8s_kubernetes_edit_custom_templates.gif new file mode 100644 index 00000000..311cb828 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_edit_custom_templates.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_helm_deploy_chart.gif b/.gitbook/assets/2.15-k8s_kubernetes_helm_deploy_chart.gif new file mode 100644 index 00000000..5bf797dd Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_helm_deploy_chart.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace (1).gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace (1).gif new file mode 100644 index 00000000..02fd89a9 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace (1).gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace.gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace.gif new file mode 100644 index 00000000..02fd89a9 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace_form.gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace_form.gif new file mode 100644 index 00000000..3b5cef65 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_add_namespace_form.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_delete_namespace.gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_delete_namespace.gif new file mode 100644 index 00000000..ecdaac02 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_delete_namespace.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace.gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace.gif new file mode 100644 index 00000000..2b2b18b4 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace_access.gif b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace_access.gif new file mode 100644 index 00000000..05c1085b Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_namespaces_manage_namespace_access.gif differ diff --git a/.gitbook/assets/2.15-k8s_kubernetes_volume_inspect.gif b/.gitbook/assets/2.15-k8s_kubernetes_volume_inspect.gif new file mode 100644 index 00000000..82a6b3b3 Binary files /dev/null and b/.gitbook/assets/2.15-k8s_kubernetes_volume_inspect.gif differ diff --git a/.gitbook/assets/2.15-k8s_more_settings.png b/.gitbook/assets/2.15-k8s_more_settings.png new file mode 100644 index 00000000..75b0decc Binary files /dev/null and b/.gitbook/assets/2.15-k8s_more_settings.png differ diff --git a/.gitbook/assets/2.15-kaas-civo-creds (1).png b/.gitbook/assets/2.15-kaas-civo-creds (1).png new file mode 100644 index 00000000..daa81202 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-civo-creds (1).png differ diff --git a/.gitbook/assets/2.15-kaas-civo-creds.png b/.gitbook/assets/2.15-kaas-civo-creds.png new file mode 100644 index 00000000..daa81202 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-civo-creds.png differ diff --git a/.gitbook/assets/2.15-kaas-creds-aks.png b/.gitbook/assets/2.15-kaas-creds-aks.png new file mode 100644 index 00000000..43dd587a Binary files /dev/null and b/.gitbook/assets/2.15-kaas-creds-aks.png differ diff --git a/.gitbook/assets/2.15-kaas-creds-digitalocean.png b/.gitbook/assets/2.15-kaas-creds-digitalocean.png new file mode 100644 index 00000000..8f44cf7c Binary files /dev/null and b/.gitbook/assets/2.15-kaas-creds-digitalocean.png differ diff --git a/.gitbook/assets/2.15-kaas-creds-eks.png b/.gitbook/assets/2.15-kaas-creds-eks.png new file mode 100644 index 00000000..66823751 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-creds-eks.png differ diff --git a/.gitbook/assets/2.15-kaas-creds-gke.png b/.gitbook/assets/2.15-kaas-creds-gke.png new file mode 100644 index 00000000..546bb7ba Binary files /dev/null and b/.gitbook/assets/2.15-kaas-creds-gke.png differ diff --git a/.gitbook/assets/2.15-kaas-creds-linode.png b/.gitbook/assets/2.15-kaas-creds-linode.png new file mode 100644 index 00000000..c4223df7 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-creds-linode.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-aks.png b/.gitbook/assets/2.15-kaas-provision-aks.png new file mode 100644 index 00000000..217d6992 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-aks.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-civo.png b/.gitbook/assets/2.15-kaas-provision-civo.png new file mode 100644 index 00000000..d2386c8a Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-civo.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-digitalocean.png b/.gitbook/assets/2.15-kaas-provision-digitalocean.png new file mode 100644 index 00000000..3d044ec0 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-digitalocean.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-eks.png b/.gitbook/assets/2.15-kaas-provision-eks.png new file mode 100644 index 00000000..aaf568ad Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-eks.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-gke.png b/.gitbook/assets/2.15-kaas-provision-gke.png new file mode 100644 index 00000000..7d7bf003 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-gke.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-linode.png b/.gitbook/assets/2.15-kaas-provision-linode.png new file mode 100644 index 00000000..bb671185 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-linode.png differ diff --git a/.gitbook/assets/2.15-kaas-provision-moresettings.png b/.gitbook/assets/2.15-kaas-provision-moresettings.png new file mode 100644 index 00000000..3ba863b0 Binary files /dev/null and b/.gitbook/assets/2.15-kaas-provision-moresettings.png differ diff --git a/.gitbook/assets/2.15-kubernetes_application_apps_list.png b/.gitbook/assets/2.15-kubernetes_application_apps_list.png new file mode 100644 index 00000000..43b57475 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_application_apps_list.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_autoscaling.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_autoscaling.png new file mode 100644 index 00000000..8c3654c3 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_autoscaling.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_config.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_config.png new file mode 100644 index 00000000..3695d647 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_config.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_configurations.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_configurations.png new file mode 100644 index 00000000..326765b9 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_configurations.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_deployment.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_deployment.png new file mode 100644 index 00000000..87df70b2 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_deployment.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_env_var.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_env_var.png new file mode 100644 index 00000000..8971b54e Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_env_var.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_persist_data.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_persist_data.png new file mode 100644 index 00000000..6cde7921 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_persist_data.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_placements.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_placements.png new file mode 100644 index 00000000..08759eb7 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_placements.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_form_resource_revs.png b/.gitbook/assets/2.15-kubernetes_applications_add_form_resource_revs.png new file mode 100644 index 00000000..853fd2ef Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_form_resource_revs.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_update_polling.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_update_polling.png new file mode 100644 index 00000000..33afb32c Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_update_polling.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_updates_webhook.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_updates_webhook.png new file mode 100644 index 00000000..de6787de Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_auto_updates_webhook.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_force_deploy.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_force_deploy.png new file mode 100644 index 00000000..a79fb2db Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_force_deploy.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy (1).png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy (1).png new file mode 100644 index 00000000..2ea6c3fe Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy (1).png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy.png new file mode 100644 index 00000000..2ea6c3fe Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_gh_k8s_deploy.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_namespace.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_namespace.png new file mode 100644 index 00000000..157fcbfd Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_namespace.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_template.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_template.png new file mode 100644 index 00000000..27338a17 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_template.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_url.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_url.png new file mode 100644 index 00000000..ca63512e Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_url.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_add_manifest_web_editor.png b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_web_editor.png new file mode 100644 index 00000000..d45557e2 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_add_manifest_web_editor.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_actions.png b/.gitbook/assets/2.15-kubernetes_applications_application_actions.png new file mode 100644 index 00000000..99e4e9fc Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_actions.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_config_details.png b/.gitbook/assets/2.15-kubernetes_applications_application_config_details.png new file mode 100644 index 00000000..b51e470c Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_config_details.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_details.png b/.gitbook/assets/2.15-kubernetes_applications_application_details.png new file mode 100644 index 00000000..c141fb2a Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_details.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_edit.png b/.gitbook/assets/2.15-kubernetes_applications_application_edit.png new file mode 100644 index 00000000..348e3799 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_edit.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_events.png b/.gitbook/assets/2.15-kubernetes_applications_application_events.png new file mode 100644 index 00000000..78aa20e2 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_events.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_placement.png b/.gitbook/assets/2.15-kubernetes_applications_application_placement.png new file mode 100644 index 00000000..a970417f Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_placement.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_pod_details.png b/.gitbook/assets/2.15-kubernetes_applications_application_pod_details.png new file mode 100644 index 00000000..d9547e01 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_pod_details.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_application_yaml.png b/.gitbook/assets/2.15-kubernetes_applications_application_yaml.png new file mode 100644 index 00000000..caf143eb Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_application_yaml.png differ diff --git a/.gitbook/assets/2.15-kubernetes_applications_publish_app.png b/.gitbook/assets/2.15-kubernetes_applications_publish_app.png new file mode 100644 index 00000000..d256e08d Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_applications_publish_app.png differ diff --git a/.gitbook/assets/2.15-kubernetes_config_map_config_map_secrets_list.png b/.gitbook/assets/2.15-kubernetes_config_map_config_map_secrets_list.png new file mode 100644 index 00000000..7d55a50e Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_config_map_config_map_secrets_list.png differ diff --git a/.gitbook/assets/2.15-kubernetes_configmap_add_form_config.png b/.gitbook/assets/2.15-kubernetes_configmap_add_form_config.png new file mode 100644 index 00000000..92ac94e4 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_configmap_add_form_config.png differ diff --git a/.gitbook/assets/2.15-kubernetes_configmap_add_form_config_data.png b/.gitbook/assets/2.15-kubernetes_configmap_add_form_config_data.png new file mode 100644 index 00000000..0ba61521 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_configmap_add_form_config_data.png differ diff --git a/.gitbook/assets/2.15-kubernetes_configmap_add_from_config_data_simple.png b/.gitbook/assets/2.15-kubernetes_configmap_add_from_config_data_simple.png new file mode 100644 index 00000000..b1d623bf Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_configmap_add_from_config_data_simple.png differ diff --git a/.gitbook/assets/2.15-kubernetes_create_custom_template.png b/.gitbook/assets/2.15-kubernetes_create_custom_template.png new file mode 100644 index 00000000..962308a9 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_create_custom_template.png differ diff --git a/.gitbook/assets/2.15-kubernetes_custom_template_saved_variables.png b/.gitbook/assets/2.15-kubernetes_custom_template_saved_variables.png new file mode 100644 index 00000000..279493ea Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_custom_template_saved_variables.png differ diff --git a/.gitbook/assets/2.15-kubernetes_custom_template_upload.png b/.gitbook/assets/2.15-kubernetes_custom_template_upload.png new file mode 100644 index 00000000..8b7a6e30 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_custom_template_upload.png differ diff --git a/.gitbook/assets/2.15-kubernetes_custom_template_web_editor.png b/.gitbook/assets/2.15-kubernetes_custom_template_web_editor.png new file mode 100644 index 00000000..80e71c9b Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_custom_template_web_editor.png differ diff --git a/.gitbook/assets/2.15-kubernetes_custom_template_web_editor_variables.png b/.gitbook/assets/2.15-kubernetes_custom_template_web_editor_variables.png new file mode 100644 index 00000000..8eb9df95 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_custom_template_web_editor_variables.png differ diff --git a/.gitbook/assets/2.15-kubernetes_env_info.png b/.gitbook/assets/2.15-kubernetes_env_info.png new file mode 100644 index 00000000..6427822b Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_env_info.png differ diff --git a/.gitbook/assets/2.15-kubernetes_helm_additional_repos.png b/.gitbook/assets/2.15-kubernetes_helm_additional_repos.png new file mode 100644 index 00000000..a33f5985 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_helm_additional_repos.png differ diff --git a/.gitbook/assets/2.15-kubernetes_helm_helm_chart_web_editor.png b/.gitbook/assets/2.15-kubernetes_helm_helm_chart_web_editor.png new file mode 100644 index 00000000..cafc228c Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_helm_helm_chart_web_editor.png differ diff --git a/.gitbook/assets/2.15-kubernetes_kubectl_shell.gif b/.gitbook/assets/2.15-kubernetes_kubectl_shell.gif new file mode 100644 index 00000000..c2943b6d Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_kubectl_shell.gif differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment (1).png b/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment (1).png new file mode 100644 index 00000000..d177f375 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment (1).png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment.png b/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment.png new file mode 100644 index 00000000..d177f375 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_create_namespace_resource_assignment.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_list.png b/.gitbook/assets/2.15-kubernetes_namespaces_list.png new file mode 100644 index 00000000..09c139e6 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_list.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_access.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_access.png new file mode 100644 index 00000000..38c05da5 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_access.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_load_balancer.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_load_balancer.png new file mode 100644 index 00000000..4f4b0e49 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_load_balancer.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_storage.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_storage.png new file mode 100644 index 00000000..68ea4ae1 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespace_storage.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_actions.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_actions.png new file mode 100644 index 00000000..b7f0f9da Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_actions.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_ingress.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_ingress.png new file mode 100644 index 00000000..a5c85347 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_ingress.png differ diff --git a/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_summary.png b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_summary.png new file mode 100644 index 00000000..e3eeaf0f Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_namespaces_manage_namespaces_summary.png differ diff --git a/.gitbook/assets/2.15-kubernetes_summary_tiles.png b/.gitbook/assets/2.15-kubernetes_summary_tiles.png new file mode 100644 index 00000000..055b8ad0 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_summary_tiles.png differ diff --git a/.gitbook/assets/2.15-kubernetes_volume_volume_yaml.png b/.gitbook/assets/2.15-kubernetes_volume_volume_yaml.png new file mode 100644 index 00000000..b22c2490 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_volume_volume_yaml.png differ diff --git a/.gitbook/assets/2.15-kubernetes_volumes_storage_list.png b/.gitbook/assets/2.15-kubernetes_volumes_storage_list.png new file mode 100644 index 00000000..5deff75b Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_volumes_storage_list.png differ diff --git a/.gitbook/assets/2.15-kubernetes_volumes_volume_section.png b/.gitbook/assets/2.15-kubernetes_volumes_volume_section.png new file mode 100644 index 00000000..3ab4d6c7 Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_volumes_volume_section.png differ diff --git a/.gitbook/assets/2.15-kubernetes_volumes_voulme_list.png b/.gitbook/assets/2.15-kubernetes_volumes_voulme_list.png new file mode 100644 index 00000000..5ef6bb3d Binary files /dev/null and b/.gitbook/assets/2.15-kubernetes_volumes_voulme_list.png differ diff --git a/.gitbook/assets/2.15-license.png b/.gitbook/assets/2.15-license.png new file mode 100644 index 00000000..fb793e56 Binary files /dev/null and b/.gitbook/assets/2.15-license.png differ diff --git a/.gitbook/assets/2.15-licenses-add.png b/.gitbook/assets/2.15-licenses-add.png new file mode 100644 index 00000000..b1171dce Binary files /dev/null and b/.gitbook/assets/2.15-licenses-add.png differ diff --git a/.gitbook/assets/2.15-licenses-info.png b/.gitbook/assets/2.15-licenses-info.png new file mode 100644 index 00000000..9034a639 Binary files /dev/null and b/.gitbook/assets/2.15-licenses-info.png differ diff --git a/.gitbook/assets/2.15-licenses-list.png b/.gitbook/assets/2.15-licenses-list.png new file mode 100644 index 00000000..c723daff Binary files /dev/null and b/.gitbook/assets/2.15-licenses-list.png differ diff --git a/.gitbook/assets/2.15-networks-remove.gif b/.gitbook/assets/2.15-networks-remove.gif new file mode 100644 index 00000000..545cb769 Binary files /dev/null and b/.gitbook/assets/2.15-networks-remove.gif differ diff --git a/.gitbook/assets/2.15-nomad-auth.png b/.gitbook/assets/2.15-nomad-auth.png new file mode 100644 index 00000000..72239985 Binary files /dev/null and b/.gitbook/assets/2.15-nomad-auth.png differ diff --git a/.gitbook/assets/2.15-nomad-clusterinfo.png b/.gitbook/assets/2.15-nomad-clusterinfo.png new file mode 100644 index 00000000..a7be9a7c Binary files /dev/null and b/.gitbook/assets/2.15-nomad-clusterinfo.png differ diff --git a/.gitbook/assets/2.15-nomad-jobs-list-expanded.png b/.gitbook/assets/2.15-nomad-jobs-list-expanded.png new file mode 100644 index 00000000..e6a75d5f Binary files /dev/null and b/.gitbook/assets/2.15-nomad-jobs-list-expanded.png differ diff --git a/.gitbook/assets/2.15-nomad-jobs-list.png b/.gitbook/assets/2.15-nomad-jobs-list.png new file mode 100644 index 00000000..92b4d9da Binary files /dev/null and b/.gitbook/assets/2.15-nomad-jobs-list.png differ diff --git a/.gitbook/assets/2.15-nomad-jobs.gif b/.gitbook/assets/2.15-nomad-jobs.gif new file mode 100644 index 00000000..bbe209c7 Binary files /dev/null and b/.gitbook/assets/2.15-nomad-jobs.gif differ diff --git a/.gitbook/assets/2.15-nomad-tiles.png b/.gitbook/assets/2.15-nomad-tiles.png new file mode 100644 index 00000000..570c7dab Binary files /dev/null and b/.gitbook/assets/2.15-nomad-tiles.png differ diff --git a/.gitbook/assets/2.15-nomad_env (1).png b/.gitbook/assets/2.15-nomad_env (1).png new file mode 100644 index 00000000..6173ccd2 Binary files /dev/null and b/.gitbook/assets/2.15-nomad_env (1).png differ diff --git a/.gitbook/assets/2.15-nomad_env.png b/.gitbook/assets/2.15-nomad_env.png new file mode 100644 index 00000000..6173ccd2 Binary files /dev/null and b/.gitbook/assets/2.15-nomad_env.png differ diff --git a/.gitbook/assets/2.15-nomad_more_settings.png b/.gitbook/assets/2.15-nomad_more_settings.png new file mode 100644 index 00000000..c717433a Binary files /dev/null and b/.gitbook/assets/2.15-nomad_more_settings.png differ diff --git a/.gitbook/assets/2.15-quick_setup.png b/.gitbook/assets/2.15-quick_setup.png new file mode 100644 index 00000000..cb15f315 Binary files /dev/null and b/.gitbook/assets/2.15-quick_setup.png differ diff --git a/.gitbook/assets/2.15-registries-browse-repo-detail.png b/.gitbook/assets/2.15-registries-browse-repo-detail.png new file mode 100644 index 00000000..360adac5 Binary files /dev/null and b/.gitbook/assets/2.15-registries-browse-repo-detail.png differ diff --git a/.gitbook/assets/2.15-registries-browse-repos.png b/.gitbook/assets/2.15-registries-browse-repos.png new file mode 100644 index 00000000..48e4dfea Binary files /dev/null and b/.gitbook/assets/2.15-registries-browse-repos.png differ diff --git a/.gitbook/assets/2.15-registries-browse.gif b/.gitbook/assets/2.15-registries-browse.gif new file mode 100644 index 00000000..f99d12e4 Binary files /dev/null and b/.gitbook/assets/2.15-registries-browse.gif differ diff --git a/.gitbook/assets/2.15-registries-manage-addtag.png b/.gitbook/assets/2.15-registries-manage-addtag.png new file mode 100644 index 00000000..21c28c4f Binary files /dev/null and b/.gitbook/assets/2.15-registries-manage-addtag.png differ diff --git a/.gitbook/assets/2.15-registries-manage-removetag.gif b/.gitbook/assets/2.15-registries-manage-removetag.gif new file mode 100644 index 00000000..3da7c606 Binary files /dev/null and b/.gitbook/assets/2.15-registries-manage-removetag.gif differ diff --git a/.gitbook/assets/2.15-registries-manage-retag.png b/.gitbook/assets/2.15-registries-manage-retag.png new file mode 100644 index 00000000..0b5d5c21 Binary files /dev/null and b/.gitbook/assets/2.15-registries-manage-retag.png differ diff --git a/.gitbook/assets/2.15-registries-manage.gif b/.gitbook/assets/2.15-registries-manage.gif new file mode 100644 index 00000000..b8e321cd Binary files /dev/null and b/.gitbook/assets/2.15-registries-manage.gif differ diff --git a/.gitbook/assets/2.15-service-rollback-confirm.png b/.gitbook/assets/2.15-service-rollback-confirm.png new file mode 100644 index 00000000..61cee450 Binary files /dev/null and b/.gitbook/assets/2.15-service-rollback-confirm.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-autopop.png b/.gitbook/assets/2.15-settings-authentication-ad-autopop.png new file mode 100644 index 00000000..dd0682f9 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-autopop.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-config.png b/.gitbook/assets/2.15-settings-authentication-ad-config.png new file mode 100644 index 00000000..b70f823d Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-config.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-groupsearch.png b/.gitbook/assets/2.15-settings-authentication-ad-groupsearch.png new file mode 100644 index 00000000..5c797159 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-groupsearch.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-security.png b/.gitbook/assets/2.15-settings-authentication-ad-security.png new file mode 100644 index 00000000..c93d9dd3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-security.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-testlogin.png b/.gitbook/assets/2.15-settings-authentication-ad-testlogin.png new file mode 100644 index 00000000..0bdf98fc Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-testlogin.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad-usersearch.png b/.gitbook/assets/2.15-settings-authentication-ad-usersearch.png new file mode 100644 index 00000000..efd21a81 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad-usersearch.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ad.gif b/.gitbook/assets/2.15-settings-authentication-ad.gif new file mode 100644 index 00000000..e6a0e1ad Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ad.gif differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-auto.png b/.gitbook/assets/2.15-settings-authentication-ldap-auto.png new file mode 100644 index 00000000..3624aa31 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-auto.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-autopop.png b/.gitbook/assets/2.15-settings-authentication-ldap-autopop.png new file mode 100644 index 00000000..7626c9dd Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-autopop.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-config.png b/.gitbook/assets/2.15-settings-authentication-ldap-config.png new file mode 100644 index 00000000..1e664952 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-config.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch-filter.png b/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch-filter.png new file mode 100644 index 00000000..4a3413fa Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch-filter.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch.png b/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch.png new file mode 100644 index 00000000..357e2897 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-groupsearch.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-security-tls.png b/.gitbook/assets/2.15-settings-authentication-ldap-security-tls.png new file mode 100644 index 00000000..154974ea Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-security-tls.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-security.png b/.gitbook/assets/2.15-settings-authentication-ldap-security.png new file mode 100644 index 00000000..07403df2 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-security.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-testlogin.png b/.gitbook/assets/2.15-settings-authentication-ldap-testlogin.png new file mode 100644 index 00000000..0c9c6c99 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-testlogin.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-type.png b/.gitbook/assets/2.15-settings-authentication-ldap-type.png new file mode 100644 index 00000000..279a9034 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-type.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap-usersearch.png b/.gitbook/assets/2.15-settings-authentication-ldap-usersearch.png new file mode 100644 index 00000000..e0d06837 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap-usersearch.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-ldap.gif b/.gitbook/assets/2.15-settings-authentication-ldap.gif new file mode 100644 index 00000000..3f0f15bd Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-ldap.gif differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-custom.png b/.gitbook/assets/2.15-settings-authentication-oauth-custom.png new file mode 100644 index 00000000..a3bdf686 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-custom.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-github.png b/.gitbook/assets/2.15-settings-authentication-oauth-github.png new file mode 100644 index 00000000..95f5b4af Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-github.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-google.png b/.gitbook/assets/2.15-settings-authentication-oauth-google.png new file mode 100644 index 00000000..b6c81117 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-google.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-ms.png b/.gitbook/assets/2.15-settings-authentication-oauth-ms.png new file mode 100644 index 00000000..2be2a58e Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-ms.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-sso.png b/.gitbook/assets/2.15-settings-authentication-oauth-sso.png new file mode 100644 index 00000000..a60d3307 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-sso.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth-team.png b/.gitbook/assets/2.15-settings-authentication-oauth-team.png new file mode 100644 index 00000000..6f545412 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth-team.png differ diff --git a/.gitbook/assets/2.15-settings-authentication-oauth.gif b/.gitbook/assets/2.15-settings-authentication-oauth.gif new file mode 100644 index 00000000..caf1f541 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication-oauth.gif differ diff --git a/.gitbook/assets/2.15-settings-authentication.png b/.gitbook/assets/2.15-settings-authentication.png new file mode 100644 index 00000000..d9ac0f61 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authentication.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs-activity-export.png b/.gitbook/assets/2.15-settings-authlogs-activity-export.png new file mode 100644 index 00000000..c1f088db Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-activity-export.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs-activity-inspect.png b/.gitbook/assets/2.15-settings-authlogs-activity-inspect.png new file mode 100644 index 00000000..1ffde70e Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-activity-inspect.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs-activity-list.png b/.gitbook/assets/2.15-settings-authlogs-activity-list.png new file mode 100644 index 00000000..4959cbb3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-activity-list.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs-activity.gif b/.gitbook/assets/2.15-settings-authlogs-activity.gif new file mode 100644 index 00000000..803b24d2 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-activity.gif differ diff --git a/.gitbook/assets/2.15-settings-authlogs-export.png b/.gitbook/assets/2.15-settings-authlogs-export.png new file mode 100644 index 00000000..fd682d11 Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-export.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs-list.png b/.gitbook/assets/2.15-settings-authlogs-list.png new file mode 100644 index 00000000..06431cab Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs-list.png differ diff --git a/.gitbook/assets/2.15-settings-authlogs.gif b/.gitbook/assets/2.15-settings-authlogs.gif new file mode 100644 index 00000000..55692d5c Binary files /dev/null and b/.gitbook/assets/2.15-settings-authlogs.gif differ diff --git a/.gitbook/assets/2.15-settings-cloud-aws-add.png b/.gitbook/assets/2.15-settings-cloud-aws-add.png new file mode 100644 index 00000000..da4c2e12 Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-aws-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-azure-add.png b/.gitbook/assets/2.15-settings-cloud-azure-add.png new file mode 100644 index 00000000..880a456c Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-azure-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-civo-add.png b/.gitbook/assets/2.15-settings-cloud-civo-add.png new file mode 100644 index 00000000..3780982b Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-civo-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-digitalocean-add.png b/.gitbook/assets/2.15-settings-cloud-digitalocean-add.png new file mode 100644 index 00000000..9ea490a3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-digitalocean-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-googlecloud-add.png b/.gitbook/assets/2.15-settings-cloud-googlecloud-add.png new file mode 100644 index 00000000..670f7937 Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-googlecloud-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-linode-add.png b/.gitbook/assets/2.15-settings-cloud-linode-add.png new file mode 100644 index 00000000..6171e6a5 Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-linode-add.png differ diff --git a/.gitbook/assets/2.15-settings-cloud-list.png b/.gitbook/assets/2.15-settings-cloud-list.png new file mode 100644 index 00000000..a0ad9f8a Binary files /dev/null and b/.gitbook/assets/2.15-settings-cloud-list.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-aeec-config-2.png b/.gitbook/assets/2.15-settings-edgecompute-aeec-config-2.png new file mode 100644 index 00000000..20c4471c Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-aeec-config-2.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-aeec-config.png b/.gitbook/assets/2.15-settings-edgecompute-aeec-config.png new file mode 100644 index 00000000..7e02272d Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-aeec-config.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-deployment.png b/.gitbook/assets/2.15-settings-edgecompute-deployment.png new file mode 100644 index 00000000..78cf66ff Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-deployment.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-fdo-profile-edit.png b/.gitbook/assets/2.15-settings-edgecompute-fdo-profile-edit.png new file mode 100644 index 00000000..2de49231 Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-fdo-profile-edit.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-fdo-profiles.png b/.gitbook/assets/2.15-settings-edgecompute-fdo-profiles.png new file mode 100644 index 00000000..1420ebb5 Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-fdo-profiles.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-fdo.png b/.gitbook/assets/2.15-settings-edgecompute-fdo.png new file mode 100644 index 00000000..ee0da507 Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-fdo.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-openamt.png b/.gitbook/assets/2.15-settings-edgecompute-openamt.png new file mode 100644 index 00000000..c3c0e758 Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-openamt.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute-settings.png b/.gitbook/assets/2.15-settings-edgecompute-settings.png new file mode 100644 index 00000000..00f373c7 Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute-settings.png differ diff --git a/.gitbook/assets/2.15-settings-edgecompute.gif b/.gitbook/assets/2.15-settings-edgecompute.gif new file mode 100644 index 00000000..ef1b438c Binary files /dev/null and b/.gitbook/assets/2.15-settings-edgecompute.gif differ diff --git a/.gitbook/assets/2.15-settings-env-access-create.png b/.gitbook/assets/2.15-settings-env-access-create.png new file mode 100644 index 00000000..d6014d6b Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-access-create.png differ diff --git a/.gitbook/assets/2.15-settings-env-access.gif b/.gitbook/assets/2.15-settings-env-access.gif new file mode 100644 index 00000000..4426fa1d Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-access.gif differ diff --git a/.gitbook/assets/2.15-settings-env-addenv-edge-details.png b/.gitbook/assets/2.15-settings-env-addenv-edge-details.png new file mode 100644 index 00000000..143028b2 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-addenv-edge-details.png differ diff --git a/.gitbook/assets/2.15-settings-env-addenv-edge-more.png b/.gitbook/assets/2.15-settings-env-addenv-edge-more.png new file mode 100644 index 00000000..e5056193 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-addenv-edge-more.png differ diff --git a/.gitbook/assets/2.15-settings-env-addenv-edge-name.png b/.gitbook/assets/2.15-settings-env-addenv-edge-name.png new file mode 100644 index 00000000..72f0f1a4 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-addenv-edge-name.png differ diff --git a/.gitbook/assets/2.15-settings-env-addenv.gif b/.gitbook/assets/2.15-settings-env-addenv.gif new file mode 100644 index 00000000..3fb819d7 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-addenv.gif differ diff --git a/.gitbook/assets/2.15-settings-env-groupaccess.gif b/.gitbook/assets/2.15-settings-env-groupaccess.gif new file mode 100644 index 00000000..371c1f08 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-groupaccess.gif differ diff --git a/.gitbook/assets/2.15-settings-env-groups-add.gif b/.gitbook/assets/2.15-settings-env-groups-add.gif new file mode 100644 index 00000000..c1b66d10 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-groups-add.gif differ diff --git a/.gitbook/assets/2.15-settings-env-groups-add.png b/.gitbook/assets/2.15-settings-env-groups-add.png new file mode 100644 index 00000000..1bc77977 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-groups-add.png differ diff --git a/.gitbook/assets/2.15-settings-env-tags-tagenv.gif b/.gitbook/assets/2.15-settings-env-tags-tagenv.gif new file mode 100644 index 00000000..39bad55d Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-tags-tagenv.gif differ diff --git a/.gitbook/assets/2.15-settings-env-tags.gif b/.gitbook/assets/2.15-settings-env-tags.gif new file mode 100644 index 00000000..d213b3d9 Binary files /dev/null and b/.gitbook/assets/2.15-settings-env-tags.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-azure-details.png b/.gitbook/assets/2.15-settings-registries-add-azure-details.png new file mode 100644 index 00000000..98031776 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-azure-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-azure.gif b/.gitbook/assets/2.15-settings-registries-add-azure.gif new file mode 100644 index 00000000..75b0ece3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-azure.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-custom-details.png b/.gitbook/assets/2.15-settings-registries-add-custom-details.png new file mode 100644 index 00000000..956cf14b Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-custom-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-custom.gif b/.gitbook/assets/2.15-settings-registries-add-custom.gif new file mode 100644 index 00000000..5cc6d361 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-custom.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-dockerhub-details.png b/.gitbook/assets/2.15-settings-registries-add-dockerhub-details.png new file mode 100644 index 00000000..bfa6cfde Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-dockerhub-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-dockerhub.gif b/.gitbook/assets/2.15-settings-registries-add-dockerhub.gif new file mode 100644 index 00000000..160c439c Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-dockerhub.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-ecr-details.png b/.gitbook/assets/2.15-settings-registries-add-ecr-details.png new file mode 100644 index 00000000..c2d4c4f0 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-ecr-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-ecr.gif b/.gitbook/assets/2.15-settings-registries-add-ecr.gif new file mode 100644 index 00000000..071fb400 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-ecr.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-gitlab-details.png b/.gitbook/assets/2.15-settings-registries-add-gitlab-details.png new file mode 100644 index 00000000..24c80f55 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-gitlab-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-gitlab.gif b/.gitbook/assets/2.15-settings-registries-add-gitlab.gif new file mode 100644 index 00000000..fd5b13d2 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-gitlab.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-proget-details.png b/.gitbook/assets/2.15-settings-registries-add-proget-details.png new file mode 100644 index 00000000..acef99aa Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-proget-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-proget.gif b/.gitbook/assets/2.15-settings-registries-add-proget.gif new file mode 100644 index 00000000..d1c67394 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-proget.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add-quay-details.png b/.gitbook/assets/2.15-settings-registries-add-quay-details.png new file mode 100644 index 00000000..405566f5 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-quay-details.png differ diff --git a/.gitbook/assets/2.15-settings-registries-add-quay.gif b/.gitbook/assets/2.15-settings-registries-add-quay.gif new file mode 100644 index 00000000..91691321 Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add-quay.gif differ diff --git a/.gitbook/assets/2.15-settings-registries-add.gif b/.gitbook/assets/2.15-settings-registries-add.gif new file mode 100644 index 00000000..7bb5161e Binary files /dev/null and b/.gitbook/assets/2.15-settings-registries-add.gif differ diff --git a/.gitbook/assets/2.15-settings-settings-1.png b/.gitbook/assets/2.15-settings-settings-1.png new file mode 100644 index 00000000..e1358271 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-1.png differ diff --git a/.gitbook/assets/2.15-settings-settings-2.png b/.gitbook/assets/2.15-settings-settings-2.png new file mode 100644 index 00000000..818ac30a Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-2.png differ diff --git a/.gitbook/assets/2.15-settings-settings-3.png b/.gitbook/assets/2.15-settings-settings-3.png new file mode 100644 index 00000000..99536d17 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-3.png differ diff --git a/.gitbook/assets/2.15-settings-settings-4.png b/.gitbook/assets/2.15-settings-settings-4.png new file mode 100644 index 00000000..30f77c3a Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-4.png differ diff --git a/.gitbook/assets/2.15-settings-settings-backup-s3.png b/.gitbook/assets/2.15-settings-settings-backup-s3.png new file mode 100644 index 00000000..c87e95f0 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-backup-s3.png differ diff --git a/.gitbook/assets/2.15-settings-settings-backup.gif b/.gitbook/assets/2.15-settings-settings-backup.gif new file mode 100644 index 00000000..6f6ed9f8 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-backup.gif differ diff --git a/.gitbook/assets/2.15-settings-settings-hiddencontainers.png b/.gitbook/assets/2.15-settings-settings-hiddencontainers.png new file mode 100644 index 00000000..4be271da Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-hiddencontainers.png differ diff --git a/.gitbook/assets/2.15-settings-settings-ssl-1.png b/.gitbook/assets/2.15-settings-settings-ssl-1.png new file mode 100644 index 00000000..84f0b8e3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-ssl-1.png differ diff --git a/.gitbook/assets/2.15-settings-settings-ssl-force.png b/.gitbook/assets/2.15-settings-settings-ssl-force.png new file mode 100644 index 00000000..ef9648b0 Binary files /dev/null and b/.gitbook/assets/2.15-settings-settings-ssl-force.png differ diff --git a/.gitbook/assets/2.15-settings-users-add.gif b/.gitbook/assets/2.15-settings-users-add.gif new file mode 100644 index 00000000..f7693b20 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-add.gif differ diff --git a/.gitbook/assets/2.15-settings-users-add.png b/.gitbook/assets/2.15-settings-users-add.png new file mode 100644 index 00000000..c283c8ff Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-add.png differ diff --git a/.gitbook/assets/2.15-settings-users-changepw (1).png b/.gitbook/assets/2.15-settings-users-changepw (1).png new file mode 100644 index 00000000..274864e5 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-changepw (1).png differ diff --git a/.gitbook/assets/2.15-settings-users-changepw.png b/.gitbook/assets/2.15-settings-users-changepw.png new file mode 100644 index 00000000..274864e5 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-changepw.png differ diff --git a/.gitbook/assets/2.15-settings-users-promote.gif b/.gitbook/assets/2.15-settings-users-promote.gif new file mode 100644 index 00000000..aa0390a9 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-promote.gif differ diff --git a/.gitbook/assets/2.15-settings-users-promote.png b/.gitbook/assets/2.15-settings-users-promote.png new file mode 100644 index 00000000..6dcb2fc3 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-promote.png differ diff --git a/.gitbook/assets/2.15-settings-users-roles-access.png b/.gitbook/assets/2.15-settings-users-roles-access.png new file mode 100644 index 00000000..4b076e02 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-roles-access.png differ diff --git a/.gitbook/assets/2.15-settings-users-roles.gif b/.gitbook/assets/2.15-settings-users-roles.gif new file mode 100644 index 00000000..d7d35304 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-roles.gif differ diff --git a/.gitbook/assets/2.15-settings-users-roles.png b/.gitbook/assets/2.15-settings-users-roles.png new file mode 100644 index 00000000..577263c4 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-roles.png differ diff --git a/.gitbook/assets/2.15-settings-users-teams-add.png b/.gitbook/assets/2.15-settings-users-teams-add.png new file mode 100644 index 00000000..1f7d1fe4 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-teams-add.png differ diff --git a/.gitbook/assets/2.15-settings-users-teams-adduser.png b/.gitbook/assets/2.15-settings-users-teams-adduser.png new file mode 100644 index 00000000..da8a99e6 Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-teams-adduser.png differ diff --git a/.gitbook/assets/2.15-settings-users-teams.gif b/.gitbook/assets/2.15-settings-users-teams.gif new file mode 100644 index 00000000..8a1db34f Binary files /dev/null and b/.gitbook/assets/2.15-settings-users-teams.gif differ diff --git a/.gitbook/assets/2.15-stack-migrate-confirm.png b/.gitbook/assets/2.15-stack-migrate-confirm.png new file mode 100644 index 00000000..716d6a65 Binary files /dev/null and b/.gitbook/assets/2.15-stack-migrate-confirm.png differ diff --git a/.gitbook/assets/2.15-stack-remove-confirm.png b/.gitbook/assets/2.15-stack-remove-confirm.png new file mode 100644 index 00000000..66bbec1e Binary files /dev/null and b/.gitbook/assets/2.15-stack-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-stats.png b/.gitbook/assets/2.15-stats.png new file mode 100644 index 00000000..6139f0ad Binary files /dev/null and b/.gitbook/assets/2.15-stats.png differ diff --git a/.gitbook/assets/2.15-swarm-clusterstatus.png b/.gitbook/assets/2.15-swarm-clusterstatus.png new file mode 100644 index 00000000..f59b53a1 Binary files /dev/null and b/.gitbook/assets/2.15-swarm-clusterstatus.png differ diff --git a/.gitbook/assets/2.15-swarm-nodedetail-detail.png b/.gitbook/assets/2.15-swarm-nodedetail-detail.png new file mode 100644 index 00000000..5ca1624a Binary files /dev/null and b/.gitbook/assets/2.15-swarm-nodedetail-detail.png differ diff --git a/.gitbook/assets/2.15-swarm-nodedetail-engine.png b/.gitbook/assets/2.15-swarm-nodedetail-engine.png new file mode 100644 index 00000000..9d243b35 Binary files /dev/null and b/.gitbook/assets/2.15-swarm-nodedetail-engine.png differ diff --git a/.gitbook/assets/2.15-swarm-nodedetail.png b/.gitbook/assets/2.15-swarm-nodedetail.png new file mode 100644 index 00000000..6147d355 Binary files /dev/null and b/.gitbook/assets/2.15-swarm-nodedetail.png differ diff --git a/.gitbook/assets/2.15-swarm-nodes.png b/.gitbook/assets/2.15-swarm-nodes.png new file mode 100644 index 00000000..bd9911f5 Binary files /dev/null and b/.gitbook/assets/2.15-swarm-nodes.png differ diff --git a/.gitbook/assets/2.15-swarm_cluster (1).png b/.gitbook/assets/2.15-swarm_cluster (1).png new file mode 100644 index 00000000..50c540fd Binary files /dev/null and b/.gitbook/assets/2.15-swarm_cluster (1).png differ diff --git a/.gitbook/assets/2.15-swarm_cluster.png b/.gitbook/assets/2.15-swarm_cluster.png new file mode 100644 index 00000000..50c540fd Binary files /dev/null and b/.gitbook/assets/2.15-swarm_cluster.png differ diff --git a/.gitbook/assets/2.15-swarm_cluster_visual.png b/.gitbook/assets/2.15-swarm_cluster_visual.png new file mode 100644 index 00000000..23b45e08 Binary files /dev/null and b/.gitbook/assets/2.15-swarm_cluster_visual.png differ diff --git a/.gitbook/assets/2.15-swarm_env_url.png b/.gitbook/assets/2.15-swarm_env_url.png new file mode 100644 index 00000000..37c58bcb Binary files /dev/null and b/.gitbook/assets/2.15-swarm_env_url.png differ diff --git a/.gitbook/assets/2.15-swarm_more_settings.png b/.gitbook/assets/2.15-swarm_more_settings.png new file mode 100644 index 00000000..4c0f627f Binary files /dev/null and b/.gitbook/assets/2.15-swarm_more_settings.png differ diff --git a/.gitbook/assets/2.15-swarm_window_agent.png b/.gitbook/assets/2.15-swarm_window_agent.png new file mode 100644 index 00000000..1eabdbe4 Binary files /dev/null and b/.gitbook/assets/2.15-swarm_window_agent.png differ diff --git a/.gitbook/assets/2.15-ui-addregistry-comparison.gif b/.gitbook/assets/2.15-ui-addregistry-comparison.gif new file mode 100644 index 00000000..f5132c3b Binary files /dev/null and b/.gitbook/assets/2.15-ui-addregistry-comparison.gif differ diff --git a/.gitbook/assets/2.15-ui-applist-comparison.gif b/.gitbook/assets/2.15-ui-applist-comparison.gif new file mode 100644 index 00000000..13228e5c Binary files /dev/null and b/.gitbook/assets/2.15-ui-applist-comparison.gif differ diff --git a/.gitbook/assets/2.15-ui-auth-comparison.gif b/.gitbook/assets/2.15-ui-auth-comparison.gif new file mode 100644 index 00000000..578802ba Binary files /dev/null and b/.gitbook/assets/2.15-ui-auth-comparison.gif differ diff --git a/.gitbook/assets/2.15-ui-home-comparison.gif b/.gitbook/assets/2.15-ui-home-comparison.gif new file mode 100644 index 00000000..f67dc046 Binary files /dev/null and b/.gitbook/assets/2.15-ui-home-comparison.gif differ diff --git a/.gitbook/assets/2.15-upgrade-edge-edgeinfo.png b/.gitbook/assets/2.15-upgrade-edge-edgeinfo.png new file mode 100644 index 00000000..c3659c11 Binary files /dev/null and b/.gitbook/assets/2.15-upgrade-edge-edgeinfo.png differ diff --git a/.gitbook/assets/2.15-upgrade-nomad-deploy.png b/.gitbook/assets/2.15-upgrade-nomad-deploy.png new file mode 100644 index 00000000..b32e6ed9 Binary files /dev/null and b/.gitbook/assets/2.15-upgrade-nomad-deploy.png differ diff --git a/.gitbook/assets/2.15-upgrade-nomad-disassociate-warning.png b/.gitbook/assets/2.15-upgrade-nomad-disassociate-warning.png new file mode 100644 index 00000000..aeb13b7d Binary files /dev/null and b/.gitbook/assets/2.15-upgrade-nomad-disassociate-warning.png differ diff --git a/.gitbook/assets/2.15-upgrade-nomad-edgeinfo.png b/.gitbook/assets/2.15-upgrade-nomad-edgeinfo.png new file mode 100644 index 00000000..65350a87 Binary files /dev/null and b/.gitbook/assets/2.15-upgrade-nomad-edgeinfo.png differ diff --git a/.gitbook/assets/2.15-volumes-remove-confirm.png b/.gitbook/assets/2.15-volumes-remove-confirm.png new file mode 100644 index 00000000..2436aa5a Binary files /dev/null and b/.gitbook/assets/2.15-volumes-remove-confirm.png differ diff --git a/.gitbook/assets/2.15-whatsnew-async.png b/.gitbook/assets/2.15-whatsnew-async.png new file mode 100644 index 00000000..57ae1fc0 Binary files /dev/null and b/.gitbook/assets/2.15-whatsnew-async.png differ diff --git a/.gitbook/assets/2.15-whatsnew-filters.png b/.gitbook/assets/2.15-whatsnew-filters.png new file mode 100644 index 00000000..ceaad709 Binary files /dev/null and b/.gitbook/assets/2.15-whatsnew-filters.png differ diff --git a/.gitbook/assets/2.15-whatsnew-gpu.png b/.gitbook/assets/2.15-whatsnew-gpu.png new file mode 100644 index 00000000..dcd2869e Binary files /dev/null and b/.gitbook/assets/2.15-whatsnew-gpu.png differ diff --git a/.gitbook/assets/2.15-whatsnew-podsec.png b/.gitbook/assets/2.15-whatsnew-podsec.png new file mode 100644 index 00000000..258fe722 Binary files /dev/null and b/.gitbook/assets/2.15-whatsnew-podsec.png differ diff --git a/.gitbook/assets/2.15-whatsnew-search.png b/.gitbook/assets/2.15-whatsnew-search.png new file mode 100644 index 00000000..a8816b70 Binary files /dev/null and b/.gitbook/assets/2.15-whatsnew-search.png differ diff --git a/.gitbook/assets/2.16-Ingress-add-form.gif b/.gitbook/assets/2.16-Ingress-add-form.gif new file mode 100644 index 00000000..f3fb39eb Binary files /dev/null and b/.gitbook/assets/2.16-Ingress-add-form.gif differ diff --git a/.gitbook/assets/2.16-account-gitcreds-add.png b/.gitbook/assets/2.16-account-gitcreds-add.png new file mode 100644 index 00000000..e6c3666d Binary files /dev/null and b/.gitbook/assets/2.16-account-gitcreds-add.png differ diff --git a/.gitbook/assets/2.16-account-gitcreds.png b/.gitbook/assets/2.16-account-gitcreds.png new file mode 100644 index 00000000..507ff0d3 Binary files /dev/null and b/.gitbook/assets/2.16-account-gitcreds.png differ diff --git a/.gitbook/assets/2.16-applications-edit-gitredeploy.png b/.gitbook/assets/2.16-applications-edit-gitredeploy.png new file mode 100644 index 00000000..3ef1dd6d Binary files /dev/null and b/.gitbook/assets/2.16-applications-edit-gitredeploy.png differ diff --git a/.gitbook/assets/2.16-applications-manifest-gitdetails.png b/.gitbook/assets/2.16-applications-manifest-gitdetails.png new file mode 100644 index 00000000..ba3ba36f Binary files /dev/null and b/.gitbook/assets/2.16-applications-manifest-gitdetails.png differ diff --git a/.gitbook/assets/2.16-containers-advanced-runtime.png b/.gitbook/assets/2.16-containers-advanced-runtime.png new file mode 100644 index 00000000..519622d2 Binary files /dev/null and b/.gitbook/assets/2.16-containers-advanced-runtime.png differ diff --git a/.gitbook/assets/2.16-docker-host-setup-other.png b/.gitbook/assets/2.16-docker-host-setup-other.png new file mode 100644 index 00000000..530ba450 Binary files /dev/null and b/.gitbook/assets/2.16-docker-host-setup-other.png differ diff --git a/.gitbook/assets/2.16-docker_images_build_upload.png b/.gitbook/assets/2.16-docker_images_build_upload.png new file mode 100644 index 00000000..3f0c8fb2 Binary files /dev/null and b/.gitbook/assets/2.16-docker_images_build_upload.png differ diff --git a/.gitbook/assets/2.16-edge_devices_browse_snap_action_button.png b/.gitbook/assets/2.16-edge_devices_browse_snap_action_button.png new file mode 100644 index 00000000..bab37521 Binary files /dev/null and b/.gitbook/assets/2.16-edge_devices_browse_snap_action_button.png differ diff --git a/.gitbook/assets/2.16-edge_devices_browse_snaps.gif b/.gitbook/assets/2.16-edge_devices_browse_snaps.gif new file mode 100644 index 00000000..abfd0ba4 Binary files /dev/null and b/.gitbook/assets/2.16-edge_devices_browse_snaps.gif differ diff --git a/.gitbook/assets/2.16-edge_devices_browse_snaps_dashboard.png b/.gitbook/assets/2.16-edge_devices_browse_snaps_dashboard.png new file mode 100644 index 00000000..c66da805 Binary files /dev/null and b/.gitbook/assets/2.16-edge_devices_browse_snaps_dashboard.png differ diff --git a/.gitbook/assets/2.16-edge_devices_browse_snapshots_edge_device.png b/.gitbook/assets/2.16-edge_devices_browse_snapshots_edge_device.png new file mode 100644 index 00000000..4be0c2eb Binary files /dev/null and b/.gitbook/assets/2.16-edge_devices_browse_snapshots_edge_device.png differ diff --git a/.gitbook/assets/2.16-environments-add (1).gif b/.gitbook/assets/2.16-environments-add (1).gif new file mode 100644 index 00000000..bde55152 Binary files /dev/null and b/.gitbook/assets/2.16-environments-add (1).gif differ diff --git a/.gitbook/assets/2.16-environments-add-docker-agent.png b/.gitbook/assets/2.16-environments-add-docker-agent.png new file mode 100644 index 00000000..0af7d702 Binary files /dev/null and b/.gitbook/assets/2.16-environments-add-docker-agent.png differ diff --git a/.gitbook/assets/2.16-environments-add-docker-api.png b/.gitbook/assets/2.16-environments-add-docker-api.png new file mode 100644 index 00000000..e7f5c4e4 Binary files /dev/null and b/.gitbook/assets/2.16-environments-add-docker-api.png differ diff --git a/.gitbook/assets/2.16-environments-add-swarm-agent-wcs.png b/.gitbook/assets/2.16-environments-add-swarm-agent-wcs.png new file mode 100644 index 00000000..c00525b9 Binary files /dev/null and b/.gitbook/assets/2.16-environments-add-swarm-agent-wcs.png differ diff --git a/.gitbook/assets/2.16-environments-add-swarm-agent.png b/.gitbook/assets/2.16-environments-add-swarm-agent.png new file mode 100644 index 00000000..ef497b7b Binary files /dev/null and b/.gitbook/assets/2.16-environments-add-swarm-agent.png differ diff --git a/.gitbook/assets/2.16-environments-add.gif b/.gitbook/assets/2.16-environments-add.gif new file mode 100644 index 00000000..bde55152 Binary files /dev/null and b/.gitbook/assets/2.16-environments-add.gif differ diff --git a/.gitbook/assets/2.16-images-build-upload.png b/.gitbook/assets/2.16-images-build-upload.png new file mode 100644 index 00000000..776d3b17 Binary files /dev/null and b/.gitbook/assets/2.16-images-build-upload.png differ diff --git a/.gitbook/assets/2.16-ingress-form-baseconf.png b/.gitbook/assets/2.16-ingress-form-baseconf.png new file mode 100644 index 00000000..47c650b6 Binary files /dev/null and b/.gitbook/assets/2.16-ingress-form-baseconf.png differ diff --git a/.gitbook/assets/2.16-ingress-manifest.gif b/.gitbook/assets/2.16-ingress-manifest.gif new file mode 100644 index 00000000..78f1e741 Binary files /dev/null and b/.gitbook/assets/2.16-ingress-manifest.gif differ diff --git a/.gitbook/assets/2.16-ingress-remove.gif b/.gitbook/assets/2.16-ingress-remove.gif new file mode 100644 index 00000000..eff182df Binary files /dev/null and b/.gitbook/assets/2.16-ingress-remove.gif differ diff --git a/.gitbook/assets/2.16-install-agent-swarm-linux-connect.png b/.gitbook/assets/2.16-install-agent-swarm-linux-connect.png new file mode 100644 index 00000000..736ac30e Binary files /dev/null and b/.gitbook/assets/2.16-install-agent-swarm-linux-connect.png differ diff --git a/.gitbook/assets/2.16-k8s-ingress-main.png b/.gitbook/assets/2.16-k8s-ingress-main.png new file mode 100644 index 00000000..ce2c117b Binary files /dev/null and b/.gitbook/assets/2.16-k8s-ingress-main.png differ diff --git a/.gitbook/assets/2.16-k8s-ingress-manifest-template.png b/.gitbook/assets/2.16-k8s-ingress-manifest-template.png new file mode 100644 index 00000000..3bc20365 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-ingress-manifest-template.png differ diff --git a/.gitbook/assets/2.16-k8s-ingress-manifest-webeditor.png b/.gitbook/assets/2.16-k8s-ingress-manifest-webeditor.png new file mode 100644 index 00000000..c36d18c3 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-ingress-manifest-webeditor.png differ diff --git a/.gitbook/assets/2.16-k8s-ingress-rule.png b/.gitbook/assets/2.16-k8s-ingress-rule.png new file mode 100644 index 00000000..2a53b202 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-ingress-rule.png differ diff --git a/.gitbook/assets/2.16-k8s-secret-add.png b/.gitbook/assets/2.16-k8s-secret-add.png new file mode 100644 index 00000000..94428d77 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-secret-add.png differ diff --git a/.gitbook/assets/2.16-k8s-secret-data-adv.png b/.gitbook/assets/2.16-k8s-secret-data-adv.png new file mode 100644 index 00000000..261a72e7 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-secret-data-adv.png differ diff --git a/.gitbook/assets/2.16-k8s-secret-data.png b/.gitbook/assets/2.16-k8s-secret-data.png new file mode 100644 index 00000000..530b50c7 Binary files /dev/null and b/.gitbook/assets/2.16-k8s-secret-data.png differ diff --git a/.gitbook/assets/2.16-k8scluster-setup-networking (1).png b/.gitbook/assets/2.16-k8scluster-setup-networking (1).png new file mode 100644 index 00000000..1e81214c Binary files /dev/null and b/.gitbook/assets/2.16-k8scluster-setup-networking (1).png differ diff --git a/.gitbook/assets/2.16-k8scluster-setup-networking.png b/.gitbook/assets/2.16-k8scluster-setup-networking.png new file mode 100644 index 00000000..b4f97e2e Binary files /dev/null and b/.gitbook/assets/2.16-k8scluster-setup-networking.png differ diff --git a/.gitbook/assets/2.16-kubernetes-applications-add-publish.png b/.gitbook/assets/2.16-kubernetes-applications-add-publish.png new file mode 100644 index 00000000..804ed9c4 Binary files /dev/null and b/.gitbook/assets/2.16-kubernetes-applications-add-publish.png differ diff --git a/.gitbook/assets/2.16-notification-icon.png b/.gitbook/assets/2.16-notification-icon.png new file mode 100644 index 00000000..6e590c03 Binary files /dev/null and b/.gitbook/assets/2.16-notification-icon.png differ diff --git a/.gitbook/assets/2.16-notifications.png b/.gitbook/assets/2.16-notifications.png new file mode 100644 index 00000000..373d2a61 Binary files /dev/null and b/.gitbook/assets/2.16-notifications.png differ diff --git a/.gitbook/assets/2.16-settings-login-screen-banner-example.png b/.gitbook/assets/2.16-settings-login-screen-banner-example.png new file mode 100644 index 00000000..67c2c1ad Binary files /dev/null and b/.gitbook/assets/2.16-settings-login-screen-banner-example.png differ diff --git a/.gitbook/assets/2.16-settings-login-screen-banner.png b/.gitbook/assets/2.16-settings-login-screen-banner.png new file mode 100644 index 00000000..9ada66a7 Binary files /dev/null and b/.gitbook/assets/2.16-settings-login-screen-banner.png differ diff --git a/.gitbook/assets/2.16-stacks-add-gitcreds.png b/.gitbook/assets/2.16-stacks-add-gitcreds.png new file mode 100644 index 00000000..1f068dd4 Binary files /dev/null and b/.gitbook/assets/2.16-stacks-add-gitcreds.png differ diff --git a/.gitbook/assets/2.16-stacks-add-gitdetails.png b/.gitbook/assets/2.16-stacks-add-gitdetails.png new file mode 100644 index 00000000..257b23cd Binary files /dev/null and b/.gitbook/assets/2.16-stacks-add-gitdetails.png differ diff --git a/.gitbook/assets/2.16-whatsnew-asyncremote.png b/.gitbook/assets/2.16-whatsnew-asyncremote.png new file mode 100644 index 00000000..65606c61 Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-asyncremote.png differ diff --git a/.gitbook/assets/2.16-whatsnew-gitcreds.png b/.gitbook/assets/2.16-whatsnew-gitcreds.png new file mode 100644 index 00000000..d515df65 Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-gitcreds.png differ diff --git a/.gitbook/assets/2.16-whatsnew-ingress.png b/.gitbook/assets/2.16-whatsnew-ingress.png new file mode 100644 index 00000000..3af9c03a Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-ingress.png differ diff --git a/.gitbook/assets/2.16-whatsnew-loginbanner.png b/.gitbook/assets/2.16-whatsnew-loginbanner.png new file mode 100644 index 00000000..17966a89 Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-loginbanner.png differ diff --git a/.gitbook/assets/2.16-whatsnew-notificationlog.png b/.gitbook/assets/2.16-whatsnew-notificationlog.png new file mode 100644 index 00000000..e6d12a82 Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-notificationlog.png differ diff --git a/.gitbook/assets/2.16-whatsnew-secrettypes.png b/.gitbook/assets/2.16-whatsnew-secrettypes.png new file mode 100644 index 00000000..e3918b1d Binary files /dev/null and b/.gitbook/assets/2.16-whatsnew-secrettypes.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-AD.png b/.gitbook/assets/2.17-AzureOauth-AD.png new file mode 100644 index 00000000..c4e08342 Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-AD.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S1.png b/.gitbook/assets/2.17-AzureOauth-NewReg-S1.png new file mode 100644 index 00000000..c95091d0 Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S1.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S2.png b/.gitbook/assets/2.17-AzureOauth-NewReg-S2.png new file mode 100644 index 00000000..2532866d Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S2.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S3.png b/.gitbook/assets/2.17-AzureOauth-NewReg-S3.png new file mode 100644 index 00000000..a938c422 Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S3.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S4.png b/.gitbook/assets/2.17-AzureOauth-NewReg-S4.png new file mode 100644 index 00000000..08b0cbfb Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S4.png differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S5.gif b/.gitbook/assets/2.17-AzureOauth-NewReg-S5.gif new file mode 100644 index 00000000..6c605c69 Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S5.gif differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg-S6.gif b/.gitbook/assets/2.17-AzureOauth-NewReg-S6.gif new file mode 100644 index 00000000..1480e734 Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg-S6.gif differ diff --git a/.gitbook/assets/2.17-AzureOauth-NewReg.png b/.gitbook/assets/2.17-AzureOauth-NewReg.png new file mode 100644 index 00000000..f8520f1a Binary files /dev/null and b/.gitbook/assets/2.17-AzureOauth-NewReg.png differ diff --git a/.gitbook/assets/2.17-admin-environments-update.gif b/.gitbook/assets/2.17-admin-environments-update.gif new file mode 100644 index 00000000..f84afb4a Binary files /dev/null and b/.gitbook/assets/2.17-admin-environments-update.gif differ diff --git a/.gitbook/assets/2.17-admin-settings-backup-s3-restore.png b/.gitbook/assets/2.17-admin-settings-backup-s3-restore.png new file mode 100644 index 00000000..6a2e18c6 Binary files /dev/null and b/.gitbook/assets/2.17-admin-settings-backup-s3-restore.png differ diff --git a/.gitbook/assets/2.17-admin-settings-backup-s3.png b/.gitbook/assets/2.17-admin-settings-backup-s3.png new file mode 100644 index 00000000..bc5357b7 Binary files /dev/null and b/.gitbook/assets/2.17-admin-settings-backup-s3.png differ diff --git a/.gitbook/assets/2.17-admin-settings-kubernetes-deployment.png b/.gitbook/assets/2.17-admin-settings-kubernetes-deployment.png new file mode 100644 index 00000000..f4a7e5b7 Binary files /dev/null and b/.gitbook/assets/2.17-admin-settings-kubernetes-deployment.png differ diff --git a/.gitbook/assets/2.17-admin-settings-kubernetes-deploymentoptions.png b/.gitbook/assets/2.17-admin-settings-kubernetes-deploymentoptions.png new file mode 100644 index 00000000..35a49555 Binary files /dev/null and b/.gitbook/assets/2.17-admin-settings-kubernetes-deploymentoptions.png differ diff --git a/.gitbook/assets/2.17-admin-settings-kubernetes-kubeconfig.png b/.gitbook/assets/2.17-admin-settings-kubernetes-kubeconfig.png new file mode 100644 index 00000000..aa445878 Binary files /dev/null and b/.gitbook/assets/2.17-admin-settings-kubernetes-kubeconfig.png differ diff --git a/.gitbook/assets/2.17-containers-logs-options.png b/.gitbook/assets/2.17-containers-logs-options.png new file mode 100644 index 00000000..f34136ef Binary files /dev/null and b/.gitbook/assets/2.17-containers-logs-options.png differ diff --git a/.gitbook/assets/2.17-containers-logs-search.png b/.gitbook/assets/2.17-containers-logs-search.png new file mode 100644 index 00000000..1b01b40e Binary files /dev/null and b/.gitbook/assets/2.17-containers-logs-search.png differ diff --git a/.gitbook/assets/2.17-containers-logs.gif b/.gitbook/assets/2.17-containers-logs.gif new file mode 100644 index 00000000..7f4c782b Binary files /dev/null and b/.gitbook/assets/2.17-containers-logs.gif differ diff --git a/.gitbook/assets/2.17-docker-stacks-add-git-auto-polling.png b/.gitbook/assets/2.17-docker-stacks-add-git-auto-polling.png new file mode 100644 index 00000000..0a5a6ffe Binary files /dev/null and b/.gitbook/assets/2.17-docker-stacks-add-git-auto-polling.png differ diff --git a/.gitbook/assets/2.17-docker-stacks-add-git-auto-repull-force.png b/.gitbook/assets/2.17-docker-stacks-add-git-auto-repull-force.png new file mode 100644 index 00000000..acd63a27 Binary files /dev/null and b/.gitbook/assets/2.17-docker-stacks-add-git-auto-repull-force.png differ diff --git a/.gitbook/assets/2.17-docker-stacks-add-git-auto-webhook.png b/.gitbook/assets/2.17-docker-stacks-add-git-auto-webhook.png new file mode 100644 index 00000000..7b3d15b8 Binary files /dev/null and b/.gitbook/assets/2.17-docker-stacks-add-git-auto-webhook.png differ diff --git a/.gitbook/assets/2.17-docker-stacks-edit-git.png b/.gitbook/assets/2.17-docker-stacks-edit-git.png new file mode 100644 index 00000000..64e8a270 Binary files /dev/null and b/.gitbook/assets/2.17-docker-stacks-edit-git.png differ diff --git a/.gitbook/assets/2.17-edge-jobs-groups.png b/.gitbook/assets/2.17-edge-jobs-groups.png new file mode 100644 index 00000000..3bafdd8e Binary files /dev/null and b/.gitbook/assets/2.17-edge-jobs-groups.png differ diff --git a/.gitbook/assets/2.17-edge-stacks-prepull.png b/.gitbook/assets/2.17-edge-stacks-prepull.png new file mode 100644 index 00000000..f89545c1 Binary files /dev/null and b/.gitbook/assets/2.17-edge-stacks-prepull.png differ diff --git a/.gitbook/assets/2.17-environments-update-add.png b/.gitbook/assets/2.17-environments-update-add.png new file mode 100644 index 00000000..40a7e11f Binary files /dev/null and b/.gitbook/assets/2.17-environments-update-add.png differ diff --git a/.gitbook/assets/2.17-environments-update-list.png b/.gitbook/assets/2.17-environments-update-list.png new file mode 100644 index 00000000..94d8b8aa Binary files /dev/null and b/.gitbook/assets/2.17-environments-update-list.png differ diff --git a/.gitbook/assets/2.17-environments-update-rollback.png b/.gitbook/assets/2.17-environments-update-rollback.png new file mode 100644 index 00000000..0ce3839a Binary files /dev/null and b/.gitbook/assets/2.17-environments-update-rollback.png differ diff --git a/.gitbook/assets/2.17-home-buildinfo.png b/.gitbook/assets/2.17-home-buildinfo.png new file mode 100644 index 00000000..7ea1ff12 Binary files /dev/null and b/.gitbook/assets/2.17-home-buildinfo.png differ diff --git a/.gitbook/assets/2.17-home-rightoptions.png b/.gitbook/assets/2.17-home-rightoptions.png new file mode 100644 index 00000000..d1da9f42 Binary files /dev/null and b/.gitbook/assets/2.17-home-rightoptions.png differ diff --git a/.gitbook/assets/2.17-home.png b/.gitbook/assets/2.17-home.png new file mode 100644 index 00000000..e51cb4e8 Binary files /dev/null and b/.gitbook/assets/2.17-home.png differ diff --git a/.gitbook/assets/2.17-install-agent-edge-nameurl.png b/.gitbook/assets/2.17-install-agent-edge-nameurl.png new file mode 100644 index 00000000..0c1ec778 Binary files /dev/null and b/.gitbook/assets/2.17-install-agent-edge-nameurl.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-edit-git.png b/.gitbook/assets/2.17-k8s-applications-edit-git.png new file mode 100644 index 00000000..ed05b2e9 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-edit-git.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-inspect-actions.png b/.gitbook/assets/2.17-k8s-applications-inspect-actions.png new file mode 100644 index 00000000..ea070b32 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-inspect-actions.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-inspect-yaml.png b/.gitbook/assets/2.17-k8s-applications-inspect-yaml.png new file mode 100644 index 00000000..3bf284f4 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-inspect-yaml.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-manifest-alwaysapply.png b/.gitbook/assets/2.17-k8s-applications-manifest-alwaysapply.png new file mode 100644 index 00000000..79b8d28a Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-manifest-alwaysapply.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-manifest-auto-polling.png b/.gitbook/assets/2.17-k8s-applications-manifest-auto-polling.png new file mode 100644 index 00000000..3647170c Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-manifest-auto-polling.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-manifest-auto-webhook.png b/.gitbook/assets/2.17-k8s-applications-manifest-auto-webhook.png new file mode 100644 index 00000000..a6ce77ad Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-manifest-auto-webhook.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-manifest-url.png b/.gitbook/assets/2.17-k8s-applications-manifest-url.png new file mode 100644 index 00000000..9064849d Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-manifest-url.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-manifest-webeditor.png b/.gitbook/assets/2.17-k8s-applications-manifest-webeditor.png new file mode 100644 index 00000000..9119b4fa Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-manifest-webeditor.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-webhooks-detail.png b/.gitbook/assets/2.17-k8s-applications-webhooks-detail.png new file mode 100644 index 00000000..d4f09b53 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-webhooks-detail.png differ diff --git a/.gitbook/assets/2.17-k8s-applications-webhooks.gif b/.gitbook/assets/2.17-k8s-applications-webhooks.gif new file mode 100644 index 00000000..d6809a53 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-applications-webhooks.gif differ diff --git a/.gitbook/assets/2.17-k8s-cluster-detail.png b/.gitbook/assets/2.17-k8s-cluster-detail.png new file mode 100644 index 00000000..f52faf6b Binary files /dev/null and b/.gitbook/assets/2.17-k8s-cluster-detail.png differ diff --git a/.gitbook/assets/2.17-k8s-cluster-nodeslist.png b/.gitbook/assets/2.17-k8s-cluster-nodeslist.png new file mode 100644 index 00000000..ea4944b8 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-cluster-nodeslist.png differ diff --git a/.gitbook/assets/2.17-k8s-cluster-nodestats.png b/.gitbook/assets/2.17-k8s-cluster-nodestats.png new file mode 100644 index 00000000..0e8a8360 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-cluster-nodestats.png differ diff --git a/.gitbook/assets/2.17-k8s-cluster-setup-deployment.png b/.gitbook/assets/2.17-k8s-cluster-setup-deployment.png new file mode 100644 index 00000000..67f79cc6 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-cluster-setup-deployment.png differ diff --git a/.gitbook/assets/2.17-k8s-cluster-setup-ingresses.png b/.gitbook/assets/2.17-k8s-cluster-setup-ingresses.png new file mode 100644 index 00000000..70373732 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-cluster-setup-ingresses.png differ diff --git a/.gitbook/assets/2.17-k8s-namespaces-manage-loadbalancer.png b/.gitbook/assets/2.17-k8s-namespaces-manage-loadbalancer.png new file mode 100644 index 00000000..7667682f Binary files /dev/null and b/.gitbook/assets/2.17-k8s-namespaces-manage-loadbalancer.png differ diff --git a/.gitbook/assets/2.17-k8s-namespaces-manage-quota.png b/.gitbook/assets/2.17-k8s-namespaces-manage-quota.png new file mode 100644 index 00000000..648cbbd8 Binary files /dev/null and b/.gitbook/assets/2.17-k8s-namespaces-manage-quota.png differ diff --git a/.gitbook/assets/2.17-registries-add-ghcr-details.png b/.gitbook/assets/2.17-registries-add-ghcr-details.png new file mode 100644 index 00000000..872ddaab Binary files /dev/null and b/.gitbook/assets/2.17-registries-add-ghcr-details.png differ diff --git a/.gitbook/assets/2.17-registries-add-github.gif b/.gitbook/assets/2.17-registries-add-github.gif new file mode 100644 index 00000000..685cc28b Binary files /dev/null and b/.gitbook/assets/2.17-registries-add-github.gif differ diff --git a/.gitbook/assets/2.17-services-logs.gif b/.gitbook/assets/2.17-services-logs.gif new file mode 100644 index 00000000..56482bec Binary files /dev/null and b/.gitbook/assets/2.17-services-logs.gif differ diff --git a/.gitbook/assets/2.17-settings-edge-aeec-waitingroom.png b/.gitbook/assets/2.17-settings-edge-aeec-waitingroom.png new file mode 100644 index 00000000..81051c0f Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-aeec-waitingroom.png differ diff --git a/.gitbook/assets/2.17-settings-edge-asynccheckin.png b/.gitbook/assets/2.17-settings-edge-asynccheckin.png new file mode 100644 index 00000000..89019467 Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-asynccheckin.png differ diff --git a/.gitbook/assets/2.17-settings-edge-checkin.png b/.gitbook/assets/2.17-settings-edge-checkin.png new file mode 100644 index 00000000..42488d8a Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-checkin.png differ diff --git a/.gitbook/assets/2.17-settings-edge-compute.png b/.gitbook/assets/2.17-settings-edge-compute.png new file mode 100644 index 00000000..3b8a133c Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-compute.png differ diff --git a/.gitbook/assets/2.17-settings-edge-devices-add.png b/.gitbook/assets/2.17-settings-edge-devices-add.png new file mode 100644 index 00000000..18335a47 Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-devices-add.png differ diff --git a/.gitbook/assets/2.17-settings-edge-devices-browse.png b/.gitbook/assets/2.17-settings-edge-devices-browse.png new file mode 100644 index 00000000..ce7f19ae Binary files /dev/null and b/.gitbook/assets/2.17-settings-edge-devices-browse.png differ diff --git a/.gitbook/assets/2.17-stacks-add-relativepath-swarm.png b/.gitbook/assets/2.17-stacks-add-relativepath-swarm.png new file mode 100644 index 00000000..25f81b23 Binary files /dev/null and b/.gitbook/assets/2.17-stacks-add-relativepath-swarm.png differ diff --git a/.gitbook/assets/2.17-stacks-add-relativepath.png b/.gitbook/assets/2.17-stacks-add-relativepath.png new file mode 100644 index 00000000..d6c354b0 Binary files /dev/null and b/.gitbook/assets/2.17-stacks-add-relativepath.png differ diff --git a/.gitbook/assets/2.17-upgrade-tobe-inapp-licenseform.png b/.gitbook/assets/2.17-upgrade-tobe-inapp-licenseform.png new file mode 100644 index 00000000..73ed9c3e Binary files /dev/null and b/.gitbook/assets/2.17-upgrade-tobe-inapp-licenseform.png differ diff --git a/.gitbook/assets/2.17-upgrade-tobe-inapp-licensesent.png b/.gitbook/assets/2.17-upgrade-tobe-inapp-licensesent.png new file mode 100644 index 00000000..1d4a4a24 Binary files /dev/null and b/.gitbook/assets/2.17-upgrade-tobe-inapp-licensesent.png differ diff --git a/.gitbook/assets/2.17-upgrade-tobe-inapp.gif b/.gitbook/assets/2.17-upgrade-tobe-inapp.gif new file mode 100644 index 00000000..62527201 Binary files /dev/null and b/.gitbook/assets/2.17-upgrade-tobe-inapp.gif differ diff --git a/.gitbook/assets/2.17-whatsnew-cetobe.png b/.gitbook/assets/2.17-whatsnew-cetobe.png new file mode 100644 index 00000000..7c1b7036 Binary files /dev/null and b/.gitbook/assets/2.17-whatsnew-cetobe.png differ diff --git a/.gitbook/assets/2.17-whatsnew-ghcr.png b/.gitbook/assets/2.17-whatsnew-ghcr.png new file mode 100644 index 00000000..8374b2e7 Binary files /dev/null and b/.gitbook/assets/2.17-whatsnew-ghcr.png differ diff --git a/.gitbook/assets/2.17-whatsnew-logviewer.png b/.gitbook/assets/2.17-whatsnew-logviewer.png new file mode 100644 index 00000000..0af8ad0e Binary files /dev/null and b/.gitbook/assets/2.17-whatsnew-logviewer.png differ diff --git a/.gitbook/assets/2.17-whatsnew-relativepath.png b/.gitbook/assets/2.17-whatsnew-relativepath.png new file mode 100644 index 00000000..ce6c1563 Binary files /dev/null and b/.gitbook/assets/2.17-whatsnew-relativepath.png differ diff --git a/.gitbook/assets/2.17-whatsnew-s3backup.png b/.gitbook/assets/2.17-whatsnew-s3backup.png new file mode 100644 index 00000000..a3185bf2 Binary files /dev/null and b/.gitbook/assets/2.17-whatsnew-s3backup.png differ diff --git a/.gitbook/assets/2.9-applications-add-manual-1.gif b/.gitbook/assets/2.9-applications-add-manual-1.gif new file mode 100644 index 00000000..bb576882 Binary files /dev/null and b/.gitbook/assets/2.9-applications-add-manual-1.gif differ diff --git a/.gitbook/assets/2.9-applications-add-manual-2.png b/.gitbook/assets/2.9-applications-add-manual-2.png new file mode 100644 index 00000000..ec15faa5 Binary files /dev/null and b/.gitbook/assets/2.9-applications-add-manual-2.png differ diff --git a/.gitbook/assets/2.9-applications-add-manual-5.png b/.gitbook/assets/2.9-applications-add-manual-5.png new file mode 100644 index 00000000..c66648f5 Binary files /dev/null and b/.gitbook/assets/2.9-applications-add-manual-5.png differ diff --git a/.gitbook/assets/2.9-applications-edit-1.gif b/.gitbook/assets/2.9-applications-edit-1.gif new file mode 100644 index 00000000..3b272d9a Binary files /dev/null and b/.gitbook/assets/2.9-applications-edit-1.gif differ diff --git a/.gitbook/assets/2.9-applications-edit-2.png b/.gitbook/assets/2.9-applications-edit-2.png new file mode 100644 index 00000000..456cb1bc Binary files /dev/null and b/.gitbook/assets/2.9-applications-edit-2.png differ diff --git a/.gitbook/assets/2.9-applications-edit-3.png b/.gitbook/assets/2.9-applications-edit-3.png new file mode 100644 index 00000000..245be054 Binary files /dev/null and b/.gitbook/assets/2.9-applications-edit-3.png differ diff --git a/.gitbook/assets/2.9-applications-edit-4.png b/.gitbook/assets/2.9-applications-edit-4.png new file mode 100644 index 00000000..2fabca86 Binary files /dev/null and b/.gitbook/assets/2.9-applications-edit-4.png differ diff --git a/.gitbook/assets/2.9-applications-inspect-1.gif b/.gitbook/assets/2.9-applications-inspect-1.gif new file mode 100644 index 00000000..d02be35e Binary files /dev/null and b/.gitbook/assets/2.9-applications-inspect-1.gif differ diff --git a/.gitbook/assets/2.9-applications-inspect-2.png b/.gitbook/assets/2.9-applications-inspect-2.png new file mode 100644 index 00000000..e3256747 Binary files /dev/null and b/.gitbook/assets/2.9-applications-inspect-2.png differ diff --git a/.gitbook/assets/2.9-applications-inspect-3.png b/.gitbook/assets/2.9-applications-inspect-3.png new file mode 100644 index 00000000..aba080cc Binary files /dev/null and b/.gitbook/assets/2.9-applications-inspect-3.png differ diff --git a/.gitbook/assets/2.9-applications-remove-1.gif b/.gitbook/assets/2.9-applications-remove-1.gif new file mode 100644 index 00000000..418da379 Binary files /dev/null and b/.gitbook/assets/2.9-applications-remove-1.gif differ diff --git a/.gitbook/assets/2.9-applications-splash.png b/.gitbook/assets/2.9-applications-splash.png new file mode 100644 index 00000000..8c7477f6 Binary files /dev/null and b/.gitbook/assets/2.9-applications-splash.png differ diff --git a/.gitbook/assets/2.9-cluster-1.gif b/.gitbook/assets/2.9-cluster-1.gif new file mode 100644 index 00000000..6081c682 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-1.gif differ diff --git a/.gitbook/assets/2.9-cluster-node-1.gif b/.gitbook/assets/2.9-cluster-node-1.gif new file mode 100644 index 00000000..cabbb5b0 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-node-1.gif differ diff --git a/.gitbook/assets/2.9-cluster-node-3.png b/.gitbook/assets/2.9-cluster-node-3.png new file mode 100644 index 00000000..80e6a8a2 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-node-3.png differ diff --git a/.gitbook/assets/2.9-cluster-registries-1.gif b/.gitbook/assets/2.9-cluster-registries-1.gif new file mode 100644 index 00000000..1e1c639e Binary files /dev/null and b/.gitbook/assets/2.9-cluster-registries-1.gif differ diff --git a/.gitbook/assets/2.9-cluster-registries-2.gif b/.gitbook/assets/2.9-cluster-registries-2.gif new file mode 100644 index 00000000..4f79c3c6 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-registries-2.gif differ diff --git a/.gitbook/assets/2.9-cluster-registries-3.png b/.gitbook/assets/2.9-cluster-registries-3.png new file mode 100644 index 00000000..3d20ea19 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-registries-3.png differ diff --git a/.gitbook/assets/2.9-cluster-setup-1.gif b/.gitbook/assets/2.9-cluster-setup-1.gif new file mode 100644 index 00000000..08876a44 Binary files /dev/null and b/.gitbook/assets/2.9-cluster-setup-1.gif differ diff --git a/.gitbook/assets/2.9-configs-add-1.gif b/.gitbook/assets/2.9-configs-add-1.gif new file mode 100644 index 00000000..c8d71969 Binary files /dev/null and b/.gitbook/assets/2.9-configs-add-1.gif differ diff --git a/.gitbook/assets/2.9-configs-remove-1.gif b/.gitbook/assets/2.9-configs-remove-1.gif new file mode 100644 index 00000000..3a75e1c5 Binary files /dev/null and b/.gitbook/assets/2.9-configs-remove-1.gif differ diff --git a/.gitbook/assets/2.9-configs-splash.png b/.gitbook/assets/2.9-configs-splash.png new file mode 100644 index 00000000..53ebba62 Binary files /dev/null and b/.gitbook/assets/2.9-configs-splash.png differ diff --git a/.gitbook/assets/2.9-configurations-add-1.gif b/.gitbook/assets/2.9-configurations-add-1.gif new file mode 100644 index 00000000..2188beec Binary files /dev/null and b/.gitbook/assets/2.9-configurations-add-1.gif differ diff --git a/.gitbook/assets/2.9-configurations-remove-1.gif b/.gitbook/assets/2.9-configurations-remove-1.gif new file mode 100644 index 00000000..cf5ca21c Binary files /dev/null and b/.gitbook/assets/2.9-configurations-remove-1.gif differ diff --git a/.gitbook/assets/2.9-configurations-splash.png b/.gitbook/assets/2.9-configurations-splash.png new file mode 100644 index 00000000..2070482c Binary files /dev/null and b/.gitbook/assets/2.9-configurations-splash.png differ diff --git a/.gitbook/assets/2.9-containers-add-1.gif b/.gitbook/assets/2.9-containers-add-1.gif new file mode 100644 index 00000000..d09f1798 Binary files /dev/null and b/.gitbook/assets/2.9-containers-add-1.gif differ diff --git a/.gitbook/assets/2.9-containers-console-1.gif b/.gitbook/assets/2.9-containers-console-1.gif new file mode 100644 index 00000000..8773bfcf Binary files /dev/null and b/.gitbook/assets/2.9-containers-console-1.gif differ diff --git a/.gitbook/assets/2.9-containers-edit-1.gif b/.gitbook/assets/2.9-containers-edit-1.gif new file mode 100644 index 00000000..7a073921 Binary files /dev/null and b/.gitbook/assets/2.9-containers-edit-1.gif differ diff --git a/.gitbook/assets/2.9-containers-inspect-1.gif b/.gitbook/assets/2.9-containers-inspect-1.gif new file mode 100644 index 00000000..2f240b02 Binary files /dev/null and b/.gitbook/assets/2.9-containers-inspect-1.gif differ diff --git a/.gitbook/assets/2.9-containers-logs-1.gif b/.gitbook/assets/2.9-containers-logs-1.gif new file mode 100644 index 00000000..e335aee2 Binary files /dev/null and b/.gitbook/assets/2.9-containers-logs-1.gif differ diff --git a/.gitbook/assets/2.9-containers-remove-1.gif b/.gitbook/assets/2.9-containers-remove-1.gif new file mode 100644 index 00000000..a8e0c446 Binary files /dev/null and b/.gitbook/assets/2.9-containers-remove-1.gif differ diff --git a/.gitbook/assets/2.9-containers-splash.png b/.gitbook/assets/2.9-containers-splash.png new file mode 100644 index 00000000..f9c78d01 Binary files /dev/null and b/.gitbook/assets/2.9-containers-splash.png differ diff --git a/.gitbook/assets/2.9-containers-stats-1.gif b/.gitbook/assets/2.9-containers-stats-1.gif new file mode 100644 index 00000000..b0e0b172 Binary files /dev/null and b/.gitbook/assets/2.9-containers-stats-1.gif differ diff --git a/.gitbook/assets/2.9-containers-view-1.gif b/.gitbook/assets/2.9-containers-view-1.gif new file mode 100644 index 00000000..35e45692 Binary files /dev/null and b/.gitbook/assets/2.9-containers-view-1.gif differ diff --git a/.gitbook/assets/2.9-docker-dashboard-1.png b/.gitbook/assets/2.9-docker-dashboard-1.png new file mode 100644 index 00000000..6042528b Binary files /dev/null and b/.gitbook/assets/2.9-docker-dashboard-1.png differ diff --git a/.gitbook/assets/2.9-edge-groups-add-1.gif b/.gitbook/assets/2.9-edge-groups-add-1.gif new file mode 100644 index 00000000..1a0469d9 Binary files /dev/null and b/.gitbook/assets/2.9-edge-groups-add-1.gif differ diff --git a/.gitbook/assets/2.9-edge-groups-add-3.png b/.gitbook/assets/2.9-edge-groups-add-3.png new file mode 100644 index 00000000..00fb649d Binary files /dev/null and b/.gitbook/assets/2.9-edge-groups-add-3.png differ diff --git a/.gitbook/assets/2.9-edge-groups-add-4.png b/.gitbook/assets/2.9-edge-groups-add-4.png new file mode 100644 index 00000000..5238b2a5 Binary files /dev/null and b/.gitbook/assets/2.9-edge-groups-add-4.png differ diff --git a/.gitbook/assets/2.9-edge-jobs-add-1.gif b/.gitbook/assets/2.9-edge-jobs-add-1.gif new file mode 100644 index 00000000..75ddf933 Binary files /dev/null and b/.gitbook/assets/2.9-edge-jobs-add-1.gif differ diff --git a/.gitbook/assets/2.9-edge-stacks-add-1.gif b/.gitbook/assets/2.9-edge-stacks-add-1.gif new file mode 100644 index 00000000..a23bbfef Binary files /dev/null and b/.gitbook/assets/2.9-edge-stacks-add-1.gif differ diff --git a/.gitbook/assets/2.9-edge-stacks-add-3.png b/.gitbook/assets/2.9-edge-stacks-add-3.png new file mode 100644 index 00000000..36349605 Binary files /dev/null and b/.gitbook/assets/2.9-edge-stacks-add-3.png differ diff --git a/.gitbook/assets/2.9-environments-access-groups-1.gif b/.gitbook/assets/2.9-environments-access-groups-1.gif new file mode 100644 index 00000000..105fce79 Binary files /dev/null and b/.gitbook/assets/2.9-environments-access-groups-1.gif differ diff --git a/.gitbook/assets/2.9-environments-add-1.gif b/.gitbook/assets/2.9-environments-add-1.gif new file mode 100644 index 00000000..5e86fd17 Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-1.gif differ diff --git a/.gitbook/assets/2.9-environments-add-azure-1.gif b/.gitbook/assets/2.9-environments-add-azure-1.gif new file mode 100644 index 00000000..8496032a Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-azure-1.gif differ diff --git a/.gitbook/assets/2.9-environments-add-docker-2.png b/.gitbook/assets/2.9-environments-add-docker-2.png new file mode 100644 index 00000000..24e768ed Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-docker-2.png differ diff --git a/.gitbook/assets/2.9-environments-add-docker-4.png b/.gitbook/assets/2.9-environments-add-docker-4.png new file mode 100644 index 00000000..8de731b6 Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-docker-4.png differ diff --git a/.gitbook/assets/2.9-environments-add-docker-7.png b/.gitbook/assets/2.9-environments-add-docker-7.png new file mode 100644 index 00000000..f376ef50 Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-docker-7.png differ diff --git a/.gitbook/assets/2.9-environments-add-edge-1.gif b/.gitbook/assets/2.9-environments-add-edge-1.gif new file mode 100644 index 00000000..063f2260 Binary files /dev/null and b/.gitbook/assets/2.9-environments-add-edge-1.gif differ diff --git a/.gitbook/assets/2.9-environments-groups-add-1.gif b/.gitbook/assets/2.9-environments-groups-add-1.gif new file mode 100644 index 00000000..d27d6ef7 Binary files /dev/null and b/.gitbook/assets/2.9-environments-groups-add-1.gif differ diff --git a/.gitbook/assets/2.9-environments-tags-1.gif b/.gitbook/assets/2.9-environments-tags-1.gif new file mode 100644 index 00000000..c7fe5e50 Binary files /dev/null and b/.gitbook/assets/2.9-environments-tags-1.gif differ diff --git a/.gitbook/assets/2.9-environments-tags-2.gif b/.gitbook/assets/2.9-environments-tags-2.gif new file mode 100644 index 00000000..ee71d2c3 Binary files /dev/null and b/.gitbook/assets/2.9-environments-tags-2.gif differ diff --git a/.gitbook/assets/2.9-home-splash.png b/.gitbook/assets/2.9-home-splash.png new file mode 100644 index 00000000..048c8328 Binary files /dev/null and b/.gitbook/assets/2.9-home-splash.png differ diff --git a/.gitbook/assets/2.9-host-registries-1.gif b/.gitbook/assets/2.9-host-registries-1.gif new file mode 100644 index 00000000..d8ceb636 Binary files /dev/null and b/.gitbook/assets/2.9-host-registries-1.gif differ diff --git a/.gitbook/assets/2.9-host-registries-2.gif b/.gitbook/assets/2.9-host-registries-2.gif new file mode 100644 index 00000000..5572784a Binary files /dev/null and b/.gitbook/assets/2.9-host-registries-2.gif differ diff --git a/.gitbook/assets/2.9-images-build-1.gif b/.gitbook/assets/2.9-images-build-1.gif new file mode 100644 index 00000000..5848bc49 Binary files /dev/null and b/.gitbook/assets/2.9-images-build-1.gif differ diff --git a/.gitbook/assets/2.9-images-export-1.gif b/.gitbook/assets/2.9-images-export-1.gif new file mode 100644 index 00000000..f55f43c7 Binary files /dev/null and b/.gitbook/assets/2.9-images-export-1.gif differ diff --git a/.gitbook/assets/2.9-images-splash.png b/.gitbook/assets/2.9-images-splash.png new file mode 100644 index 00000000..63ebc735 Binary files /dev/null and b/.gitbook/assets/2.9-images-splash.png differ diff --git a/.gitbook/assets/2.9-install-agent-aci-1.gif b/.gitbook/assets/2.9-install-agent-aci-1.gif new file mode 100644 index 00000000..e23e7515 Binary files /dev/null and b/.gitbook/assets/2.9-install-agent-aci-1.gif differ diff --git a/.gitbook/assets/2.9-install-agent-swarm-1.gif b/.gitbook/assets/2.9-install-agent-swarm-1.gif new file mode 100644 index 00000000..8561fe29 Binary files /dev/null and b/.gitbook/assets/2.9-install-agent-swarm-1.gif differ diff --git a/.gitbook/assets/2.9-k8s-cluster-setup-3.png b/.gitbook/assets/2.9-k8s-cluster-setup-3.png new file mode 100644 index 00000000..3c2e3065 Binary files /dev/null and b/.gitbook/assets/2.9-k8s-cluster-setup-3.png differ diff --git a/.gitbook/assets/2.9-k8s-dashboard-1.png b/.gitbook/assets/2.9-k8s-dashboard-1.png new file mode 100644 index 00000000..bb7a91ab Binary files /dev/null and b/.gitbook/assets/2.9-k8s-dashboard-1.png differ diff --git a/.gitbook/assets/2.9-k8s-volumes-remove-1.gif b/.gitbook/assets/2.9-k8s-volumes-remove-1.gif new file mode 100644 index 00000000..e6cb50cb Binary files /dev/null and b/.gitbook/assets/2.9-k8s-volumes-remove-1.gif differ diff --git a/.gitbook/assets/2.9-kubeconfig-1.gif b/.gitbook/assets/2.9-kubeconfig-1.gif new file mode 100644 index 00000000..f8a2d3eb Binary files /dev/null and b/.gitbook/assets/2.9-kubeconfig-1.gif differ diff --git a/.gitbook/assets/2.9-kubectl-1.gif b/.gitbook/assets/2.9-kubectl-1.gif new file mode 100644 index 00000000..f3564161 Binary files /dev/null and b/.gitbook/assets/2.9-kubectl-1.gif differ diff --git a/.gitbook/assets/2.9-namespaces-access-1.gif b/.gitbook/assets/2.9-namespaces-access-1.gif new file mode 100644 index 00000000..d6d8bba6 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-access-1.gif differ diff --git a/.gitbook/assets/2.9-namespaces-add-1.gif b/.gitbook/assets/2.9-namespaces-add-1.gif new file mode 100644 index 00000000..b10eef94 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-add-1.gif differ diff --git a/.gitbook/assets/2.9-namespaces-manage-1.gif b/.gitbook/assets/2.9-namespaces-manage-1.gif new file mode 100644 index 00000000..4f97a91e Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-1.gif differ diff --git a/.gitbook/assets/2.9-namespaces-manage-2.png b/.gitbook/assets/2.9-namespaces-manage-2.png new file mode 100644 index 00000000..3f291133 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-2.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-3.png b/.gitbook/assets/2.9-namespaces-manage-3.png new file mode 100644 index 00000000..94ba9d0f Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-3.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-4.png b/.gitbook/assets/2.9-namespaces-manage-4.png new file mode 100644 index 00000000..af7f4df0 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-4.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-5.png b/.gitbook/assets/2.9-namespaces-manage-5.png new file mode 100644 index 00000000..fe835afa Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-5.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-6.png b/.gitbook/assets/2.9-namespaces-manage-6.png new file mode 100644 index 00000000..01ebec9c Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-6.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-7.png b/.gitbook/assets/2.9-namespaces-manage-7.png new file mode 100644 index 00000000..6da39da7 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-7.png differ diff --git a/.gitbook/assets/2.9-namespaces-manage-8.png b/.gitbook/assets/2.9-namespaces-manage-8.png new file mode 100644 index 00000000..b33cc86c Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-manage-8.png differ diff --git a/.gitbook/assets/2.9-namespaces-remove-1.gif b/.gitbook/assets/2.9-namespaces-remove-1.gif new file mode 100644 index 00000000..6ea6eae4 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-remove-1.gif differ diff --git a/.gitbook/assets/2.9-namespaces-splash.png b/.gitbook/assets/2.9-namespaces-splash.png new file mode 100644 index 00000000..f6927966 Binary files /dev/null and b/.gitbook/assets/2.9-namespaces-splash.png differ diff --git a/.gitbook/assets/2.9-networks-add-1.gif b/.gitbook/assets/2.9-networks-add-1.gif new file mode 100644 index 00000000..f788504b Binary files /dev/null and b/.gitbook/assets/2.9-networks-add-1.gif differ diff --git a/.gitbook/assets/2.9-networks-remove-1.gif b/.gitbook/assets/2.9-networks-remove-1.gif new file mode 100644 index 00000000..dda99a52 Binary files /dev/null and b/.gitbook/assets/2.9-networks-remove-1.gif differ diff --git a/.gitbook/assets/2.9-networks-splash.png b/.gitbook/assets/2.9-networks-splash.png new file mode 100644 index 00000000..2d1aaf21 Binary files /dev/null and b/.gitbook/assets/2.9-networks-splash.png differ diff --git a/.gitbook/assets/2.9-registries-add-1.gif b/.gitbook/assets/2.9-registries-add-1.gif new file mode 100644 index 00000000..7ac0c77e Binary files /dev/null and b/.gitbook/assets/2.9-registries-add-1.gif differ diff --git a/.gitbook/assets/2.9-registries-add-dockerhub-1.gif b/.gitbook/assets/2.9-registries-add-dockerhub-1.gif new file mode 100644 index 00000000..f88b79ca Binary files /dev/null and b/.gitbook/assets/2.9-registries-add-dockerhub-1.gif differ diff --git a/.gitbook/assets/2.9-registries-add-dockerhub-2.png b/.gitbook/assets/2.9-registries-add-dockerhub-2.png new file mode 100644 index 00000000..1d5f458d Binary files /dev/null and b/.gitbook/assets/2.9-registries-add-dockerhub-2.png differ diff --git a/.gitbook/assets/2.9-secrets-add-1.gif b/.gitbook/assets/2.9-secrets-add-1.gif new file mode 100644 index 00000000..be1db3fc Binary files /dev/null and b/.gitbook/assets/2.9-secrets-add-1.gif differ diff --git a/.gitbook/assets/2.9-secrets-remove-1.gif b/.gitbook/assets/2.9-secrets-remove-1.gif new file mode 100644 index 00000000..1497a82c Binary files /dev/null and b/.gitbook/assets/2.9-secrets-remove-1.gif differ diff --git a/.gitbook/assets/2.9-secrets-splash.png b/.gitbook/assets/2.9-secrets-splash.png new file mode 100644 index 00000000..93d85b4f Binary files /dev/null and b/.gitbook/assets/2.9-secrets-splash.png differ diff --git a/.gitbook/assets/2.9-server-setup-wizard.png b/.gitbook/assets/2.9-server-setup-wizard.png new file mode 100644 index 00000000..0867df9c Binary files /dev/null and b/.gitbook/assets/2.9-server-setup-wizard.png differ diff --git a/.gitbook/assets/2.9-services-add-1.gif b/.gitbook/assets/2.9-services-add-1.gif new file mode 100644 index 00000000..ac8a4965 Binary files /dev/null and b/.gitbook/assets/2.9-services-add-1.gif differ diff --git a/.gitbook/assets/2.9-services-configure-1.gif b/.gitbook/assets/2.9-services-configure-1.gif new file mode 100644 index 00000000..adfc5966 Binary files /dev/null and b/.gitbook/assets/2.9-services-configure-1.gif differ diff --git a/.gitbook/assets/2.9-services-logs-1.gif b/.gitbook/assets/2.9-services-logs-1.gif new file mode 100644 index 00000000..2266cd5b Binary files /dev/null and b/.gitbook/assets/2.9-services-logs-1.gif differ diff --git a/.gitbook/assets/2.9-services-rollback-1.gif b/.gitbook/assets/2.9-services-rollback-1.gif new file mode 100644 index 00000000..e85a5385 Binary files /dev/null and b/.gitbook/assets/2.9-services-rollback-1.gif differ diff --git a/.gitbook/assets/2.9-services-rollback-2.png b/.gitbook/assets/2.9-services-rollback-2.png new file mode 100644 index 00000000..7d796d51 Binary files /dev/null and b/.gitbook/assets/2.9-services-rollback-2.png differ diff --git a/.gitbook/assets/2.9-services-scale-1.gif b/.gitbook/assets/2.9-services-scale-1.gif new file mode 100644 index 00000000..0dcecf18 Binary files /dev/null and b/.gitbook/assets/2.9-services-scale-1.gif differ diff --git a/.gitbook/assets/2.9-services-splash.png b/.gitbook/assets/2.9-services-splash.png new file mode 100644 index 00000000..360da789 Binary files /dev/null and b/.gitbook/assets/2.9-services-splash.png differ diff --git a/.gitbook/assets/2.9-services-tasks-1.gif b/.gitbook/assets/2.9-services-tasks-1.gif new file mode 100644 index 00000000..0c5b1b56 Binary files /dev/null and b/.gitbook/assets/2.9-services-tasks-1.gif differ diff --git a/.gitbook/assets/2.9-services-tasks-2.png b/.gitbook/assets/2.9-services-tasks-2.png new file mode 100644 index 00000000..75801727 Binary files /dev/null and b/.gitbook/assets/2.9-services-tasks-2.png differ diff --git a/.gitbook/assets/2.9-settings-helm-repo.png b/.gitbook/assets/2.9-settings-helm-repo.png new file mode 100644 index 00000000..b1153837 Binary files /dev/null and b/.gitbook/assets/2.9-settings-helm-repo.png differ diff --git a/.gitbook/assets/2.9-settings-kubeconfig-expiry.png b/.gitbook/assets/2.9-settings-kubeconfig-expiry.png new file mode 100644 index 00000000..63084787 Binary files /dev/null and b/.gitbook/assets/2.9-settings-kubeconfig-expiry.png differ diff --git a/.gitbook/assets/2.9-settings-ssl-1.png b/.gitbook/assets/2.9-settings-ssl-1.png new file mode 100644 index 00000000..630345af Binary files /dev/null and b/.gitbook/assets/2.9-settings-ssl-1.png differ diff --git a/.gitbook/assets/2.9-settings-ssl-2.png b/.gitbook/assets/2.9-settings-ssl-2.png new file mode 100644 index 00000000..7606e06e Binary files /dev/null and b/.gitbook/assets/2.9-settings-ssl-2.png differ diff --git a/.gitbook/assets/2.9-stacks-add-1.gif b/.gitbook/assets/2.9-stacks-add-1.gif new file mode 100644 index 00000000..c2c901ba Binary files /dev/null and b/.gitbook/assets/2.9-stacks-add-1.gif differ diff --git a/.gitbook/assets/2.9-stacks-add-github-1.png b/.gitbook/assets/2.9-stacks-add-github-1.png new file mode 100644 index 00000000..6551ad7c Binary files /dev/null and b/.gitbook/assets/2.9-stacks-add-github-1.png differ diff --git a/.gitbook/assets/2.9-stacks-add-github-2.png b/.gitbook/assets/2.9-stacks-add-github-2.png new file mode 100644 index 00000000..c32636b5 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-add-github-2.png differ diff --git a/.gitbook/assets/2.9-stacks-add-github-3.png b/.gitbook/assets/2.9-stacks-add-github-3.png new file mode 100644 index 00000000..b49525a1 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-add-github-3.png differ diff --git a/.gitbook/assets/2.9-stacks-edit-1.gif b/.gitbook/assets/2.9-stacks-edit-1.gif new file mode 100644 index 00000000..0f250e38 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-edit-1.gif differ diff --git a/.gitbook/assets/2.9-stacks-edit-git-1.png b/.gitbook/assets/2.9-stacks-edit-git-1.png new file mode 100644 index 00000000..a0e7a0e5 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-edit-git-1.png differ diff --git a/.gitbook/assets/2.9-stacks-edit-stackdetails.png b/.gitbook/assets/2.9-stacks-edit-stackdetails.png new file mode 100644 index 00000000..11ef38e2 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-edit-stackdetails.png differ diff --git a/.gitbook/assets/2.9-stacks-migrate-1.gif b/.gitbook/assets/2.9-stacks-migrate-1.gif new file mode 100644 index 00000000..be7581ea Binary files /dev/null and b/.gitbook/assets/2.9-stacks-migrate-1.gif differ diff --git a/.gitbook/assets/2.9-stacks-remove-1.gif b/.gitbook/assets/2.9-stacks-remove-1.gif new file mode 100644 index 00000000..1cec4106 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-remove-1.gif differ diff --git a/.gitbook/assets/2.9-stacks-remove-2.png b/.gitbook/assets/2.9-stacks-remove-2.png new file mode 100644 index 00000000..04e5bf47 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-remove-2.png differ diff --git a/.gitbook/assets/2.9-stacks-splash.png b/.gitbook/assets/2.9-stacks-splash.png new file mode 100644 index 00000000..987696c0 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-splash.png differ diff --git a/.gitbook/assets/2.9-stacks-template-1.gif b/.gitbook/assets/2.9-stacks-template-1.gif new file mode 100644 index 00000000..50930349 Binary files /dev/null and b/.gitbook/assets/2.9-stacks-template-1.gif differ diff --git a/.gitbook/assets/2.9-swarm-portainer-volume-constrain-1.gif b/.gitbook/assets/2.9-swarm-portainer-volume-constrain-1.gif new file mode 100644 index 00000000..5fb6e436 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-portainer-volume-constrain-1.gif differ diff --git a/.gitbook/assets/2.9-swarm-portainer-volume-constraints-2.gif b/.gitbook/assets/2.9-swarm-portainer-volume-constraints-2.gif new file mode 100644 index 00000000..cb3ca671 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-portainer-volume-constraints-2.gif differ diff --git a/.gitbook/assets/2.9-swarm-portainer-volume-constraints-3.png b/.gitbook/assets/2.9-swarm-portainer-volume-constraints-3.png new file mode 100644 index 00000000..859d01f7 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-portainer-volume-constraints-3.png differ diff --git a/.gitbook/assets/2.9-swarm-registries-1.gif b/.gitbook/assets/2.9-swarm-registries-1.gif new file mode 100644 index 00000000..c9c4b716 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-registries-1.gif differ diff --git a/.gitbook/assets/2.9-swarm-registries-2.gif b/.gitbook/assets/2.9-swarm-registries-2.gif new file mode 100644 index 00000000..792f6b24 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-registries-2.gif differ diff --git a/.gitbook/assets/2.9-swarm-registries-3.png b/.gitbook/assets/2.9-swarm-registries-3.png new file mode 100644 index 00000000..39eff5cb Binary files /dev/null and b/.gitbook/assets/2.9-swarm-registries-3.png differ diff --git a/.gitbook/assets/2.9-swarm-registries-4.png b/.gitbook/assets/2.9-swarm-registries-4.png new file mode 100644 index 00000000..e9ffee52 Binary files /dev/null and b/.gitbook/assets/2.9-swarm-registries-4.png differ diff --git a/.gitbook/assets/2.9-templates-custom-1.gif b/.gitbook/assets/2.9-templates-custom-1.gif new file mode 100644 index 00000000..92d653a4 Binary files /dev/null and b/.gitbook/assets/2.9-templates-custom-1.gif differ diff --git a/.gitbook/assets/2.9-templates-deploy-container-1.gif b/.gitbook/assets/2.9-templates-deploy-container-1.gif new file mode 100644 index 00000000..bd0b2483 Binary files /dev/null and b/.gitbook/assets/2.9-templates-deploy-container-1.gif differ diff --git a/.gitbook/assets/2.9-templates-deploy-stack-1.gif b/.gitbook/assets/2.9-templates-deploy-stack-1.gif new file mode 100644 index 00000000..60ab8bfa Binary files /dev/null and b/.gitbook/assets/2.9-templates-deploy-stack-1.gif differ diff --git a/.gitbook/assets/2.9-templates-splash.png b/.gitbook/assets/2.9-templates-splash.png new file mode 100644 index 00000000..819478b7 Binary files /dev/null and b/.gitbook/assets/2.9-templates-splash.png differ diff --git a/.gitbook/assets/2.9-volumes-1.png b/.gitbook/assets/2.9-volumes-1.png new file mode 100644 index 00000000..e716708e Binary files /dev/null and b/.gitbook/assets/2.9-volumes-1.png differ diff --git a/.gitbook/assets/2.9-volumes-add-1.gif b/.gitbook/assets/2.9-volumes-add-1.gif new file mode 100644 index 00000000..50455c8f Binary files /dev/null and b/.gitbook/assets/2.9-volumes-add-1.gif differ diff --git a/.gitbook/assets/2.9-volumes-browse-1.gif b/.gitbook/assets/2.9-volumes-browse-1.gif new file mode 100644 index 00000000..05999efc Binary files /dev/null and b/.gitbook/assets/2.9-volumes-browse-1.gif differ diff --git a/.gitbook/assets/2.9-volumes-inspect-1.gif b/.gitbook/assets/2.9-volumes-inspect-1.gif new file mode 100644 index 00000000..5eb32c1b Binary files /dev/null and b/.gitbook/assets/2.9-volumes-inspect-1.gif differ diff --git a/.gitbook/assets/2.9-volumes-remove-1.gif b/.gitbook/assets/2.9-volumes-remove-1.gif new file mode 100644 index 00000000..aaaf85e7 Binary files /dev/null and b/.gitbook/assets/2.9-volumes-remove-1.gif differ diff --git a/.gitbook/assets/2.9-volumes-splash.png b/.gitbook/assets/2.9-volumes-splash.png new file mode 100644 index 00000000..a591d31c Binary files /dev/null and b/.gitbook/assets/2.9-volumes-splash.png differ diff --git a/.gitbook/assets/2.9.1-admin-logs-activity-splash.png b/.gitbook/assets/2.9.1-admin-logs-activity-splash.png new file mode 100644 index 00000000..20f84eac Binary files /dev/null and b/.gitbook/assets/2.9.1-admin-logs-activity-splash.png differ diff --git a/.gitbook/assets/2.9.1-admin-logs-splash.png b/.gitbook/assets/2.9.1-admin-logs-splash.png new file mode 100644 index 00000000..a6ccc3fe Binary files /dev/null and b/.gitbook/assets/2.9.1-admin-logs-splash.png differ diff --git a/.gitbook/assets/2.9.1-applications-inspect-5.png b/.gitbook/assets/2.9.1-applications-inspect-5.png new file mode 100644 index 00000000..cc918961 Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-inspect-5.png differ diff --git a/.gitbook/assets/2.9.1-applications-manifest-1.gif b/.gitbook/assets/2.9.1-applications-manifest-1.gif new file mode 100644 index 00000000..9e483a4b Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-manifest-1.gif differ diff --git a/.gitbook/assets/2.9.1-applications-manifest-2.png b/.gitbook/assets/2.9.1-applications-manifest-2.png new file mode 100644 index 00000000..22f2c087 Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-manifest-2.png differ diff --git a/.gitbook/assets/2.9.1-applications-manifest-3.png b/.gitbook/assets/2.9.1-applications-manifest-3.png new file mode 100644 index 00000000..9b33966d Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-manifest-3.png differ diff --git a/.gitbook/assets/2.9.1-applications-manifest-4.png b/.gitbook/assets/2.9.1-applications-manifest-4.png new file mode 100644 index 00000000..04f54eac Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-manifest-4.png differ diff --git a/.gitbook/assets/2.9.1-applications-manifest-5.png b/.gitbook/assets/2.9.1-applications-manifest-5.png new file mode 100644 index 00000000..57729b5a Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-manifest-5.png differ diff --git a/.gitbook/assets/2.9.1-applications-splash.png b/.gitbook/assets/2.9.1-applications-splash.png new file mode 100644 index 00000000..c8209846 Binary files /dev/null and b/.gitbook/assets/2.9.1-applications-splash.png differ diff --git a/.gitbook/assets/2.9.1-cluster-1.gif b/.gitbook/assets/2.9.1-cluster-1.gif new file mode 100644 index 00000000..47821ebf Binary files /dev/null and b/.gitbook/assets/2.9.1-cluster-1.gif differ diff --git a/.gitbook/assets/2.9.1-cluster-setup-4.png b/.gitbook/assets/2.9.1-cluster-setup-4.png new file mode 100644 index 00000000..561fa4cb Binary files /dev/null and b/.gitbook/assets/2.9.1-cluster-setup-4.png differ diff --git a/.gitbook/assets/2.9.1-configmaps-1.png b/.gitbook/assets/2.9.1-configmaps-1.png new file mode 100644 index 00000000..f561e250 Binary files /dev/null and b/.gitbook/assets/2.9.1-configmaps-1.png differ diff --git a/.gitbook/assets/2.9.1-configurations-add-1.gif b/.gitbook/assets/2.9.1-configurations-add-1.gif new file mode 100644 index 00000000..3e50317d Binary files /dev/null and b/.gitbook/assets/2.9.1-configurations-add-1.gif differ diff --git a/.gitbook/assets/2.9.1-configurations-add-2.png b/.gitbook/assets/2.9.1-configurations-add-2.png new file mode 100644 index 00000000..34e2f8df Binary files /dev/null and b/.gitbook/assets/2.9.1-configurations-add-2.png differ diff --git a/.gitbook/assets/2.9.1-configurations-remove-1.gif b/.gitbook/assets/2.9.1-configurations-remove-1.gif new file mode 100644 index 00000000..aaa7c925 Binary files /dev/null and b/.gitbook/assets/2.9.1-configurations-remove-1.gif differ diff --git a/.gitbook/assets/2.9.1-environments-access-1.gif b/.gitbook/assets/2.9.1-environments-access-1.gif new file mode 100644 index 00000000..1a10879a Binary files /dev/null and b/.gitbook/assets/2.9.1-environments-access-1.gif differ diff --git a/.gitbook/assets/2.9.1-environments-access-2.png b/.gitbook/assets/2.9.1-environments-access-2.png new file mode 100644 index 00000000..f5f32271 Binary files /dev/null and b/.gitbook/assets/2.9.1-environments-access-2.png differ diff --git a/.gitbook/assets/2.9.1-namespaces-manage-3.png b/.gitbook/assets/2.9.1-namespaces-manage-3.png new file mode 100644 index 00000000..72a3d636 Binary files /dev/null and b/.gitbook/assets/2.9.1-namespaces-manage-3.png differ diff --git a/.gitbook/assets/2.9.1-namespaces-manage-6.png b/.gitbook/assets/2.9.1-namespaces-manage-6.png new file mode 100644 index 00000000..e22b245c Binary files /dev/null and b/.gitbook/assets/2.9.1-namespaces-manage-6.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-ldap-2.png b/.gitbook/assets/2.9.1-settings-authentication-ldap-2.png new file mode 100644 index 00000000..fe53967a Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-ldap-2.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-ldap-3.png b/.gitbook/assets/2.9.1-settings-authentication-ldap-3.png new file mode 100644 index 00000000..3438bb27 Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-ldap-3.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-ldap-4.png b/.gitbook/assets/2.9.1-settings-authentication-ldap-4.png new file mode 100644 index 00000000..86285510 Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-ldap-4.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-oauth-2.png b/.gitbook/assets/2.9.1-settings-authentication-oauth-2.png new file mode 100644 index 00000000..ab023422 Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-oauth-2.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-oauth-3.png b/.gitbook/assets/2.9.1-settings-authentication-oauth-3.png new file mode 100644 index 00000000..8506c3f6 Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-oauth-3.png differ diff --git a/.gitbook/assets/2.9.1-settings-authentication-splash.png b/.gitbook/assets/2.9.1-settings-authentication-splash.png new file mode 100644 index 00000000..8421b574 Binary files /dev/null and b/.gitbook/assets/2.9.1-settings-authentication-splash.png differ diff --git a/.gitbook/assets/2.9.1-users-roles-splash.png b/.gitbook/assets/2.9.1-users-roles-splash.png new file mode 100644 index 00000000..6b666ba3 Binary files /dev/null and b/.gitbook/assets/2.9.1-users-roles-splash.png differ diff --git a/.gitbook/assets/ArchDiagrams.png b/.gitbook/assets/ArchDiagrams.png new file mode 100644 index 00000000..37965e03 Binary files /dev/null and b/.gitbook/assets/ArchDiagrams.png differ diff --git a/.gitbook/assets/Recording 2022-10-16 at 23.39.55.gif b/.gitbook/assets/Recording 2022-10-16 at 23.39.55.gif new file mode 100644 index 00000000..fc29cae5 Binary files /dev/null and b/.gitbook/assets/Recording 2022-10-16 at 23.39.55.gif differ diff --git a/.gitbook/assets/access-control-1.png b/.gitbook/assets/access-control-1.png new file mode 100644 index 00000000..103dfd01 Binary files /dev/null and b/.gitbook/assets/access-control-1.png differ diff --git a/.gitbook/assets/access-control-2.png b/.gitbook/assets/access-control-2.png new file mode 100644 index 00000000..a891f2ef Binary files /dev/null and b/.gitbook/assets/access-control-2.png differ diff --git a/.gitbook/assets/access-control-3.png b/.gitbook/assets/access-control-3.png new file mode 100644 index 00000000..1f6d2f38 Binary files /dev/null and b/.gitbook/assets/access-control-3.png differ diff --git a/.gitbook/assets/account-settings-1.gif b/.gitbook/assets/account-settings-1.gif new file mode 100644 index 00000000..f40e415b Binary files /dev/null and b/.gitbook/assets/account-settings-1.gif differ diff --git a/.gitbook/assets/account-settings-2.png b/.gitbook/assets/account-settings-2.png new file mode 100644 index 00000000..a1a097dc Binary files /dev/null and b/.gitbook/assets/account-settings-2.png differ diff --git a/.gitbook/assets/account-settings-3.png b/.gitbook/assets/account-settings-3.png new file mode 100644 index 00000000..e2df663b Binary files /dev/null and b/.gitbook/assets/account-settings-3.png differ diff --git a/.gitbook/assets/aci-1.gif b/.gitbook/assets/aci-1.gif new file mode 100644 index 00000000..08c50594 Binary files /dev/null and b/.gitbook/assets/aci-1.gif differ diff --git a/.gitbook/assets/aci-containers-add-1.gif b/.gitbook/assets/aci-containers-add-1.gif new file mode 100644 index 00000000..a94e4640 Binary files /dev/null and b/.gitbook/assets/aci-containers-add-1.gif differ diff --git a/.gitbook/assets/aci-containers-add-2.png b/.gitbook/assets/aci-containers-add-2.png new file mode 100644 index 00000000..8431bed6 Binary files /dev/null and b/.gitbook/assets/aci-containers-add-2.png differ diff --git a/.gitbook/assets/aci-containers-remove-1.gif b/.gitbook/assets/aci-containers-remove-1.gif new file mode 100644 index 00000000..73ce659c Binary files /dev/null and b/.gitbook/assets/aci-containers-remove-1.gif differ diff --git a/.gitbook/assets/aci_2.png b/.gitbook/assets/aci_2.png new file mode 100644 index 00000000..51ffe57e Binary files /dev/null and b/.gitbook/assets/aci_2.png differ diff --git a/.gitbook/assets/applications-add-1.gif b/.gitbook/assets/applications-add-1.gif new file mode 100644 index 00000000..9ba9d179 Binary files /dev/null and b/.gitbook/assets/applications-add-1.gif differ diff --git a/.gitbook/assets/applications-add-2.png b/.gitbook/assets/applications-add-2.png new file mode 100644 index 00000000..bf7e5961 Binary files /dev/null and b/.gitbook/assets/applications-add-2.png differ diff --git a/.gitbook/assets/applications-add-3.png b/.gitbook/assets/applications-add-3.png new file mode 100644 index 00000000..ab78cbff Binary files /dev/null and b/.gitbook/assets/applications-add-3.png differ diff --git a/.gitbook/assets/applications-add-4.png b/.gitbook/assets/applications-add-4.png new file mode 100644 index 00000000..a84c9bd6 Binary files /dev/null and b/.gitbook/assets/applications-add-4.png differ diff --git a/.gitbook/assets/applications-add-5.png b/.gitbook/assets/applications-add-5.png new file mode 100644 index 00000000..214d5211 Binary files /dev/null and b/.gitbook/assets/applications-add-5.png differ diff --git a/.gitbook/assets/applications-advanced-1.gif b/.gitbook/assets/applications-advanced-1.gif new file mode 100644 index 00000000..26bccdc0 Binary files /dev/null and b/.gitbook/assets/applications-advanced-1.gif differ diff --git a/.gitbook/assets/applications-advanced-2.png b/.gitbook/assets/applications-advanced-2.png new file mode 100644 index 00000000..c64576ed Binary files /dev/null and b/.gitbook/assets/applications-advanced-2.png differ diff --git a/.gitbook/assets/applications-advanced-3.png b/.gitbook/assets/applications-advanced-3.png new file mode 100644 index 00000000..a7eedd84 Binary files /dev/null and b/.gitbook/assets/applications-advanced-3.png differ diff --git a/.gitbook/assets/applications-detach-volume-2.png b/.gitbook/assets/applications-detach-volume-2.png new file mode 100644 index 00000000..6980d7ae Binary files /dev/null and b/.gitbook/assets/applications-detach-volume-2.png differ diff --git a/.gitbook/assets/applications-edit-1.gif b/.gitbook/assets/applications-edit-1.gif new file mode 100644 index 00000000..29285ccd Binary files /dev/null and b/.gitbook/assets/applications-edit-1.gif differ diff --git a/.gitbook/assets/applications-inspect-1.gif b/.gitbook/assets/applications-inspect-1.gif new file mode 100644 index 00000000..f83f823a Binary files /dev/null and b/.gitbook/assets/applications-inspect-1.gif differ diff --git a/.gitbook/assets/applications-inspect-2.png b/.gitbook/assets/applications-inspect-2.png new file mode 100644 index 00000000..8992b591 Binary files /dev/null and b/.gitbook/assets/applications-inspect-2.png differ diff --git a/.gitbook/assets/applications-inspect-3.png b/.gitbook/assets/applications-inspect-3.png new file mode 100644 index 00000000..4fad316d Binary files /dev/null and b/.gitbook/assets/applications-inspect-3.png differ diff --git a/.gitbook/assets/applications-inspect-4.png b/.gitbook/assets/applications-inspect-4.png new file mode 100644 index 00000000..79229674 Binary files /dev/null and b/.gitbook/assets/applications-inspect-4.png differ diff --git a/.gitbook/assets/applications-inspect-5.png b/.gitbook/assets/applications-inspect-5.png new file mode 100644 index 00000000..695e5d50 Binary files /dev/null and b/.gitbook/assets/applications-inspect-5.png differ diff --git a/.gitbook/assets/applications-inspect-6.png b/.gitbook/assets/applications-inspect-6.png new file mode 100644 index 00000000..af99b307 Binary files /dev/null and b/.gitbook/assets/applications-inspect-6.png differ diff --git a/.gitbook/assets/applications-inspect-7.png b/.gitbook/assets/applications-inspect-7.png new file mode 100644 index 00000000..4f4cfbb0 Binary files /dev/null and b/.gitbook/assets/applications-inspect-7.png differ diff --git a/.gitbook/assets/applications-manifest-1.gif b/.gitbook/assets/applications-manifest-1.gif new file mode 100644 index 00000000..a2244fe7 Binary files /dev/null and b/.gitbook/assets/applications-manifest-1.gif differ diff --git a/.gitbook/assets/applications-manifest-2.png b/.gitbook/assets/applications-manifest-2.png new file mode 100644 index 00000000..902d1e14 Binary files /dev/null and b/.gitbook/assets/applications-manifest-2.png differ diff --git a/.gitbook/assets/applications-manifest-3.png b/.gitbook/assets/applications-manifest-3.png new file mode 100644 index 00000000..83d32502 Binary files /dev/null and b/.gitbook/assets/applications-manifest-3.png differ diff --git a/.gitbook/assets/applications-manifest-4.png b/.gitbook/assets/applications-manifest-4.png new file mode 100644 index 00000000..4a60d677 Binary files /dev/null and b/.gitbook/assets/applications-manifest-4.png differ diff --git a/.gitbook/assets/applications-manifest-5.png b/.gitbook/assets/applications-manifest-5.png new file mode 100644 index 00000000..72dfa9da Binary files /dev/null and b/.gitbook/assets/applications-manifest-5.png differ diff --git a/.gitbook/assets/applications-manifest-6.png b/.gitbook/assets/applications-manifest-6.png new file mode 100644 index 00000000..917bba35 Binary files /dev/null and b/.gitbook/assets/applications-manifest-6.png differ diff --git a/.gitbook/assets/applications-remove-1.gif b/.gitbook/assets/applications-remove-1.gif new file mode 100644 index 00000000..d5d6cd69 Binary files /dev/null and b/.gitbook/assets/applications-remove-1.gif differ diff --git a/.gitbook/assets/applications-remove-2.png b/.gitbook/assets/applications-remove-2.png new file mode 100644 index 00000000..bda854e3 Binary files /dev/null and b/.gitbook/assets/applications-remove-2.png differ diff --git a/.gitbook/assets/authentication-ldap-1.gif b/.gitbook/assets/authentication-ldap-1.gif new file mode 100644 index 00000000..92c43fb1 Binary files /dev/null and b/.gitbook/assets/authentication-ldap-1.gif differ diff --git a/.gitbook/assets/authentication-ldap-2.png b/.gitbook/assets/authentication-ldap-2.png new file mode 100644 index 00000000..a404506e Binary files /dev/null and b/.gitbook/assets/authentication-ldap-2.png differ diff --git a/.gitbook/assets/authentication-ldap-3.png b/.gitbook/assets/authentication-ldap-3.png new file mode 100644 index 00000000..5d52d129 Binary files /dev/null and b/.gitbook/assets/authentication-ldap-3.png differ diff --git a/.gitbook/assets/authentication-ldap-4.png b/.gitbook/assets/authentication-ldap-4.png new file mode 100644 index 00000000..fc60c3c3 Binary files /dev/null and b/.gitbook/assets/authentication-ldap-4.png differ diff --git a/.gitbook/assets/authentication-ldap-5.png b/.gitbook/assets/authentication-ldap-5.png new file mode 100644 index 00000000..b5081307 Binary files /dev/null and b/.gitbook/assets/authentication-ldap-5.png differ diff --git a/.gitbook/assets/authentication-ldap-6.png b/.gitbook/assets/authentication-ldap-6.png new file mode 100644 index 00000000..e59f5bcb Binary files /dev/null and b/.gitbook/assets/authentication-ldap-6.png differ diff --git a/.gitbook/assets/authentication-ldap-7.png b/.gitbook/assets/authentication-ldap-7.png new file mode 100644 index 00000000..5627f635 Binary files /dev/null and b/.gitbook/assets/authentication-ldap-7.png differ diff --git a/.gitbook/assets/authentication-oauth-1.gif b/.gitbook/assets/authentication-oauth-1.gif new file mode 100644 index 00000000..f5791e89 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-1.gif differ diff --git a/.gitbook/assets/authentication-oauth-2.png b/.gitbook/assets/authentication-oauth-2.png new file mode 100644 index 00000000..a879d8b5 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-2.png differ diff --git a/.gitbook/assets/authentication-oauth-3.png b/.gitbook/assets/authentication-oauth-3.png new file mode 100644 index 00000000..4a542cb8 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-3.png differ diff --git a/.gitbook/assets/authentication-oauth-azure.png b/.gitbook/assets/authentication-oauth-azure.png new file mode 100644 index 00000000..7ba9c6d5 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-azure.png differ diff --git a/.gitbook/assets/authentication-oauth-github.png b/.gitbook/assets/authentication-oauth-github.png new file mode 100644 index 00000000..56be772b Binary files /dev/null and b/.gitbook/assets/authentication-oauth-github.png differ diff --git a/.gitbook/assets/authentication-oauth-keycloak.png b/.gitbook/assets/authentication-oauth-keycloak.png new file mode 100644 index 00000000..d21f7601 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-keycloak.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-1.png b/.gitbook/assets/authentication-oauth-ms-1.png new file mode 100644 index 00000000..75540f84 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-1.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-2.png b/.gitbook/assets/authentication-oauth-ms-2.png new file mode 100644 index 00000000..78617d97 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-2.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-3.png b/.gitbook/assets/authentication-oauth-ms-3.png new file mode 100644 index 00000000..658bd277 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-3.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-4.png b/.gitbook/assets/authentication-oauth-ms-4.png new file mode 100644 index 00000000..86f7d522 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-4.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-5.png b/.gitbook/assets/authentication-oauth-ms-5.png new file mode 100644 index 00000000..fb1fff07 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-5.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-6.png b/.gitbook/assets/authentication-oauth-ms-6.png new file mode 100644 index 00000000..1d231c0b Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-6.png differ diff --git a/.gitbook/assets/authentication-oauth-ms-7.png b/.gitbook/assets/authentication-oauth-ms-7.png new file mode 100644 index 00000000..0537be00 Binary files /dev/null and b/.gitbook/assets/authentication-oauth-ms-7.png differ diff --git a/.gitbook/assets/be-aci-containers-add-1.gif b/.gitbook/assets/be-aci-containers-add-1.gif new file mode 100644 index 00000000..79f49536 Binary files /dev/null and b/.gitbook/assets/be-aci-containers-add-1.gif differ diff --git a/.gitbook/assets/be-aci-containers-remove-1.gif b/.gitbook/assets/be-aci-containers-remove-1.gif new file mode 100644 index 00000000..a2c4a358 Binary files /dev/null and b/.gitbook/assets/be-aci-containers-remove-1.gif differ diff --git a/.gitbook/assets/be-aci-dashboard-1.png b/.gitbook/assets/be-aci-dashboard-1.png new file mode 100644 index 00000000..3015e361 Binary files /dev/null and b/.gitbook/assets/be-aci-dashboard-1.png differ diff --git a/.gitbook/assets/be-agent-aci-1.gif b/.gitbook/assets/be-agent-aci-1.gif new file mode 100644 index 00000000..95b37a23 Binary files /dev/null and b/.gitbook/assets/be-agent-aci-1.gif differ diff --git a/.gitbook/assets/be-agent-k8s-baremetal-2.png b/.gitbook/assets/be-agent-k8s-baremetal-2.png new file mode 100644 index 00000000..e944ccf0 Binary files /dev/null and b/.gitbook/assets/be-agent-k8s-baremetal-2.png differ diff --git a/.gitbook/assets/be-agent-k8s-baremetal-4.png b/.gitbook/assets/be-agent-k8s-baremetal-4.png new file mode 100644 index 00000000..c0c529e2 Binary files /dev/null and b/.gitbook/assets/be-agent-k8s-baremetal-4.png differ diff --git a/.gitbook/assets/be-agent-k8s-baremetal-7.png b/.gitbook/assets/be-agent-k8s-baremetal-7.png new file mode 100644 index 00000000..e42fc104 Binary files /dev/null and b/.gitbook/assets/be-agent-k8s-baremetal-7.png differ diff --git a/.gitbook/assets/be-agent-k8s-baremetal-8.png b/.gitbook/assets/be-agent-k8s-baremetal-8.png new file mode 100644 index 00000000..c8af866b Binary files /dev/null and b/.gitbook/assets/be-agent-k8s-baremetal-8.png differ diff --git a/.gitbook/assets/be-agent-swarm-linux-1.gif b/.gitbook/assets/be-agent-swarm-linux-1.gif new file mode 100644 index 00000000..e2d79553 Binary files /dev/null and b/.gitbook/assets/be-agent-swarm-linux-1.gif differ diff --git a/.gitbook/assets/be-agent-swarm-linux-2.png b/.gitbook/assets/be-agent-swarm-linux-2.png new file mode 100644 index 00000000..93eb9203 Binary files /dev/null and b/.gitbook/assets/be-agent-swarm-linux-2.png differ diff --git a/.gitbook/assets/be-agent-swarm-wsl-2.png b/.gitbook/assets/be-agent-swarm-wsl-2.png new file mode 100644 index 00000000..117e5476 Binary files /dev/null and b/.gitbook/assets/be-agent-swarm-wsl-2.png differ diff --git a/.gitbook/assets/be-applications-add-1.gif b/.gitbook/assets/be-applications-add-1.gif new file mode 100644 index 00000000..383950fc Binary files /dev/null and b/.gitbook/assets/be-applications-add-1.gif differ diff --git a/.gitbook/assets/be-applications-advanced-1.gif b/.gitbook/assets/be-applications-advanced-1.gif new file mode 100644 index 00000000..f141dbe0 Binary files /dev/null and b/.gitbook/assets/be-applications-advanced-1.gif differ diff --git a/.gitbook/assets/be-applications-detach-volume-1.gif b/.gitbook/assets/be-applications-detach-volume-1.gif new file mode 100644 index 00000000..6998b525 Binary files /dev/null and b/.gitbook/assets/be-applications-detach-volume-1.gif differ diff --git a/.gitbook/assets/be-applications-inspect-1.gif b/.gitbook/assets/be-applications-inspect-1.gif new file mode 100644 index 00000000..29f65786 Binary files /dev/null and b/.gitbook/assets/be-applications-inspect-1.gif differ diff --git a/.gitbook/assets/be-applications-remove-1.gif b/.gitbook/assets/be-applications-remove-1.gif new file mode 100644 index 00000000..d2f97106 Binary files /dev/null and b/.gitbook/assets/be-applications-remove-1.gif differ diff --git a/.gitbook/assets/be-authentication-ad-1.gif b/.gitbook/assets/be-authentication-ad-1.gif new file mode 100644 index 00000000..86b63a7a Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-1.gif differ diff --git a/.gitbook/assets/be-authentication-ad-2.png b/.gitbook/assets/be-authentication-ad-2.png new file mode 100644 index 00000000..00f67562 Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-2.png differ diff --git a/.gitbook/assets/be-authentication-ad-3.png b/.gitbook/assets/be-authentication-ad-3.png new file mode 100644 index 00000000..59853d52 Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-3.png differ diff --git a/.gitbook/assets/be-authentication-ad-4.png b/.gitbook/assets/be-authentication-ad-4.png new file mode 100644 index 00000000..a7b3a691 Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-4.png differ diff --git a/.gitbook/assets/be-authentication-ad-5.png b/.gitbook/assets/be-authentication-ad-5.png new file mode 100644 index 00000000..0f327238 Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-5.png differ diff --git a/.gitbook/assets/be-authentication-ad-6.png b/.gitbook/assets/be-authentication-ad-6.png new file mode 100644 index 00000000..4ad4b84e Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-6.png differ diff --git a/.gitbook/assets/be-authentication-ad-7.png b/.gitbook/assets/be-authentication-ad-7.png new file mode 100644 index 00000000..84b69531 Binary files /dev/null and b/.gitbook/assets/be-authentication-ad-7.png differ diff --git a/.gitbook/assets/be-authentication-ldap-1.gif b/.gitbook/assets/be-authentication-ldap-1.gif new file mode 100644 index 00000000..f0604944 Binary files /dev/null and b/.gitbook/assets/be-authentication-ldap-1.gif differ diff --git a/.gitbook/assets/be-authentication-oauth-1.gif b/.gitbook/assets/be-authentication-oauth-1.gif new file mode 100644 index 00000000..9b257cfc Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-1.gif differ diff --git a/.gitbook/assets/be-authentication-oauth-2.png b/.gitbook/assets/be-authentication-oauth-2.png new file mode 100644 index 00000000..4ccc65d7 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-2.png differ diff --git a/.gitbook/assets/be-authentication-oauth-3.png b/.gitbook/assets/be-authentication-oauth-3.png new file mode 100644 index 00000000..c96ac610 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-3.png differ diff --git a/.gitbook/assets/be-authentication-oauth-custom.png b/.gitbook/assets/be-authentication-oauth-custom.png new file mode 100644 index 00000000..cf965a74 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-custom.png differ diff --git a/.gitbook/assets/be-authentication-oauth-github.png b/.gitbook/assets/be-authentication-oauth-github.png new file mode 100644 index 00000000..46e9bf64 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-github.png differ diff --git a/.gitbook/assets/be-authentication-oauth-google.png b/.gitbook/assets/be-authentication-oauth-google.png new file mode 100644 index 00000000..9bda29e2 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-google.png differ diff --git a/.gitbook/assets/be-authentication-oauth-microsoft.png b/.gitbook/assets/be-authentication-oauth-microsoft.png new file mode 100644 index 00000000..b571c599 Binary files /dev/null and b/.gitbook/assets/be-authentication-oauth-microsoft.png differ diff --git a/.gitbook/assets/be-cluster-1.gif b/.gitbook/assets/be-cluster-1.gif new file mode 100644 index 00000000..81446a6f Binary files /dev/null and b/.gitbook/assets/be-cluster-1.gif differ diff --git a/.gitbook/assets/be-cluster-node-1.gif b/.gitbook/assets/be-cluster-node-1.gif new file mode 100644 index 00000000..6059ddbc Binary files /dev/null and b/.gitbook/assets/be-cluster-node-1.gif differ diff --git a/.gitbook/assets/be-cluster-setup-1.gif b/.gitbook/assets/be-cluster-setup-1.gif new file mode 100644 index 00000000..31efd803 Binary files /dev/null and b/.gitbook/assets/be-cluster-setup-1.gif differ diff --git a/.gitbook/assets/be-cluster-setup-3.png b/.gitbook/assets/be-cluster-setup-3.png new file mode 100644 index 00000000..6f0d52ad Binary files /dev/null and b/.gitbook/assets/be-cluster-setup-3.png differ diff --git a/.gitbook/assets/be-cluster-setup-4.png b/.gitbook/assets/be-cluster-setup-4.png new file mode 100644 index 00000000..82858a9a Binary files /dev/null and b/.gitbook/assets/be-cluster-setup-4.png differ diff --git a/.gitbook/assets/be-configs-add-1.gif b/.gitbook/assets/be-configs-add-1.gif new file mode 100644 index 00000000..7b09637d Binary files /dev/null and b/.gitbook/assets/be-configs-add-1.gif differ diff --git a/.gitbook/assets/be-configs-remove-1.gif b/.gitbook/assets/be-configs-remove-1.gif new file mode 100644 index 00000000..6d8c7b25 Binary files /dev/null and b/.gitbook/assets/be-configs-remove-1.gif differ diff --git a/.gitbook/assets/be-configurations-add-1.gif b/.gitbook/assets/be-configurations-add-1.gif new file mode 100644 index 00000000..facff9da Binary files /dev/null and b/.gitbook/assets/be-configurations-add-1.gif differ diff --git a/.gitbook/assets/be-configurations-remove-1.gif b/.gitbook/assets/be-configurations-remove-1.gif new file mode 100644 index 00000000..5f838f18 Binary files /dev/null and b/.gitbook/assets/be-configurations-remove-1.gif differ diff --git a/.gitbook/assets/be-containers-add-1.gif b/.gitbook/assets/be-containers-add-1.gif new file mode 100644 index 00000000..9332ade4 Binary files /dev/null and b/.gitbook/assets/be-containers-add-1.gif differ diff --git a/.gitbook/assets/be-containers-console-1.gif b/.gitbook/assets/be-containers-console-1.gif new file mode 100644 index 00000000..d0563589 Binary files /dev/null and b/.gitbook/assets/be-containers-console-1.gif differ diff --git a/.gitbook/assets/be-containers-edit-1.gif b/.gitbook/assets/be-containers-edit-1.gif new file mode 100644 index 00000000..1001c8ef Binary files /dev/null and b/.gitbook/assets/be-containers-edit-1.gif differ diff --git a/.gitbook/assets/be-containers-inspect-1.gif b/.gitbook/assets/be-containers-inspect-1.gif new file mode 100644 index 00000000..f0c267aa Binary files /dev/null and b/.gitbook/assets/be-containers-inspect-1.gif differ diff --git a/.gitbook/assets/be-containers-logs-1.gif b/.gitbook/assets/be-containers-logs-1.gif new file mode 100644 index 00000000..ce86f84d Binary files /dev/null and b/.gitbook/assets/be-containers-logs-1.gif differ diff --git a/.gitbook/assets/be-containers-remove-1.gif b/.gitbook/assets/be-containers-remove-1.gif new file mode 100644 index 00000000..5b1754f0 Binary files /dev/null and b/.gitbook/assets/be-containers-remove-1.gif differ diff --git a/.gitbook/assets/be-containers-stats-1.gif b/.gitbook/assets/be-containers-stats-1.gif new file mode 100644 index 00000000..2b7b4ded Binary files /dev/null and b/.gitbook/assets/be-containers-stats-1.gif differ diff --git a/.gitbook/assets/be-containers-view-1.gif b/.gitbook/assets/be-containers-view-1.gif new file mode 100644 index 00000000..9e4e750c Binary files /dev/null and b/.gitbook/assets/be-containers-view-1.gif differ diff --git a/.gitbook/assets/be-docker-dashboard-3.png b/.gitbook/assets/be-docker-dashboard-3.png new file mode 100644 index 00000000..d806c225 Binary files /dev/null and b/.gitbook/assets/be-docker-dashboard-3.png differ diff --git a/.gitbook/assets/be-edge-groups-1.gif b/.gitbook/assets/be-edge-groups-1.gif new file mode 100644 index 00000000..f95ab1ca Binary files /dev/null and b/.gitbook/assets/be-edge-groups-1.gif differ diff --git a/.gitbook/assets/be-edge-jobs-1.gif b/.gitbook/assets/be-edge-jobs-1.gif new file mode 100644 index 00000000..97223ade Binary files /dev/null and b/.gitbook/assets/be-edge-jobs-1.gif differ diff --git a/.gitbook/assets/be-edge-stacks-1.gif b/.gitbook/assets/be-edge-stacks-1.gif new file mode 100644 index 00000000..68d3ba83 Binary files /dev/null and b/.gitbook/assets/be-edge-stacks-1.gif differ diff --git a/.gitbook/assets/be-endpoints-access-1.gif b/.gitbook/assets/be-endpoints-access-1.gif new file mode 100644 index 00000000..499f9391 Binary files /dev/null and b/.gitbook/assets/be-endpoints-access-1.gif differ diff --git a/.gitbook/assets/be-endpoints-access-2.png b/.gitbook/assets/be-endpoints-access-2.png new file mode 100644 index 00000000..d1e922a6 Binary files /dev/null and b/.gitbook/assets/be-endpoints-access-2.png differ diff --git a/.gitbook/assets/be-endpoints-access-groups-1.gif b/.gitbook/assets/be-endpoints-access-groups-1.gif new file mode 100644 index 00000000..0ed79267 Binary files /dev/null and b/.gitbook/assets/be-endpoints-access-groups-1.gif differ diff --git a/.gitbook/assets/be-endpoints-add-1.gif b/.gitbook/assets/be-endpoints-add-1.gif new file mode 100644 index 00000000..111ba5c9 Binary files /dev/null and b/.gitbook/assets/be-endpoints-add-1.gif differ diff --git a/.gitbook/assets/be-endpoints-add-aci-1.gif b/.gitbook/assets/be-endpoints-add-aci-1.gif new file mode 100644 index 00000000..e3f50979 Binary files /dev/null and b/.gitbook/assets/be-endpoints-add-aci-1.gif differ diff --git a/.gitbook/assets/be-endpoints-add-edge-1.gif b/.gitbook/assets/be-endpoints-add-edge-1.gif new file mode 100644 index 00000000..f8d43456 Binary files /dev/null and b/.gitbook/assets/be-endpoints-add-edge-1.gif differ diff --git a/.gitbook/assets/be-endpoints-groups-1.gif b/.gitbook/assets/be-endpoints-groups-1.gif new file mode 100644 index 00000000..3cffbef5 Binary files /dev/null and b/.gitbook/assets/be-endpoints-groups-1.gif differ diff --git a/.gitbook/assets/be-endpoints-tags-1.gif b/.gitbook/assets/be-endpoints-tags-1.gif new file mode 100644 index 00000000..4af1c54e Binary files /dev/null and b/.gitbook/assets/be-endpoints-tags-1.gif differ diff --git a/.gitbook/assets/be-endpoints-tags-2.gif b/.gitbook/assets/be-endpoints-tags-2.gif new file mode 100644 index 00000000..87cafa0c Binary files /dev/null and b/.gitbook/assets/be-endpoints-tags-2.gif differ diff --git a/.gitbook/assets/be-images-build-1.gif b/.gitbook/assets/be-images-build-1.gif new file mode 100644 index 00000000..1537e415 Binary files /dev/null and b/.gitbook/assets/be-images-build-1.gif differ diff --git a/.gitbook/assets/be-images-export-1.gif b/.gitbook/assets/be-images-export-1.gif new file mode 100644 index 00000000..e52d3473 Binary files /dev/null and b/.gitbook/assets/be-images-export-1.gif differ diff --git a/.gitbook/assets/be-images-import-1.gif b/.gitbook/assets/be-images-import-1.gif new file mode 100644 index 00000000..727bdf62 Binary files /dev/null and b/.gitbook/assets/be-images-import-1.gif differ diff --git a/.gitbook/assets/be-k8s-dashboard-2.png b/.gitbook/assets/be-k8s-dashboard-2.png new file mode 100644 index 00000000..03df1492 Binary files /dev/null and b/.gitbook/assets/be-k8s-dashboard-2.png differ diff --git a/.gitbook/assets/be-k8s-volumes-inspect-1.gif b/.gitbook/assets/be-k8s-volumes-inspect-1.gif new file mode 100644 index 00000000..49ea096a Binary files /dev/null and b/.gitbook/assets/be-k8s-volumes-inspect-1.gif differ diff --git a/.gitbook/assets/be-k8s-volumes-remove-1.gif b/.gitbook/assets/be-k8s-volumes-remove-1.gif new file mode 100644 index 00000000..5698c9f8 Binary files /dev/null and b/.gitbook/assets/be-k8s-volumes-remove-1.gif differ diff --git a/.gitbook/assets/be-licenses-1.png b/.gitbook/assets/be-licenses-1.png new file mode 100644 index 00000000..7f2eecb0 Binary files /dev/null and b/.gitbook/assets/be-licenses-1.png differ diff --git a/.gitbook/assets/be-licenses-2.png b/.gitbook/assets/be-licenses-2.png new file mode 100644 index 00000000..e96f7505 Binary files /dev/null and b/.gitbook/assets/be-licenses-2.png differ diff --git a/.gitbook/assets/be-licenses-3.png b/.gitbook/assets/be-licenses-3.png new file mode 100644 index 00000000..b78ef667 Binary files /dev/null and b/.gitbook/assets/be-licenses-3.png differ diff --git a/.gitbook/assets/be-logs-1.gif b/.gitbook/assets/be-logs-1.gif new file mode 100644 index 00000000..7084db74 Binary files /dev/null and b/.gitbook/assets/be-logs-1.gif differ diff --git a/.gitbook/assets/be-logs-2.png b/.gitbook/assets/be-logs-2.png new file mode 100644 index 00000000..f3450d0c Binary files /dev/null and b/.gitbook/assets/be-logs-2.png differ diff --git a/.gitbook/assets/be-logs-3.png b/.gitbook/assets/be-logs-3.png new file mode 100644 index 00000000..13539b5c Binary files /dev/null and b/.gitbook/assets/be-logs-3.png differ diff --git a/.gitbook/assets/be-logs-activity-1.gif b/.gitbook/assets/be-logs-activity-1.gif new file mode 100644 index 00000000..d856af49 Binary files /dev/null and b/.gitbook/assets/be-logs-activity-1.gif differ diff --git a/.gitbook/assets/be-logs-activity-2.png b/.gitbook/assets/be-logs-activity-2.png new file mode 100644 index 00000000..4a8cb73f Binary files /dev/null and b/.gitbook/assets/be-logs-activity-2.png differ diff --git a/.gitbook/assets/be-logs-activity-3.png b/.gitbook/assets/be-logs-activity-3.png new file mode 100644 index 00000000..66ca262e Binary files /dev/null and b/.gitbook/assets/be-logs-activity-3.png differ diff --git a/.gitbook/assets/be-logs-activity-4.png b/.gitbook/assets/be-logs-activity-4.png new file mode 100644 index 00000000..357fb6bd Binary files /dev/null and b/.gitbook/assets/be-logs-activity-4.png differ diff --git a/.gitbook/assets/be-namespaces-access-1.gif b/.gitbook/assets/be-namespaces-access-1.gif new file mode 100644 index 00000000..392030a0 Binary files /dev/null and b/.gitbook/assets/be-namespaces-access-1.gif differ diff --git a/.gitbook/assets/be-namespaces-add-1.gif b/.gitbook/assets/be-namespaces-add-1.gif new file mode 100644 index 00000000..cf1c6a43 Binary files /dev/null and b/.gitbook/assets/be-namespaces-add-1.gif differ diff --git a/.gitbook/assets/be-namespaces-remove-1.gif b/.gitbook/assets/be-namespaces-remove-1.gif new file mode 100644 index 00000000..32e2237f Binary files /dev/null and b/.gitbook/assets/be-namespaces-remove-1.gif differ diff --git a/.gitbook/assets/be-networks-add-1.gif b/.gitbook/assets/be-networks-add-1.gif new file mode 100644 index 00000000..e81230bf Binary files /dev/null and b/.gitbook/assets/be-networks-add-1.gif differ diff --git a/.gitbook/assets/be-networks-remove-1.gif b/.gitbook/assets/be-networks-remove-1.gif new file mode 100644 index 00000000..d49b7f0c Binary files /dev/null and b/.gitbook/assets/be-networks-remove-1.gif differ diff --git a/.gitbook/assets/be-registries-add-1.gif b/.gitbook/assets/be-registries-add-1.gif new file mode 100644 index 00000000..64f3e11f Binary files /dev/null and b/.gitbook/assets/be-registries-add-1.gif differ diff --git a/.gitbook/assets/be-registries-add-azure-1.gif b/.gitbook/assets/be-registries-add-azure-1.gif new file mode 100644 index 00000000..5b305ced Binary files /dev/null and b/.gitbook/assets/be-registries-add-azure-1.gif differ diff --git a/.gitbook/assets/be-registries-add-azure-2.png b/.gitbook/assets/be-registries-add-azure-2.png new file mode 100644 index 00000000..f267d43c Binary files /dev/null and b/.gitbook/assets/be-registries-add-azure-2.png differ diff --git a/.gitbook/assets/be-registries-add-gitlab-1.gif b/.gitbook/assets/be-registries-add-gitlab-1.gif new file mode 100644 index 00000000..ee80aabe Binary files /dev/null and b/.gitbook/assets/be-registries-add-gitlab-1.gif differ diff --git a/.gitbook/assets/be-registries-add-gitlab-2.png b/.gitbook/assets/be-registries-add-gitlab-2.png new file mode 100644 index 00000000..5d005a13 Binary files /dev/null and b/.gitbook/assets/be-registries-add-gitlab-2.png differ diff --git a/.gitbook/assets/be-registries-add-proget-1.gif b/.gitbook/assets/be-registries-add-proget-1.gif new file mode 100644 index 00000000..d8473f51 Binary files /dev/null and b/.gitbook/assets/be-registries-add-proget-1.gif differ diff --git a/.gitbook/assets/be-registries-add-proget-2.png b/.gitbook/assets/be-registries-add-proget-2.png new file mode 100644 index 00000000..6b731785 Binary files /dev/null and b/.gitbook/assets/be-registries-add-proget-2.png differ diff --git a/.gitbook/assets/be-registries-add-quay-1.gif b/.gitbook/assets/be-registries-add-quay-1.gif new file mode 100644 index 00000000..438ff613 Binary files /dev/null and b/.gitbook/assets/be-registries-add-quay-1.gif differ diff --git a/.gitbook/assets/be-registries-add-quay-2.png b/.gitbook/assets/be-registries-add-quay-2.png new file mode 100644 index 00000000..41a4999e Binary files /dev/null and b/.gitbook/assets/be-registries-add-quay-2.png differ diff --git a/.gitbook/assets/be-registries-browse-1.gif b/.gitbook/assets/be-registries-browse-1.gif new file mode 100644 index 00000000..2850d612 Binary files /dev/null and b/.gitbook/assets/be-registries-browse-1.gif differ diff --git a/.gitbook/assets/be-registries-browse-2.png b/.gitbook/assets/be-registries-browse-2.png new file mode 100644 index 00000000..edb5c359 Binary files /dev/null and b/.gitbook/assets/be-registries-browse-2.png differ diff --git a/.gitbook/assets/be-registries-browse-3.png b/.gitbook/assets/be-registries-browse-3.png new file mode 100644 index 00000000..e9e0761d Binary files /dev/null and b/.gitbook/assets/be-registries-browse-3.png differ diff --git a/.gitbook/assets/be-registries-manage-1.gif b/.gitbook/assets/be-registries-manage-1.gif new file mode 100644 index 00000000..b6f94dc8 Binary files /dev/null and b/.gitbook/assets/be-registries-manage-1.gif differ diff --git a/.gitbook/assets/be-registries-manage-2.png b/.gitbook/assets/be-registries-manage-2.png new file mode 100644 index 00000000..c9c16af7 Binary files /dev/null and b/.gitbook/assets/be-registries-manage-2.png differ diff --git a/.gitbook/assets/be-registries-manage-3.png b/.gitbook/assets/be-registries-manage-3.png new file mode 100644 index 00000000..b6ec5606 Binary files /dev/null and b/.gitbook/assets/be-registries-manage-3.png differ diff --git a/.gitbook/assets/be-registries-manage-4.gif b/.gitbook/assets/be-registries-manage-4.gif new file mode 100644 index 00000000..e15ccaac Binary files /dev/null and b/.gitbook/assets/be-registries-manage-4.gif differ diff --git a/.gitbook/assets/be-roles-1.png b/.gitbook/assets/be-roles-1.png new file mode 100644 index 00000000..222f9c29 Binary files /dev/null and b/.gitbook/assets/be-roles-1.png differ diff --git a/.gitbook/assets/be-roles-2.gif b/.gitbook/assets/be-roles-2.gif new file mode 100644 index 00000000..e1bba91e Binary files /dev/null and b/.gitbook/assets/be-roles-2.gif differ diff --git a/.gitbook/assets/be-roles-3.png b/.gitbook/assets/be-roles-3.png new file mode 100644 index 00000000..22170dd2 Binary files /dev/null and b/.gitbook/assets/be-roles-3.png differ diff --git a/.gitbook/assets/be-secrets-add-1.gif b/.gitbook/assets/be-secrets-add-1.gif new file mode 100644 index 00000000..193ec351 Binary files /dev/null and b/.gitbook/assets/be-secrets-add-1.gif differ diff --git a/.gitbook/assets/be-secrets-remove-1.gif b/.gitbook/assets/be-secrets-remove-1.gif new file mode 100644 index 00000000..2311ba7e Binary files /dev/null and b/.gitbook/assets/be-secrets-remove-1.gif differ diff --git a/.gitbook/assets/be-server-setup-1.png b/.gitbook/assets/be-server-setup-1.png new file mode 100644 index 00000000..f5d4cf50 Binary files /dev/null and b/.gitbook/assets/be-server-setup-1.png differ diff --git a/.gitbook/assets/be-server-setup-5.png b/.gitbook/assets/be-server-setup-5.png new file mode 100644 index 00000000..925a20a1 Binary files /dev/null and b/.gitbook/assets/be-server-setup-5.png differ diff --git a/.gitbook/assets/be-services-add-1.gif b/.gitbook/assets/be-services-add-1.gif new file mode 100644 index 00000000..40e12659 Binary files /dev/null and b/.gitbook/assets/be-services-add-1.gif differ diff --git a/.gitbook/assets/be-services-configure-1.gif b/.gitbook/assets/be-services-configure-1.gif new file mode 100644 index 00000000..f2dbb71a Binary files /dev/null and b/.gitbook/assets/be-services-configure-1.gif differ diff --git a/.gitbook/assets/be-services-logs-1.gif b/.gitbook/assets/be-services-logs-1.gif new file mode 100644 index 00000000..58425d1a Binary files /dev/null and b/.gitbook/assets/be-services-logs-1.gif differ diff --git a/.gitbook/assets/be-services-rollback-1.gif b/.gitbook/assets/be-services-rollback-1.gif new file mode 100644 index 00000000..0cb1900c Binary files /dev/null and b/.gitbook/assets/be-services-rollback-1.gif differ diff --git a/.gitbook/assets/be-services-scale-1.gif b/.gitbook/assets/be-services-scale-1.gif new file mode 100644 index 00000000..94201a62 Binary files /dev/null and b/.gitbook/assets/be-services-scale-1.gif differ diff --git a/.gitbook/assets/be-services-tasks-1.gif b/.gitbook/assets/be-services-tasks-1.gif new file mode 100644 index 00000000..e8db77c8 Binary files /dev/null and b/.gitbook/assets/be-services-tasks-1.gif differ diff --git a/.gitbook/assets/be-settings-backup-1.gif b/.gitbook/assets/be-settings-backup-1.gif new file mode 100644 index 00000000..d564ef36 Binary files /dev/null and b/.gitbook/assets/be-settings-backup-1.gif differ diff --git a/.gitbook/assets/be-settings-backup-2.png b/.gitbook/assets/be-settings-backup-2.png new file mode 100644 index 00000000..cdab6dc7 Binary files /dev/null and b/.gitbook/assets/be-settings-backup-2.png differ diff --git a/.gitbook/assets/be-settings-backup-3.png b/.gitbook/assets/be-settings-backup-3.png new file mode 100644 index 00000000..f079eb07 Binary files /dev/null and b/.gitbook/assets/be-settings-backup-3.png differ diff --git a/.gitbook/assets/be-settings-backup-s3.png b/.gitbook/assets/be-settings-backup-s3.png new file mode 100644 index 00000000..b3b250ae Binary files /dev/null and b/.gitbook/assets/be-settings-backup-s3.png differ diff --git a/.gitbook/assets/be-settings-edge-compute-1.gif b/.gitbook/assets/be-settings-edge-compute-1.gif new file mode 100644 index 00000000..dcd2b7a6 Binary files /dev/null and b/.gitbook/assets/be-settings-edge-compute-1.gif differ diff --git a/.gitbook/assets/be-settings-edge-compute-2.png b/.gitbook/assets/be-settings-edge-compute-2.png new file mode 100644 index 00000000..b9ded22e Binary files /dev/null and b/.gitbook/assets/be-settings-edge-compute-2.png differ diff --git a/.gitbook/assets/be-stacks-add-1.gif b/.gitbook/assets/be-stacks-add-1.gif new file mode 100644 index 00000000..7c39fbd3 Binary files /dev/null and b/.gitbook/assets/be-stacks-add-1.gif differ diff --git a/.gitbook/assets/be-stacks-edit-1.gif b/.gitbook/assets/be-stacks-edit-1.gif new file mode 100644 index 00000000..df588c5c Binary files /dev/null and b/.gitbook/assets/be-stacks-edit-1.gif differ diff --git a/.gitbook/assets/be-stacks-remove-1.gif b/.gitbook/assets/be-stacks-remove-1.gif new file mode 100644 index 00000000..3c9914ab Binary files /dev/null and b/.gitbook/assets/be-stacks-remove-1.gif differ diff --git a/.gitbook/assets/be-stacks-template-1.gif b/.gitbook/assets/be-stacks-template-1.gif new file mode 100644 index 00000000..84d423a5 Binary files /dev/null and b/.gitbook/assets/be-stacks-template-1.gif differ diff --git a/.gitbook/assets/be-teams-add-1.gif b/.gitbook/assets/be-teams-add-1.gif new file mode 100644 index 00000000..d372a3e8 Binary files /dev/null and b/.gitbook/assets/be-teams-add-1.gif differ diff --git a/.gitbook/assets/be-templates-custom-1.gif b/.gitbook/assets/be-templates-custom-1.gif new file mode 100644 index 00000000..de7b652e Binary files /dev/null and b/.gitbook/assets/be-templates-custom-1.gif differ diff --git a/.gitbook/assets/be-templates-deploy-container-1.gif b/.gitbook/assets/be-templates-deploy-container-1.gif new file mode 100644 index 00000000..bb14ebee Binary files /dev/null and b/.gitbook/assets/be-templates-deploy-container-1.gif differ diff --git a/.gitbook/assets/be-templates-deploy-stack-1.gif b/.gitbook/assets/be-templates-deploy-stack-1.gif new file mode 100644 index 00000000..0d9749bb Binary files /dev/null and b/.gitbook/assets/be-templates-deploy-stack-1.gif differ diff --git a/.gitbook/assets/be-upgrade-k8s-1.gif b/.gitbook/assets/be-upgrade-k8s-1.gif new file mode 100644 index 00000000..6e1a898d Binary files /dev/null and b/.gitbook/assets/be-upgrade-k8s-1.gif differ diff --git a/.gitbook/assets/be-users-add-1.gif b/.gitbook/assets/be-users-add-1.gif new file mode 100644 index 00000000..1f348cbc Binary files /dev/null and b/.gitbook/assets/be-users-add-1.gif differ diff --git a/.gitbook/assets/be-users-promote-1.gif b/.gitbook/assets/be-users-promote-1.gif new file mode 100644 index 00000000..a49ddf3d Binary files /dev/null and b/.gitbook/assets/be-users-promote-1.gif differ diff --git a/.gitbook/assets/be-volumes-add-1.gif b/.gitbook/assets/be-volumes-add-1.gif new file mode 100644 index 00000000..f4aacf01 Binary files /dev/null and b/.gitbook/assets/be-volumes-add-1.gif differ diff --git a/.gitbook/assets/be-volumes-browse-1.gif b/.gitbook/assets/be-volumes-browse-1.gif new file mode 100644 index 00000000..e2dda2d0 Binary files /dev/null and b/.gitbook/assets/be-volumes-browse-1.gif differ diff --git a/.gitbook/assets/be-volumes-remove-1.gif b/.gitbook/assets/be-volumes-remove-1.gif new file mode 100644 index 00000000..12f6613d Binary files /dev/null and b/.gitbook/assets/be-volumes-remove-1.gif differ diff --git a/.gitbook/assets/button_be.png b/.gitbook/assets/button_be.png new file mode 100644 index 00000000..f8e305e0 Binary files /dev/null and b/.gitbook/assets/button_be.png differ diff --git a/.gitbook/assets/button_ce.png b/.gitbook/assets/button_ce.png new file mode 100644 index 00000000..25c27f98 Binary files /dev/null and b/.gitbook/assets/button_ce.png differ diff --git a/.gitbook/assets/cluster-1.gif b/.gitbook/assets/cluster-1.gif new file mode 100644 index 00000000..5663b149 Binary files /dev/null and b/.gitbook/assets/cluster-1.gif differ diff --git a/.gitbook/assets/cluster-node-1.gif b/.gitbook/assets/cluster-node-1.gif new file mode 100644 index 00000000..afd3fa66 Binary files /dev/null and b/.gitbook/assets/cluster-node-1.gif differ diff --git a/.gitbook/assets/cluster-node-2.png b/.gitbook/assets/cluster-node-2.png new file mode 100644 index 00000000..47a49f13 Binary files /dev/null and b/.gitbook/assets/cluster-node-2.png differ diff --git a/.gitbook/assets/cluster-node-3.png b/.gitbook/assets/cluster-node-3.png new file mode 100644 index 00000000..8effca1b Binary files /dev/null and b/.gitbook/assets/cluster-node-3.png differ diff --git a/.gitbook/assets/cluster-node-4.png b/.gitbook/assets/cluster-node-4.png new file mode 100644 index 00000000..84fc8634 Binary files /dev/null and b/.gitbook/assets/cluster-node-4.png differ diff --git a/.gitbook/assets/cluster-node-5.png b/.gitbook/assets/cluster-node-5.png new file mode 100644 index 00000000..361a30aa Binary files /dev/null and b/.gitbook/assets/cluster-node-5.png differ diff --git a/.gitbook/assets/cluster-node-6.png b/.gitbook/assets/cluster-node-6.png new file mode 100644 index 00000000..287259aa Binary files /dev/null and b/.gitbook/assets/cluster-node-6.png differ diff --git a/.gitbook/assets/cluster-node-7.png b/.gitbook/assets/cluster-node-7.png new file mode 100644 index 00000000..4ea16056 Binary files /dev/null and b/.gitbook/assets/cluster-node-7.png differ diff --git a/.gitbook/assets/cluster-setup-1.gif b/.gitbook/assets/cluster-setup-1.gif new file mode 100644 index 00000000..2049924c Binary files /dev/null and b/.gitbook/assets/cluster-setup-1.gif differ diff --git a/.gitbook/assets/cluster-setup-2.png b/.gitbook/assets/cluster-setup-2.png new file mode 100644 index 00000000..28efbfcc Binary files /dev/null and b/.gitbook/assets/cluster-setup-2.png differ diff --git a/.gitbook/assets/cluster-setup-3.png b/.gitbook/assets/cluster-setup-3.png new file mode 100644 index 00000000..8cf65f94 Binary files /dev/null and b/.gitbook/assets/cluster-setup-3.png differ diff --git a/.gitbook/assets/cluster-setup-4.png b/.gitbook/assets/cluster-setup-4.png new file mode 100644 index 00000000..1c2d0b6c Binary files /dev/null and b/.gitbook/assets/cluster-setup-4.png differ diff --git a/.gitbook/assets/cluster-setup-5.png b/.gitbook/assets/cluster-setup-5.png new file mode 100644 index 00000000..e441aa87 Binary files /dev/null and b/.gitbook/assets/cluster-setup-5.png differ diff --git a/.gitbook/assets/cluster-vis-1.png b/.gitbook/assets/cluster-vis-1.png new file mode 100644 index 00000000..071dc8f4 Binary files /dev/null and b/.gitbook/assets/cluster-vis-1.png differ diff --git a/.gitbook/assets/cluster-vis-2.png b/.gitbook/assets/cluster-vis-2.png new file mode 100644 index 00000000..08d6f083 Binary files /dev/null and b/.gitbook/assets/cluster-vis-2.png differ diff --git a/.gitbook/assets/configs-add-1.gif b/.gitbook/assets/configs-add-1.gif new file mode 100644 index 00000000..44f00308 Binary files /dev/null and b/.gitbook/assets/configs-add-1.gif differ diff --git a/.gitbook/assets/configs-add-2.png b/.gitbook/assets/configs-add-2.png new file mode 100644 index 00000000..fe4cc3c2 Binary files /dev/null and b/.gitbook/assets/configs-add-2.png differ diff --git a/.gitbook/assets/configs-remove-1.gif b/.gitbook/assets/configs-remove-1.gif new file mode 100644 index 00000000..5ea5ffd5 Binary files /dev/null and b/.gitbook/assets/configs-remove-1.gif differ diff --git a/.gitbook/assets/configurations-add-1.gif b/.gitbook/assets/configurations-add-1.gif new file mode 100644 index 00000000..32ec6a7e Binary files /dev/null and b/.gitbook/assets/configurations-add-1.gif differ diff --git a/.gitbook/assets/configurations-add-2.png b/.gitbook/assets/configurations-add-2.png new file mode 100644 index 00000000..e78b9adc Binary files /dev/null and b/.gitbook/assets/configurations-add-2.png differ diff --git a/.gitbook/assets/configurations-add-3.png b/.gitbook/assets/configurations-add-3.png new file mode 100644 index 00000000..3985c4d1 Binary files /dev/null and b/.gitbook/assets/configurations-add-3.png differ diff --git a/.gitbook/assets/configurations-add-4.png b/.gitbook/assets/configurations-add-4.png new file mode 100644 index 00000000..8f2d0ae9 Binary files /dev/null and b/.gitbook/assets/configurations-add-4.png differ diff --git a/.gitbook/assets/configurations-remove-1.gif b/.gitbook/assets/configurations-remove-1.gif new file mode 100644 index 00000000..f583ba87 Binary files /dev/null and b/.gitbook/assets/configurations-remove-1.gif differ diff --git a/.gitbook/assets/configurations-remove-2.png b/.gitbook/assets/configurations-remove-2.png new file mode 100644 index 00000000..182be77f Binary files /dev/null and b/.gitbook/assets/configurations-remove-2.png differ diff --git a/.gitbook/assets/containers-attach-volume-2.png b/.gitbook/assets/containers-attach-volume-2.png new file mode 100644 index 00000000..6633d55a Binary files /dev/null and b/.gitbook/assets/containers-attach-volume-2.png differ diff --git a/.gitbook/assets/containers-attach-volume-3.png b/.gitbook/assets/containers-attach-volume-3.png new file mode 100644 index 00000000..b4f43277 Binary files /dev/null and b/.gitbook/assets/containers-attach-volume-3.png differ diff --git a/.gitbook/assets/containers-console-1.gif b/.gitbook/assets/containers-console-1.gif new file mode 100644 index 00000000..ddff493a Binary files /dev/null and b/.gitbook/assets/containers-console-1.gif differ diff --git a/.gitbook/assets/containers-console-2.png b/.gitbook/assets/containers-console-2.png new file mode 100644 index 00000000..85c538b5 Binary files /dev/null and b/.gitbook/assets/containers-console-2.png differ diff --git a/.gitbook/assets/containers-console-3.png b/.gitbook/assets/containers-console-3.png new file mode 100644 index 00000000..d5eebb3f Binary files /dev/null and b/.gitbook/assets/containers-console-3.png differ diff --git a/.gitbook/assets/containers-create-1.gif b/.gitbook/assets/containers-create-1.gif new file mode 100644 index 00000000..95c1aa08 Binary files /dev/null and b/.gitbook/assets/containers-create-1.gif differ diff --git a/.gitbook/assets/containers-create-2.png b/.gitbook/assets/containers-create-2.png new file mode 100644 index 00000000..d107c62c Binary files /dev/null and b/.gitbook/assets/containers-create-2.png differ diff --git a/.gitbook/assets/containers-create-3.png b/.gitbook/assets/containers-create-3.png new file mode 100644 index 00000000..a059dbab Binary files /dev/null and b/.gitbook/assets/containers-create-3.png differ diff --git a/.gitbook/assets/containers-create-4.png b/.gitbook/assets/containers-create-4.png new file mode 100644 index 00000000..be8686a6 Binary files /dev/null and b/.gitbook/assets/containers-create-4.png differ diff --git a/.gitbook/assets/containers-create-5.png b/.gitbook/assets/containers-create-5.png new file mode 100644 index 00000000..2fa464b3 Binary files /dev/null and b/.gitbook/assets/containers-create-5.png differ diff --git a/.gitbook/assets/containers-create-6.png b/.gitbook/assets/containers-create-6.png new file mode 100644 index 00000000..55906252 Binary files /dev/null and b/.gitbook/assets/containers-create-6.png differ diff --git a/.gitbook/assets/containers-edit-1.gif b/.gitbook/assets/containers-edit-1.gif new file mode 100644 index 00000000..8c7e2923 Binary files /dev/null and b/.gitbook/assets/containers-edit-1.gif differ diff --git a/.gitbook/assets/containers-edit-2.png b/.gitbook/assets/containers-edit-2.png new file mode 100644 index 00000000..7a00459d Binary files /dev/null and b/.gitbook/assets/containers-edit-2.png differ diff --git a/.gitbook/assets/containers-inspect-1.gif b/.gitbook/assets/containers-inspect-1.gif new file mode 100644 index 00000000..6f0c375c Binary files /dev/null and b/.gitbook/assets/containers-inspect-1.gif differ diff --git a/.gitbook/assets/containers-inspect-2.png b/.gitbook/assets/containers-inspect-2.png new file mode 100644 index 00000000..3a564ea1 Binary files /dev/null and b/.gitbook/assets/containers-inspect-2.png differ diff --git a/.gitbook/assets/containers-inspect-3.png b/.gitbook/assets/containers-inspect-3.png new file mode 100644 index 00000000..975623f3 Binary files /dev/null and b/.gitbook/assets/containers-inspect-3.png differ diff --git a/.gitbook/assets/containers-logs-1.gif b/.gitbook/assets/containers-logs-1.gif new file mode 100644 index 00000000..b40afc5b Binary files /dev/null and b/.gitbook/assets/containers-logs-1.gif differ diff --git a/.gitbook/assets/containers-logs-2.png b/.gitbook/assets/containers-logs-2.png new file mode 100644 index 00000000..e6e82764 Binary files /dev/null and b/.gitbook/assets/containers-logs-2.png differ diff --git a/.gitbook/assets/containers-ownership-1.gif b/.gitbook/assets/containers-ownership-1.gif new file mode 100644 index 00000000..39c25f1e Binary files /dev/null and b/.gitbook/assets/containers-ownership-1.gif differ diff --git a/.gitbook/assets/containers-ownership-2.png b/.gitbook/assets/containers-ownership-2.png new file mode 100644 index 00000000..ba28823c Binary files /dev/null and b/.gitbook/assets/containers-ownership-2.png differ diff --git a/.gitbook/assets/containers-ownership-3.png b/.gitbook/assets/containers-ownership-3.png new file mode 100644 index 00000000..47f8e672 Binary files /dev/null and b/.gitbook/assets/containers-ownership-3.png differ diff --git a/.gitbook/assets/containers-remove-1.gif b/.gitbook/assets/containers-remove-1.gif new file mode 100644 index 00000000..361b1c94 Binary files /dev/null and b/.gitbook/assets/containers-remove-1.gif differ diff --git a/.gitbook/assets/containers-remove-2.png b/.gitbook/assets/containers-remove-2.png new file mode 100644 index 00000000..9e183070 Binary files /dev/null and b/.gitbook/assets/containers-remove-2.png differ diff --git a/.gitbook/assets/containers-stats-1.gif b/.gitbook/assets/containers-stats-1.gif new file mode 100644 index 00000000..ab59f63a Binary files /dev/null and b/.gitbook/assets/containers-stats-1.gif differ diff --git a/.gitbook/assets/containers-stats-2.png b/.gitbook/assets/containers-stats-2.png new file mode 100644 index 00000000..3515685d Binary files /dev/null and b/.gitbook/assets/containers-stats-2.png differ diff --git a/.gitbook/assets/containers-stats-3.png b/.gitbook/assets/containers-stats-3.png new file mode 100644 index 00000000..feb490f2 Binary files /dev/null and b/.gitbook/assets/containers-stats-3.png differ diff --git a/.gitbook/assets/containers-view-1.gif b/.gitbook/assets/containers-view-1.gif new file mode 100644 index 00000000..de4e5ee4 Binary files /dev/null and b/.gitbook/assets/containers-view-1.gif differ diff --git a/.gitbook/assets/containers-view-2.png b/.gitbook/assets/containers-view-2.png new file mode 100644 index 00000000..833dc439 Binary files /dev/null and b/.gitbook/assets/containers-view-2.png differ diff --git a/.gitbook/assets/containers-view-3.png b/.gitbook/assets/containers-view-3.png new file mode 100644 index 00000000..ff5d2622 Binary files /dev/null and b/.gitbook/assets/containers-view-3.png differ diff --git a/.gitbook/assets/containers-view-4.png b/.gitbook/assets/containers-view-4.png new file mode 100644 index 00000000..af080841 Binary files /dev/null and b/.gitbook/assets/containers-view-4.png differ diff --git a/.gitbook/assets/dashboard-aci-summarytiles.png b/.gitbook/assets/dashboard-aci-summarytiles.png new file mode 100644 index 00000000..a97aa910 Binary files /dev/null and b/.gitbook/assets/dashboard-aci-summarytiles.png differ diff --git a/.gitbook/assets/dashboard-clusterinfo.png b/.gitbook/assets/dashboard-clusterinfo.png new file mode 100644 index 00000000..85bf505c Binary files /dev/null and b/.gitbook/assets/dashboard-clusterinfo.png differ diff --git a/.gitbook/assets/dashboard-endpointinfo.png b/.gitbook/assets/dashboard-endpointinfo.png new file mode 100644 index 00000000..da3ec03b Binary files /dev/null and b/.gitbook/assets/dashboard-endpointinfo.png differ diff --git a/.gitbook/assets/dashboard-k8s-endpointinfo.png b/.gitbook/assets/dashboard-k8s-endpointinfo.png new file mode 100644 index 00000000..f8dddb29 Binary files /dev/null and b/.gitbook/assets/dashboard-k8s-endpointinfo.png differ diff --git a/.gitbook/assets/dashboard-k8s-summarytiles.png b/.gitbook/assets/dashboard-k8s-summarytiles.png new file mode 100644 index 00000000..25dcacdc Binary files /dev/null and b/.gitbook/assets/dashboard-k8s-summarytiles.png differ diff --git a/.gitbook/assets/dashboard-summarytiles.png b/.gitbook/assets/dashboard-summarytiles.png new file mode 100644 index 00000000..8030f6a6 Binary files /dev/null and b/.gitbook/assets/dashboard-summarytiles.png differ diff --git a/.gitbook/assets/docker-service-ls.png b/.gitbook/assets/docker-service-ls.png new file mode 100644 index 00000000..b7d5b4f3 Binary files /dev/null and b/.gitbook/assets/docker-service-ls.png differ diff --git a/.gitbook/assets/edge-1.png b/.gitbook/assets/edge-1.png new file mode 100644 index 00000000..53e69bc5 Binary files /dev/null and b/.gitbook/assets/edge-1.png differ diff --git a/.gitbook/assets/edge-2.png b/.gitbook/assets/edge-2.png new file mode 100644 index 00000000..c6b1155d Binary files /dev/null and b/.gitbook/assets/edge-2.png differ diff --git a/.gitbook/assets/edge-advanced-1.png b/.gitbook/assets/edge-advanced-1.png new file mode 100644 index 00000000..52e9fdc8 Binary files /dev/null and b/.gitbook/assets/edge-advanced-1.png differ diff --git a/.gitbook/assets/edge-advanced-2.png b/.gitbook/assets/edge-advanced-2.png new file mode 100644 index 00000000..e1229e5b Binary files /dev/null and b/.gitbook/assets/edge-advanced-2.png differ diff --git a/.gitbook/assets/edge-advanced-3.png b/.gitbook/assets/edge-advanced-3.png new file mode 100644 index 00000000..560e1a1b Binary files /dev/null and b/.gitbook/assets/edge-advanced-3.png differ diff --git a/.gitbook/assets/edge-jobs-1.gif b/.gitbook/assets/edge-jobs-1.gif new file mode 100644 index 00000000..8a27985e Binary files /dev/null and b/.gitbook/assets/edge-jobs-1.gif differ diff --git a/.gitbook/assets/edge-jobs-2.png b/.gitbook/assets/edge-jobs-2.png new file mode 100644 index 00000000..d7f2cb0a Binary files /dev/null and b/.gitbook/assets/edge-jobs-2.png differ diff --git a/.gitbook/assets/edge-stacks-1.gif b/.gitbook/assets/edge-stacks-1.gif new file mode 100644 index 00000000..2f0a685c Binary files /dev/null and b/.gitbook/assets/edge-stacks-1.gif differ diff --git a/.gitbook/assets/edge-stacks-2.png b/.gitbook/assets/edge-stacks-2.png new file mode 100644 index 00000000..51294975 Binary files /dev/null and b/.gitbook/assets/edge-stacks-2.png differ diff --git a/.gitbook/assets/edgecompute-enable-1.gif b/.gitbook/assets/edgecompute-enable-1.gif new file mode 100644 index 00000000..aa1310f3 Binary files /dev/null and b/.gitbook/assets/edgecompute-enable-1.gif differ diff --git a/.gitbook/assets/edgecompute-enable-2.png b/.gitbook/assets/edgecompute-enable-2.png new file mode 100644 index 00000000..4d5bc7c1 Binary files /dev/null and b/.gitbook/assets/edgecompute-enable-2.png differ diff --git a/.gitbook/assets/edgegroups-1.gif b/.gitbook/assets/edgegroups-1.gif new file mode 100644 index 00000000..86a0f970 Binary files /dev/null and b/.gitbook/assets/edgegroups-1.gif differ diff --git a/.gitbook/assets/edgegroups-1.png b/.gitbook/assets/edgegroups-1.png new file mode 100644 index 00000000..4664fe52 Binary files /dev/null and b/.gitbook/assets/edgegroups-1.png differ diff --git a/.gitbook/assets/edgegroups-2.png b/.gitbook/assets/edgegroups-2.png new file mode 100644 index 00000000..5d7ec4d2 Binary files /dev/null and b/.gitbook/assets/edgegroups-2.png differ diff --git a/.gitbook/assets/edgegroups-3.png b/.gitbook/assets/edgegroups-3.png new file mode 100644 index 00000000..7eff3020 Binary files /dev/null and b/.gitbook/assets/edgegroups-3.png differ diff --git a/.gitbook/assets/endpoints-access-1.gif b/.gitbook/assets/endpoints-access-1.gif new file mode 100644 index 00000000..2e613864 Binary files /dev/null and b/.gitbook/assets/endpoints-access-1.gif differ diff --git a/.gitbook/assets/endpoints-access-groups-1.gif b/.gitbook/assets/endpoints-access-groups-1.gif new file mode 100644 index 00000000..59f77ecb Binary files /dev/null and b/.gitbook/assets/endpoints-access-groups-1.gif differ diff --git a/.gitbook/assets/endpoints-add-aci-2.png b/.gitbook/assets/endpoints-add-aci-2.png new file mode 100644 index 00000000..49b5457e Binary files /dev/null and b/.gitbook/assets/endpoints-add-aci-2.png differ diff --git a/.gitbook/assets/endpoints-add-azure-1.gif b/.gitbook/assets/endpoints-add-azure-1.gif new file mode 100644 index 00000000..5075d93f Binary files /dev/null and b/.gitbook/assets/endpoints-add-azure-1.gif differ diff --git a/.gitbook/assets/endpoints-add-docker-2.png b/.gitbook/assets/endpoints-add-docker-2.png new file mode 100644 index 00000000..666c902a Binary files /dev/null and b/.gitbook/assets/endpoints-add-docker-2.png differ diff --git a/.gitbook/assets/endpoints-add-docker-3.png b/.gitbook/assets/endpoints-add-docker-3.png new file mode 100644 index 00000000..d48d2bab Binary files /dev/null and b/.gitbook/assets/endpoints-add-docker-3.png differ diff --git a/.gitbook/assets/endpoints-add-docker-4.png b/.gitbook/assets/endpoints-add-docker-4.png new file mode 100644 index 00000000..ecb3323d Binary files /dev/null and b/.gitbook/assets/endpoints-add-docker-4.png differ diff --git a/.gitbook/assets/endpoints-add-edge-1.gif b/.gitbook/assets/endpoints-add-edge-1.gif new file mode 100644 index 00000000..7b69d0fd Binary files /dev/null and b/.gitbook/assets/endpoints-add-edge-1.gif differ diff --git a/.gitbook/assets/endpoints-add-edge-2.png b/.gitbook/assets/endpoints-add-edge-2.png new file mode 100644 index 00000000..6874fe53 Binary files /dev/null and b/.gitbook/assets/endpoints-add-edge-2.png differ diff --git a/.gitbook/assets/endpoints-add-edge-3.png b/.gitbook/assets/endpoints-add-edge-3.png new file mode 100644 index 00000000..bfd2032c Binary files /dev/null and b/.gitbook/assets/endpoints-add-edge-3.png differ diff --git a/.gitbook/assets/endpoints-add-edge-4.png b/.gitbook/assets/endpoints-add-edge-4.png new file mode 100644 index 00000000..7647b94d Binary files /dev/null and b/.gitbook/assets/endpoints-add-edge-4.png differ diff --git a/.gitbook/assets/endpoints-add-k8s-2.png b/.gitbook/assets/endpoints-add-k8s-2.png new file mode 100644 index 00000000..8f6974b1 Binary files /dev/null and b/.gitbook/assets/endpoints-add-k8s-2.png differ diff --git a/.gitbook/assets/endpoints-add-k8s-3.png b/.gitbook/assets/endpoints-add-k8s-3.png new file mode 100644 index 00000000..a6915a61 Binary files /dev/null and b/.gitbook/assets/endpoints-add-k8s-3.png differ diff --git a/.gitbook/assets/endpoints-groups-1.gif b/.gitbook/assets/endpoints-groups-1.gif new file mode 100644 index 00000000..b1e6ee6f Binary files /dev/null and b/.gitbook/assets/endpoints-groups-1.gif differ diff --git a/.gitbook/assets/endpoints-groups-2.png b/.gitbook/assets/endpoints-groups-2.png new file mode 100644 index 00000000..f4c7c1c4 Binary files /dev/null and b/.gitbook/assets/endpoints-groups-2.png differ diff --git a/.gitbook/assets/endpoints-tags-1.gif b/.gitbook/assets/endpoints-tags-1.gif new file mode 100644 index 00000000..14e76419 Binary files /dev/null and b/.gitbook/assets/endpoints-tags-1.gif differ diff --git a/.gitbook/assets/endpoints-tags-2.gif b/.gitbook/assets/endpoints-tags-2.gif new file mode 100644 index 00000000..5807c0cf Binary files /dev/null and b/.gitbook/assets/endpoints-tags-2.gif differ diff --git a/.gitbook/assets/events-1.png b/.gitbook/assets/events-1.png new file mode 100644 index 00000000..78252984 Binary files /dev/null and b/.gitbook/assets/events-1.png differ diff --git a/.gitbook/assets/host-1.png b/.gitbook/assets/host-1.png new file mode 100644 index 00000000..5b2ac2f8 Binary files /dev/null and b/.gitbook/assets/host-1.png differ diff --git a/.gitbook/assets/host-2.png b/.gitbook/assets/host-2.png new file mode 100644 index 00000000..0a786c97 Binary files /dev/null and b/.gitbook/assets/host-2.png differ diff --git a/.gitbook/assets/host-3.png b/.gitbook/assets/host-3.png new file mode 100644 index 00000000..787d2522 Binary files /dev/null and b/.gitbook/assets/host-3.png differ diff --git a/.gitbook/assets/host-4.png b/.gitbook/assets/host-4.png new file mode 100644 index 00000000..e46ae918 Binary files /dev/null and b/.gitbook/assets/host-4.png differ diff --git a/.gitbook/assets/host-5.png b/.gitbook/assets/host-5.png new file mode 100644 index 00000000..96e41411 Binary files /dev/null and b/.gitbook/assets/host-5.png differ diff --git a/.gitbook/assets/https_only_toggle.gif b/.gitbook/assets/https_only_toggle.gif new file mode 100644 index 00000000..ea6ebe02 Binary files /dev/null and b/.gitbook/assets/https_only_toggle.gif differ diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png new file mode 100644 index 00000000..e2913d70 Binary files /dev/null and b/.gitbook/assets/image (1).png differ diff --git a/.gitbook/assets/image (10).png b/.gitbook/assets/image (10).png new file mode 100644 index 00000000..85142b88 Binary files /dev/null and b/.gitbook/assets/image (10).png differ diff --git a/.gitbook/assets/image (2).png b/.gitbook/assets/image (2).png new file mode 100644 index 00000000..a611218e Binary files /dev/null and b/.gitbook/assets/image (2).png differ diff --git a/.gitbook/assets/image (3) (1).png b/.gitbook/assets/image (3) (1).png new file mode 100644 index 00000000..c42f8532 Binary files /dev/null and b/.gitbook/assets/image (3) (1).png differ diff --git a/.gitbook/assets/image (3) (2).png b/.gitbook/assets/image (3) (2).png new file mode 100644 index 00000000..c42f8532 Binary files /dev/null and b/.gitbook/assets/image (3) (2).png differ diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png new file mode 100644 index 00000000..33b75352 Binary files /dev/null and b/.gitbook/assets/image (3).png differ diff --git a/.gitbook/assets/image (4).png b/.gitbook/assets/image (4).png new file mode 100644 index 00000000..9e3fbe55 Binary files /dev/null and b/.gitbook/assets/image (4).png differ diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png new file mode 100644 index 00000000..20e65226 Binary files /dev/null and b/.gitbook/assets/image (5).png differ diff --git a/.gitbook/assets/image (6).png b/.gitbook/assets/image (6).png new file mode 100644 index 00000000..422c7cc9 Binary files /dev/null and b/.gitbook/assets/image (6).png differ diff --git a/.gitbook/assets/image (7).png b/.gitbook/assets/image (7).png new file mode 100644 index 00000000..4921fd5c Binary files /dev/null and b/.gitbook/assets/image (7).png differ diff --git a/.gitbook/assets/image (8).png b/.gitbook/assets/image (8).png new file mode 100644 index 00000000..a3d7c3b6 Binary files /dev/null and b/.gitbook/assets/image (8).png differ diff --git a/.gitbook/assets/image (9).png b/.gitbook/assets/image (9).png new file mode 100644 index 00000000..88a01b09 Binary files /dev/null and b/.gitbook/assets/image (9).png differ diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png new file mode 100644 index 00000000..4921fd5c Binary files /dev/null and b/.gitbook/assets/image.png differ diff --git a/.gitbook/assets/images-build-1.gif b/.gitbook/assets/images-build-1.gif new file mode 100644 index 00000000..6bf3b11a Binary files /dev/null and b/.gitbook/assets/images-build-1.gif differ diff --git a/.gitbook/assets/images-build-2.png b/.gitbook/assets/images-build-2.png new file mode 100644 index 00000000..979662f5 Binary files /dev/null and b/.gitbook/assets/images-build-2.png differ diff --git a/.gitbook/assets/images-build-3.png b/.gitbook/assets/images-build-3.png new file mode 100644 index 00000000..4ff7c059 Binary files /dev/null and b/.gitbook/assets/images-build-3.png differ diff --git a/.gitbook/assets/images-build-4.png b/.gitbook/assets/images-build-4.png new file mode 100644 index 00000000..385a00a6 Binary files /dev/null and b/.gitbook/assets/images-build-4.png differ diff --git a/.gitbook/assets/images-build-5.png b/.gitbook/assets/images-build-5.png new file mode 100644 index 00000000..4ddcbee4 Binary files /dev/null and b/.gitbook/assets/images-build-5.png differ diff --git a/.gitbook/assets/images-export-1.gif b/.gitbook/assets/images-export-1.gif new file mode 100644 index 00000000..c5d23f28 Binary files /dev/null and b/.gitbook/assets/images-export-1.gif differ diff --git a/.gitbook/assets/images-export-2.png b/.gitbook/assets/images-export-2.png new file mode 100644 index 00000000..fd79ca36 Binary files /dev/null and b/.gitbook/assets/images-export-2.png differ diff --git a/.gitbook/assets/images-import-1.gif b/.gitbook/assets/images-import-1.gif new file mode 100644 index 00000000..26df6e98 Binary files /dev/null and b/.gitbook/assets/images-import-1.gif differ diff --git a/.gitbook/assets/images-import-2.png b/.gitbook/assets/images-import-2.png new file mode 100644 index 00000000..df108b78 Binary files /dev/null and b/.gitbook/assets/images-import-2.png differ diff --git a/.gitbook/assets/images-pull-1.png b/.gitbook/assets/images-pull-1.png new file mode 100644 index 00000000..db4f4407 Binary files /dev/null and b/.gitbook/assets/images-pull-1.png differ diff --git a/.gitbook/assets/images-pull-2.png b/.gitbook/assets/images-pull-2.png new file mode 100644 index 00000000..7b6367af Binary files /dev/null and b/.gitbook/assets/images-pull-2.png differ diff --git a/.gitbook/assets/initial-1.png b/.gitbook/assets/initial-1.png new file mode 100644 index 00000000..d2055909 Binary files /dev/null and b/.gitbook/assets/initial-1.png differ diff --git a/.gitbook/assets/initial-2.png b/.gitbook/assets/initial-2.png new file mode 100644 index 00000000..24a0c48c Binary files /dev/null and b/.gitbook/assets/initial-2.png differ diff --git a/.gitbook/assets/initial-3.png b/.gitbook/assets/initial-3.png new file mode 100644 index 00000000..92696d48 Binary files /dev/null and b/.gitbook/assets/initial-3.png differ diff --git a/.gitbook/assets/initial-4 (1).png b/.gitbook/assets/initial-4 (1).png new file mode 100644 index 00000000..e4834a94 Binary files /dev/null and b/.gitbook/assets/initial-4 (1).png differ diff --git a/.gitbook/assets/initial-4.png b/.gitbook/assets/initial-4.png new file mode 100644 index 00000000..3ff918ac Binary files /dev/null and b/.gitbook/assets/initial-4.png differ diff --git a/.gitbook/assets/initial-5.png b/.gitbook/assets/initial-5.png new file mode 100644 index 00000000..813c6b09 Binary files /dev/null and b/.gitbook/assets/initial-5.png differ diff --git a/.gitbook/assets/install-agent-k8s-6.png b/.gitbook/assets/install-agent-k8s-6.png new file mode 100644 index 00000000..477ddc1d Binary files /dev/null and b/.gitbook/assets/install-agent-k8s-6.png differ diff --git a/.gitbook/assets/install-agent-k8s-7.png b/.gitbook/assets/install-agent-k8s-7.png new file mode 100644 index 00000000..547412ff Binary files /dev/null and b/.gitbook/assets/install-agent-k8s-7.png differ diff --git a/.gitbook/assets/install-agent-swarm-linux-1.gif b/.gitbook/assets/install-agent-swarm-linux-1.gif new file mode 100644 index 00000000..d28f71d6 Binary files /dev/null and b/.gitbook/assets/install-agent-swarm-linux-1.gif differ diff --git a/.gitbook/assets/install-agent-swarm-linux-2.png b/.gitbook/assets/install-agent-swarm-linux-2.png new file mode 100644 index 00000000..5d7a4158 Binary files /dev/null and b/.gitbook/assets/install-agent-swarm-linux-2.png differ diff --git a/.gitbook/assets/install-agent-swarm-linux-3.png b/.gitbook/assets/install-agent-swarm-linux-3.png new file mode 100644 index 00000000..19793b91 Binary files /dev/null and b/.gitbook/assets/install-agent-swarm-linux-3.png differ diff --git a/.gitbook/assets/install-agent-swarm-linux-4.png b/.gitbook/assets/install-agent-swarm-linux-4.png new file mode 100644 index 00000000..2349c228 Binary files /dev/null and b/.gitbook/assets/install-agent-swarm-linux-4.png differ diff --git a/.gitbook/assets/install-agent-swarm-windows-2.png b/.gitbook/assets/install-agent-swarm-windows-2.png new file mode 100644 index 00000000..c0b3502e Binary files /dev/null and b/.gitbook/assets/install-agent-swarm-windows-2.png differ diff --git a/.gitbook/assets/k8s-helm-1.gif b/.gitbook/assets/k8s-helm-1.gif new file mode 100644 index 00000000..225b1741 Binary files /dev/null and b/.gitbook/assets/k8s-helm-1.gif differ diff --git a/.gitbook/assets/k8s-helm-2.png b/.gitbook/assets/k8s-helm-2.png new file mode 100644 index 00000000..67cc1b19 Binary files /dev/null and b/.gitbook/assets/k8s-helm-2.png differ diff --git a/.gitbook/assets/k8s-helm-3.png b/.gitbook/assets/k8s-helm-3.png new file mode 100644 index 00000000..e01099e9 Binary files /dev/null and b/.gitbook/assets/k8s-helm-3.png differ diff --git a/.gitbook/assets/k8s-helm-deploy-1.gif b/.gitbook/assets/k8s-helm-deploy-1.gif new file mode 100644 index 00000000..3219fe7e Binary files /dev/null and b/.gitbook/assets/k8s-helm-deploy-1.gif differ diff --git a/.gitbook/assets/k8s-helm-deploy-2.png b/.gitbook/assets/k8s-helm-deploy-2.png new file mode 100644 index 00000000..85f2305c Binary files /dev/null and b/.gitbook/assets/k8s-helm-deploy-2.png differ diff --git a/.gitbook/assets/k8s-templates-1.gif b/.gitbook/assets/k8s-templates-1.gif new file mode 100644 index 00000000..978f7265 Binary files /dev/null and b/.gitbook/assets/k8s-templates-1.gif differ diff --git a/.gitbook/assets/k8s-templates-add-1.gif b/.gitbook/assets/k8s-templates-add-1.gif new file mode 100644 index 00000000..3f69879c Binary files /dev/null and b/.gitbook/assets/k8s-templates-add-1.gif differ diff --git a/.gitbook/assets/k8s-templates-add-2.png b/.gitbook/assets/k8s-templates-add-2.png new file mode 100644 index 00000000..1f423dc1 Binary files /dev/null and b/.gitbook/assets/k8s-templates-add-2.png differ diff --git a/.gitbook/assets/k8s-templates-add-3.png b/.gitbook/assets/k8s-templates-add-3.png new file mode 100644 index 00000000..d283cb12 Binary files /dev/null and b/.gitbook/assets/k8s-templates-add-3.png differ diff --git a/.gitbook/assets/k8s-templates-add-4.png b/.gitbook/assets/k8s-templates-add-4.png new file mode 100644 index 00000000..2e1c4ff6 Binary files /dev/null and b/.gitbook/assets/k8s-templates-add-4.png differ diff --git a/.gitbook/assets/k8s-templates-edit-1.gif b/.gitbook/assets/k8s-templates-edit-1.gif new file mode 100644 index 00000000..3533b9db Binary files /dev/null and b/.gitbook/assets/k8s-templates-edit-1.gif differ diff --git a/.gitbook/assets/k8s-templates-remove-2.png b/.gitbook/assets/k8s-templates-remove-2.png new file mode 100644 index 00000000..10659862 Binary files /dev/null and b/.gitbook/assets/k8s-templates-remove-2.png differ diff --git a/.gitbook/assets/ki8s-templates-remove-1.gif b/.gitbook/assets/ki8s-templates-remove-1.gif new file mode 100644 index 00000000..fd8f9268 Binary files /dev/null and b/.gitbook/assets/ki8s-templates-remove-1.gif differ diff --git a/.gitbook/assets/kube-volumes-1.png b/.gitbook/assets/kube-volumes-1.png new file mode 100644 index 00000000..cfa4570b Binary files /dev/null and b/.gitbook/assets/kube-volumes-1.png differ diff --git a/.gitbook/assets/kube-volumes-2.png b/.gitbook/assets/kube-volumes-2.png new file mode 100644 index 00000000..a88408e6 Binary files /dev/null and b/.gitbook/assets/kube-volumes-2.png differ diff --git a/.gitbook/assets/kube-wsl-1.png b/.gitbook/assets/kube-wsl-1.png new file mode 100644 index 00000000..c52bbe44 Binary files /dev/null and b/.gitbook/assets/kube-wsl-1.png differ diff --git a/.gitbook/assets/kube-wsl-2.gif b/.gitbook/assets/kube-wsl-2.gif new file mode 100644 index 00000000..d76f7993 Binary files /dev/null and b/.gitbook/assets/kube-wsl-2.gif differ diff --git a/.gitbook/assets/kube-wsl-2.png b/.gitbook/assets/kube-wsl-2.png new file mode 100644 index 00000000..82eb55fb Binary files /dev/null and b/.gitbook/assets/kube-wsl-2.png differ diff --git a/.gitbook/assets/kube-wsl-3.png b/.gitbook/assets/kube-wsl-3.png new file mode 100644 index 00000000..7605b7ff Binary files /dev/null and b/.gitbook/assets/kube-wsl-3.png differ diff --git a/.gitbook/assets/kube-wsl-4.png b/.gitbook/assets/kube-wsl-4.png new file mode 100644 index 00000000..1694ef20 Binary files /dev/null and b/.gitbook/assets/kube-wsl-4.png differ diff --git a/.gitbook/assets/kubeconfig.gif b/.gitbook/assets/kubeconfig.gif new file mode 100644 index 00000000..a76e120d Binary files /dev/null and b/.gitbook/assets/kubeconfig.gif differ diff --git a/.gitbook/assets/kubeconfig_expiry.gif b/.gitbook/assets/kubeconfig_expiry.gif new file mode 100644 index 00000000..f5b84454 Binary files /dev/null and b/.gitbook/assets/kubeconfig_expiry.gif differ diff --git a/.gitbook/assets/kubeshell.gif b/.gitbook/assets/kubeshell.gif new file mode 100644 index 00000000..13932d7b Binary files /dev/null and b/.gitbook/assets/kubeshell.gif differ diff --git a/.gitbook/assets/licensing-combo.png b/.gitbook/assets/licensing-combo.png new file mode 100644 index 00000000..348550b0 Binary files /dev/null and b/.gitbook/assets/licensing-combo.png differ diff --git a/.gitbook/assets/licensing-docker-standalone.png b/.gitbook/assets/licensing-docker-standalone.png new file mode 100644 index 00000000..707b63f7 Binary files /dev/null and b/.gitbook/assets/licensing-docker-standalone.png differ diff --git a/.gitbook/assets/licensing-docker-swarm.png b/.gitbook/assets/licensing-docker-swarm.png new file mode 100644 index 00000000..e41e7fe3 Binary files /dev/null and b/.gitbook/assets/licensing-docker-swarm.png differ diff --git a/.gitbook/assets/licensing-kubernetes.png b/.gitbook/assets/licensing-kubernetes.png new file mode 100644 index 00000000..c66aaed9 Binary files /dev/null and b/.gitbook/assets/licensing-kubernetes.png differ diff --git a/.gitbook/assets/namespaces-access-1.gif b/.gitbook/assets/namespaces-access-1.gif new file mode 100644 index 00000000..537110e3 Binary files /dev/null and b/.gitbook/assets/namespaces-access-1.gif differ diff --git a/.gitbook/assets/namespaces-access-2.png b/.gitbook/assets/namespaces-access-2.png new file mode 100644 index 00000000..2a2db04a Binary files /dev/null and b/.gitbook/assets/namespaces-access-2.png differ diff --git a/.gitbook/assets/namespaces-add-1.gif b/.gitbook/assets/namespaces-add-1.gif new file mode 100644 index 00000000..f2c46fe9 Binary files /dev/null and b/.gitbook/assets/namespaces-add-1.gif differ diff --git a/.gitbook/assets/namespaces-add-2.png b/.gitbook/assets/namespaces-add-2.png new file mode 100644 index 00000000..43cb6be7 Binary files /dev/null and b/.gitbook/assets/namespaces-add-2.png differ diff --git a/.gitbook/assets/namespaces-remove-1.gif b/.gitbook/assets/namespaces-remove-1.gif new file mode 100644 index 00000000..fc3199d1 Binary files /dev/null and b/.gitbook/assets/namespaces-remove-1.gif differ diff --git a/.gitbook/assets/namespaces-remove-2.png b/.gitbook/assets/namespaces-remove-2.png new file mode 100644 index 00000000..ed58dd23 Binary files /dev/null and b/.gitbook/assets/namespaces-remove-2.png differ diff --git a/.gitbook/assets/networks-add-1.gif b/.gitbook/assets/networks-add-1.gif new file mode 100644 index 00000000..7a99dc4b Binary files /dev/null and b/.gitbook/assets/networks-add-1.gif differ diff --git a/.gitbook/assets/networks-add-2.png b/.gitbook/assets/networks-add-2.png new file mode 100644 index 00000000..4add3543 Binary files /dev/null and b/.gitbook/assets/networks-add-2.png differ diff --git a/.gitbook/assets/networks-add-3.png b/.gitbook/assets/networks-add-3.png new file mode 100644 index 00000000..3f657906 Binary files /dev/null and b/.gitbook/assets/networks-add-3.png differ diff --git a/.gitbook/assets/networks-remove-1.gif b/.gitbook/assets/networks-remove-1.gif new file mode 100644 index 00000000..4b51d995 Binary files /dev/null and b/.gitbook/assets/networks-remove-1.gif differ diff --git a/.gitbook/assets/portainer-architecture-detailed.png b/.gitbook/assets/portainer-architecture-detailed.png new file mode 100644 index 00000000..b68550ff Binary files /dev/null and b/.gitbook/assets/portainer-architecture-detailed.png differ diff --git a/.gitbook/assets/portainer-architecture.png b/.gitbook/assets/portainer-architecture.png new file mode 100644 index 00000000..56754e1b Binary files /dev/null and b/.gitbook/assets/portainer-architecture.png differ diff --git a/.gitbook/assets/registries-add-1.gif b/.gitbook/assets/registries-add-1.gif new file mode 100644 index 00000000..91ed5ffd Binary files /dev/null and b/.gitbook/assets/registries-add-1.gif differ diff --git a/.gitbook/assets/registries-add-azure-1.gif b/.gitbook/assets/registries-add-azure-1.gif new file mode 100644 index 00000000..fc2fd706 Binary files /dev/null and b/.gitbook/assets/registries-add-azure-1.gif differ diff --git a/.gitbook/assets/registries-add-azure-2.png b/.gitbook/assets/registries-add-azure-2.png new file mode 100644 index 00000000..e58d407a Binary files /dev/null and b/.gitbook/assets/registries-add-azure-2.png differ diff --git a/.gitbook/assets/registries-add-gitlab-1.gif b/.gitbook/assets/registries-add-gitlab-1.gif new file mode 100644 index 00000000..410cfcd0 Binary files /dev/null and b/.gitbook/assets/registries-add-gitlab-1.gif differ diff --git a/.gitbook/assets/registries-add-gitlab-2.png b/.gitbook/assets/registries-add-gitlab-2.png new file mode 100644 index 00000000..4d90751e Binary files /dev/null and b/.gitbook/assets/registries-add-gitlab-2.png differ diff --git a/.gitbook/assets/registries-add-quay-1.gif b/.gitbook/assets/registries-add-quay-1.gif new file mode 100644 index 00000000..9fa199c4 Binary files /dev/null and b/.gitbook/assets/registries-add-quay-1.gif differ diff --git a/.gitbook/assets/registries-add-quay-2.png b/.gitbook/assets/registries-add-quay-2.png new file mode 100644 index 00000000..a8d27bad Binary files /dev/null and b/.gitbook/assets/registries-add-quay-2.png differ diff --git a/.gitbook/assets/registries-custom-2.png b/.gitbook/assets/registries-custom-2.png new file mode 100644 index 00000000..1432d791 Binary files /dev/null and b/.gitbook/assets/registries-custom-2.png differ diff --git a/.gitbook/assets/registry_manage_docker.gif b/.gitbook/assets/registry_manage_docker.gif new file mode 100644 index 00000000..8b01a1b8 Binary files /dev/null and b/.gitbook/assets/registry_manage_docker.gif differ diff --git a/.gitbook/assets/registry_manage_k8s.gif b/.gitbook/assets/registry_manage_k8s.gif new file mode 100644 index 00000000..4f99b63c Binary files /dev/null and b/.gitbook/assets/registry_manage_k8s.gif differ diff --git a/.gitbook/assets/registry_manage_swarm.gif b/.gitbook/assets/registry_manage_swarm.gif new file mode 100644 index 00000000..f51144d0 Binary files /dev/null and b/.gitbook/assets/registry_manage_swarm.gif differ diff --git a/.gitbook/assets/secrets-add-1.gif b/.gitbook/assets/secrets-add-1.gif new file mode 100644 index 00000000..83f82ce3 Binary files /dev/null and b/.gitbook/assets/secrets-add-1.gif differ diff --git a/.gitbook/assets/secrets-add-2.png b/.gitbook/assets/secrets-add-2.png new file mode 100644 index 00000000..5aefe4f9 Binary files /dev/null and b/.gitbook/assets/secrets-add-2.png differ diff --git a/.gitbook/assets/secrets-remove-1.gif b/.gitbook/assets/secrets-remove-1.gif new file mode 100644 index 00000000..863d82f5 Binary files /dev/null and b/.gitbook/assets/secrets-remove-1.gif differ diff --git a/.gitbook/assets/services-configure-1.gif b/.gitbook/assets/services-configure-1.gif new file mode 100644 index 00000000..0dd95e44 Binary files /dev/null and b/.gitbook/assets/services-configure-1.gif differ diff --git a/.gitbook/assets/services-configure-10.png b/.gitbook/assets/services-configure-10.png new file mode 100644 index 00000000..141bdbe1 Binary files /dev/null and b/.gitbook/assets/services-configure-10.png differ diff --git a/.gitbook/assets/services-configure-11.png b/.gitbook/assets/services-configure-11.png new file mode 100644 index 00000000..9481ed5f Binary files /dev/null and b/.gitbook/assets/services-configure-11.png differ diff --git a/.gitbook/assets/services-configure-12.png b/.gitbook/assets/services-configure-12.png new file mode 100644 index 00000000..0db8cd1a Binary files /dev/null and b/.gitbook/assets/services-configure-12.png differ diff --git a/.gitbook/assets/services-configure-13.png b/.gitbook/assets/services-configure-13.png new file mode 100644 index 00000000..5ff93b12 Binary files /dev/null and b/.gitbook/assets/services-configure-13.png differ diff --git a/.gitbook/assets/services-configure-14.png b/.gitbook/assets/services-configure-14.png new file mode 100644 index 00000000..811c57c9 Binary files /dev/null and b/.gitbook/assets/services-configure-14.png differ diff --git a/.gitbook/assets/services-configure-15.png b/.gitbook/assets/services-configure-15.png new file mode 100644 index 00000000..9d3eb599 Binary files /dev/null and b/.gitbook/assets/services-configure-15.png differ diff --git a/.gitbook/assets/services-configure-16.png b/.gitbook/assets/services-configure-16.png new file mode 100644 index 00000000..d819b2cb Binary files /dev/null and b/.gitbook/assets/services-configure-16.png differ diff --git a/.gitbook/assets/services-configure-17.png b/.gitbook/assets/services-configure-17.png new file mode 100644 index 00000000..74a2cac1 Binary files /dev/null and b/.gitbook/assets/services-configure-17.png differ diff --git a/.gitbook/assets/services-configure-18.png b/.gitbook/assets/services-configure-18.png new file mode 100644 index 00000000..986c1c40 Binary files /dev/null and b/.gitbook/assets/services-configure-18.png differ diff --git a/.gitbook/assets/services-configure-19.png b/.gitbook/assets/services-configure-19.png new file mode 100644 index 00000000..b662d85a Binary files /dev/null and b/.gitbook/assets/services-configure-19.png differ diff --git a/.gitbook/assets/services-configure-2.png b/.gitbook/assets/services-configure-2.png new file mode 100644 index 00000000..6eed4a76 Binary files /dev/null and b/.gitbook/assets/services-configure-2.png differ diff --git a/.gitbook/assets/services-configure-3.png b/.gitbook/assets/services-configure-3.png new file mode 100644 index 00000000..fb046bf6 Binary files /dev/null and b/.gitbook/assets/services-configure-3.png differ diff --git a/.gitbook/assets/services-configure-4.png b/.gitbook/assets/services-configure-4.png new file mode 100644 index 00000000..3d986503 Binary files /dev/null and b/.gitbook/assets/services-configure-4.png differ diff --git a/.gitbook/assets/services-configure-5.png b/.gitbook/assets/services-configure-5.png new file mode 100644 index 00000000..e11afa52 Binary files /dev/null and b/.gitbook/assets/services-configure-5.png differ diff --git a/.gitbook/assets/services-configure-6.png b/.gitbook/assets/services-configure-6.png new file mode 100644 index 00000000..bcbbe8f7 Binary files /dev/null and b/.gitbook/assets/services-configure-6.png differ diff --git a/.gitbook/assets/services-configure-7.png b/.gitbook/assets/services-configure-7.png new file mode 100644 index 00000000..d7c5237d Binary files /dev/null and b/.gitbook/assets/services-configure-7.png differ diff --git a/.gitbook/assets/services-configure-8.png b/.gitbook/assets/services-configure-8.png new file mode 100644 index 00000000..f124a043 Binary files /dev/null and b/.gitbook/assets/services-configure-8.png differ diff --git a/.gitbook/assets/services-configure-9.png b/.gitbook/assets/services-configure-9.png new file mode 100644 index 00000000..013d3c04 Binary files /dev/null and b/.gitbook/assets/services-configure-9.png differ diff --git a/.gitbook/assets/services-create-1.gif b/.gitbook/assets/services-create-1.gif new file mode 100644 index 00000000..9d3f7655 Binary files /dev/null and b/.gitbook/assets/services-create-1.gif differ diff --git a/.gitbook/assets/services-create-2.png b/.gitbook/assets/services-create-2.png new file mode 100644 index 00000000..21296c8e Binary files /dev/null and b/.gitbook/assets/services-create-2.png differ diff --git a/.gitbook/assets/services-logs-1.gif b/.gitbook/assets/services-logs-1.gif new file mode 100644 index 00000000..4fe94d1f Binary files /dev/null and b/.gitbook/assets/services-logs-1.gif differ diff --git a/.gitbook/assets/services-logs-2.png b/.gitbook/assets/services-logs-2.png new file mode 100644 index 00000000..6539ac75 Binary files /dev/null and b/.gitbook/assets/services-logs-2.png differ diff --git a/.gitbook/assets/services-rollback-1.gif b/.gitbook/assets/services-rollback-1.gif new file mode 100644 index 00000000..e3a6bf65 Binary files /dev/null and b/.gitbook/assets/services-rollback-1.gif differ diff --git a/.gitbook/assets/services-scale-1.gif b/.gitbook/assets/services-scale-1.gif new file mode 100644 index 00000000..07fd28d0 Binary files /dev/null and b/.gitbook/assets/services-scale-1.gif differ diff --git a/.gitbook/assets/services-tasks-1.gif b/.gitbook/assets/services-tasks-1.gif new file mode 100644 index 00000000..af576969 Binary files /dev/null and b/.gitbook/assets/services-tasks-1.gif differ diff --git a/.gitbook/assets/services-webhooks-2.png b/.gitbook/assets/services-webhooks-2.png new file mode 100644 index 00000000..87547f96 Binary files /dev/null and b/.gitbook/assets/services-webhooks-2.png differ diff --git a/.gitbook/assets/settings-3.png b/.gitbook/assets/settings-3.png new file mode 100644 index 00000000..ac2a89e9 Binary files /dev/null and b/.gitbook/assets/settings-3.png differ diff --git a/.gitbook/assets/settings-4.png b/.gitbook/assets/settings-4.png new file mode 100644 index 00000000..a8ec69d4 Binary files /dev/null and b/.gitbook/assets/settings-4.png differ diff --git a/.gitbook/assets/settings-5.png b/.gitbook/assets/settings-5.png new file mode 100644 index 00000000..b0fafb32 Binary files /dev/null and b/.gitbook/assets/settings-5.png differ diff --git a/.gitbook/assets/settings-6.png b/.gitbook/assets/settings-6.png new file mode 100644 index 00000000..94513e32 Binary files /dev/null and b/.gitbook/assets/settings-6.png differ diff --git a/.gitbook/assets/settings-backup-1.gif b/.gitbook/assets/settings-backup-1.gif new file mode 100644 index 00000000..01f6b73d Binary files /dev/null and b/.gitbook/assets/settings-backup-1.gif differ diff --git a/.gitbook/assets/stack-new-1.gif b/.gitbook/assets/stack-new-1.gif new file mode 100644 index 00000000..01ee4616 Binary files /dev/null and b/.gitbook/assets/stack-new-1.gif differ diff --git a/.gitbook/assets/stack-new-2.png b/.gitbook/assets/stack-new-2.png new file mode 100644 index 00000000..476b96bf Binary files /dev/null and b/.gitbook/assets/stack-new-2.png differ diff --git a/.gitbook/assets/stack-new-3.png b/.gitbook/assets/stack-new-3.png new file mode 100644 index 00000000..520f8a1a Binary files /dev/null and b/.gitbook/assets/stack-new-3.png differ diff --git a/.gitbook/assets/stack-new-4.png b/.gitbook/assets/stack-new-4.png new file mode 100644 index 00000000..501ec28c Binary files /dev/null and b/.gitbook/assets/stack-new-4.png differ diff --git a/.gitbook/assets/stacks-edit-1.gif b/.gitbook/assets/stacks-edit-1.gif new file mode 100644 index 00000000..8589a745 Binary files /dev/null and b/.gitbook/assets/stacks-edit-1.gif differ diff --git a/.gitbook/assets/stacks-edit-2.png b/.gitbook/assets/stacks-edit-2.png new file mode 100644 index 00000000..cd3b862c Binary files /dev/null and b/.gitbook/assets/stacks-edit-2.png differ diff --git a/.gitbook/assets/stacks-edit-3.png b/.gitbook/assets/stacks-edit-3.png new file mode 100644 index 00000000..20f7e870 Binary files /dev/null and b/.gitbook/assets/stacks-edit-3.png differ diff --git a/.gitbook/assets/stacks-edit-4.png b/.gitbook/assets/stacks-edit-4.png new file mode 100644 index 00000000..e0cf6c48 Binary files /dev/null and b/.gitbook/assets/stacks-edit-4.png differ diff --git a/.gitbook/assets/stacks-edit-5.png b/.gitbook/assets/stacks-edit-5.png new file mode 100644 index 00000000..34b2186f Binary files /dev/null and b/.gitbook/assets/stacks-edit-5.png differ diff --git a/.gitbook/assets/stacks-migrate-1.gif b/.gitbook/assets/stacks-migrate-1.gif new file mode 100644 index 00000000..49394ee0 Binary files /dev/null and b/.gitbook/assets/stacks-migrate-1.gif differ diff --git a/.gitbook/assets/stacks-migrate-2.png b/.gitbook/assets/stacks-migrate-2.png new file mode 100644 index 00000000..db1477fa Binary files /dev/null and b/.gitbook/assets/stacks-migrate-2.png differ diff --git a/.gitbook/assets/stacks-migrate-3.png b/.gitbook/assets/stacks-migrate-3.png new file mode 100644 index 00000000..a62fc905 Binary files /dev/null and b/.gitbook/assets/stacks-migrate-3.png differ diff --git a/.gitbook/assets/stacks-migrate-5.png b/.gitbook/assets/stacks-migrate-5.png new file mode 100644 index 00000000..f5234c46 Binary files /dev/null and b/.gitbook/assets/stacks-migrate-5.png differ diff --git a/.gitbook/assets/stacks-remove-1.gif b/.gitbook/assets/stacks-remove-1.gif new file mode 100644 index 00000000..9655e555 Binary files /dev/null and b/.gitbook/assets/stacks-remove-1.gif differ diff --git a/.gitbook/assets/stacks-template-1.gif b/.gitbook/assets/stacks-template-1.gif new file mode 100644 index 00000000..83ad3d1b Binary files /dev/null and b/.gitbook/assets/stacks-template-1.gif differ diff --git a/.gitbook/assets/stacks-template-3.png b/.gitbook/assets/stacks-template-3.png new file mode 100644 index 00000000..3dc1d9a3 Binary files /dev/null and b/.gitbook/assets/stacks-template-3.png differ diff --git a/.gitbook/assets/swarm-1.png b/.gitbook/assets/swarm-1.png new file mode 100644 index 00000000..bb7ef3d4 Binary files /dev/null and b/.gitbook/assets/swarm-1.png differ diff --git a/.gitbook/assets/swarm-2.png b/.gitbook/assets/swarm-2.png new file mode 100644 index 00000000..9dfbfc5a Binary files /dev/null and b/.gitbook/assets/swarm-2.png differ diff --git a/.gitbook/assets/swarm-node-1.png b/.gitbook/assets/swarm-node-1.png new file mode 100644 index 00000000..45e4f7a2 Binary files /dev/null and b/.gitbook/assets/swarm-node-1.png differ diff --git a/.gitbook/assets/swarm-node-2.png b/.gitbook/assets/swarm-node-2.png new file mode 100644 index 00000000..0db2f077 Binary files /dev/null and b/.gitbook/assets/swarm-node-2.png differ diff --git a/.gitbook/assets/swarm-node-3.png b/.gitbook/assets/swarm-node-3.png new file mode 100644 index 00000000..4d807d72 Binary files /dev/null and b/.gitbook/assets/swarm-node-3.png differ diff --git a/.gitbook/assets/teams-add-user-2.png b/.gitbook/assets/teams-add-user-2.png new file mode 100644 index 00000000..5fc856be Binary files /dev/null and b/.gitbook/assets/teams-add-user-2.png differ diff --git a/.gitbook/assets/teams-create-2.png b/.gitbook/assets/teams-create-2.png new file mode 100644 index 00000000..080a44b6 Binary files /dev/null and b/.gitbook/assets/teams-create-2.png differ diff --git a/.gitbook/assets/templates-custom-1.gif b/.gitbook/assets/templates-custom-1.gif new file mode 100644 index 00000000..5de1715d Binary files /dev/null and b/.gitbook/assets/templates-custom-1.gif differ diff --git a/.gitbook/assets/templates-custom-2.png b/.gitbook/assets/templates-custom-2.png new file mode 100644 index 00000000..fa71db53 Binary files /dev/null and b/.gitbook/assets/templates-custom-2.png differ diff --git a/.gitbook/assets/templates-custom-3.png b/.gitbook/assets/templates-custom-3.png new file mode 100644 index 00000000..a7490cbc Binary files /dev/null and b/.gitbook/assets/templates-custom-3.png differ diff --git a/.gitbook/assets/templates-custom-4.png b/.gitbook/assets/templates-custom-4.png new file mode 100644 index 00000000..000c8ca2 Binary files /dev/null and b/.gitbook/assets/templates-custom-4.png differ diff --git a/.gitbook/assets/templates-custom-5.png b/.gitbook/assets/templates-custom-5.png new file mode 100644 index 00000000..ade877d7 Binary files /dev/null and b/.gitbook/assets/templates-custom-5.png differ diff --git a/.gitbook/assets/templates-deploy-container-1.gif b/.gitbook/assets/templates-deploy-container-1.gif new file mode 100644 index 00000000..275b1ee2 Binary files /dev/null and b/.gitbook/assets/templates-deploy-container-1.gif differ diff --git a/.gitbook/assets/templates-deploy-container-2.png b/.gitbook/assets/templates-deploy-container-2.png new file mode 100644 index 00000000..4748cfd9 Binary files /dev/null and b/.gitbook/assets/templates-deploy-container-2.png differ diff --git a/.gitbook/assets/templates-deploy-container-3.png b/.gitbook/assets/templates-deploy-container-3.png new file mode 100644 index 00000000..dee423d1 Binary files /dev/null and b/.gitbook/assets/templates-deploy-container-3.png differ diff --git a/.gitbook/assets/templates-deploy-stack-1.gif b/.gitbook/assets/templates-deploy-stack-1.gif new file mode 100644 index 00000000..bc28dc13 Binary files /dev/null and b/.gitbook/assets/templates-deploy-stack-1.gif differ diff --git a/.gitbook/assets/templates-deploy-stack-2.png b/.gitbook/assets/templates-deploy-stack-2.png new file mode 100644 index 00000000..ae99e4fa Binary files /dev/null and b/.gitbook/assets/templates-deploy-stack-2.png differ diff --git a/.gitbook/assets/templates-deploy-stack-3.png b/.gitbook/assets/templates-deploy-stack-3.png new file mode 100644 index 00000000..34bbe5a3 Binary files /dev/null and b/.gitbook/assets/templates-deploy-stack-3.png differ diff --git a/.gitbook/assets/upgrade-k8s-1.gif b/.gitbook/assets/upgrade-k8s-1.gif new file mode 100644 index 00000000..05c0bed7 Binary files /dev/null and b/.gitbook/assets/upgrade-k8s-1.gif differ diff --git a/.gitbook/assets/upgrade-kubernetes.gif b/.gitbook/assets/upgrade-kubernetes.gif new file mode 100644 index 00000000..35919b6d Binary files /dev/null and b/.gitbook/assets/upgrade-kubernetes.gif differ diff --git a/.gitbook/assets/upgrade-license.png b/.gitbook/assets/upgrade-license.png new file mode 100644 index 00000000..ab909cfa Binary files /dev/null and b/.gitbook/assets/upgrade-license.png differ diff --git a/.gitbook/assets/users-create-1.gif b/.gitbook/assets/users-create-1.gif new file mode 100644 index 00000000..b057c7d1 Binary files /dev/null and b/.gitbook/assets/users-create-1.gif differ diff --git a/.gitbook/assets/users-create-2.png b/.gitbook/assets/users-create-2.png new file mode 100644 index 00000000..d2547db7 Binary files /dev/null and b/.gitbook/assets/users-create-2.png differ diff --git a/.gitbook/assets/users-password-2.png b/.gitbook/assets/users-password-2.png new file mode 100644 index 00000000..114578b9 Binary files /dev/null and b/.gitbook/assets/users-password-2.png differ diff --git a/.gitbook/assets/users-promote-1.gif b/.gitbook/assets/users-promote-1.gif new file mode 100644 index 00000000..864cc83e Binary files /dev/null and b/.gitbook/assets/users-promote-1.gif differ diff --git a/.gitbook/assets/users-promote-2.png b/.gitbook/assets/users-promote-2.png new file mode 100644 index 00000000..f3119cc0 Binary files /dev/null and b/.gitbook/assets/users-promote-2.png differ diff --git a/.gitbook/assets/users-teams-create-1.gif b/.gitbook/assets/users-teams-create-1.gif new file mode 100644 index 00000000..500776ed Binary files /dev/null and b/.gitbook/assets/users-teams-create-1.gif differ diff --git a/.gitbook/assets/volumes-add-1.gif b/.gitbook/assets/volumes-add-1.gif new file mode 100644 index 00000000..149f76ab Binary files /dev/null and b/.gitbook/assets/volumes-add-1.gif differ diff --git a/.gitbook/assets/volumes-add-2.png b/.gitbook/assets/volumes-add-2.png new file mode 100644 index 00000000..eb7954a1 Binary files /dev/null and b/.gitbook/assets/volumes-add-2.png differ diff --git a/.gitbook/assets/volumes-add-3.png b/.gitbook/assets/volumes-add-3.png new file mode 100644 index 00000000..35bc6a3b Binary files /dev/null and b/.gitbook/assets/volumes-add-3.png differ diff --git a/.gitbook/assets/volumes-add-4.png b/.gitbook/assets/volumes-add-4.png new file mode 100644 index 00000000..63084d32 Binary files /dev/null and b/.gitbook/assets/volumes-add-4.png differ diff --git a/.gitbook/assets/volumes-add-5.png b/.gitbook/assets/volumes-add-5.png new file mode 100644 index 00000000..64d8feb4 Binary files /dev/null and b/.gitbook/assets/volumes-add-5.png differ diff --git a/.gitbook/assets/volumes-add-6.png b/.gitbook/assets/volumes-add-6.png new file mode 100644 index 00000000..1bcf2d27 Binary files /dev/null and b/.gitbook/assets/volumes-add-6.png differ diff --git a/.gitbook/assets/volumes-add-7.png b/.gitbook/assets/volumes-add-7.png new file mode 100644 index 00000000..9c0c064c Binary files /dev/null and b/.gitbook/assets/volumes-add-7.png differ diff --git a/.gitbook/assets/volumes-add-8.png b/.gitbook/assets/volumes-add-8.png new file mode 100644 index 00000000..b21c7917 Binary files /dev/null and b/.gitbook/assets/volumes-add-8.png differ diff --git a/.gitbook/assets/volumes-add-9.png b/.gitbook/assets/volumes-add-9.png new file mode 100644 index 00000000..5be586e5 Binary files /dev/null and b/.gitbook/assets/volumes-add-9.png differ diff --git a/.gitbook/assets/volumes-browse-1.gif b/.gitbook/assets/volumes-browse-1.gif new file mode 100644 index 00000000..678cb9af Binary files /dev/null and b/.gitbook/assets/volumes-browse-1.gif differ diff --git a/.gitbook/assets/volumes-browse-2.png b/.gitbook/assets/volumes-browse-2.png new file mode 100644 index 00000000..5085805a Binary files /dev/null and b/.gitbook/assets/volumes-browse-2.png differ diff --git a/.gitbook/assets/volumes-k8s-inspect-1.gif b/.gitbook/assets/volumes-k8s-inspect-1.gif new file mode 100644 index 00000000..ae431363 Binary files /dev/null and b/.gitbook/assets/volumes-k8s-inspect-1.gif differ diff --git a/.gitbook/assets/volumes-k8s-inspect-2.png b/.gitbook/assets/volumes-k8s-inspect-2.png new file mode 100644 index 00000000..6a49424d Binary files /dev/null and b/.gitbook/assets/volumes-k8s-inspect-2.png differ diff --git a/.gitbook/assets/volumes-k8s-inspect-3.png b/.gitbook/assets/volumes-k8s-inspect-3.png new file mode 100644 index 00000000..8b06df18 Binary files /dev/null and b/.gitbook/assets/volumes-k8s-inspect-3.png differ diff --git a/.gitbook/assets/volumes-k8s-inspect-4.png b/.gitbook/assets/volumes-k8s-inspect-4.png new file mode 100644 index 00000000..2b963acd Binary files /dev/null and b/.gitbook/assets/volumes-k8s-inspect-4.png differ diff --git a/.gitbook/assets/volumes-k8s-remove-1.gif b/.gitbook/assets/volumes-k8s-remove-1.gif new file mode 100644 index 00000000..bff943e4 Binary files /dev/null and b/.gitbook/assets/volumes-k8s-remove-1.gif differ diff --git a/.gitbook/assets/volumes-k8s-remove-2.png b/.gitbook/assets/volumes-k8s-remove-2.png new file mode 100644 index 00000000..af197b77 Binary files /dev/null and b/.gitbook/assets/volumes-k8s-remove-2.png differ diff --git a/.gitbook/assets/volumes-remove-1.gif b/.gitbook/assets/volumes-remove-1.gif new file mode 100644 index 00000000..a7e5d0ea Binary files /dev/null and b/.gitbook/assets/volumes-remove-1.gif differ diff --git a/.gitbook/assets/volumes-remove-2.png b/.gitbook/assets/volumes-remove-2.png new file mode 100644 index 00000000..e39eef93 Binary files /dev/null and b/.gitbook/assets/volumes-remove-2.png differ diff --git a/README.md b/README.md new file mode 100644 index 00000000..084b1559 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Welcome + +Welcome to Portainer's official documentation site. + +## About Portainer + +**Portainer Community Edition (CE)** is our foundation. With over half a million regular users, CE is a powerful, open source toolset that allows you to easily build and manage containers in Docker, Docker Swarm, Kubernetes and Azure ACI. + +**Portainer Business Edition (BE)** is our commercial offering. With features geared towards businesses and larger organizations such as [Role-Based Access Control](admin/users/roles.md), [registry management](admin/registries/browse.md), and [dedicated support](./#getting-support), Portainer BE is a powerful toolset that allows you to easily build and manage containers in Docker, Docker Swarm, Kubernetes and Azure ACI. + +{% hint style="info" %} +Portainer Business Edition requires a license key to install and use. If you don't currently have a license key, you can [request five nodes free](https://www.portainer.io/pricing/take5) of Portainer Business Edition or [purchase a license](https://www.portainer.io/pricing). +{% endhint %} + +Portainer hides the complexity of managing containers behind an easy-to-use UI. By removing the need to use the CLI, write YAML or understand manifests, Portainer makes deploying apps and troubleshooting problems so easy that anyone can do it. + +Our team is here to help you on your journey. Community and five nodes free users can get assistance through our [community support channels](./#community-edition), and paid Business customers through our [business support channels](./#business-edition). + +## Documentation + +We're working hard to ensure that our documentation keeps up with our ever-growing Portainer community. If you have a question we encourage you to start with the documentation (right here!). If you can't find what you're looking for, please visit our [Knowledge Base](https://portal.portainer.io/knowledge) or one of our support channels. + +{% hint style="info" %} +As an open source product we rely on users in our community to support one another by asking questions, engaging in discussions and sharing knowledge. Together with the documentation found on this site and our [YouTube channel](https://www.youtube.com/channel/UC7diMJcrULjDseq5yhSUZgg), we cover a lot of ground but there may be gaps. +{% endhint %} + +## Getting support + +### Community Edition, Five Node Free and Home & Student Users + +Community Edition, five nodes free and Home & Student users can get support through the following channels: + +* **Ask questions** either in [GitHub Issues](https://github.com/portainer/portainer/issues) or the [community Slack channel](https://join.slack.com/t/portainer/shared\_invite/zt-txh3ljab-52QHTyjCqbe5RibC2lcjKA). Other platforms exist (Reddit, Discord, Stack Overflow) but we are less active in those spaces. +* **Log bugs** in [GitHub Issues](https://github.com/portainer/portainer/issues) so they can be properly managed. +* **Flag vulnerabilities** by emailing [security@portainer.io](mailto:security@portainer.io) so we can deal with them immediately. +* **Flag documentation issues** via our [GitHub documentation channel](https://github.com/portainer/portainer-docs/issues) (or start [contributing](contribute/contribute.md) and make our documentation better!). + +### Business Edition Customers + +If you are a Professional or Enterprise tier Portainer Business Edition customer, you can log tickets directly with our team via [email](mailto:businesssupport@portainer.io) or filling out the [Request Support form](https://www.portainer.io/portainer-business-support). You can report a bug, ask a question, tell us about an issue with documentation, or request a feature. Tickets are checked and resolved by Portainer staff within the SLA. diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 00000000..47e5f2e1 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,283 @@ +# Table of contents + +* [Welcome](README.md) +* [What's new in version 2.17](whats-new.md) +* [Release Notes](release-notes.md) + +## Getting Started + +* [Introduction](start/intro.md) +* [Portainer architecture](start/architecture.md) +* [Requirements and prerequisites](start/requirements-and-prerequisites.md) +* [Install Portainer](start/install/README.md) + * [Set up a new Portainer Server installation](start/install/server/README.md) + * [Docker Standalone](start/install/server/docker/README.md) + * [Install Portainer with Docker on Linux](start/install/server/docker/linux.md) + * [Install Portainer with Docker on WSL / Docker Desktop](start/install/server/docker/wsl.md) + * [Install Portainer with Docker on Windows Container Service](start/install/server/docker/wcs.md) + * [Docker Swarm](start/install/server/swarm/README.md) + * [Install Portainer with Docker Swarm on Linux](start/install/server/swarm/linux.md) + * [Install Portainer with Docker Swarm on WSL / Docker Desktop](start/install/server/swarm/wsl.md) + * [Install Portainer with Docker Swarm on Windows Container Service](start/install/server/swarm/wcs.md) + * [Kubernetes](start/install/server/kubernetes/README.md) + * [Install Portainer on your Kubernetes environment](start/install/server/kubernetes/baremetal.md) + * [Install Portainer with Kubernetes on WSL / Docker Desktop](start/install/server/kubernetes/wsl.md) + * [Initial setup](start/install/server/setup.md) + * [Add an environment to an existing installation](start/install/agent/README.md) + * [Docker Standalone](start/install/agent/docker/README.md) + * [Install Portainer Agent with Docker on Linux](start/install/agent/docker/linux.md) + * [Install Portainer Agent with Docker on WSL / Docker Desktop](start/install/agent/docker/wsl.md) + * [Install Portainer Agent with Docker on Windows Container Service](start/install/agent/docker/wcs.md) + * [Docker Swarm](start/install/agent/swarm/README.md) + * [Install Portainer Agent with Docker Swarm on Linux](start/install/agent/swarm/linux.md) + * [Install Portainer Agent with Docker Swarm on WSL / Docker Desktop](start/install/agent/swarm/wsl.md) + * [Install Portainer Agent with Docker Swarm on Windows Container Service](start/install/agent/swarm/wcs.md) + * [Kubernetes](start/install/agent/kubernetes/README.md) + * [Import an existing Kubernetes environment](start/install/agent/kubernetes/import.md) + * [Install Portainer Agent on your Kubernetes environment](start/install/agent/kubernetes/baremetal.md) + * [Install Portainer Agent with Kubernetes on WSL / Docker Desktop](start/install/agent/kubernetes/wsl.md) + * [Azure ACI](start/install/agent/aci.md) + * [Nomad](start/install/agent/nomad.md) + * [KaaS](start/install/agent/kaas/README.md) + * [Civo](start/install/agent/kaas/civo.md) + * [Linode](start/install/agent/kaas/linode.md) + * [DigitalOcean](start/install/agent/kaas/digitalocean.md) + * [Google Cloud](start/install/agent/kaas/gke.md) + * [AWS](start/install/agent/kaas/eks.md) + * [Azure](start/install/agent/kaas/aks.md) + * [Edge Agent](start/install/agent/edge.md) +* [Upgrading Portainer](start/upgrade/README.md) + * [Upgrading on Docker Standalone](start/upgrade/docker.md) + * [Upgrading on Docker Swarm](start/upgrade/swarm.md) + * [Upgrading on Kubernetes](start/upgrade/kubernetes.md) + * [Upgrading on Nomad](start/upgrade/nomad.md) + * [Upgrading the Edge Agent](start/upgrade/edge.md) + * [Switching to Portainer Business Edition](start/upgrade/tobe/README.md) + * [Upgrade to Business Edition from Portainer](start/upgrade/tobe/inapp.md) + * [Docker Standalone](start/upgrade/tobe/docker.md) + * [Docker Swarm](start/upgrade/tobe/swarm.md) + * [Kubernetes](start/upgrade/tobe/kubernetes.md) + * [Upgrading Agent-only deployments](start/upgrade/tobe/agent.md) + +## Using Portainer + +* [Home](user/home.md) +* [Docker/Swarm](user/docker/README.md) + * [Dashboard](user/docker/dashboard.md) + * [App Templates](user/docker/templates/README.md) + * [Custom templates](user/docker/templates/custom.md) + * [Deploy a stack](user/docker/templates/deploy-stack.md) + * [Deploy a container](user/docker/templates/deploy-container.md) + * [Stacks](user/docker/stacks/README.md) + * [Add a new stack](user/docker/stacks/add.md) + * [Inspect or edit a stack](user/docker/stacks/edit.md) + * [Create a template from a deployed stack](user/docker/stacks/template.md) + * [Webhooks](user/docker/stacks/webhooks.md) + * [Migrate or duplicate a stack](user/docker/stacks/migrate.md) + * [Remove a stack](user/docker/stacks/remove.md) + * [Services](user/docker/services/README.md) + * [Add a new service](user/docker/services/add.md) + * [Configure service options](user/docker/services/configure.md) + * [Scale a service](user/docker/services/scale.md) + * [View the status of a service task](user/docker/services/tasks.md) + * [View service logs](user/docker/services/logs.md) + * [Roll back a service](user/docker/services/rollback.md) + * [Webhooks](user/docker/services/webhooks.md) + * [Containers](user/docker/containers/README.md) + * [Add a new container](user/docker/containers/add.md) + * [View a container's details](user/docker/containers/view.md) + * [Inspect a container](user/docker/containers/inspect.md) + * [Edit or duplicate a container](user/docker/containers/edit.md) + * [Advanced container settings](user/docker/containers/advanced.md) + * [Webhooks](user/docker/containers/webhooks.md) + * [Attach a volume to a container](user/docker/containers/attach-volume.md) + * [View container logs](user/docker/containers/logs.md) + * [View container statistics](user/docker/containers/stats.md) + * [Access a container's console](user/docker/containers/console.md) + * [Change container ownership](user/docker/containers/ownership.md) + * [Remove a container](user/docker/containers/remove.md) + * [Images](user/docker/images/README.md) + * [Pull an image](user/docker/images/pull.md) + * [Build a new image](user/docker/images/build.md) + * [Import an image](user/docker/images/import.md) + * [Export an image](user/docker/images/export.md) + * [Networks](user/docker/networks/README.md) + * [Add a new network](user/docker/networks/add.md) + * [Remove a network](user/docker/networks/remove.md) + * [Volumes](user/docker/volumes/README.md) + * [Add a new volume](user/docker/volumes/add.md) + * [Browse a volume](user/docker/volumes/browse.md) + * [Remove a volume](user/docker/volumes/remove.md) + * [Configs](user/docker/configs/README.md) + * [Add a new config](user/docker/configs/add.md) + * [Remove a config](user/docker/configs/remove.md) + * [Secrets](user/docker/secrets/README.md) + * [Add a new secret](user/docker/secrets/add.md) + * [Remove a secret](user/docker/secrets/remove.md) + * [Events](user/docker/events.md) + * [Host](user/docker/host/README.md) + * [Setup](user/docker/host/setup.md) + * [Registries](user/docker/host/registries.md) + * [Swarm](user/docker/swarm/README.md) + * [Setup](user/docker/swarm/setup.md) + * [Cluster visualizer](user/docker/swarm/cluster-visualizer.md) + * [Registries](user/docker/swarm/registries.md) +* [Kubernetes](user/kubernetes/README.md) + * [Dashboard](user/kubernetes/dashboard.md) + * [kubectl shell](user/kubernetes/kubectl.md) + * [Kubeconfig](user/kubernetes/kubeconfig.md) + * [Custom Templates](user/kubernetes/templates/README.md) + * [Add a new custom template](user/kubernetes/templates/add.md) + * [Edit a custom template](user/kubernetes/templates/edit.md) + * [Remove a custom template](user/kubernetes/templates/remove.md) + * [Namespaces](user/kubernetes/namespaces/README.md) + * [Add a new namespace](user/kubernetes/namespaces/add.md) + * [Manage a namespace](user/kubernetes/namespaces/manage.md) + * [Manage access to a namespace](user/kubernetes/namespaces/access.md) + * [Remove a namespace](user/kubernetes/namespaces/remove.md) + * [Helm](user/kubernetes/helm/README.md) + * [Deploy a new application from a Helm chart](user/kubernetes/helm/deploy.md) + * [Applications](user/kubernetes/applications/README.md) + * [Add a new application using a form](user/kubernetes/applications/add.md) + * [Add a new application using a manifest](user/kubernetes/applications/manifest.md) + * [Inspect an application](user/kubernetes/applications/inspect.md) + * [Edit an application](user/kubernetes/applications/edit.md) + * [Webhooks](user/kubernetes/applications/webhooks.md) + * [Detach a volume from an application](user/kubernetes/applications/detach-volume.md) + * [Remove an application](user/kubernetes/applications/remove.md) + * [Ingresses](user/kubernetes/ingresses/README.md) + * [Add an Ingress manually](user/kubernetes/ingresses/add.md) + * [Add an Ingress using a manifest](user/kubernetes/ingresses/manifest.md) + * [Remove an Ingress](user/kubernetes/ingresses/remove-an-ingress.md) + * [ConfigMaps & Secrets](user/kubernetes/configurations/README.md) + * [Add a ConfigMap](user/kubernetes/configurations/add.md) + * [Add a Secret](user/kubernetes/configurations/add-1.md) + * [Remove a ConfigMap or Secret](user/kubernetes/configurations/remove.md) + * [Volumes](user/kubernetes/volumes/README.md) + * [Inspect a volume](user/kubernetes/volumes/inspect.md) + * [Remove a volume](user/kubernetes/volumes/remove.md) + * [Cluster](user/kubernetes/cluster/README.md) + * [Setup](user/kubernetes/cluster/setup.md) + * [Inspect a node](user/kubernetes/cluster/node.md) + * [Security constraints](user/kubernetes/cluster/security.md) + * [Registries](user/kubernetes/cluster/registries.md) +* [Azure ACI](user/aci/README.md) + * [Dashboard](user/aci/dashboard.md) + * [Container instances](user/aci/containers/README.md) + * [Add a new container](user/aci/containers/add.md) + * [Remove a container](user/aci/containers/remove.md) +* [Nomad](user/nomad/README.md) + * [Dashboard](user/nomad/dashboard.md) + * [Nomad Jobs](user/nomad/jobs.md) +* [Edge Compute](user/edge/README.md) + * [Edge Groups](user/edge/groups.md) + * [Edge Stacks](user/edge/stacks.md) + * [Edge Jobs](user/edge/jobs.md) + * [Waiting Room](user/edge/waiting-room.md) +* [Account settings](user/account-settings.md) + +## Administering Portainer + +* [Users](admin/users/README.md) + * [Teams](admin/users/teams/README.md) + * [Add a new team](admin/users/teams/add.md) + * [Add a user to a team](admin/users/teams/add-user.md) + * [Roles](admin/users/roles.md) + * [Add a new user](admin/users/add.md) + * [Turn a user into an administrator](admin/users/promote.md) + * [Reset a user's password](admin/users/password.md) +* [Environments](admin/environments/README.md) + * [Groups](admin/environments/groups.md) + * [Tags](admin/environments/tags.md) + * [Add a new environment](admin/environments/add/README.md) + * [Add a local environment](admin/environments/add/local.md) + * [Add a Docker Standalone environment](admin/environments/add/docker.md) + * [Add a Docker Swarm environment](admin/environments/add/swarm.md) + * [Add a Kubernetes environment](admin/environments/add/kubernetes.md) + * [Add an ACI environment](admin/environments/add/aci.md) + * [Add a Nomad environment](admin/environments/add/nomad.md) + * [Add an Edge environment](admin/environments/add/edge.md) + * [Add an environment via the Portainer API](admin/environments/add/api.md) + * [Manage access to environments](admin/environments/access.md) + * [Manage access to environment groups](admin/environments/access-groups.md) + * [Update & Rollback](admin/environments/update.md) +* [Registries](admin/registries/README.md) + * [Add a new registry](admin/registries/add/README.md) + * [Add a DockerHub account](admin/registries/add/dockerhub.md) + * [Add an AWS ECR registry](admin/registries/add/ecr.md) + * [Add a Quay.io registry](admin/registries/add/quay.md) + * [Add a ProGet registry](admin/registries/add/proget.md) + * [Add an Azure registry](admin/registries/add/azure.md) + * [Add a Gitlab registry](admin/registries/add/gitlab.md) + * [Add a Github registry](admin/registries/add/ghcr.md) + * [Add a custom registry](admin/registries/add/custom.md) + * [Browse a registry](admin/registries/browse.md) + * [Manage a registry](admin/registries/manage.md) +* [Licenses](admin/licenses.md) +* [Authentication logs](admin/logs/README.md) + * [Activity logs](admin/logs/activity.md) +* [Notifications](admin/notifications.md) +* [Settings](admin/settings/README.md) + * [Authentication](admin/settings/authentication/README.md) + * [Authenticate via LDAP](admin/settings/authentication/ldap.md) + * [Authenticate via Active Directory](admin/settings/authentication/active-directory.md) + * [Authenticate via OAuth](admin/settings/authentication/oauth.md) + * [Cloud](admin/settings/cloud/README.md) + * [Add Civo credentials](admin/settings/cloud/civo.md) + * [Add Linode credentials](admin/settings/cloud/linode.md) + * [Add DigitalOcean credentials](admin/settings/cloud/digitalocean.md) + * [Add Google Cloud credentials](admin/settings/cloud/gke.md) + * [Add AWS credentials](admin/settings/cloud/eks.md) + * [Add Azure credentials](admin/settings/cloud/aks.md) + * [Edge Compute](admin/settings/edge/README.md) + * [Edge Devices](admin/settings/edge/devices/README.md) + * [FDO](admin/settings/edge/devices/fdo.md) + * [OpenAMT](admin/settings/edge/devices/openamt.md) + +## Frequently Asked Questions + +* [Portainer Concepts](faq/concepts.md) +* [Installing](faq/installing.md) +* [Upgrading](faq/upgrading.md) +* [Troubleshooting](faq/troubleshooting.md) +* [Contributing](faq/contributing.md) + +## Advanced Topics + +* [CLI configuration options](advanced/cli.md) +* [App templates](advanced/app-templates/README.md) + * [Build and host your own app templates](advanced/app-templates/build.md) + * [App template JSON format](advanced/app-templates/format.md) +* [The Portainer Edge Agent](advanced/edge-agent.md) +* [Access control](advanced/access-control.md) +* [Reset the admin user's password](advanced/reset-admin.md) +* [Security and compliance](advanced/security.md) +* [Encrypting the Portainer database](advanced/db-encryption.md) +* [Using your own SSL certificate with Portainer](advanced/ssl.md) +* [Using Portainer with reverse proxies](advanced/reverse-proxy/README.md) + * [Deploying Portainer behind Traefik Proxy](advanced/reverse-proxy/traefik.md) + * [Deploying Portainer behind nginx reverse proxy](advanced/reverse-proxy/nginx.md) +* [Helm chart configuration options](advanced/helm-chart-configuration-options.md) +* [Kubernetes roles and bindings](advanced/kubernetes-roles-and-bindings.md) +* [Deprecated and removed features](advanced/deprecated.md) + +## API + +* [Accessing the Portainer API](api/access.md) +* [API documentation](api/docs.md) +* [API usage examples](api/examples.md) + +## Get More Help + +* [Knowledge Base](https://portal.portainer.io/knowledge) +* [YouTube](https://www.youtube.com/channel/UC7diMJcrULjDseq5yhSUZgg/videos) +* [Slack](https://join.slack.com/t/portainer/shared\_invite/zt-txh3ljab-52QHTyjCqbe5RibC2lcjKA) +* [Discord](https://discord.com/invite/j8fVken) +* [Open a support request](https://www.portainer.io/portainer-business-support) + +## Contribute to Portainer + +* [Contribute](contribute/contribute.md) +* [Build instructions](contribute/build/README.md) + * [Set up a macOS build environment](contribute/build/mac.md) + * [Set up a Linux build environment](contribute/build/linux.md) diff --git a/admin/environments/README.md b/admin/environments/README.md new file mode 100644 index 00000000..4138965d --- /dev/null +++ b/admin/environments/README.md @@ -0,0 +1,37 @@ +# Environments + +In Portainer terms, an _environment_ is an instance that you want to manage through Portainer. Environments can be Docker, Docker Swarm, Kubernetes, ACI or a combination. One Portainer Server instance can manage multiple environments. + +{% hint style="info" %} +Endpoints were renamed to Environments in version 2.10. +{% endhint %} + +{% content-ref url="add/" %} +[add](add/) +{% endcontent-ref %} + +Environments can be organized in groups and given tags. + +{% content-ref url="groups.md" %} +[groups.md](groups.md) +{% endcontent-ref %} + +{% content-ref url="tags.md" %} +[tags.md](tags.md) +{% endcontent-ref %} + +Access to environments can then be managed on a per-environment or per-environment group basis. + +{% content-ref url="access.md" %} +[access.md](access.md) +{% endcontent-ref %} + +{% content-ref url="access-groups.md" %} +[access-groups.md](access-groups.md) +{% endcontent-ref %} + +Edge Agent environments can be updated (and updates rolled back) directly from within Portainer. + +{% content-ref url="update.md" %} +[update.md](update.md) +{% endcontent-ref %} diff --git a/admin/environments/access-groups.md b/admin/environments/access-groups.md new file mode 100644 index 00000000..17cdb055 --- /dev/null +++ b/admin/environments/access-groups.md @@ -0,0 +1,17 @@ +# Manage access to environment groups + +{% hint style="info" %} +Environments can be [grouped](groups.md) for organizational purposes. If an environment and an individual user are in the same group, users will be tagged with `inherited` on the **Manage access** page. This means that the user is inheriting their access from the group, not the environment. + +If you manually assign a user to an environment, and they are already assigned to it via a group, they will be tagged with `override` on the **Manage access** page, indicating that their individual access will override that of the group for this one environment. You can then modify their access in this special case. +{% endhint %} + +From the menu select **Environments** then select **Groups**. Locate the environment group you want to give users access to then select **Manage access** at the end of the row. + +
+ +Next, select the users or teams you want to add using the dropdown. Then use the **Role** dropdown to select the role you want this user or team to have. + +
+ +Once all have been selected, click **Create access**. diff --git a/admin/environments/access.md b/admin/environments/access.md new file mode 100644 index 00000000..b62423f5 --- /dev/null +++ b/admin/environments/access.md @@ -0,0 +1,17 @@ +# Manage access to environments + +{% hint style="info" %} +Environments can be [grouped](groups.md) for organizational purposes. If an environment and an individual user are in the same group, users will be tagged with `inherited` on the **Manage access** page. This means that the user is inheriting their access from the group, not the environment. + +If you manually assign a user to an environment, and they are already assigned to it via a group, they will be tagged with `override` on the **Manage access** page, indicating that their individual access will override that of the group for this one environment. You can then modify their access in this special case. +{% endhint %} + +From the menu select **Environments**. Locate the environment you want to give users access to then select **Manage access** at the end of the row. + +
+ +Next, select the users or teams you want to add using the dropdown. Then use the **Role** dropdown to select the role you want this user or team to have. + +
+ +Once all have been selected, click **Create access**. diff --git a/admin/environments/add/README.md b/admin/environments/add/README.md new file mode 100644 index 00000000..ab9d54e7 --- /dev/null +++ b/admin/environments/add/README.md @@ -0,0 +1,38 @@ +# Add a new environment + +Portainer can manage multiple environments in addition to the local environment on which it is installed. + +{% content-ref url="docker.md" %} +[docker.md](docker.md) +{% endcontent-ref %} + +{% content-ref url="swarm.md" %} +[swarm.md](swarm.md) +{% endcontent-ref %} + +{% content-ref url="kubernetes.md" %} +[kubernetes.md](kubernetes.md) +{% endcontent-ref %} + +{% content-ref url="aci.md" %} +[aci.md](aci.md) +{% endcontent-ref %} + +{% content-ref url="nomad.md" %} +[nomad.md](nomad.md) +{% endcontent-ref %} + +{% content-ref url="../../../start/install/agent/kaas/" %} +[kaas](../../../start/install/agent/kaas/) +{% endcontent-ref %} + +{% content-ref url="edge.md" %} +[edge.md](edge.md) +{% endcontent-ref %} + +You can also add environments via the Portainer API. + +{% content-ref url="api.md" %} +[api.md](api.md) +{% endcontent-ref %} + diff --git a/admin/environments/add/aci.md b/admin/environments/add/aci.md new file mode 100644 index 00000000..4b929fa0 --- /dev/null +++ b/admin/environments/add/aci.md @@ -0,0 +1,31 @@ +# Add an ACI environment + +Before connecting to your Azure subscription, you need to create an Azure AD application. For more information on this please refer to the [official Microsoft documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal). + +{% hint style="info" %} +The following ACI features are not currently supported: + +* ACI Persistent Storage +* Private networks +{% endhint %} + +To add an ACI environment, click on **Environments** then click the **Add environment** button. + +
+ +Select **ACI** as your environment type and click **Start Wizard**. Enter the **environment details** using the table below as a guide. + +| Field | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Application ID | Enter the application ID for the app you created in your Azure account. This can be found on the **Overview** page of your app within the Azure Portal. | +| Tenant ID | Enter the tenant ID for your app. This can be found on the **Overview** page of your app within the Azure Portal. | +| Authentication Key | Enter the client secret for your app. This can be created under **Certificates & secrets** within your application in the Azure Portal. | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/admin/environments/add/api.md b/admin/environments/add/api.md new file mode 100644 index 00000000..fdf6cc59 --- /dev/null +++ b/admin/environments/add/api.md @@ -0,0 +1,165 @@ +# Add an environment via the Portainer API + +Portainer's [API](../../../api/docs.md) lets you perform the same actions as via the Portainer UI, including adding new environments. This article explains how to add the following types of environments via the API: + +* A local environment using Docker socket communication. +* A remote environment using TCP communication. +* A remote environment using TCP communication secured via TLS. + +{% hint style="info" %} +The examples in this article use [httpie](https://httpie.io/) to make HTTP calls from the command line to the Portainer API. Feel free to replace httpie with your preferred method. +{% endhint %} + +## Preparation + +After deploying Portainer, you'll need to initialize your admin user. First, initialize the admin password: + +``` +http POST https://my-portainer-server:9443/api/users/admin/init Username="admin" Password="adminpassword" +``` + +Now, use the admin account to authenticate against the API. Generate an authorization token for your username. This token will provide you with the same permissions as the user who generated it. + +``` +http POST https://my-portainer-server:9443/api/auth Username="admin" Password="adminpassword" +``` + +The response is a JSON object containing the JWT token inside the `jwt` field. Make a note of this token. You'll use it in the authorization header when making API calls. + +``` +{ + "jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE" +} +``` + +The authorization header value must take the form `Bearer JWT_TOKEN`. Using the above token as an example, the value would look like this: + +``` +Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE +``` + +{% hint style="info" %} +The JWT token is valid for 8 hours after it is generated. Once it expires, you will need to generate a new token. +{% endhint %} + +## Adding an environment + +### Adding a local environment via the Docker socket + +This query will create an environment called `test-local` and will use the Docker socket to communicate with your environment. + +{% hint style="info" %} +This example requires you to bind-mount the Docker socket when running Portainer. +{% endhint %} + +Run the following command: + +``` +http --form POST https://my-portainer-server:9443/api/endpoints \ + "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE" \ + Name="test-local" EndpointCreationType=1 +``` + +The response is a JSON object representing the environment: + +``` +{ + "AuthorizedTeams": [], + "AuthorizedUsers": [], + "Extensions": [], + "GroupId": 1, + "Id": 1, + "Name": "test-local", + "PublicURL": "", + "Type": 1, + "TLSConfig": { + "TLS": false, + "TLSSkipVerify": false + }, + "Type": 1, + "URL": "unix:///var/run/docker.sock" +} +``` + +Make a note of the `Id` value. It will be used to execute queries against the Docker Engine for the endpoint. + +### Adding a remote environment + +This query will create an environment called `test-remote`. It will communicate with your environment over TCP using the IP address `10.0.7.10` and port `2375`. Make sure you replace the example values with your own IP address and port. + +{% hint style="info" %} +The Docker API must be exposed on the provided IP address and port. To learn how to do this, refer to the Docker documentation. +{% endhint %} + +Run the following command: + +``` +http --form POST https://my-portainer-server:9443/api/endpoints \ + "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE" \ + Name="test-remote" URL="tcp://10.0.7.10:2375" EndpointCreationType=1 +``` + +The response is a JSON object representing the environment: + +``` +{ + "AuthorizedTeams": [], + "AuthorizedUsers": [], + "Extensions": [], + "GroupId": 1, + "Id": 1, + "Type": 1, + "Name": "test-remote", + "PublicURL": "", + "TLSConfig": { + "TLS": false, + "TLSSkipVerify": false + }, + "Type": 1, + "URL": "tcp://10.0.7.10:2375" +} +``` + +Take a note of the `Id` value. It will be used to execute queries against the Docker Engine for the environment. + +### Adding a remote environment with TLS + +This query will create an environment called `test-remote-tls`. It will communicate with your environment over TCP (secured with TLS) using the IP address `10.0.7.10` and port `2376`. Make sure you replace the example values with your own IP address and port. + +{% hint style="info" %} +The Docker API must be exposed on the provided IP address and port. To learn how to do this, refer to the Docker documentation. +{% endhint %} + +Run the following command: + +``` +http --form POST https://my-portainer-server:9443/api/endpoints \ + "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE" \ + Name="test-remote-tls" URL="tcp://10.0.7.10:2376" EndpointCreationType=1 TLS="true" TLSCACertFile@/path/to/ca.pem TLSCertFile@/path/to/cert.pem TLSKeyFile@/path/to/key.pem +``` + +The response is a JSON object representing the environment: + +``` +{ + "AuthorizedTeams": [], + "AuthorizedUsers": [], + "Extensions": [], + "GroupId": 1, + "Id": 1, + "Type": 1, + "Name": "test-remote-tls", + "PublicURL": "", + "TLSConfig": { + "TLS": true, + "TLSCACert": "/data/tls/1/ca.pem", + "TLSCert": "/data/tls/1/cert.pem", + "TLSKey": "/data/tls/1/key.pem", + "TLSSkipVerify": false + }, + "Type": 1, + "URL": "tcp://10.0.7.10:2376" +} +``` + +Make a note of the `Id` value. It will be used to execute queries against the Docker Engine for the environment. diff --git a/admin/environments/add/docker.md b/admin/environments/add/docker.md new file mode 100644 index 00000000..6104d759 --- /dev/null +++ b/admin/environments/add/docker.md @@ -0,0 +1,58 @@ +# Add a Docker Standalone environment + +When connecting a Docker Standalone host to Portainer, there are two methods you can use. You can either connect directly to the Docker API via TCP, or you can install the Portainer Agent on the Docker Standalone host and connect via the agent. + +## Connecting via the Docker API + +Before you begin, you will need to ensure that your Docker instance is configured to admit remote connections. To learn how to do this, refer to Docker's own documentation. Once Docker is configured, you will be able to connect either with or without TLS. + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Standalone** as the environment type then click **Start Wizard**. Select the **API** option and your platform, then enter the environment details using the table below as a guide: + +| Field/Option | Overview | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Docker API URL | Enter the DNS name or IP address to connect to the Docker host along with the port. When connecting without TLS, the default port is `2375`. When connecting with TLS, the default port is `2376`. | +| TLS | Toggle this option on if you wish to use TLS. Toggle it off if you don't want to use TLS. | +| Skip Certification Verification | Toggle this option on to skip the verification of the TLS certificate used by the Docker API. If this option is off, the below fields will not appear. | +| TLS CA certificate | Select your CA certificate. | +| TLS certificate | Select your certificate. | +| TLS key | Select the key that matches the certificate. | + +{% hint style="info" %} +Portainer expects TLS certificates and keys to be in PEM format. +{% endhint %} + +
+ +As an optional step you can expand the **More settings** section to add GPUs to your environment, and to categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. + +## Connecting via the Portainer Agent + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Standalone** as the environment type then click **Start Wizard**. Select the **Agent** option, then your environment type. Copy the command for your environment type and run it on your Docker Standalone instance. + +Once the Agent has been deployed, enter the environment details using the table below as a guide: + +| Field/Option | Overview | +| ------------------- | -------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Enter the DNS name or IP address to connect to the Portainer Agent along with the port (the default port is `9001`). | + +
+ +As an optional step you can expand the **More settings** section to add GPUs to your environment, and to categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/admin/environments/add/edge.md b/admin/environments/add/edge.md new file mode 100644 index 00000000..bcc83320 --- /dev/null +++ b/admin/environments/add/edge.md @@ -0,0 +1,54 @@ +# Add an Edge environment + +The Edge Agent was created as a way to manage an Edge Compute environment where devices typically lack the networking capability to run the traditional Portainer Agent. For more information about the Edge Agent and how it works, take a look at our [advanced documentation](../../../advanced/edge-agent.md). + +## Preparation + +### Exposing the tunnel port + +The Edge Agent communicates with the Portainer Server instance over port `8000` (or `30776` if using Kubernetes with NodePort). Through this port, the Edge Agent can poll the Portainer instance, connect to Portainer, see when it is required, then initiate a tunnel or receive configuration updates. Without the tunnel port exposed on the Portainer Server instance, you cannot access the Edge endpoint. If you already deployed Portainer without this port open, you will need to redeploy with the tunnel port exposed alongside the port used to access Portainer. Using the CLI flag `--tunnel-port` you can set a different port if the port is already in use. For more information see [CLI options](../../../advanced/cli.md). + +### Deployment methods available + +| Method | Overview | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Portainer with TLS | If your Portainer instance is deployed with TLS, the agent will use HTTPS for the connection it makes back to Portainer. This is the recommended approach. | +| Portainer with Self-Signed Certs | If you are using self-signed TLS certificates with your Portainer instance, the Edge Agent must be deployed with the flag `-e EDGE_INSECURE_POLL=1`. If you do not deploy Portainer with this flag, the agent cannot communicate with Portainer. | +| Portainer Fallback to HTTP | If Portainer is not configured with either of the above options, it will use HTTP for agent polling as a fallback. We do not recommend this option because it is not secure. | + +## Adding an Edge environment to Portainer + +To add an Edge Agent, click on **Environments** then **Add environment**. + +
+ +Select either Docker or Kubernetes depending on your environment type, then click **Start Wizard**. Then select the **Edge Agent** option. Enter the environment details **** using the table below as a guide. + +| Field | Overview | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Portainer API server URL | Enter the URL and port of your Portainer Server instance as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this. | +| Portainer tunnel server address |

Enter the address and port of your Portainer Server instance's tunnel server as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this.
In most cases, this will be the same address as the Portainer API server URL, but without the protocol and on port 8000.

| + +
+ +As an optional step you can expand the **More settings** section and adjust the Poll frequency for the environment - this defines how often this Edge Agent will check the Portainer Server for new jobs. The default is every 5 seconds. You can also categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Create**. Then complete the new fields that have appeared using the table below as a guide. + +| Field/Option | Overview | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Environment variables | Enter a comma separated list of environment variables that will be sourced from the host where the agent is deployed and provided to the agent. | +| Allow self-signed certs | Toggle this on to allow self-signed certificates when the agent is connecting to Portainer via HTTPS. | + +
+ +Choose your platform and environment where applicable, copy the generated command and run the command on your Edge environment to complete the installation. Alternatively if you are prestaging your Edge Agent, you can retrieve the join token here. You can also adjust the environment configuration from this page. + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you **must** remember to explicitly provide this when deploying your Edge Agent. +{% endhint %} + +If you have another Edge environment of the same type to deploy you can click **Add another environment** to do so. Otherwise if you have any other environments to configure click **Next** to proceed, or click **Close** to return to the list of environments. diff --git a/admin/environments/add/kubernetes.md b/admin/environments/add/kubernetes.md new file mode 100644 index 00000000..894602de --- /dev/null +++ b/admin/environments/add/kubernetes.md @@ -0,0 +1,74 @@ +# Add a Kubernetes environment + +Adding Kubernetes environments to Portainer is straightforward. Before you begin, you will need to decide if you will deploy the agents for Kubernetes via NodePort or Load Balancer. Here, we explain both methods. + +{% hint style="info" %} +This article assumes you are running a [validated Kubernetes configuration](../../../start/requirements-and-prerequisites.md#valid-configurations). +{% endhint %} + +## Deployment + +To deploy Portainer Agent within a Kubernetes cluster you can use the YAML manifests we provide. + +{% hint style="info" %} +Helm charts for agent-only deployments will be available soon. +{% endhint %} + +From the menu select **Environments** then click **Add environment**. + +
+ +Select the **Kubernetes** option and click **Start Wizard**. Select the **Agent** option and choose the tab that matches your configuration (**Kubernetes via load balancer** or **Kubernetes via node port**). Copy the command, then run it on the control node of your Kubernetes cluster. + +{% hint style="info" %} +Make sure you run this command on your Kubernetes node before continuing. +{% endhint %} + +
+ +The deployment command will return something similar to this: + +``` +namespace/portainer created +serviceaccount/portainer-sa-clusteradmin created +clusterrolebinding.rbac.authorization.k8s.io/portainer-crb-clusteradmin created +service/portainer-agent created +service/portainer-agent-headless created +deployment.apps/portainer-agent created +``` + +To validate that the agent is running, use this command: + +``` + kubectl get pods --namespace=portainer +``` + +The result should look something like this: + +``` +NAME READY STATUS RESTARTS AGE +portainer-agent-5988b5d966-bvm9m 1/1 Running 0 15m +``` + +Once the Portainer Agent has been successfully deployed on the cluster, you can complete the rest of the environment configuration. + +## Completing the configuration + +Regardless of the method used, once the agent is running on the Kubernetes host, you must complete the appropriate environmental details. + +{% hint style="warning" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node will allow Portainer to manage the entire cluster. +{% endhint %} + +| Field/Option | Overview | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Define the IP address or name used to connect to the environment (the Kubernetes host) and specify the port if required (`30778` when using NodePort; `9001` when using Load Balancer). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/admin/environments/add/local.md b/admin/environments/add/local.md new file mode 100644 index 00000000..6abd5949 --- /dev/null +++ b/admin/environments/add/local.md @@ -0,0 +1,5 @@ +# Add a local environment + +You can only add a local environment when the Portainer Server container is being created. You cannot add a local environment after Portainer is deployed. + +For more information about the installation process, visit the [Getting Started](../../../start/intro.md) section (in particular, the [installation steps](../../../start/install/)). diff --git a/admin/environments/add/nomad.md b/admin/environments/add/nomad.md new file mode 100644 index 00000000..69db7682 --- /dev/null +++ b/admin/environments/add/nomad.md @@ -0,0 +1,40 @@ +# Add a Nomad environment + +Nomad support in Portainer is provided through the use of the [Portainer Edge Agent](../../../advanced/edge-agent.md). + +To add a Nomad environment, click on **Environments** then click the **Add environment** button. + +
+ +Select **Nomad** as your environment type and click **Start Wizard**. Enter the **environment details** using the table below as a guide. + +| Field | Overview | +| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Portainer server URL | Enter the URL and port of your Portainer Server instance as it will be seen from your Nomad environment. If using a FQDN, ensure that DNS is properly configured to provide this. | + +
+ +As an optional step you can expand the **More settings** section and adjust the Poll frequency for the environment - this defines how often this Edge Agent will check the Portainer Server for new jobs. The default is every 5 seconds. You can also categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Create**. Then complete the new fields that have appeared using the table below as a guide. + +| Field/Option | Overview | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Nomad Authentication Enabled | Toggle this on if your Nomad installation has ACL enabled (recommended). | +| Nomad Token | If the above toggle is on, this field is displayed. Enter the Secret ID from your Nomad installation. | +| TLS | Toggle this on if your Nomad installation uses TLS. | +| Environment variables | Enter a comma separated list of environment variables that will be sourced from the host where the agent is deployed and provided to the agent. | +| Allow self-signed certs | Toggle this on to allow self-signed certificates when the agent is connecting to Portainer via HTTPS. | + +
+ +Copy the generated command based on your settings and run it on your Nomad environment to deploy the Edge Agent. + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you **must** remember to explicitly provide this when deploying your Edge Agent. +{% endhint %} + +If you have another Nomad environment to deploy you can click **Add another environment** to do so. If you have any other non-Nomad environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/admin/environments/add/swarm.md b/admin/environments/add/swarm.md new file mode 100644 index 00000000..2b0f0512 --- /dev/null +++ b/admin/environments/add/swarm.md @@ -0,0 +1,58 @@ +# Add a Docker Swarm environment + +## Deploying the agent + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Swarm** as the environment type then click **Start Wizard**. Select the **Agent** option and your platform. Copy the command, then run it on the manager node of your Docker Swarm cluster. + +{% hint style="info" %} +You must run the command on the Docker Swarm cluster before entering the environment details. +{% endhint %} + +
+ +The deployment command will return something similar to this: + +``` +Creating network portainer-agent_portainer_agent +Creating service portainer-agent_agent +``` + +To validate the agent is running, run the following command: + +``` + docker service ls +``` + +The result of which should look something like this: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +tshb6ee2710s portainer-agent_agent global 1/1 portainer/agent:latest +``` + +Once the Portainer Agent has been successfully deployed on the cluster, you can complete the rest of the environment configuration. + +## Finishing the configuration + +Once the agent is running on the Docker Swarm cluster, enter the environment details, using the table below as a guide. + +{% hint style="warning" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. +{% endhint %} + +| Field | Overview | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Enter the IP or DNS name at which the Portainer Server instance can reach the environment along with the port (`9001`). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../groups.md) or [tagging](../tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments.\ diff --git a/admin/environments/groups.md b/admin/environments/groups.md new file mode 100644 index 00000000..60975a1f --- /dev/null +++ b/admin/environments/groups.md @@ -0,0 +1,34 @@ +# Groups + +Groups organize your environments in Portainer. As an example, you can create groups for development, staging and production to differentiate between environment roles. You can also use groups to define which environments are available to which users. + +{% hint style="info" %} +Portainer Community Edition supports basic user and group assignments. For more complex user roles within groups, use Portainer Business Edition. +{% endhint %} + +## Adding a group + +From the menu select **Environments**, select **Groups**, then click **Add group**. + +
+ +Define the properties of the group, using the table below as a guide. + +| Field/Option | Overview | +| ----------------------- | ------------------------------------------------------- | +| Name | Give the group a descriptive name. | +| Description | Optionally describe the group in more detail. | +| Tags | Apply any tags to the group. | +| Associated environments | Select the environments to be categorized in the group. | + +
+ +When you're finished, click **Create the group**. + +## Removing a group + +When you no longer need a group, you can remove it by ticking the box next to the group then clicking **Remove**. + +{% hint style="info" %} +Removing a group will not delete environments and users in that group. However, it may change the environments accessible to users who have their access assigned via a group. +{% endhint %} diff --git a/admin/environments/tags.md b/admin/environments/tags.md new file mode 100644 index 00000000..14016ff8 --- /dev/null +++ b/admin/environments/tags.md @@ -0,0 +1,23 @@ +# Tags + +Tags can be applied to environments and are useful for defining node or resource metadata. For example, you could use tags to define the physical location of nodes, departments or owners of resources, and much more. + +## Creating a tag + +From the menu select **Environments** then select **Tags**. + +
+ +Enter a name for the tag then click **Create tag**. The tag appears in the list and can be assigned to environments. + +## Tagging an environment + +From the menu select **Environments** then select the environment you want to tag. + +
+ +From the **Tags** lookup select the tag then click **Update environment**. + +{% hint style="info" %} +Environment tags will be visible on the Portainer home page. You can also search for environments based on their tags. +{% endhint %} diff --git a/admin/environments/update.md b/admin/environments/update.md new file mode 100644 index 00000000..269f2db5 --- /dev/null +++ b/admin/environments/update.md @@ -0,0 +1,46 @@ +# Update & Rollback + +This feature lets you upgrade your Edge Agent deployments directly from Portainer, without the need to log into the remote environments and manually update. + +{% hint style="warning" %} +This feature is currently in beta, and is only currently available for Edge Agents running on Docker Standalone environments. +{% endhint %} + +To view your currently scheduled updates or schedule a new update process, from the menu select **Environments** then select **Update & Rollback**. + +
+ +Here you will see a list of your pending and completed updates and rollbacks. + +## Schedule an update + +To add a new update schedule, click the **Add update & rollback schedule** button, then fill out the form. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for the scheduled update. | +| Groups | Select the Edge Group(s) containing the Edge devices you want to update. You can configure these groups under [Edge Groups](../../user/edge/groups.md). | +| Version | Ensure the **Update** tab is selected, then select the version you want to upgrade to from the dropdown. | +| Schedule date & time |

Select a date and time to schedule the update.
When upgrading from a version prior to 2.17, this field will be unavailable and the upgrade will take place immediately on creation of the schedule.

| + +
+ +When you're ready, click **Create Schedule** to schedule the update. You will be returned to the Update & Rollback page where you can check the status of your scheduled update. + +
+ +## Schedule a rollback + +To schedule the rollback of an update, click the **Add update & rollback schedule** button, then fill out the form. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Name | Enter a name for the scheduled rollback. | +| Group | Select the Edge Group(s) containing the Edge devices you want to roll back. You can configure these groups under [Edge Groups](../../user/edge/groups.md). | +| Version |

Ensure the Rollback tab is selected, then select the version you want to roll back to from the dropdown.
This dropdown is only available when multiple rollback versions are available.

| +| Schedule date & time | Select a date and time to schedule the rollback. | + +
+ +When you're ready, click **Create Schedule** to schedule the rollback. You will be returned to the Update & Rollback page where you can check the status of your scheduled rollback. + diff --git a/admin/licenses.md b/admin/licenses.md new file mode 100644 index 00000000..552423f3 --- /dev/null +++ b/admin/licenses.md @@ -0,0 +1,15 @@ +# Licenses + +Licensing in Portainer Business Edition is based on the [number of nodes](https://portal.portainer.io/knowledge/what-is-a-node-for-licensing-purposes) you are managing. + +From the menu select **Licenses**. The **License Information** section summarizes information about your license including how many nodes it covers and how many nodes are currently being used, as well as the license expiry date. You can click **Upgrade licenses** to purchase additional licenses. + +
+ +You can also view a list of each license applied to your Portainer installation. + +
+ +If you want to add more nodes to your environment than your license allows, first [upgrade your license](https://portal.portainer.io/knowledge/how-do-i-upgrade-my-license) then click **Add license**, enter your license key then click **Submit**. + +
diff --git a/admin/logs/README.md b/admin/logs/README.md new file mode 100644 index 00000000..db44572e --- /dev/null +++ b/admin/logs/README.md @@ -0,0 +1,19 @@ +# Authentication logs + +Within the Portainer Business Edition UI you can view a log of all authentication actions. The log is read-only and cannot be edited. + +{% hint style="info" %} +Portainer also provides the ability to view [detailed activity logs](activity.md). +{% endhint %} + +From the menu select **Authentication logs**. + +
+ +If you want to export logs, filter by date range then click **Export to CSV**. + +
+ +Authentication events are searchable and filterable, and the date and time, origin IP address, context, user and result are provided for each. + +
diff --git a/admin/logs/activity.md b/admin/logs/activity.md new file mode 100644 index 00000000..56d3fe22 --- /dev/null +++ b/admin/logs/activity.md @@ -0,0 +1,19 @@ +# Activity logs + +Within the Portainer Business Edition UI you can view a log of all actions taken. The log is read-only and cannot be edited. + +From the menu select **Authentication logs** then select **Activity Logs**. + +
+ +If you want to export logs, filter by date range then click **Export to CSV**. + +
+ +Activity logs are searchable, and the date and time, user, endpoint, and action are provided for each. + +
+ +You can also click **inspect** to inspect the activity's payload. + +
diff --git a/admin/notifications.md b/admin/notifications.md new file mode 100644 index 00000000..90437bdc --- /dev/null +++ b/admin/notifications.md @@ -0,0 +1,9 @@ +# Notifications + +The Notifications section contains a record of all the notification messages you have received in Portainer (the popup messages that appear in the top right of the interface). You can search through past notifications as well as remove specific notification records from the list. + +{% hint style="info" %} +This section is also accessible by clicking the bell icon in the top right of any page in the Portainer UI. +{% endhint %} + +
diff --git a/admin/registries/README.md b/admin/registries/README.md new file mode 100644 index 00000000..91bb8751 --- /dev/null +++ b/admin/registries/README.md @@ -0,0 +1,33 @@ +# Registries + +A registry is a repository of container images that can be pulled and deployed on a containerized infrastructure. Portainer supports connecting registries to the Portainer Server instance, allowing you to use those registries when deploying containers. + +
+ +{% content-ref url="add/" %} +[add](add/) +{% endcontent-ref %} + +{% content-ref url="add/custom.md" %} +[custom.md](add/custom.md) +{% endcontent-ref %} + +With Portainer Business Edition you can also browse and manage your registries within Portainer itself. + +{% content-ref url="browse.md" %} +[browse.md](browse.md) +{% endcontent-ref %} + +{% content-ref url="manage.md" %} +[manage.md](manage.md) +{% endcontent-ref %} + +## Hiding anonymous Docker Hub + +By default the **Docker Hub (anonymous)** registry is available to all users. If you would prefer to hide this from the registry selection, you can click **Hide for all users**. + +
+ +{% hint style="info" %} +As the anonymous Docker Hub access is built into Docker itself this does not fully disable access to this registry, but it does hide it from the dropdown list of registries in the Portainer UI. In addition, if no other registries are available to a user the Docker Hub (anonymous) option will be displayed regardless of this setting. +{% endhint %} diff --git a/admin/registries/add/README.md b/admin/registries/add/README.md new file mode 100644 index 00000000..71366126 --- /dev/null +++ b/admin/registries/add/README.md @@ -0,0 +1,41 @@ +# Add a new registry + +From the menu select **Registries** then click **Add registry**. + +
+ +From the **Registry provider** section select the type of registry you want to add. Portainer provides configuration support for a number of popular registry providers: + +{% content-ref url="dockerhub.md" %} +[dockerhub.md](dockerhub.md) +{% endcontent-ref %} + +{% content-ref url="ecr.md" %} +[ecr.md](ecr.md) +{% endcontent-ref %} + +{% content-ref url="quay.md" %} +[quay.md](quay.md) +{% endcontent-ref %} + +{% content-ref url="proget.md" %} +[proget.md](proget.md) +{% endcontent-ref %} + +{% content-ref url="azure.md" %} +[azure.md](azure.md) +{% endcontent-ref %} + +{% content-ref url="gitlab.md" %} +[gitlab.md](gitlab.md) +{% endcontent-ref %} + +{% content-ref url="ghcr.md" %} +[ghcr.md](ghcr.md) +{% endcontent-ref %} + +You can also add your own custom registry: + +{% content-ref url="custom.md" %} +[custom.md](custom.md) +{% endcontent-ref %} diff --git a/admin/registries/add/azure.md b/admin/registries/add/azure.md new file mode 100644 index 00000000..240759f3 --- /dev/null +++ b/admin/registries/add/azure.md @@ -0,0 +1,18 @@ +# Add an Azure registry + +From the menu select **Registries** then click **Add registry** and select **Azure** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------ | ---------------------------------------------------------------- | +| Name | Enter the name you'd like to use in Portainer for your registry. | +| Registry URL | Enter the URL of your Azure registry. | +| Username | Enter the username you use to log into your Azure registry. | +| Password | Enter the password that corresponds to the username above. | + +
+ +When the form is complete, click **Add registry**. diff --git a/admin/registries/add/custom.md b/admin/registries/add/custom.md new file mode 100644 index 00000000..d64f7c4c --- /dev/null +++ b/admin/registries/add/custom.md @@ -0,0 +1,12 @@ +# Add a custom registry + +From the menu select **Registries** then click **Add registry**. Ensure **Custom registry** is selected. + +
+ +In the **Custom registry details** section, enter the registry name and URL (both mandatory). If authentication is required, toggle **Authentication** on and enter the username and password. + +
+ +When you're finished, click **Add registry**. + diff --git a/admin/registries/add/dockerhub.md b/admin/registries/add/dockerhub.md new file mode 100644 index 00000000..1ed20066 --- /dev/null +++ b/admin/registries/add/dockerhub.md @@ -0,0 +1,20 @@ +# Add a DockerHub account + +Portainer provides built-in support for anonymous Docker Hub access, but in some cases you may need to log into Docker Hub (for example, private images or to support pulling a large number of images). + +From the menu select **Registries** then click **Add registry** and select **DockerHub** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for the registry. This is how it will appear in the list of registries and when selecting a registry to pull from. | +| DockerHub username | Enter the username you use to connect to Docker Hub. | +| DockerHub access token | Enter a Docker Hub personal access token that corresponds to the username above. You can create an access token by logging into Docker Hub, clicking your username in the top right and going to Account Settings then the Security tab. | + +
+ +When the form is complete, click **Add registry**. + diff --git a/admin/registries/add/ecr.md b/admin/registries/add/ecr.md new file mode 100644 index 00000000..68bfa342 --- /dev/null +++ b/admin/registries/add/ecr.md @@ -0,0 +1,32 @@ +# Add an AWS ECR registry + +From the menu select **Registries** then click **Add registry** and select **AWS ECR** as the registry provider. + +
+ +## Preparation + +If your registry requires authentication to access, you must create an IAM user with access to the registry for Portainer to use. Instructions on creating an IAM user are available [from AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id\_users\_create.html#id\_users\_create\_console). When you have created the user, make note of the **Access key ID** and **Secret access key**, as you will need these below. + +{% hint style="info" %} +At present we do not support IAM users with MFA enabled. We recommend creating a user specifically for Portainer to use with MFA disabled. +{% endhint %} + +When creating the user you will need to attach one or more policies to provide registry access. For full registry management functionality within Portainer, we recommend the `AmazonEC2ContainerRegistryFullAccess` policy. + +## Add your registry + +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter the name you'd like to use in Portainer for your registry. | +| Registry URL | Enter the URL of your AWS ECR registry, including the account ID and region. You can find this in the AWS console under Amazon Container Services, ECR, Registries. | +| Authentication | Enable this option if your registry requires authentication to access. | +| AWS Access Key | Enter the Access key ID for the IAM user that will access the AWS ECR registry. | +| AWS Secret Access Key | Enter the Secret access key for the above IAM user. | +| Region | Enter the region your registry is in, for example `us-west-1`. | + +
+ +When the form is complete, click **Add registry**. diff --git a/admin/registries/add/ghcr.md b/admin/registries/add/ghcr.md new file mode 100644 index 00000000..3f55d9c4 --- /dev/null +++ b/admin/registries/add/ghcr.md @@ -0,0 +1,23 @@ +# Add a Github registry + +From the menu select **Registries** then click **Add registry** and select **Github** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter the name you'd like to use in Portainer for your registry. | +| Username | Enter the username you use to log into your Github registry. | +| Personal Access Token | Enter the personal access token that corresponds to the username above. Your personal access token will need the `delete:packages`, `repo`, and `write:packages` scopes assigned. | +| Use organisation registry | Toggle this on if your registry is part of a Github organization. | +| Organisation name | Enter the name of your Github organization. | + +
+ +{% hint style="info" %} +For more information about creating a personal access token, see [Github's own documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token). +{% endhint %} + +When the form is complete, click **Add registry**. diff --git a/admin/registries/add/gitlab.md b/admin/registries/add/gitlab.md new file mode 100644 index 00000000..443e144c --- /dev/null +++ b/admin/registries/add/gitlab.md @@ -0,0 +1,21 @@ +# Add a Gitlab registry + +From the menu select **Registries** then click **Add registry** and select **Gitlab** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Username | Enter the username you use to log into your Gitlab registry. | +| Personal Access Token | Enter the personal access token that corresponds to the username above. Your personal access token will need the `read_api` and `read_registry` scopes assigned. | +| Override default configuration | If you need to make changes to the Portainer defaults for Gitlab, you can do so here. | + +
+ +{% hint style="info" %} +For more information about creating a personal access token, see [Gitlab's own documentation](https://docs.gitlab.com/ee/user/profile/personal\_access\_tokens.html). +{% endhint %} + +When the form is complete, click **Add registry**. diff --git a/admin/registries/add/proget.md b/admin/registries/add/proget.md new file mode 100644 index 00000000..f264a16d --- /dev/null +++ b/admin/registries/add/proget.md @@ -0,0 +1,19 @@ +# Add a ProGet registry + +From the menu select **Registries** then click **Add registry** and select **ProGet** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------ | ---------------------------------------------------------------- | +| Name | Enter the name you'd like to use in Portainer for your registry. | +| Registry URL | Enter the URL of your ProGet registry, including the feed name. | +| Base URL | Enter the base URL of your ProGet registry. | +| Username | Enter the username you use to log into your ProGet registry. | +| Password | Enter the password that corresponds to the username above. | + +
+ +When the form is complete, click **Add registry**. diff --git a/admin/registries/add/quay.md b/admin/registries/add/quay.md new file mode 100644 index 00000000..31f36cad --- /dev/null +++ b/admin/registries/add/quay.md @@ -0,0 +1,17 @@ +# Add a Quay.io registry + +From the menu select **Registries** then click **Add registry** and select **Quay.io** as the registry provider. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------------------- | -------------------------------------------------------------------------------------------------- | +| Username | Enter the username you use to connect to your Quay.io registry. | +| Password | Enter the password that corresponds to the username above. | +| Use organisation registry | Toggle on if you need to specify the organization to use when connecting to your Quay.io registry. | + +
+ +When the form is complete, click **Add registry**. diff --git a/admin/registries/browse.md b/admin/registries/browse.md new file mode 100644 index 00000000..eecf5ae9 --- /dev/null +++ b/admin/registries/browse.md @@ -0,0 +1,21 @@ +# Browse a registry + +The registry manager extends your container management experience by giving you the ability to browse defined registries and manipulate their content. By using this feature, container users enjoy the benefit of having a single interface to manage any Docker registry deployment, providing a consistent look and feel across any provider. + +{% hint style="info" %} +Your registry must support Docker Registry API v2 in order to integrate with Portainer. +{% endhint %} + +From the menu select **Registries** then select **Browse** next to the registry that you want to browse. + +
+ +A list of the repositories within a registry, along with the number of tags for each repository appears. Select a repository to view its details. + +
+ +The **Repository information** page provides the repository name, tag and image count, as well as a list of all tags. You can retag an image in order to promote it through the deployment lifecycle, or simply add or remove tags to annotate changes or usage. + +This page also provides an option to clean up unused legacy images by safely deleting them. You can also remove the entire repository. + +
diff --git a/admin/registries/manage.md b/admin/registries/manage.md new file mode 100644 index 00000000..22f5c011 --- /dev/null +++ b/admin/registries/manage.md @@ -0,0 +1,47 @@ +# Manage a registry + +The registry manager extends your container management experience by giving you the ability to browse defined registries and manipulate their content. By using this feature, container users enjoy the benefit of having a single interface to manage any Docker registry deployment, providing a consistent look and feel across any provider. + +## Adding a tag + +From the menu select **Registries**, select the registry you want to manage then click **browse**. From the list, select the repository you want to manage. + +
+ +In the **Add tag** section at the top-right of the page, enter the name of your tag, select the image from the dropdown, then click the **Add tag** button. + +
+ +## Retagging + +{% hint style="info" %} +If you host your own Docker registry, and you want the ability to retag images, you will need to add the following to your Docker registry's environment variables: + +`REGISTRY_STORAGE_DELETE_ENABLED=TRUE` +{% endhint %} + +From the menu select **Registries**, choose the registry you want to manage and click **browse**. From the list of repositories, select the repository you want to manage. + +
+ +In the **Tags** section, locate the image you want to retag then click **Retag** to its right. Enter the new tag for the image then click the tick icon. + +
+ +## Removing a tag + +{% hint style="info" %} +If you host your own Docker registry, and want the ability to remove tags, you will need to add the following to your Docker registry's environment variables: + +`REGISTRY_STORAGE_DELETE_ENABLED=TRUE` +{% endhint %} + +From the menu select **Registries**, select the registry you want to manage then click **Browse**. From the list, select the repository you want to manage. + +
+ +Tick the checkbox next to the tag you want to remove then click **Remove**. + +
+ +When the confirmation message appears, if you're sure, click **Remove**. diff --git a/admin/settings/README.md b/admin/settings/README.md new file mode 100644 index 00000000..60cb79c9 --- /dev/null +++ b/admin/settings/README.md @@ -0,0 +1,164 @@ +# Settings + +## Application settings + +### Snapshot interval + +Defines how often a data snapshot of environments is taken. A data snapshot consists of the information displayed on the home page for the environment as well as other basic information. The default is every 5 minutes. + +### Use custom logo + +Replaces our logo with your own. Toggle on and enter the URL to the logo. The recommended size is 155px by 55px. + +### Allow the collection of anonymous statistics + +We collect anonymized information about your Portainer installation to help with our product development. You can opt out during installation, or toggle this setting off at any time. + +
+ +### Login screen banner + +This setting allows you to specify a custom text banner that will appear on the login screen for all users. This could be used to provide informational detail, a warning message, or whatever you need. To enable this, toggle the **Login screen banner** option on and enter your message in the **Details** box. + +
+ +Your message will then be shown at the login screen. + +
+ +### App Templates + +You can deploy containers and services using Portainer's set of built-in app templates, or [replace them with your own](../../advanced/app-templates/build.md) set of templates. Once you have a JSON file containing the template definitions, you can provide the URL to it here. + +
+ +## Kubernetes settings + +### Helm Repository + +If you wish to use your own Helm repository in place of the Bitnami repository we include by default, you can enter the URL here. + +
+ +### Kubeconfig expiry + +Select the expiry time for [exported kubeconfig files](../../user/kubernetes/kubeconfig.md) from this dropdown. The new expiry time will only apply to configurations created after this value was changed. + +
+ +{% hint style="warning" %} +Tokens used in `kubeconfig` files become invalid when Portainer restarts — irrespective of the value set for **Kubeconfig expiry**. In this case, you will need to re-download the `kubeconfig` file. +{% endhint %} + +### Deployment options + +In this section you can configure various Kubernetes-specific deployment options. + +| Field/Option | Overview | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enforce code-based deployment | Enable this option to hide the Add with form button when deploying applications and prevent the adding or editing of Kubernetes resources via forms. | +| Allow web editor use | When code-based deployment is enforced, enable this to allow the use of the web editor when deploying an application. | +| Allow file upload | When code-based deployment is enforced, enable this allow the use of the URL option when deploying an application. | +| Allow per-environment override | Enable this to allow the above enforcement options to be overridden on a per-environment basis. | + +
+ +## SSL certificate + +During installation, Portainer by default creates a self-signed SSL certificate to encrypt traffic between the Portainer Server and the end user, as well as between the Portainer Server and the Portainer Agent. This certificate can be replaced with your own certificate. + +{% hint style="info" %} +We recommend including the full chain in the certificate to ensure compatibility. If you do not have the full chain for your certificate, ask your certificate provider or use [What's My Chain Cert?](https://whatsmychaincert.com/) to generate it. +{% endhint %} + +
+ +### Force HTTPS only + +If you have configured your Portainer Server instance to listen on `9443` (HTTPS) and `9000` (HTTP) you can toggle **Force HTTPS only** on to disable listening on port `9000`. + +{% hint style="danger" %} +Make sure that your HTTPS configuration is working correctly **before** enabling this option. Failure to do so may result in you being [locked out of your Portainer installation](https://portal.portainer.io/knowledge/i-enabled-force-https-only-and-now-im-locked-out-of-portainer-how-do-i-get-back-in). +{% endhint %} + +{% hint style="warning" %} +Ensure that any Edge agents have been correctly configured for HTTPS communication before enabling this. +{% endhint %} + +
+ +After making changes to this section, click **Apply Changes**. + +## Hidden containers + +Stops a container from appearing in the Portainer UI through the container label. Enter the name and value of the label, then click **Add filter**. Containers with matching labels will be hidden. + +
+ +## Backup Portainer + +This setting contains all of the information that Portainer stores on the `/data` volume, archived in a `tar.gz` file, and is optionally encrypted with a password. This archive is all you need to restore Portainer. + +### Backing up to a local disk + +Log in as an admin user. From the menu select **Settings**, then scroll down to the **Backup Portainer** section. + +
+ +**Download backup file** is the default option. As an optional step, toggle **Password protect** on and enter a password to encrypt the backup file. When you click **Download backup**, a `tar.gz` file will be downloaded via the browser. + +### Backing up to S3 + +With Portainer Business Edition you have the option to store a backup of your configuration in an S3 bucket, either on demand or on a defined schedule. + +To do this, log in as an admin user, select **Settings** from the menu, then scroll down to **Backup Portainer**. + +
+ +Select **Store in S3** and fill in the options, using the below as a guide. + +| Field/Option | Overview | +| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Schedule automatic backups | Enable this to schedule an automatic backup of your configuration to an S3 bucket. | +| Cron rule |

Define how often you want the backup to run using the cron format.

[minute] [hour] [day of month] [month] [day of week]

For example, the following would run a backup at 3:41am every Tuesday:

41 3 * * 2

| +| Access Key ID | Enter the access key ID for your S3 bucket. | +| Secret Access Key | Enter the secret key for your S3 bucket. | +| Region | Enter the region where your bucket is located (for example, `us-west-1`). | +| Bucket name | Enter the name of your S3 bucket. | +| S3 compatible host | If you are using a non-AWS S3-compatible provider (such as MinIO), enter the hostname here. If you're using AWS S3, leave this blank. | +| Password protect | Enable this to protect your backups with a password. | +| Password | Enter the password to set on your backups. | + +
+ +### Restoring from a local file + +Restoring a configuration is only possible on a fresh instance of Portainer during the initial installation. When you need to restore Portainer, deploy a fresh instance of Portainer with an empty data volume and choose the **Restore Portainer from backup** option during setup. + +
+ +On the initialization page, expand **Restore Portainer from backup**. Click **Select file** then browse to and select the `tar.gz` backup file. If the backup was originally encrypted, enter the password then click **Restore Portainer**. + +The restore might take a few moments. When it has finished, you will be redirected to the login page. You can now log in with your previous credentials and your previous configuration will be restored. + +### Restoring from S3 + +{% hint style="info" %} +This feature is only available in Portainer Business Edition. +{% endhint %} + +Restoring a configuration is only possible on a fresh instance of Portainer during the initial installation. When you need to restore Portainer, deploy a fresh instance of Portainer with an empty data volume and choose the **Restore Portainer from backup** option during setup, making sure to select **Retrieve from S3**. Complete the fields using the table below as a guide. + +| Field/Option | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| Access key ID | Enter the access key ID for your S3 bucket. | +| Secret access key | Enter the secret key for your S3 bucket. | +| Region | Enter the region where your bucket is located (for example, `us-west-1`). | +| Bucket name | Enter the name of your S3 bucket. | +| S3 Compatible Host | If you are using a non-AWS S3-compatible provider (such as MinIO), enter the hostname here. If you're using AWS S3, leave this blank. | +| Filename | Enter the filename of the backup you want to restore. | +| Password | Enter the password set on your backup (if any). | + +
+ +When you're ready, click **Restore Portainer**. The restore might take a few moments. When it has finished, you will be redirected to the login page. You can now log in with your previous credentials and your previous configuration will be restored. diff --git a/admin/settings/authentication/README.md b/admin/settings/authentication/README.md new file mode 100644 index 00000000..e9e9297e --- /dev/null +++ b/admin/settings/authentication/README.md @@ -0,0 +1,26 @@ +# Authentication + +Portainer provides its own internal authentication mechanism, encrypting user passwords and storing them in the local Portainer database. Alternatively, external authentication providers are available. In this section, we explain how to authenticate via LDAP, Active Directory and OAuth. + +{% hint style="info" %} +For all authentication types you can adjust the session lifetime (the time before users are forced to reauthenticate). The default is 8 hours. +{% endhint %} + +When using internal authentication, an administrator can set the minimum length for users' passwords. The default is 12 characters, but this can be adjusted using the slider. Any users with passwords that don't meet the requirements will be asked to update their passwords when they next log in. + +
+ +{% content-ref url="ldap.md" %} +[ldap.md](ldap.md) +{% endcontent-ref %} + +{% content-ref url="active-directory.md" %} +[active-directory.md](active-directory.md) +{% endcontent-ref %} + +{% content-ref url="oauth.md" %} +[oauth.md](oauth.md) +{% endcontent-ref %} + + + diff --git a/admin/settings/authentication/active-directory.md b/admin/settings/authentication/active-directory.md new file mode 100644 index 00000000..de003ac3 --- /dev/null +++ b/admin/settings/authentication/active-directory.md @@ -0,0 +1,86 @@ +# Authenticate via Active Directory + +Portainer Business Edition lets you connect to an existing Microsoft Active Directory service to manage your authentication settings in Portainer. + +To set up Active Directory authentication, from the menu select **Settings** then select **Authentication**. Under the **Authentication method** section select **Microsoft Active Directory**. + +
+ +A guide to all of the Active Directory configuration settings follows. + +## Automatic user provisioning + +Enabling this setting automatically creates users within Portainer once they are successfully authenticated by Active Directory (AD). If you do not enable this, you must [manually create users](ldap.md#manually-creating-ldap-users) with the same username as the corresponding AD user. + +
+ +## AD configuration + +Configure your Active Directory details using the table below as a guide. + +| Field/Option | Overview | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| AD Controller | Enter the FQDN or IP address of your domain controller. If you need to add more than one server, click **Add additional server**. | +| Service Account | Enter the account name that is used to connect to Active Directory and search users. | +| Service Account Password | Enter the password for the above service account. | +| Connectivity check | Perform a check to ensure there is connectivity and SSL handshaking between Portainer and your Active Directory server (if **Use StartTLS** or **Use TLS** are selected under the **AD Connectivity Security** section). | + +
+ +## AD Connectivity Security + +Configure the security settings using the table below as a guide. + +| Field/Option | Overview | +| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Use StartTLS | Enable this option if want to use StartTLS to secure the connection to the server. Enabling this will hide and ignore the **Use TLS** option. | +| Use TLS | Enable this option if you need to specify TLS certificates to connect to the LDAP server. Enabling this will hide and ignore the **Use StartTLS** option. | +| Skip verification of server certificate | Toggle this option on if you want to skip the verification of the server TLS certificate. Not recommended on unsecured networks. | +| TLS CA certificate | Lets you upload the CA certificate for your TLS certificate. | + +
+ +## User search configurations + +Configure the user search configurations using the table below as a guide. Click **add user search configuration** to set up multiple configurations. + +| Field/Option | Overview | +| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Username Format | Select the username format you want to use when logging into Portainer. Options are `username` and `username@domainname`. | +| Root Domain | This will be filled with the domain of the domain controller. | +| User Search Path (optional) | Click **add another entry** to define specific OUs or folders to search for users. | +| Allowed Groups (optional) | Click **add another group** to define specific groups to be allowed access to Portainer. | +| User Filter | This will be filled based on the options you selected previously. | +| Display Users | Click this to use the settings provided to query the Active Directory server for a list of users matching the specified criteria. | + +
+ +## Group search configurations + +Configure the group search configurations using the table below as a guide. Click **add group search configuration** to set up multiple configurations. + +| Field/Option | Overview | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Group Search Path (optional) | Click **add another entry** to define specific OUs or folders to search for groups. | +| Group Base DN | Automatically updated based on previous selections. | +| Groups | Click **add another group** to define specific groups by OU or folder name. | +| Group Filter | This will be filled based on options previously selected. | +| Display User/Group matching | Click this to use the settings provided in Portainer to query the Active Directory server for a list of users matching the criteria specified, and how they match to groups. | + +
+ +## Auto-populate team admins + +If desired, Portainer can configure specified AD groups of users to become Portainer administrators automatically. + +To configure this, first click **add group search configuration** and define the **Group Base DN**, **Groups** and **Group Filter** as required. Once done, click the **Fetch Admin Group(s)** button to retrieve the list of groups matching your search configuration. + +
+ +When you're happy with the group selection, enable this feature by toggling **Assign admin rights to group(s)** on. + +## Test login + +To test your settings are correct and that the right users and groups are configured for access, scroll down to **Test login**, enter a valid user and password then click **Test**. If everything is working as expected, a green tick will appear next to the button. + +
diff --git a/admin/settings/authentication/ldap.md b/admin/settings/authentication/ldap.md new file mode 100644 index 00000000..271c565e --- /dev/null +++ b/admin/settings/authentication/ldap.md @@ -0,0 +1,143 @@ +# Authenticate via LDAP + +## Introduction + +Portainer can be configured to accept Lightweight Directory Access Protocol (LDAP) authentication if your organization has implemented LDAP authentication. When users attempt to log into Portainer, the application will authenticate them against your LDAP directory. If authentication is successful, the user is allowed to log into Portainer. + +To configure Portainer LDAP authentication, you first need to add a user to your directory service for the purpose of authenticating from Portainer to read the LDAP. The user should be a service account that needs read-only access to LDAP. + +## Enabling LDAP + +Log into Portainer as an administrator. From the menu select **Settings**, select **Authentication** then select the **LDAP Authentication** option. Extra fields will appear, allowing you to configure LDAP. + +
+ +### Automatic user provisioning + +Enabling this setting automatically creates users within Portainer once they are successfully authenticated by LDAP. If you do not enable this, you must [manually create users](ldap.md#manually-creating-ldap-users) with the same username as the corresponding LDAP directory. + +
+ +### Server Type + +Here you can select a custom configuration or a preconfigured OpenLDAP template. + +
+ +### LDAP configuration + +Enter the IP address/FQDN and port number of your LDAP server. Opt to either connect anonymously (your LDAP server must support this) or enter a user account that has READ access to the directory. Click **Test connectivity** to validate that you can connect. + +{% hint style="info" %} +For OpenLDAP, the Reader DN format should be set to `cn=user,dc=domain,dc=tld`. If your configuration differs you will need to adjust this to suit. +{% endhint %} + +
+ +If you want to add additional LDAP servers to provide for authentication fallback, click **Add additional server** and fill in the server details. + +### LDAP security + +Configure the remaining LDAP settings, using the table below as a guide: + +| Field/Option | Overview | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Use StartTLS | Changes the insecure connection to secure after the initial connection. | +| Use TLS | Initiates a connection to LDAP using TLS. | +| Skip verification of server certificate | If you do not have access to the LDAP server certificate, skipping verification will enable encrypted communications. However, you must manually ensure that you are talking to the intended LDAP server that you specified in the URL. If that gets maliciously redirected, you could be talking to a different server. Use with caution. | + +
+ +| Field/Option | Overview | +| ------------------ | -------------------------------------------------------------- | +| TLS CA certificate | Lets you upload your CA certificate for the secure connection. | + +
+ +### User-search configurations + +#### BaseDN + +* Enter `dc=mydomain,dc=com` to search your entire directory for the username attempting to login. +* Enter `ou=myou,dc=mydomain,dc=com` to search for users only within the specified OU. +* Enter `cn=mycn,dc=mydomain,dc=com` if your users are only in a container. + +If you have a large number of users in your domain, narrow the scope Portainer searches on by using OUs. + +#### Username attribute + +For LDAP, enter `uid` unless your configuration differs. + +#### Filter + +{% hint style="info" %} +These entries are case sensitive. +{% endhint %} + +Enter filter criteria for the results returned from LDAP to Portainer. For example, to only allow users who are members of a group defined within an OU to login, set **Filter** to the following (the brackets are important, so copy the entire string): + +``` +(&(objectClass=user)(memberOf=cn=mycn,ou=myou,dc=mydomain,dc=com)) +``` + +In the example below, the domain `portainer.local` has an OU called `Groups` and within that OU is a group called `PortainerDevUsers`. This search filter will only allow users who are members of the `PortainerDevUsers` LDAP group to log into Portainer. + +
+ +As an optional step, click **Add user search configuration** to define additional user-search configurations. + +### Group-search configurations + +In addition to user search, Portainer also gives you the option to set up group search. When configured, if an LDAP user is a member of an LDAP group, and that LDAP Group corresponds to an identically named Portainer [Team](../../users/teams/), then the LDAP user will automatically be placed into the Portainer Team based on their LDAP group membership. This is very useful for automatically granting access to Portainer environments via group membership. + +#### Group Base DN + +Enter either: + +* Enter `dc=mydomain,dc=com` to search your entire directory for the list of groups. +* Enter `ou=myou,dc=mydomain,dc=com` to search for groups only within the specified OU. +* Enter `cn=mycn,dc=mydomain,dc=com` if your groups are only in a container. + +If you have a large number of groups in your domain, narrow the scope Portainer searches on by using OUs. + +
+ +#### Group Membership Attribute + +Enter `member` as the attribute that determines if a user is a member of a group. + +#### Group Filter + +If you want to filter the list of groups to return only those that contain the string `Portainer` (for example: `PortainerDev`, `PortainerProd`, `PortainerUAT`), set up the filter like this: + +``` +(&(objectclass=group)(cn=*Portainer*)) +``` + +
+ +As an optional step, click **Add group search configuration** to define additional group-search configurations. + +### Auto-populate team admins + +If desired, Portainer can configure specified LDAP groups of users to become Portainer administrators automatically. + +To configure this, first click **add group search configuration** and define the **Group Base DN**, **Groups** and **Group Filter** as required. Once done, click the **Fetch Admin Group(s)** button to retrieve the list of groups matching your search configuration. + +
+ +When you're happy with the group selection, enable this feature by toggling **Assign admin rights to group(s)** on. + +### Test login + +To test your configuration, you can enter a username and password and click the **Test** button. + +
+ +## Manually creating LDAP users + +{% hint style="info" %} +This is an optional step and is required only if you do not use automatic user provisioning. +{% endhint %} + +Once LDAP has been enabled, from the menu select **Users**. Create a username that matches your LDAP source users with the format defined when you enabled LDAP (either `username` or `username@mydomain.com`). diff --git a/admin/settings/authentication/oauth.md b/admin/settings/authentication/oauth.md new file mode 100644 index 00000000..45ec5a3d --- /dev/null +++ b/admin/settings/authentication/oauth.md @@ -0,0 +1,137 @@ +# Authenticate via OAuth + +## Configuring OAuth authentication in Portainer + +From the menu select **Settings** then select **Authentication**. Under the **Authentication method** section click **OAuth**. + +
+ +In the next screen, enter the credentials provided by your OAuth provider, using the table below as a guide. + +| Field/Option | Overview | +| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Use SSO | Enable SSO so that the OAuth provider won't be forced to ask for credentials when users are in a current logged-in session. | +| Hide internal authentication prompt | Hide the ability to log in through internal authentication. | +| Automatic user provisioning | If toggled on, users who exist at the OAuth provider's end will automatically be created in Portainer (you can define a default team to put those users in while this option is on). If toggled off, you'll need to [create users](../../users/add.md) in Portainer manually. | + +
+ +If you toggle **Automatic team membership** on, you can choose to automatically add OAuth users to certain Portainer teams based on the **Claim name**. Claim names will be matched with teams or you can manually link a claim name (using regex) with Portainer teams under the **Statically assigned teams** option. You can also define a **Default team** for users who don't belong to any other team. + +In addition, you can enable the automatic assignment of admin rights to specified groups if desired. + +
+ +## OAuth providers + +Portainer provides pre-configured OAuth provider options or you can set up your own custom OAuth provider. Each of the pre-configured providers can have their configuration overridden if you need to make changes to the Portainer defaults. + +### Microsoft + +Configure your OAuth provider using the table below as a guide. + +| Field/Option | Overview | +| --------------- | ----------------------------------------------------------------------------------------------------------------- | +| Tenant ID | Enter the ID of the Azure Directory you wish to authenticate against. This is also known as the **Directory ID**. | +| Application ID | Enter the public identifier of the OAuth application. | +| Application key | Enter the secret key for the OAuth application. | + +You can find these details using the following steps: + +1. Log in to your Azure Portal as an administrator. + + + +
+2. Click on **Azure Active Directory** and then click on **Overview**. Your **Tenant ID** can be found in the right pane. Use this as the **Tenant ID** in Portainer. + + + +
+3. Still in Azure Active Directory, click on **App Registrations** then click **New registration**. + + + + Enter a friendly name for the Portainer instance. Choose appropriate option for Supported account types, Choose `Web` type for **Redirect URI** and enter the FQDN or IP address that your Portainer instance listens on `eg: https://portainer.example.com:9443`. Then click **Register**. + + + +
+ +
+4. After creating the Registration, the screen below is displayed. Use the provided **Application ID** in the respective field in Portainer. + + + +
+5. Click on **Certificates & secrets** then click **Client secrets**, Click on **New client secret**. Add **Description** and choose Expiry date, then Click **Add.** + + + + The secret will then be generated for you. Use the Value as the **Application key** in the respective field in Portainer. + + + +
+ +
+6. Click on **API Permissions** and **Add a permission**. Select **Microsoft Graph** in the **Request API permissions screen**. Select **Delegated permissions** and add `email, openid, profile` permissions. + +
+7. Optionally, to use **Automatic Team Membership** ability in Portainer, you need create groups claim. Click on **Token Configuration** and **Add groups claim**. Select **Security Groups** and click **Add**. + +
+ +
+ +When you're finished, click **Save settings**. + +### Google + +Configure your OAuth provider using the table below as a guide. + +| Field/Option | Overview | +| ------------- | ----------------------------------------------------- | +| Client ID | Enter the public identifier of the OAuth application. | +| Client secret | Enter the secret key for the OAuth application. | + +
+ +When you're finished, click **Save settings**. + +### Github + +Configure your OAuth provider using the table below as a guide. + +| Field/Option | Overview | +| ------------- | ----------------------------------------------------- | +| Client ID | Enter the public identifier of the OAuth application. | +| Client secret | Enter the secret key for the OAuth application. | + +
+ +When you're finished, click **Save settings**. + +### Custom + +Complete the **OAuth Configuration** section based on the table below. + +| Field/Option | Overview | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Client ID | Enter the public identifier of the OAuth application. | +| Client secret | Enter the token access to the OAuth application. | +| Authorization URL | Enter the URL used to authenticate against the OAuth provider (will redirect users to the OAuth provider login screen). | +| Access token URL | Enter the URL used to exchange a valid OAuth authentication code for an access token. | +| Resource URL | Enter the URL used by Portainer to retrieve information about authenticated users. | +| Redirect URL | Enter the URL used by the OAuth provider to redirect users after they are successfully authenticated (also referred to as the callback URL). You should set this to your Portainer instance URL. | +| Logout URL | Enter the URL used by the OAuth provider to log users out. | +| User identifier | Enter the identifier that Portainer will use to create accounts for authenticated users. Retrieved from the resource server specified in the **Resource URL** field. | +| Scopes | Required by the OAuth provider to retrieve information about authenticated users. See your provider's own documentation for more information. | + +
+ +When you're finished, click **Save settings**. + +## Giving environment access to OAuth teams and users + +See [Managing user access to environments](../../environments/access.md). diff --git a/admin/settings/cloud/README.md b/admin/settings/cloud/README.md new file mode 100644 index 00000000..8e9b07df --- /dev/null +++ b/admin/settings/cloud/README.md @@ -0,0 +1,16 @@ +# Cloud + +In this section you can manage the credentials used with our [KaaS provisioning functionality](../../../start/install/agent/kaas/). + +
+ +To add a new set of credentials, click the **Add credentials** button. Portainer currently supports the following cloud providers: + +* [Civo](civo.md) +* [Linode](linode.md) +* [DigitalOcean](digitalocean.md) +* [Google Cloud](gke.md) +* [Amazon Web Services (AWS)](eks.md) +* [Microsoft Azure](aks.md) + +To remove a set of credentials, check the box next to the credentials to remove and click **Remove**. diff --git a/admin/settings/cloud/aks.md b/admin/settings/cloud/aks.md new file mode 100644 index 00000000..84078970 --- /dev/null +++ b/admin/settings/cloud/aks.md @@ -0,0 +1,37 @@ +# Add Azure credentials + +Before you can add your Azure credentials to Portainer, you will need to retrieve your subscription ID, create an app and retrieve the related tenant ID and client ID, create a client secret and retrieve the value, and set the correct role or permissions on your resource group. + +## Configuring your Azure account + +Log in to the Azure portal. First, click **Subscriptions** and note down your **Subscription ID**. + +Then click the menu in the top left and select **Azure Active Directory**. Click **App registrations** in the left hand menu and select **New Registration**. + +Enter a name for your registration that makes sense to you and leave the other fields as they are. Click **Register** to create the registration. In the app page that appears, note down the **Application (client) ID** and **Directory (tenant) ID**. + +Next click on **Certificates & secrets** in the left hand menu. Click **New client secret** and enter a name for your secret. Select an expiry date for the secret and click **Add**. Copy the **Client Secret (value)** - you don't need the secret ID. + +Now we need to set permissions. Click the menu in the top left, then **Resource Groups** and select your resource group. If you don't already have one, you can create a new one. + +Click on **Access control (IAM)** in the left hand menu then click **Add role assignment**. We recommend selecting the `Contributor` role, but if you want to specify the exact set of permissions they are as follows: + +``` +Microsoft.ContainerService/managedClusters/read +Microsoft.ContainerService/managedClusters/write +Microsoft.Resources/deployments/* +Microsoft.Resources/subscriptions/resourcegroups/read +Microsoft.Resources/subscriptions/resourcegroups/write +Microsoft.Resources/subscriptions/read +Microsoft.ContainerService/managedClusters/listClusterAdminCredential/action +``` + +Once you've chosen your permissions, click **Next**. Click **Select members** then search for the app you registered earlier. Click it, then click **Select** at the bottom of the page. Click **Review + assign**, then **Review + assign** again on the next page. + +## Adding your credentials + +To add credentials for an Azure account, from the [Cloud settings](./) page click **Add credentials**, then select the **Microsoft Azure** option. Enter a **name** for your credentials, then paste your **Subscription ID**, **Tenant ID**, **Client ID** and **Client Secret** into the fields. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on Azure](../../../start/install/agent/kaas/aks.md). diff --git a/admin/settings/cloud/civo.md b/admin/settings/cloud/civo.md new file mode 100644 index 00000000..bb5b719c --- /dev/null +++ b/admin/settings/cloud/civo.md @@ -0,0 +1,17 @@ +# Add Civo credentials + +Before you can add your Civo credentials to Portainer, you will need to retrieve your API token from Civo. + +## Retrieving your API token + +Log into the Civo dashboard and expand the **Settings** menu. Select **Profile**, then the **Security** tab. + +At the top of the page you should see your API key listed. + +## Adding your credentials + +To add credentials for a Civo account, from the [Cloud settings](./) page click **Add credentials**, then select the **Civo** option. Give your credential set a **name** and paste your **API key** into the box. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on Civo](../../../start/install/agent/kaas/civo.md). diff --git a/admin/settings/cloud/digitalocean.md b/admin/settings/cloud/digitalocean.md new file mode 100644 index 00000000..b81b33af --- /dev/null +++ b/admin/settings/cloud/digitalocean.md @@ -0,0 +1,15 @@ +# Add DigitalOcean credentials + +Before you can add your DigitalOcean credentials to Portainer, you will need to create an API token in your DigitalOcean account. + +## Creating your API token + +Log into the DigitalOcean dashboard and select **API** at the bottom left. Click **Generate New Token**, enter a token name and an expiration time, and ensure that both **Read** and **Write** scopes are ticked. + +## Adding your credentials + +To add credentials for a DigitalOcean account, from the [Cloud settings](./) page click **Add credentials**, then select the **DigitalOcean** option. Give your credential set a **name** and paste your **API key** into the box. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on DigitalOcean](../../../start/install/agent/kaas/digitalocean.md). diff --git a/admin/settings/cloud/eks.md b/admin/settings/cloud/eks.md new file mode 100644 index 00000000..2c28fbc8 --- /dev/null +++ b/admin/settings/cloud/eks.md @@ -0,0 +1,139 @@ +# Add AWS credentials + +Before you can add your AWS credentials to Portainer, you will need to configure your IAM account with the necessary access policies and create and retrieve an access key. + +## Configuring access to AWS + +While you can use an existing IAM user to communicate with Portainer, you may want to create a new user for just this purpose. The minimum IAM policies required for Portainer to provision are as follows: + +* `AmazonEC2FullAccess` +* `AWSCloudFormationFullAccess` + +In addition, we require two custom policies, which you should create and assign to your IAM user: + +### EKSFullAccess + +``` +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "eks:*", + "Resource": "*" + }, + { + "Action": [ + "ssm:GetParameter", + "ssm:GetParameters" + ], + "Resource": [ + "arn:aws:ssm:*::parameter/aws/*", + "arn:aws:ssm:*::parameter/aws/*" + ], + "Effect": "Allow" + }, + { + "Action": [ + "kms:CreateGrant", + "kms:DescribeKey" + ], + "Resource": "*", + "Effect": "Allow" + }, + { + "Action": [ + "logs:PutRetentionPolicy" + ], + "Resource": "*", + "Effect": "Allow" + } + ] +} +``` + +### IAMLimitedAccess + +``` +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "iam:CreateInstanceProfile", + "iam:DeleteInstanceProfile", + "iam:GetInstanceProfile", + "iam:RemoveRoleFromInstanceProfile", + "iam:GetRole", + "iam:CreateRole", + "iam:DeleteRole", + "iam:AttachRolePolicy", + "iam:PutRolePolicy", + "iam:ListInstanceProfiles", + "iam:AddRoleToInstanceProfile", + "iam:ListInstanceProfilesForRole", + "iam:PassRole", + "iam:DetachRolePolicy", + "iam:DeleteRolePolicy", + "iam:GetRolePolicy", + "iam:GetOpenIDConnectProvider", + "iam:CreateOpenIDConnectProvider", + "iam:DeleteOpenIDConnectProvider", + "iam:TagOpenIDConnectProvider", + "iam:ListAttachedRolePolicies", + "iam:TagRole", + "iam:GetPolicy", + "iam:CreatePolicy", + "iam:DeletePolicy", + "iam:ListPolicyVersions" + ], + "Resource": [ + "arn:aws:iam:::instance-profile/eksctl-*", + "arn:aws:iam:::role/eksctl-*", + "arn:aws:iam:::policy/eksctl-*", + "arn:aws:iam:::oidc-provider/*", + "arn:aws:iam:::role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup", + "arn:aws:iam:::role/eksctl-managed-*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iam:GetRole" + ], + "Resource": [ + "arn:aws:iam:::role/*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iam:CreateServiceLinkedRole" + ], + "Resource": "*", + "Condition": { + "StringEquals": { + "iam:AWSServiceName": [ + "eks.amazonaws.com", + "eks-nodegroup.amazonaws.com", + "eks-fargate.amazonaws.com" + ] + } + } + } + ] +} +``` + +Once you have your IAM user set up, log in to the AWS portal with the IAM user and in the top right menu - the user's name - select **Security Credentials**. Expand the **Access keys** section and click **Create New Access Key**. + +Copy the **Access key ID** and the **Secret access key** that are generated. + +## Adding your credentials + +To add credentials for an AWS account, from the [Cloud settings](./) page click **Add credentials**, then select the **Amazon Web Services (AWS)** option. Enter a **name** for your credentials, then paste your **access key ID** and and **secret access key** from AWS into the fields. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on AWS](../../../start/install/agent/kaas/eks.md). diff --git a/admin/settings/cloud/gke.md b/admin/settings/cloud/gke.md new file mode 100644 index 00000000..a0ef7cad --- /dev/null +++ b/admin/settings/cloud/gke.md @@ -0,0 +1,19 @@ +# Add Google Cloud credentials + +Before you can add your Google Cloud credentials to Portainer, you will need to configure your account for GKE, set up a service account, and retrieve the private key for that service account. Once this is complete, you can use the private key to set up access. + +## Creating your private key + +Log into the Google Cloud console and go to the dashboard for your project. To confirm GKE is enabled for your project, click on **Kubernetes Engine** in the left hand menu. If the section loads and displays the ability to create a cluster, you're set up already. Otherwise you'll be asked to **enable the Kubernetes Engine API**, which you should do. + +Once this is confirmed, we need to create a service account. From the navigation menu, hover over **IAM & Admin** and click **Service Accounts**, then click **Create Service Account**. Fill in the service account details with a name, ID and description that makes sense to you and click **Create and Continue**. In the **Grant this service account access to project** section, add the`Compute Engine Service Agent` and `Kubernetes Engine Service Agent` roles to the service account and click **Continue**, then click **Done** to create the account. + +Finally, we need to retrieve the private key for the service account. Click on the service account you just created, then select the **Keys** tab and click **Add Key** then **Create new key**. Select **JSON** as the type and click **Create**. This will download a file containing the private key for the service account. + +## Adding your credentials + +To add credentials for a Google Cloud account, from the [Cloud settings](./) page click **Add credentials**, then select the **Google Cloud** option. Give your credential set a **name** and upload the JSON private key for your service account. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on Google Cloud](../../../start/install/agent/kaas/gke.md). diff --git a/admin/settings/cloud/linode.md b/admin/settings/cloud/linode.md new file mode 100644 index 00000000..c3a69620 --- /dev/null +++ b/admin/settings/cloud/linode.md @@ -0,0 +1,15 @@ +# Add Linode credentials + +Before you can add your Linode credentials to Portainer, you will need to create an API token in your Linode account. + +## Creating your API token + +Log into the Linode dashboard and click your account name in the top right. Select **API Tokens**. Click **Create a Personal Access Token**, give it a label and set an expiry. The Portainer provisioning functionality only requires **Read/Write** for the **Kubernetes** option, so disable the rest. + +## Adding your credentials + +To add credentials for a Linode account, from the [Cloud settings](./) page click **Add credentials**, then select the **Linode** option. Give your credential set a **name** and paste your **API key** into the box. + +
+ +When you're ready, click **Add credentials**. Your credentials will now be available to you when [provisioning a Kubernetes cluster on Linode](../../../start/install/agent/kaas/linode.md). diff --git a/admin/settings/edge/README.md b/admin/settings/edge/README.md new file mode 100644 index 00000000..d808a1d5 --- /dev/null +++ b/admin/settings/edge/README.md @@ -0,0 +1,125 @@ +# Edge Compute + +To enable and configure Edge Compute functionality in Portainer, select **Settings** from the menu then select **Edge Compute**. + +{% hint style="info" %} +To learn how to use our Edge Compute functionality, please refer to the [Edge Compute](../../../user/edge/) section of this documentation. +{% endhint %} + +
+ +## Edge Compute settings + +In this section you can add new Edge Devices by clicking Add device. Use the following options to configure and enable Edge Compute functionality within Portainer. + +| Field/Option | Overview | +| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enable Edge Compute features | Toggle this on to enable Edge Compute functionality including Edge Device features. | +| Portainer API server URL |

Enter the default URL and port of your Portainer Server instance as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this.
This value can be overridden when manually deploying an Edge Agent.

| +| Portainer tunnel server address |

Enter the default address and port of your Portainer Server instance's tunnel server as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this.
In most cases, this will be the same address as the Portainer API server URL, but without the protocol and on port 8000.
This value can be overridden when manually deploying an Edge Agent.

| +| Enforce use of Portainer generated Edge ID | Enable this option to require that the Edge ID used by an Edge Agent deployment exist within Portainer's database (in other words, have an environment with the matching ID already created) in order to connect. | + +
+ +When you are done, click **Save Settings**. + +## Deployment sync options + +This section defines options that apply how Edge Agents sync with the Portainer Server instance. + +### Check-in intervals + +| Field/Option | Overview | +| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Edge agent default poll frequency | Select how often Edge Agents check in with the Portainer Server instance. | +| Use Async mode by default | Toggle this on to enable Async mode for Edge Devices. Async mode disables the tunnel between the Edge Device and the Portainer server instance. When Async mode is enabled, individual values can be set for the poll, ping, snapshot frequencies for Edge Devices, and browsing the device is done via snapshots. | + +
+ +### Async Check-in intervals + +The following options will appear when **Use Async mode by default** is enabled above. + +| Field/Option | Overview | +| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| | | +| Edge agent default poll frequency | When Async mode is disabled, use this option to set how often Edge Agents check in with the Portainer Server instance. | +| Edge agent default ping frequency | When Async mode is enabled, use this option to set how often Edge Agents ping back to the Portainer Server instance. | +| Edge agent default snapshot frequency | When Async mode is enabled, use this option to set how often Edge Agents updates the snapshot with the Portainer Server instance. | +| Edge agent default command frequency | When Async mode is enabled, use this option to set how often Edge Agents check with the Portainer Server instance for pending commands. | + +
+ +When you are done, click **Save Settings**. + +## Automatic Edge Environment Creation + +In this section you can configure how automatic Edge environment configuration functions as well as customize and retrieve your Edge agent deployment script, for use when preloading Edge Devices with a Portainer Edge Agent container and configuration. + +| Field/Option | Overview | +| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Disable Edge Environment Waiting Room | Toggle this on to disable the [waiting room](../../../user/edge/waiting-room.md) feature for Edge devices. This will allow any Edge Device that connects to the Portainer instance to automatically associate with Portainer. We recommend leaving this off (the waiting room enabled). | + +
+ +Configure the options and select the platform (Linux or Windows) to generate your Edge agent deployment scripts. + +| Field/Option | Overview | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Edge ID Generator | Provide a one-line script that will be used to generate a unique ID for your Edge devices. For Linux, an example would be using the `uuidgen` command. | +| Nomad Authentication Enabled | If you have selected a Nomad environment, toggle this to enable authentication. | +| Nomad Token | If Nomad authentication is enabled, define the Nomad token to use. | +| TLS | Toggle this on if your Nomad installation uses TLS. | +| Environment variables | Define a comma separated list of environment variables that will be sourced from the Edge device for use in Portainer. | +| Allow self-signed certs | Toggle this to permit the use of self-signed certificates for the communication between the Edge Agent and the Portainer server. | + +
+ +Select the environment of your deployment and click **Copy** to copy the script to your clipboard. + +## Intel OpenAMT + +This section controls the configuration of the [Intel OpenAMT](devices/openamt.md) functionality in Portainer. + +| Field/Option | Overview | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enable OpenAMT | Toggle this option on to enable Portainer's OpenAMT functionality. This can only be enabled when **Enable Edge Compute features** is toggled on, and when on will reveal the below fields. | +| MPS Server | Enter the FQDN or IP address of your MPS server. | +| MPS User | Enter the username used to connect to your MPS server. | +| MPS Password | Enter the password for the MPS User defined above. The password must be between 8 and 32 characters and include at least one upper case letter, at least one lower case letter, at least one base-10 digit and at least one special character. | +| Domain Name | Enter the fully-qualified domain name associated with the provisioning certificate. | +| Provisioning Certificate File (.pfx) |

Click Upload file to upload your PFX-format certificate. The PFX must contain the private key. On AMT 15 based devices you must use SHA2.

Currently supported CAs are Comodo, DigiCert, Entrust and GoDaddy.

| +| Provisioning Certificate Password | Enter the password for the provisioning certificate. The password must be between 8 and 32 characters and include at least one upper case letter, at least one lower case letter, at least one base-10 digit and at least one special character. | + +
+ +When you have finished making changes, click **Save Settings**. + +## FDO + +This section controls the configuration of the [FDO functionality](devices/fdo.md) in Portainer. + +| Field/Option | Overview | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enable FDO Management Service | Toggle this option on to enable Portainer's FDO functionality. This can only be enabled when **Enable Edge Compute features** is toggled on, and when on will reveal the below fields. | +| Owner Service Server | Enter the address and port of your Owner Service Server. | +| Owner Service Username | Enter the username used to connect to your Owner Service Server. | +| Owner Service Password | Enter the password associated with the username above. | + +
+ +When you have finished configuring your FDO setup, click **Save Settings**. + +### Device Profiles + +Here you can add, edit and manage the device profiles available for use during FDO device setup. A device profile consists of a script that is run on the device when first provisioned by the FDO system, and can be used for initial installation and configuration of the device, for example installing Docker and deploying the Portainer Edge Agent. + +
+ +To create a new profile, click **Add Profile**. To edit an existing profile, click the name of the profile you want to edit. You can also check the box next to a profile and click **Duplicate** to create a copy of it, and **Remove** to delete the profile. + +Device profiles consist of a unique name and the contents of the script. Use the **Web editor** to create or edit your script. + +
+ +Once you've finished with your script, click **Save Profile**. diff --git a/admin/settings/edge/devices/README.md b/admin/settings/edge/devices/README.md new file mode 100644 index 00000000..cecbdfc2 --- /dev/null +++ b/admin/settings/edge/devices/README.md @@ -0,0 +1,51 @@ +# Edge Devices + +The Edge Devices feature lets you add, deploy and manage your Edge devices directly from within Portainer. + +{% hint style="info" %} +This functionality requires you to [enable Edge Compute](../) features. +{% endhint %} + +To add a new Edge device, click the **Add Device** button. If you have [enabled FDO](../#fdo) you will be given the option to [provision a bare-metal device using Intel FDO](fdo.md) or to deploy the Edge Agent manually. If FDO is not enabled you will be taken directly to the [manual Edge Agent provision](../../../environments/add/edge.md#adding-an-edge-environment-to-portainer). + +
+ +If you have [enabled and configured OpenAMT](../#intel-openamt), you will also see an option to [Associate with OpenAMT](openamt.md). + +{% content-ref url="fdo.md" %} +[fdo.md](fdo.md) +{% endcontent-ref %} + +{% content-ref url="openamt.md" %} +[openamt.md](openamt.md) +{% endcontent-ref %} + +If you have pre-deployed Edge devices with a [deployment script](../#automatic-edge-environment-creation), you can use the **Waiting room** to check on any pending device connections. + +{% content-ref url="../../../../user/edge/waiting-room.md" %} +[waiting-room.md](../../../../user/edge/waiting-room.md) +{% endcontent-ref %} + +## Browsing your Edge device + +Snapshot browsing allows the ability to run remote commands on your Edge devices that are in Async mode. You can browse your device as well as run commands like start, stop, restart, and delete on your containers, stacks and volumes. + +{% hint style="info" %} +To enable snapshot browsing, async mode by default must be enabled. You can refer to the Edge Compute [instructions](../#deployment-sync-options) for more details on how to do this. +{% endhint %} + +To browse your Edge device, on the [home page](../../../../user/home.md) locate your Edge device and click the **Browse snapshot** button. + +
+ +You will be directed to the dashboard for the Edge device, with a **Browsing snapshot** drop down that details the last updated and next updated date, how often the snapshots are taken and the environment status. You can refer to the [deployment sync options ](../#deployment-sync-options)for more details. + +{% hint style="warning" %} +The information displayed in Portainer for your Edge device is up to date as of the time the latest snapshot (as indicated in the dropdown) was taken. Depending on the [age of the snapshot](../#deployment-sync-options) and the environment, this may not be an up to date representation of the current state of the device, so bear this in mind when taking actions on the device. +{% endhint %} + +
+ +From here, you can browse the device as you would a regular environment. + +
diff --git a/admin/settings/edge/devices/fdo.md b/admin/settings/edge/devices/fdo.md new file mode 100644 index 00000000..bcc15680 --- /dev/null +++ b/admin/settings/edge/devices/fdo.md @@ -0,0 +1,24 @@ +# FDO + +The FIDO Device Onboard (FDO) protocol lets you create and deploy a device profile to remote bare-metal Edge devices, automating the configuration of the physical device to your specifications without any human interaction. Portainer provides the ability to do this from within the Portainer UI. + +## Provision a FDO device + +To add a new FDO device to Portainer you will first need to have [enabled and configured FDO](../#fdo). Once this is done, click **Add Device** and ensure the **Provision bare-metal using Intel FDO** option is selected, then click **Confirm**. + +When provisioning an FDO device you will first need to import a Manufacturer Ownership Voucher. Click the **Upload** button and browse to the voucher on your system to upload. + +Once the voucher is uploaded you will be able to fill in the device details as required. + +| Field/Option | Overview | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Device Name | Enter the name of your device (how you want it to appear in Portainer). | +| Suffix starting number | Enter the first number in the sequence you want to use for this device. This number will be appended to the **Device Name** and incremented for each device if you are provisioning multiple devices at once. | +| Portainer server URL | Enter the URL for the Portainer Server instance that the devices will connect to. This URL must be accessible from the device. | +| Device Profile | Select the [device profile](../#device-profiles) you want to deploy to your device. | +| Group | Select a group to assign this device to. | +| Tags | Select any tags you want to apply to this device. | + +
+ +When you are ready, click **Save Configuration**. diff --git a/admin/settings/edge/devices/openamt.md b/admin/settings/edge/devices/openamt.md new file mode 100644 index 00000000..ff8a74d0 --- /dev/null +++ b/admin/settings/edge/devices/openamt.md @@ -0,0 +1,40 @@ +# OpenAMT + +OpenAMT allows you to remotely manage your compatible Edge devices from Portainer, letting you start, stop, restart and access the device console directly from within the Portainer UI. + +## Preparation + +To associate an Edge device with OpenAMT you must first add a compatible device. To do this, click **Add Device**. If you have Intel FDO enabled you will be asked to select between Provision bare-metal using Intel FDO and Deploy agent manually - make sure you select **Deploy agent manually** and click **Confirm**. + +Next, enter the details for your Edge Agent deployment. This is the same process as setting up a regular Edge Agent, so refer to the [Edge Agent instructions](../../../../start/install/agent/edge.md) for more detail. + +Once the Edge Agent has been set up and deployed on the remote device, you will see it appear in the list of Edge Devices with a green heartbeat icon. + +![](../../../../.gitbook/assets/2.11.1-edge-devices-openamt-list.png) + +The device is now ready to be associated with OpenAMT. + +## Associate your device + +Check the box next to the device you want to associate, then click the **Associate with OpenAMT** button. You will be asked to confirm your association request, click **Confirm** to do so. The activation process will now begin. + +![](../../../../.gitbook/assets/2.11.1-edge-devices-openamt-activating.png) + +Once activation completes you will be returned to the Edge Devices page. If you now expand the listing for your device (by clicking the arrow next to the name) you will see a list of the associated OpenAMT devices. + +![](../../../../.gitbook/assets/2.11.1-edge-devices-openamt-completed.png) + +## Interact with your device + +Once an OpenAMT device has been associated with an Edge Device in Portainer, you are able to interact directly with that device. To do so, go to **Edge Devices** and expand the list of OpenAMT associations for your device by clicking on the arrow next to the device name. + +![](../../../../.gitbook/assets/2.11.1-edge-devices-openamt-completed.png) + +You can perform various actions on the OpenAMT device by clicking the three dots under **Actions** for the association: + +![](../../../../.gitbook/assets/2.11.1-edge-devices-openamt-functions.png) + +* **Power ON**: Will power on the device if it is currently switched off. +* **Power OFF**: Will power off the device if it is currently switched on. +* **Restart**: Will initiate a restart of the device. +* **KVM**: Will open a remote KVM (keyboard, video, mouse) session with the device. diff --git a/admin/users/README.md b/admin/users/README.md new file mode 100644 index 00000000..7a817739 --- /dev/null +++ b/admin/users/README.md @@ -0,0 +1,25 @@ +# Users + +Give access to individual users then manage them as their needs change over time. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="promote.md" %} +[promote.md](promote.md) +{% endcontent-ref %} + +{% content-ref url="password.md" %} +[password.md](password.md) +{% endcontent-ref %} + +Add users to teams then assign them to roles (Business Edition). + +{% content-ref url="teams/" %} +[teams](teams/) +{% endcontent-ref %} + +{% content-ref url="roles.md" %} +[roles.md](roles.md) +{% endcontent-ref %} diff --git a/admin/users/add.md b/admin/users/add.md new file mode 100644 index 00000000..e38e5694 --- /dev/null +++ b/admin/users/add.md @@ -0,0 +1,11 @@ +# Add a new user + +From the menu select **Users**. + +
+ +Enter a username and a strong password (and confirm it). You can also set whether this user is an Administrator as well as add the user to any teams you have created. + +
+ +Once you're ready, click **Create user**. diff --git a/admin/users/password.md b/admin/users/password.md new file mode 100644 index 00000000..ead063cc --- /dev/null +++ b/admin/users/password.md @@ -0,0 +1,9 @@ +# Reset a user's password + +From the menu select **Users** then select the user whose password you want to reset. + +
+ +Enter a new strong password, re-enter the password to confirm it then click **Update password**. + +
diff --git a/admin/users/promote.md b/admin/users/promote.md new file mode 100644 index 00000000..1cdfd1a3 --- /dev/null +++ b/admin/users/promote.md @@ -0,0 +1,9 @@ +# Turn a user into an administrator + +From the menu select **Users** then select the user you want to promote to administrator. + +
+ +Toggle **Administrator** on then click **Save**. + +
diff --git a/admin/users/roles.md b/admin/users/roles.md new file mode 100644 index 00000000..c3de4c48 --- /dev/null +++ b/admin/users/roles.md @@ -0,0 +1,45 @@ +# Roles + +Portainer Business Edition comes with Role-Based Access Control (RBAC) features that refine the access privileges available natively within Portainer. The RBAC feature allows you to create granular user access across all resources and all environments defined within Portainer. + +## The basics + +* A _role_ is a predefined set of privileges. +* _Privileges_ define the rights to perform actions. +* Users are assigned roles, and each role has specific privileges. +* To assign privileges, pair a user or team with a role then associate that pairing with an environment or environment group. +* A single user or team can have different roles for different environments in the Portainer inventory. + +## Built-in roles + +There are several types of roles: + +* **Environment administrator** has full access within a given environment, but cannot make any changes to the infrastructure that underpins an environment (i.e. no host management), nor are they able to make changes to Portainer internal settings. Environment administrators are also unable to change ownership of resources. +* **Operator** has operational control over the resources deployed within a given environment. Operator can update, re-deploy, start and stop containers/services, check logs and console into containers, but cannot create or delete any resources. +* **Helpdesk** has read-only access to the resources deployed within a given environment but cannot make changes to any resource, nor can they open a console to a container or make changes to a container’s volumes. +* **Standard User** has complete control over the resources that a user deploys, or if the user is a member of a team, has complete control over the resources that users of that team deploy. +* **Read-Only User** has read-only access to the resources they are entitled to see (resources created by members of their team, and public resources). + +
+ +The **Administrator** role sits outside of the other roles and effectively acts as a 'Global Admin'. A user assigned to this role has complete control over Portainer settings, and all resources on every environment under Portainer's control. + +{% hint style="info" %} +The **Team Leader** role (which can be defined when [adding a new team](teams/add.md)) is designed for setups that are using internal authentication only, and in a future version the role will be disabled when external authentication is enabled. +{% endhint %} + +## Viewing user access + +Portainer's **Effective access viewer** lets you see what access a user has. From the menu select **Users** then select **Roles**. + +
+ +Select a user from the **User** dropdown. The user's roles and their access on your environments will display. Select **Manage access** on any row to be taken to the [environment's access configuration](../environments/access.md). + +
+ +## Docker vs Kubernetes + +Because Docker does not natively provide role-based access control, we implement our own role management in order to provide this functionality. On a Kubernetes environment, we leverage the RBAC functionality built into Kubernetes alongside our own role management to provide security and flexibility to roles and access. + +For more information about how we map Portainer roles to Kubernetes roles, see our [roles and bindings documentation](../../advanced/kubernetes-roles-and-bindings.md). diff --git a/admin/users/teams/README.md b/admin/users/teams/README.md new file mode 100644 index 00000000..7707d664 --- /dev/null +++ b/admin/users/teams/README.md @@ -0,0 +1,12 @@ +# Teams + +Use teams to control user access to environments, container and service enablement, and volume control. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="add-user.md" %} +[add-user.md](add-user.md) +{% endcontent-ref %} + diff --git a/admin/users/teams/add-user.md b/admin/users/teams/add-user.md new file mode 100644 index 00000000..81583702 --- /dev/null +++ b/admin/users/teams/add-user.md @@ -0,0 +1,9 @@ +# Add a user to a team + +From the menu select **Users** then select **Teams**. + +
+ +Select the team you want to add users to then click **Add** next to the user. + +
diff --git a/admin/users/teams/add.md b/admin/users/teams/add.md new file mode 100644 index 00000000..496cd2cd --- /dev/null +++ b/admin/users/teams/add.md @@ -0,0 +1,15 @@ +# Add a new team + +From the menu select **Users** then select **Teams**. + +
+ +Enter the name of the team and optionally select team leaders. Team leaders can add and remove existing users to and from their team, as well as promote existing team members to co-team leaders. + +{% hint style="warning" %} +If your Portainer installation uses external authentication and teams are synced from your external authentication provider, the team leader role is disabled. +{% endhint %} + +
+ +When you're ready, click **Create team**. diff --git a/advanced/access-control.md b/advanced/access-control.md new file mode 100644 index 00000000..14c288f5 --- /dev/null +++ b/advanced/access-control.md @@ -0,0 +1,78 @@ +# Access control + +All Docker and Docker Swarm resources (except images) deployed through Portainer have access control settings. You can set these when resources are deployed or at a later time. Resources deployed through a stack or a service will inherit the same access as the parent. + +## Resources deployed through Portainer + +### Access to administrators only + +This is an example access control section, showing access control enabled. With these settings, only Portainer administrators will have access to the resource and any other resources created by it (for example, a stack that creates containers, services, volumes, networks and secrets). + +
+ +### Access to all users + +This is an example access control section showing access control disabled. All Portainer users will have access to the resource and any resources created by it. + +
+ +### Access restricted to specific groups or users + +This is an example access control section showing access control enabled in **Restricted** mode. After you select the Restricted option, you can select more teams and users and give them access to the resource. + +
+ +## Resources deployed outside of Portainer + +Any resources deployed to Docker or Docker Swarm outside of Portainer will be marked as `external` and you will have limited control over these resources. By default, these resources will have administrator-only access, but you can enable access control using these labels (examples used, swap out for your own parameters): + +| Label | Access Granted | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| `io.portainer.accesscontrol.public` | All Portainer users have access to the resource. Takes precedence over team/user assignments. | +| `io.portainer.accesscontrol.teams=dev,prod` | Access restricted to teams `dev` and `prod` only. Can be used in conjunction with `io.portainer.accesscontrol.users` | +| `io.portainer.accesscontrol.users=bob,adam` | Access is restricted to users `bob` and `adam` only. Can be used in conjunction with `io.portainer.accesscontrol.teams` | + +### Example 1 + +Deploy a stack using Docker Compose and restrict access to teams `dev` and `prod`: + +``` +version: '3.2' +services: + ltest: + image: busybox:latest + command: "ping localhost" + labels: + io.portainer.accesscontrol.teams: dev,prod +``` + +### Example 2 + +Deploy a stack using the Docker CLI and restrict access to team `testers` and users `bob` and `adam`: + +``` +version: '3.2' +services: + ltest: + image: busybox:latest + command: "ping localhost" + labels: + io.portainer.accesscontrol.teams: testers + io.portainer.accesscontrol.users: bob,adam +``` + +### Example 3 + +Deploy a container using the Docker CLI and make it accessible to all Portainer users: + +``` +docker run -d --label io.portainer.accesscontrol.public nginx:latest +``` + +### Example 4 + +Deploy a container using the Docker CLI and restrict access to teams `dev` and `prod` and users `bob`: + +``` +docker run -d --label io.portainer.accesscontrol.teams=dev,prod --label io.portainer.accesscontrol.users=bob nginx:latest +``` diff --git a/advanced/app-templates/README.md b/advanced/app-templates/README.md new file mode 100644 index 00000000..75a7e4b8 --- /dev/null +++ b/advanced/app-templates/README.md @@ -0,0 +1,12 @@ +# App templates + +You can deploy containers and services using Portainer's set of built-in app templates, or replace them with your own set of templates. + +{% content-ref url="build.md" %} +[build.md](build.md) +{% endcontent-ref %} + +{% content-ref url="format.md" %} +[format.md](format.md) +{% endcontent-ref %} + diff --git a/advanced/app-templates/build.md b/advanced/app-templates/build.md new file mode 100644 index 00000000..efeb0380 --- /dev/null +++ b/advanced/app-templates/build.md @@ -0,0 +1,23 @@ +# Build and host your own app templates + +The best way to do this is to [bind-mount your own template file](../cli.md#defining-your-own-app-templates) directly into the Portainer container. You can also build your own container that will use Nginx to serve the template definitions. + +First, clone the [Portainer templates repository](https://github.com/portainer/templates), edit the templates file, then build and run the container: + +``` +git clone https://github.com/portainer/templates.git portainer-templates +cd portainer-templates +# Edit the file templates.json +docker build -t portainer-templates . +docker run -d -p "8080:80" portainer-templates +``` + +Access your template definitions at `http://docker-host:8080/templates.json`. + +You can also mount the `templates.json` file inside the container, so you can edit the file and see live changes: + +``` +docker run -d -p "8080:80" -v "${PWD}/templates.json:/usr/share/nginx/html/templates.json" portainer-templates +``` + +For more information about the format of the app template, go [here](format.md). diff --git a/advanced/app-templates/format.md b/advanced/app-templates/format.md new file mode 100644 index 00000000..2a4084ce --- /dev/null +++ b/advanced/app-templates/format.md @@ -0,0 +1,524 @@ +# App template JSON format + +App template definitions are written in JSON. Valid templates consist of an array, and every template definition consists of one element. + +## Container template definition format + +A container template element must be a valid JSON object, composed of both mandatory and optional data fields. Here's an example of the format: + +``` +{ + "version": "2", + "templates": [ + { + // template1 + }, + { + // template2 + }, + ... + ] +} +``` + +### type + +* **Description:** The template type. +* **Format:** Integer +* **Valid values:** `1` = container; `2` = Swarm stack; `3` = Compose stack +* **Required/Optional:** Required +* **Other information:** Type `3` is limited to using the version `"2"` stack format (this is a docker/libcompose limitation). + +### title + +* **Description:** The template title. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Required + +### description + +* **Description:** The template description. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Required + +### image + +* **Description:** The Docker image associated with a template. +* **Format:** String +* **Valid values:** Any valid URL. +* **Required/Optional:** Required + +### administrator-only + +* **Description:** Indicates whether or not a template should be available just to admin users. +* **Format:** Boolean +* **Valid values:** `true` = available to admins only; `false` = available to all users +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "administrator-only": true +} +``` + +### name + +* **Description:** The default name of a template (shows in the Portainer UI). +* **Format:** String +* **Valid values:** Any valid string. +* **Required/Optional:** Optional + +### logo + +* **Description:** The template logo. +* **Format:** String +* **Valid values:** Any valid URL. +* **Required/Optional:** Optional + +### registry + +* **Description:** The registry where the Docker image is stored. If not specified, Portainer will use Docker Hub as the default. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Optional + +### command + +* **Description:** The command to run in the container. If not specified, the container will use the default command in its Dockerfile. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "command": "/bin/bash -c \"echo hello\" && exit 777" +} +``` + +### env + +* **Description:** A JSON array describing the environment variables required by a template. Each element in the array must be a valid JSON object. An input will be generated in the templates view for each element in the array. Depending on the object properties, different types of inputs can be generated (text input, select). +* **Format:** Array +* **Required/Optional:** Optional + +Array format: + +``` +{ + "name": "the name of the environment variable, as supported in the container image (mandatory)", + "label": "label for the input in the UI (mandatory unless set is present)", + "description": "a short description for this input, will be available as a tooltip in the UI (optional)", + "default": "default value associated to the variable (optional)", + "preset": "boolean. If set to true, the UI will not generate an input (optional)", + "select": "an array of possible values, will generate a select input (optional)" +} +``` + +Example: + +``` +{ + "env": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "label": "Root password", + "description": "Password used by the root user." + }, + { + "name": "ENV_VAR_WITH_DEFAULT_VALUE", + "default": "default_value", + "preset": true + }, + { + "name": "ENV_VAR_WITH_SELECT_VALUE", + "label": "An environment variable", + "description": "A description for this env var", + "select": [ + { + "text": "Yes, I agree", + "value": "Y", + "default": true + }, + { + "text": "No, I disagree", + "value": "N" + }, + { + "text": "Maybe", + "value": "YN" + } + ], + "description": "Some environment variable." + } + ] +} +``` + +### network + +* **Description:** A string that corresponds to the name of an existing Docker network. Will auto-select the network in the templates view. +* **Format:** String +* **Valid values:** Any string value. If the string does not match an existing network name when the template is used it will fall back to the first available network. +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "network": "host" +} +``` + +### volumes + +* **Description:** A JSON array describing the volumes associated with a template. Each element in the array must be a valid JSON object with a required container property. For each element in the array, a Docker volume will be created and associated when starting the container. If a `bind` property is defined, it will be used as the source of a bind mount. If a `readonly` property is is defined and = true, the volume will be mounted in `readonly` mode. +* **Format:** Array +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "volumes": [ + { + "container": "/etc/nginx" + }, + { + "container": "/usr/share/nginx/html", + "bind": "/var/www", + "readonly": true + } + ] +} +``` + +### ports + +* **Description:** A JSON array describing the ports exposed by a template. Each element in the array must be a valid JSON string specifying the port number in the container, as well as the protocol. Can be optionally prefixed with a port number and colon (for example `8080:`) to define the port to be mapped on the host. If the host port is not specified, the Docker host will automatically assign it when starting the container. +* **Format:** Array +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "ports": ["8080:80/tcp", "443/tcp"] +} +``` + +### labels + +* **Description:** A JSON array describing the labels associated with a template. Each element in the array must be a valid JSON object with two properties (`name:` and `""`). +* **Format:** Array +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "labels": [ + { "name": "com.example.vendor", "value": "Acme" }, + { "name": "com.example.license", "value": "GPL" }, + { "name": "com.example.version", "value": "1.0" } + ] +} +``` + +### privileged + +* **Description:** Indicates whether or not the container should be started in `privileged` mode. Defaults to `false` if not specified. +* **Format:** Boolean +* **Valid values:** `true` = start the container in privileged mode; `false` = do not start the container in privileged mode +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "privileged": true +} +``` + +### interactive + +* **Description:** Indicates whether or not the container should be started in `foreground` mode. Defaults to `false` if not specified. +* **Format:** Boolean +* **Valid values:** `true` = start the container in foreground mode; `false` = do not start the container in foreground mode +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "interactive": true +} +``` + +### restart\_policy + +* **Description:** The restart policy associated with the container. Will default to `"always"` if no value is specified. +* **Format:** String +* **Valid values:** + * `"always"` Always restart the container regardless of the exit status. + * `"no"` Never automatically restart the container. + * `"on-failure"` Restart the container only if it exits with a non-zero status. + * `"unless-stopped"` Always restart the container regardless of the exit status (unless the container was manually stopped). +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "restart_policy": "unless-stopped" +} +``` + +### hostname + +* **Description:** The hostname of the container. Will default to Docker if not specified. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "hostname": "mycontainername" +} +``` + +### note + +* **Description:** Extra information about a template, for example what it is used for. Displayed inside the template-creation form in the Portainer UI. Supports HTML. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "note": "You can use this field to record extra information about a template." +} +``` + +### platform + +* **Description:** The supported platform. Displays a small platform-related icon in the Portainer UI. Must contain a valid value. +* **Format:** String +* **Valid values:** `"linux"`; `"windows"` +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "platform": "linux" +} +``` + +### categories + +* **Description:** An array of categories associated with a template. Populates the category filter in the Portainer UI. +* **Format:** Array +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "categories": ["webserver", "open-source"] +} +``` + +## Stack template definition format + +A stack template element must be a valid JSON object, composed of mandatory and optional data fields. Here's an example of the format: + +``` +{ + "type": 2, + "title": "CockroachDB", + "description": "CockroachDB cluster", + "note": "Deploys an insecure CockroachDB cluster, please refer to CockroachDB documentation for production deployments.", + "categories": ["database"], + "platform": "linux", + "logo": "https://cloudinovasi.id/assets/img/logos/cockroachdb.png", + "repository": { + "url": "https://github.com/portainer/templates", + "stackfile": "stacks/cockroachdb/docker-stack.yml" + } +} +``` + +### type + +* **Description:** The template type. A Swarm stack will be deployed using the equivalent of `docker stack deploy`. A Compose stack will be deployed using the equivalent of `docker-compose.` +* **Format:** Integer +* **Valid values:** `1` = container; `2` = Swarm stack; `3` = Compose stack +* **Required/Optional:** Required +* **Other information:** Type `3` is limited to using the version `"2"` stack format (this is a docker/libcompose limitation). + +### title + +* **Description:** The template title. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Required + +### description + +* **Description:** The template description. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Required + +### repository + +* **Description:** A JSON object describing the public Git repository from where the stack template will be loaded. It indicates the URL of the Git repository as well as the path to the Compose file inside the repository. +* **Format:** Object +* **Valid values:** See the example below. +* **Required/Optional:** Required + +{% hint style="warning" %} +This value **must** reference a Git repository. +{% endhint %} + +Object format: + +``` +{ + "url": "URL of the public git repository (mandatory)", + "stackfile": "Path to the Compose file inside the repository (mandatory)", +} +``` + +Example: + +``` +{ + "url": "https://github.com/portainer/templates", + "stackfile": "stacks/cockroachdb/docker-stack.yml" +} +``` + +### administrator\_only + +* **Description:** Indicates whether or not a template should be available just to admin users. +* **Format:** Boolean +* **Valid values:** `true` = available to admins only; `false` = available to all users +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "administrator_only": true +} +``` + +### name + +* **Description:** The default name of a template (shows in the Portainer UI). +* **Format:** String +* **Valid values:** Any valid string. +* **Required/Optional:** Optional + +### logo + +* **Description:** The template logo. +* **Format:** String +* **Valid values:** Any valid URL. +* **Required/Optional:** Optional + +### env + +* **Description:** A JSON array describing the environment variables required by a template. Each element in the array must be a valid JSON object. An input will be generated in the templates view for each element in the array. Depending on the object properties, different types of inputs can be generated (text input, select). +* **Format:** Array +* **Required/Optional:** Optional + +An input will be generated in the templates view for each element in the array. Depending on the object properties, different types of inputs can be generated (text input, select). + +Array format: + +``` +{ + "name": "the name of the environment variable, as supported in the container image (mandatory)", + "label": "label for the input in the UI (mandatory unless set is present)", + "description": "a short description for this input, will be available as a tooltip in the UI (optional)", + "default": "default value associated to the variable (optional)", + "preset": "boolean. If set to true, the UI will not generate an input (optional)", + "select": "an array of possible values, will generate a select input (optional)" +} +``` + +Example: + +``` +{ + "env": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "label": "Root password", + "description": "Password used by the root user." + }, + { + "name": "ENV_VAR_WITH_DEFAULT_VALUE", + "default": "default_value", + "preset": true + }, + { + "name": "ENV_VAR_WITH_SELECT_VALUE", + "label": "An environment variable", + "description": "A description for this env var", + "select": [ + { + "text": "Yes, I agree", + "value": "Y", + "default": true + }, + { + "text": "No, I disagree", + "value": "N" + }, + { + "text": "Maybe", + "value": "YN" + } + ], + "description": "Some environment variable." + } + ] +} +``` + +### note + +* **Description:** Extra information about a template, for example what it is used for. Displayed inside the template-creation form in the Portainer UI. Supports HTML. +* **Format:** String +* **Valid values:** Any string value. +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "note": "You can use this field to record extra information about a template." +} +``` + +### platform + +* **Description:** The supported platform. Displays a small platform-related icon in the Portainer UI. Must contain a valid value. +* **Format:** String +* **Valid values:** `"linux"`; `"windows"` +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ "platform": "linux" } +``` + +### categories + +* **Description:** An array of categories associated with a template. Populates the category filter in the Portainer UI. +* **Format:** Array +* **Required/Optional:** Optional +* **Example:** See below. + +``` +{ + "categories": ["webserver", "open-source"] +``` diff --git a/advanced/cli.md b/advanced/cli.md new file mode 100644 index 00000000..be6bcbb2 --- /dev/null +++ b/advanced/cli.md @@ -0,0 +1,219 @@ +# CLI configuration options + +## Configuration flags available at the command line + +| Flag | Description | +| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--admin-password` | Specifies a bcrypt hashed password for the admin user. | +| `--admin-password-file` | Specifies the path to the file containing the password for the admin user. | +|

--bind

-p

| Specifies the address and port from which to serve Portainer (default: `:9443`). | +| `--bind-https` | Specifies the address and port from which to serve Portainer via HTTPS (default: `:9443`). | +|

--data

-d

| Specifes the directory where Portainer data will be stored (default: `/data` on Linux, `C:\data` on Windows). | +| `--edge-compute` | Automatically enables Edge Compute features. | +|

--hide-label

-l

| Hides containers with a specific label in the UI. | +| `--http-disabled` | Serve Portainer only on HTTPS. Overrides `--http-enabled`. Ensure your HTTPS configuration is fully working and any agents are configured for HTTPS before enabling this. | +| `--http-enabled` | Serve Portainer on HTTP. If used in combination with `--http-disabled`, this is ignored. | +|

--host

-H

| Specifies the Docker daemon endpoint. | +| `--license-key` | Specifies the license key to use. Only applicable to Portainer Business Edition. | +| `--logo` | Specifies the URL to the image to be displayed as a logo in the UI. If not specified, the Portainer logo is used instead. | +| `--snapshot-interval` | Specifies the time interval between two environment snapshot jobs expressed as a string. For example 30s, 5m, 1h… Supported by the `time.ParseDuration` method (default: 5m). | +| `--sslcacert` | Specifies the path to the certificate authority (CA) certificate used to secure the Portainer instance. | +| `--sslcert` | Specifies the path to the SSL certificate used to secure the Portainer instance (default: `/certs/portainer.crt` on Linux, `C:\certs\portainer.crt` on Windows). | +| `--sslkey` | Specifies the path to the SSL key used to secure the Portainer instance (default: `/certs/portainer.key` on Linux, `C:\certs\portainer.key` on Windows). | +|

--templates

-t

| Specifies the URL to the templates (apps) definitions. | +| `--tlscacert` | Specifies the path to the CA used for Docker daemon connections (default: `/certs/ca.pem` on Linux, `C:\certs\ca.pem` on Windows). | +| `--tlscert` | Specifies the path to the TLS certificate file used for Docker daemon connections (default: `/certs/cert.pem`, `C:\certs\cert.pem` on Windows). | +| `--tlskey` | Specifies the path to the TLS key used for Docker daemon connections (default: `/certs/key.pem`, `C:\certs\key.pem` on Windows). | +| `--tlsverify` | TLS support (default: `false`). | +| `--tlsskipverify` | Disable TLS server verification. | +| `--tunnel-addr` | Specifies the tunnel address to listen on for use with the Edge Agent. Defaults to `0.0.0.0` (all interfaces). | +| `--tunnel-port` | Specifies an alternate tunnel port to use with the Edge Agent. Use `--tunnel-port 8001` with `-p 8001:8001` to make the Edge Agent communicate on port `8001`. | +| `--version` | Display the version of Portainer. | + +## Creating an admin account and password + +{% hint style="info" %} +The commands in this section will automatically create an administrator account called `admin` with the password you specify. +{% endhint %} + +### Method 1: Creating the account from the command line + +You can specify a bcrypt-encrypted password from the command line for the admin account. If you have installed the `apache2-utils` package, create the password using the following command: + +``` +htpasswd -nb -B admin "your-password" | cut -d ":" -f 2 +``` + +If your system does not have that command, use a container to run the command instead: + +``` +docker run --rm httpd:2.4-alpine htpasswd -nbB admin "your-password" | cut -d ":" -f 2 +``` + +Once the password has been created, specify the admin password from the command line by starting Portainer with the `--admin-password` flag: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ee:latest --admin-password='$2y$05$8oz75U8m5tI/xT4P0NbSHeE7WyRzOWKRBprfGotwDkhBOGP/u802u' +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce:latest --admin-password='$2y$05$8oz75U8m5tI/xT4P0NbSHeE7WyRzOWKRBprfGotwDkhBOGP/u802u' +``` +{% endtab %} +{% endtabs %} + +### Method 2: Creating the account using a file + +You can also store a plain text password inside a file and use the `--admin-password-file` flag. First, add the password to a file using the following example command as a guide: + +``` +echo -n mypassword > /tmp/portainer_password +``` + +Next, start the Portainer container: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/portainer_password:/tmp/portainer_password portainer/portainer-ee:latest --admin-password-file /tmp/portainer_password +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/portainer_password:/tmp/portainer_password portainer/portainer-ce:latest --admin-password-file /tmp/portainer_password +``` +{% endtab %} +{% endtabs %} + +This also works well with Docker Swarm and Docker Secrets: + +``` +echo -n mypassword | docker secret create portainer-pass - +``` + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker service create \ + --name portainer \ + --secret portainer-pass \ + --publish 9443:9443 \ + --publish 8000:8000 \ + --replicas=1 \ + --constraint 'node.role == manager' \ + --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ + portainer/portainer-ee:latest \ + --admin-password-file '/run/secrets/portainer-pass' \ + -H unix:///var/run/docker.sock +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker service create \ + --name portainer \ + --secret portainer-pass \ + --publish 9443:9443 \ + --publish 8000:8000 \ + --replicas=1 \ + --constraint 'node.role == manager' \ + --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ + portainer/portainer-ce:latest \ + --admin-password-file '/run/secrets/portainer-pass' \ + -H unix:///var/run/docker.sock +``` +{% endtab %} +{% endtabs %} + +## Hiding specific containers + +Portainer lets you hide containers with a specific label by using the `-l` flag. Here's an example showing a container labeled `owner=acme`: + +``` +docker run -d --label owner=acme nginx +``` + +To hide this container, when starting Portainer add the `-l owner=acme` option on the CLI: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ee:latest -l owner=acme +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce:latest -l owner=acme +``` +{% endtab %} +{% endtabs %} + +To hide multiple containers, repeat the `-l` flag: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ee:latest -l owner=acme -l service=secret +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce:latest -l owner=acme -l service=secret +``` +{% endtab %} +{% endtabs %} + +## Using your own logo + +{% hint style="info" %} +Images must be exactly 155px by 55px in size. +{% endhint %} + +Replace our logo with your own using the `--logo` flag to specify the location of the image file: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ee:latest --logo "https://www.docker.com/sites/all/themes/docker/assets/images/brand-full.svg" +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce:latest --logo "https://www.docker.com/sites/all/themes/docker/assets/images/brand-full.svg" +``` +{% endtab %} +{% endtabs %} + +You can also update the logo in the Portainer UI (**Settings** menu). + +## Defining your own app templates + +{% hint style="info" %} +We suggest hosting template files on [GitHub](https://www.github.com/) so Portainer can access them without authentication. +{% endhint %} + +Portainer allows you to rapidly [deploy containers using app templates](../user/docker/templates/deploy-container.md). By default, Portainer templates will be used but you can also define your own. + +Templates are loaded once when Portainer is first started. If you already deployed a Portainer instance then decide to use your own templates, you’ll need to clear the default templates either in the user interface or through the HTTP API. Use the `--templates` flag to specify a URL where the template file can be accessed via HTTP. + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ee:latest --templates http://my-host.my-domain/templates.json +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce:latest --templates http://my-host.my-domain/templates.json +``` +{% endtab %} +{% endtabs %} diff --git a/advanced/db-encryption.md b/advanced/db-encryption.md new file mode 100644 index 00000000..e1bd0285 --- /dev/null +++ b/advanced/db-encryption.md @@ -0,0 +1,168 @@ +# Encrypting the Portainer database + +Portainer uses a BoltDB database to store the configuration, kept in the `portainer_data` volume created during installation. This database can be encrypted for additional security through the use of a secret provided when the Portainer Server is started. Encryption can be added during the initial installation or at a later date. + +{% hint style="warning" %} +At present, encryption of the database is not reversible. +{% endhint %} + +## Docker Standalone + +To enable encryption on Docker Standalone, you will first need to create a secret key, then modify your docker run command to mount the secret in the container. + +### Create a secret + +Create a text file on the system running Docker Standalone that is accessible to the Docker executable, yet somewhere secure. For this example, we'll assume the file is called `/root/secrets/portainer_key`. In this file enter a secret. This will be the key used to encrypt the Portainer database. + +### Mount the secret + +If Portainer is already running, you will need to stop and remove the Portainer container before continuing: + +``` +docker stop portainer +docker rm portainer +``` + +To encrypt the database, add a bind mount to the `docker run` command that mounts your secret in `/run/secrets/portainer`: + +``` +-v /root/secrets/portainer_key:/run/secrets/portainer +``` + +Your final `docker run` command may look like this: + +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer \ + --restart=always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + -v /root/secrets/portainer_key:/run/secrets/portainer \ + portainer/portainer-ee:latest +``` + +When the Portainer container starts, it will encrypt any existing database, or for a fresh install will create a new encrypted database as part of the install process. + +## Docker Swarm + +To enable encryption on Docker Swarm, you will first need to create a secret. You will then either update the service to incorporate the new secret (if you have an existing Portainer installation) or edit the compose file used to create the stack to include the secret (if this is a fresh installation of Portainer). + +### Create a secret + +On a manager node, you can run the following command to create a secret: + +``` +echo "This is a secret" | docker secret create portainer_key - +``` + +Replace `This is a secret` with your secret. This will create a secret named `portainer_key`, which will be the key used to encrypt the Portainer database. + +{% hint style="info" %} +You can also create a secret in Portainer if you are adding encryption to an existing installation. +{% endhint %} + +### Existing installations: Update the service + +To add encryption to an existing Portainer deployment on Docker Swarm, you can use the following command on a manager node: + +``` +docker service update \ + --secret-add src=portainer_key,target="/run/secrets/portainer" \ + portainer +``` + +The service will add the new secret and encrypt the database. + +### New installations: Edit the compose file + +To install Portainer on Docker Swarm with encryption, you will need to edit the compose file you downloaded as part of the installation process. Add a secrets section to the `portainer` service definition: + +``` +secrets: + - portainer_key +``` + +This tells the service to use the `portainer_key` secret created earlier. With the secret added, your full `portainer` service definition may look like this: + +``` + portainer: + image: portainer/portainer-ee:latest + command: -H tcp://tasks.agent:9001 --tlsskipverify + ports: + - "9443:9443" + - "9000:9000" + - "8000:8000" + volumes: + - portainer_data:/data + networks: + - agent_network + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + secrets: + - portainer_key +``` + +Save your changes, then use the compose file to deploy your Portainer installation as covered in the Swarm installation instructions. The database will be deployed encrypted as part of the installation process. + +## Kubernetes + +To enable encryption on Kubernetes you will first need to create a secret. You will then mount this secret as a volume in Portainer. + +### Create a secret + +From the command line on your Kubernetes cluster, you can run the following command to create your secret: + +``` +kubectl create secret generic portainer-key --from-literal=secret=IAmASecretKey +``` + +Replace `IAmASecretKey` with your secret. This will create a secret named `portainer-key`, which will be the key used to encrypt the Portainer database. + +### Modify the YAML file + +Once the secret has been created, we need to modify the YAML file to mount the secret as a volume in Portainer. Download the YAML file for your particular deployment and locate the `container` definition for the `portainer` container. It should look something like this: + +``` +containers: + - name: portainer + image: "portainer/portainer-ee:latest" + imagePullPolicy: Always + args: + volumeMounts: + - name: data + mountPath: /data +``` + +In the `volumeMounts` section, add a definition for the secret created earlier: + +``` +volumeMounts: + - name: data + mountPath: /data + - name: portainer-key + mountPath: /run/secrets/portainer +``` + +We also need to add a definition to the `volumes` definition for the `spec`: + +``` +spec: + containers: + portainer: + ... + volumes: + - name: portainer-key + secret: + secret_name: portainer-key + +``` + +Save the file, then apply it to your running configuration: + +``` +kubectl apply -f portainer.yaml +``` + +Replace `portainer.yaml` with the name of your modified YAML file. diff --git a/advanced/deprecated.md b/advanced/deprecated.md new file mode 100644 index 00000000..fcf7a1c5 --- /dev/null +++ b/advanced/deprecated.md @@ -0,0 +1,14 @@ +# Deprecated and removed features + +This table lists deprecated and removed features and functionality that are no longer supported and should not be used. The **Deprecated** column shows the release in which the feature was tagged as deprecated. The **Remove** column shows the release in which the feature was or will be removed (TBD means 'to be decided'). + +| Feature | Deprecated | Remove | +| -------------------------------------------------------------------------------- | ---------- | ------ | +| Enabling SSL via `--ssl` (now enabled by default) | 2.9.0 | TBD | +| Disabling analytics via `--no-analytics` | 2.0 | TBD | +| Kompose deployments | 2.15.0 | 2.17.0 | +| Specifying external environments in JSON via `--external-endpoints` | | 2.0 | +| Setting time between environment synchronization requests via `--sync-interval` | | 2.0 | +| Disabling Portainer internal authentication via `--no-auth` | | 2.0 | +| Specifying a templates file to load on first run via `--templates-file` | | 2.0 | +| Preventing Portainer from running a snapshot of environments via `--no-snapshot` | | 2.0 | diff --git a/advanced/edge-agent.md b/advanced/edge-agent.md new file mode 100644 index 00000000..523d937c --- /dev/null +++ b/advanced/edge-agent.md @@ -0,0 +1,72 @@ +# The Portainer Edge Agent + +## The back story + + For standard deployments, we used to assume that the Portainer instance and any environments shared the same network and could communicate seamlessly. If remote environments were on a different network (say, across the Internet) we could not manage them. + +Then we changed the Edge agent architecture so only the environments need to access Portainer. There is now no need to expose the Portainer agents to the Internet. + +Portainer now requires that only the `9000` and `8000` TCP ports are exposed. We used to serve the UI and the Portainer API from port `9000`, but we extended the API to allow the remote agents to poll for instructions. Port `8000` is a TLS tunnel server used to create a secure tunnel between the agent and the Portainer instance. More about that soon. + +{% hint style="warning" %} +If your Portainer instance is deployed with TLS, the agent will use HTTPS for the connection it makes back to Portainer. However, if your Portainer instance uses a self-signed certificate, the Edge Agent must be deployed with the `-e EDGE_INSECURE_POLL=1` flag. If you do not deploy the Edge Agent with this flag, the agent won't be able to communicate with the Portainer instance. +{% endhint %} + +## Creating an Edge Agent in Portainer + + When you create an Edge Agent, you are first asked for a human-friendly endpoint name. You are then asked to confirm the FQDN:PORT of your Portainer instance. This is what agents will use to connect, so make sure it’s correct and that the DNS resolves. + +During the creation process, an Edge ID is dynamically generated. This is a random UUID which is assigned to each environment. You can see it in the command syntax which is provided during the setup process. + +
+ + The Edge ID and the join token are unique per environment. The join token is made up of the following encoded data: + +* The Portainer instance API URL. This is how the Edge Agent knows how to ‘call home’ to your Portainer instance. +* The Portainer instance reverse tunnel server address. This is identical to the API URL but with the SSH tunnel server port (`8000` is the default). +* The environment identifier key (endpoint ID). +* The Portainer instance reverse-tunnel server fingerprint (prevents MITM when creating a tunnel). + +Use the command syntax to deploy an Edge Agent across your remote node or remote swarm cluster. + +## How Portainer and the Edge Agent communicate + +### Polling + + Agents poll the Portainer instance every 5 seconds by default (this is defined in Portainer settings). + +### Connection process and checks + +The agent says to Portainer, “Hi, I'm an agent. My join token is `abc123`. Do you need me right now?”. Portainer checks its database to ensure the Edge UUID and the join token match. If no UUID can be associated with the join token provided, Portainer will associate the UUID provided by the agent to the environment’s join token. + +If the UUID/join token do not match, the connection is rejected. If the UUID/join token match, the Portainer instance responds with either: "No, I don’t need you. Please check in again in X seconds." (where X is the agent polling frequency), or "Yes, I do need you. Please connect using these tunnel credentials.”. + +{% hint style="info" %} +Portainer encrypts the tunnel credentials using the Edge UUID as the encryption key (intended as one-time-use credentials). +{% endhint %} + +### Opening a tunnel between the agent and Portainer + +Once confirmation is received, the Edge Agent decrypts the credentials and opens a tunnel on port `8000` to the Portainer instance. If a remote environment is a swarm cluster, every node will run an instance of the agent (and every instance will poll Portainer). The 'you are required' flag causes the first agent in the cluster to establish the tunnel. Once in place, Portainer can then query the agent where the tunnel is open. If the tunnel closes for any reason, the agent will immediately re-establish it. + +### When Portainer forces the Edge Agent to establish a tunnel + +Sometimes Portainer will ask the agent to establish a tunnel. This happens when an admin selects an Edge environment for interactive management via the Portainer UI or the API. Once selected, the 'you are required' flag triggers the connection process. If default settings are in use, it takes about 10 seconds for the agent to poll and establish a tunnel. That’s about 5 seconds wait time until polling then a few seconds for the tunnel to open. The admin is shown this message while this happens: + +![](../.gitbook/assets/edge-advanced-2.png) + +### Terminating the connection + +The agent keeps a record of when Portainer last communicated with it. After 5 minutes of inactivity, it sends a snapshot of the current config to Portainer for its records, closes the tunnel and revokes the credentials. When admins have an active session with an Edge environment, ‘keep alives’ are sent every minute (even if the admin is not performing a task) so they are not kicked out by mistake. + +## Network performance + +### Adjusting the polling frequency to improve performance + +Thousands of endpoints polling Portainer every 5 seconds is a lot. That’s about 324b/second per agent, not per environment. If you don’t do a lot of environment admin, we suggest you go into Portainer settings and increase the polling frequency. Simply change it back when you need to do some admin so you are not kept waiting. + +
+ +### Ongoing improvements + +We load-tested Portainer with 15,000 actively connected environments with a polling frequency of 5 seconds. This generated 7Mbps of network traffic to the Portainer instance, and Portainer needed 4 CPUs to handle the encryption/tunnel load. This Edge Agent release is our first attempt at massive-scale centralized management. Our end goal is to reduce the network overhead associated with polling. diff --git a/advanced/helm-chart-configuration-options.md b/advanced/helm-chart-configuration-options.md new file mode 100644 index 00000000..330198f0 --- /dev/null +++ b/advanced/helm-chart-configuration-options.md @@ -0,0 +1,34 @@ +# Helm chart configuration options + +The following table lists the configurable parameters of the Portainer Helm chart and their default values. Find the values file under `deploy/helm/portainer/values.yaml`. + +| Parameter | Description | Default | +| ---------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------- | +| `replicaCount` | Number of Portainer service replicas (always set to 1). | `1` | +| `image.repository` | Portainer Docker Hub repository. | `portainer/portainer-ce` | +| `image.tag` | Tag for the Portainer image. | `latest` | +| `image.pullPolicy` | Portainer image-pulling policy. | `IfNotPresent` | +| `imagePullSecrets` | If the Portainer image needs to be in a private repository. | `nil` | +| `nodeSelector` | Used to apply a nodeSelector to the deployment. | `{}` | +| `serviceAccount.annotations` | Annotations to add to the service account. | `null` | +| `serviceAccount.name` | The name of the service account to use. | `portainer-sa-clusteradmin` | +| `service.type` | Service type for the main Portainer Service. Valid values: `ClusterIP`, `NodePort`, `LoadBalancer`. | `LoadBalancer` | +| `service.httpPort` | HTTP port for accessing the Portainer web interface. | `9000` | +| `service.httpNodePort` | Static NodePort for accessing the Portainer web interface. Specify only if the type is `NodePort`. | `30777` | +| `service.edgePort` | TCP port for accessing Portainer Edge. | `8000` | +| `service.edgeNodePort` | Static NodePort for accessing Portainer Edge. Specify only if the type is `NodePort`. | `30776` | +| `service.annotations` | Annotations to add to the service. | `{}` | +| `ingress.enabled` | Creates an ingress for Portainer. | `false` | +| `ingress.annotations` |

Annotations to add to the ingress. For example:
kubernetes.io/ingress.class: nginx

| `{}` | +| `ingress.hosts.host` | URL for Portainer Web. For example, `portainer.example.io`. | `nil` | +| `ingress.hosts.paths.path` | Path for the Portainer web interface. | `/` | +| `ingress.hosts.paths.port` | Port for the Portainer web interface. | `9000` | +| `ingress.tls` | TLS support on ingress. Must create a secret with TLS certificates in advance. | `[]` | +| `resources` | Portainer resource requests and limits. | `{}` | +| `persistence.enabled` | Whether or not to enable data persistence. | `true` | +| `persistence.existingClaim` | Name of an existing PVC to use for data persistence. | `nil` | +| `persistence.size` | Size of the PVC used for persistence. | `10Gi` | +| `persistence.annotations` | Annotations to apply to PVC used for persistence. | `{}` | +| `persistence.storageClass` | StorageClass to apply to PVC used for persistence. | `default` | +| `persistence.accessMode` | AccessMode for persistence. | `ReadWriteOnce` | +| `persistence.selector` | Selector for persistence. | `nil` | diff --git a/advanced/kubernetes-roles-and-bindings.md b/advanced/kubernetes-roles-and-bindings.md new file mode 100644 index 00000000..950c2442 --- /dev/null +++ b/advanced/kubernetes-roles-and-bindings.md @@ -0,0 +1,119 @@ +# Kubernetes roles and bindings + +{% hint style="info" %} +Role-Based Access Control is only available in Portainer Business Edition. +{% endhint %} + +When managing a Kubernetes environment with Portainer, the Role-Based Access Control (RBAC) configuration is based on two components: + +* Kubernetes' cluster roles and namespace roles (which restrict access to Kubernetes itself) +* Portainer's authorization flags (which [restrict access](kubernetes-roles-and-bindings.md#portainer-access-restrictions) to Portainer's functionality) + +The following tables provide a reference for how our Portainer roles map to capabilities within Kubernetes. + +## Role Allocations + +| Portainer Role | Cluster Role Binding | Namespace Role Binding | +| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Environment Administrator | cluster-admin (k8s system) | N/A | +| Operator | [portainer-operator](kubernetes-roles-and-bindings.md#portainer-operator), [portainer-helpdesk](kubernetes-roles-and-bindings.md#portainer-helpdesk) | [portainer-view](kubernetes-roles-and-bindings.md#portainer-view) (all non-system namespaces) | +| User | [portainer-basic](kubernetes-roles-and-bindings.md#portainer-basic) | [portainer-edit](kubernetes-roles-and-bindings.md#portainer-edit), [portainer-view](kubernetes-roles-and-bindings.md#portainer-view) (only assigned namespaces) | +| Helpdesk | [portainer-helpdesk](kubernetes-roles-and-bindings.md#portainer-helpdesk) | [portainer-view](kubernetes-roles-and-bindings.md#portainer-view) (all non-system namespaces) | +| Read-Only | [portainer-basic](kubernetes-roles-and-bindings.md#portainer-basic) | [portainer-view](kubernetes-roles-and-bindings.md#portainer-view) (only assigned namespaces) | + +## Cluster Roles + +### portainer-basic + +| API Group | Resources | Verbs | +| ----------------- | ----------------------- | --------- | +| (Empty) | namespaces, nodes | get, list | +| storage.k8s.io | storageclasses | list | +| metrics.k8s.io | namespaces, pods, nodes | get, list | +| networking.k8s.io | ingressclasses | list | + +### portainer-helpdesk + +| API Group | Resources | Verbs | +| ----------------- | ------------------------------------------------------- | ---------------- | +| (Empty) | componentstatuses, endpoints, events, namespaces, nodes | get, list, watch | +| storage.k8s.io | storageclasses | get, list, watch | +| networking.k8s.io | ingresses | get, watch | +| networking.k8s.io | ingressclasses | list | +| metrics.k8s.io | pods, nodes, nodes/stats, namespace | get, list, watch | + +### portainer-operator + +| API Group | Resources | Verbs | +| -------------- | ------------------------------------ | ---------------- | +| (Empty) | configmaps | update | +| (Empty) | pods | delete | +| apps | deployments | patch | +| metrics.k8s.io | pods, nodes, nodes/stats, namespaces | get, list, watch | + +## Namespace Roles + +### portainer-edit + +| API Group | Resources | Verbs | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| (Empty) | configmaps, endpoints, persistentvolumeclaims, pods, pods/attach, pods/exec, pods/portforward, pods/proxy, replicationcontrollers, replicationcontrollers/scale, secrets, serviceaccounts, services, services/proxy | create, delete, deletecollection, patch, update | +| (Empty) | pods/attach, pods/exec, pods/portforward, pods/proxy, secrets, services/proxy | get, list, watch | +| apps | daemonsets, deployments, deployments/rollback, deployments/scale, replicasets, replicasets/scale, statefulsets, statefulsets/scale | create, delete, deletecollection, patch, update | +| autoscaling | horizontalpodautoscalers | create, delete, deletecollection, patch, update | +| batch | cronjobs, jobs | create, delete, deletecollection, patch, update | +| extensions | daemonsets, deployments, deployments/rollback, deployments/scale, ingresses, networkpolicies, replicasets, replicasets/scale, replicationcontrollers/scale | create, delete, deletecollection, patch, update | +| networking.k8s.io | ingresses, networkpolicies | create, delete, deletecollection, patch, update | +| policy | poddisruptionbudgets | create, delete, deletecollection, patch, update | + +### portainer-view + +| API Group | Resources | Verbs | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| (Empty) | bindings, componentstatuses, configmaps, endpoints, events, limitranges, namespaces, namespaces/status, persistentvolumeclaims, persistentvolumeclaims/status, pods, pods/log, pods/status, replicationcontrollers, replicationcontrollers/scale, replicationcontrollers/status, resourcequotas, resourcequotas/status, secrets, serviceaccounts, services, services/status | get, list, watch | +| apps | controllerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/status | get, list, watch | +| autoscaling | horizontalpodautoscalers, horizontalpodautoscalers/status | get, list, watch | +| batch | cronjobs, cronjobs/status, jobs, jobs/status | get, list, watch | +| extensions | daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scale | get, list, watch | +| networking.k8s.io | ingresses, ingresses/status, networkpolicies | get, list, watch | +| policy | poddisruptionbudgets, poddisruptionbudgets/status | get, list, watch | + +## Portainer Access Restrictions + +| Function | Endpoint admin | Operator | Helpdesk | Standard User | Read-only User | +| --------------------------- | -------------- | ------------------ | ------------------ | ------------------ | ------------------ | +| Namespace Scope | All | All, EXCEPT System | All, EXCEPT System | Default + Assigned | Default + Assigned | +| Namespaces | RW | R | R | R | R | +| Namespace Details | RW | R | R | R | R | +| Namespace Access Management | RW | | | | | +| Applications | RW | R | R | RW | R | +| Application Details | RW | R | R | RW | R | +| Pod Delete | Yes | Yes | | | | +| Application Console | RW | RW | | | | +| Advanced Deployment | RW | | | RW | | +| ConfigMaps & Secrets | RW | R | R | RW | R | +| ConfigMap & Secret Details | RW | RW | R | RW | R | +| Volumes | RW | R | R | RW | R | +| Volume Details | RW | R | R | RW | R | +| Cluster | RW | R | R | | | +| Cluster Node View | RW | R | R | | | +| Cluster Setup | RW | | | | | +| Application Error Details | R | R | R | | | +| Storage Class Disabled | R | R | R | | | + +## Community Edition + +The following tables cover the two roles available in Portainer Community Edition (CE). Note there is no Portainer access restriction in Portainer CE. + +| Portainer Role | Cluster Role Binding | Namespace Role Binding | +| -------------- | ----------------------------------------------------------------------- | ------------------------------------------------- | +| Admin | (no restriction) | (no restriction) | +| User | [portainer-cr-user](kubernetes-roles-and-bindings.md#portainer-cr-user) | edit (default k8s role, only assigned namespaces) | + +### portainer-cr-user + +| API Group | Resources | Verbs | +| ----------------- | ----------------- | ----- | +| (Empty) | namespaces, nodes | list | +| storage.k8s.io | storageclasses | list | +| networking.k8s.io | ingresses | list | diff --git a/advanced/reset-admin.md b/advanced/reset-admin.md new file mode 100644 index 00000000..7d82c0b4 --- /dev/null +++ b/advanced/reset-admin.md @@ -0,0 +1,152 @@ +# Reset the admin user's password + +If your Portainer admin forgets their password, follow these steps to reset it. There are three methods depending on your Portainer environment. + +## Method 1: Resetting the admin password if Portainer runs as a container + +{% hint style="info" %} +You would typically use this method if you run the Portainer Server on Docker Standalone. +{% endhint %} + +First, go to our [reset password container helper](https://github.com/portainer/helper-reset-password) in GitHub, then stop the Portainer container by running this command: + +``` +docker stop "id-portainer-container" +``` + +Next, run the helper using the following command (you'll need to mount the Portainer data volume): + +``` +docker pull portainer/helper-reset-password +docker run --rm -v portainer_data:/data portainer/helper-reset-password +``` + +If successful, the output should look like this: + +``` +2020/06/04 00:13:58 Password successfully updated for user: admin +2020/06/04 00:13:58 Use the following password to login: &_4#\3^5V8vLTd)E"NWiJBs26G*9HPl1 +``` + +If the helper is unable to find an admin user to update, it will create a new one for you. If the username `admin` is already used, it will create a user named `admin-[randomstring]`: + +``` +2022/08/10 07:36:33 [WARN] Unable to retrieve user with ID 1, will try to create, err: object not found inside the database +2022/08/10 07:36:33 Admin user admin-u0512b3f0v4dqk7o successfully created +2022/08/10 07:36:33 Use the following password to login: Sr#]YL_6D0k8Pd{pA9^|}F32j5J4I=av +``` + +Finally, use this command to start the Portainer container then try logging in with the new password: + +``` +docker start "id-portainer-container" +``` + +## Method 2: Resetting the admin password if Portainer runs as a stack/service + +{% hint style="info" %} +You would typically use this method if you run the Portainer Server on Docker Swarm. +{% endhint %} + +First, scale the Portainer service to zero using this command: + +``` +docker service scale portainer_portainer=0 +``` + +Next, run the [reset password container helper](https://github.com/portainer/helper-reset-password) using the same bind-mount/volume as the data volume: + +``` +docker pull portainer/helper-reset-password +docker run --rm -v portainer_portainer_data:/data portainer/helper-reset-password +``` + +If successful, the output should look like this: + +``` +2020/06/04 00:13:58 Password successfully updated for user: admin +2020/06/04 00:13:58 Use the following password to login: &_4#\3^5V8vLTd)E"NWiJBs26G*9HPl1 +``` + +If the helper is unable to find an admin user to update, it will create a new one for you. If the username `admin` is already used, it will create a user named `admin-[randomstring]`: + +``` +2022/08/10 07:36:33 [WARN] Unable to retrieve user with ID 1, will try to create, err: object not found inside the database +2022/08/10 07:36:33 Admin user admin-u0512b3f0v4dqk7o successfully created +2022/08/10 07:36:33 Use the following password to login: Sr#]YL_6D0k8Pd{pA9^|}F32j5J4I=av +``` + +Finally, start up the Portainer service scaling using this command then try logging in with the new password: + +``` +docker service scale portainer_portainer=1 +``` + +## Method 3: Resetting the admin password if Portainer is deployed in a Kubernetes cluster + +{% hint style="info" %} +You would typically use this method if you run the Portainer Server on a Kubernetes cluster. +{% endhint %} + +First, scale the Portainer deployment to zero using this command: + +``` +kubectl scale deploy portainer --replicas=0 -n portainer +``` + +Next, create a pod using the [reset password container helper](https://github.com/portainer/helper-reset-password) image and mount the Portainer data volume. Create a pod YAML file using the command below: + +{% hint style="info" %} +You may need to change the YAML below to match your Portainer deployment (for example if using a different `claimName`). +{% endhint %} + +``` +cat > passreset.yml<< EOF +apiVersion: v1 +kind: Pod +metadata: + name: passreset +spec: + volumes: + - name: data + persistentVolumeClaim: + claimName: portainer + containers: + - name: passreset + image: portainer/helper-reset-password + volumeMounts: + - mountPath: "/data" + name: data +EOF +``` + +Create the password reset pod using the command below: + +``` +kubectl apply -f passreset.yml -n portainer +``` + +Once the new pod is created and transitions into a completed state, you can see the new password in the pod logs: + +``` +kubectl logs passreset -n portainer +``` + +If successful, the output should look something like this: + +``` +2020/06/04 00:13:58 Password successfully updated for user: admin +2020/06/04 00:13:58 Use the following password to login: &_4#\3^5V8vLTd)E"NWiJBs26G*9HPl1 +``` + +Finally, scale up the Portainer deployment using this command then try logging in with the new password: + +``` +kubectl scale deploy portainer --replicas=1 -n portainer +``` + +You can delete the password reset pod using the below command: + +``` +kubectl delete pod passreset -n portainer +``` diff --git a/advanced/reverse-proxy/README.md b/advanced/reverse-proxy/README.md new file mode 100644 index 00000000..76d2a8ab --- /dev/null +++ b/advanced/reverse-proxy/README.md @@ -0,0 +1,12 @@ +# Using Portainer with reverse proxies + +If you need to, you can run Portainer behind a reverse proxy. We have guides for Traefik and nginx: + +{% content-ref url="traefik.md" %} +[traefik.md](traefik.md) +{% endcontent-ref %} + +{% content-ref url="nginx.md" %} +[nginx.md](nginx.md) +{% endcontent-ref %} + diff --git a/advanced/reverse-proxy/nginx.md b/advanced/reverse-proxy/nginx.md new file mode 100644 index 00000000..26cad9cf --- /dev/null +++ b/advanced/reverse-proxy/nginx.md @@ -0,0 +1,265 @@ +# Deploying Portainer behind nginx reverse proxy + +## Deploying in a Docker Standalone scenario + +To deploy Portainer behind an nginx proxy in a Docker standalone scenario you must use a Docker Compose file. In the following docker-compose.yml you will find the configuration of the nginx proxy and the Portainer Server. + +{% hint style="info" %} +This example uses the excellent [nginxproxy/nginx-proxy](https://hub.docker.com/r/nginxproxy/nginx-proxy) image as the proxy container, which requires no additional configuration beyond the two environment variables added to the `portainer` container's definition. +{% endhint %} + +{% tabs %} +{% tab title="Business Edition" %} +``` +version: "2" + +services: + nginx-proxy: + image: nginxproxy/nginx-proxy + restart: always + ports: + - "80:80" + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + + portainer: + image: portainer/portainer-ee:latest + command: -H unix:///var/run/docker.sock + restart: always + environment: + - VIRTUAL_HOST=portainer.yourdomain.com + - VIRTUAL_PORT=9000 + ports: + - 8000:8000 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer_data:/data + +volumes: + portainer_data: +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +version: "2" + +services: + nginx-proxy: + image: nginxproxy/nginx-proxy + restart: always + ports: + - "80:80" + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + + portainer: + image: portainer/portainer-ce:latest + command: -H unix:///var/run/docker.sock + restart: always + environment: + - VIRTUAL_HOST=portainer.yourdomain.com + - VIRTUAL_PORT=9000 + ports: + - 8000:8000 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer_data:/data + +volumes: + portainer_data: +``` +{% endtab %} +{% endtabs %} + +To start working with this recipe, change the `VIRTUAL_HOST` value then deploy Portainer by running the following: + +``` +docker-compose up -d +``` + +When this has finished, run `docker ps` . You should see an output similar to this: + +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +8c8f2eac7c9a portainer/portainer-ee:latest "/portainer -H unix:…" 4 minutes ago Up 4 minutes 9000/tcp, 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 9443/tcp portainer_portainer_1 +3e7c8b5d71d7 nginxproxy/nginx-proxy "/app/docker-entrypo…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp portainer_nginx-proxy_1 +``` + +Once the deployment has finished you can browse `portainer.yourdomain.com`. + +## Deploying in a Docker Swarm scenario + +Deploying Portainer in Docker Swarm behind nginx has similar steps to the Docker Standalone scenario. Before deploying, you need to create two elements: networks and volumes. + +{% hint style="warning" %} +This deployment assumes you are running one manager node. If you are using multiple managers we advise [reading this knowledge base article](https://portal.portainer.io/knowledge/how-can-i-ensure-portainers-configuration-is-retained) before proceeding. +{% endhint %} + +First, create two networks: + +* One for the agent and the communication with the Portainer Server. +* One to 'expose' the Portainer container to the same network as the reverse proxy. + +``` + docker network create -d overlay proxy +``` + +``` + docker network create -d agent_network +``` + +Next, create the volume: + +``` + docker volume create portainer_data +``` + +And finally, save the following recipe as `portainer.yml`: + +{% tabs %} +{% tab title="Business Edition" %} +``` +version: '3.2' + +services: + nginx-proxy: + image: nginxproxy/nginx-proxy + networks: + - proxy + ports: + - "80:80" + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + - "./vhost.d:/etc/nginx/vhost.d:ro" + + agent: + image: portainer/agent:latest + environment: + # REQUIRED: Should be equal to the service name prefixed by "tasks." when + # deployed inside an overlay network + AGENT_CLUSTER_ADDR: tasks.agent + # AGENT_PORT: 9001 + # LOG_LEVEL: debug + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + networks: + - agent_network + deploy: + mode: global + placement: + constraints: [node.platform.os == linux] + + portainer: + image: portainer/portainer-ee:latest + command: -H tcp://tasks.agent:9001 --tlsskipverify + volumes: + - data:/data + environment: + - VIRTUAL_HOST=portainer.yourdomain.com + - VIRTUAL_PORT=9000 + ports: + - 8000:8000 + networks: + - proxy + - agent_network + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + + +networks: + proxy: + external: true + agent_network: + external: true + +volumes: + data: +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +version: '3.2' + +services: + nginx-proxy: + image: nginxproxy/nginx-proxy + networks: + - proxy + ports: + - "80:80" + volumes: + - "/var/run/docker.sock:/tmp/docker.sock:ro" + - "./vhost.d:/etc/nginx/vhost.d:ro" + + agent: + image: portainer/agent:latest + environment: + # REQUIRED: Should be equal to the service name prefixed by "tasks." when + # deployed inside an overlay network + AGENT_CLUSTER_ADDR: tasks.agent + # AGENT_PORT: 9001 + # LOG_LEVEL: debug + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + networks: + - agent_network + deploy: + mode: global + placement: + constraints: [node.platform.os == linux] + + portainer: + image: portainer/portainer-ce:latest + command: -H tcp://tasks.agent:9001 --tlsskipverify + volumes: + - data:/data + environment: + - VIRTUAL_HOST=portainer.yourdomain.com + - VIRTUAL_PORT=9000 + ports: + - 8000:8000 + networks: + - proxy + - agent_network + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + + +networks: + proxy: + external: true + agent_network: + external: true + +volumes: + data: +``` +{% endtab %} +{% endtabs %} + +To start working with this recipe, change the `VIRTUAL_HOST` value then deploy Portainer by running the following: + +``` + docker stack deploy portainer -c portainer.yml +``` + +To check the deployment, run `docker service ls`. You should see an output similar to the following: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +gy2bjxid0g4p portainer_agent global 1/1 portainer/agent:latest +jwvjp5bux4sz portainer_nginx-proxy replicated 1/1 nginxproxy/nginx-proxy:latest *:80->80/tcp +5nflcvoxl3c7 portainer_portainer replicated 1/1 portainer/portainer-ee:latest *:8000->8000/tcp +``` + +Once the services are running, you will be able to access Portainer from the URL you defined earlier, for example: `portainer.yourdomain.com`. diff --git a/advanced/reverse-proxy/traefik.md b/advanced/reverse-proxy/traefik.md new file mode 100644 index 00000000..8de7e3fe --- /dev/null +++ b/advanced/reverse-proxy/traefik.md @@ -0,0 +1,374 @@ +# Deploying Portainer behind Traefik Proxy + +[Traefik Proxy](https://traefik.io/traefik/) is a reverse proxy and load balancing solution focused on micro services. + +## Deploying in a Docker Standalone scenario + +To deploy Portainer behind Traefik Proxy in a Docker standalone scenario you must use a Docker Compose file. In the following `docker-compose.yml` you will find the configuration for Portainer Traefik with SSL support and the Portainer Server. + +{% tabs %} +{% tab title="Business Edition" %} +``` +version: "3.3" + +services: + traefik: + container_name: traefik + image: "traefik:latest" + command: + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --providers.docker + - --log.level=ERROR + - --certificatesresolvers.leresolver.acme.httpchallenge=true + - --certificatesresolvers.leresolver.acme.email=your-email #Set your email address here, is for the generation of SSL certificates with Let's Encrypt. + - --certificatesresolvers.leresolver.acme.storage=./acme.json + - --certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "./acme.json:/acme.json" + labels: + - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" + - "traefik.http.routers.http-catchall.entrypoints=web" + - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" + - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + + portainer: + image: portainer/portainer-ee:latest + command: -H unix:///var/run/docker.sock + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer_data:/data + labels: + # Frontend + - "traefik.enable=true" + - "traefik.http.routers.frontend.rule=Host(`portainer.yourdomain.com`)" + - "traefik.http.routers.frontend.entrypoints=websecure" + - "traefik.http.services.frontend.loadbalancer.server.port=9000" + - "traefik.http.routers.frontend.service=frontend" + - "traefik.http.routers.frontend.tls.certresolver=leresolver" + + # Edge + - "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" + - "traefik.http.routers.edge.entrypoints=websecure" + - "traefik.http.services.edge.loadbalancer.server.port=8000" + - "traefik.http.routers.edge.service=edge" + - "traefik.http.routers.edge.tls.certresolver=leresolver" + + +volumes: + portainer_data: +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +version: "3.3" + +services: + traefik: + container_name: traefik + image: "traefik:latest" + command: + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --providers.docker + - --log.level=ERROR + - --certificatesresolvers.leresolver.acme.httpchallenge=true + - --certificatesresolvers.leresolver.acme.email=your-email #Set your email address here, is for the generation of SSL certificates with Let's Encrypt. + - --certificatesresolvers.leresolver.acme.storage=./acme.json + - --certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web + ports: + - "80:80" + - "443:443" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "./acme.json:/acme.json" + labels: + - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" + - "traefik.http.routers.http-catchall.entrypoints=web" + - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" + - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + + portainer: + image: portainer/portainer-ce:latest + command: -H unix:///var/run/docker.sock + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer_data:/data + labels: + # Frontend + - "traefik.enable=true" + - "traefik.http.routers.frontend.rule=Host(`portainer.yourdomain.com`)" + - "traefik.http.routers.frontend.entrypoints=websecure" + - "traefik.http.services.frontend.loadbalancer.server.port=9000" + - "traefik.http.routers.frontend.service=frontend" + - "traefik.http.routers.frontend.tls.certresolver=leresolver" + + # Edge + - "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" + - "traefik.http.routers.edge.entrypoints=websecure" + - "traefik.http.services.edge.loadbalancer.server.port=8000" + - "traefik.http.routers.edge.service=edge" + - "traefik.http.routers.edge.tls.certresolver=leresolver" + + +volumes: + portainer_data: +``` +{% endtab %} +{% endtabs %} + +Before you run this file in Docker, you will need to create the `acme.json` file with permission `600` that will store the SSL certificates. Once it has been created, you can define the file path in the following sections in the Docker Compose file: + +In the volumes and command section of the Traefik Proxy container: + +``` +- "./acme.json:/acme.json" +``` + +``` +- --certificatesresolvers.leresolver.acme.storage=./acme.json +``` + +You also need to enter your email address for Let's Encrypt registration. + +``` +- --certificatesresolvers.leresolver.acme.email=your-email +``` + +Next, customize some labels in the Traefik container. The following labels need to be updated with the URL that you want use to access Portainer: + +``` +- "traefik.http.routers.frontend.rule=Host(`portainer.yourdomain.com`)" +``` + +``` +- "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" +``` + +Once this is done, you're ready to deploy Portainer: + +``` +docker-compose up -d +``` + +After the images have been downloaded and deployed you will able to access Portainer from the URL you defined earlier, for example: `https://portainer.yourdomain.com`. + +## Deploying in a Docker Swarm scenario + +To deploy Portainer behind Traefik Proxy in a Docker Swarm scenario you must use a Docker Compose file. In the following `docker-compose.yml` you will find the configuration for Portainer Traefik with SSL support and the Portainer Server. + +{% hint style="warning" %} +This deployment assumes you are running one manager node. If you are using multiple managers we advise [reading this knowledge base article](https://portal.portainer.io/knowledge/how-can-i-ensure-portainers-configuration-is-retained) before proceeding. +{% endhint %} + +Before deploying the Docker Compose file, you need to create two elements: networks and volumes. + +First, create two overlay networks: + +``` + docker network create -d overlay agent_network +``` + +``` + docker network create -d overlay public +``` + +Then create the volume: + +``` + docker volume create portainer_data +``` + +Save this recipe as `portainer.yml`: + +{% tabs %} +{% tab title="Business Edition" %} +``` +version: '3.2' + +services: + traefik: + image: "traefik:latest" + command: + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --providers.docker=true + - --providers.docker.swarmMode=true + - --providers.docker.exposedbydefault=false + - --providers.docker.network=public + - --api + - --log.level=ERROR + ports: + - "80:80" + - "443:443" + networks: + - public + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + + agent: + image: portainer/agent:latest + environment: + # REQUIRED: Should be equal to the service name prefixed by "tasks." when + # deployed inside an overlay network + AGENT_CLUSTER_ADDR: tasks.agent + # AGENT_PORT: 9001 + # LOG_LEVEL: debug + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + networks: + - agent_network + deploy: + mode: global + placement: + constraints: [node.platform.os == linux] + + portainer: + image: portainer/portainer-ee:latest + command: -H tcp://tasks.agent:9001 --tlsskipverify + volumes: + - data:/data + networks: + - public + - agent_network + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + labels: + - "traefik.enable=true" + - "traefik.http.routers.portainer.rule=Host(`portainer.yourdomain.com`)" + - "traefik.http.routers.portainer.entrypoints=web" + - "traefik.http.services.portainer.loadbalancer.server.port=9000" + - "traefik.http.routers.portainer.service=portainer" + # Edge + - "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" + - "traefik.http.routers.edge.entrypoints=web" + - "traefik.http.services.edge.loadbalancer.server.port=8000" + - "traefik.http.routers.edge.service=edge" + +networks: + public: + external: true + agent_network: + external: true + +volumes: + data: +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +version: '3.2' + +services: + traefik: + image: "traefik:latest" + command: + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --providers.docker=true + - --providers.docker.swarmMode=true + - --providers.docker.exposedbydefault=false + - --providers.docker.network=public + - --api + - --log.level=ERROR + ports: + - "80:80" + - "443:443" + networks: + - public + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + + agent: + image: portainer/agent:latest + environment: + # REQUIRED: Should be equal to the service name prefixed by "tasks." when + # deployed inside an overlay network + AGENT_CLUSTER_ADDR: tasks.agent + # AGENT_PORT: 9001 + # LOG_LEVEL: debug + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + networks: + - agent_network + deploy: + mode: global + placement: + constraints: [node.platform.os == linux] + + portainer: + image: portainer/portainer-ce:latest + command: -H tcp://tasks.agent:9001 --tlsskipverify + volumes: + - data:/data + networks: + - public + - agent_network + deploy: + mode: replicated + replicas: 1 + placement: + constraints: [node.role == manager] + labels: + - "traefik.enable=true" + - "traefik.http.routers.portainer.rule=Host(`portainer.yourdomain.com`)" + - "traefik.http.routers.portainer.entrypoints=web" + - "traefik.http.services.portainer.loadbalancer.server.port=9000" + - "traefik.http.routers.portainer.service=portainer" + # Edge + - "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" + - "traefik.http.routers.edge.entrypoints=web" + - "traefik.http.services.edge.loadbalancer.server.port=8000" + - "traefik.http.routers.edge.service=edge" + +networks: + public: + external: true + agent_network: + external: true + +volumes: + data: +``` +{% endtab %} +{% endtabs %} + +Finally, customize these labels to match the URL that you want to use to access Portainer: + +``` +- "traefik.http.routers.frontend.rule=Host(`portainer.yourdomain.com`)" +``` + +``` +- "traefik.http.routers.edge.rule=Host(`edge.yourdomain.com`)" +``` + +You can now deploy Portainer by executing the following: + +``` + docker stack deploy portainer -c portainer.yml +``` + +To check the deployment, run `docker service ls`. You should see an output similar to the following: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +lt21zrypsll6 portainer_agent global 1/1 portainer/agent:latest +m6912ynwdcd7 portainer_portainer replicated 1/1 portainer/portainer-ee:latest +tw2nb4i640e4 portainer_traefik replicated 1/1 traefik:latest *:80->80/tcp, *:443->443/tcp +``` + +Once the services are running, you will able to access Portainer from the URL you defined earlier, for example: `portainer.yourdomain.com`. diff --git a/advanced/security.md b/advanced/security.md new file mode 100644 index 00000000..c25d9a12 --- /dev/null +++ b/advanced/security.md @@ -0,0 +1,9 @@ +# Security and compliance + +Portainer runs exclusively on your servers, within your network, behind your own firewalls. As a result, we do not currently hold any SOC or PCI/DSS compliance because we do not host any of your infrastructure. You can even run Portainer completely disconnected (air-gapped) without any impact on functionality. + +We comply with GDPR in relation to the anonymous analytics we collect. Data collection can be disabled at startup (or at any time), and if you are disconnected, it silently fails. + +The Portainer code itself does not undergo any formal code analysis, however we scan our published images for vulnerabilities as part of the DockerHub process. + +We are also the subject of regular third-party vulnerability analyses. No issues have been reported for some time, and any issues that are discovered are resolved within six weeks. diff --git a/advanced/ssl.md b/advanced/ssl.md new file mode 100644 index 00000000..4cb9b22f --- /dev/null +++ b/advanced/ssl.md @@ -0,0 +1,192 @@ +# Using your own SSL certificate with Portainer + +By default, Portainer’s web interface and API is exposed over HTTPS with a self-signed certificate generated by the installation. This can be replaced with your own SSL certificate either after installation [via the Portainer UI](../admin/settings/#ssl-certificate) or during installation, as explained in this article. + +{% hint style="info" %} +When using your own externally-issued certificate, ensure that you include the full certificate chain (including any intermediate certificates) in the file you provide via `--sslcert`. Without this you may face certificate validation issues. Your certificate chain can be obtained either from your certificate issuer or the [What's My Chain Cert?](https://whatsmychaincert.com/) website. +{% endhint %} + +## Using your own SSL certificate on Docker Standalone + +{% hint style="info" %} +Portainer expects certificates in PEM format. +{% endhint %} + +Use the `--sslcert` and `--sslkey` flags during installation. + +{% hint style="info" %} +If you are using certificates signed by your own CA, you may need to supply your CA certificate as well with the `--sslcacert` flag. +{% endhint %} + +Upload your certificate (including the chain) and key to the server running Portainer, then start Portainer referencing them. The following command assumes your certificates are stored in `/path/to/your/certs` with the filenames `portainer.crt` and `portainer.key`, and bind-mounts the directory to `/certs` in the Portainer container: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 \ + --name portainer --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + -v /path/to/your/certs:/certs \ + portainer/portainer-ee:latest \ + --sslcert /certs/portainer.crt \ + --sslkey /certs/portainer.key +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 \ + --name portainer --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + -v /path/to/your/certs:/certs \ + portainer/portainer-ce:latest \ + --sslcert /certs/portainer.crt \ + --sslkey /certs/portainer.key +``` +{% endtab %} +{% endtabs %} + +Alternatively, Certbot can be used to generate a certificate and a key. Because Docker has issues with symlinks, if you use Certbot you will need to pass both the 'live' and 'archive' directories as volumes, as well as use the full chain certificate. For example: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 \ + --name portainer --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + -v /etc/letsencrypt/live/yourdomain:/certs/live/yourdomain:ro \ + -v /etc/letsencrypt/archive/yourdomain:/certs/archive/yourdomain:ro \ + portainer/portainer-ee:latest \ + --sslcert /certs/live/yourdomain/fullchain.pem \ + --sslkey /certs/live/yourdomain/privkey.pem +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 9443:9443 -p 8000:8000 \ + --name portainer --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v portainer_data:/data \ + -v /etc/letsencrypt/live/yourdomain:/certs/live/yourdomain:ro \ + -v /etc/letsencrypt/archive/yourdomain:/certs/archive/yourdomain:ro \ + portainer/portainer-ce:latest \ + --sslcert /certs/live/yourdomain/fullchain.pem \ + --sslkey /certs/live/yourdomain/privkey.pem +``` +{% endtab %} +{% endtabs %} + +When you're finished, you can navigate to `https://$ip-docker-host:9443`. + +## Using your own SSL certificate on Docker Swarm + +To provide your own SSL certificate for Docker Swarm, simply define the `portainer.sslcert` and `portainer.sslkey` secrets, and the installation manifest will automatically detect and use them: + +``` +docker secret create portainer.sslcert /path/to/your/certificate.crt +docker secret create portainer.sslkey /path/to/your/certificate.key +``` + +{% hint style="info" %} +If you are using certificates signed by your own CA, you may need to supply your CA certificate as well via a `portainer.sslcacert` secret and modifying the below YAML files to include the `--sslcacert` flag. +{% endhint %} + +Next, retrieve the stack YML manifest: + +{% tabs %} +{% tab title="Linux and Windows with Docker Desktop" %} +**Business Edition:** + +``` +curl -L https://downloads.portainer.io/ee2-17/portainer-agent-stack-ssl.yml -o portainer-agent-stack.yml +``` + +**Community Edition:** + +``` +curl -L https://downloads.portainer.io/ce2-17/portainer-agent-stack-ssl.yml -o portainer-agent-stack.yml +``` +{% endtab %} + +{% tab title="Windows Container Services" %} +**Business Edition:** + +``` +curl https://downloads.portainer.io/ee2-17/portainer-windows-stack-ssl.yml -o portainer-agent-stack.yml +``` + +**Community Edition:** + +``` +curl https://downloads.portainer.io/ce2-17/portainer-windows-stack-ssl.yml -o portainer-agent-stack.yml +``` +{% endtab %} +{% endtabs %} + +Finally, use the downloaded YML manifest to deploy your stack: + +``` +docker stack deploy -c portainer-agent-stack.yml portainer +``` + +For more information about secrets, read [Docker's own documentation](https://docs.docker.com/compose/compose-file/#secrets). + +## Using your own SSL certificate on Kubernetes (via Helm) + +If it doesn't already exist, create the `portainer` namespace: + +``` +kubectl create namespace portainer +``` + +Next, create a TLS secret containing the full certificate chain and matching private key: + +``` +kubectl create secret tls portainer-tls-secret -n portainer \ + --cert=/path/to/cert/file \ + --key=/path/to/key/file +``` + +Install via helm with the `tls.existingSecret` parameter set to the name of the secret you just created: + +{% tabs %} +{% tab title="NodePort" %} +**Business Edition:** + +``` +helm install -n portainer portainer portainer/portainer \ + --set tls.existingSecret=portainer-tls-secret \ + --set enterpriseEdition.enabled=true +``` + +**Community Edition:** + +``` +helm install -n portainer portainer portainer/portainer \ + -- set tls.existingSecret=portainer-tls-secret +``` +{% endtab %} + +{% tab title="Load Balancer" %} +Business Edition: + +``` +helm install -n portainer portainer portainer/portainer \ + --set tls.existingSecret=portainer-tls-secret \ + --set service.type=LoadBalancer \ + --set enterpriseEdition.enabled=true +``` + +Community Edition: + +``` +helm install -n portainer portainer portainer/portainer \ + -- set tls.existingSecret=portainer-tls-secret \ + --set service.type=LoadBalancer +``` +{% endtab %} +{% endtabs %} diff --git a/api/access.md b/api/access.md new file mode 100644 index 00000000..acad61fe --- /dev/null +++ b/api/access.md @@ -0,0 +1,108 @@ +# Accessing the Portainer API + +To access the Portainer API, you will need a few things: + +* A user in Portainer +* An access token for that user +* The ability to make HTTPS requests to the Portainer server on port `9443` (or `9000` for legacy HTTP) + +## Creating a new user + +API access is provided on a per-user basis, with each users' API access dependent on that user's permissions within Portainer. For example, if your user had access to only one environment, API calls for that user would also be restricted to that environment. + +To create a new user within Portainer, refer to our documentation: + +{% content-ref url="../admin/users/add.md" %} +[add.md](../admin/users/add.md) +{% endcontent-ref %} + +Once the user has been created, log in to Portainer as that user to create an API access token. + +## Creating an access token + +Once the user has been created, you can add an access token to that user. The access token will provide the same level of access to Portainer functionality as would be available to that user had they logged into the Portainer UI. + +Once logged in as the user, click on **my account** in the top right. + +
+ +Scroll down to the **Access tokens** section. Here you can see any access tokens that exist for the user. + +
+ +To add a new access token, click the **Add access token** button. You will be taken to a new page where you can set a Description for your access token. We recommend making this something recognizable for future reference. + +
+ +Once you have provided a description, click the **Add access token** button to generate your access token. + +Your new access token will now be displayed. Please copy the access token and keep it in a safe place, as you will not be able to view the token again after creation. + +
+ +When you have copied the access token, click the **Done** button to return to the User settings page. Your access token is ready to use. + +## Using your access token + +Now that you have created a user and access token, you are ready to access the API. The Portainer API follows the RESTful architecture, accepting `GET` / `POST` / `PUT` / `DELETE` requests and responding with JSON objects. + +{% hint style="info" %} +The following examples use [httpie](https://httpie.org/) to execute API calls against Portainer. Feel free to replace this with your method of choice. +{% endhint %} + +To make an API request, you will need to include your access token in the `X-API-Key` header to authenticate your request. For example, you can use the `/stacks` endpoint to list the stacks you have access to: + +``` +http GET https://portainer-url:9443/api/stacks X-API-Key:your_api_key_here +``` + +This will return a JSON object listing your stacks: + +``` +[ + { + "AdditionalFiles": null, + "AutoUpdate": null, + "CreatedBy": "admin", + "CreationDate": 1631852794, + "EndpointId": 4, + "EntryPoint": "docker-compose.yml", + "Env": null, + "GitConfig": { + "Authentication": null, + "ConfigFilePath": "docker-compose.yml", + "ConfigHash": "2e71920bf1ee1bbac976d320f8f274411fba3bad", + "ReferenceName": "refs/heads/master", + "URL": "https://github.com/mygithubaccount/wordpress-stack" + }, + "Id": 5, + "IsComposeFormat": true, + "Name": "", + "Namespace": "my-namespace", + "ProjectPath": "/data/compose/5", + "ResourceControl": null, + "Status": 1, + "SwarmId": "", + "Type": 3, + "UpdateDate": 0, + "UpdatedBy": "" + }, +] +``` + +If a user tries to access an area they do not have permission to access, an error message will be returned. For example, assume that a non-administrator user attempted to access the `/settings` endpoint, which requires administrator access: + +``` +http GET https://portainer:9443/api/settings X-API-Key:your_api_key_here +``` + +The user would be presented with the following response: + +``` +{ + "details": "Unauthorized", + "message": "Access denied" +} +``` + +Now that you have access to the Portainer API, you can learn more about how to use it from the [API documentation](docs.md) and our [usage examples](examples.md). diff --git a/api/docs.md b/api/docs.md new file mode 100644 index 00000000..90ace972 --- /dev/null +++ b/api/docs.md @@ -0,0 +1,19 @@ +# API documentation + +Portainer exposes an HTTP API that you can use to automate everything you do via the Portainer UI. You can also use Portainer as a gateway (HTTP queries against the Portainer API) to the underlying Docker/Kubernetes API. + +{% hint style="info" %} +You will need an access token in order to use the Portainer API. If you have not already set up an access token for the API, we have [instructions on how to do so](access.md). +{% endhint %} + +You can find our API documentation at SwaggerHub: + +* [Business Edition (BE) 2.17.0 API Documentation](https://app.swaggerhub.com/apis/portainer/portainer-ee/2.17.0) +* [Community Edition (CE) 2.17.0 API Documentation](https://app.swaggerhub.com/apis/portainer/portainer-ce/2.17.0) + +We have also provided some examples of API usage. + +{% content-ref url="examples.md" %} +[examples.md](examples.md) +{% endcontent-ref %} + diff --git a/api/examples.md b/api/examples.md new file mode 100644 index 00000000..4f99fe28 --- /dev/null +++ b/api/examples.md @@ -0,0 +1,117 @@ +# API usage examples + +Portainer exposes an HTTP API that you can use to automate everything you do via the Portainer UI. You can also use Portainer as a gateway (HTTP queries against the Portainer API) to the underlying Docker/Kubernetes API. + +{% hint style="info" %} +The following examples use [httpie](https://httpie.org/) to execute API calls against Portainer. +{% endhint %} + +## Initialize the admin password + +On a fresh install of Portainer, you need to create an admin account to initialize Portainer. You will be asked for this when you visit the Portainer URL for the first time. You can achieve the same outcome using this API call: + +``` +http POST /api/users/admin/init Username="" Password="" +``` + +## Authenticate against the API using the admin account + +``` +http POST /api/auth Username="" Password="" +``` + +The response is a JSON object containing the JWT token inside the `jwt` field. You will need to pass this token inside the authorization header when executing an authentication query against the API. + +``` +{ + "jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE" +} +``` + +The value of the authorization header must be of the form `Bearer `: + +``` +Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTQ5OTM3NjE1NH0.NJ6vE8FY1WG6jsRQzfMqeatJ4vh2TWAeeYfDhP71YEE +``` + +{% hint style="info" %} +This token is valid for 8 hours. Once it expires, you will need to generate another token to execute authenticated queries. +{% endhint %} + +## Adding a new environment + +On a fresh install, Portainer has no environments configured. You will first need to add an environment for Portainer to manage. + +You can add an environment to manage [via the Portainer API](../admin/environments/add/api.md), or via the web interface both during the initial setup and after setup is complete. + +## Execute Docker queries against a specific environment + +The Portainer HTTP API endpoint acts as a reverse-proxy to the Docker HTTP API and can be used to execute any of the Docker HTTP API requests: + +`/api/endpoints//docker` + +{% hint style="info" %} +Read [Docker's API documentation](https://docs.docker.com/engine/api/) to learn how to query the Docker Engine. +{% endhint %} + +### **List all containers** + +This call lists all of the containers available in a specific environment: + +``` +http GET /api/endpoints/1/docker/containers/json \ + X-API-Key:your_access-token \ + all==true +``` + +The response is identical to that returned by the `ContainerList` operation of the Docker API. See [Docker's documentation about this operation](https://docs.docker.com/engine/api/v1.41/#operation/ContainerList). + +### **Create a container** + +You can create a container in a specific environment using the Portainer HTTP API as a gateway. The following query will create a new Docker container inside the environment using ID 1. The container will be named `web01` and will use the `nginx:latest` Docker image. It will publish container port `80` on port `8080` on the host. + +``` +http POST /api/endpoints/1/docker/containers/create \ + X-API-Key:your_access-token \ + name=="web01" Image="nginx:latest" \ + ExposedPorts:='{ "80/tcp": {} }' \ + HostConfig:='{ "PortBindings": { "80/tcp": [{ "HostPort": "8080" }] } }' +``` + +The response is identical to that returned by the `ContainerCreate` operation of the Docker API. See [Docker's documentation about this operation](https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate). + +Here is an example response: + +``` +{ + "Id": "5fc2a93d7a3d426a1c3937436697fc5e5343cc375226f6110283200bede3b107", + "Warnings": null +} +``` + +You will need the container ID in order to execute actions against that container. + +### **Start a container** + +Using the ID you retrieved previously, you can start your new container using this endpoint: + +`/api/endpoints//docker/containers//start` + +``` +http POST /api/endpoints/1/docker/containers/5fc2a93d7a3d426a1c3937436697fc5e5343cc375226f6110283200bede3b107/start \ + X-API-Key:your_access-token +``` + +The response is identical to that returned by the `ContainerStart` operation of the Docker API. See [Docker's documentation about this operation](https://docs.docker.com/engine/api/v1.41/#operation/ContainerStart). + +### **Delete a container** + +You can create a container using the endpoint `/api/endpoints//docker/containers/`: + +``` +http DELETE /api/endpoints/1/docker/containers/5fc2a93d7a3d426a1c3937436697fc5e5343cc375226f6110283200bede3b107 \ + X-API-Key:your_access-token \ + force==true +``` + +The response is identical to that returned by the `ContainerDelete` operation of the Docker API. See [Docker's documentation about this operation](https://docs.docker.com/engine/api/v1.41/#operation/ContainerDelete). diff --git a/contribute/build/README.md b/contribute/build/README.md new file mode 100644 index 00000000..f6385209 --- /dev/null +++ b/contribute/build/README.md @@ -0,0 +1,49 @@ +# Build instructions + +This article explains how to set up your local development environment so you can contribute to the Portainer codebase. + +{% hint style="info" %} +Make sure you have installed the dependencies for this project on your [Mac](mac.md) or [Linux](linux.md) machine before continuing. +{% endhint %} + +{% hint style="warning" %} +Windows is currently not supported by the Portainer development environment. +{% endhint %} + +## Instructions + +Navigate to the folder where you will store Portainer project code. This can be anywhere such as on your desktop or in your downloads folder. + +Now, download the Portainer project: + +``` +git clone https://github.com/portainer/portainer.git +``` + +Next, navigate into the Portainer project you downloaded: + +``` +cd portainer +``` + +Install the development dependencies: + +``` +yarn +``` + +And finally, build and run the project: + +``` +yarn start +``` + +You should now be able to access Portainer at `https://localhost:9443`. + +{% hint style="info" %} +The frontend application will update when you save your changes to any of the sources. Just refresh the browser to see the changes +{% endhint %} + +## Contribution Guidelines + +When contributing to the Portainer codebase, please follow [our contribution guidelines](https://github.com/portainer/portainer/blob/develop/CONTRIBUTING.md). diff --git a/contribute/build/linux.md b/contribute/build/linux.md new file mode 100644 index 00000000..a8e589ee --- /dev/null +++ b/contribute/build/linux.md @@ -0,0 +1,191 @@ +# Set up a Linux build environment + +As an open source product, we encourage users to edit our code and submit patches to it. This article explains how to set up a local environment on Linux so you can build your own copy of Portainer and test your changes. + +{% hint style="info" %} +We tested these instructions on Ubuntu 18.04.2 LTS. For instructions that relate to other systems, see the linked documentation below. +{% endhint %} + +## Dependencies + +* [Docker CE](https://docs.docker.com/install/) is the Docker application that runs on your machine to enable the use of Docker features. The latest version is not a requirement for this development stack, however we recommend staying up to date with the latest improvements and security fixes. +* ​[Yarn](https://yarnpkg.com/en/docs/install#mac-stable) is a package manager for installing new software packages on your system, and is used to run the Portainer development environment. +* [Node.JS](https://nodejs.org/en/download/) is a JavaScript package used when building applications that leverage networking, such as Portainer. Version 18 or later is required. +* [Golang](https://golang.org/dl/) is the open source language that we use to build the majority of Portainer software. Version 1.18 of Golang is required. +* Wget is a package used to retrieve files using common internet protocols such as HTTP and FTP. + +## Part 1: Installing Docker + +{% hint style="info" %} +The following instructions were run on Ubuntu, for up-to-date instructions on this and other Linux distributions read the [official Docker CE documentation](https://docs.docker.com/install/). +{% endhint %} + +{% hint style="info" %} +You must configure the Docker repository before you install Docker. +{% endhint %} + +### Step 1: Configure the Docker repository + +First, update your system's packages using this command: + +``` +sudo apt-get update +``` + +Next, install the required packages to use repos over HTTPS: + +``` +sudo apt-get install \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg-agent \ + software-properties-common +``` + +Now install the official GPG key for Docker: + +``` +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +``` + +Use this fingerprint to confirm that you have the correct key: + +`9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88` + +``` +sudo apt-key fingerprint 0EBFCD88 +``` + +The correct output should be: + +``` +pub rsa4096 2017-02-22 [SCEA] + 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 +uid [ unknown] Docker Release (CE deb) +sub rsa4096 2017-02-22 [S] +``` + +And finally, use the following command to set up the stable repository: + +``` +sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" +``` + +### Step 2: Install Docker + +{% hint style="info" %} +We always recommend installing software using the most up-to-date instructions from the official vendor. This step is based on Docker's own [installation instructions for Docker on Linux](https://docs.docker.com/install/). +{% endhint %} + +First, update your system's packages using this command: + +``` +sudo apt-get update +``` + +Next, install Docker and its associated packages: + +``` +sudo apt-get install docker-ce docker-ce-cli containerd.io +``` + +Finally, verify that Docker was correctly installed and is running on your system. This command should download a test image that you can run in a container, print an informational message for then exit out of. + +``` +sudo docker run hello-world +``` + +## Part 2: Installing Yarn + +{% hint style="info" %} +If you are running a different Linux distribution than Ubuntu, read Yarn's own [installation instructions for Yarn on Linux](https://yarnpkg.com/en/docs/install). +{% endhint %} + +{% hint style="info" %} +If you have issues installing or using Yarn, read their [official documentation](https://yarnpkg.com/en/docs/install#mac-stable). +{% endhint %} + +Run this command in the terminal to configure the Yarn repository on your system: + +``` +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +``` + +Update your system's packages and install Yarn using this command: + +``` +sudo apt-get update && sudo apt-get install yarn +``` + +Finally, run this command in the terminal to confirm that the Yarn installation was a success: + +``` +yarn --version +``` + +The current version of Yarn should print out in your terminal, indicating that that it installed successfully and is running on your system. + +## Part 3: Installing or updating Node.JS + +{% hint style="info" %} +This procedure makes use of NVM to install Node.JS (Node.JS version 12 or later is required). NVM allows multiple different versions of Node.JS to be installed on a system and provides an easy way to switch between them. +{% endhint %} + +{% hint style="info" %} +If you have issues installing or updating Node.JS, read NVM's [documentation](https://github.com/creationix/nvm). +{% endhint %} + +First, install or update to the latest version of Node.JS by running this command in the terminal: + +``` +nvm install node +``` + +Finally, check if Node is installed on your system: + +``` +node --version +``` + +The latest version of Node.JS should now print out. + +## Part 4: Installing Golang using a Linux tar file + +{% hint style="info" %} +Go version 1.17 must be installed. If you're upgrading from an older version, you must [remove the existing version](https://golang.org/doc/install#uninstall) first before installing version 1.17. For the most up-to-date installation instructions, read [Go's own documentation](https://golang.org/doc/install#install). +{% endhint %} + +{% hint style="info" %} +If you have issues installing or using Go, read the _Getting help_ section in their [official documentation](https://golang.org/doc/install#help). +{% endhint %} + +First, [download](https://golang.org/dl/) the appropriate version of Go for your system. Navigate to where it was downloaded then extract it to the `/usr/local` directory using this command: + +``` +sudo tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz +``` + +Next, add `/usr/local/go/bin` to the PATH environment variable inside your shell profile. Here's an example using bash: + +``` +echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc +``` + +{% hint style="info" %} +You may need to log out and log back in for this to take effect. +{% endhint %} + +And finally, follow the _Test your installation_ section in [Golang's official documentation](https://golang.org/doc/code.html#Testing) to ensure that Go installed correctly. + +## Part 5: Installing Wget + +{% hint style="info" %} +If you have issues installing or using Wget, read their [documentation](https://www.gnu.org/software/wget/manual/). +{% endhint %} + +To install Wget on Linux, simply run the `apt-get install wget` command in the terminal. diff --git a/contribute/build/mac.md b/contribute/build/mac.md new file mode 100644 index 00000000..75102958 --- /dev/null +++ b/contribute/build/mac.md @@ -0,0 +1,65 @@ +# Set up a macOS build environment + +As an open source product, we encourage users to edit our code and submit patches to it. This article explains how to set up a local environment on Mac so you can build your own copy of Portainer and test your changes. + +{% hint style="info" %} +We tested these instructions on macOS 10.14.3 (Mojave). +{% endhint %} + +## Dependencies + +* [Docker for Mac](https://www.docker.com/products/docker-desktop) installs the Docker application and other Docker tools. The latest version is not a requirement for this development stack, however we recommend staying up to date with the latest improvements and security fixes. +* [Yarn](https://yarnpkg.com/en/docs/install#mac-stable) is a package manager for installing new software packages on your system, and is used to run the Portainer development environment. +* [Node.JS](https://nodejs.org/en/download/) is a JavaScript package used when building applications that leverage networking, such as Portainer. Version 18 or later is required. +* ​[Golang](https://golang.org/dl/) is the open source language that we use to build the majority of Portainer software. Version 1.18 of Golang is required. +* Wget is a package used to retrieve files using common internet protocols such as HTTP and FTP. + +## Part 1: Installing Docker for macOS + +{% hint style="warning" %} +Docker for macOS requires OSX Mountain Lion or later or it will not work. Please check that you have the right version before you begin. +{% endhint %} + +### Step 1: Install Docker + +{% hint style="info" %} +We always recommend installing software using the most up-to-date instructions from the official vendor. This step is based on Docker's own [installation instructions for Docker on macOS](https://runnable.com/docker/install-docker-on-macos). +{% endhint %} + +[Download Docker](https://www.docker.com/products/docker-desktop) then navigate to the `Docker.dmg` file and double-click to open. Drag and drop Docker into your applications folder. Authorize the installation using your system password then wait for Docker to finish installing. + +To check that Docker installed successfully, double-click Docker inside your applications folder to start it. The whale icon should appear in your status bar, indicating Docker is running and accessible. + +### Step 2: Check the installed Docker version + +Click the Docker icon in the status bar then select **About Docker Desktop** from the menu (or a similarly named menu item, depending on your Docker version). A window should open, displaying the current version of Docker and its supporting software. + +## Part 2: Installing Yarn + +{% hint style="info" %} +This procedure uses the Homebrew package manager. Go [here](https://brew.sh/) to learn how install it. If you don't want to use Homebrew, Yarn provides [some alternatives](https://yarnpkg.com/en/docs/install#mac-stable). +{% endhint %} + +{% hint style="info" %} +If you have issues installing or using Yarn, read their [official documentation](https://yarnpkg.com/en/docs/install#mac-stable). +{% endhint %} + +Running `brew install yarn` in the macOS terminal will install Yarn. To confirm it installed successfully, run `yarn --version` in the macOS terminal. + +If successful, the current version of Yarn should print out in your terminal, indicating that it installed successfully and is running on your system. + +## Part 3: Installing or updating Node.JS + +{% hint style="info" %} +If you used Homebrew to install Yarn, Node.JS should have automatically installed alongside it. If not, you can install it by following the [Node.JS documentation](https://nodejs.org/en/download/). +{% endhint %} + +{% hint style="info" %} +If you have issues installing or updating Node.JS using Homebrew, read [Homebrew's troubleshooting guide](https://docs.brew.sh/Common-Issues). +{% endhint %} + +To check if Node.JS is installed on your system, run `node --version` in your terminal. The current version of Node.JS should print out. If the version is version 6 or later, updating it to the latest version is optional (but we recommend it because it's good practice to stay up to date). + +If you are running a version of Node.JS that is older than version 6, you must upgrade in order to run the Portainer development environment. + +If Homebrew was installed at the same time as Yarn (using Homebrew), follow these steps to update Node.JS: diff --git a/contribute/contribute.md b/contribute/contribute.md new file mode 100644 index 00000000..a38ed3a1 --- /dev/null +++ b/contribute/contribute.md @@ -0,0 +1,17 @@ +# Contribute + +## Reporting bugs + +If you find a bug, please tell us so we can triage it. All bugs are managed in this [GitHub repo](https://github.com/portainer/portainer/issues/new?assignees=\&labels=bug%2Fneed-confirmation%2C+kind%2Fbug\&template=Bug\_report.md\&title=). When you click through, our template makes it easy to record all of the details. Before you report a bug, please check our list of [open bugs](https://github.com/portainer/portainer/labels/kind%2Fbug) in case someone else has already reported it. + +[This knowledge base article](https://portal.portainer.io/knowledge/how-do-you-decide-which-bugs-and-features-to-work-on-first) covers how we prioritize bug fixes. + +## Feature requests + +You can request new features in this [GitHub repo](https://github.com/portainer/portainer/issues/new?assignees=\&labels=\&template=Feature\_request.md\&title=). We also publish a [list of open feature requests](https://github.com/portainer/portainer/issues?q=is%3Aissue+is%3Aopen+label%3Abug%2Fconfirmed) in GitHub. Check to see if someone has already requested the feature you want, and give it a thumbs up. + +Learn how we prioritize feature development [in this knowledge base article](https://portal.portainer.io/knowledge/how-do-you-decide-which-bugs-and-features-to-work-on-first). + +## Contributing to the Portainer CE codebase + +The Portainer CE codebase is available in [GitHub](https://github.com/portainer/portainer). Please follow our build instructions and [contribution guidelines](https://github.com/portainer/portainer/blob/develop/CONTRIBUTING.md) when making a contribution. diff --git a/faq/concepts.md b/faq/concepts.md new file mode 100644 index 00000000..73ba493f --- /dev/null +++ b/faq/concepts.md @@ -0,0 +1,5 @@ +# Portainer Concepts + +{% hint style="info" %} +This content has moved to the [Portainer Knowledge Base](https://portal.portainer.io/knowledge/getting-started). +{% endhint %} diff --git a/faq/contributing.md b/faq/contributing.md new file mode 100644 index 00000000..c5a8fa88 --- /dev/null +++ b/faq/contributing.md @@ -0,0 +1,5 @@ +# Contributing + +{% hint style="info" %} +This content has moved to the [Portainer Knowledge Base](https://portal.portainer.io/knowledge/contributing). +{% endhint %} diff --git a/faq/installing.md b/faq/installing.md new file mode 100644 index 00000000..83340d21 --- /dev/null +++ b/faq/installing.md @@ -0,0 +1,5 @@ +# Installing + +{% hint style="info" %} +This content has moved to the [Portainer Knowledge Base](https://portal.portainer.io/knowledge/installing). +{% endhint %} diff --git a/faq/troubleshooting.md b/faq/troubleshooting.md new file mode 100644 index 00000000..67d8cd15 --- /dev/null +++ b/faq/troubleshooting.md @@ -0,0 +1,5 @@ +# Troubleshooting + +{% hint style="info" %} +This content has moved to the [Portainer Knowledge Base](https://portal.portainer.io/knowledge/troubleshooting). +{% endhint %} diff --git a/faq/upgrading.md b/faq/upgrading.md new file mode 100644 index 00000000..17f76679 --- /dev/null +++ b/faq/upgrading.md @@ -0,0 +1,5 @@ +# Upgrading + +{% hint style="info" %} +This content has moved to the [Portainer Knowledge base](https://portal.portainer.io/knowledge/upgrading-and-downgrading). +{% endhint %} diff --git a/release-notes.md b/release-notes.md new file mode 100644 index 00000000..2e5e8eeb --- /dev/null +++ b/release-notes.md @@ -0,0 +1,1311 @@ +# Release Notes + +The following release notes are for the **Business Edition** of Portainer. For **Community Edition** release notes, refer to the [GitHub releases page](https://github.com/portainer/portainer/releases). + +## Release 2.17.0 + +February 7, 2023 + +### Breaking changes + +* For breaking changes in the API, please see the [REST API changes](release-notes.md#rest-api-changes) section +* The Kompose functionality in Kubernetes has been removed. Compose yaml can no longer be deployed on Kubernetes. +* Moved Edge Devices to the homepage view and removed Edge Devices menu option under Edge Compute +* Add devices button is temporarily located on the Edge Compute Settings page + +### Resolved CVEs + +#### Portainer dependencies + +* [SNYK-GOLANG-GITHUBCOMURFAVENEGRONI-1658297](https://security.snyk.io/vuln/SNYK-GOLANG-GITHUBCOMURFAVENEGRONI-1658297) - Negroni +* [CVE-2022-27191](https://nvd.nist.gov/vuln/detail/CVE-2022-27191) - golang.org/x/crypto/ssh in Go +* [GHSA-8c26-wmh5-6g9v](https://github.com/advisories/GHSA-8c26-wmh5-6g9v) - golang.org/x/crypto/ssh in Go +* [CVE-2022-27664](https://nvd.nist.gov/vuln/detail/CVE-2022-27664) - net/http in Go +* [CVE-2022-29526](https://nvd.nist.gov/vuln/detail/CVE-2022-29526) - Go +* [SNYK-JS-XMLDOMXMLDOM-3092934](https://security.snyk.io/vuln/SNYK-JS-XMLDOMXMLDOM-3092934) - javascript +* [CVE-2022-23806](https://nvd.nist.gov/vuln/detail/CVE-2022-23806) - kompose +* [CVE-2022-41720](https://nvd.nist.gov/vuln/detail/CVE-2022-41720) - kompose +* [CVE-2022-41716](https://nvd.nist.gov/vuln/detail/CVE-2022-41716) - kompose +* [CVE-2022-41715](https://nvd.nist.gov/vuln/detail/CVE-2022-41715) - kompose +* [CVE-2022-32189](https://nvd.nist.gov/vuln/detail/CVE-2022-32189) - kompose +* [CVE-2022-30635](https://nvd.nist.gov/vuln/detail/CVE-2022-30635) - kompose +* [CVE-2022-30634](https://nvd.nist.gov/vuln/detail/CVE-2022-30634) - kompose +* [CVE-2022-30633](https://nvd.nist.gov/vuln/detail/CVE-2022-30633) - kompose +* [CVE-2022-30632](https://nvd.nist.gov/vuln/detail/CVE-2022-30632) - kompose +* [CVE-2022-30631](https://nvd.nist.gov/vuln/detail/CVE-2022-30631) - kompose +* [CVE-2022-30630](https://nvd.nist.gov/vuln/detail/CVE-2022-30630) - kompose +* [CVE-2022-30580](https://nvd.nist.gov/vuln/detail/CVE-2022-30580) - kompose +* [CVE-2022-29804](https://nvd.nist.gov/vuln/detail/CVE-2022-29804) - kompose +* [CVE-2022-2880](https://nvd.nist.gov/vuln/detail/CVE-2022-2880) - kompose +* [CVE-2022-2879](https://nvd.nist.gov/vuln/detail/CVE-2022-2879) - kompose +* [CVE-2022-28327](https://nvd.nist.gov/vuln/detail/CVE-2022-28327) - kompose +* [CVE-2022-28131](https://nvd.nist.gov/vuln/detail/CVE-2022-28131) - kompose +* [CVE-2022-27664](https://nvd.nist.gov/vuln/detail/CVE-2022-27664) - kompose +* [CVE-2022-24921](https://nvd.nist.gov/vuln/detail/CVE-2022-24921) - kompose +* [CVE-2022-24675](https://nvd.nist.gov/vuln/detail/CVE-2022-24675) - kompose +* [CVE-2022-23772](https://nvd.nist.gov/vuln/detail/CVE-2022-23772) - kompose +* [CVE-2021-44716](https://nvd.nist.gov/vuln/detail/CVE-2021-44716) - kompose +* [CVE-2021-41772](https://nvd.nist.gov/vuln/detail/CVE-2021-41772) - kompose +* [CVE-2021-41771](https://nvd.nist.gov/vuln/detail/CVE-2021-41771) - kompose +* [CVE-2021-39293](https://nvd.nist.gov/vuln/detail/CVE-2021-39293) - kompose +* [CVE-2021-33198](https://nvd.nist.gov/vuln/detail/CVE-2021-33198) - kompose +* [CVE-2021-33196](https://nvd.nist.gov/vuln/detail/CVE-2021-33196) - kompose +* [CVE-2021-33195](https://nvd.nist.gov/vuln/detail/CVE-2021-33195) - kompose +* [CVE-2021-27918](https://nvd.nist.gov/vuln/detail/CVE-2021-27918) - kompose +* [CVE-2020-16845](https://nvd.nist.gov/vuln/detail/CVE-2020-16845) - kompose +* [CVE-2022-41717](https://nvd.nist.gov/vuln/detail/CVE-2022-41717) - kompose +* [CVE-2022-32148](https://nvd.nist.gov/vuln/detail/CVE-2022-32148) - kompose +* [CVE-2022-29526](https://nvd.nist.gov/vuln/detail/CVE-2022-29526) - kompose +* [CVE-2022-1962](https://nvd.nist.gov/vuln/detail/CVE-2022-1962) - kompose +* [CVE-2022-1705](https://nvd.nist.gov/vuln/detail/CVE-2022-1705) - kompose +* [CVE-2021-44717](https://nvd.nist.gov/vuln/detail/CVE-2021-44717) - kompose +* [CVE-2021-36221](https://nvd.nist.gov/vuln/detail/CVE-2021-36221) - kompose +* [CVE-2021-34558](https://nvd.nist.gov/vuln/detail/CVE-2021-34558) - kompose +* [CVE-2021-33197](https://nvd.nist.gov/vuln/detail/CVE-2021-33197) - kompose +* [CVE-2021-31525](https://nvd.nist.gov/vuln/detail/CVE-2021-31525) - kompose +* [CVE-2021-3114](https://nvd.nist.gov/vuln/detail/CVE-2021-3114) - kompose +* [CVE-2020-24553](https://nvd.nist.gov/vuln/detail/CVE-2020-24553) - kompose +* [CVE-2020-15586](https://nvd.nist.gov/vuln/detail/CVE-2020-15586) - kompose +* [CVE-2020-14039](https://nvd.nist.gov/vuln/detail/CVE-2020-14039) - kompose +* [CVE-2022-30629](https://nvd.nist.gov/vuln/detail/CVE-2022-30629) - kompose + +#### Agent dependencies + +* [CVE-2022-27664](https://nvd.nist.gov/vuln/detail/CVE-2022-27664) - net/http in Go + +### Upgrade notice + +* This release has added the ability to upgrade Edge Agents from Portainer when running on Docker Standalone. Before using this feature we strongly advise to test this on a non-production environment first and have an alternative method available to connect to the Edge Device. + +### Edge + +* Introduced the ability to remotely update edge agents from within Portainer +* Moved Edge Devices to the homepage view: [portainer/portainer#8333](https://github.com/portainer/portainer/issues/8333) +* Introduced the ability to browse snapshots of async edge environments from homepage view: [portainer/portainer#8336](https://github.com/portainer/portainer/issues/8336) +* Optimized performance for scaling large numbers of edge agents: [portainer/portainer#8349](https://github.com/portainer/portainer/issues/8349) +* Introduced option for pre-pull of images for edge stack deployment to increase deployment success rate +* Added edge group support in edge jobs to allow execution across many devices +* Introduce the ability to edit edge agent tunnel URL and API server URL from within Portainer +* Introduced improved environment tile layout to address consistency when edge devices moved to homepage: [portainer/portainer#8334](https://github.com/portainer/portainer/issues/8334) +* Clarified UX around polling intervals and poll frequency option in edge compute settings between async and normal edge agents. +* Added info text to waiting room view +* Fixed issue where edge stack incorrectly deployed to default namespace when there is a specified namespace defined in the manifest: [portainer/portainer#8346](https://github.com/portainer/portainer/issues/8346) +* Fixed issue where select all checkbox is missing for edge stack and edge job tables: [portainer/portainer#8029](https://github.com/portainer/portainer/issues/8029) +* Fixed issue with Edge device tags not showing on Create Edge Group screen: [portainer/portainer#7936](https://github.com/portainer/portainer/issues/7936) +* Fixed issue where delete edge device does not remove it from the edge groups mapping: [portainer/portainer#8348](https://github.com/portainer/portainer/issues/8348) +* Fixed issue where edge stack failed to deploy with private registry in async mode +* Fixed issue where actions icon under edit edge stack page is not consistent + +### Kubernetes + +* Introduced new log viewer to Portainer Business Edition +* Introduced the ability to edit the YAML manifest of Kubernetes objects and apply the changes via the Kubernetes patch function +* Introduced global and cluster-level options to allow enforcing of code-based deployment of Kubernetes objects, preventing the use of Portainer forms and other less easy-to-repeat workflows +* Introduced a new setting in the Cluster setup screen of a Kubernetes environment to allow enforcing of admin-only deploying of ingresses +* Introduced the ability to specify updates to existing environment variables of a deployment via query string parameters on the Kubernetes application redeploy webhook +* Added a rolling restart button to the Kube application UI +* Introduced a new rollout-restart parameter to Kube application redeploy webhooks to allow remote initiating of zero-downtime deployment rolling restarts +* Introduced an alternate means of authenticating connections to the Google Cloud platform (used by our KaaS provisioning of Google Kubernetes Engine environments), following their deprecation of the gcp auth plugin in Kubernetes v1.22 and removal in v1.26 +* Introduced experimental Kubernetes functionality (behind a feature flag) to allow installing of MicroK8s to existing machines +* The Kubernetes deployment option for docker-compose format manifests and the Kompose conversion tool that enabled this have now been removed due to long-standing Common Vulnerabilities and Exposures (CVEs) in Kompose: [portainer/portainer#8355](https://github.com/portainer/portainer/issues/8355) +* Improved the explanatory tooltips and info text for Kube application automatic updates functionality: [portainer/portainer#8223](https://github.com/portainer/portainer/issues/8223) +* Updated Kubernetes as a Service (KaaS) cluster provisioning to use the latest eksctl tool for the AWS EKS platform, and support up to v1.23 of Kubernetes (use of this version was previously failing) +* Resolved an issue where Kubernetes secrets were no longer shown in an expand panel for each application listed in the Applications list screen: [portainer/portainer#8118](https://github.com/portainer/portainer/issues/8118) +* Improved config setting defaults when connecting clusters: ingress controllers (with a class) are auto detected/set as allowed, metrics API features setting is on (if metrics server is deployed), and storage classes with the 'default' annotation are on: [portainer/portainer#8240](https://github.com/portainer/portainer/issues/8240) +* The Kubernetes Operator role is not intended to have secrets update permission and hence, as a security consideration, this permission is now removed from Portainer +* Corrected the look of the fallback icon used for Helm charts that don't have their own icon: [portainer/portainer#8116](https://github.com/portainer/portainer/issues/8116) +* Made a change to default the resource quota's resource assignment setting to off for new Kubernetes namespaces but always show the toggle (although it can be disabled for change if the cluster's (BE only) allow over-commit setting is off): [portainer/portainer#8122](https://github.com/portainer/portainer/issues/8122) +* In the Kubernetes Add ingress screen, corrected the namespace selection dropdown to only show those that the user has access to: [portainer/portainer#8150](https://github.com/portainer/portainer/issues/8150) +* Added a check in Kube Cluster setup and Namespace -> Manage access to see if Kube RBAC addon is enabled in the cluster, and if not, show a warning that Portainer RBAC functionality will be limited. Warning also gives info on enabling RBAC in the cluster: [portainer/portainer#8171](https://github.com/portainer/portainer/issues/8171) +* Resolved an issue that was causing an 'Unable to get k8s environment access' error on deleting of a Kubernetes edge environment +* When connecting a Kubernetes environment to Portainer via kubeconfig import, stop deleting of any extant 'portainer' namespace in the cluster +* When using Kubernetes (KaaS) cluster provisioning and choosing the Azure Kubernetes Service (AKS) option, only node size options that are valid for provisioning now show. Previously, there was at least one option which gave an error on use +* Resolved two scenarios where importing of the kubeconfig of a Kubernetes cluster raised an error that caused a stuck 'Deploying' status +* In Kube Create namespace and Namespace details screens, made the resource assignment toggle always visible - even when the cluster's resource over-commit option is off (when it will show but be disabled for change) +* Fixed an issue introduced in 2.16, where deploying of an ingress via the Portainer Add ingress form does not label the ingress object in the cluster with a Portainer 'internal' deployment label. Any deployment of ingress via Portainer should have this: [portainer/portainer#8337](https://github.com/portainer/portainer/issues/8337) +* Fixed an issue introduced in 2.16, where, when attaching a ConfigMap to an application being deployed via the Portainer Add application form, the ConfigMap is wrongly included as a Secret in the manifest and the deployment could therefore fail: [portainer/portainer#8323](https://github.com/portainer/portainer/issues/8323) +* Fixed an incorrect mention in the UI of a 'docker-compose file' which was showing when editing a Kube application deployed from git: [portainer/portainer#8228](https://github.com/portainer/portainer/issues/8228) +* Fixed an issue preventing adding of a Helm repo that has a redirect: [portainer/portainer#7892](https://github.com/portainer/portainer/issues/7892) +* Fixed an issue where the kubectl shell does not work when Istio Proxy is installed in the cluster: [portainer/portainer#8321](https://github.com/portainer/portainer/issues/8321) +* Fixed an issue introduced in 2.16 where the Kube Create namespace screen's CPU and Memory resource allocation max limits did not have other namespaces' resource amounts subtracted when the cluster's allow resource over-commit option was turned off + +### Docker + +* Introduced support of relative paths for volumes when creating a Docker Standalone or Swarm stack that uses a git repository. Support in edge stacks is excluded at present: [portainer/portainer#6390](https://github.com/portainer/portainer/issues/6390) +* Introduced new log viewer to Portainer Business Edition +* Introduced pull image param for stack webhook to turn pull-image on and off +* Introduced 24 hour caching for new image notification +* Upgraded docker compose to v2.13.0: [portainer/portainer#8289](https://github.com/portainer/portainer/issues/8289) +* Provided clarification and rewording in the UI around the 'Pull latest image' toggle in Stacks, Swarm Services and Service details update and Container recreate: [portainer/portainer#8226](https://github.com/portainer/portainer/issues/8226) +* Updated embedded docker binaries in Portainer and agent from 20.10.13 to 20.10.18: [portainer/portainer#8290](https://github.com/portainer/portainer/issues/8290) +* Fixed issue of not been able to associate stack created from other docker environments: [portainer/portainer#8030](https://github.com/portainer/portainer/issues/8030) +* Fixed issue where content overlap edge of screen and left column becomes too narrow: [portainer/portainer#8161](https://github.com/portainer/portainer/issues/8161) +* Fixed issue where default option for access control is not selected when editing public resource: [portainer/portainer#8162](https://github.com/portainer/portainer/issues/8162) +* Fixed incorrect wording for private box selector under user access control: [portainer/portainer#7969](https://github.com/portainer/portainer/issues/7969) +* Fixed issue where text input jumps to the end of the input box in repository form: [portainer/portainer#8214](https://github.com/portainer/portainer/issues/8214) +* Fixed issue where scrollbar always visible in web editor form regardless contents of web editor: [portainer/portainer#7968](https://github.com/portainer/portainer/issues/7968) +* Fixed issue where number of stopped container does not display in dashboard correctly: [portainer/portainer#7925](https://github.com/portainer/portainer/issues/7925) +* Fixed an issue where deleting a network, config or secret did not show a confirmation warning modal: [portainer/portainer#7920](https://github.com/portainer/portainer/issues/7920) +* Fixed an issue where a user cannot upload a stack file as a custom template: [portainer/portainer#7921](https://github.com/portainer/portainer/issues/7921) +* Fixed an issue where the old-style UI was still being used in a Docker template-related page: [portainer/portainer#7950](https://github.com/portainer/portainer/issues/7950) +* Fixed issue where container webhook URL always changed on each recreation +* Fixed issue where new image notification only relies on checking first digest which is not always accurate: [portainer/portainer#7148](https://github.com/portainer/portainer/issues/7148) + +### Portainer + +* Introduced support for S3 compatible hosts for backup and restore: [portainer/portainer#6555](https://github.com/portainer/portainer/issues/6555) +* Introduced support for GitHub container registry as a registry type +* On the header context sensitive help icon, the red dot notification has been removed. This was put there to highlight the new feature in 2.16: [portainer/portainer#8167](https://github.com/portainer/portainer/issues/8167) +* Updated Portainer dependencies of Business Edition +* Upgraded version of golang.org/x/net from v0.0.0 to v0.1.0 for agent: [portainer/portainer#8073](https://github.com/portainer/portainer/issues/8073) +* Upgraded jwt version to 4.4.2: [portainer/portainer#7970](https://github.com/portainer/portainer/issues/7970) +* Improved Portainer tooltips to allow them to stay open long enough for clicking of links and selecting of text in them. Also left-justified them for better readability: [portainer/portainer#8224](https://github.com/portainer/portainer/issues/8224) +* Resolved an issue related to revoking of user permissions: [portainer/portainer#8338](https://github.com/portainer/portainer/issues/8338) +* Fixed issue where password could be leaked to the log files when errors occur: [portainer/portainer#8343](https://github.com/portainer/portainer/issues/8343) +* Fixed issue when navigating to the login page log as a unique visitor in Matomo: [portainer/portainer#8344](https://github.com/portainer/portainer/issues/8344) +* Fixed an svg attribute height error in the page (visible via the browser console): [portainer/portainer#8105](https://github.com/portainer/portainer/issues/8105) +* Fixed typo where "occured" is used in error message instead of "occurred": [portainer/portainer#8027](https://github.com/portainer/portainer/issues/8027) +* Fixed issue where long notification is pushed out of table making it hard to read: [portainer/portainer#8215](https://github.com/portainer/portainer/issues/8215) +* Fixed incorrect link for other settings and agent setup: [portainer/portainer#8347](https://github.com/portainer/portainer/issues/8347) +* Fixed issue where deleted environment does not clear in table and sidebar when deleting current selected environment: [portainer/portainer#8291](https://github.com/portainer/portainer/issues/8291) +* Fixed issue where standard users were not able to change ownership to their own team: [portainer/portainer#8216](https://github.com/portainer/portainer/issues/8216) +* Fixed issue where user encountered an error by deleting tags associated to deleted environments: [portainer/portainer#8089](https://github.com/portainer/portainer/issues/8089) +* Fixed an issue where the 'hide for all users' button styling behaves differently in dark mode: [portainer/portainer#7926](https://github.com/portainer/portainer/issues/7926) +* Fixed a minor issue where the pages and items per page elements in data table pagination controls did not quite vertically align with each other: [portainer/portainer#8227](https://github.com/portainer/portainer/issues/8227) +* Fixed issue where team lead feature is unexpectedly enabled when external authentication is enabled with team sync: [portainer/portainer#7972](https://github.com/portainer/portainer/issues/7972) +* Fixed issue where response from API when creating edge environments wasn't clearly specifying that URL is compulsory: [portainer/portainer#7997](https://github.com/portainer/portainer/issues/7997) +* Fixed issue where internal authentication setting is not saved when switch from other authentication method without refreshing browser manually: [portainer/portainer#8028](https://github.com/portainer/portainer/issues/8028) +* Fixed issue where admin users are not able to delete expired or revoked license +* Fixed issue where user unable to remove group configuration with active directory authentication: [portainer/portainer#7558](https://github.com/portainer/portainer/issues/7558) +* Fixed issue where user is not removed from team when removed from LDAP group + +### Nomad + +* Fixed issue around task logs not loading if they are empty +* Fixed issue where old UI components were still being used for Nomad related pages + +### Development + +* Replaced Feather svg icon set with Lucide, a Feather fork that is actively maintained and has a larger and improved range of icons: [portainer/portainer#8121](https://github.com/portainer/portainer/issues/8121) +* Removed Font Awesome and all remaining references to it. All icons are now svg-based: [portainer/portainer#8120](https://github.com/portainer/portainer/issues/8120) +* Redesigned Portainer database migration versioning to improve the robustness of the upgrade process: [portainer/portainer#8153](https://github.com/portainer/portainer/issues/8153) +* Replaced aws-sdk-go with aws-sdk-go-v2 +* Fixed issue where random number generator is not seeded causing predictable outputs: [portainer/portainer#8342](https://github.com/portainer/portainer/issues/8342) +* Resolved issues building Portainer (caused by third-party deletion of the github.com/rkl-/digest package) by replacing the package with imported code. This provides HTTP Digest Authentication for Portainer's FIDO Device Onboard (FDO) protocol support: [portainer/portainer#8177](https://github.com/portainer/portainer/issues/8177) +* Corrected a minor UI issue around a corrupted file-code.svg icon: [portainer/portainer#8117](https://github.com/portainer/portainer/issues/8117) +* Removed the Go experimental module golang.org/x/exp, replacing the small amount of functionality that we use from it with direct code: [portainer/portainer#8176](https://github.com/portainer/portainer/issues/8176) +* Deprecated the github.com/portainer/libhelm Helm wrapper and moved the code into CE, since EE can now share from CE. This is used by Portainer's Helm functionality: [portainer/portainer#8178](https://github.com/portainer/portainer/issues/8178) +* Fixed issue where struct tag is malformed with incorrect blank space in template\_file.go: [portainer/portainer#7923](https://github.com/portainer/portainer/issues/7923) +* (swagger) fix licenses attach route + +### REST API changes + +#### New Endpoints + +* GET `/docker/{environmentId}/containers/{containerID}/image_status` +* GET `/docker/{environmentId}/services/{serviceID}/image_status` +* GET `/docker/{environmentId}/stacks/{id}/images_status` +* GET `/kubernetes/{id}/namespaces/{namespace}/applications` +* GET `/kubernetes/{id}/namespaces/{namespace}/applications/{kind}/{name}` +* GET `/kubernetes/{id}/rbac_enabled` +* GET `/nomad/endpoints/{endpointID}/leader` +* GET `/system/info` +* GET `/system/nodes` +* GET `/system/status` +* POST `/system/upgrade` +* GET `/system/version` +* PUT `/webhooks/{id}/reassign` + +#### Deleted Endpoints + +* GET `/nomad/endpoints/{endpointID}/status` + +#### Deprecated Endpoints + +* GET `/status` - Deprecated: use the `/system/status` endpoint instead to retrieve the Portainer status. +* GET `/status/nodes` - Deprecated: use the `/system/nodes` endpoint instead. +* GET `/status/version` - Deprecated: use the `/system/version` endpoint instead to check if portainer has an update available. + +#### Modified Endpoints + +* POST `/backup/s3/execute` +* POST `/backup/s3/restore` +* POST `/backup/s3/settings` +* POST `/edge_jobs` +* POST `/edge_jobs/{id}` +* POST `/edge_stacks` +* PUT `/edge_stacks/{id}` +* POST `/edge_update_schedules` +* GET `/edge_update_schedules/active` +* PUT `/endpoints/{id}` +* PUT `/endpoints/{id}/settings` +* POST `/registries` +* PUT `/registries/{id}` +* PUT `/settings` +* POST `/stacks` + +`` + +## Release 2.16.2 + +November 21, 2022 + +### Edge + +* Fixed issue where the Git repository section is missing when creating an Edge Stack via the Git repository option. [portainer/portainer#8072](https://github.com/portainer/portainer/issues/8072) + +### Portainer + +* Fixed issue where the effective viewer is not showing the correct user access role of environments they have access to. [portainer/portainer#8070](https://github.com/portainer/portainer/issues/8070) + + + +## Release 2.16.1 + +November 9, 2022 + +### Kubernetes + +* Fixed an issue with view/edit of an external application (i.e. one originally added to the cluster outside of Portainer) where a 'cannot read properties' error was shown. +* Fixed an issue with view/edit of Kubernetes namespaces where memory and CPU resource limit sliders were positioned incorrectly and erroneous warnings were shown. + +### Docker + +* Fixed issue of update stack button being disabled when updating an existing stack. + +### Portainer + +* Fixed license key issue where node counts were not updated when environments are deleted. +* Fixed issue with JSON formatted logs failing in 2.16.0. + + + +## Release 2.16.0 + +October 31, 2022 + +### Deprecation notice + +* Proposing to deprecate ACI (Azure Container Instances) and remove the functionality to connect to ACI, view existing containers and deploy new containers. + +### Upgrade notice + +* `portainer/portainer:latest` moved to `portainer/portainer:2.16`. + +### React migration + +* Migrated from Angular to React: Tag selector for Environment Details view. +* Migrated from Angular to React: Teams view. + +### Kubernetes + +* When upgrading to 2.16, if you already have ingress controllers in a Kubernetes cluster/environment linked to Portainer and used Portainer to set them at the cluster and namespace level, and if these ingress controllers were not used by any ingresses, after the upgrade, you may end up with dummy ingresses visible in the new Ingresses screen in Portainer (that are not actually used for any deployment). This is simply an artifact of how we retained information about ingress controllers in earlier Portainer releases. If you find these kinds of dummy ingresses, you can safely delete them. +* Introduced the ability to auto-detect ingress classes in the environment. [portainer/portainer#7827](https://github.com/portainer/portainer/issues/7827) +* Added an Ingress menu option in the sidebar that lists all Ingresses in the cluster. [portainer/portainer#7839](https://github.com/portainer/portainer/issues/7839) +* Introduced the ability to set the type of a Kubernetes secret (e.g. TLS or a user-defined/custom type). Existing secrets were previously always of type Opaque (which remains the default). [portainer/portainer#7842](https://github.com/portainer/portainer/issues/7842) +* Improved ingress options on the cluster setup page, allowing admins to define ingresses without assigning them to a namespace. [portainer/portainer#7832](https://github.com/portainer/portainer/issues/7832) +* Introduce TLS and HTTPS support for ingresses. [portainer/portainer#7843](https://github.com/portainer/portainer/issues/7843) +* Moved the Ingress management from the Application details page to a new Ingress section. [portainer/portainer#7828](https://github.com/portainer/portainer/issues/7828) +* Resolved an issue when OAuth is in use and Kubernetes updates are deployed via manifest from git. The user email address used in labels/annotations for Kube objects now has disallowed characters (such as the at symbol) replaced with a dot (period symbol). [portainer/portainer#7720](https://github.com/portainer/portainer/issues/7720) +* The Homepage's kubeconfig download dialog now only includes those environments that show on the Homepage. Those with a connection error or provisioning error (these states were introduced in recent releases) are now excluded. +* Resolved an issue where Node stats would not work for Google Kubernetes Engine (GKE) clusters. [portainer/portainer#7668](https://github.com/portainer/portainer/issues/7668) +* Fixed the issue of missing Kubernetes definition for Kubernetes application deployment in the swagger API documentation. [portainer/portainer#7741](https://github.com/portainer/portainer/issues/7741) +* Fixed issue with deploying custom templates on Kubernetes that are using mustache variables. + +### Docker + +* Updated the Compose version to 2.10.2. [portainer/portainer#7838](https://github.com/portainer/portainer/issues/7838) +* Added support for shared memory when creating or editing a container by allowing to set --shm-size from portainer. [portainer/portainer#4992](https://github.com/portainer/portainer/issues/4992) +* Introduced support for uploading of local files to be included in a Docker image when using Portainer to build an image. [portainer/portainer#7796](https://github.com/portainer/portainer/issues/7796) +* Set notification of new image for docker default to off. +* Introduced a setting to turn on/off per host showing of out-of-date image indicators. [portainer/portainer#7219](https://github.com/portainer/portainer/issues/7219) +* Resolved an issue in Docker Services, Containers, and Stacks, where loading of the recently added out-of-date image indicator delayed showing of a row's action icons. +* Added information for rebuilding images from stacks on docker standalone environments. [portainer/portainer#7829](https://github.com/portainer/portainer/issues/7829) +* Added information to the build image from the URL page, including a link to additional documentation. [portainer/portainer#7771](https://github.com/portainer/portainer/issues/7771) +* Fixed an issue where environment variables for stacks could not be set to empty. [portainer/portainer#7780](https://github.com/portainer/portainer/issues/7780) +* Fixed an issue where assigning user access to a stack, showed users that don't have access to the Environment. [portainer/portainer#7695](https://github.com/portainer/portainer/issues/7695) +* Fixed the issue of missing agent deployment script for the docker standalone environment. [portainer/portainer#7757](https://github.com/portainer/portainer/issues/7757) +* Fixed the issue of the misconfigured stack being saved and subsequently can not be deleted. [portainer/portainer#7798](https://github.com/portainer/portainer/issues/7798) +* Fixed an issue where the Swarm secret values incorrectly were being trimmed. [portainer/portainer#7772](https://github.com/portainer/portainer/issues/7772) +* Fixed the issue where the container webhook toggle was not being saved. +* Fixed an issue where the Docker API section in the add environment wizard incorrectly was showing the docker.sock code block. [portainer/portainer#7650](https://github.com/portainer/portainer/issues/7650) +* Fixed an issue where a console error was showing for GPU when using Swarm because GPU is not supported on Swarm. +* Fixed an issue where renaming a deployed container resulted in an error. [portainer/portainer#7778](https://github.com/portainer/portainer/issues/7778) +* Fixed an issue where the image pull limits weren't being shown for standard users. +* Fixed error message when adding new docker environments with invalid CA certs for TLS. [portainer/portainer#7934](https://github.com/portainer/portainer/issues/7934) +* Adjusted the "remove" buttons as per the UI guidelines that were introduced in the 2.15 release. [portainer/portainer#7739](https://github.com/portainer/portainer/issues/7739) + +### Gitops + +* Introduced the offering of auto-suggestions retrieved from the git repo when entering the Compose path. +* Added the ability to store git credentials in user settings. + +### Portainer + +* Introduced a new section that shows past toaster notifications, which are stored in the browser's local storage. [portainer/portainer#7756](https://github.com/portainer/portainer/issues/7756) +* Introduced a context sensitive help button that links to the relevant documentation based on the current page. [portainer/portainer#7744](https://github.com/portainer/portainer/issues/7744) +* Introduced login screen banner to the login page. +* Added banner for "new version available" in portainer business edition. +* Updated dependencies of PCIDB/GHW for the portainer agent. [portainer/portainer#7705](https://github.com/portainer/portainer/issues/7705) +* Updated version of chart.js to 2.9.4 and moment to 2.29.4. [portainer/portainer#7681](https://github.com/portainer/portainer/issues/7681) +* Update golang and image dependencies for API and portainer binary ( EE ). +* Updated binary version for docker-compose and helm (to v3.9.3). [portainer/portainer#7704](https://github.com/portainer/portainer/issues/7704) +* Updated the agent library dependencies. [portainer/portainer#7420](https://github.com/portainer/portainer/issues/7420) +* Fixed an issue where the Microsoft OAuth information was not being retrieved correctly when editing the settings. +* Fixed select all behavior in environments page. +* Fixed the issue of handling images built by buildx or buildkit in the registry browser. +* Fixed an issue where the browser tab title did not update with the actually selected environment. [portainer/portainer#7651](https://github.com/portainer/portainer/issues/7651) +* Fixed issue with text color and text background color on auto-filled text. +* Fixed issue where the dropdown menu has incorrect background color in dark mode. [portainer/portainer#7678](https://github.com/portainer/portainer/issues/7678) +* Fixed styling issues in the Runtime & Resources tab. [portainer/portainer#7779](https://github.com/portainer/portainer/issues/7779) +* Fixed an issue where the new styling wasn't being applied to links. [portainer/portainer#7740](https://github.com/portainer/portainer/issues/7740) +* Adjusted the warning text color as per the UI guidelines that were introduced in the 2.15 release. [portainer/portainer#7667](https://github.com/portainer/portainer/issues/7667) +* Introduced UI info components while browsing snapshots. + +### Edge + +* Introduced the ability to run remote commands on edge environments connected via Async using mTLS. +* Introduced UI info components while browsing snapshots. + +### Nomad + +* Fixed issue around Home page loading time when you have Nomad environments connected. +* Removed extension validation from compose path field. [portainer/portainer#7652](https://github.com/portainer/portainer/issues/7652) +* Fixed an issue where the Group and Tag could not be set for Nomad environments when adding it via the wizard. [portainer/portainer#7703](https://github.com/portainer/portainer/issues/7703) +* Fixed an issue where Nomad system jobs would prevent other jobs from being shown. [portainer/portainer#7229](https://github.com/portainer/portainer/issues/7229) + +### Development + +* Improved unit tests by using T.TempDir to create a temporary test directory. [portainer/portainer#7675](https://github.com/portainer/portainer/issues/7675) +* Replaced the logrus logging framework with Zerolog. [portainer/portainer#7935](https://github.com/portainer/portainer/issues/7935) +* Fixed an issue where new installations that use the develop branch didn't apply the analytics setting correctly. [portainer/portainer#7584](https://github.com/portainer/portainer/issues/7584) + + + +## Release 2.15.1 + +September 16, 2022 + +### Docker + +* Fixed an issue with connecting to the local Docker environment when using Windows Container Services. [portainer/portainer#7618](https://github.com/portainer/portainer/issues/7618) +* Fixed an issue where the build image button would stay inactive when using a tar file. [portainer/portainer#7624](https://github.com/portainer/portainer/issues/7624) + +### Portainer + +* Fixed an issue where some colors in dark mode appeared too brown. [portainer/portainer#7616](https://github.com/portainer/portainer/issues/7616) +* Fixed an issue when using leading or trailing spaces in a password would break the login process. [portainer/portainer#7621](https://github.com/portainer/portainer/issues/7621) + + + +## Release 2.15.0 + +September 6, 2022 + +### Deprecation notice + +* Proposing to deprecate Kompose and remove the functionality to deploy compose yaml on Kubernetes. [portainer/portainer#7514](https://github.com/portainer/portainer/issues/7514) + +### Breaking changes + +* Breaking change in API where the endpoint filter `edgeDeviceFilter` has been replaced by `edgeDevice` and `edgeDeviceUntrusted`. + +### Browser cache + +* Improved caching to prepare a resolution for an issue where certain browsers need a manual browser refresh for new version assets to load. The change only takes effect for upgrades subsequent to migration to 2.15. [portainer/portainer#7443](https://github.com/portainer/portainer/issues/7443) + +### React migration + +* Migrated docker/containers/list views to React. +* Migrated the Docker console. +* Migrated Azure Container Instances views to React. +* Migrated the sidebar menu and adjusted the Settings page. +* Migrated the Kubectl shell window. +* Migrated tooltip into react component. +* Migrated page header into React component. + +### Kubernetes + +* Introduced the ability to define pod security constraints per Kubernetes cluster. +* Introduced an option to forcibly remove a Kubernetes namespace that's in a 'Terminating' state. [portainer/portainer#4580](https://github.com/portainer/portainer/issues/4580) +* Improved the kubeconfig download dialog by providing pagination (including choosing of the number of items per page), an option to 'select all in page' and selection across multiple pages. [portainer/portainer#7261](https://github.com/portainer/portainer/issues/7261) +* Resolved an issue where the link shown for an application that is exposed via an ingress was including an incorrect port (the servicePort). [portainer/portainer#7337](https://github.com/portainer/portainer/issues/7337) +* Resolved some errors and wording issues in recent KaaS cluster provisioning and import kubeconfig functionality. +* When using Kubernetes (KaaS) cluster provisioning and choosing the DigitalOcean option, only node size options that are valid for provisioning now show. Previously, there was at least one option which gave an 'invalid droplet size' error on use. + +### Docker + +* Added GPU support to Docker containers. [portainer/portainer#3143](https://github.com/portainer/portainer/issues/3143) +* Introduced the ability to disable use of the anonymous Docker Hub registry option via the Portainer UI for all users. +* Added support to read value from .env in subfolder for git deployment in Docker Standalone Environment. [portainer/portainer#7265](https://github.com/portainer/portainer/issues/7265) +* Added message explaining that changed env values only take effect after redeployment or auto update via webhook. [portainer/portainer#7242](https://github.com/portainer/portainer/issues/7242) +* Provided prune option for stack deployment from Git. [portainer/portainer#7224](https://github.com/portainer/portainer/issues/7224) +* Removed "Show Container Template" toggle on App templates page and introduced filter and sort by dropdown options. [portainer/portainer#7394](https://github.com/portainer/portainer/issues/7394) +* Fixed recreate of container so it pulls the image using the SHA256 hash if its tag no longer exists, and if the image is still inaccessible (as it no longer exists or the tag or name is now incorrect) warn the user and disable 'Pull latest image' option. [portainer/portainer#6566](https://github.com/portainer/portainer/issues/6566) +* Introduced support for checking images held in private registries to the recently added functionality that shows a visual image indication on stacks, services and containers that are running with an out-of-date image. +* Introduced improved validation to the Docker build image function, to prevent invalid image names. [portainer/portainer#7463](https://github.com/portainer/portainer/issues/7463) +* Fixed host info being sent when host management feature is turned off. [portainer/portainer#7277](https://github.com/portainer/portainer/issues/7277) +* Following the introduction of v2 Docker Compose, changed any front-end wording that mentions 'docker-compose' to say 'docker compose', to clarify and bring in line with official documentation. [portainer/portainer#7141](https://github.com/portainer/portainer/issues/7141) + +### Portainer + +* Introduced license enforcement for 5 nodes free in business edition. +* Introduced new styling for Portainer. [portainer/portainer#7528](https://github.com/portainer/portainer/issues/7528) +* Introduced Portainer UI redesign with changes for common configuration pages. [portainer/portainer#7527](https://github.com/portainer/portainer/issues/7527) +* Included build information in Portainer for easier debug. [portainer/portainer#7317](https://github.com/portainer/portainer/issues/7317) +* Introduced the ability to show/hide the password you are entering on login. [portainer/portainer#7461](https://github.com/portainer/portainer/issues/7461) +* Introduced CTRL+F (or CMD+F on MacOS) to search in web editors. [portainer/portainer#6537](https://github.com/portainer/portainer/issues/6537) +* Introduced the ability to filter connection type and agent version on the home page. [portainer/portainer#7468](https://github.com/portainer/portainer/issues/7468) +* Improved environment address entry to handle http:// or https:// prefixes when adding an environment via Docker or Kubernetes (agent) options. [portainer/portainer#7462](https://github.com/portainer/portainer/issues/7462) +* Introduced a change to the Homepage's multi-select filters to keep the dropdown open after a single selection until the user closes it themselves, or the last remaining option is selected. [portainer/portainer#7548](https://github.com/portainer/portainer/issues/7548) +* Added tips for entering Portainer license key. +* Updated the agent library dependencies [portainer/portainer#7420](https://github.com/portainer/portainer/issues/7420) +* Fixed issue where Automatic team membership did not always work for Azure. +* Fixed an issue where auto populate team admins LDAP feature didn't work on upgrade from CE to BE. +* Fixed issue of authentication logs not working behind reverse proxy. [portainer/portainer#7120](https://github.com/portainer/portainer/issues/7120) +* Fixed license expiry message flashing even license is not expired or close to expiring. +* Fixed a few typos in various locations. [portainer/portainer#7243](https://github.com/portainer/portainer/issues/7243) +* Fixed issue with environment page table losing selection on table refresh. [portainer/portainer#7395](https://github.com/portainer/portainer/issues/7395) +* Fixed missing BE feature indicators. [portainer/portainer#7396](https://github.com/portainer/portainer/issues/7396) +* Fixed issue where certificate uploading is not functional for StartTLS/TLS in LDAP configuration. [portainer/portainer#6271](https://github.com/portainer/portainer/issues/6271) +* Reworded error message for JWT token missing to more user-friendly message. + +### Edge + +* Introduced the ability to get logs for edge stacks of specific environments. +* Fixed connection issue ("Environment is unreachable") after deploying Nomad environment with AEEC script. +* Updated UI of Add devices page to match the Add environment page. [portainer/portainer#7393](https://github.com/portainer/portainer/issues/7393) +* Fixed issue where editing edge jobs changed the configured cron expression. [portainer/portainer#7432](https://github.com/portainer/portainer/issues/7432) +* Fixed known issue with manually adding an Edge Device environment through the edge device page when using Async mode, does not retain Async settings and needs to be manually added through the environment details page. +* Removed Beta label on Edge Jobs. [portainer/portainer#7162](https://github.com/portainer/portainer/issues/7162) +* Improved image parsing for Kubernetes Edge Stacks that use private registries so that the same parsing as Docker ones is used. + +### Registry + +* Improved Registry details screen with better prompting for relevant fields. [portainer/portainer#3015](https://github.com/portainer/portainer/issues/3015) +* Resolved an issue around not being able to add multiple Quay registries. [portainer/portainer#7430](https://github.com/portainer/portainer/issues/7430) +* Improved the Registry details screen to show the registry provider and made the Add registry screen default to Docker Hub as the provider. [portainer/portainer#7246](https://github.com/portainer/portainer/issues/7246) + +### Nomad + +* Standardized the behavior of Nomad edge environments to be the same as non-Nomad edge environments. + + + +## Release 2.14.2 + +July 26, 2022 + +### Known issues + +* Known issue with manually adding an Edge Device environment through the Edge Device page when using Async mode, does not retain Async settings and needs to be manually added through the environment details page. +* Image update notifications are currently not supported for private registries and private images in DockerHub. This is due to be fixed in our next major version. + +### Kubernetes + +* Fixed an issue where the kubeconfig downloadable from Portainer always had port 9443 in its URLs, even though the actual Portainer instance was being accessed via another port. [portainer/portainer#7059](https://github.com/portainer/portainer/issues/7059) + +### Docker + +* Fixed certificate file validation for .pem files [portainer/portainer#7183](https://github.com/portainer/portainer/issues/7183) +* Fixed an issue when using a Mustache variable (e.g. \{{service\}}) multiple times in the YAML, where the UI should prompt for it only once and then reuse it (rather than prompting for it multiple times). +* Fixed an issue when using a Mustache variable (e.g. \{{path\}}) with special characters in the value, where the resulting value would end up being HTML encoded. +* Fixed issue around access control labels being ignored. + +### Portainer + +* Fixed an issue where the original admin user was unable to change their password when external authentication is enabled. [portainer/portainer#7291](https://github.com/portainer/portainer/issues/7291) +* Fixed toggle state reset issue for custom logo and anonymous statistics. [portainer/portainer#7278](https://github.com/portainer/portainer/issues/7278) +* Fixed issue with not being able to add users to teams while LDAP authentication is enabled without auto teams population. [portainer/portainer#7252](https://github.com/portainer/portainer/issues/7252) +* Fixed an issue where auto populate team admins LDAP feature didn't work on upgrade from CE to BE. +* Resolved an issue where new installs of recent Portainer releases had an extraneous (although innocuous) db version update on restart. + +### Edge + +* Fixed pagination issue on Add edge jobs page for listed environments. [portainer/portainer#7312](https://github.com/portainer/portainer/issues/7312) + + + +## Release 2.14.1 + +July 12, 2022 + +### Known issues + +* Known issue with manually adding an Edge Device environment through the Edge Device page when using Async mode, does not retain Async settings and needs to be manually added through the environment details page. +* Image update notifications are currently not supported for private registries and private images in DockerHub. This is due to be fixed in our next major version. +* When using a Mustache variable (e.g. `{{ service }}`) multiple times in the YAML, the UI also prompts for it multiple times, rather than prompting for it a single time and then reusing it. + +### Kubernetes + +* Improved KaaS cluster provisioning's cluster name validation to enforce restrictions that Google GKE expects. +* Fixed issue of variable inputs not showing on deployment view when using custom templates. +* Improved Portainer logging to better record the output from eksctl, the CLI tool used for Amazon EKS (KaaS) cluster provisioning. +* Fixed an issue where, upon initiating AWS KaaS cluster/environment provisioning and subsequently restarting Portainer in a short space of time, the requested environment would become stuck and unusable in Portainer, and couldn't be deleted. + +### Docker + +* Resolved an issue where users running Portainer with non-root access were receiving a 'Permission denied on docker-compose' error since the recent update to Docker Compose V2. [portainer/portainer#6906](https://github.com/portainer/portainer/issues/6906) + +### Portainer + +* Fix to improve LDAP, etc. authentication/login speed when there are many thousands of users. +* Resolved an issue where users upgrading a Portainer install, where the portainer\_data volume is stored on a network volume, receive a 'Permission denied' error when the upgrade attempts a backup of the database. [portainer/portainer#7144](https://github.com/portainer/portainer/issues/7144) +* Fixed "Create user" button in disabled stage when external Auth enabled. [portainer/portainer#7214](https://github.com/portainer/portainer/issues/7214) + +### Edge + +* Fixed issue where the edge agent could not connect when running Portainer behind a reverse proxy only supporting TLS v1.2. [portainer/portainer#7167](https://github.com/portainer/portainer/issues/7167) + + + +## Release 2.14.0 + +June 28, 2022 + +### Known issues + +* Known issue with manually adding an Edge Device environment through the Edge Device page when using Async mode, does not retain Async settings and needs to be manually added through the environment details page. +* Image update notifications are currently not supported for private registries and private images in DockerHub. This is due to be fixed in our next major version. + +### Breaking changes + +* With the upgrade to Docker Compose V2, container names now use hyphens as separators instead of underscores. This may affect you if you are generating container names instead of explicitly defining them, then using them as references. + +### Kubernetes + +* Introduced ability to set up a new Kubernetes environment in Portainer via upload of a kubeconfig file for an existing on premises or on-cloud cluster. +* Fixed issue around Git clone working with Main (in addition to existing Master) branch type. [portainer/portainer#6002](https://github.com/portainer/portainer/issues/6002) +* Updated packaged components to recent stable release versions: Docker 20.10.9, Docker Compose plugin 2.5.1, kubectl 1.24.1, Helm 3.9.0. [portainer/portainer#6074](https://github.com/portainer/portainer/issues/6074) +* Administrators can now set up cloud provider settings via a list page and separate add page in a similar way to other records in Portainer. +* Introduced support for provisioning of a Kubernetes cluster on the Amazon (AWS) EKS platform from within Portainer, alleviating the need to do so in the cloud provider's portal. The AWS eksctl binary is auto downloaded when first using this functionality. +* Introduced support for provisioning of a Kubernetes cluster on the Microsoft Azure AKS platform from within Portainer, alleviating the need to do so in the cloud provider's portal. +* Introduced support for provisioning of a Kubernetes cluster on the Google Cloud GKE platform from within Portainer, alleviating the need to do so in the cloud provider's portal. +* Fixed a typo in the Kubernetes -> Namespaces -> Create from manifest (advanced deployment) page. [portainer/portainer#6968](https://github.com/portainer/portainer/issues/6968) +* Fixed an issue with cluster provisioning via Civo KaaS, where if the Civo account has an issue with its defined networks, the environment was stuck waiting to complete provisioning and never ultimately errored. +* Introduced the ability to set the group and tags against the environment in Portainer when an admin provisions a Kubernetes as a Service cluster. +* Introduced slight improvements to editing of sensitive cloud credentials values. +* Fixed an issue in the Settings -> Environments page, where an environment that was disabled or still being provisioned could be selected for removal and then removed. +* Added the ability to manually refresh pulling of Kubernetes as a Service cluster provisioning options from cloud providers. +* Improved error handling around KaaS provisioning in the environment wizard. +* Kubernetes as a Service (cloud) provisioned environments will now appear in the 'new environments' side panel in the environments wizard. + +### Docker + +* Introduced a visual indication of stacks, services and containers that are running with an out-of-date image. [portainer/portainer#1304](https://github.com/portainer/portainer/issues/1304) +* Fixed issue around Git clone working with Main (in addition to existing Master) branch type. [portainer/portainer#6002](https://github.com/portainer/portainer/issues/6002) +* Updated packaged components to recent stable release versions: Docker 20.10.9, Docker Compose plugin 2.5.1, kubectl 1.24.1, Helm 3.9.0. [portainer/portainer#6074](https://github.com/portainer/portainer/issues/6074) +* Fixed issue for standard user having an empty network as default when creating containers on Windows environments [portainer/portainer#6959](https://github.com/portainer/portainer/issues/6959) +* Introduced ability to pass environment variables on the webhooks in Docker stack deployment. +* Provide a stack template for dokku deployment within portainer. [portainer/portainer#7011](https://github.com/portainer/portainer/issues/7011) +* Resolved an issue when updating an application and changing its service from replicated to global, where an error occurs and the deployed application is deleted. [portainer/portainer#7056](https://github.com/portainer/portainer/issues/7056) +* Third-party developer Inedo has fixed their ProGet registry software to resolve an intermittent error admins were experiencing in Portainer on retag or delete of a tagged image. This is planned to ship 10 June 2022 in ProGet 6.0.16, before Portainer 2.14. +* Introduced support in the container webhook for pull/recreate of containers from images residing in private registries. +* Fixed an issue in the Containers page, where choosing 'Recreate' enabled the webhook for the container, even though it was not currently turned on. +* Fixed an issue where, when calling Swarm update API through Portainer, incorrect overriding of the registry authentication header occurred, preventing pull of an image. [portainer/portainer#7095](https://github.com/portainer/portainer/issues/7095) + +### Portainer + +* Redesigned team leader feature. [portainer/portainer#7093](https://github.com/portainer/portainer/issues/7093) +* Fixed an issue where the delete environment confirmation dialog was positioned too low on-screen. [portainer/portainer#6983](https://github.com/portainer/portainer/issues/6983) +* Fixed an issue where agent and edge agent install command instructions do not list the agent\_secret option. [portainer/portainer#6801](https://github.com/portainer/portainer/issues/6801) +* Fixed an issue where the home (environments) page no longer showed the words 'No tags' for environments without tags. [portainer/portainer#6967](https://github.com/portainer/portainer/issues/6967) +* Introduced support for provisioning of a Kubernetes cluster on the Amazon (AWS) EKS platform from within Portainer, alleviating the need to do so in the cloud provider's portal. The AWS eksctl binary is auto downloaded when first using this functionality. +* The Add environment page and Environment wizard are now consolidated into a single consistent, improved wizard-style experience. [portainer/portainer#7022](https://github.com/portainer/portainer/issues/7022) +* Introduced support for provisioning of a Kubernetes cluster on the Microsoft Azure AKS platform from within Portainer, alleviating the need to do so in the cloud provider's portal. +* Introduced support for provisioning of a Kubernetes cluster on the Google Cloud GKE platform from within Portainer, alleviating the need to do so in the cloud provider's portal. +* Fixed Go panic state for the environments list handler [portainer/portainer#7047](https://github.com/portainer/portainer/issues/7047) +* Introduced ability for admin to set required password length. [portainer/portainer#7055](https://github.com/portainer/portainer/issues/7055) +* Fixed an issue recently introduced in the environments page where the name of an environment that was down no longer linked through to its details page. +* Resolved an issue preventing migration from EE 2.12 to 2.13 (or now 2.14) for Portainer instances that had previously migrated to EE from a CE instance with Allow Volume Browser for Regular Users toggled on for an environment. +* Increased the click/touch area in expandable panels so it's easier to open/close them. [portainer/portainer#7036](https://github.com/portainer/portainer/issues/7036) +* Fixed propagation of Portainer agent polling frequency when changed before deploying via automatic edge environment creation +* Introduced the ability to paste in an existing license, revalidate with the license server and replace it in the database. This can be used to fix a corrupted license. + +### Edge + +* Fixed issue with status indicator on Edge Stacks not updating when removing tags from edge environments/groups [portainer/portainer#6950](https://github.com/portainer/portainer/issues/6950) +* Introduced the ability to define the 3 polling intervals for Async +* For edge agents, the URL shown in the Environment summary page (access from the Home page) has now been removed, as it caused confusion since it simply showed the Portainer Server URL. [portainer/portainer#6978](https://github.com/portainer/portainer/issues/6978) +* Fixed Data race in the operations of the edge key in the Edge Agent [portainer/portainer#7024](https://github.com/portainer/portainer/issues/7024) +* Added "goto page" to the Edge devices page view [portainer/portainer#6982](https://github.com/portainer/portainer/issues/6982) +* Added the ability to add edge agents in the environment wizard [portainer/portainer#7023](https://github.com/portainer/portainer/issues/7023) + +### Nomad + +* Added HTTPS support for Nomad Edge Agent. +* Added display of BE feature highlights in CE for new Nomad, KaaS provisioning and kubeconfig import functionality. [portainer/portainer#7051](https://github.com/portainer/portainer/issues/7051) + +## Release 2.13.1 + +May 12, 2022 + +### Portainer + +* Changed the minimum TLS version of Portainer from 1.3 to 1.2 to avoid issues with nginx reverse proxies: [portainer/portainer#6902](https://github.com/portainer/portainer/issues/6902) +* Fixed issue with the Portainer authentication settings page not being able to save: [portainer/portainer#6899](https://github.com/portainer/portainer/issues/6899) +* Changed the password policy to require 12 characters for all Portainer internal users: [portainer/portainer#6904](https://github.com/portainer/portainer/issues/6904) + +## Release 2.13.0 + +May 9. 2022 + +### Known issues + +* When provisioning a Civo cluster while there are multiple default networks defined on the Civo account, the environment will fail to provision and Portainer will end up waiting for the environment to be ready indefinitely. This can be resolved from the Civo console by deleting the cluster and using a non-default network for the provision. + +### Breaking changes + +* The minimum TLS version of Portainer was changed from 1.2 to 1.3. If you are running a proxy in front of Portainer with HTTPS you will need to ensure it is configured to support TLS 1.3. +* Standard users can browse registries including edit and delete +* Introduced the ability for non admin users to browse image registries +* Added strong password policy for all Portainer internal users. When using a weak password and logging in you will be required to update your password. + +### Kubernetes + +* Improve how Portainer helps you set up ingresses (especially Nginx ones), including support of regular expressions in paths - by assisting with required annotations and correcting a rewrite issue: [portainer/portainer#6854](https://github.com/portainer/portainer/issues/6854) +* Introduce support for provisioning of a Kubernetes cluster on a cloud provider's KaaS offering from within Portainer, alleviating the need to do so in the provider's own portal. Initial supported providers are Civo, DigitalOcean and Linode. +* Fixed an issue where, on setting up (on a namespace) an ingress controller for a k8s cluster and I create an app with two ingress routes on the controller, app details show only the second of the paths: [portainer/portainer#6856](https://github.com/portainer/portainer/issues/6856) +* Fixed an issue where Portainer's validation of a K8s namespace's hostnames was disallowing wildcards (e.g. \*abc.com): [portainer/portainer#6855](https://github.com/portainer/portainer/issues/6855) +* Fixed issue with default helm repo not populating in settings page: [portainer/portainer#6849](https://github.com/portainer/portainer/issues/6849) +* Created documentation around using GKE ingress with Portainer: [portainer/portainer#6848](https://github.com/portainer/portainer/issues/6848) +* Added input validation for kubernetes workload names: [portainer/portainer#5363](https://github.com/portainer/portainer/issues/5363) +* Fixed issue where changing Portainer to HTTPS crashed Portainer: portainer/portainer#6836 +* Fixed issue where Helm Charts could not be deployed when using SSL certs with Portainer: [portainer/portainer#6742](https://github.com/portainer/portainer/issues/6742) +* Fixed issue of not being able to use a name previously used for kubernetes resources: [portainer/portainer#6830](https://github.com/portainer/portainer/issues/6830) +* Fixed issue where the Kube cluster resource stats had a rounding issue: [portainer/portainer#6472](https://github.com/portainer/portainer/issues/6472) +* Fixed an issue when deploying Portainer client with AGENT\_SECRET without configuring Kubernetes agent with AGENT\_SECRET where an "Failure unknown" error shows rather than "agent already paired" : [portainer/portainer#6791](https://github.com/portainer/portainer/issues/6791) + +### Docker + +* Standard users can browse registries including edit and delete +* Introduced the ability for non admin users to browse image registries +* Fixed issue where the Disable bind mounts for non-administrators setting would prevent existing volumes from being used: [portainer/portainer#6387](https://github.com/portainer/portainer/issues/6387) +* Fixed issue with creating a CIFS volume that uses a hostname: [portainer/portainer#6338](https://github.com/portainer/portainer/issues/6338) +* Fixed issue where webhooks for services were accepting invalid tags: [portainer/portainer#6493](https://github.com/portainer/portainer/issues/6493) +* Fixed issue with libcompose logging where error output is attempted to be included when an error did not occur: [portainer/portainer#6857](https://github.com/portainer/portainer/issues/6857) +* Fixed an issue where 'Pull and Redeploy' and 'Force redeploy' don't work on ARM: [portainer/portainer#6788](https://github.com/portainer/portainer/issues/6788) +* Documented deviation from the Docker standard when using the /docker/images/create API endpoint in conjunction with a private registry: [portainer/portainer#6712](https://github.com/portainer/portainer/issues/6712) +* Fixed issue where credentials from different registries were being used: [portainer/portainer#6087](https://github.com/portainer/portainer/issues/6087) +* Fixed issue where stack name was stated inaccurately in the message which informs users that a container/service inherited its access control settings from a specific stack: [portainer/portainer#6478](https://github.com/portainer/portainer/issues/6478) +* Fixed issue with displaying container template when connected to docker swarm in the app templates page view: [portainer/portainer#6837](https://github.com/portainer/portainer/issues/6837) +* Fixed text color on modal when updating a service: [portainer/portainer#6839](https://github.com/portainer/portainer/issues/6839) +* Fixed issue where Watchtower did not work for standalone stacks on Arm64: [portainer/portainer#5799](https://github.com/portainer/portainer/issues/5799) + +### Portainer + +* Enforced strong password policy for all Portainer Users: [portainer/portainer#6846](https://github.com/portainer/portainer/issues/6846) +* Improved the database migration to become more resilient: [portainer/portainer#6778](https://github.com/portainer/portainer/issues/6778) +* Introduced the ability to filter and sort environments on the Home page: [portainer/portainer#6823](https://github.com/portainer/portainer/issues/6823) +* When changing the user password the user gets redirected to the login page: [portainer/portainer#6456](https://github.com/portainer/portainer/issues/6456) +* Fixed issue where upgrading to the Business Edition and then downgrading back to the Community Edition did not work +* Improved security for custom templates when using Git repos that contain symlinks: [portainer/portainer#6847](https://github.com/portainer/portainer/issues/6847) +* Improved how the installation page times out: [portainer/portainer#6740](https://github.com/portainer/portainer/issues/6740) +* Improved file type validation when selecting multiple files when deploying from Git repository +* Removed superfluous warning message for the Enable Change Window setting +* Fixed bug relating to environment status in home page: [portainer/portainer#6047](https://github.com/portainer/portainer/issues/6047) +* Improved concurrency in agent code to prevent race conditions: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Improved concurrency in backend code to prevent race conditions: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Fixed duplicate naming issue for registries: [portainer/portainer#6838](https://github.com/portainer/portainer/issues/6838) +* Fixed issue around user accessing agent environment after changing an invalid environment url to a valid one: [portainer/portainer#6824](https://github.com/portainer/portainer/issues/6824) +* Fixed issue with the menu when connecting to another environment fails: [portainer/portainer#6449](https://github.com/portainer/portainer/issues/6449) +* Updated registry form wording from Password to "Dockerhub access token" : [portainer/portainer#6308](https://github.com/portainer/portainer/issues/6308) +* Fixed text color for change window warning text +* Fixed an issue where the hover-over tooltip for nav menu items always just showed 'Settings' rather than the menu item text: [portainer/portainer#6779](https://github.com/portainer/portainer/issues/6779) +* Fixed issue where the green success notification was not showing up after deleting a custom app template: [portainer/portainer#6724](https://github.com/portainer/portainer/issues/6724) +* Improved UX for setting themes by removing save button: [portainer/portainer#6840](https://github.com/portainer/portainer/issues/6840) + +### Edge + +* Renamed Trust on first connect to "Waiting Room" +* Introduced the ability to pass env variables from local system to edge stacks for Kubernetes environments +* Created the ability for Automatic Edge Environment Creation (AEEC) within Portainer Server +* Introduced support for using credentials with private registries for edge stacks +* Resolved data race on stack deploy for edge agents: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Added environment variable to the agent to adjust the probe timeout and interval: [portainer/agent#293](https://github.com/portainer/agent/issues/293) +* Introduce the ability to pass env variables from a local system on edge devices to the edge stack: [portainer/portainer#6832](https://github.com/portainer/portainer/issues/6832) +* Fixed issue with edge environments having faulty heartbeat on Edge Devices page: [portainer/portainer#6825](https://github.com/portainer/portainer/issues/6825) +* Improved concurrency in edge code to prevent race conditions: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Fixed data race in poll service on Edge Agent: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Resolved some race conditions with the edge agent: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Resolved data race on tunnels for edge agents: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Resolved data race with activity timer for edge agents: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) +* Fixed issue with displaying AMT device table for non-activated devices: [portainer/portainer#6835](https://github.com/portainer/portainer/issues/6835) +* Fixed minor UI issues in Edge devices page view around Action buttons: [portainer/portainer#6844](https://github.com/portainer/portainer/issues/6844) +* Fixed issue when creating edge job from file returning 404: [portainer/portainer#6826](https://github.com/portainer/portainer/issues/6826) + +### Development + +* Updated the Go library dependencies: [portainer/portainer#6777](https://github.com/portainer/portainer/issues/6777) +* Migrated AngularJS components to ReactJS: [portainer/portainer#6031](https://github.com/portainer/portainer/issues/6031) +* Reorganized the file structure of the agent installation yaml files: [portainer/portainer#6776](https://github.com/portainer/portainer/issues/6776) +* Removed the integration with Storidge clusters: [portainer/portainer#6512](https://github.com/portainer/portainer/issues/6512) + +## Release 2.12.2 + +April 4, 2022 + +### Nomad + +* Introduced Nomad integration +* Allows Nomad to be added as an environment in Portainer by using the Edge Agent +* Allows Edge Stacks to be deployed on Nomad as Nomad Jobs +* Allows Nomad Jobs and Tasks to be listed +* Allows Nomad logs and events to be viewed for Tasks + +### Kubernetes + +* Fixed issue where changing Portainer to HTTPS crashed Portainer +* Fixed issue around deploying in default namespace via manifest using the portainer namespace instead +* Fixed bug causing domain names to not displaying correctly under publish application options +* Fixed issue with first service naming having a suffix attached. +* Improved error message being displayed when deploying a malformed Kubernetes manifest from GitOps + +### Portainer + +* Fixed issue with GitOps automatic update +* Fixed issues around migration path for CE to BE +* Fixed missing operator role when migrating from 1.x +* Improved concurrency in edge code to prevent race conditions: [portainer/portainer#6677](https://github.com/portainer/portainer/issues/6677) + +### Edge + +* Resolved some race conditions with the Edge Agent + +## Release 2.12.1 + +March 9, 2022 + +### Portainer + +* Fixed bug where redeploying a stack causes an error and success message at the same time. +* Fixed bug that was preventing ability to edit application with persisted folder on Kubernetes. + +## Release 2.12.0 + +March 8, 2022 + +### Breaking changes + +* When OAuth is enabled, Portainer users can no longer use their Portainer internal password: [portainer/portainer#5889](https://github.com/portainer/portainer/issues/5889) +* Deploying a manifest without a namespace definition and selecting the Default namespace in Portainer may deploy the application into the portainer namespace in certain circumstances + +### Kubernetes + +* Added input validation for kubernetes workload names: [portainer/portainer#5363](https://github.com/portainer/portainer/issues/5363) +* Fixed issue where the Kube cluster resource stats had a rounding issue: [portainer/portainer#6472](https://github.com/portainer/portainer/issues/6472) +* Migrated to use the networking.k8s.io/v1 ingress API, available from Kubernetes v1.19: [portainer/portainer#6396](https://github.com/portainer/portainer/issues/6396) +* Allow Services to be managed for Kubernetes applications, which can be deployed within Portainer or outside of it: [portainer/portainer#5941](https://github.com/portainer/portainer/issues/5941) +* Restarting Portainer will no longer result in invalid kubeconfig credentials, which would have required the user to download a new kubeconfig file again: [portainer/portainer#5940](https://github.com/portainer/portainer/issues/5940) +* Provides a single process so that users can gain access to all their environments contexts from within the Portainer UI: [portainer/portainer#5945](https://github.com/portainer/portainer/issues/5945) +* Improved how a namespace gets selected when using Advanced deployment: [portainer/portainer#5557](https://github.com/portainer/portainer/issues/5557) +* Added warning that a secret will be created when adding registry access to a namespace: [portainer/portainer#5845](https://github.com/portainer/portainer/issues/5845) +* Fixed issue where selecting a Helm chart did not scroll to the top: [portainer/portainer#6146](https://github.com/portainer/portainer/issues/6146) +* Fixed issue when clearing Helm repo in global settings and added text notification in Helm charts page: [portainer/portainer#5996](https://github.com/portainer/portainer/issues/5996) +* Fixed issue where Helm charts fail to load in ARM cloud environments: [portainer/portainer#5937](https://github.com/portainer/portainer/issues/5937) +* Fixed issue where the kubectl shell wasn't working when Portainer runs on ARM64: [portainer/portainer#5723](https://github.com/portainer/portainer/issues/5723) +* Fixed bug so that Kubernetes terminology is used when deploying through Kubernetes: [portainer/portainer#6099](https://github.com/portainer/portainer/issues/6099) +* Fixed issue where error notice was coming up when deleting an application through kubeshell: [portainer/portainer#5939](https://github.com/portainer/portainer/issues/5939) +* Fixed issue where Portainer stacks were not being removed when removing a namespace: [portainer/portainer#5897](https://github.com/portainer/portainer/issues/5897) +* Fixed issue where standard users were unable to access the pod and node stats view: [portainer/portainer#5898](https://github.com/portainer/portainer/issues/5898) +* Fixed issue where the namespace details page showed an object object error: [portainer/portainer#5802](https://github.com/portainer/portainer/issues/5802) +* Fixed issue when selecting Cluster Setup in the menu: [portainer/portainer#6033](https://github.com/portainer/portainer/issues/6033) +* Fixed order of registries to be alphabetical in the select registry dropdown in namespaces: [portainer/portainer#6175](https://github.com/portainer/portainer/issues/6175) +* Fixed issue with publishing method defaulting to Ingress when changing to Cluster IP: [portainer/portainer#6190](https://github.com/portainer/portainer/issues/6190) + +### Docker + +* Introduced the ability to pull latest images when redeploying: [portainer/portainer#6155](https://github.com/portainer/portainer/issues/6155) +* Fixed issue where webhooks for services were accepting invalid tags: [portainer/portainer#6493](https://github.com/portainer/portainer/issues/6493) +* When updating a Swarm service and enabling Pull latest image, it would change the tag to latest: [portainer/portainer#6352](https://github.com/portainer/portainer/issues/6352) +* Fixed issue with displaying container template when connected to docker swarm in the app templates page view +* Fixed issue where updating the Stack always recreated the containers: [portainer/portainer#6306](https://github.com/portainer/portainer/issues/6306) +* Added the ability to filter the Swarm services published ports column: [portainer/portainer#6161](https://github.com/portainer/portainer/issues/6161) +* Added a warning when the same Swarm secret is assigned multiple times to a service: [portainer/portainer#2821](https://github.com/portainer/portainer/issues/2821) +* Added the option to detach Stacks deployed from Git to make them editable: [portainer/portainer#5748](https://github.com/portainer/portainer/issues/5748) +* Removed the ability to edit the Portainer container: [portainer/portainer#5121](https://github.com/portainer/portainer/issues/5121) +* Fixed issue where an error message would not be shown when failing to pull an image: [portainer/portainer#6239](https://github.com/portainer/portainer/issues/6239) +* Fixed issue where the default user for the container console was incorrectly auto filled: [portainer/portainer#6315](https://github.com/portainer/portainer/issues/6315) +* Fixed issue where uploading large files to a volume would fail: [portainer/portainer#4453](https://github.com/portainer/portainer/issues/4453) +* Fixed issue where stacks deployed from App Templates behaved as if they were deployed from Git: [portainer/portainer#5748](https://github.com/portainer/portainer/issues/5748) +* Fixed issue where stacks with environment variables in the networks section could not be removed: [portainer/portainer#5779](https://github.com/portainer/portainer/issues/5779) +* Allow the resource settings of a container to be updated without redeploying the container: [portainer/portainer#5906](https://github.com/portainer/portainer/issues/5906) +* Added support for .bz2 and .xz compression formats when importing Docker images: [portainer/portainer#5220](https://github.com/portainer/portainer/issues/5220) +* Enhancement of the Docker image import feature to support manually adding tags to the imported image: [portainer/portainer#5944](https://github.com/portainer/portainer/issues/5944) +* Improved how to change the image when editing a Service by pre-populating the fields in the UI: [portainer/portainer#5150](https://github.com/portainer/portainer/issues/5150) +* Fixed issue where automatic updates of stacks fail after restarting Portainer: [portainer/portainer#5914](https://github.com/portainer/portainer/issues/5914) +* Fixed issue where pull and redeploy button was not functioning as expected: [portainer/portainer#5948](https://github.com/portainer/portainer/issues/5948) +* Fixed UI issue when using a personal access token to deploy from Git: [portainer/portainer#5847](https://github.com/portainer/portainer/issues/5847) +* Fixed issue where certain docker events showed as Unsupported: [portainer/portainer#2717](https://github.com/portainer/portainer/issues/2717) +* Fixed issue with stack names when migrating from Swarm to docker standalone: [portainer/portainer#6139](https://github.com/portainer/portainer/issues/6139) +* Fixed issue where migrating a stack shows up twice: [portainer/portainer#5159](https://github.com/portainer/portainer/issues/5159) +* Fixed issue where using a webhook with an image registry running on a custom port did not work: [portainer/portainer#4526](https://github.com/portainer/portainer/issues/4526) +* Fixed issue where downloading container log files added extra carriage returns: [portainer/portainer#5312](https://github.com/portainer/portainer/issues/5312) +* Fixed issue where copying container log files added trailing commas: [portainer/portainer#4318](https://github.com/portainer/portainer/issues/4318) +* Fixed issue where the scale labels of the stats graph was showing multiple times: [portainer/portainer#5843](https://github.com/portainer/portainer/issues/5843) +* Fixed issue where stats were not working on windows containers: [portainer/portainer#5826](https://github.com/portainer/portainer/issues/5826) +* Fixed UI issue with empty stack dropdown when deploying an application via the form: [portainer/portainer#5848](https://github.com/portainer/portainer/issues/5848) +* Fixed issue with Custom Template on Docker being created when the file does not exist on a git repo: [portainer/portainer#6184](https://github.com/portainer/portainer/issues/6184) + +### Portainer + +* Fixed issue where upgrading from CE to BE failed due to missing RBAC roles +* Fixed trivy Helm and Portainer vulnerabilities relating to direct dependencies. [portainer/portainer#6342](https://github.com/portainer/portainer/issues/6342) +* Standard users will no longer be able to remove or export images. Also, Operators, Help Desk, and ready only users will no longer be able to export images. +* When changing the user password the user gets redirected to the login page: [portainer/portainer#6456](https://github.com/portainer/portainer/issues/6456) +* Fixed issue with default helm repo not populating in settings page +* Fixed ability for a Standard User to start/stop stacks [portainer/portainer#6369](https://github.com/portainer/portainer/issues/6369) +* Removed the integration with Storidge clusters: [portainer/portainer#6512](https://github.com/portainer/portainer/issues/6512) +* Changed the default Microsoft OAuth logout URL: [portainer/portainer#6405](https://github.com/portainer/portainer/issues/6405) +* Portainer users can no longer use their Portainer internal password when OAuth is enabled: [portainer/portainer#5889](https://github.com/portainer/portainer/issues/5889) +* Option to encrypt values in Portainer database: [portainer/portainer#6412](https://github.com/portainer/portainer/issues/6412) +* Added the ability to override the "Force HTTPS only" option: [portainer/portainer#6126](https://github.com/portainer/portainer/issues/6126) +* Supporting the ability for Portainer to run inside a subpath: [portainer/portainer#3901](https://github.com/portainer/portainer/issues/3901) +* Updated the defaults for the Git authentication toggles: [portainer/portainer#6406](https://github.com/portainer/portainer/issues/6406) +* Fixed display issue for environment tags in the Home page view [portainer/portainer#6276](https://github.com/portainer/portainer/issues/6276) +* Fixed issue where scrollbars would show in confirmation dialogs: [portainer/portainer#6257](https://github.com/portainer/portainer/issues/6257) +* Fixed issue where the `--sslcert` flag was being ignored: [portainer/portainer#6021](https://github.com/portainer/portainer/issues/6021) +* The ability for users to easily interact with the Portainer API through the use of Personal Access Tokens: [portainer/portainer#813](https://github.com/portainer/portainer/issues/813) +* Automatically sync Portainer dark/light theme with the browser dark/light theme settings: [portainer/portainer#5753](https://github.com/portainer/portainer/issues/5753) +* Fixed issue where the CPU and memory were not shown on the Home screen: [portainer/portainer#6143](https://github.com/portainer/portainer/issues/6143) +* Added confirmation modal when deleting an Environment: [portainer/portainer#5952](https://github.com/portainer/portainer/issues/5952) +* Fixed issue where removing an environment did not update the tree: [portainer/portainer#6127](https://github.com/portainer/portainer/issues/6127) +* Fixed issue where the DockerHub anonymous registry was being used instead of one with an account: [portainer/portainer#5896](https://github.com/portainer/portainer/issues/5896) +* Fixed issue where environment displayed as offline after starting Portainer: [portainer/portainer#5732](https://github.com/portainer/portainer/issues/5732) +* Fixed issue where the custom logo settings showed incorrectly in the UI: [portainer/portainer#4437](https://github.com/portainer/portainer/issues/4437) +* Fixed issue where uploading a backup file could not select a file on Mac: [portainer/portainer#5357](https://github.com/portainer/portainer/issues/5357) +* Fixed issue where apple touch Portainer icon had non standard image dimensions [portainer/portainer#5887](https://github.com/portainer/portainer/issues/5887) +* Fixed issue with widget header not displaying correctly for application settings: [portainer/portainer#6191](https://github.com/portainer/portainer/issues/6191) + +### Edge + +* Introduce the ability to pass env variables from a local system on edge devices to the edge stack +* Fixed minor UI behavior with toggles in Edge Compute settings view +* Fixed issue with displaying AMT device table for non-activated devices +* Fixed minor UI issues in Edge devices page view around Action buttons +* Introduced the ability to control and interact with OpenAMT: devices [portainer/portainer#6444](https://github.com/portainer/portainer/issues/6444) +* Introduce the ability to add edge devices through FDO: [portainer/portainer#6445](https://github.com/portainer/portainer/issues/6445) +* Added behavior for Edge agents to reject connections if not connected to within 72hrs: [portainer/portainer#6420](https://github.com/portainer/portainer/issues/6420) +* Optimize disk performance for Edge Agent [portainer/portainer#6455](https://github.com/portainer/portainer/issues/6455) +* Fixed issues with the Edge Agent reverse tunnel timing out: [portainer/portainer#5725](https://github.com/portainer/portainer/issues/5725) +* Fixed issue where the URL of an Environment would change to localhost: [portainer/portainer#5803](https://github.com/portainer/portainer/issues/5803) + +### Registry + +* Fixed issue with duplicating registries during upgrade process. [portainer/portainer#6062](https://github.com/portainer/portainer/issues/6062) +* Bring users the ability to use Amazon Elastic Container Registry: [portainer/portainer#1533](https://github.com/portainer/portainer/issues/1533) + +### ACI + +* Fixed issue where ACI stopped working when the number of exposed ports and container ports were different: [portainer/portainer#5335](https://github.com/portainer/portainer/issues/5335) + +### Development + +* Upgraded golang version to 1.17 [portainer/portainer#6342](https://github.com/portainer/portainer/issues/6342) +* Updated the Swagger documentation: [portainer/portainer#6019](https://github.com/portainer/portainer/issues/6019) +* Deprecated EndpointProvider in the code and moving away from its use: [portainer/portainer#5524](https://github.com/portainer/portainer/issues/5524) +* Introduced ReactJS support in the frontend: [portainer/portainer#6031](https://github.com/portainer/portainer/issues/6031) +* Updated docker and kubernetes library dependencies: [portainer/portainer#6137](https://github.com/portainer/portainer/issues/6137) +* Updated the Swagger documentation: [portainer/portainer#5338](https://github.com/portainer/portainer/issues/5338) +* Added logging to migrations: [portainer/portainer#6183](https://github.com/portainer/portainer/issues/6183) + +## Release 2.10.0 + +November 15, 2021 + +### Known issues + +* Both Portainer and the Agent need to be upgraded at the same time: [portainer/agent#187](https://github.com/portainer/agent/issues/187) +* Restarting Portainer will invalidate all downloaded Kubeconfig files: [portainer/portainer#5574](https://github.com/portainer/portainer/issues/5574) +* Access can not be assigned to registries when defining multiple registries with the same URL +* Browser cache causes UI abnormalities after upgrading from a prior version. Force a cache refresh (Ctrl-Shift-R) to remedy + +### Breaking changes + +* Default HTTPS support has been added: [portainer/portainer#5462](https://github.com/portainer/portainer/issues/5462) + + As a consequence the `--ssl` flag has been deprecated. If you are using the `--sslcert` and `--sslkey` flags, then after the upgrade port `9000` will serve `http` and port `9443` will serve `https` with the provided certificate. To retain the old behavior consider using the port mapping `-p 9000:9443` instead. +* The `/stacks` API has renamed from `ComposeFilePathInRepository` to `ComposeFile`, and the non-mandatory fields `AdditionalFiles` and `AutoUpdate` were added: [portainer/portainer#5461](https://github.com/portainer/portainer/issues/5461) + +### Security + +* It is advisable to upgrade to this version, since some security improvements have been made with regards to embedding images: [portainer/portainer#5805](https://github.com/portainer/portainer/issues/5805) + +### Kubernetes + +* Introduced the ability to keep the deployments of stacks and applications in sync with the definitions in Git +* Introduced the ability to open a shell in Portainer to use kubectl: [portainer/portainer#5574](https://github.com/portainer/portainer/issues/5574) +* Introduced the ability to download a kubeconfig file and use Portainer as a proxy: [portainer/portainer#5574](https://github.com/portainer/portainer/issues/5574) +* Introduced the ability to install Helm charts: [portainer/portainer#5479](https://github.com/portainer/portainer/issues/5479) +* Introduced the ability to use any public Helm repository: [portainer/portainer#5480](https://github.com/portainer/portainer/issues/5480) +* Introduced the ability to automatically sync a manifest from a git repository: [portainer/portainer#5494](https://github.com/portainer/portainer/issues/5494) +* Introduced a visual indicator for applications to see if they're fully replicated: [portainer/portainer#5718](https://github.com/portainer/portainer/issues/5718) +* Introduced the ability to filter Kubernetes applications by type: [portainer/portainer#5726](https://github.com/portainer/portainer/issues/5726) +* Introduced the ability to remove all workloads of a manifest based deployment: [portainer/portainer#5715](https://github.com/portainer/portainer/issues/5715) +* Added the ability to display Helm chart deployments in the applications list: [portainer/portainer#5478](https://github.com/portainer/portainer/issues/5478) +* Added the ability to update and redeploy an application created from a git repository: [portainer/portainer#5486](https://github.com/portainer/portainer/issues/5486) +* Added support for deploying images stored on private registries for Docker and Kubernetes: [portainer/portainer#4393](https://github.com/portainer/portainer/issues/4393) +* Introduced the ability to mark and unmark namespaces as system: [portainer/portainer#4389](https://github.com/portainer/portainer/issues/4389) +* Added functionality to define a manifest as custom template: [portainer/portainer#5489](https://github.com/portainer/portainer/issues/5489) +* Added the ability to deploy a manifest from a URL: [portainer/portainer#5556](https://github.com/portainer/portainer/issues/5556) +* Added memory and CPU usage indicators to the namespace and cluster details: [portainer/portainer#5460](https://github.com/portainer/portainer/issues/5460) +* Added status information to list of namespaces: [portainer/portainer#5555](https://github.com/portainer/portainer/issues/5555) +* Added Pod IP address information to the application details: [portainer/portainer#5713](https://github.com/portainer/portainer/issues/5713) +* Added input validation when adding an ingress: [portainer/portainer#5716](https://github.com/portainer/portainer/issues/5716) +* Improved the validation of resource allocation available on any of the nodes when adding an application: [portainer/portainer#5530](https://github.com/portainer/portainer/issues/5530) +* Improved UI so that accessing the advanced deployment functionality is similar to accessing the form: [portainer/portainer#5558](https://github.com/portainer/portainer/issues/5558) +* Renamed configuration and the networking area in the UI: [portainer/portainer#5804](https://github.com/portainer/portainer/issues/5804) +* Improved UI for the metrics API toggle in the cluster setup: [portainer/portainer#5508](https://github.com/portainer/portainer/issues/5508) +* Removed validation of any ingresses that are already in use in other namespaces: [portainer/portainer#5526](https://github.com/portainer/portainer/issues/5526) +* Introduced the ability to use Edge Stacks on Kubernetes via edge agents: [portainer/portainer#5472](https://github.com/portainer/portainer/issues/5472) +* Added warning that a secret will be created when adding registry access to a namespace: [portainer/portainer#5845](https://github.com/portainer/portainer/issues/5845) +* Fixed issue where the metrics server API was being queried when disabled: [portainer/portainer#5523](https://github.com/portainer/portainer/issues/5523) +* Fixed issue where the node events would not be showing: [portainer/portainer#5474](https://github.com/portainer/portainer/issues/5474) +* Fixed issue where applications deployed via Helm in Portainer were marked as external: [portainer/portainer#5727](https://github.com/portainer/portainer/issues/5727) +* Fixed issue where the kubectl shell would close when performing other actions: [portainer/portainer#5721](https://github.com/portainer/portainer/issues/5721) +* Fixed issue where the kubectl shell wasn't working when Portainer runs on ARM64: [portainer/portainer#5723](https://github.com/portainer/portainer/issues/5723) +* Fixed issue where the cluster status was incorrectly shown: [portainer/portainer#5293](https://github.com/portainer/portainer/issues/5293) +* Fixed issue where the application details incorrectly showed how it was deployed : [portainer/portainer#5728](https://github.com/portainer/portainer/issues/5728) +* Fixed issue where standard users were unable to access the pod and node stats view: [portainer/portainer#5898](https://github.com/portainer/portainer/issues/5898) +* Fixed issue where editing an application could not expose it via Ingress: [portainer/portainer#5915](https://github.com/portainer/portainer/issues/5915) +* Fixed issue when clearing Helm repo in global settings and added text notification in Helm charts page: [portainer/portainer#5996](https://github.com/portainer/portainer/issues/5996) +* Fixed issue where Helm charts fail to load in ARM cloud environments: [portainer/portainer#5937](https://github.com/portainer/portainer/issues/5937) +* Fixed issue where the namespace details page showed an object object error: [portainer/portainer#5802](https://github.com/portainer/portainer/issues/5802) +* Fixed issue where Environment variables with empty values are not showing when editing a Kubernetes application +* Fixed issue where standard users could not see the quota set in the namespace details page + +### Docker + +* Introduced the ability to keep the deployments of stacks and applications in sync with the definitions in Git +* Introduced the ability to automatically sync a stack from a git repository: [portainer/portainer#5461](https://github.com/portainer/portainer/issues/5461) +* Introduced the ability to use stacks on docker standalone on ARM64: [portainer/portainer#4776](https://github.com/portainer/portainer/issues/4776) +* Introduced the ability to use Edge Stacks on ARM64: [portainer/portainer#4776](https://github.com/portainer/portainer/issues/4776) +* Added support for deploying images stored on private registries for Docker and Kubernetes: [portainer/portainer#4393](https://github.com/portainer/portainer/issues/4393) +* Added the ability to edit a stopped stack: [portainer/portainer#4944](https://github.com/portainer/portainer/issues/4944) +* Added the ability to edit environment variables for stacks on docker standalone: [portainer/portainer#3441](https://github.com/portainer/portainer/issues/3441) +* Docker container stats graphs now support cgroups v2: [portainer/portainer#4818](https://github.com/portainer/portainer/issues/4818) +* Improved how to change the image when editing a Service by pre-populating the fields in the UI: [portainer/portainer#5150](https://github.com/portainer/portainer/issues/5150) +* Fixed issue where all images regardless of their tag would be pulled: [portainer/portainer#4870](https://github.com/portainer/portainer/issues/4870) +* Fixed issue where volumes would lose their access control settings: [portainer/portainer#4851](https://github.com/portainer/portainer/issues/4851) +* Fixed issue where standard users were unable to browse volumes created by stacks: [portainer/portainer#4929](https://github.com/portainer/portainer/issues/4929) +* Fixed issue where ports would show for IPv4 as well as IPv6: [portainer/portainer#5038](https://github.com/portainer/portainer/issues/5038) +* Fixed issue where `container_name` validation would not take stopped containers into account: [portainer/portainer#5522](https://github.com/portainer/portainer/issues/5522) +* Fixed issue where editing a stack would warn about the container name being in use: [portainer/portainer#5130](https://github.com/portainer/portainer/issues/5130) +* Fixed issue where navigating away incorrectly showed a changes not saved popup: [portainer/portainer#5512](https://github.com/portainer/portainer/issues/5512) +* Fixed issue where the stack name would contain spaces or upper case characters: [portainer/portainer#5153](https://github.com/portainer/portainer/issues/5153) +* Fixed issue where the UI would incorrectly report that an image was successfully pulled: [portainer/portainer#3123](https://github.com/portainer/portainer/issues/3123) +* Fixed issue where the Stack editor would not always load its content: [portainer/portainer#5102](https://github.com/portainer/portainer/issues/5102) +* Fixed issue where environment variables were incorrectly showing when the value contained an equals sign: [portainer/portainer#5395](https://github.com/portainer/portainer/issues/5395) +* Fixed issue where the browser console would show errors in the container and image details view: [portainer/portainer#5511](https://github.com/portainer/portainer/issues/5511) +* Fixed issue where dashes and underscores in stack names were being removed: [portainer/portainer#5759](https://github.com/portainer/portainer/issues/5759) +* Fixed UI issue where adding a Service with a mix of TCP and UDP was being prevented: [portainer/portainer#5521](https://github.com/portainer/portainer/issues/5521) +* Fixed issue where images could be used in custom templates notes: [portainer/portainer#5805](https://github.com/portainer/portainer/issues/5805) +* Fixed issue where automatic updates would keep polling when the user that created the stack is removed: [portainer/portainer#5719](https://github.com/portainer/portainer/issues/5719) +* Fixed issue where automatic updates of stacks fail after restarting Portainer: [portainer/portainer#5914](https://github.com/portainer/portainer/issues/5914) +* Fixed issue where stack names were not being validated when using custom templates: [portainer/portainer#5841](https://github.com/portainer/portainer/issues/5841) +* Fixed issue where stats were not working on windows containers: [portainer/portainer#5826](https://github.com/portainer/portainer/issues/5826) +* Fixed issue where the scale labels of the stats graph was showing multiple times: [portainer/portainer#5843](https://github.com/portainer/portainer/issues/5843) +* Fixed UI issue when using a personal access token to deploy from Git: [portainer/portainer#5847](https://github.com/portainer/portainer/issues/5847) +* Fixed UI issue with empty stack dropdown when deploying an application via the form: [portainer/portainer#5848](https://github.com/portainer/portainer/issues/5848) +* Fixed issue where migrating a stack shows up twice: [portainer/portainer#5159](https://github.com/portainer/portainer/issues/5159) +* Fixed issue where switching from docker standalone to swarm would show duplicate stacks + +### Portainer + +* Added automatic updates of stacks and applications to the activity logs +* Introduced the ability to define a time based change window in which automatic updates of stacks and applications can take place +* Introduced the ability to automatically set OAuth users as a Portainer Admin +* Introduced the ability to automatically set LDAP users as a Portainer Admin +* Added a Portainer and Agent Juju Charm to the Charmhub marketplace +* Introduced dark theme and high contrast mode: [portainer/portainer#5493](https://github.com/portainer/portainer/issues/5493) +* Introduced the ability to access Portainer via HTTPS: [portainer/portainer#5462](https://github.com/portainer/portainer/issues/5462) +* Renamed Endpoints to Environments in the UI: [portainer/portainer#5492](https://github.com/portainer/portainer/issues/5492) +* Improved the menu UI to indicate the existence of sub items: [portainer/portainer#5528](https://github.com/portainer/portainer/issues/5528) +* Improved UI how to add environments to Portainer when doing a new installation: [portainer/portainer#5477](https://github.com/portainer/portainer/issues/5477) +* Added functionality to copy error messages from toast notifications: [portainer/portainer#5720](https://github.com/portainer/portainer/issues/5720) +* Improved how a Portainer upgrade can be rolled back: [portainer/portainer#5482](https://github.com/portainer/portainer/issues/5482) +* Improved UI where the table background wasn't working very well in dark mode: [portainer/portainer#5714](https://github.com/portainer/portainer/issues/5714) +* Fixed issue where Git content could not be cloned when Portainer is behind a proxy: [portainer/portainer#3286](https://github.com/portainer/portainer/issues/3286) +* Fixed issue where the SSL certificates were not included in the Portainer backup: [portainer/portainer#5497](https://github.com/portainer/portainer/issues/5497) +* Fixed issue where editing an endpoint results in errors: [portainer/portainer#5318](https://github.com/portainer/portainer/issues/5318) +* Fixed upgrade issue where disconnected endpoints caused the upgrade to fail: [portainer/portainer#5764](https://github.com/portainer/portainer/issues/5764) +* Fixed issue with the layout of the add Environment Wizard: [portainer/portainer#5801](https://github.com/portainer/portainer/issues/5801) +* Fixed issue where the custom logo was not used in all places: [portainer/portainer#5447](https://github.com/portainer/portainer/issues/5447) +* Fixed issue where the DockerHub anonymous registry was being used instead of one with an account: [portainer/portainer#5896](https://github.com/portainer/portainer/issues/5896) +* Fixed issue where upgrade fails: [portainer/portainer#5969](https://github.com/portainer/portainer/issues/5969) +* Fixed issue where the Quick Setup wizard wasn't showing correctly when using the dark theme: [portainer/portainer#5842](https://github.com/portainer/portainer/issues/5842) +* Fixed issue where uploading a backup file could not select a file on Mac: [portainer/portainer#5357](https://github.com/portainer/portainer/issues/5357) +* Fixed issue where the URL of an Environment would change to localhost: [portainer/portainer#5803](https://github.com/portainer/portainer/issues/5803) +* Fixed issue where RBAC settings would be retained after removing an Environment from Portainer +* Fixed issue where certificates would end up in the activity logs +* Fixed issue when exporting activity logs as CSV without a data range set +* Added a build for Windows Server 20H2: [portainer/portainer#4971](https://github.com/portainer/portainer/issues/4971) +* Added a build for Windows Server 21H2: [portainer/portainer#5763](https://github.com/portainer/portainer/issues/5763) + +### Registries + +* Improved UI to provide information for correctly using a ProGet registry: [portainer/portainer#5510](https://github.com/portainer/portainer/issues/5510) +* Fixed UI issue where the registry list incorrectly showed that there's no registry available: [portainer/portainer#5731](https://github.com/portainer/portainer/issues/5731) + +### ACI + +* Fixed issue where ACI stopped working when the number of exposed ports and container ports were different: [portainer/portainer#5335](https://github.com/portainer/portainer/issues/5335) +* Fixed issue where ACI would show errors when a resource group had multiple containers: [portainer/portainer#5335](https://github.com/portainer/portainer/issues/5335) + +### Edge + +* Introduced the ability to use Edge Stacks on Kubernetes via Edge Agents: [portainer/portainer#5472](https://github.com/portainer/portainer/issues/5472) +* Introduced the ability to re-associate an edge endpoint to a new Edge Agent: [portainer/portainer#5473](https://github.com/portainer/portainer/issues/5473) +* Improved the REST API access of the Edge Agent in Docker standalone: [portainer/agent#187](https://github.com/portainer/agent/issues/187) +* Fixed issue where the heartbeat indicator was not reliable: [portainer/portainer#5569](https://github.com/portainer/portainer/issues/5569) +* Fixed issues with the Edge Agent reverse tunnel timing out: [portainer/portainer#5725](https://github.com/portainer/portainer/issues/5725) + +### Development + +* Added the ability to query the endpoints by type through the Portainer API: [portainer/portainer#4786](https://github.com/portainer/portainer/issues/4786) +* Integrated with Logrus for the internal logging mechanism: [portainer/portainer#5509](https://github.com/portainer/portainer/issues/5509) +* Updated the Golang version to 1.16: [portainer/portainer#5463](https://github.com/portainer/portainer/issues/5463) +* Improved the Portainer API documentation for adding users: [portainer/portainer#5136](https://github.com/portainer/portainer/issues/5136) +* Fixed inconsistencies in the Portainer API documentation: [portainer/portainer#5527](https://github.com/portainer/portainer/issues/5527) +* Updated the Swagger documentation: [portainer/portainer#5338](https://github.com/portainer/portainer/issues/5338) + +## Release 2.7.0 + +July 29, 2021 + +### **Docker** + +* Added the ability to update and redeploy a stack created from a git repository +* Added I/O usage to the container statistics +* Enhanced environment variables UI/UX for Docker +* sysctl options are available when creating a container +* Show the number of Swarm nodes for the endpoint on the Home page +* Show how many Docker pulls are remaining for DockerHub to avoid exceeding the quota +* Introduced support for compose version 3.8 on docker swarm environments +* Display the container IP address(es) in the list of containers +* Improved layout of the toggles on the create container setting tab +* For Docker Standalone, prevent a stack from being created if the Compose has a container\_name that already exists +* Creating a container from a DockerHub image will show a search button in the UI +* Fixed issue where deploying a stack from Git did not work for Azure DevOps +* Fixed issue where stacks with a status of 0 are hidden in the UI +* Fixed issue where pulling a large image is failing when using an Agent due to a timeout +* Fixed issue where listing the services with Auto-refresh on collapses all services after refresh +* Fixed issue where dash characters got removed from the stack name on Docker Standalone +* Fixed issue where access control management via labels was not fault tolerant +* Fixed issue where the label showing the default location of secrets was incorrect for Windows +* Fixed typo in the error message "Unable to start stack" + +### **Registries** + +* Added ProGet as a specific registry type when adding a registry +* Fixed issue where pushing to a quay.io registry failed due to not including the username in the quay registry URL + +### **Templates** + +* Fixed issue where creating a custom template from uploading a compose file failed +* Fixed issue where switching custom template in the template tab of stack create view doesn't update editor +* Fixed issue with an invalid template documentation URL in the Settings + +### **Volumes** + +* Added validation to prevent adding empty mount to an existing service +* Fixed issue with the MountType and nfsvers when creating NFS4 volumes +* Fixed issue where editing the properties of volumes on a service did not enable the apply button + +### **Kubernetes** + +* Introduced the ability to deploy a manifest from a git repository when using advanced deployment +* The advanced deployment feature has been made available to standard users +* Introduced a summary of Kubernetes actions when deploying a Kubernetes resource +* Added the ability to display realtime node metrics in Kubernetes +* Added functionality to allow multiple ingress networks per kubernetes namespace, with a differing config per ingress +* Added the ability to redeploy an externally deployed application +* Added the ability to expand the YAML tab of a Kubernetes application to full size +* Added the ability to cordon/uncordon/drain nodes +* Added a warning in the placement tab when an application can't be scheduled on the cluster +* Renamed Resource Pools to Namespaces in the UI +* Improved UI for the placement policies when creating an application +* Improved how application image names are shown +* Form validation has been added for Configuration keys +* Environment variable are sorted alphabetically to improve the readability +* Display the ImagePull policy in the details of an application +* Default to the kube-system namespace in the advanced deployment view on ARM +* Fixed minor UI inconsistency when creating an application with an ingress +* Fixed issue with the UI layout when creating an application with ingress +* Fixed issue where updating the Kubernetes endpoint URL did not get persisted +* Fixed issue where the endpoint url is not updated when updating a kubernetes local endpoint +* Fixed issue where renaming the endpoint of a kubernetes agent breaks the endpoint +* Fixed issue where environment variables with empty values are not showing when editing a kubernetes application +* Fixed issue where environment variable validation when creating an application was too restrictive +* Fixed issue where creating an application with two different ingresses incorrectly populates the hostname UI fields +* Fixed issue where an application with persisted data can't update, after the storage option is disabled in the cluster settings +* Fixed issue where adding an ingress route is not prevented when editing an application with existing ingress route and ingress is disabled +* Fixed issue where adding an application does not allow Global to be set + +### **ACI** + +* Fixed issue where ACI stops working after persistence or networking gets added + +### **Edge** + +* Added the ability to deploy Edge stacks on Docker standalone Edge endpoints +* Show the status of the edge agent check-in on the home page dashboard +* Hide the webhook UI in the service creation view of an edge endpoint, since it's not applicable +* Fixed issue where accessing a down Kubernetes Edge endpoint should redirect the user to the home view + +### **Portainer** + +* Added the ability to sync Portainer teams with group memberships provided via OAuth +* Added SSO support for OAuth and do not enforce a login prompt. Use `/#!/internal-auth` to login with internal admin. +* Added the ability to manage orphaned stacks when Portainer has the compose file +* Added the option to specify the local socket location when adding a docker endpoint +* Search filters are retained within the browser session +* Properly expose backend error when using image management features +* Prevent web editor related views from being accidentally closed +* Improved descriptions for Portainer initialization errors +* Disable sysctl settings for non-administrators incorrectly defaults to being on +* Fixed issue where the File select windows gets shown when pressing enter in text fields +* Fixed issue where restoring Portainer from a backup file fails in certain circumstances related to the activity logs +* Fixed issue where a custom snapshot interval cannot be changed +* Fixed issue with incorrect Windows agent deployment command in the agent endpoint creation tab + +### **Podman** + +* Introduced initial experimental support for Podman. Known limitations are listed in https://github.com/portainer/portainer/issues/5188 + +### **Development** + +* Introduce buildx to support Windows 1903+ Base Images +* Added the ability to debug through VSCode +* Added check for missing angularJS inject annotation +* Removed grunt-karma ang grunt-html2js dependencies +* Fixed issue where webpack complains about charset source maps +* Fixed issue where babel complains about missing core-js dependency + +### **Known Issues** + +* Logging into Portainer as a Standard User fails to load home page when using 'microk8s v1.21.3-3+6343a564e351b0' +* Host Management features do not work on Windows Hosts [#4450](https://github.com/portainer/portainer/issues/4450) +* Host Browser function does not work for Non-Admin users. + +## Release 2.4.0 + +May 4, 2021 + +### **Kubernetes​** + +* Pods without workloads are now displayed as applications +* Improved UI/UX of configurations for creation / edition +* Introduced request of confirmation upon volume removal +* Introduced the advanced deployment panel to each resource list view +* Updated validation to prevent a user from exposing an application over an external load balancer with mixed protocols +* Introduced the ability to display the access policy associated to the storage of a volume +* Clarified advanced deployment feature +* Clarified sensitive configuration creation +* Clarified ingress controller configuration in the cluster setup view +* Renamed the create entry from file button when creating a configuration +* Improved validation warnings in the application creation / edition views +* Removed extra whitespace in stacks and storage datatables +* Fixed issue with access management feature on resource pools +* Fixed issue with ability to retrieve configs when a config is a binary file +* Fixed issue with advanced deployment feature on agent and Edge agent endpoints +* Fixed an issue that would mark a sensitive configuration as external without owner after an update +* Fixed issue with access to configuration details view for a configuration containing binary data +* Fixed labels to display system labels first in the node details view +* Fixed refresh issue on the view with the YAML panel selected +* Fixed invalid display issue when accessing the load balancer panel from the application panel +* Fixed issue when accessing the cluster setup incorrectly expanding the Endpoint sidebar +* Fixed issue with exposed configuration keys over filesystem inside an application not being applied +* Fixed issue when Adding a key to existing used configuration that would throw an error when editing an application using that configuration +* Fixed an issue with the form validation in the configuration creation view +* Fixed issue with resource pool “created” attribute not showing actual creation time +* Fixed issue with ability to apply a note to a Pod type application +* Fixed issue with creating Kubernetes resources with a username longer than 63 characters +* Fixed issue with special characters in usernames when creating Kubernetes resources +* Fixed issue with ability to retrieve config map error when trying to manager newly create resource pool​ + +### **Activity Logging ​** + +* Introduced user authentication activity logging +* Introduced user activity logging​ + +### **RBAC ​** + +* Introduced new RBAC “Operator” Role +* Fixed issue with user in 2 team with mix of helpdesk & endpoint admin resulting in the user having permissions of endpoint admin​ + +### **Registries ​** + +* Fixed issue causing Portainer to forget the password associated to a registry after an update +* Fixed issue preventing the registry manager feature to work properly with a ProGet registry +* Improved description for advanced mode usage with private registries​ + +### **Swarm ​** + +* Introduced validation to prevent adding a mount with nothing filled to and exiting service +* Fixed issue in service creation, switching to bind mode from volume mode with a volume selected fills the host field with {object Object}​ + +### **Stacks ​** + +* Introduced support for creating stacks with the same name across different endpoints +* Introduced extra stack information: creation, last update time and user who created the stack +* Minor UX change for the start/stop stack action +* Fixed issue with ability to use private registries with Standalone stacks +* Fixed issue showing editor tab on limited stacks when it should not +* Fixed issue when editing a stack, hitting backspace or delete keys with contents of web editor selected hides the entire editor UI element +* Fixed issue with stack create via API with a regular user account are incorrectly marked as administrator only +* Fixed issue of error being displayed when creating a stack on docker standalone despite the stack is created +* Fixed issue of stacks being created via API incorrectly marked private with no owner​ + +### **Docker ​** + +* Introduced support for Compose > v2 when deploying a stack on a Docker standalone environment +* Introduced the ability to download log file from Docker container/service views +* Display labels in Image Details +* Clarify the description of the restrict external access to the network property when creating a network​ + +### **User Management ​** + +* Automatically lowercase username when authenticating users +* Update the authentication UX to put an emphasis on OAuth when OAuth is enabled​ + +### **Portainer** + +* Introduced the ability to backup / restore Portainer +* Fixed issue of version not being shown correctly after update +* Support starting Portainer without having to specify any endpoint​ + +### **ACI** + +* Introduced RBAC to ACI +* Introduced UAC to ACI​ + +### **Minor Changes​** + +* Removed the new version check +* Changed the license server errors to be a silent fail for offline environments +* Added JS source map for Portainer UI + +## Release 2.0.1 + +February 22, 2021 + +### **Fixes** + +* **Fix an issue preventing a user from creating Kubernetes resources if they have a `@` character in their username**\ + Users with a `@` character in their username were not able to create the following Kubernetes resources: + * Resource pool + * Application + * Configuration +* **Fix platform issues with the Docker image for Portainer Business**\ + The Docker image can now be successfully deployed on the following platforms: + * Linux ARM64 + * Linux ARM +* **Minor update to the license server mechanism**\ + The license server mechanism has been updated. + +## Release 2.0.0 + +December 3, 2020 + +Initial release of Portainer Business diff --git a/start/architecture.md b/start/architecture.md new file mode 100644 index 00000000..1b75402f --- /dev/null +++ b/start/architecture.md @@ -0,0 +1,29 @@ +# Portainer architecture + +## Overview of Portainer architecture + +Portainer consists of two elements: the Portainer Server and the Portainer Agent. Both run as lightweight containers on your existing containerized infrastructure. The Portainer Agent should be deployed to each node in your cluster and configured to report back to the Portainer Server container. + +A single Portainer Server will accept connections from any number of Portainer Agents, providing the ability to manage multiple clusters from one centralized interface. To do this, the Portainer Server container requires data persistence. The Portainer Agents are stateless, with data being shipped back to the Portainer Server container. + +![The Portainer architecture](../.gitbook/assets/portainer-architecture-detailed.png) + +{% hint style="info" %} +We don't currently support running multiple instances of the Portainer Server container to manage the same clusters. We recommend running the Portainer Server on a specific management node, with Portainer Agents deployed across the remaining nodes. +{% endhint %} + +## Agent vs Edge Agent + +In standard deployments, the central Portainer Server instance and any environments it manages are assumed to be on the same network, that is, Portainer Server and the Portainer Agents are able to seamlessly communicate with one another. However, in configurations where the remote environments are on a completely separate network to Portainer Server, say, across the internet, historically we would have been unable to centrally manage these devices. + +With the new Edge Agent, we altered the architecture. Rather than the Portainer Server needing seamless access to the remote environment, only the remote environments need to be able to access the Portainer Server. This communication is performed over an encrypted TLS tunnel. This is important in Internet-connected configurations where there is no desire to expose the Portainer Agent to the internet. + +## Security and compliance + +Portainer runs exclusively on your servers, within your network, behind your own firewalls. As a result, we do not currently hold any SOC or PCI/DSS compliance because we do not host any of your infrastructure. You can even run Portainer completely disconnected (air-gapped) without any impact on functionality. + +While we do (optionally) collect anonymous usage analytics from Portainer installations, we remain compliant with GDPR. Data collection can be disabled when you install the product, or at any time after that. If your installation is air-gapped, collection will silently fail without any adverse effects. + +{% content-ref url="requirements-and-prerequisites.md" %} +[requirements-and-prerequisites.md](requirements-and-prerequisites.md) +{% endcontent-ref %} diff --git a/start/install/README.md b/start/install/README.md new file mode 100644 index 00000000..51d0fe4f --- /dev/null +++ b/start/install/README.md @@ -0,0 +1,15 @@ +# Install Portainer + +Portainer is straightforward to install. There are two options: installing new or adding an environment to an existing installation. + +{% hint style="info" %} +If you haven't already, please check that your environments meet [our requirements](../requirements-and-prerequisites.md) before proceeding. +{% endhint %} + +{% content-ref url="server/" %} +[server](server/) +{% endcontent-ref %} + +{% content-ref url="agent/" %} +[agent](agent/) +{% endcontent-ref %} diff --git a/start/install/agent/README.md b/start/install/agent/README.md new file mode 100644 index 00000000..320437d4 --- /dev/null +++ b/start/install/agent/README.md @@ -0,0 +1,32 @@ +# Add an environment to an existing installation + +If you want to add another environment to your existing Portainer installation, first select the type of environment you would like to add: + +{% content-ref url="docker/" %} +[docker](docker/) +{% endcontent-ref %} + +{% content-ref url="swarm/" %} +[swarm](swarm/) +{% endcontent-ref %} + +{% content-ref url="kubernetes/" %} +[kubernetes](kubernetes/) +{% endcontent-ref %} + +{% content-ref url="aci.md" %} +[aci.md](aci.md) +{% endcontent-ref %} + +{% content-ref url="nomad.md" %} +[nomad.md](nomad.md) +{% endcontent-ref %} + +{% content-ref url="kaas/" %} +[kaas](kaas/) +{% endcontent-ref %} + +{% content-ref url="edge.md" %} +[edge.md](edge.md) +{% endcontent-ref %} + diff --git a/start/install/agent/aci.md b/start/install/agent/aci.md new file mode 100644 index 00000000..319662ff --- /dev/null +++ b/start/install/agent/aci.md @@ -0,0 +1,31 @@ +# Azure ACI + +Before connecting to your Azure subscription, you need to create an Azure AD application. For more information on this please refer to the [official Microsoft documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal). + +{% hint style="info" %} +The following ACI features are not currently supported: + +* ACI Persistent Storage +* Private networks +{% endhint %} + +To add an ACI environment, click on **Environments** then click the **Add environment** button. + +
+ +Select **ACI** as your environment type and click **Start Wizard**. Enter the **environment details** using the table below as a guide. + +| Field | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Application ID | Enter the application ID for the app you created in your Azure account. This can be found on the **Overview** page of your app within the Azure Portal. | +| Tenant ID | Enter the tenant ID for your app. This can be found on the **Overview** page of your app within the Azure Portal. | +| Authentication Key | Enter the client secret for your app. This can be created under **Certificates & secrets** within your application in the Azure Portal. | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../../../admin/environments/groups.md) or [tagging](../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/start/install/agent/docker/README.md b/start/install/agent/docker/README.md new file mode 100644 index 00000000..9481f627 --- /dev/null +++ b/start/install/agent/docker/README.md @@ -0,0 +1,15 @@ +# Docker Standalone + +Installation instructions can differ between platforms. Please choose your platform below: + +{% content-ref url="linux.md" %} +[linux.md](linux.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} + +{% content-ref url="wcs.md" %} +[wcs.md](wcs.md) +{% endcontent-ref %} diff --git a/start/install/agent/docker/linux.md b/start/install/agent/docker/linux.md new file mode 100644 index 00000000..66a4f390 --- /dev/null +++ b/start/install/agent/docker/linux.md @@ -0,0 +1,37 @@ +# Install Portainer Agent with Docker on Linux + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/docker/linux.md) first. + +You will need: + +* The latest version of Docker installed and working. +* `sudo` access on the machine that you wish to install the Portainer Agent on. +* Port `9001` accessible on this machine from the Portainer Server instance. If this is not available, we recommend using the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. The Portainer Agent does not support connecting to the Docker engine via TCP. +* SELinux is disabled on the machine running Docker. If you require SELinux, you will need to pass the `--privileged` flag to Docker when deploying Portainer. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent when deploying with: + + `-e AGENT_SECRET=yoursecret` + +## Deployment + +Run the following command to deploy the Portainer Agent: + +```bash +docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent:latest +``` + +## Adding your new environment + +Once the agent has been installed you are ready to add the environment to your Portainer Server installation. + +{% content-ref url="../../../../admin/environments/add/docker.md" %} +[docker.md](../../../../admin/environments/add/docker.md) +{% endcontent-ref %} diff --git a/start/install/agent/docker/wcs.md b/start/install/agent/docker/wcs.md new file mode 100644 index 00000000..ebb85180 --- /dev/null +++ b/start/install/agent/docker/wcs.md @@ -0,0 +1,32 @@ +# Install Portainer Agent with Docker on Windows Container Service + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/docker/wcs.md) first. + +You will need: + +* The latest version of Docker installed and working. +* Administrator access on the machine that will host your Portainer Server instance. +* Port `9001` accessible on this machine from the Portainer Server instance. If this is not available, we recommend using the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent when deploying with: + + `-e AGENT_SECRET=yoursecret` + +## Deployment + +To run Portainer Agent in a Windows Container scenario, you need to execute the following commands: + +```bash +docker run -d -p 9001:9001 --name portainer_agent --restart=always -v C:\:C:\host -v C:\ProgramData\docker\volumes:C:\ProgramData\docker\volumes -v \\.\pipe\docker_engine:\\.\pipe\docker_engine portainer/agent:latest +``` + +Once the agent has been installed you are ready to add the environment to your Portainer Server installation. + +{% content-ref url="../../../../admin/environments/add/docker.md" %} +[docker.md](../../../../admin/environments/add/docker.md) +{% endcontent-ref %} diff --git a/start/install/agent/docker/wsl.md b/start/install/agent/docker/wsl.md new file mode 100644 index 00000000..50eaa07f --- /dev/null +++ b/start/install/agent/docker/wsl.md @@ -0,0 +1,38 @@ +# Install Portainer Agent with Docker on WSL / Docker Desktop + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/docker/wsl.md) first. + +You will need: + +* The latest version of Docker Desktop installed and working. +* Administrator access on the machine that will host the Portainer Agent. +* Windows Subsystem for Linux (WSL) installed and a Linux distribution selected. For a new installation we recommend WSL2. +* Port `9001` accessible on this machine from the Portainer Server instance. If this is not available, we recommend using the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. The Portainer Agent does not support connecting to the Docker engine via TCP. +* SELinux is disabled within the Linux distribution used by WSL. If you require SELinux, you will need to pass the `--privileged` flag to Docker when deploying Portainer. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent when deploying with: + + `-e AGENT_SECRET=yoursecret` + +## Deployment + +Run the following command to deploy the Portainer Agent: + +```bash +docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent:latest +``` + +## Adding your new environment + +Once the agent has been installed you are ready to add the environment to your Portainer Server installation. + +{% content-ref url="../../../../admin/environments/add/docker.md" %} +[docker.md](../../../../admin/environments/add/docker.md) +{% endcontent-ref %} diff --git a/start/install/agent/edge.md b/start/install/agent/edge.md new file mode 100644 index 00000000..628155e1 --- /dev/null +++ b/start/install/agent/edge.md @@ -0,0 +1,57 @@ +# Edge Agent + +## Introduction + +When a remote environment is not directly accessible from the Portainer Server instance, we recommend deploying the Portainer _Edge Agent_ to the remote environment. This allows you to manage the remote environment from your Portainer Server instance without having to open any ports on the environment. Rather than the traditional approach of the server connecting to Agents, the Edge Agent instead polls the Portainer Server periodically to see if there are any pending jobs to perform, and acts appropriately. + +{% hint style="info" %} +For a technical summary of how the Edge Agent works, refer to our [advanced documentation](../../../advanced/edge-agent.md). +{% endhint %} + +## Preparation + +The Edge Agent requires two ports be open on the Portainer Server instance: the UI port (usually `9443` or `30779` on Kubernetes with NodePort) and the tunnel port ( `8000` or `30776` when using Kubernetes with NodePort). The tunnel port is used to provide a secure TLS tunnel between the Portainer Edge Agent and the Portainer Server instance. Our [installation instructions](../server/) configure Portainer Server to listen on both ports by default, and you will need to ensure your firewalling provides external access to these ports in order to proceed. + +{% hint style="warning" %} +If your Portainer Server instance is deployed with TLS, the agent will use HTTPS for the connection it makes back to Portainer. However if your Portainer instance uses a self-signed certificate, the Edge Agent must be deployed with the `-e EDGE_INSECURE_POLL=1` flag. If you do not deploy the Edge Agent with this flag, then the agent will not be able to communicate with the Portainer Server instance. +{% endhint %} + +In addition, our instructions assume your environment meets [our requirements](../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. + +## Deploying + +To add an Edge Agent, click on **Environments** then **Add environment**. + +
+ +Select either **Docker Standalone**, **Docker Swarm** or **Kubernetes** depending on your environment type, then click **Start Wizard**. Then select the **Edge Agent** option. Enter the environment details **** using the table below as a guide. + +| Field | Overview | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Portainer API server URL | Enter the URL and port of your Portainer Server instance as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this. | +| Portainer tunnel server address |

Enter the address and port of your Portainer Server instance's tunnel server as it will be seen from your Edge environment. If using a FQDN, ensure that DNS is properly configured to provide this.
In most cases, this will be the same address as the Portainer API server URL, but without the protocol and on port 8000.

| + +
+ +As an optional step you can expand the **More settings** section and adjust the Poll frequency for the environment - this defines how often this Edge Agent will check the Portainer Server for new jobs. The default is every 5 seconds. You can also categorize the environment by adding it to a [group](../../../admin/environments/groups.md) or [tagging](../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Create**. Then complete the new fields that have appeared using the table below as a guide. + +| Field/Option | Overview | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Environment variables | Enter a comma separated list of environment variables that will be sourced from the host where the agent is deployed and provided to the agent. | +| Allow self-signed certs | Toggle this on to allow self-signed certificates when the agent is connecting to Portainer via HTTPS. | + +
+ +Choose your platform and environment where applicable, copy the generated command and run the command on your Edge environment to complete the installation. Alternatively if you are prestaging your Edge Agent, you can retrieve the join token here. You can also adjust the environment configuration from this page. + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you **must** remember to explicitly provide this when deploying your Edge Agent. +{% endhint %} + + If you have another Edge environment of the same type to deploy you can click **Add another environment** to do so. Otherwise if you have any other environments to configure click **Next** to proceed, or click **Close** to return to the list of environments. + diff --git a/start/install/agent/kaas/README.md b/start/install/agent/kaas/README.md new file mode 100644 index 00000000..2a31b88a --- /dev/null +++ b/start/install/agent/kaas/README.md @@ -0,0 +1,37 @@ +# KaaS + +Portainer supports the provisioning of new Kubernetes environments on select cloud providers directly from within the interface, allowing you to spin up a new cloud Kubernetes environment and deploy the Portainer Agent with a few clicks. + +{% hint style="info" %} +This feature is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=kaas-provisioning). +{% endhint %} + +To get started, select **Environments** from the left hand menu then click **Add Environment**. + +
+ +From the wizard select the **KaaS** option and click **Start Wizard**. Then, select your provider. We currently support the following providers: + +{% content-ref url="civo.md" %} +[civo.md](civo.md) +{% endcontent-ref %} + +{% content-ref url="linode.md" %} +[linode.md](linode.md) +{% endcontent-ref %} + +{% content-ref url="digitalocean.md" %} +[digitalocean.md](digitalocean.md) +{% endcontent-ref %} + +{% content-ref url="gke.md" %} +[gke.md](gke.md) +{% endcontent-ref %} + +{% content-ref url="eks.md" %} +[eks.md](eks.md) +{% endcontent-ref %} + +{% content-ref url="aks.md" %} +[aks.md](aks.md) +{% endcontent-ref %} diff --git a/start/install/agent/kaas/aks.md b/start/install/agent/kaas/aks.md new file mode 100644 index 00000000..d0e395e4 --- /dev/null +++ b/start/install/agent/kaas/aks.md @@ -0,0 +1,37 @@ +# Azure + +Select the **Azure** option from the list of providers. If you haven't already configured credentials for Azure you'll be asked to provide them now. Enter a **name** for your credentials then enter your **Subscription ID**, **Tenant ID**, **Client ID** and **Client Secret**. Once this is done, click **Save**. + +{% hint style="info" %} +You can find more details on [setting up access to your Azure account](../../../../admin/settings/cloud/aks.md) in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| Resource group | Select an existing resource group or add a new resource group for your cluster. | +| Node pool name | Enter a name for your node pool. | +| Node size | Select the size of the individual nodes in your cluster. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Availability zones | Select the availability zones to use for your cluster. | +| API server availability | Select the uptime SLA you require for your cluster. | +| DNS name prefix | Enter the DNS name prefix to use with your cluster. You will use this to connect to the Kubernetes API when managing containers after creating the cluster. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** under the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kaas/civo.md b/start/install/agent/kaas/civo.md new file mode 100644 index 00000000..93f43710 --- /dev/null +++ b/start/install/agent/kaas/civo.md @@ -0,0 +1,33 @@ +# Civo + +Select the **Civo** option from the list of providers. If you haven't already provided your Civo API token you'll be asked to provide credential details. Provide a **name** for your credentials and paste your Civo API token into the **API key** field and click **Add credentials**. + +{% hint style="info" %} +You can find more details on [setting up access to your Civo account](../../../../admin/settings/cloud/civo.md) in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| ------------------ | -------------------------------------------------------------------- | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| Node size | Select the size of the individual nodes in your cluster. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Network ID | Select the network to add your cluster to. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster. | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** in the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kaas/digitalocean.md b/start/install/agent/kaas/digitalocean.md new file mode 100644 index 00000000..e2baac2c --- /dev/null +++ b/start/install/agent/kaas/digitalocean.md @@ -0,0 +1,32 @@ +# DigitalOcean + +Select the **DigitalOcean** option from the list of providers. If you haven't already provided your DigitalOcean API token you'll be asked to provide credentials. Provide a **name** for your credentials and paste your DigitalOcean API token into the **API key** field and click **Add credentials**. + +{% hint style="info" %} +You can find more details on [setting up access to your DigitalOcean account](../../../../admin/settings/cloud/digitalocean.md) in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| ------------------ | -------------------------------------------------------------------- | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| Node size | Select the size of the individual nodes in your cluster. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster. | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** under the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kaas/eks.md b/start/install/agent/kaas/eks.md new file mode 100644 index 00000000..19dabc82 --- /dev/null +++ b/start/install/agent/kaas/eks.md @@ -0,0 +1,34 @@ +# AWS + +Select the **AWS** option from the list of providers. If you haven't already configured credentials for AWS you'll be asked to provide them now. Enter a **name** for your credentials then enter your **Access key ID** and **Secret access key**. Once this is done, click **Save**. + +{% hint style="info" %} +You can find more details on [setting up access to your AWS account](../../../../admin/settings/cloud/eks.md) in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| AMI type | Select the AMI type to use for your nodes. | +| Instance type | Select the instance type to use for your nodes. You will need to make sure that the instance type you choose is available in the region you choose or the provision will fail. | +| Node disk size (GiB) | Enter the amount of disk space to provision on each node. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** under the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kaas/gke.md b/start/install/agent/kaas/gke.md new file mode 100644 index 00000000..e39aad71 --- /dev/null +++ b/start/install/agent/kaas/gke.md @@ -0,0 +1,34 @@ +# Google Cloud + +Select the **Google Cloud** option from the list of providers. If you haven't already configured credentials for Google Cloud you'll be asked to provide them now. Enter a **name** for your credentials then click **Upload file** and select your JSON private key. Once this is done, click **Save**. + +{% hint style="info" %} +You can find more details on [setting up access to your Google Cloud account ](../../../../admin/settings/cloud/gke.md)in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------- | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| Node size | Select the size of the individual nodes in your cluster. | +| Node disk space (GB) | Enter the amount of disk space to provision on each node. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Subnet | Select the subnet to attach to the cluster. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** under the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kaas/linode.md b/start/install/agent/kaas/linode.md new file mode 100644 index 00000000..83d51f25 --- /dev/null +++ b/start/install/agent/kaas/linode.md @@ -0,0 +1,32 @@ +# Linode + +Select the **Linode** option from the list of providers. If you haven't already provided your Linode API token you'll be asked to provide credentials. Provide a **name** for your credentials and paste your Linode API token into the **API key** field and click **Add credentials**. + +{% hint style="info" %} +You can find more details on [setting up access to your Linode account](../../../../admin/settings/cloud/linode.md) in the [cloud credentials documentation](../../../../admin/settings/cloud/). +{% endhint %} + +
+ +Once you have added your credentials (or if you already had them set up) select your cluster options from the fields below. + +| Field/Option | Overview | +| ------------------ | -------------------------------------------------------------------- | +| Name | Enter a name for your cluster. | +| Credentials | Select the set of credentials to use for the provision. | +| Region | Select the region to deploy your cluster in. | +| Node size | Select the size of the individual nodes in your cluster. | +| Node count | Enter the number of nodes to provision in your cluster. | +| Kubernetes version | Select the version of Kubernetes you want to deploy on your cluster. | + +{% hint style="info" %} +The environment options are refreshed automatically if the information cached by Portainer is over 12 hours old. You can manually refresh the options by clicking **Reload cluster details** under the **Actions** section. +{% endhint %} + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +Once you have made your selections, click **Provision environment** to begin the provision. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kubernetes/README.md b/start/install/agent/kubernetes/README.md new file mode 100644 index 00000000..96ff7a2c --- /dev/null +++ b/start/install/agent/kubernetes/README.md @@ -0,0 +1,21 @@ +# Kubernetes + +If you would like to provision a new Kubernetes environment on a cloud provider, we have instructions for this: + +{% content-ref url="../kaas/" %} +[kaas](../kaas/) +{% endcontent-ref %} + +If you have an existing Kubernetes environment you want to connect to Portainer, choose from the following options: + +{% content-ref url="import.md" %} +[import.md](import.md) +{% endcontent-ref %} + +{% content-ref url="baremetal.md" %} +[baremetal.md](baremetal.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} diff --git a/start/install/agent/kubernetes/baremetal.md b/start/install/agent/kubernetes/baremetal.md new file mode 100644 index 00000000..be534710 --- /dev/null +++ b/start/install/agent/kubernetes/baremetal.md @@ -0,0 +1,90 @@ +# Install Portainer Agent on your Kubernetes environment + +## Introduction + +Portainer consists of two elements, the _Portainer Server_ and the _Portainer Agent_. Both elements run as lightweight containers on Kubernetes. This document will outline how to install the Portainer Agent on your cluster and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/kubernetes/baremetal.md) first. + +To get started, you will need: + +* A working and up to date Kubernetes cluster. +* Access to run `kubectl` commands on your cluster. +* Cluster Admin rights on your Kubernetes cluster. This is so Portainer can create the necessary `ServiceAccount` and `ClusterRoleBinding` for it to access the Kubernetes cluster. + +The installation instructions also make the following assumption about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You will be using the `portainer` namespace for Portainer. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent by adding it to the YAML file within the agent deployment definition: + + `env:` + + `- name: AGENT_SECRET` + + `value: yoursecret` + +## Deployment + +To deploy Portainer Agent within a Kubernetes cluster you can use our provided YAML manifests. + +{% hint style="info" %} +Helm charts for agent-only deployments will be available soon. +{% endhint %} + +From the menu select **Environments** then click **Add environment**. + +
+ +Select the **Kubernetes** option and click **Start Wizard**. Select the **Agent** option and choose the tab that matches your configuration (**Kubernetes via load balancer** or **Kubernetes via node port**). Copy the command, then run it on the control node of your Kubernetes cluster. + +{% hint style="info" %} +Make sure you run this command on your Kubernetes node before continuing. +{% endhint %} + +
+ +The deployment command will return something similar to this: + +``` +namespace/portainer created +serviceaccount/portainer-sa-clusteradmin created +clusterrolebinding.rbac.authorization.k8s.io/portainer-crb-clusteradmin created +service/portainer-agent created +service/portainer-agent-headless created +deployment.apps/portainer-agent created +``` + +To validate that the agent is running, use this command: + +``` + kubectl get pods --namespace=portainer +``` + +The result should look something like this: + +``` +NAME READY STATUS RESTARTS AGE +portainer-agent-5988b5d966-bvm9m 1/1 Running 0 15m +``` + +Once the Portainer Agent has been successfully deployed on the cluster, you can complete the rest of the environment configuration. + +## Completing the configuration + +Regardless of the method used, once the agent is running on the Kubernetes host, you must complete the appropriate environmental details. + +{% hint style="warning" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node will allow Portainer to manage the entire cluster. +{% endhint %} + +| Field/Option | Overview | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Define the IP address or name used to connect to the environment (the Kubernetes host) and specify the port if required (`30778` when using NodePort; `9001` when using Load Balancer). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../../../../admin/environments/groups.md) or [tagging](../../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/start/install/agent/kubernetes/import.md b/start/install/agent/kubernetes/import.md new file mode 100644 index 00000000..8ae2cfd4 --- /dev/null +++ b/start/install/agent/kubernetes/import.md @@ -0,0 +1,80 @@ +# Import an existing Kubernetes environment + +With Portainer you can import your existing Kubernetes environment through the use of a [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) file. Portainer will use the information in the kubeconfig file to connect to your environment then deploy and configure the Portainer Agent for you. + +{% hint style="info" %} +This feature is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=k8s-create-from-kubeconfig). +{% endhint %} + +## Requirements + +While we have tried to support as many configurations as possible, there are a few requirements in order to fully support the import process: + +* Your cluster must have a load balancer configured and enabled. +* Your kubeconfig file must specify `current-context`. +* Your kubeconfig file must be self-contained (i.e., consist of only the one file with no external references). +* Your kubeconfig file must provide cluster admin level credentials, in order for Portainer to deploy the agent on your cluster. + +## Generating a kubeconfig file for import + +Depending on your environment, there may be different methods for creating a supported kubeconfig file. The following environment types are currently supported: + +### On-premise clusters + +For an on-premise cluster, you can use the following kubectl command to generate a supported kubeconfig file: + +``` +kubectl config view --flatten=true --minify=true > kubeconfig.yml +``` + +### Civo + +To create a kubeconfig file from a Civo cluster, log into the Civo dashboard and go to **Kubernetes**. Select the cluster to import and click on **Click to Download** next to the **Kubeconfig** label. + +### Linode + +To create a kubeconfig file from a Linode cluster, log into the Linode dashboard and click on **Kubernetes** in the left hand menu. Select the cluster to import, and in the top right of the page select **Actions** then **Download Config**. + +### DigitalOcean + +To create a kubeconfig file from a DigitalOcean cluster, log into the DigitalOcean dashboard and in the left hand menu select **Manage** then **Kubernetes**. Alternatively, go to **Projects**, select the project containing your cluster, then look in the **Clusters** panel. Select the cluster to import, then click the **Kubeconfig** option to download the kubeconfig file. + +### Microsoft Azure + +To create a kubeconfig file from an Azure cluster, download and install the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) from Microsoft. Start a shell session on Linux or an administrator PowerShell session on Windows, and run the following: + +``` +az login +``` + +This command can take a couple of minutes to complete the first time it is used, and involves a browser window opening in order to authenticate you with Azure. + +Once this completes and you are authenticated, run the following command: + +``` +az aks get-credentials --resource-group [resource-group-name] --name [cluster-name] --file ./kubeconfig-azure.yml +``` + +Replace `[resource-group-name]` with the resource group containing your cluster. Replace `[cluster-name]` with your cluster. + +## Importing your kubeconfig + +Once you have your kubeconfig file created, click on **Environments** then **Add environment**. + +
+ + Select the **Kubernetes** option and click **Start Wizard**. Then select the **Import** option. + +{% hint style="info" %} +The import option is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=k8s-create-from-kubeconfig). +{% endhint %} + +Enter a **name** for cluster then click **Select a file** to browse for your kubeconfig file. + +
+ +You can also expand the **More settings** section and set groups and tags for your environment now or you can do this later. + +
+ +When you're ready, click the **Connect** button. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments where you will see the progress of your provision. diff --git a/start/install/agent/kubernetes/wsl.md b/start/install/agent/kubernetes/wsl.md new file mode 100644 index 00000000..5699ae8c --- /dev/null +++ b/start/install/agent/kubernetes/wsl.md @@ -0,0 +1,69 @@ +# Install Portainer Agent with Kubernetes on WSL / Docker Desktop + +## Introduction + +The following instructions will guide you in setting up Portainer Agent with Kubernetes running on Docker Desktop with WSL, and connecting it to your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/kubernetes/wsl.md) first. + +{% hint style="info" %} +This scenario is for testing purposes only. +{% endhint %} + +## Preparation + +Before you start, you must make sure that Kubernetes is enabled and running within your Docker Desktop installation. To enable Kubernetes in Docker Desktop, you need to open the dashboard of Docker Desktop. Right click the Docker icon in the system tray and click **Dashboard**: + +![](../../../../.gitbook/assets/kube-wsl-1.png) + +Click **Settings**, then select **Kubernetes**, tick **Enable Kubernetes**, then click **Apply and Restart** (clicking **Install** in the dialog to install Kubernetes): + +![](../../../../.gitbook/assets/kube-wsl-2.gif) + +After a few minutes, you will see that Kubernetes is running in the bottom left status bar of Docker Desktop: + +![Docker is on the left, Kubernetes is on the right](../../../../.gitbook/assets/kube-wsl-4.png) + +## Deployment + +Based on how you would like expose the Portainer Agent, select an option below: + +{% tabs %} +{% tab title="NodePort" %} +Using one of the following commands, the Portainer Agent will be available on port `30778`. + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-agent-k8s-nodeport.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-agent-k8s-nodeport.yaml +``` +{% endtab %} + +{% tab title="Load Balancer" %} +Using one of the following commands, the Portainer Agent will be available at an assigned Load Balancer IP at port `9001`. + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-agent-k8s-lb.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-agent-k8s-lb.yaml +``` +{% endtab %} +{% endtabs %} + +## Adding your new environment + +Once the agent has been installed you are ready to add the environment to your Portainer Server installation. + +{% content-ref url="../../../../admin/environments/add/kubernetes.md" %} +[kubernetes.md](../../../../admin/environments/add/kubernetes.md) +{% endcontent-ref %} diff --git a/start/install/agent/nomad.md b/start/install/agent/nomad.md new file mode 100644 index 00000000..fde0141e --- /dev/null +++ b/start/install/agent/nomad.md @@ -0,0 +1,40 @@ +# Nomad + +Nomad support in Portainer is provided through the use of the [Portainer Edge Agent](../../../advanced/edge-agent.md). + +To add a Nomad environment, click on **Environments** then click the **Add environment** button. + +
+ +Select **Nomad** as your environment type and click **Start Wizard**. Enter the **environment details** using the table below as a guide. + +| Field | Overview | +| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Enter a name for your environment. | +| Portainer server URL | Enter the URL and port of your Portainer Server instance as it will be seen from your Nomad environment. If using a FQDN, ensure that DNS is properly configured to provide this. | + +
+ +As an optional step you can expand the **More settings** section and adjust the Poll frequency for the environment - this defines how often this Edge Agent will check the Portainer Server for new jobs. The default is every 5 seconds. You can also categorize the environment by adding it to a [group](../../../admin/environments/groups.md) or [tagging](../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Create**. Then complete the new fields that have appeared using the table below as a guide. + +| Field/Option | Overview | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| Nomad Authentication Enabled | Toggle this on if your Nomad installation has ACL enabled (recommended). | +| Nomad Token | If the above toggle is on, this field is displayed. Enter the Secret ID from your Nomad installation. | +| TLS | Toggle this on if your Nomad installation uses TLS. | +| Environment variables | Enter a comma separated list of environment variables that will be sourced from the host where the agent is deployed and provided to the agent. | +| Allow self-signed certs | Toggle this on to allow self-signed certificates when the agent is connecting to Portainer via HTTPS. | + +
+ +Copy the generated command based on your settings and run it on your Nomad environment to deploy the Edge Agent. + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you **must** remember to explicitly provide this when deploying your Edge Agent. +{% endhint %} + +If you have another Nomad environment to deploy you can click **Add another environment** to do so. If you have any other non-Nomad environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/start/install/agent/swarm/README.md b/start/install/agent/swarm/README.md new file mode 100644 index 00000000..7bdda096 --- /dev/null +++ b/start/install/agent/swarm/README.md @@ -0,0 +1,15 @@ +# Docker Swarm + +Installation instructions can differ between platforms. Please choose your platform below: + +{% content-ref url="linux.md" %} +[linux.md](linux.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} + +{% content-ref url="wcs.md" %} +[wcs.md](wcs.md) +{% endcontent-ref %} diff --git a/start/install/agent/swarm/linux.md b/start/install/agent/swarm/linux.md new file mode 100644 index 00000000..527cb0e2 --- /dev/null +++ b/start/install/agent/swarm/linux.md @@ -0,0 +1,87 @@ +# Install Portainer Agent with Docker Swarm on Linux + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/swarm/linux.md) first. + +To get started, you will need: + +* The latest version of Docker installed and working. +* Swarm mode enabled and working, including the overlay network for the swarm service communication. +* `sudo` access on the manager node of your swarm cluster. +* The manager and worker nodes must be able to communicate with each other over port `9001`. In addition, the Portainer Server installation must be able to reach the nodes on port `9001`. If this is not possible, we advise looking at the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Connecting via TCP is not supported in Docker Swarm. +* SELinux is disabled on the machine running Docker. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent by adding it to the stack file: + + `environment:` + + `- AGENT_SECRET: yoursecret` + +## Deploying the Agent + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Swarm** as the environment type then click **Start Wizard**. Select the **Agent** option and the **Linux & Windows WSL** tab. Copy the command, then run it on the manager node of your Docker Swarm cluster. + +{% hint style="info" %} +You must run the command on the Docker Swarm cluster before entering the environment details. +{% endhint %} + +
+ +The deployment command will return something similar to: + +``` +Creating network portainer-agent_portainer_agent +Creating service portainer-agent_agent +``` + +To validate the Agent is running, you can run the following command: + +``` + docker service ls +``` + +the result of which should look something like this: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +tshb6ee2710s portainer-agent_agent global 1/1 portainer/agent:latest +``` + +Once the Portainer Agent has been successfully deployed on the cluster, you can complete the rest of the environment configuration. + +## Finishing the configuration + +Once the Agent is running on the Docker Swarm cluster, enter the **environment details** using the table below as a guide. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +| Field | Overview | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Enter the IP or DNS name at which the Portainer Server instance can reach the environment along with the port (`9001`). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../../../../admin/environments/groups.md) or [tagging](../../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. + diff --git a/start/install/agent/swarm/wcs.md b/start/install/agent/swarm/wcs.md new file mode 100644 index 00000000..c8d3a68e --- /dev/null +++ b/start/install/agent/swarm/wcs.md @@ -0,0 +1,81 @@ +# Install Portainer Agent with Docker Swarm on Windows Container Service + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/swarm/wcs.md) first. + +To get started, you will need: + +* The latest version of Docker installed and working. +* Swarm mode enabled and working, including the overlay network for the swarm service communication. +* Administrator access on the manager node of your Swarm cluster. +* The manager and worker nodes must be able to communicate with each other over port `9001`. In addition, the Portainer Server installation must be able to reach the nodes on port `9001`. If this is not possible, we advise looking at the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumption about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent by adding it to the stack file: + + `environment:` + + `- AGENT_SECRET: yoursecret` + +## Deploying the Agent + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Swarm** as the environment type then click **Start Wizard**. Select the **Agent** option and the **Windows WCS** tab. Copy the command, then run it on the manager node of your Docker Swarm cluster. + +{% hint style="info" %} +You must run the command on the Docker Swarm cluster before you proceed to entering the environment details. +{% endhint %} + +
+ +The deployment command will return something similar to: + +``` +Creating network portainer-agent_portainer_agent +Creating service portainer-agent_agent +``` + +To validate the Agent is running, you can run the following command: + +``` + docker service ls +``` + +the result of which should look something like this: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +tshb6ee2710s portainer-agent_agent global 1/1 portainer/agent:latest +``` + +## Finishing the configuration + +Once the Agent is running on the Docker Swarm cluster, enter the **environment details** using the table below as a guide. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +| Field | Overview | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Enter the IP or DNS name at which the Portainer Server instance can reach the environment along with the port (`9001`). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../../../../admin/environments/groups.md) or [tagging](../../../../admin/environments/tags.md) it for better searchability. + +
+ +When you're ready, click **Connect**. If you have other environments to configure click **Next** to proceed, otherwise click **Close** to return to the list of environments. diff --git a/start/install/agent/swarm/wsl.md b/start/install/agent/swarm/wsl.md new file mode 100644 index 00000000..3f3a0f78 --- /dev/null +++ b/start/install/agent/swarm/wsl.md @@ -0,0 +1,85 @@ +# Install Portainer Agent with Docker Swarm on WSL / Docker Desktop + +## Introduction + +Portainer uses the _Portainer Agent_ container to communicate with the _Portainer Server_ instance and provide access to the node's resources. This document will outline how to install the Portainer Agent on your node and how to connect to it from your Portainer Server instance. If you do not have a working Portainer Server instance yet, please refer to the [Portainer Server installation guide](../../server/swarm/wsl.md) first. + +To get started, you will need: + +* The latest version of Docker Desktop installed and working. +* Swarm mode enabled and working, including the overlay network for the swarm service communication. +* Administrator access on the manager node of your Swarm cluster. +* Windows Subsystem for Linux (WSL) installed and a Linux distribution selected. For a new installation we recommend WSL2. +* The manager and worker nodes must be able to communicate with each other over port `9001`. In addition, the Portainer Server installation must be able to reach the nodes on port `9001`. If this is not possible, we advise looking at the [Edge Agent](../edge.md) instead. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Alternatively, you can also connect via TCP. +* SELinux is disabled within the Linux distribution used by WSL. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. +* You have not set a custom `AGENT_SECRET` on your Portainer Server instance. If you have, you will need to provide that secret to your agent by adding it to the stack file: + + `environment:` + + `- AGENT_SECRET: yoursecret` + +## Deploying the Agent + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +From the menu select **Environments** then click **Add environment**. + +
+ +Next, select **Docker Swarm** as the environment type then click **Start Wizard**. Select the **Agent** option and the **Linux & Windows WSL** tab. Copy the command, then run it on the manager node of your Docker Swarm cluster. + +{% hint style="info" %} +You must run the command on the Docker Swarm cluster before you proceed to entering the environment details. +{% endhint %} + +
+ +The deployment command will return something similar to: + +``` +Creating network portainer-agent_portainer_agent +Creating service portainer-agent_agent +``` + +To validate the Agent is running, you can run the following command: + +``` + docker service ls +``` + +the result of which should look something like this: + +``` +ID NAME MODE REPLICAS IMAGE PORTS +tshb6ee2710s portainer-agent_agent global 1/1 portainer/agent:latest +``` + +Once the Portainer Agent has been successfully deployed on the cluster, you can complete the rest of the environment configuration. + +## Finishing the configuration + +Once the Agent is running on the Docker Swarm cluster, enter the **environment details** using the table below as a guide. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You do **not** need to add each node as an individual environment in Portainer. Adding just one node (we recommend the manager node) will allow Portainer to manage the entire cluster. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +| Field | Overview | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Name | Give the environment a descriptive name. | +| Environment address | Enter the IP or DNS name at which the Portainer Server instance can reach the environment along with the port (`9001`). | + +
+ +As an optional step you can expand the **More settings** section and categorize the environment by adding it to a [group](../../../../admin/environments/groups.md) or [tagging](../../../../admin/environments/tags.md) it for better searchability. + +
diff --git a/start/install/server/README.md b/start/install/server/README.md new file mode 100644 index 00000000..6eee80e7 --- /dev/null +++ b/start/install/server/README.md @@ -0,0 +1,15 @@ +# Set up a new Portainer Server installation + +Select the environment for your new Portainer installation: + +{% content-ref url="docker/" %} +[docker](docker/) +{% endcontent-ref %} + +{% content-ref url="swarm/" %} +[swarm](swarm/) +{% endcontent-ref %} + +{% content-ref url="kubernetes/" %} +[kubernetes](kubernetes/) +{% endcontent-ref %} diff --git a/start/install/server/docker/README.md b/start/install/server/docker/README.md new file mode 100644 index 00000000..b06447f8 --- /dev/null +++ b/start/install/server/docker/README.md @@ -0,0 +1,16 @@ +# Docker Standalone + +Installation instructions can differ between platforms. Please choose your platform below: + +{% content-ref url="linux.md" %} +[linux.md](linux.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} + +{% content-ref url="wcs.md" %} +[wcs.md](wcs.md) +{% endcontent-ref %} + diff --git a/start/install/server/docker/linux.md b/start/install/server/docker/linux.md new file mode 100644 index 00000000..15f0ed41 --- /dev/null +++ b/start/install/server/docker/linux.md @@ -0,0 +1,77 @@ +# Install Portainer with Docker on Linux + +## Introduction + +Portainer consists of two elements, the _Portainer Server_, and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you install the Portainer Server container on your Linux environment. To add a new Linux environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/docker/linux.md). + +To get started, you will need: + +* The latest version of Docker installed and working +* sudo access on the machine that will host your Portainer Server instance +* By default, Portainer Server will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Alternatively, you can also connect via TCP. +* SELinux is disabled on the machine running Docker. If you require SELinux, you will need to pass the `--privileged` flag to Docker when deploying Portainer. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. + +## Deployment + +First, create the volume that Portainer Server will use to store its database: + +```bash +docker volume create portainer_data +``` + +Then, download and install the Portainer Server container: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest +``` +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-docker-standalone) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +{% hint style="info" %} +If you require HTTP port `9000` open for legacy reasons, add the following to your `docker run` command: + +`-p 9000:9000` +{% endhint %} + +Portainer Server has now been installed. You can check to see whether the Portainer Server container has started by running `docker ps`: + +```bash +root@server:~# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +de5b28eb2fa9 portainer/portainer-ee:latest "/portainer" 2 weeks ago Up 9 days 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer +``` + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +```bash +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/docker/wcs.md b/start/install/server/docker/wcs.md new file mode 100644 index 00000000..571b96db --- /dev/null +++ b/start/install/server/docker/wcs.md @@ -0,0 +1,96 @@ +# Install Portainer with Docker on Windows Container Service + +## Introduction + +Portainer consists of two elements, the _Portainer Server_, and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you install the Portainer Server container on your Windows server with Windows Containers. To add a new WCS environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/docker/wcs.md). + +To get started, you will need: + +* Administrator access on the machine that will host your Portainer Server instance +* By default, Portainer Server will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumption about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. + +## Preparation + +To run Portainer Server in a Windows Server/Desktop Environment you need to create exceptions in the firewall. These can easily be added through PowerShell by running the following commands: + +``` +netsh advfirewall firewall add rule name="cluster_management" dir=in action=allow protocol=TCP localport=2377 +netsh advfirewall firewall add rule name="node_communication_tcp" dir=in action=allow protocol=TCP localport=7946 +netsh advfirewall firewall add rule name="node_communication_udp" dir=in action=allow protocol=UDP localport=7946 +netsh advfirewall firewall add rule name="overlay_network" dir=in action=allow protocol=UDP localport=4789 +netsh advfirewall firewall add rule name="swarm_dns_tcp" dir=in action=allow protocol=TCP localport=53 +netsh advfirewall firewall add rule name="swarm_dns_udp" dir=in action=allow protocol=UDP localport=53 +``` + +You will also need to install the Windows Container Host Service and install Docker: + +``` +Enable-WindowsOptionalFeature -Online -FeatureName containers -All +Install-Module -Name DockerMsftProvider -Repository PSGallery -Force +Install-Package -Name docker -ProviderName DockerMsftProvider +``` + +Once this is complete you will need to restart your Windows server. After the restart completes, you're ready to install Portainer itself. + +## Deployment + +First, create the volume that Portainer Server will use to store its database. Using PowerShell: + +``` +docker volume create portainer_data +``` + +Then, download and install the Portainer Server container: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer-ee:latest +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer-ce:latest +``` +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +{% hint style="warning" %} +If you see an error message similar to: + +`"\\.\pipe\dockerDesktopEngine" includes invalid characters for a local volume name` + +then you may not have Windows containers properly enabled. If you are using Docker Desktop, right click the icon in your tray and select **Switch to Windows Containers**. +{% endhint %} + +{% hint style="info" %} +If you require HTTP port `9000` open for legacy reasons, add the following to your `docker run` command: + +`-p 9000:9000` +{% endhint %} + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +```bash +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/docker/wsl.md b/start/install/server/docker/wsl.md new file mode 100644 index 00000000..f0111a83 --- /dev/null +++ b/start/install/server/docker/wsl.md @@ -0,0 +1,78 @@ +# Install Portainer with Docker on WSL / Docker Desktop + +## Introduction + +Portainer consists of two elements, the _Portainer Server_, and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you install the Portainer Server container on your Windows environment with WSL and Docker Desktop. To add a new WSL / Docker Desktop environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/docker/wsl.md). + +To get started, you will need: + +* The latest version of Docker Desktop installed and working. +* Administrator access on the machine that will host your Portainer Server instance. +* Windows Subsystem for Linux (WSL) installed and a Linux distribution selected. For a new installation we recommend WSL2. +* By default, Portainer Server will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Alternatively, you can also connect via TCP. +* SELinux is disabled within the Linux distribution used by WSL. If you require SELinux, you will need to pass the `--privileged` flag to Docker when deploying Portainer. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. + +## Deployment + +First, create the volume that Portainer Server will use to store its database: + +```bash +docker volume create portainer_data +``` + +Then, download and install the Portainer Server container: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest +``` +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-docker-standalone) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +{% hint style="info" %} +If you require HTTP port `9000` open for legacy reasons, add the following to your `docker run` command: + +`-p 9000:9000` +{% endhint %} + +Portainer Server has now been installed. You can check to see whether the Portainer Server container has started by running `docker ps`: + +```bash +root@server:~# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +f4ab79732007 portainer/portainer-ee:latest "/portainer" 2 weeks ago Up 29 hours 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9000/tcp, :::9443->9443/tcp portainer +``` + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +```bash +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/kubernetes/README.md b/start/install/server/kubernetes/README.md new file mode 100644 index 00000000..ac5828d2 --- /dev/null +++ b/start/install/server/kubernetes/README.md @@ -0,0 +1,12 @@ +# Kubernetes + +Installation instructions can differ between platforms. Please choose your platform below: + +{% content-ref url="baremetal.md" %} +[baremetal.md](baremetal.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} + diff --git a/start/install/server/kubernetes/baremetal.md b/start/install/server/kubernetes/baremetal.md new file mode 100644 index 00000000..21ebb04f --- /dev/null +++ b/start/install/server/kubernetes/baremetal.md @@ -0,0 +1,263 @@ +# Install Portainer on your Kubernetes environment + +## Introduction + +Portainer consists of two elements, the _Portainer Server_ and the _Portainer Agent_. Both elements run as lightweight containers on Kubernetes. + +To get started, you will need: + +* A working and up to date Kubernetes cluster. +* Access to run `helm` or `kubectl` commands on your cluster. +* Cluster Admin rights on your Kubernetes cluster. This is so Portainer can create the necessary `ServiceAccount` and `ClusterRoleBinding` for it to access the Kubernetes cluster. +* A `default` StorageClass configured (see below). +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* Kubernetes RBAC is enabled and working (this is required for the access control functionality in Portainer). +* You will be using the `portainer` namespace for Portainer. At present this is a requirement - other namespaces are currently unsupported. +* Kubernetes' metrics server is installed and working (if you wish to use the metrics within Portainer). + +## Data Persistence + +Portainer requires data persistence, and as a result needs at least one StorageClass available to use. Portainer will attempt to use the default StorageClass during deployment. If you do not have a StorageClass tagged as `default` the deployment will likely fail. + +You can check if you have a default StorageClass by running the following command on your cluster: + +``` +kubectl get sc +``` + +and looking for a StorageClass with `(default)` after its name: + +``` +root@kubemaster01:~# kubectl get sc +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +managed-nfs-storage (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 11d +``` + +To set a StorageClass as default, you can use the following: + +``` +kubectl patch storageclass -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' +``` + +replacing `` with the name of your StorageClass. Alternatively, if you are installing using our Helm chart, you can pass the following parameter in your helm install command to specify the StorageClass to use for Portainer: + +``` +--set persistence.storageClass= +``` + +{% hint style="info" %} +In some Kubernetes clusters (for example microk8s), the default StorageClass simply creates hostPath volumes, which are not explicitly tied to a particular node. In a multi-node cluster, this can create an issue when the pod is terminated and rescheduled on a different node, "leaving" all the persistent data behind and starting the pod with an "empty" volume. + +While this behavior is inherently a limitation of using hostPath volumes, a suitable workaround is to use add a nodeSelector to the deployment, which effectively "pins" the Portainer pod to a particular node. You can do this by editing your own values.yaml file to set the nodeSelector value: + +`nodeSelector: kubernetes.io/hostname: \` + +or alternatively follow the instructions below for each deployment method. +{% endhint %} + +## Deployment + +To deploy Portainer within a Kubernetes cluster you can use our provided Helm charts or YAML manifests. + +### Deploy using Helm + +{% hint style="info" %} +Ensure you're using at least Helm v3.2, which includes support for the `--create-namespace` argument. +{% endhint %} + +First add the Portainer Helm repository by running the following commands: + +``` +helm repo add portainer https://portainer.github.io/k8s/ +helm repo update +``` + +Once the update completes, you're ready to begin the installation. Which method you choose will depend on how you wish to expose the Portainer service: + +{% tabs %} +{% tab title="Expose via NodePort" %} +Using one of the following commands, Portainer will be available on port `30779` for HTTPS: + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer --set enterpriseEdition.enabled=true --set tls.force=true +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer --set tls.force=true +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `30779`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +{% hint style="info" %} +If you need to access Portainer via HTTP on port `30777`, remove the `--set tls.force=true` option. +{% endhint %} +{% endtab %} + +{% tab title="Expose via Ingress" %} +In these examples, Portainer will be deployed to your cluster and assigned a Cluster IP, with an nginx Ingress Controller at the defined hostname. For more on Ingress options, refer to the list of [Chart Configuration Options](../../../../advanced/helm-chart-configuration-options.md). + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set enterpriseEdition.enabled=true \ + --set service.type=ClusterIP \ + --set tls.force=true \ + --set ingress.enabled=true \ + --set ingress.ingressClassName= \ + --set ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"=HTTPS \ + --set ingress.hosts[0].host= \ + --set ingress.hosts[0].paths[0].path="/" +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set service.type=ClusterIP \ + --set tls.force=true \ + --set ingress.enabled=true \ + --set ingress.ingressClassName= \ + --set ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"=HTTPS \ + --set ingress.hosts[0].host= \ + --set ingress.hosts[0].paths[0].path="/" +``` + +{% hint style="info" %} +If you need to access Portainer via HTTP, remove the `--set tls.force=true` option. +{% endhint %} +{% endtab %} + +{% tab title="Expose via Load Balancer" %} +Using one of the following commands, Portainer will be available at an assigned Load Balancer IP on port `9443` for HTTPS: + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set service.type=LoadBalancer \ + --set enterpriseEdition.enabled=true \ + --set tls.force=true +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set service.type=LoadBalancer \ + --set tls.force=true +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +{% hint style="info" %} +If you need to access Portainer via HTTP on port `9000`, remove the `--set tls.force=true` option. +{% endhint %} +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +If you want to explicitly set the target node when deploying the Helm chart on the CLI, include `--set nodeSelector.kubernetes\.io/hostname=` in your `helm install` command. +{% endhint %} + +### Deploy using YAML manifests + +Our YAML manifests support exposing Portainer via either NodePort or Load Balancer. + +{% tabs %} +{% tab title="Expose via NodePort" %} +To expose via NodePort, you can use one of the following commands (Portainer will be available on port `30777` for HTTP and `30779` for HTTPS): + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer.yaml +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `30779`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} + +{% tab title="Expose via Load Balancer" %} +To expose via Load Balancer, use one of the following commands to provision Portainer at an assigned Load Balancer IP on port `9000` for HTTP and `9443` for HTTPS: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-lb.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-lb.yaml +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +If you want to explicitly set the target node when deploying using YAML manifests, run the following one-liner to "patch" the deployment, forcing the pod to always be scheduled on the node it's currently running on: +{% endhint %} + +``` +kubectl patch deployments -n portainer portainer -p '{"spec": {"template": {"spec": {"nodeSelector": {"kubernetes.io/hostname": "'$(kubectl get pods -n portainer -o jsonpath='{ ..nodeName }')'"}}}}}' || (echo Failed to identify current node of portainer pod; exit 1) +``` + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance. Depending on how you chose to expose your Portainer installation, open a web browser and navigate to the following URL: + +{% tabs %} +{% tab title="NodePort" %} +```bash +https://localhost:30779/ or http://localhost:30777/ +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. +{% endtab %} + +{% tab title="Ingress" %} +```bash +https:/// +``` + +Replace `` with the FQDN of your Portainer instance. +{% endtab %} + +{% tab title="Load Balancer" %} +```bash +https://:9443/ or http://:9000/ +``` + +Replace `` with the IP address or FQDN of the load balancer, and adjust the port if you changed it earlier. +{% endtab %} +{% endtabs %} + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/kubernetes/wsl.md b/start/install/server/kubernetes/wsl.md new file mode 100644 index 00000000..76ebce98 --- /dev/null +++ b/start/install/server/kubernetes/wsl.md @@ -0,0 +1,213 @@ +# Install Portainer with Kubernetes on WSL / Docker Desktop + +## Introduction + +The following instructions will guide you in setting up _Portainer Server_ with Kubernetes running on Docker Desktop with WSL. + +{% hint style="info" %} +This scenario is for testing purposes only. +{% endhint %} + +{% hint style="warning" %} +We are aware of an issue where namespace and application access privileges are not fully implemented when running Kubernetes via Docker Desktop. We are looking into the root cause and hope to have a resolution soon. +{% endhint %} + +## Preparation + +Before you start, you must make sure that Kubernetes is enabled and running within your Docker Desktop installation. To enable Kubernetes in Docker Desktop, you need to open the dashboard of Docker Desktop. Right click the Docker icon in the system tray and click **Dashboard**: + +![](../../../../.gitbook/assets/kube-wsl-1.png) + +Click **Settings**, then select **Kubernetes**, tick **Enable Kubernetes**, then click **Apply and Restart** (clicking **Install** in the dialog to install Kubernetes): + +![](../../../../.gitbook/assets/kube-wsl-2.gif) + +After a few minutes, you will see that Kubernetes is running in the bottom left status bar of Docker Desktop: + +![Docker is on the left, Kubernetes is on the right](../../../../.gitbook/assets/kube-wsl-4.png) + +## Deployment + +To deploy Portainer within a Kubernetes cluster you can use our provided Helm charts or YAML manifests. + +### Deploy using Helm + +{% hint style="info" %} +Ensure you're using at least Helm v3.2, which includes support for the `--create-namespace` argument. +{% endhint %} + +First add the Portainer Helm repository by running the following commands: + +``` +helm repo add portainer https://portainer.github.io/k8s/ +helm repo update +``` + +Once the update completes, you're ready to begin the installation. Which method you choose will depend on how you wish to expose the Portainer service: + +{% tabs %} +{% tab title="Expose via NodePort" %} +Using one of the following commands, Portainer will be available on port `30777` for HTTP and `30779` for HTTPS: + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer --set enterpriseEdition.enabled=true +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](https://app.gitbook.com/admin/settings#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} + +{% tab title="Expose via Ingress" %} +In these examples, Portainer will be deployed to your cluster and assigned a Cluster IP, with an nginx Ingress Controller at the defined hostname. For more on Ingress options, refer to the list of [Chart Configuration Options](../../../../advanced/helm-chart-configuration-options.md). + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set enterpriseEdition.enabled=true \ + --set service.type=ClusterIP \ + --set tls.force=true \ + --set ingress.enabled=true \ + --set ingress.ingressClassName= \ + --set ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"=HTTPS \ + --set ingress.hosts[0].host= \ + --set ingress.hosts[0].paths[0].path="/" +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer \ + --set service.type=ClusterIP \ + --set tls.force=true \ + --set ingress.enabled=true \ + --set ingress.ingressClassName= \ + --set ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"=HTTPS \ + --set ingress.hosts[0].host= \ + --set ingress.hosts[0].paths[0].path="/" +``` +{% endtab %} + +{% tab title="Expose via Load Balancer" %} +Using one of the following commands, Portainer will be available at an assigned Load Balancer IP on port `9000` for HTTP and `9443` for HTTPS: + +**Business Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer --set service.type=LoadBalancer --set enterpriseEdition.enabled=true +``` + +**Community Edition:** + +``` +helm install --create-namespace -n portainer portainer portainer/portainer --set service.type=LoadBalancer +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](https://app.gitbook.com/admin/settings#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +To explicitly set the target node when deploying the Helm chart on the CLI, include `--set nodeSelector.kubernetes.io/hostname=` in your `helm install` command. +{% endhint %} + +### Deploy using YAML manifests + +Our YAML manifests support exposing Portainer via either NodePort or Load Balancer. + +{% tabs %} +{% tab title="Expose via NodePort" %} +To expose via NodePort, you can use one of the following commands (Portainer will be available on port `30777` for HTTP and `30779` for HTTPS): + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer.yaml +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `30779`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} + +{% tab title="Expose via Load Balancer" %} +To expose via Load Balancer, use one of the following commands to provision Portainer at an assigned Load Balancer IP on port `9000` for HTTP and `9443` for HTTPS: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-lb.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-lb.yaml +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-kubernetes-via-helm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} +{% endtab %} +{% endtabs %} + +{% hint style="info" %} +To explicitly set the target node when deploying using YAML manifests, run the following one-liner to "patch" the deployment, forcing the pod to always be scheduled on the node it's currently running on: +{% endhint %} + +``` +kubectl patch deployments -n portainer portainer -p '{"spec": {"template": {"spec": {"nodeSelector": {"kubernetes.io/hostname": "'$(kubectl get pods -n portainer -o jsonpath='{ ..nodeName }')'"}}}}}' || (echo Failed to identify current node of portainer pod; exit 1) +``` + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance. Depending on how you chose to expose your Portainer installation, open a web browser and navigate to the following URL: + +{% tabs %} +{% tab title="NodePort" %} +```bash +https://localhost:30779/ or http://localhost:30777/ +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. +{% endtab %} + +{% tab title="Ingress" %} +```bash +https:/// +``` + +Replace `` with the FQDN of your Portainer instance. +{% endtab %} + +{% tab title="Load Balancer" %} +```bash +https://:9443/ or http://:9000/ +``` + +Replace `` with the IP address or FQDN of the load balancer, and adjust the port if you changed it earlier. +{% endtab %} +{% endtabs %} + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/setup.md b/start/install/server/setup.md new file mode 100644 index 00000000..557c646e --- /dev/null +++ b/start/install/server/setup.md @@ -0,0 +1,33 @@ +# Initial setup + +Once the Portainer Server has been deployed, and you have navigated to the instance's URL, you are ready for the initial setup. + +## Creating the first user + +Your first user will be an administrator. The username defaults to `admin` but you can change it if you prefer. The password must be at least 12 characters long and meet the listed password requirements. + +
+ +## Enabling or disabling the collection of statistics + +We use a tool called [Matomo](https://matomo.org/) to collect anonymous information about how Portainer is used. We recommend enabling this option so we can make improvements based on usage. For more about what we do with the information we collect, read our [privacy policy](https://www.portainer.io/privacy-policy). + +During installation, you can enable or disable connection statistics using the checkbox. If you change your mind later, you can easily update this option under [Settings](../../../admin/settings/) in the Portainer UI. + +
+ +## Add your license key ![](../../../.gitbook/assets/button\_be.png) + +If you have installed Portainer Business Edition, you will now be asked to provide your license key. You will have been provided this when signing up for Business Edition or the free trial. If you don't have a license key, you can either click the **Don't have a license?** link or [get in touch with our team](mailto:success@portainer.io). + +Paste the license key you were provided into the box and click **Submit**. + +
+ +## Connecting Portainer to your environments + +Once the admin user has been created, the **Environment Wizard** will automatically launch. The wizard will help get you started with Portainer. + +
+ +The installation process automatically detects your local environment and sets it up for you. If you want to add additional environments to manage with this Portainer instance, click **Add Environments**. Otherwise, click **Get Started** to start using Portainer! diff --git a/start/install/server/swarm/README.md b/start/install/server/swarm/README.md new file mode 100644 index 00000000..7bdda096 --- /dev/null +++ b/start/install/server/swarm/README.md @@ -0,0 +1,15 @@ +# Docker Swarm + +Installation instructions can differ between platforms. Please choose your platform below: + +{% content-ref url="linux.md" %} +[linux.md](linux.md) +{% endcontent-ref %} + +{% content-ref url="wsl.md" %} +[wsl.md](wsl.md) +{% endcontent-ref %} + +{% content-ref url="wcs.md" %} +[wcs.md](wcs.md) +{% endcontent-ref %} diff --git a/start/install/server/swarm/linux.md b/start/install/server/swarm/linux.md new file mode 100644 index 00000000..4a0ed331 --- /dev/null +++ b/start/install/server/swarm/linux.md @@ -0,0 +1,82 @@ +# Install Portainer with Docker Swarm on Linux + +## Introduction + +Portainer consists of two elements, the _Portainer Server_ and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you deploy the Portainer Server and Agent containers on your Linux environment. To add a new Linux Swarm environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/swarm/linux.md). + +To get started, you will need: + +* The latest version of Docker installed and working +* Swarm mode enabled and working, including the overlay network for the swarm service communication +* `sudo` access on the manager node of your swarm cluster +* By default, Portainer will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* The manager and worker nodes must be able to communicate with each other over port `9001`. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Connecting via TCP is not supported in Docker Swarm. +* SELinux is disabled on the machine running Docker. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* You are running a single manager node in your swarm. If you have more than one, please [read this knowledge base article](https://portal.portainer.io/knowledge/how-can-i-ensure-portainers-configuration-is-retained) before proceeding. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. + +## Deployment + +Portainer can be directly deployed as a service in your Docker cluster. Note that this method will automatically deploy a single instance of the Portainer Server, and deploy the Portainer Agent as a global service on every node in your cluster. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You **do not** need to add each node in your cluster as a separate environment in Portainer. Deploying the manifest to your swarm will include every node in the cluster automatically. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +First, retrieve the stack YML manifest: + +{% tabs %} +{% tab title="Business Edition" %} +``` +curl -L https://downloads.portainer.io/ee2-17/portainer-agent-stack.yml -o portainer-agent-stack.yml +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +curl -L https://downloads.portainer.io/ce2-17/portainer-agent-stack.yml -o portainer-agent-stack.yml +``` +{% endtab %} +{% endtabs %} + +Then use the downloaded YML manifest to deploy your stack: + +``` +docker stack deploy -c portainer-agent-stack.yml portainer +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-docker-swarm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +Portainer Server and the Agents have now been installed. You can check to see whether the Portainer Server and Agent containers have started by running `docker ps`: + +``` +root@manager01:~# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +59ee466f6b15 portainer/agent:latest "./agent" About a minute ago Up About a minute portainer_agent.xbb8k6r7j1tk9gozjku7e43wr.5sa6b3e8cl6hyu0snlt387sgv +2db7dd4bfba0 portainer/portainer-ee:latest "/portainer -H tcp:/…" About a minute ago Up About a minute 8000/tcp, 9443/tcp portainer_portainer.1.gpuvu3pqmt1m19zxfo44v7izx +``` + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +``` +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/swarm/wcs.md b/start/install/server/swarm/wcs.md new file mode 100644 index 00000000..dfec4a10 --- /dev/null +++ b/start/install/server/swarm/wcs.md @@ -0,0 +1,93 @@ +# Install Portainer with Docker Swarm on Windows Container Service + +## Introduction + +Portainer consists of two elements, the _Portainer Server_, and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you install the Portainer Server container on your Windows server with Windows Containers. To add a new WCS environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/swarm/wcs.md). + +To get started, you will need: + +* The latest version of Docker installed and working. +* Swarm mode enabled and working, including the overlay network for the swarm service communication. +* Administrator access on the manager node of your Swarm cluster. +* By default, Portainer will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* The manager and worker nodes must be able to communicate with each other over port `9001`. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are running a single manager node in your swarm. If you have more than one, please [read this knowledge base article](https://portal.portainer.io/knowledge/how-can-i-ensure-portainers-configuration-is-retained) before proceeding. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. + +## Preparation + +To run Portainer Server in a Windows Server/Desktop Environment you need to create exceptions in the firewall. These can easily be added through PowerShell by running the following commands: + +``` +netsh advfirewall firewall add rule name="cluster_management" dir=in action=allow protocol=TCP localport=2377 +netsh advfirewall firewall add rule name="node_communication_tcp" dir=in action=allow protocol=TCP localport=7946 +netsh advfirewall firewall add rule name="node_communication_udp" dir=in action=allow protocol=UDP localport=7946 +netsh advfirewall firewall add rule name="overlay_network" dir=in action=allow protocol=UDP localport=4789 +netsh advfirewall firewall add rule name="swarm_dns_tcp" dir=in action=allow protocol=TCP localport=53 +netsh advfirewall firewall add rule name="swarm_dns_udp" dir=in action=allow protocol=UDP localport=53 +``` + +You will also need to install the Windows Container Host Service and install Docker: + +``` +Enable-WindowsOptionalFeature -Online -FeatureName containers -All +Install-Module -Name DockerMsftProvider -Repository PSGallery -Force +Install-Package -Name docker -ProviderName DockerMsftProvider +``` + +Once this is complete you will need to restart your Windows server. After the restart completes, you're ready to install Portainer itself. + +## Deployment + +Portainer can be directly deployed as a service in your Docker cluster. Note that this method will automatically deploy a single instance of the Portainer Server, and deploy the Portainer Agent as a global service on every node in your cluster. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You **do not** need to add each node in your cluster as a separate environment in Portainer. Deploying the manifest to your swarm will include every node in the cluster automatically. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +You can use our YML manifest to run Portainer in Windows using Windows Containers. In PowerShell, run: + +{% tabs %} +{% tab title="Business Edition" %} +``` +curl https://downloads.portainer.io/ee2-17/portainer_windows_stack.yml -o portainer-windows-stack.yml +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +curl https://downloads.portainer.io/ce2-17/portainer_windows_stack.yml -o portainer-windows-stack.yml +``` +{% endtab %} +{% endtabs %} + +Then use the downloaded YML manifest to deploy your stack: + +```bash +docker stack deploy --compose-file=portainer-windows-stack.yml portainer +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-docker-swarm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +```bash +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/install/server/swarm/wsl.md b/start/install/server/swarm/wsl.md new file mode 100644 index 00000000..4b358e61 --- /dev/null +++ b/start/install/server/swarm/wsl.md @@ -0,0 +1,74 @@ +# Install Portainer with Docker Swarm on WSL / Docker Desktop + +## Introduction + +Portainer consists of two elements, the _Portainer Server_, and the _Portainer Agent_. Both elements run as lightweight Docker containers on a Docker engine. This document will help you install the Portainer Server container on your Windows environment with WSL and Docker Desktop. To add a new WSL / Docker Desktop Swarm environment to an existing Portainer Server installation, please refer to the [Portainer Agent installation instructions](../../agent/swarm/wsl.md). + +To get started, you will need: + +* The latest version of Docker Desktop installed and working. +* Swarm mode enabled and working, including the overlay network for the swarm service communication. +* Administrator access on the manager node of your Swarm cluster. +* Windows Subsystem for Linux (WSL) installed and a Linux distribution selected. For a new installation we recommend WSL2. +* By default, Portainer will expose the UI over port `9443` and expose a TCP tunnel server over port `8000`. The latter is optional and is only required if you plan to use the Edge compute features with Edge agents. +* The manager and worker nodes must be able to communicate with each other over port `9001`. +* A license key for Portainer Business Edition. + +The installation instructions also make the following assumptions about your environment: + +* Your environment meets [our requirements](../../../requirements-and-prerequisites.md). While Portainer may work with other configurations, it may require configuration changes or have limited functionality. +* You are accessing Docker via Unix sockets. Alternatively, you can also connect via TCP. +* SELinux is disabled within the Linux distribution used by WSL. +* Docker is running as root. Portainer with rootless Docker has some limitations, and requires additional configuration. +* You are running a single manager node in your swarm. If you have more than one, please [read this knowledge base article](https://portal.portainer.io/knowledge/how-can-i-ensure-portainers-configuration-is-retained) before proceeding. +* If your nodes are using DNS records to communicate, that all records are resolvable across the cluster. + +## Deployment + +Portainer can be directly deployed as a service in your Docker Swarm cluster. Note that this method will automatically deploy a single instance of the Portainer Server, and deploy the Portainer Agent as a global service on every node in your cluster. + +{% hint style="danger" %} +Only do this **once** for your environment, regardless of how many nodes are in the cluster. You **do not** need to add each node in your cluster as a separate environment in Portainer. Deploying the manifest to your swarm will include every node in the cluster automatically. Adding each node as a separate environment will also consume more of your licensed node count than you may expect. +{% endhint %} + +To begin the installation, first retrieve the stack YML manifest: + +{% tabs %} +{% tab title="Business Edition" %} +``` +curl -L https://downloads.portainer.io/ee2-17/portainer-agent-stack.yml -o portainer-agent-stack.yml +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +curl -L https://downloads.portainer.io/ce2-17/portainer-agent-stack.yml -o portainer-agent-stack.yml +``` +{% endtab %} +{% endtabs %} + +Then use the downloaded YML manifest to deploy your stack: + +```bash +docker stack deploy -c portainer-agent-stack.yml portainer +``` + +{% hint style="info" %} +By default, Portainer generates and uses a self-signed SSL certificate to secure port `9443`. Alternatively you can provide your own SSL certificate [during installation](../../../../advanced/ssl.md#using-your-own-ssl-certificate-on-docker-swarm) or [via the Portainer UI](../../../../admin/settings/#ssl-certificate) after installation is complete. +{% endhint %} + +## Logging In + +Now that the installation is complete, you can log into your Portainer Server instance by opening a web browser and going to: + +```bash +https://localhost:9443 +``` + +Replace `localhost` with the relevant IP address or FQDN if needed, and adjust the port if you changed it earlier. + +You will be presented with the initial setup page for Portainer Server. + +{% content-ref url="../setup.md" %} +[setup.md](../setup.md) +{% endcontent-ref %} diff --git a/start/intro.md b/start/intro.md new file mode 100644 index 00000000..666c4f09 --- /dev/null +++ b/start/intro.md @@ -0,0 +1,12 @@ +# Introduction + +This section explains the Portainer architecture and how to install it. We recommend that you read the entire section to ensure your installation goes smoothly. + +Learn about the [architecture](architecture.md) first, get familiar with the [prerequisites to installation](requirements-and-prerequisites.md), then finally, step through how to [install the product](install/) in your environment. + +{% content-ref url="architecture.md" %} +[architecture.md](architecture.md) +{% endcontent-ref %} + + + diff --git a/start/requirements-and-prerequisites.md b/start/requirements-and-prerequisites.md new file mode 100644 index 00000000..1c990daf --- /dev/null +++ b/start/requirements-and-prerequisites.md @@ -0,0 +1,100 @@ +# Requirements and prerequisites + +Requirements specific to your environment will be covered in the installation process. + +## Valid configurations + +Every Portainer release goes through functional, release and post-release testing to ensure it works as expected. Because we cannot test against every configuration variant out there, we test against a subset. + +The following tables list all of the configurations that we have tested, validated and consider to be functional. If a variant is not listed, it doesn't mean it won't work, it just means it hasn't been tested. + +### Portainer Business Edition (BE) + +| Portainer Version | Release Date | Docker Version | Kubernetes Version | Architectures | +| -------------------------------------------------------------- | ------------------ | ------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------ | +| [Business 2.17.0 ](../release-notes.md#release-2.17.0)(latest) | February 7, 2023 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.16.2](../release-notes.md#release-2.16.2) | November 21, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.16.1](../release-notes.md#release-2.16.1) | November 9, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.16.0](../release-notes.md#release-2.16.0) | October 31, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.15.1](../release-notes.md#release-2.15.1) | September 16, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.15.0](../release-notes.md#release-2.15.0) | September 6, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.14.2](../release-notes.md#release-2.14.2) | July 26, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.14.1](../release-notes.md#release-2.14.1) | July 12, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.14.0](../release-notes.md#release-2.14.0) | June 28, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.13.1](../release-notes.md#release-2.13.1) | May 12, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.13.0](../release-notes.md#release-2.13.0) | May 9, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.12.2](../release-notes.md#release-2.12.2) | April 4, 2022 | 20.10.7 20.10.11 20.10.12 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.12.1](../release-notes.md#release-2.12.1) | March 9, 2022 | 20.10.7 20.10.11 20.10.12 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.12.0](../release-notes.md#release-2.12.0) | March 8, 2022 | 20.10.7 20.10.11 20.10.12 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.10.0](../release-notes.md#release-2.10.0) | November 15, 2021 | 20.10.6 20.10.7 20.10.8 | 1.19.11 1.20.7 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.7.0](../release-notes.md#release-2.7.0) | July 29, 2021 | 20.10.6 20.10.7 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.4.0](../release-notes.md#release-2.4.0) | May 4, 2021 | 20.10.5 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.0.1](../release-notes.md#release-2.0.1) | February 22, 2021 | 19.03.13 | 1.17.3 1.18.6 1.19.3 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| [Business 2.0.0](../release-notes.md#release-2.0.0) | December 3, 2020 | 19.03.13 | 1.17.3 1.18.6 1.19.3 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | + +### Portainer Community Edition (CE) + +| Portainer Version | Release Date | Docker Version | Kubernetes Version | Architectures | +| ------------------------- | ------------------ | ------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Community 2.17.0 (latest) | February 7, 2023 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.16.2 | November 21, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.16.1 | November 9, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.16.0 | October 31, 2022 | 20.10.9 20.10.13 20.10.17 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.15.1 | September 16, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.15.0 | September 6, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.14.2 | July 26, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.14.1 | July 12, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.14.0 | June 28, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.13.1 | May 12, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.13.0 | May 9, 2022 | 20.10.9 20.10.12 20.10.13 | 1.21.7 1.22 1.23 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.11.1 | February 8, 2022 | 20.10.8 20.10.11 20.10.12 | 1.20.13 1.21.7 1.22.4 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.11.0 | December 9, 2021 | 20.10.6 20.10.8 20.10.11 | 1.19.11 1.20.7 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.9.3 | November 22, 2021 | 20.10.5 20.10.6 | 1.19.11 1.20.7 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.9.2 | October 26, 2021 | 20.10.5 20.10.6 | 1.19 1.20 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.9.1 | October 11, 2021 | 20.10.5 20.10.6 | 1.19 1.20 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.9.0 | September 23, 2021 | 20.10.5 20.10.6 | 1.19 1.20 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.6.3 | August 27, 2021 | 20.10.5 20.10.6 | 1.19 1.20 1.21 1.22 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.6.2 | August 2, 2021 | 20.10.5 20.10.6 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.6.1 | July 12, 2021 | 20.10.5 20.10.6 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.6.0 | June 25, 2021 | 20.10.5 20.10.6 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.5.1 | May 18, 2021 | 20.10.5 20.10.6 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.5.0 | May 18, 2021 | 20.10.5 | 1.19 1.20.2 1.21 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.1.x | February 2, 2021 | 20.10.2 | 1.20.0 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.0.1 | January 7, 2021 | 20.10.0 | 1.17.13 1.18.9 1.19.3 1.20.0 | [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| Community 2.0 | August 31, 2020 | 19.03.12 | 1.17.13 1.18.6 1.18.9 1.19.3 | [ARM32](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| 1.24.1 | July 23, 2020 | 19.03.12 | N/A | [ARM32](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| 1.24.0 | June 2, 2020 | 19.03.10 | N/A | [ARM32](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | +| 1.23.2 | March 25, 2020 | 19.03.6 | N/A | [ARM32](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), [ARM64](https://portal.portainer.io/knowledge/which-arm-architectures-does-portainer-support), x86\_64 | + + + +{% hint style="info" %} +If you find an issue with an unlisted configuration, before reporting a bug, update your environment to a valid configuration and try to replicate the issue. +{% endhint %} + +## Persistent storage + +The Portainer Server requires persistent storage in order to maintain the database and configuration information it needs to function. The installation process provides a basic storage configuration for your platform. By default, both Docker and Kubernetes provide local (to the node) storage only, and if cluster-wide persistent storage is desired we recommend implementing it at the infrastructure level (for example, via NFS). + +## Ports + +In order to access the UI and API, and for the Portainer Server instance and the Portainer Agents to communicate, certain ports need to be accessible. + +On the Portainer Server the following ports must be open: + +* TCP port `9443` (or `30779` for Kubernetes with NodePort) for the UI and API +* TCP port `8000` (or `30776` for Kubernetes with NodePort) for the TCP tunnel server for Edge Agents. This port is optional and only required if using Edge Compute features with Edge Agents. + +For the Portainer Agent: + +* TCP port `9001` (or `30778` for Kubernetes with NodePort) must be accessible on the Agent from the Portainer Server instance. + +The Portainer Edge Agent does not require any open ports. + +{% hint style="info" %} +All ports can be changed during installation. +{% endhint %} + +{% content-ref url="install/" %} +[install](install/) +{% endcontent-ref %} diff --git a/start/upgrade/README.md b/start/upgrade/README.md new file mode 100644 index 00000000..7f971fee --- /dev/null +++ b/start/upgrade/README.md @@ -0,0 +1,45 @@ +# Upgrading Portainer + +Portainer releases contain new features and bug fixes so it's important to keep your installation up to date. We have [tested and validated](../requirements-and-prerequisites.md#valid-configurations) all Portainer version upgrades from 2.0.0 up to the latest release. + +While it's possible that an untested unvalidated upgrade path might work, we recommend that all upgrade paths are tested and validated on a non-critical system before applying them to your production systems. + +{% hint style="info" %} +We added a [backup and restore feature](../../admin/settings/#backup-portainer) to Portainer BE 2.7 and strongly recommend that you take a backup of your Portainer instance before upgrading. +{% endhint %} + +{% hint style="info" %} +Starting with CE 2.9 and BE 2.10 Portainer is HTTPS enabled by default and uses port `9443` to serve the UI. HTTP can still be enabled on port `9000` if required. +{% endhint %} + +### Upgrade order + +In general, we recommend upgrading your Portainer Server deployment _before_ you upgrade the Portainer Agents. When we release new versions of Portainer we ensure that Portainer Server is able to talk to older versions of the Agent, and in most cases the reverse is true, but in some instances we make changes to the Agent that are not fully backward compatible with older versions of Portainer Server. + +### Upgrading Portainer + +To upgrade Portainer, choose your platform then follow the instructions: + +{% content-ref url="docker.md" %} +[docker.md](docker.md) +{% endcontent-ref %} + +{% content-ref url="swarm.md" %} +[swarm.md](swarm.md) +{% endcontent-ref %} + +{% content-ref url="kubernetes.md" %} +[kubernetes.md](kubernetes.md) +{% endcontent-ref %} + +If you are using the Portainer Edge Agent, we have specific upgrade instructions for you: + +{% content-ref url="edge.md" %} +[edge.md](edge.md) +{% endcontent-ref %} + +If you are coming from Portainer CE or the 1.24.x branch, we have guides for you as well. + +{% content-ref url="tobe/" %} +[tobe](tobe/) +{% endcontent-ref %} diff --git a/start/upgrade/docker.md b/start/upgrade/docker.md new file mode 100644 index 00000000..c8fc0a53 --- /dev/null +++ b/start/upgrade/docker.md @@ -0,0 +1,113 @@ +# Upgrading on Docker Standalone + +{% hint style="info" %} +Always match the agent version to the Portainer Server version. In other words, when you're installing or upgrading to Portainer 2.17.0 make sure all of the agents are also on version 2.17.0. +{% endhint %} + +{% hint style="danger" %} +Before beginning any upgrade, we highly recommend [taking a backup](../../admin/settings/#backup-portainer) of your current Portainer configuration. +{% endhint %} + +## Upgrading your Portainer Server + +{% hint style="warning" %} +Starting from Portainer CE 2.9 and BE 2.10, HTTPS is enabled by default on port `9443.` These instructions will configure Portainer to use 9443 for HTTPS and do not expose 9000 for HTTP. If you need to retain HTTP access, you can add: + +`-p 9000:9000` + +to your command. + +You can also choose to [completely disable HTTP](../../admin/settings/#force-https-only) after the upgrade. Before you make Portainer HTTPS only, make sure you have all your Agents and Edge Agents already communicating with Portainer using HTTPS. +{% endhint %} + +{% hint style="info" %} +This article assumes that you used our recommended deployment scripts. +{% endhint %} + +To upgrade to the latest version of Portainer Server, use the following commands to stop then remove the old version. Your other applications/containers will not be removed. + +``` +docker stop portainer +``` + +``` +docker rm portainer +``` + +Now that you have stopped and removed the old version of Portainer, you must ensure that you have the latest version of the image locally. You can do this with a `docker pull` command: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker pull portainer/portainer-ee:latest +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker pull portainer/portainer-ce:latest +``` +{% endtab %} +{% endtabs %} + +Finally, deploy the updated version of Portainer: + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest +``` +{% endtab %} +{% endtabs %} + +{% hint style="warning" %} +These `docker run` commands include opening port `8000` which is used for Edge Agent communication as included in our [installation instructions](../install/server/docker/linux.md). If you do not need this port open, you can remove it from the command. +{% endhint %} + +{% hint style="info" %} +To provide your own SSL certs you may use `--sslcert` and `--sslkey` flags as below to provide the certificate and key files. The certificate file needs to be the full chain and in PEM format. For example, for Business Edition: + +``` +docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest --sslcert /path/to/cert/portainer.crt --sslkey /path/to/cert/portainer.key +``` +{% endhint %} + +The newest version of Portainer will now be deployed on your system, using the persistent data from the previous version, and will also upgrade the Portainer database to the new version. + +When the deployment is finished, go to `https://your-server-address:9443` or `http://your-server-address:9000` and log in. You should notice that the update notification has disappeared and the version number has been updated. + +## Agent-only upgrade + +To upgrade to the latest version of Portainer Agent, use the following commands to stop then remove the old version. Your other applications/containers will not be removed. + +``` +docker stop portainer_agent +``` + +``` +docker rm portainer_agent +``` + +Next, pull the updated version of the image: + +``` +docker pull portainer/agent:latest +``` + +Finally, start the agent with the updated image: + +``` +docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent:latest +``` + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you must remember to explicitly provide this when updating your agent: + +`-e AGENT_SECRET=yoursecret` +{% endhint %} diff --git a/start/upgrade/edge.md b/start/upgrade/edge.md new file mode 100644 index 00000000..77b8c6a2 --- /dev/null +++ b/start/upgrade/edge.md @@ -0,0 +1,88 @@ +# Upgrading the Edge Agent + +To upgrade the Portainer Edge Agent to the latest version, follow the below instructions for your Edge environment. + +{% hint style="info" %} +Always match the agent version to the Portainer Server version. In other words, when you're installing or upgrading to Portainer 2.17.0 make sure all of the agents are also on version 2.17.0. +{% endhint %} + +{% hint style="danger" %} +Before beginning any upgrade, we highly recommend [taking a backup](../../admin/settings/#backup-portainer) of your current Portainer configuration. +{% endhint %} + +## Docker Standalone + +{% hint style="info" %} +Portainer now also has the ability to update Edge Agents on Docker Standalone [directly from within the UI](../../admin/environments/update.md). +{% endhint %} + +To upgrade the Portainer Edge Agent on a Docker Standalone platform, you will first need to note the **Edge identifier** and the **Edge key** for the Edge environment. To find these values, log into Portainer and click **Environments**, then click the name of the environment you are updating. + +At the top of the page in the **Edge information** section, you will see the two values you require in the next steps. + +
+ +Next, on the Edge environment, we need to stop and remove the Edge Agent container. + +``` +docker stop portainer_edge_agent +docker rm portainer_edge_agent +``` + +We also want to ensure we have the updated version of the container image locally: + +``` +docker pull portainer/agent:latest +``` + +To deploy the updated Edge Agent, replace the `your-edge-identifier-here` and `your-edge-key-here` values in the following command with those you retrieved earlier, then run the command: + +``` +docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes -v /:/host -v portainer_agent_data:/data --restart always -e EDGE=1 -e EDGE_ID=your-edge-identifier-here -e EDGE_KEY=your-edge-key-here -e EDGE_INSECURE_POLL=1 --name portainer_edge_agent portainer/agent:latest +``` + +## Docker Swarm + +To upgrade the Portainer Edge Agent on a Docker Swarm environment, run the following commands. + +First, to ensure you have the updated container image locally, pull the image: + +``` +docker pull portainer/agent:latest +``` + +Then, update the service to use the new image version: + +``` +docker service update --image portainer/agent:latest --force portainer_edge_agent +``` + +## Kubernetes + +To upgrade the Portainer Edge Agent on a Kubernetes environment, you will need to first download an updated YAML manifest, then apply that manifest to your existing environment. + +To download the manifest, you can use one of the following commands: + +{% tabs %} +{% tab title="Business Edition" %} +``` +curl -L https://downloads.portainer.io/ee2-15/portainer-agent-edge-k8s.yaml -o portainer-agent-edge-k8s.yaml +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +curl -L https://downloads.portainer.io/ce2-15/portainer-agent-edge-k8s.yaml -o portainer-agent-edge-k8s.yaml +``` +{% endtab %} +{% endtabs %} + +To apply this manifest to your environment, run the following command: + +``` +kubectl apply -f portainer-agent-edge-k8s.yaml +``` + +## Nomad + +For Nomad-specific upgrade instructions, please refer to [Upgrading on Nomad](nomad.md). diff --git a/start/upgrade/kubernetes.md b/start/upgrade/kubernetes.md new file mode 100644 index 00000000..29d953dc --- /dev/null +++ b/start/upgrade/kubernetes.md @@ -0,0 +1,222 @@ +# Upgrading on Kubernetes + +{% hint style="info" %} +Always match the agent version to the Portainer Server version. In other words, when you're installing or upgrading to Portainer 2.17.0 make sure all of the agents are also on version 2.17.0. +{% endhint %} + +{% hint style="warning" %} +Starting from Portainer CE 2.9 and BE 2.10, HTTPS is enabled by default on port `9443.` These instructions will configure Portainer to use both `9443` for HTTPS and `9000` for HTTP. You can choose to [completely disable HTTP](../../admin/settings/#force-https-only) after the upgrade. + +Before you make Portainer HTTPS only, make sure you have all your Agents and Edge Agents already communicating with Portainer using HTTPS. +{% endhint %} + +{% hint style="danger" %} +Before beginning any upgrade, we highly recommend [taking a backup](../../admin/settings/#backup-portainer) of your current Portainer configuration. +{% endhint %} + +Select the Portainer upgrade method which matches the original installation method used. + +## Method 1: Upgrading using Helm + +Add the Portainer Helm repository by running the following commands. Ignore any warnings about the repo already being there: + +``` +helm repo add portainer https://portainer.github.io/k8s/ +helm repo update +``` + +Next, run the following command to upgrade to the latest version of Portainer: + +``` +helm upgrade -n portainer portainer portainer/portainer +``` + +## Method 2: Upgrading using YAML Manifest + +### Option 1: Via the Portainer UI + +The easiest way to upgrade is to use the Portainer UI along with our manifest files. Copy the contents of the manifest file that matches the method you used to deploy Portainer: + +{% tabs %} +{% tab title="NodePort" %} +Copy the contents of the relevant NodePort manifest file: + +**Business Edition:** + +``` +https://downloads.portainer.io/ee2-17/portainer.yaml +``` + +**Community Edition:** + +``` +https://downloads.portainer.io/ce2-17/portainer.yaml +``` + +For an agent-only deployment, use one of the following manifests instead: + +**Business Edition:** + +``` +https://downloads.portainer.io/ee2-17/portainer-agent-k8s-nodeport.yaml +``` + +**Community Edition:** + +``` +https://downloads.portainer.io/ce2-17/portainer-agent-k8s-nodeport.yaml +``` + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you must remember to explicitly provide this in the YAML when updating your agent: + +`environment:` + + `- AGENT_SECRET: yoursecret` +{% endhint %} +{% endtab %} + +{% tab title="Load Balancer" %} +Copy the contents of the relevant Load Balancer manifest file: + +**Business Edition:** + +``` +https://downloads.portainer.io/ee2-17/portainer-lb.yaml +``` + +**Community Edition:** + +``` +https://downloads.portainer.io/ce2-16/portainer-lb.yaml +``` + +For an agent-only deployment, use one of the following manifests instead: + +**Business Edition:** + +``` +https://downloads.portainer.io/ee2-17/portainer-agent-k8s-lb.yaml +``` + +**Community Edition:** + +``` +https://downloads.portainer.io/ce2-17/portainer-agent-k8s-lb.yaml +``` + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you must remember to explicitly provide this in the YAML when updating your agent: + +`environment:` + + `- AGENT_SECRET: yoursecret` +{% endhint %} +{% endtab %} +{% endtabs %} + +Log into Portainer and connect to the Kubernetes environment where Portainer is installed. From the menu select **Applications** then select **Create from manifest**. Toggle **Use namespace(s) specified from manifest** to on, then enter `portainer` in the **Name** field. + +{% hint style="warning" %} +If you used a different name for your Portainer deployment, use that instead. +{% endhint %} + +From the **Build method** selection choose **Web Editor** and ensure **Kubernetes** is selected as the **Deploy type**. Paste the contents of the YAML file then click **Deploy**. Portainer will process the manifest and should return you to the login page once the upgrade is complete. + +### Option 2: Via the command line + +If you prefer to use the command line to upgrade, you can do so using `kubectl` commands: + +{% tabs %} +{% tab title="NodePort" %} +Log into the control node of your Kubernetes cluster and run one of the following commands: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer.yaml +``` + +For an agent-only deployment, use one of the following commands instead: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-agent-k8s-nodeport.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-agent-k8s-nodeport.yaml +``` + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you must remember to explicitly provide this in the YAML when updating your agent: + +`environment:` + + `- AGENT_SECRET: yoursecret` +{% endhint %} +{% endtab %} + +{% tab title="Load Balancer" %} +Log into the control node of your Kubernetes cluster and run one of the following commands: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-lb.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer.yaml +``` + +For an agent-only deployment, use one of the following commands instead: + +**Business Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-agent-k8s-lb.yaml +``` + +**Community Edition:** + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ce2-17/portainer-agent-k8s-lb.yaml +``` + +{% hint style="warning" %} +If you have set a custom `AGENT_SECRET` on your Portainer Server instance you must remember to explicitly provide this in the YAML when updating your agent: + +`environment:` + + `- AGENT_SECRET: yoursecret` +{% endhint %} +{% endtab %} +{% endtabs %} + +When the deployment is finished you will be able to log into Portainer. You should notice the new version number at the bottom-left of the Portainer UI. + +## Method 3: Force an update + +If Portainer does not update after running the above commands, you can force a download of the latest image by running the following command: + +``` +kubectl -n portainer rollout restart deployment.apps/portainer +``` + +Or, for an agent-only deployment, use this command instead: + +``` +kubectl -n portainer rollout restart deployment.apps/portainer-agent +``` diff --git a/start/upgrade/nomad.md b/start/upgrade/nomad.md new file mode 100644 index 00000000..2f5f95f8 --- /dev/null +++ b/start/upgrade/nomad.md @@ -0,0 +1,25 @@ +# Upgrading on Nomad + +To upgrade the version of the Portainer Agent on a Nomad device, please use the following steps. + +{% hint style="info" %} +If you are using Nomad authentication, you will need to retrieve your Nomad token before proceeding. +{% endhint %} + +In the Portainer UI, select **Environments** then select the Nomad environment you want to upgrade. Make note of the **Edge key** and **Edge identifier** as we will need these later. + +
+ +Once you have the values recorded, click the **Disassociate** button, then click **Disassociate** in the warning that appears. + +
+ +You will then be provided with a script generation dialog. + +Select **Nomad**, and if you are using authentication toggle the **Enable authentication** option and enter your **Nomad token**. Enter any other customizations you have for your environment such as environment variables. + +
+ +Copy the generated command for environment installation, but don't run it yet. First, edit the copied command and replace the **Edge key** and **Edge identifier** values with those noted earlier. + +Finally, run the modified command on your Nomad device. The job will be deployed and updated, retaining your previous settings. diff --git a/start/upgrade/swarm.md b/start/upgrade/swarm.md new file mode 100644 index 00000000..1f3ac643 --- /dev/null +++ b/start/upgrade/swarm.md @@ -0,0 +1,58 @@ +# Upgrading on Docker Swarm + +{% hint style="info" %} +Always match the agent version to the Portainer Server version. In other words, when you're installing or upgrading to Portainer 2.17.0 make sure all of the agents are also on version 2.17.0. +{% endhint %} + +{% hint style="warning" %} +Starting from Portainer CE 2.9 and BE 2.10, HTTPS is enabled by default on port `9443.` These instructions will configure Portainer to use 9443 for HTTPS and 9000 for HTTP. You can choose to [completely disable HTTP](../../admin/settings/#force-https-only) after the upgrade. + +Before you make Portainer HTTPS only, make sure you have all your Agents and Edge Agents already communicating with Portainer using HTTPS. +{% endhint %} + +{% hint style="danger" %} +Before beginning any upgrade, we highly recommend [taking a backup](../../admin/settings/#backup-portainer) of your current Portainer configuration. +{% endhint %} + +To upgrade the Portainer Server and the agents on Docker Swarm, first run the following command on the manager node of your Docker Swarm cluster: + +``` +docker service ls +``` + +Make note of the service names for Portainer. You will need them later. + +``` +ID NAME MODE REPLICAS IMAGE PORTS +tb9gtxc647fw portainer-agent_agent global 3/3 portainer/agent:latest +m3a3mtuy55ed portainer_portainer replicated 1/1 portainer/portainer-ee:latest *:8000->8000/tcp, *:9000->9000/tcp +``` + +To upgrade Portainer Server to the latest version, run one of the sets of commands below depending on your edition of Portainer (replace the `portainer_portainer` service name if your setup differs): + +{% tabs %} +{% tab title="Business Edition" %} +``` +docker pull portainer/portainer-ee:latest +docker service update --image portainer/portainer-ee:latest --publish-add 9443:9443 --force portainer_portainer +``` +{% endtab %} + +{% tab title="Community Edition" %} +``` +docker pull portainer/portainer-ce:latest +docker service update --image portainer/portainer-ce:latest --publish-add 9443:9443 --force portainer_portainer +``` +{% endtab %} +{% endtabs %} + +To upgrade the Portainer Agent to the latest version, run the commands below (replace the `portainer_agent` service name if your setup differs): + +``` +docker pull portainer/agent:latest +docker service update --image portainer/agent:latest --force portainer_agent +``` + +This will deploy the newest version of Portainer and the agent across your swarm and upgrade the Portainer database to match. + +When this is finished, go to `https://your-server-address:9443` or `http://your-server-address:9000` and log in. You should notice that the update notification has disappeared and the version number has been updated. diff --git a/start/upgrade/tobe/README.md b/start/upgrade/tobe/README.md new file mode 100644 index 00000000..3ef9b25e --- /dev/null +++ b/start/upgrade/tobe/README.md @@ -0,0 +1,30 @@ +# Switching to Portainer Business Edition + +It’s easy and quick to upgrade from Portainer CE (both 1.x and 2.x branches) to Portainer Business Edition without losing your data. The following instructions apply whether you’re using a 5 node free license or you’ve purchased a license for Portainer Business Edition. + +From version 2.17, you can upgrade your Portainer CE installation to Portainer BE from within Portainer itself. + +{% content-ref url="inapp.md" %} +[inapp.md](inapp.md) +{% endcontent-ref %} + +If you would like to upgrade manually, you can find instructions for your environment at the following links: + +{% content-ref url="docker.md" %} +[docker.md](docker.md) +{% endcontent-ref %} + +{% content-ref url="swarm.md" %} +[swarm.md](swarm.md) +{% endcontent-ref %} + +{% content-ref url="kubernetes.md" %} +[kubernetes.md](kubernetes.md) +{% endcontent-ref %} + +For Agent-only deployments, you do not need to upgrade the Agent to Business Edition. + +{% content-ref url="agent.md" %} +[agent.md](agent.md) +{% endcontent-ref %} + diff --git a/start/upgrade/tobe/agent.md b/start/upgrade/tobe/agent.md new file mode 100644 index 00000000..089c44e8 --- /dev/null +++ b/start/upgrade/tobe/agent.md @@ -0,0 +1,3 @@ +# Upgrading Agent-only deployments + +Both Portainer Community Edition and Portainer Business Edition use the same Portainer Agent container image to run, so if you are upgrading from CE to BE and have Agent-only environments, you don't need to upgrade them as well - just ensure they are on the same version (for example, if the Portainer Server is version 2.17.0 then the Portainer Agent should be 2.17.0 as well). diff --git a/start/upgrade/tobe/docker.md b/start/upgrade/tobe/docker.md new file mode 100644 index 00000000..2d9f61ae --- /dev/null +++ b/start/upgrade/tobe/docker.md @@ -0,0 +1,78 @@ +# Docker Standalone + +{% hint style="warning" %} +This article assumes that you used our recommended deployment scripts. +{% endhint %} + +{% hint style="info" %} +Before you begin, copy the license key from the email we sent you. +{% endhint %} + +The process for switching to Portainer Business Edition is straightforward but does depend on which version of Portainer you are currently running. Start from the instructions for your current version and work your way down. + +* [Version 1.24.0 or older](docker.md#upgrading-from-versions-older-than-1.24.1) +* [Version 1.24.1 or 1.24.2](docker.md#upgrading-from-1.24.1-and-1.24.2) +* [Version 2.0.0 or newer](docker.md#upgrading-from-version-2.0.0-and-later) + +## **Upgrading from versions older than 1.24.1** + +If you are running a version prior to 1.24.1, you must first upgrade to `portainer/portainer:1.24.2`. Your other applications/containers will not be removed. Use the following commands to stop then remove the old version, then run Portainer release 1.24.2: + +``` +docker stop portainer + +docker rm portainer + +docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:1.24.2 +``` + +Verify that you are running version 1.24.2 by logging into Portainer and reading the version number on the bottom-left of the UI. You should now proceed to [upgrade to version 2.0.0](docker.md#upgrading-from-1.24.1-and-1.24.2). + +## Upgrading from 1.24.1 and 1.24.2 + +If you are running a version prior to 1.24.1 and want to upgrade to the latest Portainer release, you must first upgrade to `portainer/portainer-ce:2.0.0`, use the following commands to stop then remove the old version. Your other applications/containers will not be removed. + +``` +docker stop portainer +``` + +``` +docker rm portainer +``` + +Now that you have stopped and removed the old version of Portainer, you must ensure that you have the latest version of the image locally. You can do this with a `docker pull` command: + +``` +docker pull portainer/portainer-ce:2.0.0 +``` + +Finally, deploy the updated version of Portainer: + +``` +docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.0.0 +``` + +Portainer CE 2.0.0 will now be deployed on your system, using the persistent data from the previous version, and will also upgrade the Portainer database to the new version. + +When the deployment is finished, go to `http://your-server-address:9000` and log in. Verify that you are running version 2.0.0 by logging into Portainer and reading the version number on the bottom-left of the UI. You can now [upgrade to the latest version](docker.md#upgrading-from-version-2.0.0-and-later) of Portainer Business Edition. + +## Upgrading from version 2.0.0 and later + +To upgrade to Portainer Business Edition for Docker Standalone, use the following commands to stop then remove the old version. Your other applications/containers will not be removed. + +``` +docker stop portainer +docker rm portainer +``` + +Now that you have stopped and removed the old version of Portainer, run this command to deploy the latest version of Portainer Business: + +``` +docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 --name=portainer --restart=always --pull=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest +``` + +Log out of Portainer (if currently logged in) then log back in. When you log in for the first time, you'll be asked to enter your license key. Paste this in from the email we sent you. + +
+ +'Business Edition' now appears in the bottom-left corner. diff --git a/start/upgrade/tobe/inapp.md b/start/upgrade/tobe/inapp.md new file mode 100644 index 00000000..2f15425a --- /dev/null +++ b/start/upgrade/tobe/inapp.md @@ -0,0 +1,22 @@ +# Upgrade to Business Edition from Portainer + +To upgrade from Portainer Community Edition to Portainer Business Edition from within Portainer, log in as an administrator and click the **Upgrade to Business Edition** message in the top left. + +
+ +If you already have a license for Portainer Business Edition, paste it in the box and click **Start upgrade** to begin the upgrade process. + +If you do not currently have a license, click **Get a license** and fill out the form to receive a trial key. + +
+ +Your trial key will be sent to the email address you provided and you will be returned to the license entry form. + +{% hint style="info" %} +Your license should be sent automatically within a few minutes. If you have not received it please check your spam folders, or [get in touch with our team](mailto:success@portainer.io) if you have not received it in 24 hours. +{% endhint %} + +
+ +When you receive your license, paste the key into the box and click **Start upgrade** to begin the upgrade process. + diff --git a/start/upgrade/tobe/kubernetes.md b/start/upgrade/tobe/kubernetes.md new file mode 100644 index 00000000..90923d73 --- /dev/null +++ b/start/upgrade/tobe/kubernetes.md @@ -0,0 +1,51 @@ +# Kubernetes + +{% hint style="info" %} +Select the Portainer CE to Portainer Business upgrade method below which matches the original installation method used. +{% endhint %} + +## Method 1: Upgrade via Helm + +To update your Helm repository, run this command first: + +``` +helm repo update +``` + +Run this command next to deploy the latest version of Portainer Business on your Kubernetes cluster with all of the settings used in your Helm deployment: + +``` +helm upgrade -n portainer portainer portainer/portainer --set enterpriseEdition.enabled=true +``` + +## Method 2: Upgrade via YAML Manifests + +Choose the right YAML manifest based on your original deployment: + +{% tabs %} +{% tab title="NodePort" %} +Use the following `kubectl` command to update a NodePort deployment: + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer.yaml +``` +{% endtab %} + +{% tab title="Load Balancer" %} +Use the following `kubectl` command to update a Load Balancer deployment: + +``` +kubectl apply -n portainer -f https://downloads.portainer.io/ee2-17/portainer-lb.yaml +``` +{% endtab %} +{% endtabs %} + +This will deploy the newest version of Portainer Business on your Kubernetes cluster. + +## Logging back in + +When the upgrade is complete, log out of Portainer (if currently logged in) then log back in. When you log in for the first time, you'll be asked to enter your license key. Paste this in from the email we sent you. + +
+ +'Business Edition' now appears in the bottom-left corner. diff --git a/start/upgrade/tobe/swarm.md b/start/upgrade/tobe/swarm.md new file mode 100644 index 00000000..1446812d --- /dev/null +++ b/start/upgrade/tobe/swarm.md @@ -0,0 +1,21 @@ +# Docker Swarm + +{% hint style="warning" %} +This article assumes that you used our recommended deployment scripts. +{% endhint %} + +{% hint style="info" %} +Before you begin, copy the license key from the email we sent you. +{% endhint %} + +To upgrade to Portainer Business Edition for Docker Swarm, use the following commands to deploy the newest version of Portainer Business on your Swarm Cluster: + +``` +docker service update --image portainer/portainer-ee:latest --force portainer_portainer +``` + +Log out of Portainer (if currently logged in) then log back in. When you log in for the first time, you'll be asked to enter your license key. Paste this in from the email we sent you. + +
+ +'Business Edition' now appears in the bottom-left corner. diff --git a/user/account-settings.md b/user/account-settings.md new file mode 100644 index 00000000..353f20d5 --- /dev/null +++ b/user/account-settings.md @@ -0,0 +1,58 @@ +# Account settings + +To get access to and update your user settings, click your username in the top-right of the Portainer UI and select **My account**. + +
+ +## Changing your password + +Enter the following details, using the table below as a guide. When you're finished, click **Update password**. + +
+ +| Field/Option | Overview | +| ---------------- | ----------------------------------------------------------- | +| Current password | Enter the password you currently use to log into Portainer. | +| New password | Enter a new password for your account. | +| Confirm password | Enter the new password again. | + +[Minimum password length requirements](../admin/settings/authentication/) are set by the administrator. + +## Access tokens + +This section allows you to manage your API access tokens. You can see a list of the access tokens that exist for your user as well as add and remove tokens as required. + +
+ +For more information on access tokens, refer to our [API access documentation](../api/access.md#creating-an-access-token). + +## Git credentials + +This section lets you manage your saved Git credentials for use in deployments. These credentials are available only to your user. + +{% hint style="info" %} +This feature is only available in Portainer Business Edition. +{% endhint %} + +
+ +To add a new credential, click the **Add git credential** button and fill out the fields using the table below as a guide: + +| Field | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------ | +| Name | Enter a name for this credential entry. This is how it will appear when selecting it for use when deploying. | +| Username | Enter the username, if relevant. | +| Personal Access Token | Enter the personal access token. | + +
+ +Once you've entered the relevant details, click **Save git credential** to save the entry. + +## Changing the theme + +Portainer lets you choose between light, dark and high-contrast themes, or to auto-select the theme based on your system theme. The chosen theme applies only to this user. + +Select a theme from the options. The change will be automatically applied. + +
+ diff --git a/user/aci/README.md b/user/aci/README.md new file mode 100644 index 00000000..961e6785 --- /dev/null +++ b/user/aci/README.md @@ -0,0 +1,16 @@ +# Azure ACI + +{% hint style="info" %} +Support for Azure ACI is currently experimental. +{% endhint %} + +The following sections describe how to manage an Azure ACI environment using menu options available in the Portainer Server. To learn how to add an Azure ACI environment, see our [environment guide](../../start/install/agent/aci.md). + +{% content-ref url="dashboard.md" %} +[dashboard.md](dashboard.md) +{% endcontent-ref %} + +{% content-ref url="containers/" %} +[containers](containers/) +{% endcontent-ref %} + diff --git a/user/aci/containers/README.md b/user/aci/containers/README.md new file mode 100644 index 00000000..4de0f6e1 --- /dev/null +++ b/user/aci/containers/README.md @@ -0,0 +1,15 @@ +# Container instances + +The **Container Instances** page allows you to interact with containers in your Azure application, letting you add and remove containers as needed. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + + + +\ diff --git a/user/aci/containers/add.md b/user/aci/containers/add.md new file mode 100644 index 00000000..e05f6b75 --- /dev/null +++ b/user/aci/containers/add.md @@ -0,0 +1,23 @@ +# Add a new container + +From the menu select **Container instances** then click **Add container**. + +
+ +Complete the configuration, using the table below as a guide: + +| Field/Option | Overview | +| -------------- | ------------------------------------------------------------------------------------ | +| Subscription | Select the subscription you want to use for the container. | +| Resource group | If two or more resource groups exist, select where you want to deploy the container. | +| Location | Select which datacenter to run the container in. | +| Name | Give the container a descriptive name. | +| Image | Enter the name of the image that will be used to deploy the container. | +| OS | Select the OS (typically Linux or Windows). | +| Port mapping | Select the port needed to publish to the Internet. | +| CPU | Define how much CPU to allocate to the container. | +| Memory | Define how much memory to allocate to the container. | + +
+ +When you're ready, click **Deploy the container**. When the deployment has finished, you'll see it in the list of Azure container instances. diff --git a/user/aci/containers/remove.md b/user/aci/containers/remove.md new file mode 100644 index 00000000..f6a7e096 --- /dev/null +++ b/user/aci/containers/remove.md @@ -0,0 +1,9 @@ +# Remove a container + +From the menu select **Container instances**, tick the checkbox next to the container you want to remove then click **Remove**. + +
+ +When the confirmation message appears, click **Remove**. + +
diff --git a/user/aci/dashboard.md b/user/aci/dashboard.md new file mode 100644 index 00000000..10f80903 --- /dev/null +++ b/user/aci/dashboard.md @@ -0,0 +1,5 @@ +# Dashboard + +The Azure ACI dashboard summarizes your Azure ACI environment and shows the components that make up the environment. Tiles show the number of subscriptions and resource groups that make up your Azure application. + +
diff --git a/user/docker/README.md b/user/docker/README.md new file mode 100644 index 00000000..c1936974 --- /dev/null +++ b/user/docker/README.md @@ -0,0 +1,56 @@ +# Docker/Swarm + +The following sections describe how to manage a Docker Standalone or Docker Swarm environment using menu options available in the Portainer Server. + +{% content-ref url="dashboard.md" %} +[dashboard.md](dashboard.md) +{% endcontent-ref %} + +{% content-ref url="templates/" %} +[templates](templates/) +{% endcontent-ref %} + +{% content-ref url="stacks/" %} +[stacks](stacks/) +{% endcontent-ref %} + +{% content-ref url="services/" %} +[services](services/) +{% endcontent-ref %} + +{% content-ref url="containers/" %} +[containers](containers/) +{% endcontent-ref %} + +{% content-ref url="images/" %} +[images](images/) +{% endcontent-ref %} + +{% content-ref url="networks/" %} +[networks](networks/) +{% endcontent-ref %} + +{% content-ref url="volumes/" %} +[volumes](volumes/) +{% endcontent-ref %} + +{% content-ref url="configs/" %} +[configs](configs/) +{% endcontent-ref %} + +{% content-ref url="secrets/" %} +[secrets](secrets/) +{% endcontent-ref %} + +{% content-ref url="events.md" %} +[events.md](events.md) +{% endcontent-ref %} + +{% content-ref url="host/" %} +[host](host/) +{% endcontent-ref %} + +{% content-ref url="swarm/" %} +[swarm](swarm/) +{% endcontent-ref %} + diff --git a/user/docker/configs/README.md b/user/docker/configs/README.md new file mode 100644 index 00000000..75d8f49e --- /dev/null +++ b/user/docker/configs/README.md @@ -0,0 +1,20 @@ +# Configs + +{% hint style="info" %} +The **Configs** menu is only available to Docker Swarm environments. +{% endhint %} + +Docker 17.06 introduced swarm service configs which allow you to store non-sensitive information, such as configuration files, outside a service’s image or running containers. This allows you to keep your images as generic as possible, without the need to bind-mount configuration files into the containers or use environment variables. [Secrets](../secrets/) is another option for storing sensitive information. + +
+ +In Portainer you can add and remove custom configurations for use in deployments. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + diff --git a/user/docker/configs/add.md b/user/docker/configs/add.md new file mode 100644 index 00000000..9d6159ea --- /dev/null +++ b/user/docker/configs/add.md @@ -0,0 +1,12 @@ +# Add a new config + +From the menu select **Configs** then click **Add config**. + +
+ + In the editor, write the configuration. You can also add labels and configure access control. + +
+ +When you're finished, click **Create config**. + diff --git a/user/docker/configs/remove.md b/user/docker/configs/remove.md new file mode 100644 index 00000000..4ea9af6c --- /dev/null +++ b/user/docker/configs/remove.md @@ -0,0 +1,5 @@ +# Remove a config + +From the menu select **Configs**, tick the checkbox next to the config you want to remove then click **Remove**. + +
diff --git a/user/docker/containers/README.md b/user/docker/containers/README.md new file mode 100644 index 00000000..c025e9ad --- /dev/null +++ b/user/docker/containers/README.md @@ -0,0 +1,66 @@ +# Containers + +Put simply, a container is a runnable instance of an image. Containers do not hold any persistent data and therefore can be destroyed and recreated as needed. + +
+ +When the [new image notification](../host/setup.md#other) feature is enabled, the circle next to the image name indicates whether the local image is up to date, with a green circle indicating it is up to date and a red circle indicating that there is a newer version of the image available at the remote registry. A grey circle indicates Portainer was unable to determine whether there is an update available for the image. + +For more on how this works, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-does-the-image-update-notification-icon-work). + +To add a new container, click **Add container**. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +Once a container has been created you can inspect it, edit or duplicate it, toggle a container webhook, attach volumes, view logs and statistics, edit ownership, and access its console. + +{% content-ref url="view.md" %} +[view.md](view.md) +{% endcontent-ref %} + +{% content-ref url="inspect.md" %} +[inspect.md](inspect.md) +{% endcontent-ref %} + +{% content-ref url="edit.md" %} +[edit.md](edit.md) +{% endcontent-ref %} + +{% content-ref url="advanced.md" %} +[advanced.md](advanced.md) +{% endcontent-ref %} + +{% content-ref url="webhooks.md" %} +[webhooks.md](webhooks.md) +{% endcontent-ref %} + +{% content-ref url="attach-volume.md" %} +[attach-volume.md](attach-volume.md) +{% endcontent-ref %} + +{% content-ref url="logs.md" %} +[logs.md](logs.md) +{% endcontent-ref %} + +{% content-ref url="ownership.md" %} +[ownership.md](ownership.md) +{% endcontent-ref %} + +{% content-ref url="stats.md" %} +[stats.md](stats.md) +{% endcontent-ref %} + +{% content-ref url="console.md" %} +[console.md](console.md) +{% endcontent-ref %} + +If you no longer need a container, you can remove it. + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + + + diff --git a/user/docker/containers/add.md b/user/docker/containers/add.md new file mode 100644 index 00000000..4680e017 --- /dev/null +++ b/user/docker/containers/add.md @@ -0,0 +1,58 @@ +# Add a new container + +Select **Containers** from the menu then click **Add container**. + +
+ +Configure the container settings as required. + +## Image configuration section + +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| Name | Give the container a descriptive name. | +| Registry | Select the registry that contains the image that you want to use for your container. | +| Image | Enter the name of the image you want to use. | +| Always pull the image | Toggle on to enforce pulling the image from the registry instead of using the locally cached copy (if you have used the image previously). | + +
+ +{% hint style="info" %} +When using Docker Hub you can use the **Search** button to search for the image you have entered, and ensure that you have the correct name and tag. Portainer also displays the number of pulls remaining for your Docker Hub account when using an anonymous account. +{% endhint %} + +Alternatively you can switch to advanced mode to manually enter registry and image details. This is useful if you want to do a one-off container deployment from a registry that isn't configured within Portainer. + +
+ +## Webhooks + +Toggle **Create a container webhook** on to create a [webhook](webhooks.md) for the container. You can send a POST request to this endpoint to automate pulling the most up-to-date image and re-deploy your container. + +
+ +## Network ports configuration section + +| Field/Option | Overview | +| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | +| Publish all exposed network ports to random host ports | Toggle on to allow Portainer to randomly assign ports on the host to the exposed ports in the container. | +| Manual network port publishing | Click **publish a new network port** to create manual port mappings for the container. | + +
+ +## Actions section + +| Field/Option | Overview | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------------- | +| Auto remove | Toggle this option on to automatically remove the container once it exits. This is useful if you want to run a container only once. | + +
+ +Once complete, set any advanced options (see below) then click **Deploy the container.** If successful your container will be shown in the container list. + +## Advanced container settings + +Choose from a [range of options](advanced.md) to customize the deployment. + +
+ diff --git a/user/docker/containers/advanced.md b/user/docker/containers/advanced.md new file mode 100644 index 00000000..da2ad51f --- /dev/null +++ b/user/docker/containers/advanced.md @@ -0,0 +1,142 @@ +# Advanced container settings + +When creating or editing a container you can configure a number of additional settings in the **Advanced container settings** section. + +
+ +## Command & logging + +In this section you can configure the command that runs when the container starts as well as configure logging for the container. + +| Field/Option | Overview | +| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Command | Set the command that is run when the container starts. Select `Default` to use the default command provided by the container's image, or select `Override` and provide a command to override the default value. | +| Entrypoint | Set the entrypoint for the container. Select `Default` to use the default entrypoint provided by the container's image, or select `Override` and provide an entrypoint to override the default value. | +| Working Dir | Set the working directory your container should start in (within the container's filesystem). | +| User | Specify the user that the container's command should run as. | +| Console | Set the console configuration for your container. | +| Driver | Select the logging driver to use for your container. Available options will depend on the logging drivers configured on your Docker host. | +| Options | Set additional options for your logging driver. To add a new option click **add logging driver option** and configure accordingly. | + +
+ +## Volumes + +Here you can configure volume mappings for your container. You can map to [existing named volumes](../volumes/) or bind mount to locations on your Docker host. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Container path | Specify where you want to make the volume or bind mount available within the container's filesystem. | +| Mapping type | Select `Volume` to map a named volume, or select `Bind` to map a bind mount. | +| Volume | If using the `Volume` mapping type, select the named volume to mount from the dropdown. | +| Host path | If using the `Bind` mapping type, specify the path on the Docker host you want to bind mount in the container. | +| Writable / Read-only | Select `Writable` if you want the container to be able to write to the mapping. Select `Read-only` if the container should **not** be able to write to the mapping. | + +
+ +## Network + +In this section you can configure the network settings for the container. + +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Network | Select the [network](../networks/) to attach the container to from the dropdown. | +| Hostname | Specify the hostname for the container. | +| Domain Name | Specify the domain name for the container. | +| Mac Address | Specify the MAC address to set on the container. | +| IPv4 Address | Specify the IPv4 address to use for the container. This must be within the range for the chosen network and should not be already assigned to a container. | +| IPv6 Address | Specify the IPv6 address to use for the container. This must be within the range for the chosen network and should not be already assigned to a container. | +| Primary DNS Server | Specify the primary DNS server to use within the container. | +| Secondary DNS Server | Specify the secondary DNS server to use within the container. | +| Hosts file entries | Click **add additional entry** to add a new host file entry for the container. Host file values should be formatted as `hostname:address` (for example `database:192.168.1.1`). | + +
+ +## Env + +Use this section to add or edit environment variables made available in the container. Click **Add an environment variable** to create a new variable, or edit an existing variable with the fields provided. You can also click **Load variables from .env file** to import an existing .env file with your variables. To remove a variable, click the trash can icon to the right of the variable to remove. + +| Field/Option | Overview | +| ------------ | ------------------------------------------- | +| Name | Set the name for the environment variable. | +| Value | Set the value for the environment variable. | + +
+ +If you want to add multiple variables at once, click on **Advanced mode** to switch to an editor view where you can paste a block of variables and values. + +## Labels + +You can set labels on your container using this section. Click add label to add a new label, or edit an existing label using the fields provided. To remove a label, click the trash can icon to the right of the label to remove. + +| Field/Option | Overview | +| ------------ | ---------------------------- | +| Name | Set the name for the label. | +| Value | Set the value for the label. | + +
+ +## Restart policy + +Use this section to configure the restart policy for your container. Possible options are: + +* **Never**: Do not automatically restart the container when it exits. This is the default. +* **Always**: Always restart the container regardless of the exit status. When you specify always, Docker will try to restart the container indefinitely. The container will also always start on Docker startup, regardless of the current state of the container. +* **On failure**: Restart only if the container exits with a non-zero exit status. +* **Unless stopped**: Always restart the container regardless of the exit status, including on Docker startup, except if the container was put into a stopped state before Docker was stopped. + +
+ +## Runtime & Resources + +This section lets you configure runtime options for your container, add or configure GPUs for use within the container, and specify resource limitations on the container. + +### Runtime + +Here you can configure runtime options for the container. + +| Field/Option | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Privileged mode | Enable this option to run the container in [privileged mode](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities). | +| Init | Enable this option to tell Docker that an init process should be used as PID 1 in the container. | +| Runtime | Select the runtime to use to start the container. Options will depend on available runtimes on your Docker host. | +| Devices | Use this option to make devices on your Docker host available within the container. Click **add device** to add a new device, and define the **host** path for the device and the **container** path for where you want the device to appear within the container. | +| Sysctls | Use this option to specify sysctls to make available within the container. Click **add sysctl** to add a new sysctl, and set the **name** and **value** for your sysctl as required. | +| Shared memory size | Specify the size (in MB) of the shared memory device (`/dev/shm`) for the container. | + +
+ +### GPU + +Here you can enable GPU access for the container and configure the GPU settings as required. + +{% hint style="info" %} +GPU support is currently only available on Docker Standalone environments. +{% endhint %} + +| Field/Option | Overview | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enable GPU | Toggle this option on to enable GPU access for the container. | +| GPU selector | Select the GPU(s) to make available to the container, or choose `Use All GPUs` to provide access to all the GPUs on the Docker host. | +| Capabilities | Select the capabilities you want to use with the container. Portainer preselects `compute` and `utility` as they are the defaults when not specifying capabilities. | +| Control | View a generated equivalent of the Docker CLI's `--gpus` option based on your selections above. | + +
+ +### Resources + +Here you can configure resource limits for your container. You can use the sliders to set the value or enter a value in the fields. + +| Field/Option | Overview | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Memory reservation (MB) | Specify the amount of memory (in MB) to reserve for the container. | +| Memory limit (MB) | Specify the maximum amount of memory (in MB) the container is allowed to use. | +| Maximum CPU usage | Specify the maximum amount of CPU the container is allowed to use. This is specified based on the number of processing threads available on your Docker host. | + +
+ +## Capabilities + +In this section you can configure the individual capabilities for your container. For more information refer to the [Docker documentation](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities). + +
diff --git a/user/docker/containers/attach-volume.md b/user/docker/containers/attach-volume.md new file mode 100644 index 00000000..1696bc10 --- /dev/null +++ b/user/docker/containers/attach-volume.md @@ -0,0 +1,23 @@ +# Attach a volume to a container + +{% hint style="danger" %} +This article explains how to attach a new [volume](../volumes/) to a running container. This operation destroys the running container and starts a new one with the volume attached. + +**Always back up your data before running this operation.** +{% endhint %} + +From the menu select **Containers**, select the container that you want to attach a volume to, then click **Duplicate/Edit**. + +
+ +Scroll down to **Advanced container settings**. Click **Volumes** then click **map additional volume**. + +
+ +In the **container** field enter the path. In the **volume** field enter the volume to attach to the container. + +
+ +When you're ready, click **Deploy the container**. When the confirmation message appears, click **Replace**. + +
diff --git a/user/docker/containers/console.md b/user/docker/containers/console.md new file mode 100644 index 00000000..6238bd19 --- /dev/null +++ b/user/docker/containers/console.md @@ -0,0 +1,17 @@ +# Access a container's console + +From the menu select **Containers**, select the container then select **Console**. + +
+ +Select the command and the user you want to give access to, then click **Connect**. + +{% hint style="info" %} +For Alpine Linux containers, you must select the`/bin/ash` command. +{% endhint %} + +
+ +If you need to define a command other than those provided, toggle the **Use custom command** option on. Once connected, you can run commands in the console the same as any other Linux system. + +
diff --git a/user/docker/containers/edit.md b/user/docker/containers/edit.md new file mode 100644 index 00000000..35abd268 --- /dev/null +++ b/user/docker/containers/edit.md @@ -0,0 +1,26 @@ +# Edit or duplicate a container + +{% hint style="warning" %} +Editing a container effectively creates a new container with the updated settings and replaces the old container. +{% endhint %} + +## Editing a running container + +From the menu select **Containers**, select the container you want to edit then click **Duplicate/Edit**. + +
+ +Make the required changes to the container configuration. When you're finished, click **Deploy the container**. When the confirmation message appears, click **Replace**. + +
+ +If successful, a message will appear confirming that a new container has been created with the new settings, replacing the old container. + +## Duplicating a running container + +From the menu select **Containers**, select the container you want to duplicate then click **Duplicate/Edit**. + +
+ +Make the required changes to the container configuration, making sure you enter a new container name in order to create a duplicate. When you're finished, click **Deploy the container**. + diff --git a/user/docker/containers/inspect.md b/user/docker/containers/inspect.md new file mode 100644 index 00000000..11d22ca4 --- /dev/null +++ b/user/docker/containers/inspect.md @@ -0,0 +1,15 @@ +# Inspect a container + +View information about any container, such as network settings, volumes and images. + +From the menu select **Containers**, select the container then select **Inspect**. + +
+ +All of the information about the container will display in a tree view. Select any parameter to show more details (if available). + +
+ +You can also inspect the container in a raw JSON format by clicking **Text**. + +
diff --git a/user/docker/containers/logs.md b/user/docker/containers/logs.md new file mode 100644 index 00000000..557c20db --- /dev/null +++ b/user/docker/containers/logs.md @@ -0,0 +1,32 @@ +# View container logs + +From the menu select **Containers**, select the container then select **Logs**. + +
+ +Here you can see the contents of the Docker logs for your container. + +| Field/Option | Overview | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Search | Enter a string to search the log output. You can see the number of results for your search and move through each result with the up and down arrows. | +| Filter search results | When enabled, display only the log lines that contain your search string. | +| Copy | Click this button to copy the currently displayed log lines to your clipboard. | +| Download logs | Click this button to download your log. | + +
+ +You can also set various options for how the logs are displayed: + +| Field/Option | Overview | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Auto-refresh | Toggle this option off to disable auto refreshing of the log view. When off, you can click the refresh icon to the right of the toggle to manually refresh the view. | +| Fetch | Select the time period from which to retrieve the logs. | +| Lines | Limit the number of lines per log file (the default is 1000). | +| Show timestamp | When enabled, display a timestamp before each log line. | +| Show line numbers | When enabled, display line numbers for each log line. | +| Wrap line | When enabled, lines longer than the screen width will be wrapped onto the next line. | +| Full screen | Click the full screen icon to expand the log display to fill your screen. | + + + +
diff --git a/user/docker/containers/ownership.md b/user/docker/containers/ownership.md new file mode 100644 index 00000000..d6afe023 --- /dev/null +++ b/user/docker/containers/ownership.md @@ -0,0 +1,21 @@ +# Change container ownership + +Portainer allows you to limit container management to specific teams or users. + +From the menu select **Containers** then select the container whose ownership you want to change. + +
+ +Under the **Access control** section tick the **Change ownership** checkbox then select the new ownership type, using the table below as a guide. + +| Ownership Type | Overview | +| -------------- | ----------------------------------------------------------------------------------------------------------- | +| Administrators | Only Portainer administrators can manage the container. | +| Restricted | Only teams or users you specify can manage the container. | +| Public | Anyone who has [access to the environment](../../../admin/environments/access.md) can manage the container. | + +
+ +When you've made your selection, click **Update ownership**. When the confirmation message appears, click **Change ownership**. + +
diff --git a/user/docker/containers/remove.md b/user/docker/containers/remove.md new file mode 100644 index 00000000..1415bf81 --- /dev/null +++ b/user/docker/containers/remove.md @@ -0,0 +1,9 @@ +# Remove a container + +From the menu select **Containers**, tick the checkbox next to the container you want to remove then click **Remove**. + +
+ +When the confirmation message appears, opt whether or not to automatically remove non-persistent volumes then click **Remove**. + +
diff --git a/user/docker/containers/stats.md b/user/docker/containers/stats.md new file mode 100644 index 00000000..a52d906f --- /dev/null +++ b/user/docker/containers/stats.md @@ -0,0 +1,21 @@ +# View container statistics + +From the menu select **Containers**, select the container then select **Stats**. + +
+ +The information available includes: + +* Memory usage. +* CPU usage. +* Network usage (RX and TX). +* I/O usage. +* Processes running in the container + +
+ +
+ +{% hint style="info" %} +You can change the refresh rate at any time. +{% endhint %} diff --git a/user/docker/containers/view.md b/user/docker/containers/view.md new file mode 100644 index 00000000..75026897 --- /dev/null +++ b/user/docker/containers/view.md @@ -0,0 +1,17 @@ +# View a container's details + +From the menu select **Containers**, then select the container you want to view. + +
+ +Here you can view the container's status and details, including port configurations, environment variables, labels, attached volumes and networks, and more. You also have a number of actions available, including starting, stopping and removing the container. + +
+ +You can also toggle the container [webhook](webhooks.md), view the [container logs](logs.md), [inspect](inspect.md) the container's configuration, view container [stats](stats.md), access the [console](console.md), and (if the container is running in interactive mode) attach to the running container. + +
+ +You can create an image from a deployed container to use when creating other containers. + +
diff --git a/user/docker/containers/webhooks.md b/user/docker/containers/webhooks.md new file mode 100644 index 00000000..9e5c134f --- /dev/null +++ b/user/docker/containers/webhooks.md @@ -0,0 +1,41 @@ +# Webhooks + +A webhook is a POST request sent to a URL that you define in Docker Hub or another registry. Use webhooks to trigger an action in response to an event such as a repository push. + +{% hint style="info" %} +This functionality is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=container-webhook). +{% endhint %} + +{% hint style="info" %} +Webhooks are only available on non-Edge environments (environments running Portainer Server or Portainer Agent, not the Portainer Edge Agent). This is because the tunnel to the Portainer Edge Agent is only opened on-demand, and therefore would mean there is no way to expose a webhook permanently. +{% endhint %} + +## Enabling a container webhook + +From the menu select **Containers** then select the container that you want to configure the webhook for. + +
+ +In the **Container details** screen toggle the **Container webhook** option on. When the URL appears, click **Copy link**. This URL will be used to configure the webhook in your chosen registry. + +
+ +This example shows how to trigger the webhook using `redeploy`: + +``` +
+ Redeploy with latest image of same tag +
+``` + +This example shows how to trigger the webhook to update the container to use a different image tag: + +``` +
+ Update container image with different tag +
+``` + +## Configuring the webhook in Docker Hub + +To finish the configuration, refer to [Docker's own documentation](https://docs.docker.com/docker-hub/webhooks/). diff --git a/user/docker/dashboard.md b/user/docker/dashboard.md new file mode 100644 index 00000000..0247c935 --- /dev/null +++ b/user/docker/dashboard.md @@ -0,0 +1,30 @@ +# Dashboard + +The Docker/Swarm dashboard summarizes your Docker Standalone or Docker Swarm environment and shows the components that make up the environment. + +## Environment info + +{% hint style="info" %} +This section is visible only to Docker Standalone environments. +{% endhint %} + +This section shows the environment name, its URL and port along with any [tags](../../admin/environments/tags.md#tagging-an-environment). You can also see the number of CPU cores (and their available memory), the Docker version, and whether or not the Portainer Agent is installed. + +
+ +## Cluster information + +{% hint style="info" %} +This section is visible only to Docker Swarm environments. +{% endhint %} + +This section shows how many nodes are in the cluster and a link to the [cluster visualizer](swarm/cluster-visualizer.md). + +
+ +## Summary tiles + +The remaining dashboard is made up of tiles showing the number of [stacks](stacks/), [services](services/) (for Docker Swarm), [containers](containers/) (including health and running-status metrics), [images](images/) (and how much disk space they consume), [volumes](volumes/) and [networks](networks/), and GPUs. + +
+ diff --git a/user/docker/events.md b/user/docker/events.md new file mode 100644 index 00000000..e24a45d9 --- /dev/null +++ b/user/docker/events.md @@ -0,0 +1,10 @@ +# Events + +{% hint style="info" %} +The **Events** menu is only available to Docker Standalone environments. +{% endhint %} + +The **Events** section in Portainer lists container events that have occurred. You can filter the list using search, and you can also [view more information about each container](containers/inspect.md). + +
+ diff --git a/user/docker/host/README.md b/user/docker/host/README.md new file mode 100644 index 00000000..05ef0a05 --- /dev/null +++ b/user/docker/host/README.md @@ -0,0 +1,33 @@ +# Host + +{% hint style="info" %} +The **Host** menu is only available to Docker Standalone environments. +{% endhint %} + +The **Host** section provides an overview of your environment. You can view information about your environment as well as configure environment-specific settings. + +{% content-ref url="setup.md" %} +[setup.md](setup.md) +{% endcontent-ref %} + +## Host Details + +This section describes the host's basic configuration, including the hostname, OS information, kernel version, total CPU and memory. If the environment has the Portainer Agent installed, [host management features](setup.md#enable-host-management-features) are enabled, and a `/host` mount has been configured, you can also browse the host file system from here. + +
+ +## Engine Details + +Learn more about the Docker engine running on your environment, including the Docker version, the root directory, storage and logging drivers and available volume and network plugins. + +
+ +## PCI Devices and Physical Disks + +These sections list the available PCI devices and physical disks on the host. + +{% hint style="info" %} +These sections are only visible when [host management features](setup.md#enable-host-management-features) are enabled for the environment. +{% endhint %} + +
diff --git a/user/docker/host/registries.md b/user/docker/host/registries.md new file mode 100644 index 00000000..c00d1c24 --- /dev/null +++ b/user/docker/host/registries.md @@ -0,0 +1,27 @@ +# Registries + +**Registries** lets you manage access to each of the registries that are currently available. + +{% hint style="warning" %} +Registry access assigned here only applies to the selected environment. It is not global. +{% endhint %} + +## Adding a new registry + +From the menu select **Host**, select **Registries** then click **Add registry**. When the global registries page appears, follow [these instructions](../../../admin/registries/add/). + +
+ +## Managing access + +To configure access to a registry, from the menu select **Host** then select **Registries**. + +
+ +Find the registry you want to manage then select **Manage access**. + +
+ +From the dropdown, select the users or teams that you would like to have access, then click **Create access**. + +
diff --git a/user/docker/host/setup.md b/user/docker/host/setup.md new file mode 100644 index 00000000..062e2404 --- /dev/null +++ b/user/docker/host/setup.md @@ -0,0 +1,71 @@ +# Setup + +{% hint style="info" %} +The **Setup** section is only available to Docker Standalone environments. +{% endhint %} + +Under **Setup**, you can make changes to your environment, enabling and disabling features and security settings. + +## Host and Filesystem + +For environments running the Portainer Agent, this section is where you configure how Portainer interacts with elements of the host. + +{% hint style="danger" %} +For security, these features are disabled by default. Be sure that you understand their impact before enabling them. +{% endhint %} + +
+ +### Enable host management features + +Enabling host management features allows you to see the available devices and storage on the physical node as well as browse the node's filesystem. The environment must be [running the Portainer Agent](../../../start/install/agent/docker/) to use this functionality, and for filesystem browsing, the root of the host must be bind-mounted to`/host`in the agent deployment: + +``` +-v /:/host +``` + +For example, starting the Portainer Agent on Linux with the host filesystem mounted at `/host`: + +``` +docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes -v /:/host portainer/agent:latest +``` + +### Enable volume management for non-administrators + +Enabling this feature allows non-administrator users to manage volumes on an environment. If this is disabled, users below administrator level have read-only access to volumes. + +## Change Window Settings + +This setting allows you to specify a window within which [automatic updates](../stacks/add.md#automatic-updates) to your applications can be applied. + +{% hint style="warning" %} +If this setting is enabled and an update is made to an application outside of this window, it will not be applied. +{% endhint %} + +
+ +## Docker Security Settings + +This section allows you to toggle assorted Docker-related security settings for the environment. + +
+ +| Option | Overview | +| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Disable bind mounts for non-administrators | Prevents non-admin users within Portainer from using bind mounts when creating containers and/or services/stacks. When toggled on, the option to attach to a host file system path is removed. | +| Disable privileged mode for non-administrators | Prevents non-admin users from elevating the privilege of a container to bypass SELinux/AppArmor. When toggled on, the option to select **Privileged** mode when [adding a container](../containers/add.md) is removed. | +| Disable the use of host PID 1 for non-administrators | Prevents non-admin users from requesting that a deployed container operates as the host PID. This is a security risk if used by a non-trustworthy authorized user because when they operate as PID1, they are in effect able to run any command in the container console as root on the host. | +| Disable the use of Stacks for non-administrators | This is a 'sledgehammer' approach to removing any possibility for non-admin users within Portainer to find and use weaknesses in the Docker architecture. Whilst Portainer has the ability to disable some of the more common exploits, we cannot possibly block them all because there are any number of capabilities that could be added to a container to attempt to gain access to the host. This feature simply allows an admin to disable all possible entry points. | +| Disable device mappings for non-administrators | Blocks users from mapping host devices into containers. Whilst the ability to map devices is generally used for good (e.g. mapping a GPU into a container), it can equally be used by non-trustworthy authorized users to map a physical storage device into a container. It is possible to mount `/dev/sda1` into a container, and then from a console of that container, the user would have complete access to the sda1 device without restriction. By toggling this on, Portainer blocks the ability for non-admins to map ANY devices into containers. | +| Disable container capabilities for non-administrators | Toggle on to hide the **Container capabilities** tab for non-administrators when they are [adding a container](../containers/add.md). | +| Disable sysctl settings for non-administrators | Toggle on to stop non-admin users from using sysctl options, preventing them from recreating, duplicating or editing containers. | + +## Other + +This section contains other assorted environment-specific settings. + +
+ +| Option | Overview | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Show a notification to indicate out-of-date images for Docker environments | Toggle on to enable the [new image notification](../containers/) feature for this environment. Toggle off to disable the feature. | diff --git a/user/docker/images/README.md b/user/docker/images/README.md new file mode 100644 index 00000000..27870657 --- /dev/null +++ b/user/docker/images/README.md @@ -0,0 +1,26 @@ +# Images + +Images are what is used to build containers. Each image defines the pieces required to build and configure a container and can be reused many times. The **Images** section in Portainer lets you interact with the images in an environment. + +
+ +You can pull images from Docker Hub or any other [registry](../../../admin/registries/add/): + +{% content-ref url="pull.md" %} +[pull.md](pull.md) +{% endcontent-ref %} + +You can also view a list of the images that are currently available in an environment, including their IDs, usage states, tags, sizes and creation dates. There are many other options available: + +{% content-ref url="build.md" %} +[build.md](build.md) +{% endcontent-ref %} + +{% content-ref url="import.md" %} +[import.md](import.md) +{% endcontent-ref %} + +{% content-ref url="export.md" %} +[export.md](export.md) +{% endcontent-ref %} + diff --git a/user/docker/images/build.md b/user/docker/images/build.md new file mode 100644 index 00000000..36b9eaea --- /dev/null +++ b/user/docker/images/build.md @@ -0,0 +1,71 @@ +# Build a new image + +There are three ways you can build new images. + +{% hint style="info" %} +On a multi-node environment, the built image will only be available on the node you select in the **Deployment** section. To make the image available to all nodes, consider [adding a registry](../../../admin/registries/add/) to Portainer. +{% endhint %} + +{% hint style="warning" %} +When building an image with Portainer, you are unable to use `ADD` or `COPY` commands referencing files on the host. We recommend using `wget` or similar to retrieve files from a HTTP/S URL instead. +{% endhint %} + +## Method 1: Using the Portainer web editor + +From the menu select **Images** then click **Build a new image**. + +
+ +Next, give the image a descriptive name (you can enter multiple names), select the **Web editor** option under **Build method**, then write your Dockerfile in the web editor. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +Optionally, you can upload one or more local files to be included in an image by clicking **Select files** and selecting the files to include. You can then reference them in your Dockerfile. + +
+ +Select the node you want to save the image on (if on a multi-node environment) then click **Build the image**. + +
+ +When the build is finished, select the **Output** tab to view the build history and the result. + +## Method 2: Uploading a Dockerfile + +If you have an existing Dockerfile, you can upload it to Portainer and use it to build the image. + +From the menu select **Images** then click **Build a new image**. + +
+ +Next, give the image a descriptive name (you can enter multiple names), select the **Upload** option under **Build method**, then browse to and upload the Dockerfile. + +
+ +Scroll down and select the node you want to save the image on (if on a multi-node environment) then click **Build the image**. + +
+ +When the build is finished, select the **Output** tab to view the build history and the result. + +## Method 3: Providing a Dockerfile from a URL + +If the Dockerfile is hosted on the Internet (either in a tarball or a public GitHub repository), you can download it directly to Portainer via its URL. + +From the menu select **Images** then click **Build a new image**. + +
+ +Next, give the image a descriptive name (you can enter multiple names), select the **Upload** option under **Build method**, then enter the **URL** of the file and the **Dockerfile path** within the tarball or repository. + +
+ +Scroll down and select the node you want to save the image on (if on a multi-node environment) click **Build the image**. + +
+ +When the build is finished, select the **Output** tab to view the build history and the result. diff --git a/user/docker/images/export.md b/user/docker/images/export.md new file mode 100644 index 00000000..6aa0098f --- /dev/null +++ b/user/docker/images/export.md @@ -0,0 +1,17 @@ +# Export an image + +You can export any Docker image stored on any node. This is useful when you need to move a container from one host to another, or simply make a backup of the images. + +{% hint style="warning" %} +If you export a container to a tar file, the volumes won't get exported with it. You will need to save the data from those volumes using a different method. +{% endhint %} + +From the menu select **Images**, select the image you want to export then click **Export this image**. + +
+ +When the warning message appears, click **Continue**. + +
+ +When the image has downloaded, a success message will appear, and your browser should automatically download the resulting tar file.\ diff --git a/user/docker/images/import.md b/user/docker/images/import.md new file mode 100644 index 00000000..706d5cad --- /dev/null +++ b/user/docker/images/import.md @@ -0,0 +1,30 @@ +# Import an image + +You can import images from other Portainer instances, the Docker CLI or the Docker Swarm CLI. + +From the menu select **Images** then click **Import**. + +
+ +Click **Select file** to browse for the image file to upload. Portainer supports `.tar`, `.tar.gz`, `.tar.bz2` and `.tar.xz` files. If you are on a multi-node environment, select the node where you wish to save the image. + +{% hint style="info" %} +On a multi-node environment, the image you import will only be available on the node selected under **Deployment**. If you want to make the image available to all nodes, consider [adding a registry](../../../admin/registries/add/) to Portainer. +{% endhint %} + +
+ +When importing an image you can also select to tag the image using a registry you have preconfigured in Portainer. Select the **Registry** from the dropdown and enter the image name and tag. + +
+ +If you wish to tag the image with a registry that is not configured within Portainer, click **Advanced mode** and enter the registry, port, image and tag as required. + +{% hint style="info" %} +If you want to tag the image locally rather than in a registry, use **Advanced mode** and simply specify the image name and tag, without a registry. +{% endhint %} + +
+ +When you're ready, click **Upload** to import your image. + diff --git a/user/docker/images/pull.md b/user/docker/images/pull.md new file mode 100644 index 00000000..402396f7 --- /dev/null +++ b/user/docker/images/pull.md @@ -0,0 +1,27 @@ +# Pull an image + +You can pull images from any registry that has been [added to Portainer](../../../admin/registries/), or using advanced mode, from a custom external registry. + +{% hint style="info" %} +On a multi-node environment, the pulled image will only be available on the node you select in the **Deployment** section. To make the image available to all nodes, consider [adding a registry](../../../admin/registries/add/) to Portainer. +{% endhint %} + +## Method 1: Pulling images in simple mode + +This method lets you pull images from Docker Hub or from another registry that you have connected with before. + +From the menu select **Images**. Select the registry to use then enter the name of the image. On a multi-node environment, select the node to deploy to. + +
+ +When you're ready, click **Pull the image**. + +## Method 2: Pulling images in advanced mode + +Using advanced mode, you can define a custom registry URL, port and image. This is ideal if you run your own private registry but don't want to add it to the [registries](../../../admin/registries/) list in Portainer. + +From the menu select **Images** then select **Advanced mode**. Next, enter the registry, port and image in the **Image** box. On a multi-node environment, select the node to deploy to. + +
+ +When you're ready, click **Pull the image**. diff --git a/user/docker/networks/README.md b/user/docker/networks/README.md new file mode 100644 index 00000000..967d4e06 --- /dev/null +++ b/user/docker/networks/README.md @@ -0,0 +1,33 @@ +# Networks + +Portainer lets you add, remove and manage networks in your environment. + +
+ +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + +## Supported network types + +Portainer supports these types of networks: + +### bridge + +If you don’t specify a driver, this type of network will be created by default. Bridge networks are normally used when your applications run in standalone containers that need to communicate with each other. + +### macvlan + +macvlan networks allow you to assign a MAC address to a container, making it appear as a physical device on your network. The Docker daemon routes traffic to containers based on their MAC addresses. Using the macvlan driver is sometimes the best choice when dealing with legacy applications that expect to be directly connected to the physical network, rather than routed through the Docker host’s network stack. + +### ipvlan + +Similar to macvlan, the key difference being that the endpoints have the same MAC address. ipvlan supports L2 and L3 modes. In ipvlan L2 mode, each endpoint gets the same MAC address but different IP addresses. In ipvlan L3 mode, packets are routed between endpoints, giving better scalability. + +### overlay + +overlay networks connect multiple Docker daemons together and enable swarm services to communicate with each other. You can also use overlay networks to facilitate communication between a swarm service and a standalone container, or between two standalone containers on different Docker daemons. diff --git a/user/docker/networks/add.md b/user/docker/networks/add.md new file mode 100644 index 00000000..3411975f --- /dev/null +++ b/user/docker/networks/add.md @@ -0,0 +1,25 @@ +# Add a new network + +From the menu select **Networks** then click **Add network**. + +
+ +Define the new network, using the table below as a guide. + +| Field/Option | Overview | +| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the network a descriptive name. | +| Driver | Define the [type of network](./#supported-network-types) you will use. | +| Driver options | Set in place any options related to your network driver, if required. | +| IPv4 Network configuration | Define IPv4 range, subnet, gateway and exclude IP. If no information is entered here, Docker will automatically assign an IPv4 range. | +| IPv6 Network configuration | Define IPv6 range, subnet, gateway and exclude IP. If no information is entered here, Docker will automatically assign an IPv6 range. | +| Labels | Add labels to the network. | +| Isolated network | Toggle this option on to isolate any containers created in this network to this network only, with no inbound or outbound connectivity. | +| Enable manual container attachment | Toggle this option on to allow users to attach the network to running containers. | +| Deployment | On multi-node clusters, select the node where the network will be created. | + +
+ +
+ +When you're finished, click **Create the network**. diff --git a/user/docker/networks/remove.md b/user/docker/networks/remove.md new file mode 100644 index 00000000..5118c53d --- /dev/null +++ b/user/docker/networks/remove.md @@ -0,0 +1,9 @@ +# Remove a network + +{% hint style="warning" %} +You must detach all containers from a network before you can remove it. +{% endhint %} + +From the menu select **Networks**, tick the checkbox next to the network you want to remove then click **Remove**. + +
diff --git a/user/docker/secrets/README.md b/user/docker/secrets/README.md new file mode 100644 index 00000000..fb358ea7 --- /dev/null +++ b/user/docker/secrets/README.md @@ -0,0 +1,34 @@ +# Secrets + +{% hint style="info" %} +The Secrets menu is only available to Docker Swarm environments. +{% endhint %} + +A secret is a blob of data, such as a password, SSH private key, SSL certificate, or another piece of data that should not be transmitted over a network, stored unencrypted in a Dockerfile, or stored in your application’s source code. In Docker 1.13 and later, you can use Docker Secrets to centrally manage this data and securely transmit it only to those containers that need access to it. + +
+ +Secrets are encrypted during transit and at rest in Docker Swarm. A given secret is only accessible to those services which have been granted explicit access to it, and only while those service tasks are running. + +You can use secrets to manage any sensitive data that a container needs at runtime, but you don’t want to store in the image or in source control, such as: + +* Usernames and passwords. +* TLS certificates and keys. +* SSH keys. +* Other important data such as the name of a database or internal server. +* Generic strings or binary content (up to 500Kb in size). + +For less sensitive data or larger content, see [configs](../configs/). + +In Portainer you can add and remove secrets for use in deployments. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + + + diff --git a/user/docker/secrets/add.md b/user/docker/secrets/add.md new file mode 100644 index 00000000..63972c7f --- /dev/null +++ b/user/docker/secrets/add.md @@ -0,0 +1,11 @@ +# Add a new secret + +From the menu select **Secrets** then click **Add secret**. + +
+ +Next, give the secret a descriptive name and write a definition of the secret in the **Secret** field. Toggle **Encode secret** on if you want to encode the secret (useful when you use a plain-text password). + +
+ + When you're finished, click **Create the secret**. diff --git a/user/docker/secrets/remove.md b/user/docker/secrets/remove.md new file mode 100644 index 00000000..800d414a --- /dev/null +++ b/user/docker/secrets/remove.md @@ -0,0 +1,5 @@ +# Remove a secret + +From the menu select **Secrets**, tick the checkbox next to the secret you want remove then click **Remove**. + +
diff --git a/user/docker/services/README.md b/user/docker/services/README.md new file mode 100644 index 00000000..d75c9a78 --- /dev/null +++ b/user/docker/services/README.md @@ -0,0 +1,48 @@ +# Services + +{% hint style="info" %} +The **Services** menu is only available to Docker Swarm endpoints. +{% endhint %} + +A service consists of an image definition and container configuration as well as instructions on how those containers will be deployed across a Swarm cluster. + +
+ +When the [new image notification](../swarm/setup.md#other) feature is enabled, the circle next to the image name indicates whether the local image is up to date, with a green circle indicating it is up to date and a red circle indicating that there is a newer version of the image available at the remote registry. A grey circle indicates Portainer was unable to determine whether there is an update available for the image. + +For more on how this works, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-does-the-image-update-notification-icon-work). + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="configure.md" %} +[configure.md](configure.md) +{% endcontent-ref %} + +Once a service has been created you can scale it to meet your needs, as well as view individual task status and logs. + +{% content-ref url="scale.md" %} +[scale.md](scale.md) +{% endcontent-ref %} + +{% content-ref url="tasks.md" %} +[tasks.md](tasks.md) +{% endcontent-ref %} + +{% content-ref url="logs.md" %} +[logs.md](logs.md) +{% endcontent-ref %} + +If you need to undo some changes to a service, you can roll it back. + +{% content-ref url="rollback.md" %} +[rollback.md](rollback.md) +{% endcontent-ref %} + +You can also configure webhooks for your services. + +{% content-ref url="webhooks.md" %} +[webhooks.md](webhooks.md) +{% endcontent-ref %} + diff --git a/user/docker/services/add.md b/user/docker/services/add.md new file mode 100644 index 00000000..91ae5de6 --- /dev/null +++ b/user/docker/services/add.md @@ -0,0 +1,23 @@ +# Add a new service + +From the menu click **Services** then click **Add service**. + +
+ +Complete the fields, using the table below as a guide. + +| Field/Option | Overview | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Name | Give the service a descriptive name. | +| Registry | Select the registry that contains the image you wish to use for the service. | +| Image | Enter the name of the image. If you're using Docker Hub you can also search for images from here. | +| Scheduling mode | Select either to replicate the service on the same host or deploy it globally with one container on each host. | +| Replicas | Set the number of replicas (only if the scheduling mode is set to **Replicated**). | +| Port mapping | Define the ports to expose on the new service. | +| Create a service webhook | Toggle on to create a [webhook](webhooks.md) for the service. You can send a POST request to this endpoint to automate pulling the most up-to-date image and re-deploy your service. | + +
+ +You can also configure any advanced options for the service in the bottom section. + +When you're finished click **Create the service**. diff --git a/user/docker/services/configure.md b/user/docker/services/configure.md new file mode 100644 index 00000000..1b1427f5 --- /dev/null +++ b/user/docker/services/configure.md @@ -0,0 +1,137 @@ +# Configure service options + +From the menu select **Services** then select the service you want to configure. + +
+ +## Service details + +In this section you can: + +* View a summary of the details about the service. +* Configure the number of replicas. +* Toggle the [service webhook](webhooks.md) on or off. +* View the [service logs](logs.md). +* Update, [roll back](rollback.md) or delete the service. + +
+ +## Container specification configuration options + +### Change container image + +Here you can replace the container image with a different image. Select the registry, enter the image name, then click **Apply changes**. + +
+ +### Environment variables + +It's best to set environment variables when you [create a container](../containers/add.md) and before deployment. You can still set or edit these variables after deployment if you wish. + +
+ +### Container labels + +Labels give you a way to record information about a container, such as the way it's configured. Labels can also be used by Portainer to [hide containers from the interface](../../../admin/settings/#hidden-containers). + +
+ +### Mounts + +You have the option to either mount or bind volumes in Portainer, and you can also make them read only. To add a mount, first select either **Volume** or **Bind** from the **Type** dropdown. + +#### For volume mounts: + +Select the volume from the **Source** dropdown, enter the container path in the **Target** field tick **Read only** if required then click **Apply changes**. + +
+ +#### For bind mounts: + +Enter the source path in the **Source** field, enter the container path in the **Target** field, tick **Read only** if required then click **Apply changes**. + +
+ +## Networks & ports configuration options + +### Networks + +You can define one or more networks for a service either before or after deployment. Simply select the network from the dropdown then click **Apply changes**. + +
+ +### Published ports + +Use this setting to publish ports so they can access a container from outside of the host. You can either add new ports or update existing ports. + +
+ +### Hosts file entries + +Lets you manually specify a hostname or URL and associate the URL to an internal or external IP address. + +
+ +## Service specification settings + +### Resource limits and reservations + +Sets limits on resource utilization, such as memory, CPU reservation and CPU limit. + +
+ +### Placement constraints + +Use placement constraints to control which nodes a service can be assigned to. + +
+ +### Placement preferences + +While placement constraints limit the nodes a service can run on, placement preferences attempt to place tasks on appropriate nodes in an algorithmic way (by default they are spread evenly). + +
+ +### Restart policy + +Docker's restart policies ensure that linked containers are restarted in the correct order, and control the conditions under which they are restarted: + +* **Any**: Restart the container under any conditions (restarted host or Docker daemon). +* **On Failure**: Restart the container if it exits due to an error which manifests as a non-zero exit code. +* **None**: Do not automatically restart the container. + +You can also adjust the restart delay, maximum attempts and restart window. + +
+ +### Update configuration + +Updates a service according to the parameters you specify. The parameters specified here are the same as `docker service create` (see [Docker's own documentation](https://docs.docker.com/engine/reference/commandline/service\_create/) for more information). + +Normally, updating a service will only cause the service’s tasks to be replaced with new ones if a change to the service requires recreating the tasks for it to take effect. + +
+ +### Logging driver + +Docker includes logging mechanisms called _logging drivers_ that get information from the containers and services you're running. Each Docker daemon has a default logging driver which each container will use, unless you configure them to use a different logging driver. + +
+ +### Service labels + +Lets you add metadata to containers using Docker labels either via an array or a dictionary. We recommend that you use reverse-DNS notation to stop labels from conflicting with those used by other software. + +
+ +### Configs + +Docker 17.06 introduced Swarm service configs. These allow you to store non-sensitive information such as configuration files outside a service’s image or running containers. This keeps images as generic as possible and removes the need to bind-mount configuration files into containers or use environment variables. + +
+ +### Secrets + +In the context of Docker Swarm services, a secret is a blob of data such as a password, SSH private key, SSL certificate, or another piece of data that should not be transmitted over a network or stored unencrypted in a Dockerfile or in your application’s source code. + +
diff --git a/user/docker/services/logs.md b/user/docker/services/logs.md new file mode 100644 index 00000000..ec1da582 --- /dev/null +++ b/user/docker/services/logs.md @@ -0,0 +1,30 @@ +# View service logs + +From the menu select **Services**, select the service whose logs you want to view then click **Service logs**. + +
+ +Here you can see the contents of the Docker logs for your service. + +| Field/Option | Overview | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Search | Enter a string to search the log output. You can see the number of results for your search and move through each result with the up and down arrows. | +| Filter search results | When enabled, display only the log lines that contain your search string. | +| Copy | Click this button to copy the currently displayed log lines to your clipboard. | +| Download logs | Click this button to download your log. | + +
+ +You can also set various options for how the logs are displayed: + +| Field/Option | Overview | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Auto-refresh | Toggle this option off to disable auto refreshing of the log view. When off, you can click the refresh icon to the right of the toggle to manually refresh the view. | +| Fetch | Select the time period from which to retrieve the logs. | +| Lines | Limit the number of lines per log file (the default is 1000). | +| Show timestamp | When enabled, display a timestamp before each log line. | +| Show line numbers | When enabled, display line numbers for each log line. | +| Wrap line | When enabled, lines longer than the screen width will be wrapped onto the next line. | +| Full screen | Click the full screen icon to expand the log display to fill your screen. | + +
diff --git a/user/docker/services/rollback.md b/user/docker/services/rollback.md new file mode 100644 index 00000000..85507973 --- /dev/null +++ b/user/docker/services/rollback.md @@ -0,0 +1,11 @@ +# Roll back a service + +If you make a change to a service in Docker Swarm and your applications are no longer working as you expect, you can roll back to the previous state. + +From the menu select **Services**, select the service to roll back then click **Rollback the service**. + +
+ +When the confirmation message appears, click **Yes**. + +
diff --git a/user/docker/services/scale.md b/user/docker/services/scale.md new file mode 100644 index 00000000..a225d3fe --- /dev/null +++ b/user/docker/services/scale.md @@ -0,0 +1,11 @@ +# Scale a service + +From the menu select **Services** then select **scale** next to the service you want to scale (in the **Scheduling Mode** column). + +
+ +Select the number of replicas you want to create for the service then click the tick icon to apply. If scaling is successful, a success message will appear at the top-right of the screen. Refresh the page until the running replicas appear. + +{% hint style="info" %} +Depending on container size, there might be a slight delay before the replicas appear on screen. +{% endhint %} diff --git a/user/docker/services/tasks.md b/user/docker/services/tasks.md new file mode 100644 index 00000000..4976e8b9 --- /dev/null +++ b/user/docker/services/tasks.md @@ -0,0 +1,11 @@ +# View the status of a service task + +Services in a Docker Swarm environment are a collection of tasks (or individual containers). This article explains how to quickly see the status of the containers that make up each service. + +From the menu select **Services** then click the down-arrow to the left of the service you want to inspect. The tasks that make up the service will be shown. + +
+ +Select any individual task to go to the container details page for that task. You can also perform various actions on individual tasks by using the icons in the **Actions** column. + +
diff --git a/user/docker/services/webhooks.md b/user/docker/services/webhooks.md new file mode 100644 index 00000000..8a61f3f3 --- /dev/null +++ b/user/docker/services/webhooks.md @@ -0,0 +1,59 @@ +# Webhooks + +A webhook is a POST request sent to a URL that you define in Docker Hub or another registry. Use webhooks to trigger an action or a service in response to a repository push event. + +{% hint style="info" %} +Webhooks are only available on non-Edge environments (environments running Portainer Server or Portainer Agent, not the Portainer Edge Agent). This is because the tunnel to the Portainer Edge Agent is only opened on-demand, and therefore would mean there is no way to expose a webhook permanently. +{% endhint %} + +## Enabling a service webhook + +From the menu select **Services** then select the service that you want to configure the webhook for. + +
+ +In the **Service details** screen toggle the **Service webhook** option on. When the URL appears, click **Copy link**. This URL will be used to configure the webhook in your chosen registry. + +
+ +This example shows how to trigger the webhook using `redeploy`: + +``` +
+ Redeploy with latest image of same tag +
+``` + +This example shows how to trigger the webhook using `update service image with a different tag`: + +``` +
+ Update Service image with different tag +
+``` + +## Using environment variables with webhooks + +When triggering a webhook, environment variables can be passed through the endpoint and referenced within services' compose files. + +{% hint style="info" %} +This functionality is only available in Portainer Business Edition. +{% endhint %} + +To specify an environment variable on a webhook, add it as a variable to the URL. For example, to pass a `SERVICE_TAG` variable with the value `development`: + +``` +https://portainer:9443/api/webhooks/1d251d96-fb34-4172-a0a1-d0655467b897?SERVICE_TAG=development +``` + +To reference the `SERVICE_TAG` variable in your compose file with a fallback to the value `stable`: + +``` +services: + my-service: + image: repository/image:${SERVICE_TAG:-stable} +``` + +## Configuring the webhook in Docker Hub + +To finish the configuration, refer to [Docker's own documentation](https://docs.docker.com/docker-hub/webhooks/). diff --git a/user/docker/stacks/README.md b/user/docker/stacks/README.md new file mode 100644 index 00000000..42e45902 --- /dev/null +++ b/user/docker/stacks/README.md @@ -0,0 +1,33 @@ +# Stacks + +A stack is a collection of services, usually related to one application or usage. For example, a WordPress stack definition may include a web server container (such as nginx) and a database container (such as MySQL). + +
+ +When the [new image notification](../host/setup.md#other) feature is enabled, the **Images up to date** column indicates whether the local images in the stack are up to date, with a green circle indicating they are up to date and a red circle indicating that there is a newer version of an image available at the remote registry. A grey circle indicates Portainer was unable to determine whether there is an update available for the images. + +For more on how this works, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-does-the-image-update-notification-icon-work). + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="edit.md" %} +[edit.md](edit.md) +{% endcontent-ref %} + +{% content-ref url="template.md" %} +[template.md](template.md) +{% endcontent-ref %} + +{% content-ref url="webhooks.md" %} +[webhooks.md](webhooks.md) +{% endcontent-ref %} + +{% content-ref url="migrate.md" %} +[migrate.md](migrate.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} diff --git a/user/docker/stacks/add.md b/user/docker/stacks/add.md new file mode 100644 index 00000000..0bc6a1da --- /dev/null +++ b/user/docker/stacks/add.md @@ -0,0 +1,199 @@ +# Add a new stack + +## Options when deploying a new stack + +There are four ways to deploy a new stack from Portainer: + +| Option | Overview | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | +| [Web editor](add.md#option-1-web-editor) | Use our web editor to define the services for the stack using a docker-compose format. | +| [Upload](add.md#option-2-upload) | If you have a `stack.yml` file, you can upload it from your computer and use it to deploy the stack. | +| [Git repository](add.md#option-3-git-repository) | You can use a docker-compose format file hosted in a Git repository. | +| Custom template | If you have created a [custom stack template](../templates/custom.md), you can deploy using this option. | + +## Option 1: Web editor + +From the menu select **Stacks**, click **Add stack**, give the stack a descriptive name then select **Web editor**. Use the web editor to define the services. + +
+ +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +As part of the stack creation you can enable a stack webhook, allowing you to remotely trigger redeployments of the stack from your repository, for example. You can read more on this in our documentation on [stack webhooks](webhooks.md). + +
+ +As an optional step, you can also use the web editor to define environment variables. You can use these to define values in your compose file that would vary between deployments (for example, hostnames, database names, etc). + +Environment variables can be set individually within Portainer or you can use **Load variables from .env file** to upload a file containing your environment variables. Environment variables you define (either individually or via a .env file) will be available to use in your compose file using an `environment` definition: + +``` +environment: + MY_ENVIRONMENT_VARIABLE: ${MY_ENVIRONMENT_VARIABLE} +``` + +Alternatively, on Docker Standalone environments you can add `stack.env` as an `env_file` definition to add all the environment variables that you have defined individually as well as those included in an uploaded .env file: + +``` +env_file: + - stack.env +``` + +**Note:** Using `env_file` to define a file does not work in Docker Swarm due to the lack of `env_file` support in `docker stack deploy` (used on Swarm environments to deploy your stack). On Docker Swarm, you will need to define each environment variable manually. + +{% hint style="info" %} +Note the compose file is not changed when environment variables are used - this allows variables to be updated within Portainer without editing the compose file itself. You will still see the `${MY_ENVIRONMENT_VARIABLE}` style entry in the compose file. +{% endhint %} + +
+ +When you're ready, click **Deploy the stack**. + +## Option 2: Upload + +In Portainer you can create stacks from Compose YML files. To do this, from the menu select **Stacks**, click **Add stack**, then give the stack a descriptive name. + +
+ +Select **Upload** then select the Compose file from your computer. + +As part of the stack creation you can enable a stack webhook, allowing you to remotely trigger redeployments of the stack from your repository, for example. You can read more on this in our documentation on [stack webhooks](webhooks.md). + +
+ +As an optional step, enter any environment variables. You can use these to define values in your compose file that would vary between deployments (for example, hostnames, database names, etc). + +Environment variables can be set individually within Portainer or you can use **Load variables from .env file** to upload a file containing your environment variables. Environment variables you define (either individually or via a .env file) will be available to use in your compose file using an `environment` definition: + +``` +environment: + MY_ENVIRONMENT_VARIABLE: ${MY_ENVIRONMENT_VARIABLE} +``` + +Alternatively, you can add `stack.env` as an `env_file` definition to add all the environment variables that you have defined individually as well as those included in an uploaded .env file: + +``` +env_file: + - stack.env +``` + +{% hint style="info" %} +Note the compose file is not changed when environment variables are used - this allows variables to be updated within Portainer without editing the compose file itself which would take it out of sync with your local copy. You will still see the `${MY_ENVIRONMENT_VARIABLE}` style entry in the compose file. +{% endhint %} + +
+ +When you're ready click **Deploy the stack**. + +## Option 3: Git repository + +If your Compose file is hosted in a Git repository, you can deploy from there. From the menu select **Stacks**, click **Add stack**, then give the stack a descriptive name. + +
+ +Select **Git Repository** then enter information about your Git repo. + +{% hint style="info" %} +Any Git-compatible repository should work here. Substitute the details as required. +{% endhint %} + +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Authentication | Toggle this on if your Git repository requires authentication. | +| Git Credentials | If the **Authentication** toggle is enabled and you have [configured Git credentials](../../account-settings.md#git-credentials), you can select them from this dropdown. | +| Username | Enter your Git username. | +| Personal Access Token | Enter your personal access token or password. | +| Save credential | Check this option to save the credentials entered above for future use under the name provided in the **credential name** field. | + +{% hint style="info" %} +If you have 2FA configured in GitHub, your passcode is your password. +{% endhint %} + +
+ +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Repository URL | Enter the repository URL. If you have enabled Authentication above the credentials will be used to access the repository. The below options will be populated by what is found in the repository. | +| Repository reference | Select the reference to use when deploying the stack (for example, the branch). | +| Compose path | Enter the path to the Compose file from the root of the repository. | +| Additional paths | Click **add file** to add additional files to be parsed by the build (for example, an environment-specific compose file). | + +
+ +### Automatic updates + +Portainer supports automatically updating your stacks deployed from Git repositories. To enable this, toggle on **Automatic updates** and configure your settings. + +{% hint style="info" %} +For more detail on how automatic updates function under the hood, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-do-automatic-updates-for-stacks-applications-work). +{% endhint %} + +| Field/Option | Overview | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Mechanism | Select the method to use when checking for updates: | +| |

Polling: Periodically poll the Git repository from Portainer to check for updates to the repository.

Webhook: Generate a webhook URL to add to your Git repository to trigger the update on demand (for example via GitHub actions).

| +| Fetch interval | If **Polling** is selected, how often Portainer will check the Git repository for updates. | +| Webhook | When **Webhook** is selected, displays the webhook URL to use in your integration. Click **Copy link** to copy the webhook URL to the clipboard. | + +

Automatic updates when using polling

+ +

Automatic updates when using webhooks

+ +| Field/Option | Overview | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Re-pull image |

Enable this setting to always pull the most recent version of container images when updating the stack. This is equivalent to the --pull=always flag for docker run.
This option was previously labeled as Pull latest image.

| +| Force redeployment |

Enable this setting to force the redeployment of your stack at the specified interval (or when the webhook is triggered), overwriting any changes that have been made in the local environment, even if there has been no update to the stack in Git. This is useful if you want to ensure that your Git repository is the source of truth for your stacks and are happy with the local stack being replaced.

If this option is left disabled, automatic updates will only trigger if Portainer detects a change in the remote Git repository.

| + +
+ +### Relative path volumes + +When you toggle **Enable relative path volumes** to on, you are able to specify relative path references in your compose files. Portainer will create the required directory structure and populate the directories with the relevant files from your Git repository. + +{% hint style="info" %} +This functionality is currently not available on Edge Agent environments. +{% endhint %} + +On Docker Standalone environments, specify the path at which you want your files to be created on your host filesystem in the **Local filesystem path** field. + +{% hint style="warning" %} +Ensure this directory exists on your local filesystem and is writable. +{% endhint %} + +
+ +On Docker Swarm environments, specify the path at which you want your files to be created in the Network filesystem path field. + +{% hint style="warning" %} +Ensure that this path is available on all of your Docker Swarm nodes and is writable. +{% endhint %} + +
+ +### Environment variables + +As an optional step, you can also set environment variables. You can use these to define values in your compose file that would vary between deployments (for example, hostnames, database names, etc). + +Environment variables can be set individually within Portainer or you can use **Load variables from .env file** to upload a file containing your environment variables. Environment variables you define (either individually or via a .env file) will be available to use in your compose file using an `environment` definition: + +``` +environment: + MY_ENVIRONMENT_VARIABLE: ${MY_ENVIRONMENT_VARIABLE} +``` + +Alternatively, you can add `stack.env` as an `env_file` definition to add all the environment variables that you have defined individually as well as those included in an uploaded .env file: + +``` +env_file: + - stack.env +``` + +{% hint style="info" %} +Note the compose file is not changed when environment variables are used - this allows variables to be updated within Portainer without editing the compose file itself which would take it out of sync with the Git repository. You will still see the `${MY_ENVIRONMENT_VARIABLE}` style entry in the compose file. +{% endhint %} + +
+ +Enter environment variables if required then click **Deploy the stack**. diff --git a/user/docker/stacks/edit.md b/user/docker/stacks/edit.md new file mode 100644 index 00000000..c1dc007b --- /dev/null +++ b/user/docker/stacks/edit.md @@ -0,0 +1,77 @@ +# Inspect or edit a stack + +## Inspecting a stack + +From the menu select **Stacks** then select the stack you want to inspect. + +
+ +From here you can stop, delete or [create a template from the stack](template.md), and if deployed from Git you can [detach the stack from the Git repository](edit.md#detach-from-git). + +
+ +If the stack was deployed from a Git repository, you can: + +* Configure [automatic updates](add.md#automatic-updates) or manually pull and redeploy the stack. +* View and edit the stack's environment variables. + +
+ +If the stack was deployed using the [Web Editor](add.md#option-1-web-editor) or [uploaded](add.md#option-2-upload), you will have the option to [edit your compose file manually](edit.md#editing-a-stack). + +Regardless of the deployment method used, you can also [migrate or duplicate](migrate.md) the stack. + +### Docker Standalone + +When using Docker Standalone, you can: + +* View the containers that make up the stack. +* Check to see if they are running or stopped. +* Get access to logs. +* Inspect individual containers. +* View container statistics. +* Get access to the container's console. + +
+ +### Docker Swarm + +When using Docker Swarm, you can: + +* View the services that make up the stack. +* Check to see if they are running or stopped. +* See how many replicas are running on each host. +* Get access to logs. +* Inspect individual services. +* View service statistics. +* Get access to the service's console. + +
+ +## Editing a stack + +Editing a stack allows you to make changes to the configuration and redeploy those changes. To edit a stack, from the menu select **Stacks**, select the stack you want to edit, then select the **Editor** tab. + +{% hint style="info" %} +The Editor tab is only available for stacks that were deployed using the [Web Editor](add.md#option-1-web-editor). For stacks deployed from a Git repository, the docker-compose file must be edited in the repository itself. +{% endhint %} + +
+ +Here, you can edit the Compose file for the stack to suit your needs, as well as toggle the stack [webhook](webhooks.md) and retrieve the webhook URL. You can also make changes to environment variables for the stack, and on Docker Swarm environments you can prune services if you have made changes that remove some services from the stack. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +When you have finished making changes, click **Update the stack**. + +## Detach from Git + +If your stack was created from a Git repository, you have the option to detach the stack from the repository. This means you can [edit the stack directly within Portainer](edit.md#editing-a-stack), but it does mean that the stack can't be updated from Git anymore. This action also cannot be reversed. + +{% hint style="info" %} +Detaching downloads the main compose file for the stack and stores it in Portainer. It does not download any additional compose files or `.env` files that may be contained within the repository. +{% endhint %} + +Click **Detach from Git** to detach. You will be asked to confirm the action - click **Detach** to do so. diff --git a/user/docker/stacks/migrate.md b/user/docker/stacks/migrate.md new file mode 100644 index 00000000..0fbccfa0 --- /dev/null +++ b/user/docker/stacks/migrate.md @@ -0,0 +1,28 @@ +# Migrate or duplicate a stack + +## Migrating a stack to another swarm cluster + +From the menu select **Stacks** then select the stack you want to migrate. + +
+ +In the **Stack duplication / migration** section, select the destination environment for the stack, and optionally define a new name for the stack. Click **Migrate**. + +
+ +When the confirmation message appears, click **Migrate**. + +
+ +## Duplicating a stack + +From the menu select **Stacks** then select the stack you want to duplicate. + +
+ +In the **Stack duplication / migration** section, give the new stack a descriptive name then select the environment that the stack is currently on. + +
+ +When you're ready, click **Duplicate**. + diff --git a/user/docker/stacks/remove.md b/user/docker/stacks/remove.md new file mode 100644 index 00000000..488ea36c --- /dev/null +++ b/user/docker/stacks/remove.md @@ -0,0 +1,9 @@ +# Remove a stack + +From the menu select **Stacks**, tick the checkbox next to the stack you want to remove, then click **Delete this stack**. + +
+ +When the confirmation message appears, click **Remove**. + +
diff --git a/user/docker/stacks/template.md b/user/docker/stacks/template.md new file mode 100644 index 00000000..3498ab93 --- /dev/null +++ b/user/docker/stacks/template.md @@ -0,0 +1,30 @@ +# Create a template from a deployed stack + +In Portainer you can create an [app template](../templates/) from deployed stacks. This is useful if you need to deploy the same stack several times. + +From the menu select **Stacks**, select the already-deployed stack, then click **Create template from stack**. + +
+ +Define some properties for the new template, using the table below as a guide. + +| Field/Option | Overview | +| ------------ | -------------------------------------------------------------------------------------------- | +| Title | Give the template a descriptive name. | +| Description | Enter a brief description of what your template includes. | +| Note | Note any extra information about the template (optional). | +| Icon URL | Enter the URL to an icon to be used for the template when it appears in the list (optional). | +| Platform | Select the compatible platform for the template. Options are **Linux** or **Windows**. | +| Type | Select the type of template. Options are **Standalone** or **Swarm**. | + +
+ +The **Web editor** will be pre-populated with the Compose file for your stack. Make any changes you need here. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +When you're ready, click **Create custom template**. diff --git a/user/docker/stacks/webhooks.md b/user/docker/stacks/webhooks.md new file mode 100644 index 00000000..e9ac339d --- /dev/null +++ b/user/docker/stacks/webhooks.md @@ -0,0 +1,73 @@ +# Webhooks + +A webhook is a POST request sent to a URL that you define in Docker Hub or another registry. Use webhooks to trigger an action in response to an event such as a repository push. + +{% hint style="info" %} +This functionality is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=stack-webhook). +{% endhint %} + +{% hint style="info" %} +Webhooks are only available on non-Edge environments (environments running Portainer Server or Portainer Agent, not the Portainer Edge Agent). This is because the tunnel to the Portainer Edge Agent is only opened on-demand, and therefore would mean there is no way to expose a webhook permanently. +{% endhint %} + +## Enabling a stack webhook + +From the menu select **Stacks** then select the container that you want to configure the webhook for. Then select the **Edit** tab. + +
+ +Scroll down to the **Webhooks** section and toggle the **Create a stack webhook** option on. When the URL appears, click **Copy link**. This URL will be used to configure the webhook in your chosen registry. + +
+ +This example shows how to trigger the webhook using `redeploy`: + +``` +
+ Redeploy stack containers with latest image of same tag +
+``` + +This example shows how to trigger the webhook to update the stack to use a different image tag: + +``` +
+ Update stack container images with different tag +
+``` + +## Preventing a pull + +In some cases you may want to override the pulling of images when using the webhook to do a redeploy. In that scenario, you can specify `pullimage=false` as a parameter on your webhook to disable pulling of images. + +{% hint style="info" %} +This option is only available in Portainer Business Edition. +{% endhint %} + +``` +
+ Update stack without pulling images +
+``` + +## Using environment variables with webhooks + +When triggering a webhook, environment variables can be passed through the endpoint and referenced within stacks' compose files. + +To specify an environment variable on a webhook, add it as a variable to the URL. For example, to pass a `SERVICE_TAG` variable with the value `development`: + +``` +https://portainer:9443/api/stacks/webhooks/1d251d96-fb34-4172-a0a1-d0655467b897?SERVICE_TAG=development +``` + +To reference the `SERVICE_TAG` variable in your compose file with a fallback to the value `stable`: + +``` +services: + my-service: + image: repository/image:${SERVICE_TAG:-stable} +``` + +## Configuring the webhook in Docker Hub + +To finish the configuration, refer to [Docker's own documentation](https://docs.docker.com/docker-hub/webhooks/). diff --git a/user/docker/swarm/README.md b/user/docker/swarm/README.md new file mode 100644 index 00000000..2c2a1622 --- /dev/null +++ b/user/docker/swarm/README.md @@ -0,0 +1,61 @@ +# Swarm + +{% hint style="info" %} +The **Swarm** menu is only available to Docker Swarm environments. +{% endhint %} + +This section provides an overview of your Swarm environment. You can view information about environments and nodes, view cluster information, and configure environment-specific settings. + +{% content-ref url="setup.md" %} +[setup.md](setup.md) +{% endcontent-ref %} + +## Cluster status + +This section describes the cluster's basic configuration, including the number of nodes, the Docker API version, and the total CPU and memory available. A link to the [cluster visualizer](cluster-visualizer.md) is also included. + +
+ +## Nodes + +Lists all of the nodes in the cluster along with a summary of each node, including: + +* The role of the node. +* The number of CPUs and memory available on the node. +* The Docker Engine version running on the node. +* The node's IP address. +* The status and availability of the node. + +
+ +Clicking on an individual node's name will take you to an overview page for that node. + +## Node overview + +### Host Details + +This section describes the node's basic configuration, including the hostname, OS information, and total CPU and memory. + +
+ +### Engine Details + +Information such as the Docker version and the available volume and network plugins helps you to understand more about the Docker engine running on your node. + +
+ +### PCI Devices and Physical Disks + +These sections list the available PCI devices and physical disks on the node. + +{% hint style="info" %} +These sections are only visible when [host management features](setup.md#host-and-filesystem) are enabled for the cluster. +{% endhint %} + +
+ +### Node Details + +Here you'll find details about the node's configuration as part of the cluster. You can view the role, set the availability status of the node, view the current status and apply labels to the node. + +
diff --git a/user/docker/swarm/cluster-visualizer.md b/user/docker/swarm/cluster-visualizer.md new file mode 100644 index 00000000..13e72b53 --- /dev/null +++ b/user/docker/swarm/cluster-visualizer.md @@ -0,0 +1,30 @@ +# Cluster visualizer + +{% hint style="info" %} +This feature is only available to Docker Swarm environments. +{% endhint %} + +The **Cluster visualizer** section gives you an overview of your cluster and the tasks on it. + +## Cluster information + +View the details about the cluster including the number of nodes, services and tasks. You can also adjust the visualizer display. + +
+ +### Options + +**Only display running tasks** filters the task list in the visualizer to only include running tasks. + +**Display node labels** toggles the display of labels on the nodes in the visualizer. + +### Refresh + +Use this option to define the refresh rate of the visualizer (the default is every 5 seconds). + +## Cluster visualizer + +The **Cluster visualizer** section gives you a visual representation of the nodes in your cluster and the tasks on each node. + +
+ diff --git a/user/docker/swarm/registries.md b/user/docker/swarm/registries.md new file mode 100644 index 00000000..fd885235 --- /dev/null +++ b/user/docker/swarm/registries.md @@ -0,0 +1,27 @@ +# Registries + +**Registries** lets you manage access to each of the registries that are currently available. + +{% hint style="warning" %} +Registry access assigned here only applies to the selected environment. It is not global. +{% endhint %} + +## Adding a new registry + +From the menu select **Swarm**, select **Registries** then click **Add registry**. When the global registries page appears, follow [these instructions](../../../admin/registries/add/). + +
+ +## Managing access + +To configure access to a registry, from the menu select **Swarm** then select **Registries**. + +
+ +Find the registry you want to manage then select **Manage access**. + +
+ +From the dropdown, select the users or teams that you would like to have access then click **Create access**. + +
diff --git a/user/docker/swarm/setup.md b/user/docker/swarm/setup.md new file mode 100644 index 00000000..28e84403 --- /dev/null +++ b/user/docker/swarm/setup.md @@ -0,0 +1,60 @@ +# Setup + +{% hint style="info" %} +The **Setup** section is only available to Docker Swarm environments. +{% endhint %} + +Under **Setup**, you can make changes to your environment, enabling and disabling features and security settings. + +## Host and Filesystem + +This section is where you configure how Portainer interacts with elements of the host. + +{% hint style="danger" %} +For security, these features are disabled by default. Be sure that you understand their impact before enabling them. +{% endhint %} + +
+ +| Option | Overview | +| ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enable host management features | Enabling host management features allows you to see the available devices and storage on the physical nodes across your cluster as well as browse the nodes' filesystems. | +| Enable volume management for non-administrators | Enabling this feature allows non-administrator users to manage volumes on an environment. If this is disabled, users below administrator level have read-only access to volumes. | + +## Change Window Settings + +This setting allows you to specify a window within which [automatic updates](../stacks/add.md#automatic-updates) to your applications can be applied. + +{% hint style="warning" %} +If this setting is enabled and an update is made to an application outside of this window, it will not be applied. +{% endhint %} + +
+ +## Docker Security Settings + +This section allows you to toggle assorted Docker-related security settings for an environment. + +
+ + + +| Option | Overview | +| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Disable bind mounts for non-administrators | Prevents non-admin users within Portainer from using bind mounts when creating containers and/or services/stacks. When toggled on, the option to attach to a host file system path is removed. | +| Disable privileged mode for non-administrators | Prevents non-admin users from elevating the privilege of a container to bypass SELinux/AppArmor. When toggled on, the option to select **Privileged** mode when [adding a container](../containers/add.md) is removed. | +| Disable the use of host PID 1 for non-administrators | Prevents non-admin users from requesting that a deployed container operates as the host PID. This is a security risk if used by a non-trustworthy authorized user because when they operate as PID1, they are in effect able to run any command in the container console as root on the host. | +| Disable the use of Stacks for non-administrators | This is a 'sledgehammer' approach to removing any possibility for non-admin users within Portainer to find and use weaknesses in the Docker architecture. Whilst Portainer has the ability to disable some of the more common exploits, we cannot possibly block them all because there are any number of capabilities that could be added to a container to attempt to gain access to the host. This feature simply allows an admin to disable all possible entry points. | +| Disable device mappings for non-administrators | Blocks users from mapping host devices into containers. Whilst the ability to map devices is generally used for good (e.g. mapping a GPU into a container), it can equally be used by non-trustworthy authorized users to map a physical storage device into a container. It is possible to mount `/dev/sda1` into a container, and then from a console of that container, the user would have complete access to the sda1 device without restriction. By toggling this on, Portainer blocks the ability for non-admins to map ANY devices into containers. | +| Disable container capabilities for non-administrators | Toggle on to hide the **Container capabilities** tab for non-administrators when they are [adding a container](../containers/add.md). | +| Disable sysctl settings for non-administrators | Toggle on to stop non-admin users from using sysctl options, preventing them from recreating, duplicating or editing containers. | + +## Other + +This section contains other assorted environment-specific settings. + +
+ +| Option | Overview | +| -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Show a notification to indicate out-of-date images for Docker environments | Toggle on to enable the [new image notification](../services/) feature for this environment. Toggle off to disable the feature. | diff --git a/user/docker/templates/README.md b/user/docker/templates/README.md new file mode 100644 index 00000000..84f9a0bd --- /dev/null +++ b/user/docker/templates/README.md @@ -0,0 +1,28 @@ +# App Templates + +An app template lets you deploy a container (or a stack of containers) to an environment with a set of predetermined configuration values while still allowing you to customize the configuration (for example, environment variables). + +
+ +Portainer supports templates of both individual containers and stacks of containers. + +{% content-ref url="deploy-stack.md" %} +[deploy-stack.md](deploy-stack.md) +{% endcontent-ref %} + +{% content-ref url="deploy-container.md" %} +[deploy-container.md](deploy-container.md) +{% endcontent-ref %} + +By default, Portainer provides a pre-built set of app templates, but you are free to modify or [replace these with your own](../../../advanced/app-templates/build.md). You can also create your own custom templates either manually or from an existing stack. + +{% content-ref url="custom.md" %} +[custom.md](custom.md) +{% endcontent-ref %} + +{% content-ref url="../stacks/template.md" %} +[template.md](../stacks/template.md) +{% endcontent-ref %} + + + diff --git a/user/docker/templates/custom.md b/user/docker/templates/custom.md new file mode 100644 index 00000000..16f07ada --- /dev/null +++ b/user/docker/templates/custom.md @@ -0,0 +1,82 @@ +# Custom templates + +A custom template can be used to help streamline the deployment of a container or stack. + +{% hint style="info" %} +You can also [create a template from an existing deployed stack](../stacks/template.md). +{% endhint %} + +## Viewing the list of custom templates + +To view a list of custom templates, from the menu select **App Templates** then select **Custom Templates**. + +
+ +## Creating a new custom template + +### Entering the basic information + +Click **Add Custom Template** then complete the details, using the table below as a guide. + +| Field/Option | Overview | +| ------------ | -------------------------------------------------------------------------------------------- | +| Title | Give the template a descriptive name. | +| Description | Enter a brief description of what your template includes. | +| Note | Note any extra information about the template (optional). | +| Icon URL | Enter the URL to an icon to be used for the template when it appears in the list (optional). | +| Platform | Select the compatible platform for the template. Options are **Linux** or **Windows**. | +| Type | Select the type of template. Options are **Standalone** or **Swarm**. | + +
+ +### Selecting the build method + +Next, choose the build method that suits your needs. You can use the web editor to manually enter your docker-compose file, upload a docker-compose.yml file from your local computer, or pull the compose file from a Git repository. + +#### Web editor + +Paste the contents of your docker-compose file into the box provided. Once all the details have been completed, click **Create custom template**. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +#### Upload + +Click **Select file** to browse for a docker-compose file to upload. Once all the details have been completed, click **Create custom template**. + +
+ +#### Git repository + +Fill in the details for your Git repository. + +| Field/Option | Overview | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| Repository URL | Enter the URL to your Git repository. | +| Repository reference | Enter the repository reference to define the branch or tag to pull from. If blank, the default `HEAD` reference will be used. | +| Compose path | Enter the path within the repository to your docker-compose file. | + +
+ +If your repository requires access authentication, toggle **Authentication** on then enter the username and personal access token. When all the details have been entered, click **Create custom template**. + +## Variables in templates + +Custom templates support the use of variables to provide further customization of the deployed stack. A stack can define a variable that can then be adjusted by the user at deployment. + +{% hint style="info" %} +This feature is only available in Portainer Business Edition. +{% endhint %} + +Variables are identified in stacks with `{{ }}`. For example, the following stack provides a `MYSQL_PASSWORD` variable: + +
+ +When a variable is defined, options appear to customize how the variable appears when deploying the stack. You can set the **label**, **description** and **default value**. + +When a template is deployed, any variables that have been configured are editable: + +
diff --git a/user/docker/templates/deploy-container.md b/user/docker/templates/deploy-container.md new file mode 100644 index 00000000..d7f41bbf --- /dev/null +++ b/user/docker/templates/deploy-container.md @@ -0,0 +1,17 @@ +# Deploy a container + +Portainer lets you deploy a standalone container from the default templates list. + +From the menu select **App Templates**. Toggle **Show container templates** on then select the app that you want to deploy. + +
+ +Define a name, a network, port mapping and volumes, and toggle **Enable access control** on if needed. + +
+ +You can also make changes to container settings such as port and volume mapping, host file entries, labels and the hostname by clicking **Show advanced options**. + +
+ +Once you have configured the container, click **Deploy the container**. diff --git a/user/docker/templates/deploy-stack.md b/user/docker/templates/deploy-stack.md new file mode 100644 index 00000000..4de07115 --- /dev/null +++ b/user/docker/templates/deploy-stack.md @@ -0,0 +1,19 @@ +# Deploy a stack + +Portainer lets you deploy an entire stack from either a default template or a custom template. + +{% hint style="info" %} +You can also [create a template from a stack](../stacks/template.md). +{% endhint %} + +From the menu select **App Templates** then select the template you want to deploy. In this example we'll create a WordPress stack. + +
+ +Enter a name for the stack and set any required configuration values (these will differ from template to template). Toggle **Enable access control** on or off as required. + +
+ +Click **Deploy the stack** then wait for the deployment to finish. If the deployment is successful, the new stack will appear in the list. Select it to view the [deployment details](../stacks/edit.md). + +
diff --git a/user/docker/volumes/README.md b/user/docker/volumes/README.md new file mode 100644 index 00000000..8c997afd --- /dev/null +++ b/user/docker/volumes/README.md @@ -0,0 +1,26 @@ +# Volumes + +A volume is a data storage area that can be mounted into a container to provide persistent storage. Unlike bind mounts, volumes are independent of the underlying OS and are fully managed by the Docker Engine. + +
+ +A volume with the **external** flag was created outside of Portainer, which means Portainer has limited knowledge on it compared to one created within Portainer. A label of **unused** means that Portainer cannot see any applications that are using this volume. This label may also appear on **external** resources because of the limited information available. + +In Portainer you can view a list of the volumes on your environment, add new volumes and remove existing volumes. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + +If you're running Docker Swarm or the Portainer Agent on your environment, you can also browse existing volumes on that environment. + +{% content-ref url="browse.md" %} +[browse.md](browse.md) +{% endcontent-ref %} + + + diff --git a/user/docker/volumes/add.md b/user/docker/volumes/add.md new file mode 100644 index 00000000..0e9ca314 --- /dev/null +++ b/user/docker/volumes/add.md @@ -0,0 +1,121 @@ +# Add a new volume + +## Adding a local volume + +From the menu select **Volumes** then click **Add volume**. + +
+ +Complete the information in the **Create volume** screen, using the table below as a guide. + +| Field/Option | Overview | +| --------------- | ------------------------------------------------------------------- | +| Name | Give the volume a descriptive name. | +| Driver | Select `local`. | +| Use NFS volume | Toggle this off. | +| Use CIFS volume | Toggle this off. | +| Deployment | On a multi-node cluster, define the node that will hold the volume. | + +
+ +When you're finished, click **Create the volume**. + +## Adding an NFS volume + +{% hint style="info" %} +In Portainer, you can mount an NFS volume to persist the data of your containers. +{% endhint %} + +From the menu select **Volumes** then click **Add volume**. + +
+ +Complete the information in the **Create volume** screen, using the table below as a guide. + +| Field/Option | Overview | +| --------------- | ------------------------------------------------------------------- | +| Name | Give the volume a descriptive name. | +| Driver | Select `local`. | +| Use NFS volume | Toggle this on. | +| Use CIFS volume | Toggle this off. | +| Deployment | On a multi-node cluster, define the node that will hold the volume. | + +
+ +Under the **NFS Settings** section, complete the following. + +| Field/Option | Overview | +| ------------ | --------------------------------------------------------------------- | +| Address | Enter the hostname or IP address of your NFS server. | +| NFS Version | Select the NFS version that your NFS server uses. | +| Mount point | Enter the path where the volume is mounted, for example `/mnt/nfs01`. | +| Options | Leave the default values. | + +
+ +When you're finished, click **Create the volume**. + +## Adding a CIFS volume + +{% hint style="info" %} +In Portainer, you can mount a CIFS volume to persist the data of your containers. +{% endhint %} + +From the menu select **Volumes** then click **Add volume**. + + + +Complete the information in the **Create volume** screen, using the table below as a guide. + +| Field/Option | Overview | +| --------------- | ------------------------------------------------------------------- | +| Name | Give the volume a descriptive name. | +| Driver | Select `local`. | +| Use NFS volume | Toggle this off. | +| Use CIFS volume | Toggle this on. | +| Deployment | On a multi-node cluster, define the node that will hold the volume. | + +
+ +Under the **CIFS Settings** section, complete the following: + +| Field/Option | Overview | +| ------------ | ------------------------------------------- | +| Address | Enter the CIFS server name or IP address. | +| Share | Enter the name of the share resource. | +| CIFS Version | Select the CIFS version that you are using. | +| Username | Enter the user to authenticate. | +| Password | Enter the password to authenticate. | + +
+ +When you're finished, click **Create the volume**. + +## Adding a tmpfs volume + +From the menu select **Volumes** then click **Add volume**. + +
+ +Complete the information in the **Create volume** screen, using the table below as a guide. + +| Field/Option | Overview | +| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the volume a descriptive name. | +| Driver | Select `local`. | +| Driver options | Click **add driver option** then add the following name/value combinations: | +| |
  • name: type

    value: tmpfs

  • name: device

    value: tmpfs

  • name: o
  • value: size=100m,uid=1000 (customize these values to suit your needs)
| +| Use NFS volume | Toggle this off. | +| Use CIFS volume | Toggle this off. | +| Deployment | On a multi-node cluster, define the node that will hold the volume. | + +
+ +When you're finished, click **Create the volume**. The volume can now be attached to a container in the same way as any other volume. + +
+ +Once attached, you can confirm that the tmpfs volume has been mounted correctly within the container: + +
+ diff --git a/user/docker/volumes/browse.md b/user/docker/volumes/browse.md new file mode 100644 index 00000000..9823636c --- /dev/null +++ b/user/docker/volumes/browse.md @@ -0,0 +1,13 @@ +# Browse a volume + +{% hint style="info" %} +This feature is only available when running Docker Swarm or the Portainer Agent on the environment. +{% endhint %} + +From the menu select **Volumes** then click **browse** next to the volume you want to explore. + +
+ +You can upload files to the volume (by clicking the icon in the top right), and quickly expose them to the container without the need for a CLI. You can also download, rename and delete files in the volume. + +
diff --git a/user/docker/volumes/remove.md b/user/docker/volumes/remove.md new file mode 100644 index 00000000..52407837 --- /dev/null +++ b/user/docker/volumes/remove.md @@ -0,0 +1,18 @@ +# Remove a volume + +{% hint style="danger" %} +When you delete a volume, all of the content inside the volume will be erased. +{% endhint %} + +From the menu select **Volumes**, tick the checkbox next to the volume you want remove then click **Remove**. + +{% hint style="info" %} +You cannot remove volumes attached to a container. If you want to do this, first remove the container then remove the volumes. +{% endhint %} + +
+ +When the confirmation message appears, click **Remove**. + +
+ diff --git a/user/edge/README.md b/user/edge/README.md new file mode 100644 index 00000000..46298e5a --- /dev/null +++ b/user/edge/README.md @@ -0,0 +1,24 @@ +# Edge Compute + +The following sections describe how to manage Edge Compute environments using menu options available in the Portainer Server. + +{% hint style="info" %} +This functionality requires you to [enable Edge Compute](../../admin/settings/edge/) features. +{% endhint %} + +{% content-ref url="groups.md" %} +[groups.md](groups.md) +{% endcontent-ref %} + +{% content-ref url="stacks.md" %} +[stacks.md](stacks.md) +{% endcontent-ref %} + +{% content-ref url="jobs.md" %} +[jobs.md](jobs.md) +{% endcontent-ref %} + +{% content-ref url="waiting-room.md" %} +[waiting-room.md](waiting-room.md) +{% endcontent-ref %} + diff --git a/user/edge/groups.md b/user/edge/groups.md new file mode 100644 index 00000000..d8262197 --- /dev/null +++ b/user/edge/groups.md @@ -0,0 +1,36 @@ +# Edge Groups + +The Edge Groups feature lets you group together Edge environments either by manually selecting them or based on their [tags](../../admin/environments/tags.md). This is useful if you manage multiple Edge environments in multiple zones. + +{% hint style="info" %} +This functionality requires you to [enable Edge Compute](../../admin/settings/edge/) features. +{% endhint %} + +From the menu select **Edge Groups** then click **Add Edge group**. + +
+ +Give the group a descriptive name then select either **Static** or **Dynamic**: + +
+ +### **Option 1: Static** + +This option lets you manually add environments to the group from a list. Select the required environments then click **Add edge group**. + +
+ +### Option 2: Dynamic + +This option lets you automatically associate environments via their tags. If you choose this option you will need to refine how Edge environments are dynamically associated. + +| Option | Overview | +| ------------- | --------------------------------------------------------------------------------------------------------------------- | +| Partial Match | Will associate any environments matching at least one of the selected tags (environments can have more than one tag). | +| Full Match | Will associate any environments matching all of the selected tags. | + +When you select a tag from the dropdown, environments with that tag will appear in the results. + +
+ +Click **Add edge group** to associate the environments to the group. diff --git a/user/edge/jobs.md b/user/edge/jobs.md new file mode 100644 index 00000000..b15a8804 --- /dev/null +++ b/user/edge/jobs.md @@ -0,0 +1,46 @@ +# Edge Jobs + +{% hint style="warning" %} +This is a beta feature. +{% endhint %} + +Adding an Edge job is a great way to schedule jobs in your Edge hosts. Jobs can be used to run any scripts you need, for example running a backup in a specified period of time. + +{% hint style="info" %} +This functionality requires you to [enable Edge Compute](../../admin/settings/edge/) features. +{% endhint %} + +{% hint style="danger" %} +Edge jobs run by modifying the crontab on the underlying host, not in a container. This means that Edge jobs can make changes to the host directly, which is very powerful but also very dangerous, so use with caution. +{% endhint %} + +From the menu select **Edge Jobs** then click **Add Edge job**. + +
+ +Give the job a descriptive name then select one of the following options: + +| Option | Overview | +| ---------------------- | -------------------------------- | +| Basic Configuration | Select a date from the calendar. | +| Advanced Configuration | Write your own `cron` rule. | + +If you select **Recurring Edge job** also enter the **Edge job time**. + +{% hint style="info" %} +The Edge job time is based on the time on the host, not the Portainer Server. Bear this in mind when scheduling jobs across time zones. +{% endhint %} + +
+ +You can then use the web editor to write the script or paste a copy in. + +Once your script is ready, you can choose where to deploy it. You can select [Edge Groups](groups.md) to deploy to with the **Edge Groups** dropdown. + +
+ +You can also select environments individually in **Target environments**. Click on an environment in the **Available environments** list to move it to the **Associated environments** list as a deployment target. + +
+ +Once you have made your selections, click **Create edge job** to create and run the job. diff --git a/user/edge/stacks.md b/user/edge/stacks.md new file mode 100644 index 00000000..ea102437 --- /dev/null +++ b/user/edge/stacks.md @@ -0,0 +1,66 @@ +# Edge Stacks + +Edge Stacks is a feature that lets you deploy multiple applications to multiple environments from a single page and multiple sources, regardless of their current state. + +{% hint style="info" %} +This functionality requires you to [enable Edge Compute](../../admin/settings/edge/) features. +{% endhint %} + +The Edge Stacks page displays the list Edge Stacks deployed across your environments and devices and includes their name, the status of the deployment across the relevant environments (acknowledged, successful, and failed), and the creation date. + +
+ +You can click on the individual stacks to edit the stack: + +
+ +You can also view details about the stack's deployment across environments on the **Environments** tab, as well as retrieve, download, and clear retrieved log files from the respective environments (for stacks deployed on [Edge Devices](../../admin/settings/edge/devices/)). + +
+ +## Add a new stack + +From the menu select **Edge Stacks** then click **Add stack**. + +
+ +Give the stack a descriptive name then select one or more [Edge Groups](groups.md). + +
+ +In **Deployment type**, select the type of deployment you are performing. + +{% hint style="info" %} +This may be auto-selected by your choice of [Edge Groups](groups.md). +{% endhint %} + +
+ +In the **Build Method**, define how to deploy your app from one of the following options: + +| Option | Overview | +| ---------- | ------------------------------------------------------------------------------- | +| Web editor | Use the Portainer web editor to write or paste in your build file. | +| Upload | Upload a build file from your computer. | +| Repository | Use a GitHub repo where the build file is stored. | +| Template | Use an Edge stack template. Only available for the **Compose** deployment type. | + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +If your stack requires access to images in private registries, you can specify which registry to use as part of the deployment. + +
+ +### Pre-pull images + +By default, Docker will start containers within the stack that it already has images for, while at the same time pulling any other images it needs from the upstream registries. In some cases you may want to wait until all of the needed images are pulled to the device before starting the stack. To do this, enable the **Pre-pull images** toggle. This can also help to avoid issues when some images in a stack are unable to be pulled, leading to an incomplete or partial deployment. + +
+ + + +Once the configuration is completed, click **Deploy stack**. diff --git a/user/edge/waiting-room.md b/user/edge/waiting-room.md new file mode 100644 index 00000000..f579e845 --- /dev/null +++ b/user/edge/waiting-room.md @@ -0,0 +1,7 @@ +# Waiting Room + +The Edge Devices Waiting room lists any Edge Devices that have connected using the pre-deploy script and are pending association with the Portainer instance. + +
+ +To associate a device with your Portainer instance, tick the box next to the device and click **Associate Device**. diff --git a/user/home.md b/user/home.md new file mode 100644 index 00000000..4c40a282 --- /dev/null +++ b/user/home.md @@ -0,0 +1,23 @@ +# Home + +The **Home** page is the first page you will see after logging into Portainer. This page provides an overview of your environments along with vital statistics about each. You can search and filter your list of environments using the options at the top of the list. + +
+ +Your currently selected environment (if any) will be shown by the **Connected** status on the right. To choose an environment, either click on the tile for the environment or the **Live connect** or **Browse snapshot** button (for [Edge Devices in async mode](../admin/settings/edge/devices/#browsing-your-edge-device)). You can click the pencil icon to edit the environment's connection configuration, and the cog button to go to the environment's settings page (if the environment is directly accessible). + +
+ +## Build information + +You can view the build information for your Portainer installation by clicking on the Portainer version number in the bottom left of the UI. This may be helpful when troubleshooting issues with the Portainer support team. + +
+ +In the box that appears you can see the server version, database version, build number and image tag, as well as the versions of the compilation tools used to build Portainer. + +## Context-sensitive help + +From any page in the Portainer UI, you can click on the question mark icon in the top right next to your username to access the related section of this documentation. + +
diff --git a/user/kubernetes/README.md b/user/kubernetes/README.md new file mode 100644 index 00000000..88fd0048 --- /dev/null +++ b/user/kubernetes/README.md @@ -0,0 +1,44 @@ +# Kubernetes + +The following sections describe how to manage a Kubernetes environment using menu options available in the Portainer Server. + +{% content-ref url="dashboard.md" %} +[dashboard.md](dashboard.md) +{% endcontent-ref %} + +{% content-ref url="kubectl.md" %} +[kubectl.md](kubectl.md) +{% endcontent-ref %} + +{% content-ref url="kubeconfig.md" %} +[kubeconfig.md](kubeconfig.md) +{% endcontent-ref %} + +{% content-ref url="templates/" %} +[templates](templates/) +{% endcontent-ref %} + +{% content-ref url="namespaces/" %} +[namespaces](namespaces/) +{% endcontent-ref %} + +{% content-ref url="helm/" %} +[helm](helm/) +{% endcontent-ref %} + +{% content-ref url="applications/" %} +[applications](applications/) +{% endcontent-ref %} + +{% content-ref url="configurations/" %} +[configurations](configurations/) +{% endcontent-ref %} + +{% content-ref url="volumes/" %} +[volumes](volumes/) +{% endcontent-ref %} + +{% content-ref url="cluster/" %} +[cluster](cluster/) +{% endcontent-ref %} + diff --git a/user/kubernetes/applications/README.md b/user/kubernetes/applications/README.md new file mode 100644 index 00000000..92b4b335 --- /dev/null +++ b/user/kubernetes/applications/README.md @@ -0,0 +1,33 @@ +# Applications + +In Kubernetes, an application is a collection of configuration settings and variables required to run your app. This may consist of a single container or multiple containers with complex interoperability. + +
+ +Portainer lets you add applications either using a form or through a manifest: + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="manifest.md" %} +[manifest.md](manifest.md) +{% endcontent-ref %} + +You can also inspect a running application: + +{% content-ref url="inspect.md" %} +[inspect.md](inspect.md) +{% endcontent-ref %} + +Version 2.9 has added support for deploying applications via [Helm](../helm/) charts: + +{% content-ref url="../helm/deploy.md" %} +[deploy.md](../helm/deploy.md) +{% endcontent-ref %} + +If you no longer require an application, it can be removed: + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} diff --git a/user/kubernetes/applications/add.md b/user/kubernetes/applications/add.md new file mode 100644 index 00000000..3d8c8f3b --- /dev/null +++ b/user/kubernetes/applications/add.md @@ -0,0 +1,92 @@ +# Add a new application using a form + +There are two ways to add a new application: manually by using a form or automatically by [using a manifest](manifest.md). This article explains how to add an application manually. + +From the menu select **Applications** then click **Add with form**. + +
+ +Complete the required information, using the sections below as a guide. + +### Base configuration + +| Field/Option | Overview | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Namespace | Select the namespace where the application will reside. | +| Name | Give the application a descriptive name. | +| Registry | Select the registry to pull the image from. If you want to pull from a registry that is not configured with Portainer, click **Advanced mode** then enter the URL and image manually. | +| Image | Enter the name (and optionally the tag) of the image that will be used to deploy the application. | +| Stack | Portainer can automatically bundle multiple applications inside a stack. You can either enter the name of a new stack, select an existing stack from the list, or leave empty to use the application name. | + +
+ +### Environment variables + +Here you can define any environment variables you wish to be available to your application. + +
+ +### Configurations + +Select any ConfigMaps or secrets you have previously created to make them available to the application. Portainer will automatically expose all the keys of a ConfigMap or secret as environment variables. This behavior can be overridden to filesystem mounts for each key via the **override** button. + +
+ +### Persisting data + +Define any persistent folders within the application and whether these are new or existing volumes, as well as the size of the volume and storage location. + +You can also define the **Data access policy** for your persisted folders: + +* **Isolated:** Each instance of the application will use its own data. +* **Shared**: All application instances will use the same data. + +
+ +### Resource reservations + +In this section you can define the amount of **memory** and **CPU** available to the application. + +
+ +### Deployment + +This section allows you to choose how you want to deploy the application inside the cluster. Options are: + +* **Replicated:** Run one or multiple instances of this container. +* **Global:** Deploy an instance of this container on each cluster node. + +You can also define the number of instances of the application to run by setting the **Instance count**. + +
+ +### Auto-scaling + +Toggle **Enable auto scaling for this application** to enable auto-scaling for the application you are deploying. This requires that the Kubernetes metrics server is installed and [enabled in the cluster setup](../cluster/setup.md#resources-and-metrics). + +| Field/Option | Overview | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Minimum instances | Enter the minimum number of instances that you want running for this application. | +| Maximum instances | Enter the maximum number of instances that you want running for this application. | +| Target CPU usage | Enter the target CPU percentage for your application. The autoscaler will ensure that enough instances are running to maintain an average CPU usage of this value across all instances. | + +
+ +### Placement preferences and constraints + +Here you can define which placement rules must be followed by the nodes where the application is deployed to. Placement rules are based on node labels. To create a new rule, click **add rule**. + +You can also define the placement policy for the rules you have set. Options are: + +* **Mandatory:** The application will only be scheduled on nodes that follow all rules. +* **Preferred**: If possible, the application will be scheduled on nodes that follow all rules. + +
+ +### Publishing the application + +Here you can create the necessary services to expose your application. Select the type of service (ClusterIP, NodePort, or LoadBalancer) from the dropdown and click **Create service**. You can then configure each service as required. + +
+ +When you have finished, click **Deploy application**. diff --git a/user/kubernetes/applications/detach-volume.md b/user/kubernetes/applications/detach-volume.md new file mode 100644 index 00000000..9ebd6bec --- /dev/null +++ b/user/kubernetes/applications/detach-volume.md @@ -0,0 +1,9 @@ +# Detach a volume from an application + +From the menu select **Applications**, select the application then click **Edit this application**. + +
+ +Scroll down to the **Persisting data** section and click the trash can icon to the right of the volume. Scroll down and click **Update application**. When the confirmation message appears, click **Update**. + +
diff --git a/user/kubernetes/applications/edit.md b/user/kubernetes/applications/edit.md new file mode 100644 index 00000000..ac32e7a7 --- /dev/null +++ b/user/kubernetes/applications/edit.md @@ -0,0 +1,40 @@ +# Edit an application + +From the menu select **Applications**, select the application you want to edit, then click **Edit this application**. + +
+ +Your editing options will depend on how the application was deployed initially. + +{% hint style="info" %} +Regardless of the deployment method, you can [edit an application's YAML directly](inspect.md#yaml-section) through the YAML tab in Portainer Business Edition. +{% endhint %} + +## Applications deployed from Git + +If the application was [deployed from a Git repository](manifest.md#option-1-git-repository) you can redeploy it from the repository if needed. You will see the repository URL that the application was deployed from, and the file used for the deployment. + +
+ +You can reconfigure automatic updates, the repository reference and authentication here if needed. + +
+ +If you want to redeploy, click **Pull and update application**. If you're simply updating the repository settings and don't need to redeploy, click **Save settings**. + +## Applications deployed from the Web Editor + +If the application was deployed from the Web Editor, you will be given the ability to edit the manifest manually. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +Make the required changes then click **Update the application**. + +## Applications deployed from a form + +When editing an application deployed from a form, you will be able to update the configuration using the same form. Refer to [adding a new application using a form](add.md) for details. + diff --git a/user/kubernetes/applications/inspect.md b/user/kubernetes/applications/inspect.md new file mode 100644 index 00000000..301b32db --- /dev/null +++ b/user/kubernetes/applications/inspect.md @@ -0,0 +1,84 @@ +# Inspect an application + +To view information about applications running in a cluster, from the menu select **Applications** then select the application you want to inspect. + +
+ +The **Application details** screen is organized into four sections. The following tables explain all of the information to be found in each. + +## Application information section + +### General information + +| Attribute | Overview | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| Name | The name of the application. | +| Stack | The stack that the application belongs to (if any). | +| Namespace | The namespace that the application is running in. | +| Application Type | The type of application (Pod, Deployment, StatefulSet, DaemonSet, etc). | +| Status | Indicates whether or not the application is running. Where applicable, this also shows the replication state and number of replicas. | +| Creation | Shows when the application was created and by whom, as well as how the application was deployed. | +| Note | Add a note about the application or edit an existing note. | + +
+ +### Actions + +Depending on how the application was deployed, a number of actions can be performed, including: + +* [Editing the application](edit.md). +* Perform a rolling restart of the application (Business Edition only). +* Redeploying the application (terminating all the services and recreating them). +* Rolling the application back to a previous configuration. +* Creating a [template](../templates/) from the application. + +{% hint style="info" %} +When using a Git repository, the rolling restart and redeploy options do not re-pull the manifest from the upstream repository. To do this, use the **Pull and update application** button when [editing an application](edit.md#method-1-redeploy-from-git). +{% endhint %} + +

Some of the potential actions that may appear for your application

+ +### Configuration details + +| Configuration | Overview | +| ------------------------- | -------------------------------------------------------------------------------------------------- | +| Accessing the application | Shows which ports (if any) are published from the container. | +| Auto-scaling | Indicates the application's auto-scaling policy. | +| Configuration | A list of any environment variables and configurations that have been defined for the application. | +| Data persistence | A list of the persistent folders and their details. | + +
+ +### Pod details + +See which pods run your application, which image is being used, the status, node, and IP address of the pod, and when each pod was created. You can also access the pod stats, console and logs from here. + +
+ +## Placement section + +Here you'll find information about any placement constraints or preferences that have been defined for the application and how they're being applied. + +
+ +## Events section + +Shows information about application-related events. + +
+ +## YAML section + +This displays the YAML generated from the application deployment, and lets you edit the YAML for an application directly. Updates to your manifest made here are applied using the Kubernetes `patch` mechanism. + +{% hint style="info" %} +Editing your YAML through this section is only available in Portainer Business Edition. +{% endhint %} + +
+ +Make your edits then click **Apply changes** to update the deployment. + +{% hint style="warning" %} +Editing the YAML is not available for resources in namespaces marked as system. +{% endhint %} diff --git a/user/kubernetes/applications/manifest.md b/user/kubernetes/applications/manifest.md new file mode 100644 index 00000000..1308d437 --- /dev/null +++ b/user/kubernetes/applications/manifest.md @@ -0,0 +1,100 @@ +# Add a new application using a manifest + +There are two ways to add a new application: [manually by using a form](add.md) or automatically by using a manifest. This article explains how to add an application using a manifest. + +{% hint style="info" %} +Manifests aren't just for applications - you can also deploy namespaces, ingresses, ConfigMaps, secrets and volumes using a manifest. +{% endhint %} + +From the menu select **Applications** then click **Create from manifest**. + +
+ +Select the namespace for your deployment, define a name for your application, and then choose the build method from the options provided. + +{% hint style="info" %} +If you want to use namespaces defined in your manifest defines the namespace(s) you wish to deploy to, you can leave **Namespace** set to `default` and toggle on the **Use namespace(s) specified from manifest** option. +{% endhint %} + +
+ +## Option 1: Git Repository + +Use the provided fields to enter the details of your Git repository containing your Kubernetes manifests. + +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Authentication | Toggle this on if your repository requires authentication. | +| Git Credentials | If the **Authentication** toggle is enabled and you have [configured Git credentials](../../account-settings.md#git-credentials), you can select them from this dropdown. | +| Username | Enter your Git username. | +| Personal Access Token | Enter your personal access token or password. | +| Save credential | Check this option to save the credentials entered above for future use under the name provided in the **credential name** field. | + +
+ +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Repository URL | Enter the repository URL. If you have enabled Authentication above the credentials will be used to access the repository. The below options will be populated by what is found in the repository. | +| Repository reference | Select the reference to use when deploying the stack (for example, the branch). | +| Manifest path | Enter the path to your manifest file relative to the root of your repository. | +| Additional paths | Click **add file** to define additional manifests or compose files to process as part of the deployment. | + +
+ +### Automatic updates + +Enabling Automatic updates gives Portainer the ability to update your application automatically, either by polling the repository at a defined interval for changes or by using a webhook to trigger an update. + +{% hint style="info" %} +For more detail on how automatic updates function under the hood, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-do-automatic-updates-for-stacks-applications-work). +{% endhint %} + +{% hint style="warning" %} +If your application is configured for automatic updates and you make changes locally, these changes will be overridden by the application definition in the Git repository. Bear this in mind when making configuration changes. +{% endhint %} + +| Field/Option | Overview | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Mechanism | Choose from **Polling** or **Webhook**. | +| Fetch interval | When using the **Polling** method, choose how often you wish to check the Git repository for updates to your application. | +| Webhook |

When using the Webhook method, this displays the webhook URL to use. Click Copy link to copy the webhook to your clipboard.
For more on webhooks, refer to the webhook documentation.

| + +

Automatic updates using the polling mechanism

+ +

Automatic updates using the webhook mechanism

+ +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Always apply manifest |

Enable this setting to force the redeployment of your application at the specified interval (or when the webhook is triggered), overwriting any changes that have been made in the local environment, even if there has been no update to the application in Git. This is useful if you want to ensure that your Git repository is the source of truth for your applications and are happy with the local application being replaced.

If this option is left disabled, automatic updates will only trigger if Portainer detects a change in the remote Git repository.

| + +
+ +When you're ready, click **Deploy**. + +## Option 2: Web editor + +Use the Web editor to write or paste in your Kubernetes manifest. + +
+ +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +When you're ready, click **Deploy**. + +## Option 3: URL + +Enter the **URL** to your manifest file in the provided field. + +
+ +When you're ready, click **Deploy**. + +## Option 4: Custom template + +From the **Template** dropdown, select the custom template to use. As an optional step, you can edit the template before deploying the application. If you have no custom templates you will be given a link to the [Custom Templates](../templates/) section. + +
+ +When you're ready, click **Deploy**. diff --git a/user/kubernetes/applications/remove.md b/user/kubernetes/applications/remove.md new file mode 100644 index 00000000..40bab23e --- /dev/null +++ b/user/kubernetes/applications/remove.md @@ -0,0 +1,9 @@ +# Remove an application + +From the menu select **Applications**, tick the checkbox next to the application you want to remove then click **Remove**. + +
+ +When the confirmation message appears, click **Remove**. + +
diff --git a/user/kubernetes/applications/webhooks.md b/user/kubernetes/applications/webhooks.md new file mode 100644 index 00000000..5e0c97b3 --- /dev/null +++ b/user/kubernetes/applications/webhooks.md @@ -0,0 +1,105 @@ +# Webhooks + +A webhook is a POST request sent to a URL. Use webhooks to trigger an action in response to an event such as a repository push. + +{% hint style="info" %} +This functionality is only available in [Portainer Business Edition](https://www.portainer.io/business-upsell?from=stack-webhook). +{% endhint %} + +{% hint style="info" %} +Webhooks are only available on non-Edge environments (environments running Portainer Server or Portainer Agent, not the Portainer Edge Agent). This is because the tunnel to the Portainer Edge Agent is only opened on-demand, and therefore would mean there is no way to expose a webhook permanently. +{% endhint %} + +## Enabling an application webhook + +From the menu select **Applications** then select the application that you want to configure the webhook for. Then select the **Edit this application** button. + +{% hint style="info" %} +Webhooks are only available for applications deployed from a Git repository. +{% endhint %} + +
+ +Enable **Automatic updates** if it is not already enabled and select `Webhook` as the **Mechanism**. When the URL appears, click **Copy link**. This is the URL used to trigger the webhook. + +
+ +This example shows how to trigger the webhook: + +``` +
+ Redeploy application +
+``` + +## Using environment variables with webhooks + +When triggering a webhook, environment variables can be passed through the endpoint and referenced within the deployment. + +{% hint style="info" %} +Environment variables can not be updated for Pods, only for Deployments. +{% endhint %} + +To specify an environment variable on a webhook, add it as a variable to the URL. For example, to pass a `SERVICE_TAG` variable with the value `development`: + +``` +https://portainer:9443/api/stacks/webhooks/40ac1662-47c3-4a8e-b148-2a34eb52bb42?SERVICE_TAG=development +``` + +To reference the `SERVICE_TAG` variable in your manifest with a fallback to the value `stable`: + +``` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 2 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + env: + - name: SERVICE_TAG + value: "stable" +``` + +{% hint style="warning" %} +Environment variables must already be defined in the manifest - new environment variables cannot be added via the webhook. +{% endhint %} + +## Rolling restarts + +When using an application's webhook to redeploy your application, you can tell Portainer to perform a rolling restart of the application rather than a "terminate and restart" redeploy. + +{% hint style="info" %} +This functionality is only available in Portainer Business Edition. +{% endhint %} + +To specify this, use the `rollout-restart` parameter in your webhook call: + +``` +https://portainer:9443/api/stacks/webhooks/40ac1662-47c3-4a8e-b148-2a34eb52bb42?rollout-restart=all +``` + + Valid options are as below: + +| Option | Overview | +| --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `rollout-restart=all` | All of the application's deployments will be redeployed as a rolling restart. | +| `rollout-restart=deployment/deployment1,deployment/deployment2` |

Only the specified deployment(s) will be redeployed as a rolling restart. All other deployments will not be redeployed or restarted. Separate multiple deployments with commas.
This option supports Deployments (deployment/deployment1), DaemonSets (daemonset/daemonset1), and StatefulSets (statefulset/statefulset1).

| + +If the `rollout-restart` parameter is not defined, the webhook will redeploy the application in traditional "terminate and restart" behavior. + +{% hint style="warning" %} +If your cluster has a [change window](../cluster/setup.md#change-window-settings) enabled, the rolling restart will only be performed within the change window. +{% endhint %} diff --git a/user/kubernetes/cluster/README.md b/user/kubernetes/cluster/README.md new file mode 100644 index 00000000..f17ed0d3 --- /dev/null +++ b/user/kubernetes/cluster/README.md @@ -0,0 +1,48 @@ +# Cluster + +A cluster is a collection of nodes that runs containerized workloads. Portainer lets you keep track of your cluster and its individual nodes, including resource usage and configuration. + +From the menu select **Cluster**. + +
+ +The following information is provided: + +| Attribute | Overview | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Memory reservation | The amount of memory available to the cluster. | +| Memory used | The amount of memory used by the cluster. This is only visible if you have [enabled using the metrics API](setup.md#enable-features-using-the-metrics-api). | +| CPU reservation | The amount of CPU that has been reserved in the cluster. | +| CPU used | The amount of CPU used by the cluster. This is only visible if you have [enabled using the metrics API](setup.md#enable-features-using-the-metrics-api). | +| Leader status | This section lists components and their leader node in your cluster. | + +
+ +## Nodes + +This section lists the nodes in your cluster with information about each node. To view [details of a specific node](node.md), click the name of the node in the list. + +
+ +To view usage stats for a node, click the **Stats** link to the right of the node. + +{% hint style="info" %} +Node stats are only available when you have [enabled using the metrics API](setup.md#enable-features-using-the-metrics-api). +{% endhint %} + +
+ +If you need to adjust elements of your Kubernetes configuration you can do so here as well. + +{% content-ref url="setup.md" %} +[setup.md](setup.md) +{% endcontent-ref %} + +If you would like to define security constraints on the pods in your environment, select **Security constraints**. + +{% content-ref url="security.md" %} +[security.md](security.md) +{% endcontent-ref %} + + + diff --git a/user/kubernetes/cluster/node.md b/user/kubernetes/cluster/node.md new file mode 100644 index 00000000..d1b4bbd0 --- /dev/null +++ b/user/kubernetes/cluster/node.md @@ -0,0 +1,57 @@ +# Inspect a node + +To view details of an individual node in your cluster, from the menu select **Cluster** then scroll down and click on the name of the node you want to inspect. + +
+ +Information about the cluster is separated into two screen tabs. + +## Node + +The **Node** tab summarizes the following information about the selected node: + +| Field/Option | Overview | +| --------------- | -------------------------------------------------------------------------------------- | +| Hostname | The hostname of the node. | +| Kubernetes API | The address and port of the Kubernetes API for this node. | +| Role | The role of the node. | +| Kubelet version | The version of kubelet on the node. | +| Creation date | The date when this node was created. | +| Status | The status of the node. | +| Availability | Defines the availability of the node. Options are **Active**, **Pause** and **Drain**. | + +
+ +### Resource reservation + +This section provides details about resource reservations assigned on the node as well as the node's resource usage. + +{% hint style="info" %} +**Memory used** and **CPU used** are only displayed if you have [enabled using the metrics API](setup.md#enable-features-using-metrics-server). +{% endhint %} + +
+ +### Labels + +This section lists the labels that apply to the node. You can add additional labels if required, as well as edit non-system labels. + +
+ +### Taints + +In this section you can add taints to prevent certain pods being deployed on the node. + +
+ +## Events + +Shows information about node-related events. + +
+ +## Applications running on this node + +This section provides information about the applications running on the selected node. Clicking the application name will take you to the application details page for that application. + +
diff --git a/user/kubernetes/cluster/registries.md b/user/kubernetes/cluster/registries.md new file mode 100644 index 00000000..133d9db5 --- /dev/null +++ b/user/kubernetes/cluster/registries.md @@ -0,0 +1,55 @@ +# Registries + +**Registries** lets you manage access to each of the registries that are currently available. + +{% hint style="warning" %} +Registry access assigned here only applies to the selected environment. It is not global. +{% endhint %} + +## Adding a new registry + +From the menu select **Cluster**, select **Registries** then click **Add registry**. When the global registries page appears, follow [these instructions](../../../admin/registries/add/). + +
+ +## Managing access + +To configure access to a registry, from the menu select **Cluster** then select **Registries**. + +
+ +Find the registry you want to manage then select **Manage access**. + +
+ +From the dropdown, select the namespaces that you would like to have access, then click **Create access**. + +
+ +You can see a list of the namespaces that have access to the registry or remove a namespace's access to the registry in the **Access** section. + +
+ +## Browsing a registry + +The registry manager extends your container management experience by giving you the ability to browse defined registries and manipulate their content. By using this feature, container users enjoy the benefit of having a single interface to manage any Docker registry deployment, providing a consistent look and feel across any provider. + +{% hint style="info" %} +Your registry must support Docker Registry API v2 in order to integrate with Portainer. +{% endhint %} + +Select **Browse** next to the registry that you want to browse. + +A list of the repositories within a registry, along with the number of tags for each repository appears. Select a repository to view its details. + +
+ +The **Repository information** page provides the repository name, tag and image count, as well as a list of all tags. You can retag an image in order to promote it through the deployment lifecycle, or simply add or remove tags to annotate changes or usage. + +This page also provides an option to clean up unused legacy images by safely deleting them. You can also remove the entire repository. + +{% hint style="info" %} +The actions you can perform on a registry may be limited by the role of your user. +{% endhint %} + +
diff --git a/user/kubernetes/cluster/security.md b/user/kubernetes/cluster/security.md new file mode 100644 index 00000000..c880a72a --- /dev/null +++ b/user/kubernetes/cluster/security.md @@ -0,0 +1,37 @@ +# Security constraints + +Pod security policies can be used to define under what conditions workloads can run. With Portainer we achieve this by leveraging [Open Policy Agent](https://www.openpolicyagent.org/) via [OPA Gatekeeper](https://github.com/open-policy-agent/gatekeeper). + +Policies are configured on a per-environment basis. To enable and configure security policies, from the menu select a Kubernetes environment, then expand **Cluster** and click **Security constraints**. + +{% hint style="danger" %} +This is advanced functionality and should be applied with caution. If a deployment attempts to create a pod that does not meet defined security constraints it may not be immediately obvious that the constraint is the reason for provision failure. +{% endhint %} + +
+ +Toggle on **Enable pod security constraints** to enable the functionality, then toggle on the features you require and configure them as needed. + +{% hint style="info" %} +Policies are based on the [Kubernetes security policy reference](https://v1-21.docs.kubernetes.io/docs/concepts/policy/pod-security-policy/#policy-reference) - for more detail on each option check the Kubernetes documentation. +{% endhint %} + +| Field/Option | Overview | +| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Restrict running privileged containers | Set whether any container in a pod can enable privileged mode. | +| Restrict host namespace | Controls whether the pod containers can share the process ID namespace and host IPC namespace. | +| Restrict host networking ports | Define a range of ports that can be used by pods, on a per-network basis. | +| Restrict volume types | Define the types of volumes that may be used. Examples of volume types are `configMap`, `downwardAPI`, `emptyDir`, `persistentVolumeClaim`, `secret`, `projected`, `hostPath`, `flexVolume`. | +| Restrict host filesystem paths | Define the host paths that are allowed when using hostPath volumes. | +| Restrict drivers | Define the FlexVolume drivers that can be used. | +| Require read-only root filesystem | Specify that containers must run with a read-only root filesystem. | +| Restrict User and group ids | Controls which user ID or group ID the containers are run with or which group IDs get added. For users, specify `MustRunAs` to define specific user ID ranges, `MustRunAsNonRoot` to require non-root users, or `RunAsAny` to permit running as any user. For groups, specify `MustRunAs`, `MayRunAs` or `RunAsAny`. | +| Restrict escalation to root privileges | Controls the user privileges and prevents files from enabling extra capabilities. | +| Restrict Linux capabilities | Define the capabilities available to the pod. Set allowed capabilities to specify those capabilities that a container can use, and set Required drop capabilities to specify which privileges must be dropped from containers. | +| Restrict SELinux security context | Controls the SELinux context of the container. You can specify the level, role, type and user. | +| Restrict Proc Mount types | Defines the type of `/proc` mount to use for containers. Select either `Default` or `Unmasked`. | +| Restrict AppArmor profiles | Controls the AppArmor profile used by containers. Refer to the [AppArmor documentation](https://v1-21.docs.kubernetes.io/docs/tutorials/clusters/apparmor/#podsecuritypolicy-annotations) for more details. | +| Restrict seccomp profiles | Controls the seccomp profile used by containers or pods. | +| Restrict sysctl profiles | Controls the sysctl profile used by containers. Specify the sysctls to forbid from use by pods. | + + Once you have completed your configuration, click **Save settings** to apply your changes. diff --git a/user/kubernetes/cluster/setup.md b/user/kubernetes/cluster/setup.md new file mode 100644 index 00000000..2f3f8207 --- /dev/null +++ b/user/kubernetes/cluster/setup.md @@ -0,0 +1,96 @@ +# Setup + +You can make changes to your environment's Kubernetes configuration by selecting **Cluster** from the menu then selecting **Setup**. + +
+ +## Networking + +### Allow users to use external load balancer + +{% hint style="info" %} +To use this feature, you need to ensure that your cloud provider allows you to create load balancers. Using this feature may incur costs from your cloud provider. +{% endhint %} + +Enabling the load balancer feature will allow users to expose applications they deploy over an external IP address assigned by their cloud provider. + +### Ingress controllers + +Configuring ingress controllers will allow users to expose applications they deploy over a HTTP route. + +Portainer auto detects and lists any ingress controllers defined in the cluster and sets them to allowed by default. As an admin you may choose to disable ingress controllers as needed. + +
+ +Enable the **Configure ingress controller availability per namespace** toggle under **More settings** to be able control Ingress Class availability further at the namespace level. + +Enabling **Allow Ingress class to be set to "none"** will let users create ingress objects without specifying any Ingress Class. This is useful for Kubernetes implementations where there is no `IngressClass` defined in the cluster. + +## Change Window Settings + +This setting allows you to specify a window within which [automatic updates](../applications/manifest.md#automatic-updates) to your applications can be applied. + +{% hint style="warning" %} +If this setting is enabled and an update is made to an application outside of this window, it will not be applied. +{% endhint %} + +
+ +## Deployment Options + +This section allows you to override any global deployment options set for Kubernetes environments. + +{% hint style="info" %} +This section only appears if the **Allow per environment override** option is enabled in [Settings](../../../admin/settings/#deployment-options). +{% endhint %} + +| Field/Option | Overview | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Override global deployment options | Enable this option to override the global deployment options for this environment. | +| Enforce code-based deployment | When override is enabled, enable this option to hide the Add with form button when deploying applications and prevent the adding or editing of Kubernetes resources via forms. | +| Allow web editor use | When code-based deployment is enforced, enable this to allow the use of the web editor when deploying an application. | +| Allow file upload | When code-based deployment is enforced, enable this allow the use of the URL option when deploying an application. | + +
+ +## Security + +### Restrict access to the default namespace + +By default, a Kubernetes cluster will instantiate a default namespace when provisioning the cluster to hold the default set of pods, services, and deployments used by the cluster. If this option is enabled, the only users with the power to run applications in the default namespace are Portainer administrators. + +
+ +### Only allow admins to deploy ingresses + +Enabling this option restricts the deployment of ingresses to cluster administrators only, preventing standard users from creating new ingresses. + +
+ +## Resources and Metrics + +### Allow resource over-commit + +Enabling this feature lets you allocate more resources to namespaces than are physically available in the cluster. + +{% hint style="warning" %} +**Enable** resource over-commit if you need to assign more resources to namespaces than are physically available in the cluster. This may lead to unexpected deployment failures if there are insufficient resources to meet the demand. + +**Disable** resource over-commit (highly recommended) if you are only able to assign resources to namespaces that are less (in aggregate) than the cluster total, minus any system-resource reservation. +{% endhint %} + +### Enable features using the metrics API + +{% hint style="info" %} + Ensure that the Kubernetes [metrics server](https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#metrics-server) or [Prometheus](https://github.com/kubernetes-sigs/prometheus-adapter) is running inside your cluster. +{% endhint %} + +Enabling this feature will allow users to use specific features that leverage the metrics API component, such as the memory and CPU usage graphs at the cluster and node level. If Portainer detects you are using a metrics server and is able to connect, this will default to on. + +
+ +## Available storage options + +Select which storage options will be available for use when deploying applications. Take a look at your storage driver documentation to figure out which access policy to configure, and whether or not the volume-expansion capability is supported. Any storage classes marked as default will be automatically set to on. + +
diff --git a/user/kubernetes/configurations/README.md b/user/kubernetes/configurations/README.md new file mode 100644 index 00000000..e4a25313 --- /dev/null +++ b/user/kubernetes/configurations/README.md @@ -0,0 +1,27 @@ +# ConfigMaps & Secrets + +In Portainer you can create configurations outside of a service's image or running containers. This allows you to keep your images as generic as possible, without the need to bind-mount configuration files into the containers, or to use environment variables. + +{% hint style="info" %} +This section was previously known as **Configurations**. +{% endhint %} + +
+ +A ConfigMap or Secret with the **external** flag was created outside of Portainer, which means Portainer has limited knowledge on it compared to one created within Portainer. A label of **unused** means that Portainer cannot see any applications that are using this ConfigMap or Secret. This label may also appear on **external** resources because of the limited information available. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="add-1.md" %} +[add-1.md](add-1.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} + +{% content-ref url="broken-reference" %} +[Broken link](broken-reference) +{% endcontent-ref %} diff --git a/user/kubernetes/configurations/add-1.md b/user/kubernetes/configurations/add-1.md new file mode 100644 index 00000000..095f45e2 --- /dev/null +++ b/user/kubernetes/configurations/add-1.md @@ -0,0 +1,28 @@ +# Add a Secret + +From the menu select **ConfigMaps & Secrets** then click **Add with form**. + +{% hint style="info" %} +Secrets can also be added [using a manifest](../applications/manifest.md) by clicking **Create from manifest**. +{% endhint %} + +
+ +Define the secret, using the table below as a guide. + +| Field/Option | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the secret a descriptive name. | +| Namespace | Select the namespace where the secret will be saved. | +| Configuration type | Select **Secret** from the dropdown. Secrets store sensitive information such as passwords and certificates. If you need to store non-sensitive information consider using a [ConfigMap](add.md). | +| Secret Type | Select from the list of available secret types or select **Custom** to define your own type. | + +
+ +Data fields change to reflect the type of Data to be entered based on the secret type selection above. In the **Data** section you can enter the details of your secret, in either **Simple mode** or **Advanced mode**. Under simple mode you can add entries in a key and value format, and in advanced mode you can paste in multiple values in YAML format. + +

Adding data in Simple mode

+ +

Adding data in Advanced mode

+ +When you have finished defining the secret, click **Create Secret.** diff --git a/user/kubernetes/configurations/add.md b/user/kubernetes/configurations/add.md new file mode 100644 index 00000000..25c7822b --- /dev/null +++ b/user/kubernetes/configurations/add.md @@ -0,0 +1,27 @@ +# Add a ConfigMap + +From the menu select **ConfigMaps & Secrets** then click **Add with form**. + +{% hint style="info" %} +ConfigMaps can also be added [using a manifest](../applications/manifest.md) by clicking **Create from manifest**. +{% endhint %} + +
+ +Define the ConfigMap, using the table below as a guide. + +| Field/Option | Overview | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Give the ConfigMap a descriptive name. | +| Namespace | Select the namespace where the ConfigMap will be saved. | +| Configuration type | Select **ConfigMap** from the dropdown. ConfigMaps should not store any sensitive information. If you need to store sensitive information consider using a [secret](add-1.md) instead. | + +
+ +In the **Data** section you can enter the details of your ConfgMap, in either **Simple mode** or **Advanced mode**. Under Simple mode you can add entries in a key and value format, and in Advanced mode you can paste in multiple values in YAML format. + +

Adding data in Simple mode

+ +

Adding data in Advanced mode

+ +When you have finished defining the ConfigMap, click **Create ConfigMap.** diff --git a/user/kubernetes/configurations/remove.md b/user/kubernetes/configurations/remove.md new file mode 100644 index 00000000..4bac6e41 --- /dev/null +++ b/user/kubernetes/configurations/remove.md @@ -0,0 +1,10 @@ +# Remove a ConfigMap or Secret + +From the menu select **ConfigMaps & Secrets**, tick the checkbox next to the configuration you want to remove then click **Remove**. + +
+ +When the confirmation message appears, click **Remove**. + +
+ diff --git a/user/kubernetes/dashboard.md b/user/kubernetes/dashboard.md new file mode 100644 index 00000000..6804da42 --- /dev/null +++ b/user/kubernetes/dashboard.md @@ -0,0 +1,15 @@ +# Dashboard + +The Kubernetes dashboard summarizes your Kubernetes environment and shows the components that make up the environment. + +## Environment info + +This section shows the environment name, its URL and port, along with any [tags](../../admin/environments/tags.md#tagging-an-environment). + +
+ +## Summary tiles + +The remaining dashboard is made up of tiles showing the number of [namespaces](namespaces/), [applications](applications/), [configurations](configurations/) and [volumes](volumes/) that make up the environment. + +
diff --git a/user/kubernetes/helm/README.md b/user/kubernetes/helm/README.md new file mode 100644 index 00000000..54c25ce5 --- /dev/null +++ b/user/kubernetes/helm/README.md @@ -0,0 +1,29 @@ +# Helm + +Portainer BE 2.10 introduced support for [Helm](https://helm.sh/), the most popular packaging system for Kubernetes applications. With Helm you can deploy applications based on pre-prepared charts, either self-made or supplied by third-party repositories. + +{% hint style="info" %} +Helm support in Portainer is still in its early stages, and more functionality will be added soon. If there is specific functionality you'd like to see in a future release, [let us know](../../../contribute/contribute.md). +{% endhint %} + +## Adding additional repositories + +By default, Portainer ships with the [Bitnami Helm chart repository](https://bitnami.com/stacks/helm) already pre-configured. If you would like to add an additional third-party repo, enter the repository URL then click **Add repository**. + +
+ +## Changing the pre-configured repository + +You can [change the pre-configured Helm repository](../../../admin/settings/#helm-repository) if required. If you do not have a global Helm repository configured, a warning will be displayed on this page. + +
+ +## Deploying applications from Helm charts + +From the **Charts** section you can deploy an application from the Helm charts provided by the repositories you have configured. The list of charts can be filtered by category and is searchable. + +
+ +{% content-ref url="deploy.md" %} +[deploy.md](deploy.md) +{% endcontent-ref %} diff --git a/user/kubernetes/helm/deploy.md b/user/kubernetes/helm/deploy.md new file mode 100644 index 00000000..03d52425 --- /dev/null +++ b/user/kubernetes/helm/deploy.md @@ -0,0 +1,21 @@ +# Deploy a new application from a Helm chart + +From the menu, select **Helm** then select the chart you want to deploy. + +
+ +Complete the required information, using the table below as a guide. + +| Field/Option | Overview | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Namespace | Select the namespace you want to deploy your application into. | +| Name | Give your application a descriptive name. | +| Show custom values | Click to expand the **Web editor** so you can configure any parameters required by your application. This is pulled from the `values.yaml` file provided by the chart and will differ from chart to chart. | + +
+ +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +When you have finished, click **Install** to deploy the application. diff --git a/user/kubernetes/ingresses/README.md b/user/kubernetes/ingresses/README.md new file mode 100644 index 00000000..3dcee3d6 --- /dev/null +++ b/user/kubernetes/ingresses/README.md @@ -0,0 +1,27 @@ +# Ingresses + +An **Ingress** in Kubernetes is an API object that provides routing rules to manage external users' access to the services in a Kubernetes cluster, typically via HTTPS/HTTP. With Ingress, you can easily set up rules for routing traffic without creating a bunch of Load Balancers or exposing each service on the node. + +To view, edit or create ingresses in your environment, select **Ingresses** from the left hand menu. + +
+ +All the Ingresses that a user has access to are listed on this page. + +
+ +New Ingress objects can be created either manually or through a manifest: + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="manifest.md" %} +[manifest.md](manifest.md) +{% endcontent-ref %} + +If you no longer require an Ingress, it can be removed: + +{% content-ref url="remove-an-ingress.md" %} +[remove-an-ingress.md](remove-an-ingress.md) +{% endcontent-ref %} diff --git a/user/kubernetes/ingresses/add.md b/user/kubernetes/ingresses/add.md new file mode 100644 index 00000000..1a11e8c4 --- /dev/null +++ b/user/kubernetes/ingresses/add.md @@ -0,0 +1,41 @@ +# Add an Ingress manually + +From the menu select **Ingresses** then click **Add with form**. + +
+ +Select the **namespace** that the Ingress needs to be created in from the list. + +Complete the required information, using the sections below as a guide. + +### Base Configuration + +
Field/OptionOverview
Ingress nameEnter a descriptive name for the ingress.
Ingress classSelect an Ingress Class object from the list, or select none when no IngressClass info is needed in the Ingress specification.
Add annotationClick the add annotation button to add one or more annotations. For example:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
+ +
+ +{% hint style="info" %} +**Note for Google Cloud users** + +Google Cloud ingress controller (gce or GKE Ingress) continues to use the deprecated `kubernetes.io/ingress.class` annotation on ingresses, whereas most other ingress controllers use the `IngressClass` resource that was introduced in Kubernetes 1.18. + +Portainer targets the `IngressClass` resource means of specifying ingress classes, but you can still use the Google Cloud ingress controllers by turning on the **Allow ingress class to be set to "none"** toggle in [Cluster setup](../cluster/setup.md#ingress-controllers) and setting them up as custom with `none` selected as their **Ingress class**. Then when adding an ingress based on this, set an annotation with the **key** `kubernetes.io/ingress.class` and **value** `gce.` +{% endhint %} + +### Ingress Rule + +Here you can define the specifics for the Ingress rule: + +
Field/OptionOverview
HostnameEnter the FQDN that the application should be accessed with
eg: myapp.mydomain.com.
TLS SecretSelect the TLS secret that holds the SSL certificate information for the hostname entered above. Optionally, create a new TLS Secret by clicking on ConfigMaps & Secrets link (opens in a new tab). Once secret is created click on Reload TLS Secrets and select the new secret.
ServiceSelect a service that you want to expose from the list. Note that only ClusterIP services are available from this list.
Service portSelect the port that needs to be exposed from the list.
Path typeSelect the relevant path type. The default is Prefix.
PathEnter the path to expose the application on. To expose on the root of the domain use /.
+ +You can expose other services using a different path by clicking on **Add Path**. + +
+ +Add more rules by clicking on **Add new host** or **** a fallback rule by **Add fallback rule**. + +{% hint style="info" %} +A fallback rule has no host specified. This rule only applies when an inbound request has a hostname that does not match with any of your other rules. +{% endhint %} + +When you're ready, click **Create**. diff --git a/user/kubernetes/ingresses/manifest.md b/user/kubernetes/ingresses/manifest.md new file mode 100644 index 00000000..bf8fe503 --- /dev/null +++ b/user/kubernetes/ingresses/manifest.md @@ -0,0 +1,113 @@ +# Add an Ingress using a manifest + +There are two ways to add a new ingress: [manually by using a form](add.md) or automatically by using a manifest. This article explains how to add an ingress using a manifest. + +{% hint style="info" %} +Manifests aren't just for Ingresses - you can also deploy namespaces, ConfigMaps, secrets and volumes using a manifest. +{% endhint %} + +From the menu select **Ingresses** then click **Create from manifest**. + +
+ +Select the namespace for your deployment, define a name for your Ingress, and then choose the build method from the options provided. + +{% hint style="info" %} +If you want to use namespaces specified in your manifest to define the namespace(s) you wish to deploy to, you can leave **Namespace** set to `default` and toggle on the **Use namespace(s) specified from manifest** option. +{% endhint %} + +
+ +## Option 1: Git Repository + +From **Deployment type** select either **Kubernetes** or **Compose** (depending on the format of the manifest) then enter the details of your Git repo. + +{% hint style="warning" %} +Portainer uses Kompose to convert a Compose manifest to a Kubernetes-compliant manifest. This functionality is planned for deprecation in an upcoming release. +{% endhint %} + +| Field/Option | Overview | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Authentication | Toggle this on if your repository requires authentication. | +| Git Credentials | If the **Authentication** toggle is enabled and you have [configured Git credentials](../../account-settings.md#git-credentials), you can select them from this dropdown. | +| Username | Enter your Git username. | +| Personal Access Token | Enter your personal access token or password. | +| Save credential | Check this option to save the credentials entered above for future use under the name provided in the **credential name** field. | + +
+ +| Field/Option | Overview | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Repository URL | Enter the repository URL. If you have enabled Authentication above the credentials will be used to access the repository. The below options will be populated by what is found in the repository. | +| Repository reference | Select the reference to use when deploying the stack (for example, the branch). | +| Manifest path | When using the Kubernetes deployment type, enter the path to your manifest file relative to the root of your repository. | +| Compose path | When using the Compose deployment type, enter the path to your compose file relative to the root of your repository. | +| Additional paths | Click **add file** to define additional manifests or compose files to process as part of the deployment. | + +
+ +### Automatic updates + +Enabling Automatic updates gives Portainer the ability to update your application automatically, either by polling the repository at a defined interval for changes or by using a webhook to trigger an update. + +{% hint style="info" %} +For more detail on how automatic updates function under the hood, have a look at [this knowledge base article](https://portal.portainer.io/knowledge/how-do-automatic-updates-for-stacks-applications-work). +{% endhint %} + +{% hint style="warning" %} +If your application is configured for automatic updates and you make changes locally, these changes will be overridden by the application definition in the Git repository. Bear this in mind when making configuration changes. +{% endhint %} + +| Field/Option | Overview | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| Mechanism | Choose from **Polling** or **Webhook**. | +| Fetch interval | When using the **Polling** method, choose how often you wish to check the Git repository for updates to your application. | +| Webhook | When using the **Webhook** method, this displays the webhook URL to use. Click **Copy link** to copy the webhook to your clipboard. | + +

Automatic updates using the polling mechanism

+ +

Automatic updates using the webhook mechanism

+ +| Field/Option | Overview | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Force Redeployment |

Enable this setting to force the redeployment of your application at the specified interval (or when the webhook is triggered), overwriting any changes that have been made in the local environment, even if there has been no update to the application in Git. This is useful if you want to ensure that your Git repository is the source of truth for your applications and are happy with the local application being replaced.

If this option is left disabled, automatic updates will only trigger if Portainer detects a change in the remote Git repository.

| + +
+ +When you're ready, click **Deploy**. + +## Option 2: Web editor + +From **Deployment type** select either **Kubernetes** or **Compose** (depending on the format of the manifest) then write or paste in your Kubernetes manifest. + +{% hint style="warning" %} +Portainer uses Kompose to convert a Compose manifest to a Kubernetes-compliant manifest. This functionality is planned for deprecation in an upcoming release. +{% endhint %} + +
+ +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +When you're ready, click **Deploy**. + +## Option 3: URL + +From **Deployment type** select either **Kubernetes** or **Compose** (depending on the format of the manifest) then enter the **URL** to your manifest file. + +{% hint style="warning" %} +Portainer uses Kompose to convert a Compose manifest to a Kubernetes-compliant manifest. This functionality is planned for deprecation in an upcoming release. +{% endhint %} + +
+ +When you're ready, click **Deploy**. + +## Option 4: Custom template + +From the **Template** dropdown, select the custom template to use. As an optional step, you can edit the template before deploying the application. If you have no custom templates you will be given a link to the [Custom Templates](../templates/) section. + +
+ +When you're ready, click **Deploy**. diff --git a/user/kubernetes/ingresses/remove-an-ingress.md b/user/kubernetes/ingresses/remove-an-ingress.md new file mode 100644 index 00000000..9e2569c0 --- /dev/null +++ b/user/kubernetes/ingresses/remove-an-ingress.md @@ -0,0 +1,5 @@ +# Remove an Ingress + +From the menu select **Ingress**, tick the checkbox next to the Ingress you want to remove then click **Remove**. Click **Remove** again to confirm. + +
diff --git a/user/kubernetes/kubeconfig.md b/user/kubernetes/kubeconfig.md new file mode 100644 index 00000000..77d3cc90 --- /dev/null +++ b/user/kubernetes/kubeconfig.md @@ -0,0 +1,53 @@ +# Kubeconfig + +Portainer can act as a proxy for other Kubernetes management tools, providing access to the Kubernetes cluster while still retaining the security and governance that Portainer provides. A user can download their own `kubeconfig` file and use it with their favorite tool to access the Kubernetes cluster with only the permissions afforded to that user.\ +\ +To generate and download your `kubeconfig` file, from the Home page click the **kubeconfig** button. + +{% hint style="info" %} +You must be accessing Portainer via HTTPS for the kubeconfig button to appear. If you are logged in with HTTP, you will not see the option. +{% endhint %} + +
+ +You will be asked to select the Kubernetes environments that you would like in your `kubeconfig` file. If you have configured a [kubeconfig expiry](../../admin/settings/#kubeconfig-expiry) value, this will also be shown. + +
+ +Tick the boxes for the environments you need and click **Download File**. + +A downloaded `kubeconfig` file will look something like the example below. + +{% hint style="info" %} +Note that the server URL is set to the Portainer Server instance, not the Kubernetes cluster. +{% endhint %} + +```yaml +apiVersion: v1 +clusters: +- cluster: + insecure-skip-tls-verify: true + server: https://my-portainer-server:9443/api/endpoints/1/kubernetes + name: portainer-cluster-kubernetes +contexts: +- context: + cluster: portainer-cluster-kubernetes + user: portainer-sa-clusteradmin + name: portainer-ctx-kubernetes +current-context: portainer-ctx-kubernetes +kind: Config +preferences: {} +users: +- name: portainer-sa-clusteradmin + user: + token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +``` + +Each environment in the `kubeconfig` will be accessible via contexts. Access is set based on the specific user that created the `kubeconfig` file. + +Unless set to never expire, tokens will expire after the defined period, at which point a new `kubeconfig` file will need to be generated. An administrator can [adjust the token expiry behavior](../../admin/settings/#kubeconfig-expiry) on the **Settings** page. + +{% hint style="info" %} +Adjusting the token expiry will not affect previously generated `kubeconfig` files. +{% endhint %} + diff --git a/user/kubernetes/kubectl.md b/user/kubernetes/kubectl.md new file mode 100644 index 00000000..d45f0c07 --- /dev/null +++ b/user/kubernetes/kubectl.md @@ -0,0 +1,7 @@ +# kubectl shell + +Although the Portainer UI provides access to a lot of Kubernetes functionality, sometimes you need to drop into the console. We have provided a shell within the UI that includes `kubectl` and `helm` binaries. The shell is preloaded with a `kubeconfig` for the user's context, restricting access to the permissions defined in Portainer for that user. + +To access the shell, select **kubectl shell** from the menu. Once the shell loads, you can run `kubectl` and `helm` commands as needed. + +
diff --git a/user/kubernetes/namespaces/README.md b/user/kubernetes/namespaces/README.md new file mode 100644 index 00000000..a42cc30c --- /dev/null +++ b/user/kubernetes/namespaces/README.md @@ -0,0 +1,27 @@ +# Namespaces + +{% hint style="info" %} +Namespaces used to be called 'resource pools' prior to Portainer CE 2.6.0. +{% endhint %} + +In Kubernetes, a single physical cluster can support multiple virtual clusters. These are known as namespaces. + +
+ +You can add, remove or manage namespaces in Portainer. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +{% content-ref url="manage.md" %} +[manage.md](manage.md) +{% endcontent-ref %} + +{% content-ref url="access.md" %} +[access.md](access.md) +{% endcontent-ref %} + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} diff --git a/user/kubernetes/namespaces/access.md b/user/kubernetes/namespaces/access.md new file mode 100644 index 00000000..3325c25f --- /dev/null +++ b/user/kubernetes/namespaces/access.md @@ -0,0 +1,17 @@ +# Manage access to a namespace + +{% hint style="info" %} +Kubernetes role-based access control (RBAC) must be enabled and working before access control will work in Portainer. +{% endhint %} + +From the menu select **Namespaces** then select **Manage access** on the same row as the namespace you want to manage. + +
+ +Select the users/teams who will have access then click **Create access**. + +{% hint style="info" %} +Users or groups with cluster-wide roles (such as the Operator role) cannot be assigned to individual namespaces, as their cluster-wide nature applies to all namespaces in the environment. +{% endhint %} + +
diff --git a/user/kubernetes/namespaces/add.md b/user/kubernetes/namespaces/add.md new file mode 100644 index 00000000..f9de01bd --- /dev/null +++ b/user/kubernetes/namespaces/add.md @@ -0,0 +1,15 @@ +# Add a new namespace + +From the menu select **Namespaces** then click **Add namespace with form**. + +{% hint style="info" %} +Namespaces can also be added [using a manifest](../applications/manifest.md) by clicking **Create from manifest**. +{% endhint %} + +
+ +In the next screen, give the namespace a descriptive name. As an optional step you can assign a quota by toggling **Resource assignment** on, then setting resource limits like how much memory and CPU will be assigned. + +
+ +When you're finished, click **Create namespace**. diff --git a/user/kubernetes/namespaces/manage.md b/user/kubernetes/namespaces/manage.md new file mode 100644 index 00000000..e91fec9e --- /dev/null +++ b/user/kubernetes/namespaces/manage.md @@ -0,0 +1,47 @@ +# Manage a namespace + +From the menu select Namespaces then select the namespace you want to manage. + +
+ +Here you can view details about the namespace and configure options specific to the namespace. + +## Quota + +Toggle on **Resource assignment** to enable quotas for this namespace, then define the memory and CPU limits. + +
+ +## Load balancers + +With this setting you can configure the amount of external load balancers that can be created in this namespace. + +{% hint style="info" %} +This option only appears when **Allow users to use external load balancer** is enabled in the [cluster setup](../cluster/setup.md#allow-users-to-use-external-load-balancer). +{% endhint %} + +
+ +## Storage + +For each storage option available in the cluster, you can configure quotas for this namespace to limit usage. + +
+ +## Ingresses + +This section lists the available ingresses and whether they can be used by this namespace. For each namespace you can toggle on **Allow users to use this ingress**, then configure the ingress hostname, route redirection and advanced settings as needed. + +
+ +## Summary + +If you have made changes to the configuration, this section will list those changes. + +
+ +## Actions + +Once you have made the necessary changes, click **Update namespace**. Here you can also flag the namespace as a system namespace by clicking **Mark as system**. + +
diff --git a/user/kubernetes/namespaces/remove.md b/user/kubernetes/namespaces/remove.md new file mode 100644 index 00000000..33d656f0 --- /dev/null +++ b/user/kubernetes/namespaces/remove.md @@ -0,0 +1,11 @@ +# Remove a namespace + +From the menu select **Namespaces**, tick the checkbox next to the namespace then click **Remove**. + +
+ +When the confirmation message appears, click **Remove**. + +
+ +If a namespace is stuck in a terminating state, Portainer will ask if you want to force deletion of that namespace. diff --git a/user/kubernetes/templates/README.md b/user/kubernetes/templates/README.md new file mode 100644 index 00000000..5b237766 --- /dev/null +++ b/user/kubernetes/templates/README.md @@ -0,0 +1,25 @@ +# Custom Templates + +Portainer BE 2.10 added custom template support for Kubernetes environments, allowing you to create templates based on Kubernetes manifests for future deployment. + +From the menu select **Custom Templates** to view a list of custom templates you've already created. + +
+ +You can create a new template. + +{% content-ref url="add.md" %} +[add.md](add.md) +{% endcontent-ref %} + +You can also edit an existing template. + +{% content-ref url="edit.md" %} +[edit.md](edit.md) +{% endcontent-ref %} + +And, if you no longer need a custom template, you can simply remove it. + +{% content-ref url="remove.md" %} +[remove.md](remove.md) +{% endcontent-ref %} diff --git a/user/kubernetes/templates/add.md b/user/kubernetes/templates/add.md new file mode 100644 index 00000000..ff324e32 --- /dev/null +++ b/user/kubernetes/templates/add.md @@ -0,0 +1,60 @@ +# Add a new custom template + +## Creating the template + +From the menu select **Custom Templates** then click **Add Custom Template**. + +
+ +Complete the form, using the table below as a guide. + +| Field/Option | Overview | +| ------------ | ------------------------------------------------------------------------------------------------ | +| Title | Enter a title for your custom template. This is how the template will appear when it's deployed. | +| Description | Enter a description of the template. | +| Note | As an optional step, record some extra information about the template. | +| Icon URL | Optionally, enter the URL to an image to use as an icon for the template. | + +
+ +Next, select the **Build method**. + +## Selecting the build method + +### Method 1: Web editor + +Define or paste the contents of your manifest file into the web editor. When deploying an application using a custom template you will be given an opportunity to edit the manifest before deployment. + +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +
+ +When you're ready, click **Create custom template**. + +### Method 2: Upload + +If you have a manifest file locally, you can upload it directly to Portainer. Click **Select file** to browse to the file. + +
+ +When you're ready, click **Create custom template**. + +## Variables in templates + +Custom templates support the use of variables to provide further customization of the deployed stack. A stack can define a variable that can then be adjusted by the user at deployment. + +{% hint style="info" %} +This feature is only available in Portainer Business Edition. +{% endhint %} + +Variables are identified in stacks with `{{ }}`. For example, the following stack provides a `REPLICA_COUNT` variable: + +
+ +When a variable is defined, options appear to customize how the variable appears when deploying the stack. You can set the **label**, **description** and **default value**. + +When a template is deployed, any variables that have been configured are editable: + +
diff --git a/user/kubernetes/templates/edit.md b/user/kubernetes/templates/edit.md new file mode 100644 index 00000000..24e2e710 --- /dev/null +++ b/user/kubernetes/templates/edit.md @@ -0,0 +1,11 @@ +# Edit a custom template + +From the menu select **Custom Templates** then click **Edit** next to the template you want to edit. + +
+ +{% hint style="info" %} +You can search within the web editor at any time by pressing `Ctrl-F` (or `Cmd-F` on Mac). +{% endhint %} + +Make the required changes to the template then click **Update the template**. diff --git a/user/kubernetes/templates/remove.md b/user/kubernetes/templates/remove.md new file mode 100644 index 00000000..20b082c8 --- /dev/null +++ b/user/kubernetes/templates/remove.md @@ -0,0 +1,14 @@ +# Remove a custom template + +{% hint style="info" %} +Removing a custom template will not remove any deployments created using the template. +{% endhint %} + +From the menu select **Custom Templates** then click **Delete** next to the template you want to remove. + +
+ +When the confirmation message appears, click **Remove**. + +
+ diff --git a/user/kubernetes/volumes/README.md b/user/kubernetes/volumes/README.md new file mode 100644 index 00000000..4c1b5e0e --- /dev/null +++ b/user/kubernetes/volumes/README.md @@ -0,0 +1,34 @@ +# Volumes + +In Kubernetes, a volume is an abstraction of a file system that is available to applications. In Portainer you can manage the volumes that have been deployed by your applications within your cluster. + +{% hint style="info" %} +Volumes can also be added [using a manifest](../applications/manifest.md) by clicking **Create from manifest**. +{% endhint %} + +{% content-ref url="inspect.md" %} +[inspect.md](inspect.md) +{% endcontent-ref %} + +{% content-ref url="../../docker/volumes/remove.md" %} +[remove.md](../../docker/volumes/remove.md) +{% endcontent-ref %} + +## Volumes tab + +Lets you view information about the volumes that exist within the cluster, including: + +* The namespace that each volume is a part of. +* Which applications use each volume. +* The storage class each volume belongs to. +* The size of each volume. +* When the volumes were created and by whom. +* A volume with the **external** flag was created outside of Portainer, which means Portainer has limited knowledge on it compared to one created within Portainer. A label of **unused** means that Portainer cannot see any applications that are using this volume. This label may also appear on **external** resources because of the limited information available. + +
+ +## Storage tab + +The storage tab lists the storage classes available within your infrastructure along with the disk space used by each volume. Each storage class can be expanded to list the volumes contained within. + +
diff --git a/user/kubernetes/volumes/inspect.md b/user/kubernetes/volumes/inspect.md new file mode 100644 index 00000000..b7963a99 --- /dev/null +++ b/user/kubernetes/volumes/inspect.md @@ -0,0 +1,35 @@ +# Inspect a volume + +From the menu select **Volumes** then select the volume you want to inspect. + +
+ +When you select a volume, the screen will divide into three sections, each described below. + +## Volume section + +Summarizes key information about the volume. + +| Attribute | Overview | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Name | The name of the volume. | +| Namespace | The namespace that the volume belongs to. | +| Storage | The storage object that the volume uses. | +| Shared Access Policy | The access policy configured for the volume. | +| Provisioner | The storage provisioner that provisions the volume. | +| Creation date | When the volume was created. | +| Size | The size of the volume. You can grow a volume by clicking the **Increase size** button and adjusting the value. Shrinking a volume is not supported. | + +
+ +## Events section + +Shows information about volume-related events. + +
+ +## YAML section + +This displays the YAML generated from the volume deployment. Use it to create backups of the configuration. + +
diff --git a/user/kubernetes/volumes/remove.md b/user/kubernetes/volumes/remove.md new file mode 100644 index 00000000..7ccdd976 --- /dev/null +++ b/user/kubernetes/volumes/remove.md @@ -0,0 +1,13 @@ +# Remove a volume + +{% hint style="warning" %} +You can only remove a volume that is free and has been [detached from any applications that use it](../applications/detach-volume.md). +{% endhint %} + +From the menu select **Volumes**, tick the checkbox next to the volume you want to remove then click **Remove**. + +
+ +When the confirmation message appears, click **Remove**. + +
diff --git a/user/nomad/README.md b/user/nomad/README.md new file mode 100644 index 00000000..1fa21237 --- /dev/null +++ b/user/nomad/README.md @@ -0,0 +1,11 @@ +# Nomad + +The following sections describe how to manage a Nomad environment using menu options available in the Portainer Server. + +{% content-ref url="dashboard.md" %} +[dashboard.md](dashboard.md) +{% endcontent-ref %} + +{% content-ref url="jobs.md" %} +[jobs.md](jobs.md) +{% endcontent-ref %} diff --git a/user/nomad/dashboard.md b/user/nomad/dashboard.md new file mode 100644 index 00000000..552c1b4f --- /dev/null +++ b/user/nomad/dashboard.md @@ -0,0 +1,15 @@ +# Dashboard + +The Nomad dashboard summarizes your Nomad environment and shows the components that make up the environment. + +## Cluster information + +This section shows the number of nodes in the cluster. + +
+ +## Summary tiles + +The remaining dashboard is made up of tiles showing the number of [jobs](jobs.md), groups and tasks (including the number of running and stopped tasks) on the Nomad environment. + +
diff --git a/user/nomad/jobs.md b/user/nomad/jobs.md new file mode 100644 index 00000000..42363f54 --- /dev/null +++ b/user/nomad/jobs.md @@ -0,0 +1,20 @@ +# Nomad Jobs + +In Nomad, a Job is a specification that defines a workload for Nomad. Within a job you will find one or more task groups, which consist of one or more tasks. Portainer lets you view the jobs and subsequent tasks that are deployed to your Nomad environment. + +{% hint style="info" %} +To deploy a new job to a Nomad environment, use the [Edge Stacks](../edge/stacks.md) feature under [Edge Compute](../edge/). This requires you to [enable Edge Compute features](../../admin/settings/edge/) and create an [Edge Group](../edge/groups.md) containing your Nomad environments. +{% endhint %} + +From the left hand menu select **Nomad Jobs**. + +
+ +Here you will see a list of jobs on the environment along with their status, namespace, and creation date. You can expand individual jobs by clicking the arrow to the left of the name. + +
+ +In the expanded view, you can see a list of tasks that make up the job, with each task displaying the task status, name, group, allocation ID and start date. You can also view events and logs for each task under Task Actions. + +
+ diff --git a/whats-new.md b/whats-new.md new file mode 100644 index 00000000..81bea7df --- /dev/null +++ b/whats-new.md @@ -0,0 +1,87 @@ +# What's new in version 2.17 + +Portainer version 2.17 includes a number of new features, fixes and updates. For a full list of changes, please refer to our [release notes](release-notes.md). + +## New Features + +### Upgrade from CE to BE ![](.gitbook/assets/button\_ce.png) + +Upgrading from the Community Edition of Portainer to the Business Edition has in the past needed you to jump into the command line and redeploy your Portainer installation, but now in 2.17 you can do this [right from the Portainer UI](start/upgrade/tobe/inapp.md). You can bring your own license key or sign up for a free trial, and Portainer will handle the upgrade for you automatically, getting you up and running on BE without any hassle. + +
+ +### Back up Portainer to S3-compatible providers ![](.gitbook/assets/button\_be.png) + +Portainer Business Edition has long provided the ability to back up your Portainer config to an AWS S3 bucket. In 2.17 we've [expanded this support](admin/settings/#backup-portainer), by popular demand, to S3-compatible providers such as MinIO. As long as your provider is S3-compatible, you should now be able to use them with Portainer. + +
+ +### Log viewer improvements ![](.gitbook/assets/button\_be.png) + +Extending on from updates to the log viewer in our last version, 2.17 brings a refresh of the [log viewer interface](user/docker/containers/logs.md), improving the usability of the viewer as well as the search and filter capabilities, ANSI color support, full screen viewing and more. You'll find this updated interface wherever the log viewer is used in Portainer. + +
+ +### Relative path support for Git stacks ![](.gitbook/assets/button\_be.png) + +Often when deploying a stack you'll want to pre-populate your container's file system from your Git repository into pre-defined relative paths. 2.17 adds support for this with [a toggle on your stack deployment](user/docker/stacks/add.md#relative-path-volumes), letting you spin up a stack and copy the necessary files into directories on your host automatically. + +
+ +### GitHub Container Registry (GHCR) support ![](.gitbook/assets/button\_be.png) + +We've now added the GitHub container registry to our list of supported registry providers in 2.17. This lets you [connect to and browse your GitHub registry](admin/registries/add/ghcr.md) directly from within Portainer, as well as deploy containers from images stored there. + +
+ +## Kubernetes + +### Rolling restart for Kubernetes applications ![](.gitbook/assets/button\_be.png) + +In the Kubernetes realm, we've added a [rolling restart](user/kubernetes/applications/inspect.md#actions) option to your deployments. Instead of terminating all your pods and restarting them from scratch when doing an update, you can now instead do a rolling restart of your application, reducing downtime. This is available via the Portainer UI as well as via an option [on your application webhook](user/kubernetes/applications/webhooks.md), which means it can be used in your deployment automation. + +
+ +### Improved Kubernetes defaults ![](.gitbook/assets/button\_be.png)![](.gitbook/assets/button\_ce.png) + +We've made some changes to the default [cluster configuration](user/kubernetes/cluster/setup.md) in version 2.17 to more align with sensible standards. This includes automatically detecting new ingress controllers and the presence of the metrics API, as well as auto enabling storage options set as default in the cluster. These apply only clusters that you've newly added to Portainer - your existing clusters won't have their settings changed. + +### Direct YAML editing in Portainer ![](.gitbook/assets/button\_be.png) + +Since the beginning you've been able to view the YAML for your Kube deployments in Portainer, but in 2.17 you can now make changes to that YAML straight from the UI. Portainer uses the Kubernetes patch mechanism to apply these changes, so if you need to make a quick adjustment to a deployment you can jump straight into the YAML and get it done. + +
+ +### Enforce code-based deployment ![](.gitbook/assets/button\_be.png) + +In 2.17 we've added the option, by popular demand, for cluster admins to [enforce code-based deployment](admin/settings/#deployment-options) on their Kubernetes clusters, disabling the use of the form-based deployment approach. This restriction can be applied globally or on a per-cluster basis. This is to help provide admins with greater control over how applications are deployed and managed on their clusters. + +
+ +### Enforce admin-only ingress creation ![](.gitbook/assets/button\_be.png) + +Along the same vein, 2.17 adds an option to [restrict ingress creation](user/kubernetes/cluster/setup.md#only-allow-admins-to-deploy-ingresses) to admins only. With this option on, non-admin users will still be able to use ingresses configured in the cluster, but won't be able to deploy new ones. + +## Edge + +### Move Edge Devices to home page ![](.gitbook/assets/button\_be.png)![](.gitbook/assets/button\_ce.png) + +In the Edge sphere, one of the big changes in 2.17 is moving of Edge Devices to the [home page](user/home.md) view alongside the traditional Portainer environments. This gives you a more unified view of your infrastructure than before, making it easier to use and manage your setup no matter what type it is. + +
+ +### Browsing async environments ![](.gitbook/assets/button\_be.png) + +Now that Edge Devices are on the home page, we've also added the ability to browse Edge devices that are deployed in async mode as you would a traditional environment. You can [browse your environment](admin/settings/edge/devices/#browsing-your-edge-device) as you would any other in Portainer. This is based on the use of snapshots, so what you're seeing will depend on how recent your snapshot is. + +
+ +### Remote update of Edge Agents ![](.gitbook/assets/button\_be.png) + +2.17 also introduces the ability to remotely update your Edge Agent deployments from within Portainer, removing the need to connect to each environment individually when a new version comes out. You can [schedule an update](admin/environments/update.md) across multiple devices at a time that suits you, and Portainer will handle the rest. There are some limitations with this feature at the moment and it is considered a beta, so bear that in mind when trying it out. + +
+ +### Pre-pull images on Edge devices ![](.gitbook/assets/button\_be.png) + +When deploying an Edge stack across a number of devices, you may want to pre-pull your images to the device to make sure they get there before you deploy. In 2.17 we've added the [option to pre-pull images](user/edge/stacks.md#pre-pull-images) on Edge stack deployments, and when enabled Portainer will pull all the needed images to the remote environment and ensure they have been pulled successfully before starting the stack, and will let you know if it wasn't able to do so. This should improve the reliability and stability of your Edge stack deployments.